diff --git a/bin/puppetdoc b/bin/puppetdoc index 09d0966cd..a69d169c9 100755 --- a/bin/puppetdoc +++ b/bin/puppetdoc @@ -8,7 +8,7 @@ # # = Usage # -# puppetdoc [-a|--all] [-h|--help] [-o|--outputdir ] [-m|--mode ] +# puppetdoc [-a|--all] [-h|--help] [-o|--outputdir ] [-m|--mode ] # [-r|--reference <[type]|configuration|..>] [manifest-file] # # = Description @@ -37,7 +37,7 @@ # Specifies the directory where to output the rdoc documentation in 'rdoc' mode. # # mode:: -# Determine the output mode. Valid modes are 'text', 'trac', 'pdf' and 'rdoc'. Note that 'trac' mode only works on Reductive Labs servers. The default mode is 'text'. In 'rdoc' mode you must provide 'manifests-path' +# Determine the output mode. Valid modes are 'text', 'trac', 'pdf', 'markdown' and 'rdoc'. The 'pdf' and 'markdown' modes create PDF or Markdown formatted files in the /tmp directory. Note that 'trac' mode only works on Reductive Labs servers. The default mode is 'text'. In 'rdoc' mode you must provide 'manifests-path' # # reference:: # Build a particular reference. Get a list of references by running +puppetdoc --list+. @@ -49,6 +49,8 @@ # $ puppetdoc --outputdir /tmp/rdoc --mode rdoc /path/to/manifests # or # $ puppetdoc /etc/puppet/manifests/site.pp +# or +# $ puppetdoc -m markdown -r configuration # # = Author # diff --git a/lib/puppet/application/puppetdoc.rb b/lib/puppet/application/puppetdoc.rb index 99e46cfd1..45aba42ea 100644 --- a/lib/puppet/application/puppetdoc.rb +++ b/lib/puppet/application/puppetdoc.rb @@ -58,8 +58,7 @@ Puppet::Application.new(:puppetdoc) do end dispatch do - return :rdoc if options[:mode] == :rdoc - return :trac if options[:mode] == :trac + return options[:mode] if [:rdoc, :trac, :markdown].include?(options[:mode]) return :other end @@ -101,6 +100,31 @@ Puppet::Application.new(:puppetdoc) do end end + command(:markdown) do + text = "" + with_contents = false + exit_code = 0 + options[:references].sort { |a,b| a.to_s <=> b.to_s }.each do |name| + raise "Could not find reference %s" % name unless section = Puppet::Util::Reference.reference(name) + + begin + # Add the per-section text, but with no ToC + text += section.send(options[:format], with_contents) + text += Puppet::Util::Reference.footer + text.gsub!(/`\w+\s+([^`]+)`:trac:/) { |m| $1 } + Puppet::Util::Reference.markdown(name, text) + text = "" + rescue => detail + puts detail.backtrace + $stderr.puts "Could not generate reference %s: %s" % [name, detail] + exit_code = 1 + next + end + end + + exit exit_code + end + command(:other) do text = "" if options[:references].length > 1 @@ -132,7 +156,7 @@ Puppet::Application.new(:puppetdoc) do if options[:mode] == :pdf Puppet::Util::Reference.pdf(text) - else + else puts text end diff --git a/lib/puppet/util/reference.rb b/lib/puppet/util/reference.rb index 40e49f45f..7526e6566 100644 --- a/lib/puppet/util/reference.rb +++ b/lib/puppet/util/reference.rb @@ -14,7 +14,7 @@ class Puppet::Util::Reference end def self.modes - %w{pdf trac text} + %w{pdf trac text markdown} end def self.newreference(name, options = {}, &block) @@ -57,14 +57,36 @@ class Puppet::Util::Reference $stderr.puts output # Now convert to pdf - puts "handling pdf" Dir.chdir("/tmp") do %x{texi2pdf puppetdoc.tex >/dev/null 2>/dev/null} end - #if FileTest.exists?("/tmp/puppetdoc.pdf") - # FileUtils.mv("/tmp/puppetdoc.pdf", "/export/apache/docroots/reductivelabs.com/htdocs/downloads/puppet/reference.pdf") - #end + end + + def self.markdown(name, text) + puts "Creating markdown for #{name} reference." + dir = "/tmp/" + Puppet::PUPPETVERSION + FileUtils.mkdir(dir) unless File.directory?(dir) + File.open(dir + "/" + "#{name}.rst", "w") do |f| + f.puts text + end + pandoc = %x{which pandoc} + if $? != 0 or pandoc =~ /no / + pandoc = %x{which pandoc} + end + if $? != 0 or pandoc =~ /no / + raise "Could not find pandoc" + end + pandoc.chomp! + cmd = %{#{pandoc} -s -r rst -w markdown #{dir}/#{name}.rst -o #{dir}/#{name}.mdwn} + output = %x{#{cmd}} + unless $? == 0 + $stderr.puts "Pandoc failed to create #{name} reference." + $stderr.puts output + exit(1) + end + + File.unlink(dir + "/" + "#{name}.rst") end def self.references