aboutsummaryrefslogtreecommitdiff
path: root/lib/lib_ext/markdown_document_listener.rb
blob: 55026e95ec0f3aa64accc52ae58d833c7c9f4d28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
require 'stringio'
require 'gli/commands/help_modules/arg_name_formatter'

#
# adaption of RdocDocumentListener to use Markdown
# see http://rtomayko.github.com/ronn/ronn-format.7
#

module GLI
  module Commands
    class MarkdownDocumentListener

      def initialize(global_options,options,arguments)
        @io = STDOUT #File.new(File.basename($0) + ".rdoc",'w')
        @nest = ''
        @arg_name_formatter = GLI::Commands::HelpModules::ArgNameFormatter.new
      end

      def beginning
      end

      # Called when processing has completed
      def ending
        #@io.close
      end

      # Gives you the program description
      def program_desc(desc)
        @io.puts "== #{File.basename($0)} - #{desc}"
        @io.puts
      end

      def program_long_desc(desc)
        @io.puts desc
        @io.puts
      end

      # Gives you the program version
      def version(version)
        @io.puts "v#{version}"
        @io.puts
      end

      def options
        if @nest.size == 0
          @io.puts "=== Global Options"
        else
          @io.puts "#{@nest}=== Options"
        end
      end

      # Gives you a flag in the current context
      def flag(name,aliases,desc,long_desc,default_value,arg_name,must_match,type)
        invocations = ([name] + Array(aliases)).map { |_| add_dashes(_) }.join('|')
        usage = "#{invocations} #{arg_name || 'arg'}"
        @io.puts "#{@nest}=== #{usage}"
        @io.puts
        @io.puts String(desc).strip
        @io.puts
        @io.puts "[Default Value] #{default_value || 'None'}"
        @io.puts "[Must Match] #{must_match.to_s}" unless must_match.nil?
        @io.puts String(long_desc).strip
        @io.puts
      end

      # Gives you a switch in the current context
      def switch(name,aliases,desc,long_desc,negetable)
        if negetable
          name = "[no-]#{name}" if name.to_s.length > 1
          aliases = aliases.map { |_|  _.to_s.length > 1 ? "[no-]#{_}" : _ }
        end
        invocations = ([name] + aliases).map { |_| add_dashes(_) }.join('|')
        @io.puts "#{@nest}=== #{invocations}"
        @io.puts String(desc).strip
        @io.puts
        @io.puts String(long_desc).strip
        @io.puts
      end

      def end_options
      end

      def commands
        @io.puts "#{@nest}=== Commands"
        @nest = "#{@nest}="
      end

      # Gives you a command in the current context and creates a new context of this command
      def command(name,aliases,desc,long_desc,arg_name,arg_options)
        @io.puts "#{@nest}=== Command: <tt>#{([name] + aliases).join('|')} #{@arg_name_formatter.format(arg_name,arg_options)}</tt>"
        @io.puts String(desc).strip
        @io.puts
        @io.puts String(long_desc).strip
        @nest = "#{@nest}="
      end

      # Ends a command, and "pops" you back up one context
      def end_command(name)
        @nest.gsub!(/=$/,'')
      end

      # Gives you the name of the current command in the current context
      def default_command(name)
        @io.puts "[Default Command] #{name}" unless name.nil?
      end

      def end_commands
        @nest.gsub!(/=$/,'')
      end

    private

      def add_dashes(name)
        name = "-#{name}"
        name = "-#{name}" if name.length > 2
        name
      end


    end
  end
end