class Kramdown::Converter::Man

Converts a Kramdown::Document to a manpage in groff format. See man(7), groff_man(7) and man-pages(7) for information regarding the output.

Constants

TABLE_CELL_ALIGNMENT
TYPOGRAPHIC_SYMS_MAP

Private Instance Methods

convert_a(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
190 def convert_a(el, opts)
191   if el.children.size == 1 && el.children[0].type == :text &&
192       el.attr['href'] == el.children[0].value
193     newline(opts[:result]) << macro("UR", escape(el.attr['href'])) << macro("UE")
194   elsif el.attr['href'].start_with?('mailto:')
195     newline(opts[:result]) << macro("MT", escape(el.attr['href'].sub(/^mailto:/, ''))) <<
196       macro("UE")
197   else
198     newline(opts[:result]) << macro("UR", escape(el.attr['href']))
199     inner(el, opts)
200     newline(opts[:result]) << macro("UE")
201   end
202 end
convert_abbreviation(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
228 def convert_abbreviation(el, opts)
229   opts[:result] << escape(el.value)
230 end
convert_blank(*) click to toggle source
   # File lib/kramdown/converter/man.rb
46 def convert_blank(*)
47 end
Also aliased as: convert_hr, convert_xml_pi
convert_blockquote(el, opts) click to toggle source
   # File lib/kramdown/converter/man.rb
94 def convert_blockquote(el, opts)
95   opts[:result] << macro("RS")
96   inner(el, opts)
97   opts[:result] << macro("RE")
98 end
convert_br(_el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
224 def convert_br(_el, opts)
225   newline(opts[:result]) << macro("br")
226 end
convert_codeblock(el, opts) click to toggle source
   # File lib/kramdown/converter/man.rb
88 def convert_codeblock(el, opts)
89   opts[:result] << macro("sp") << macro("RS", 4) << macro("EX")
90   opts[:result] << newline(escape(el.value, true))
91   opts[:result] << macro("EE") << macro("RE")
92 end
convert_codespan(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
220 def convert_codespan(el, opts)
221   opts[:result] << "\\fB#{escape(el.value)}\\fP"
222 end
convert_comment(el, opts)
Alias for: convert_xml_comment
convert_dd(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
126 def convert_dd(el, opts)
127   inner(el, opts, :first)
128   if el.children.size > 1
129     opts[:result] << macro("RS")
130     inner(el, opts, :rest)
131     opts[:result] << macro("RE")
132   end
133   opts[:result] << macro("sp") if opts[:next] && opts[:next].type == :dd
134 end
convert_dl(el, opts)
Alias for: convert_ul
convert_dt(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
120 def convert_dt(el, opts)
121   opts[:result] << macro(opts[:prev] && opts[:prev].type == :dt ? "TQ" : "TP")
122   inner(el, opts)
123   opts[:result] << "\n"
124 end
convert_em(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
208 def convert_em(el, opts)
209   opts[:result] << '\fI'
210   inner(el, opts)
211   opts[:result] << '\fP'
212 end
convert_entity(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
254 def convert_entity(el, opts)
255   opts[:result] << unicode_char(el.value.code_point)
256 end
convert_footnote(*) click to toggle source
    # File lib/kramdown/converter/man.rb
240 def convert_footnote(*)
241   warning("Footnotes are not supported")
242 end
convert_header(el, opts) click to toggle source
   # File lib/kramdown/converter/man.rb
60 def convert_header(el, opts)
61   return unless opts[:parent].type == :root
62   case el.options[:level]
63   when 1
64     unless @title_done
65       @title_done = true
66       data = el.options[:raw_text].scan(/([^(]+)\s*\((\d\w*)\)(?:\s*-+\s*(.*))?/).first ||
67         el.options[:raw_text].scan(/([^\s]+)\s*(?:-*\s+)?()(.*)/).first
68       return unless data && data[0]
69       name = data[0]
70       section = (data[1].to_s.empty? ? el.attr['data-section'] || '7' : data[1])
71       description = (data[2].to_s.empty? ? nil : " - #{data[2]}")
72       date = el.attr['data-date'] ? quote(el.attr['data-date']) : nil
73       extra = (el.attr['data-extra'] ? quote(escape(el.attr['data-extra'].to_s)) : nil)
74       opts[:result] << macro("TH", quote(escape(name.upcase)), quote(section), date, extra)
75       if description
76         opts[:result] << macro("SH", "NAME") << escape("#{name}#{description}") << "\n"
77       end
78     end
79   when 2
80     opts[:result] << macro("SH", quote(escape(el.options[:raw_text])))
81   when 3
82     opts[:result] << macro("SS", quote(escape(el.options[:raw_text])))
83   else
84     warning("Header levels greater than three are not supported")
85   end
86 end
convert_hr(*)
Alias for: convert_blank
convert_html_element(*) click to toggle source
    # File lib/kramdown/converter/man.rb
181 def convert_html_element(*)
182   warning("HTML elements are not supported")
183 end
convert_img(_el, _opts) click to toggle source
    # File lib/kramdown/converter/man.rb
204 def convert_img(_el, _opts)
205   warning("Images are not supported")
206 end
convert_li(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
109 def convert_li(el, opts)
110   sym = (opts[:parent].type == :ul ? '\(bu' : "#{opts[:index] + 1}.")
111   opts[:result] << macro("IP", sym, 4)
112   inner(el, opts, :first)
113   if el.children.size > 1
114     opts[:result] << macro("RS")
115     inner(el, opts, :rest)
116     opts[:result] << macro("RE")
117   end
118 end
convert_math(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
232 def convert_math(el, opts)
233   if el.options[:category] == :block
234     convert_codeblock(el, opts)
235   else
236     convert_codespan(el, opts)
237   end
238 end
convert_ol(el, opts)
Alias for: convert_ul
convert_p(el, opts) click to toggle source
   # File lib/kramdown/converter/man.rb
51 def convert_p(el, opts)
52   if (opts[:index] != 0 && opts[:prev].type != :header) ||
53       (opts[:parent].type == :blockquote && opts[:index] == 0)
54     opts[:result] << macro("P")
55   end
56   inner(el, opts)
57   newline(opts[:result])
58 end
convert_raw(*) click to toggle source
    # File lib/kramdown/converter/man.rb
244 def convert_raw(*)
245   warning("Raw content is not supported")
246 end
convert_root(el, opts) click to toggle source
   # File lib/kramdown/converter/man.rb
39 def convert_root(el, opts)
40   @title_done = false
41   opts[:result] = +".\\\" generated by kramdown\n"
42   inner(el, opts)
43   opts[:result]
44 end
convert_smart_quote(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
258 def convert_smart_quote(el, opts)
259   opts[:result] << unicode_char(::Kramdown::Utils::Entities.entity(el.value.to_s).code_point)
260 end
convert_strong(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
214 def convert_strong(el, opts)
215   opts[:result] << '\fB'
216   inner(el, opts)
217   opts[:result] << '\fP'
218 end
convert_table(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
138 def convert_table(el, opts)
139   opts[:alignment] = el.options[:alignment].map {|a| TABLE_CELL_ALIGNMENT[a] }
140   table_options = ["box"]
141   table_options << "center" if el.attr['class']&.match?(/\bcenter\b/)
142   opts[:result] << macro("TS") << "#{table_options.join(' ')} ;\n"
143   inner(el, opts)
144   opts[:result] << macro("TE") << macro("sp")
145 end
convert_tbody(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
153 def convert_tbody(el, opts)
154   opts[:result] << ".T&\n" if opts[:index] != 0
155   opts[:result] << opts[:alignment].join(' ') << " .\n"
156   inner(el, opts)
157   opts[:result] << (opts[:next].type == :tfoot ? "=\n" : "_\n") if opts[:next]
158 end
convert_td(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
169 def convert_td(el, opts)
170   result = opts[:result]
171   opts[:result] = +''
172   inner(el, opts)
173   if opts[:result].include?("\n")
174     warning("Table cells using links are not supported")
175     result << "\t"
176   else
177     result << opts[:result] << "\t"
178   end
179 end
convert_text(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
248 def convert_text(el, opts)
249   text = escape(el.value)
250   text.lstrip! if opts[:result][-1] == "\n"
251   opts[:result] << text
252 end
convert_tfoot(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
160 def convert_tfoot(el, opts)
161   inner(el, opts)
162 end
convert_thead(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
147 def convert_thead(el, opts)
148   opts[:result] << opts[:alignment].map {|a| "#{a}b" }.join(' ') << " .\n"
149   inner(el, opts)
150   opts[:result] << "=\n"
151 end
convert_tr(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
164 def convert_tr(el, opts)
165   inner(el, opts)
166   opts[:result] << "\n"
167 end
convert_typographic_sym(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
267 def convert_typographic_sym(el, opts)
268   opts[:result] << TYPOGRAPHIC_SYMS_MAP[el.value]
269 end
convert_ul(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
100 def convert_ul(el, opts)
101   compact = (el.attr['class'] =~ /\bcompact\b/)
102   opts[:result] << macro("sp") << macro("PD", 0) if compact
103   inner(el, opts)
104   opts[:result] << macro("PD") if compact
105 end
Also aliased as: convert_dl, convert_ol
convert_xml_comment(el, opts) click to toggle source
    # File lib/kramdown/converter/man.rb
185 def convert_xml_comment(el, opts)
186   newline(opts[:result]) << ".\"#{escape(el.value, true).rstrip.gsub(/\n/, "\n.\"")}\n"
187 end
Also aliased as: convert_comment
convert_xml_pi(*)
Alias for: convert_blank
escape(text, preserve_whitespace = false) click to toggle source
    # File lib/kramdown/converter/man.rb
284 def escape(text, preserve_whitespace = false)
285   text = (preserve_whitespace ? text.dup : text.gsub(/\s+/, ' '))
286   text.gsub!('\\', "\\e")
287   text.gsub!(/^\./, '\\\\&.')
288   text.gsub!(/[.'-]/) {|m| "\\#{m}" }
289   text
290 end
inner(el, opts, use = :all) click to toggle source
   # File lib/kramdown/converter/man.rb
25 def inner(el, opts, use = :all)
26   arr = el.children.reject {|e| e.type == :blank }
27   arr.each_with_index do |inner_el, index|
28     next if use == :rest && index == 0
29     break if use == :first && index > 0
30     options = opts.dup
31     options[:parent] = el
32     options[:index] = index
33     options[:prev] = (index == 0 ? nil : arr[index - 1])
34     options[:next] = (index == arr.length - 1 ? nil : arr[index + 1])
35     convert(inner_el, options)
36   end
37 end
macro(name, *args) click to toggle source
    # File lib/kramdown/converter/man.rb
271 def macro(name, *args)
272   ".#{[name, *args].compact.join(' ')}\n"
273 end
newline(text) click to toggle source
    # File lib/kramdown/converter/man.rb
275 def newline(text)
276   text << "\n" unless text[-1] == "\n"
277   text
278 end
quote(text) click to toggle source
    # File lib/kramdown/converter/man.rb
280 def quote(text)
281   "\"#{text.gsub(/"/, '\\"')}\""
282 end
unicode_char(codepoint) click to toggle source
    # File lib/kramdown/converter/man.rb
292 def unicode_char(codepoint)
293   "\\[u#{codepoint.to_s(16).rjust(4, '0')}]"
294 end