nronn 0.10.1.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +8 -0
  3. data/CHANGES +230 -0
  4. data/Gemfile +2 -0
  5. data/Gemfile.lock +72 -0
  6. data/INSTALLING.md +92 -0
  7. data/LICENSE.txt +12 -0
  8. data/README.md +131 -0
  9. data/Rakefile +153 -0
  10. data/bin/ronn +253 -0
  11. data/completion/bash/ronn +32 -0
  12. data/completion/zsh/_ronn +24 -0
  13. data/config.ru +15 -0
  14. data/lib/ronn/document.rb +530 -0
  15. data/lib/ronn/index.rb +180 -0
  16. data/lib/ronn/roff.rb +393 -0
  17. data/lib/ronn/server.rb +67 -0
  18. data/lib/ronn/template/80c.css +6 -0
  19. data/lib/ronn/template/dark.css +18 -0
  20. data/lib/ronn/template/darktoc.css +17 -0
  21. data/lib/ronn/template/default.html +41 -0
  22. data/lib/ronn/template/man.css +100 -0
  23. data/lib/ronn/template/print.css +5 -0
  24. data/lib/ronn/template/screen.css +105 -0
  25. data/lib/ronn/template/toc.css +27 -0
  26. data/lib/ronn/template.rb +173 -0
  27. data/lib/ronn/utils.rb +57 -0
  28. data/lib/ronn.rb +47 -0
  29. data/man/index.html +78 -0
  30. data/man/index.txt +15 -0
  31. data/man/ronn-format.7 +145 -0
  32. data/man/ronn-format.7.ronn +157 -0
  33. data/man/ronn.1 +227 -0
  34. data/man/ronn.1.ronn +316 -0
  35. data/nronn.gemspec +136 -0
  36. data/test/angle_bracket_syntax.html +27 -0
  37. data/test/angle_bracket_syntax.roff +24 -0
  38. data/test/angle_bracket_syntax.ronn +22 -0
  39. data/test/backticks.html +14 -0
  40. data/test/backticks.ronn +10 -0
  41. data/test/basic_document.html +8 -0
  42. data/test/basic_document.ronn +4 -0
  43. data/test/circumflexes.ronn +1 -0
  44. data/test/code_blocks.html +38 -0
  45. data/test/code_blocks.roff +38 -0
  46. data/test/code_blocks.ronn +41 -0
  47. data/test/code_blocks_regression +19 -0
  48. data/test/code_blocks_regression.html +38 -0
  49. data/test/code_blocks_regression.ronn +40 -0
  50. data/test/contest.rb +70 -0
  51. data/test/custom_title_document.html +6 -0
  52. data/test/custom_title_document.ronn +5 -0
  53. data/test/definition_list_syntax.html +25 -0
  54. data/test/definition_list_syntax.roff +19 -0
  55. data/test/definition_list_syntax.ronn +18 -0
  56. data/test/dots_at_line_start_test.roff +19 -0
  57. data/test/dots_at_line_start_test.ronn +12 -0
  58. data/test/ellipses.roff +7 -0
  59. data/test/ellipses.ronn +7 -0
  60. data/test/entity_encoding_test.html +42 -0
  61. data/test/entity_encoding_test.roff +51 -0
  62. data/test/entity_encoding_test.ronn +34 -0
  63. data/test/index.txt +8 -0
  64. data/test/markdown_syntax.html +954 -0
  65. data/test/markdown_syntax.roff +907 -0
  66. data/test/markdown_syntax.ronn +881 -0
  67. data/test/middle_paragraph.html +14 -0
  68. data/test/middle_paragraph.roff +9 -0
  69. data/test/middle_paragraph.ronn +10 -0
  70. data/test/missing_spaces.roff +7 -0
  71. data/test/missing_spaces.ronn +2 -0
  72. data/test/nested_list.ronn +19 -0
  73. data/test/nested_list_with_code.html +14 -0
  74. data/test/nested_list_with_code.roff +11 -0
  75. data/test/nested_list_with_code.ronn +6 -0
  76. data/test/ordered_list.html +28 -0
  77. data/test/ordered_list.roff +25 -0
  78. data/test/ordered_list.ronn +21 -0
  79. data/test/page.with.periods.in.name.5.ronn +4 -0
  80. data/test/pre_block_with_quotes.roff +8 -0
  81. data/test/pre_block_with_quotes.ronn +6 -0
  82. data/test/section_reference_links.html +16 -0
  83. data/test/section_reference_links.roff +7 -0
  84. data/test/section_reference_links.ronn +12 -0
  85. data/test/single_quotes.html +11 -0
  86. data/test/single_quotes.roff +5 -0
  87. data/test/single_quotes.ronn +9 -0
  88. data/test/tables.ronn +24 -0
  89. data/test/test_ronn.rb +124 -0
  90. data/test/test_ronn_document.rb +186 -0
  91. data/test/test_ronn_index.rb +73 -0
  92. data/test/titleless_document.html +9 -0
  93. data/test/titleless_document.ronn +3 -0
  94. data/test/underline_spacing_test.roff +13 -0
  95. data/test/underline_spacing_test.ronn +11 -0
  96. metadata +309 -0
data/lib/ronn/roff.rb ADDED
@@ -0,0 +1,393 @@
1
+ require 'nokogiri'
2
+ require 'ronn/utils'
3
+
4
+ module Ronn
5
+ # Filter for converting HTML to ROFF
6
+ class RoffFilter
7
+ include Ronn::Utils
8
+
9
+ # Convert Ronn HTML to roff.
10
+ # The html input is an HTML fragment, not a complete document
11
+ def initialize(html_fragment, name, section, tagline, manual = nil,
12
+ version = nil, date = nil)
13
+ @buf = []
14
+ title_heading name, section, tagline, manual, version, date
15
+ doc = Nokogiri::HTML.fragment(html_fragment)
16
+ remove_extraneous_elements! doc
17
+ normalize_whitespace! doc
18
+ block_filter doc
19
+ write "\n"
20
+ end
21
+
22
+ def to_s
23
+ @buf.join.gsub(/[ \t]+$/, '')
24
+ end
25
+
26
+ protected
27
+
28
+ def previous(node)
29
+ return unless node.respond_to?(:previous)
30
+ prev = node.previous
31
+ prev = prev.previous until prev.nil? || prev.elem?
32
+ prev
33
+ end
34
+
35
+ def title_heading(name, section, _tagline, manual, version, date)
36
+ comment "generated with nRonn/v#{Ronn.version}"
37
+ comment "https://github.com/n-ronn/nronn/tree/#{Ronn.revision}"
38
+ return if name.nil?
39
+ if manual
40
+ macro 'TH', %("#{escape(name.upcase)}" "#{section}" "#{date.strftime('%B %Y')}" "#{version}" "#{manual}")
41
+ else
42
+ macro 'TH', %("#{escape(name.upcase)}" "#{section}" "#{date.strftime('%B %Y')}" "#{version}")
43
+ end
44
+ end
45
+
46
+ def remove_extraneous_elements!(doc)
47
+ doc.traverse do |node|
48
+ node.parent.children.delete(node) if node.comment?
49
+ end
50
+ end
51
+
52
+ def normalize_whitespace!(node)
53
+ if node.is_a?(Array) || node.is_a?(Nokogiri::XML::NodeSet)
54
+ node.to_a.dup.each { |ch| normalize_whitespace! ch }
55
+ elsif node.text?
56
+ preceding = node.previous
57
+ following = node.next
58
+ content = node.content.gsub(/[\n ]+/m, ' ')
59
+ if preceding.nil? || block_element?(preceding.name) ||
60
+ preceding.name == 'br'
61
+ content.lstrip!
62
+ end
63
+ if following.nil? || block_element?(following.name) ||
64
+ following.name == 'br'
65
+ content.rstrip!
66
+ end
67
+ if content.empty?
68
+ node.remove
69
+ else
70
+ node.content = content
71
+ end
72
+ elsif node.elem? && node.name == 'pre'
73
+ # stop traversing
74
+ elsif node.elem? && node.children
75
+ normalize_whitespace! node.children
76
+ elsif node.elem?
77
+ # element has no children
78
+ elsif node.document? || node.fragment?
79
+ normalize_whitespace! node.children
80
+ elsif node.is_a?(Nokogiri::XML::DTD) || node.is_a?(Nokogiri::XML::Comment)
81
+ # ignore
82
+ nop
83
+ else
84
+ warn 'unexpected node during whitespace normalization: %p', node
85
+ end
86
+ end
87
+
88
+ def block_filter(node)
89
+ return if node.nil?
90
+
91
+ if node.is_a?(Array) || node.is_a?(Nokogiri::XML::NodeSet)
92
+ node.each { |ch| block_filter(ch) }
93
+
94
+ elsif node.document? || node.fragment?
95
+ block_filter(node.children)
96
+
97
+ elsif node.text?
98
+ # This hack is necessary to support mixed-child-type dd's
99
+ inline_filter(node)
100
+
101
+ elsif node.elem?
102
+ case node.name
103
+ when 'html', 'body'
104
+ block_filter(node.children)
105
+ when 'div'
106
+ block_filter(node.children)
107
+ when 'h1'
108
+ # discard
109
+ nop
110
+ when 'h2'
111
+ macro 'SH', quote(escape(node.inner_html))
112
+ when 'h3'
113
+ macro 'SS', quote(escape(node.inner_html))
114
+ when 'h4', 'h5', 'h6'
115
+ # Ronn discourages use of this many heading levels, but if they are used,
116
+ # we should make them legible instead of ignoring them.
117
+ macro 'SS', quote(escape(node.inner_html))
118
+
119
+ when 'p'
120
+ prev = previous(node)
121
+ if prev && %w[dd li blockquote].include?(node.parent.name)
122
+ macro 'IP'
123
+ elsif prev && !%w[h1 h2 h3].include?(prev.name)
124
+ macro 'P'
125
+ elsif node.previous&.text?
126
+ macro 'IP'
127
+ end
128
+ inline_filter(node.children)
129
+
130
+ when 'blockquote'
131
+ prev = previous(node)
132
+ indent = prev.nil? || !%w[h1 h2 h3].include?(prev.name)
133
+ macro 'IP', %w["" 4] if indent
134
+ block_filter(node.children)
135
+ macro 'IP', %w["" 0] if indent
136
+
137
+ when 'pre'
138
+ prev = previous(node)
139
+ indent = prev.nil? || !%w[h1 h2 h3].include?(prev.name)
140
+ macro 'IP', %w["" 4] if indent
141
+ macro 'nf'
142
+ # HACK: strip an initial \n to avoid extra spacing
143
+ if node.children && node.children[0].text?
144
+ text = node.children[0].to_s
145
+ node.children[0].replace(text[1..-1]) if text.start_with? "\n"
146
+ end
147
+ inline_filter(node.children)
148
+ macro 'fi'
149
+ macro 'IP', %w["" 0] if indent
150
+
151
+ when 'dl'
152
+ macro 'TP'
153
+ block_filter(node.children)
154
+ when 'dt'
155
+ prev = previous(node)
156
+ macro 'TP' unless prev.nil?
157
+ inline_filter(node.children)
158
+ write "\n"
159
+ when 'dd'
160
+ if node.at('p')
161
+ block_filter(node.children)
162
+ else
163
+ inline_filter(node.children)
164
+ end
165
+ write "\n"
166
+
167
+ when 'ol', 'ul'
168
+ block_filter(node.children)
169
+ macro 'IP', %w["" 0]
170
+ when 'li'
171
+ case node.parent.name
172
+ when 'ol'
173
+ macro 'IP', %W["#{node.parent.children.index(node) + 1}." 4]
174
+ when 'ul'
175
+ macro 'IP', ['"\(bu"', '4']
176
+ else
177
+ raise "List element found as a child of non-list parent element: #{node.inspect}"
178
+ end
179
+ if node.at('p,ol,ul,dl,div')
180
+ block_filter(node.children)
181
+ else
182
+ inline_filter(node.children)
183
+ end
184
+ write "\n"
185
+
186
+ when 'span', 'code', 'b', 'strong', 'kbd', 'samp', 'var', 'em', 'i',
187
+ 'u', 'br', 'a'
188
+ inline_filter(node)
189
+
190
+ when 'table'
191
+ macro 'TS'
192
+ write "allbox;\n"
193
+ block_filter(node.children)
194
+ macro 'TE'
195
+ when 'thead'
196
+ # Convert to format section and first row
197
+ tr = node.children[0]
198
+ header_contents = []
199
+ cell_formats = []
200
+ tr.children.each do |th|
201
+ style = th['style']
202
+ cell_format = case style
203
+ when 'text-align:left;'
204
+ 'l'
205
+ when 'text-align:right;'
206
+ 'r'
207
+ when 'text-align:center;'
208
+ 'c'
209
+ else
210
+ 'l'
211
+ end
212
+ header_contents << th.inner_html
213
+ cell_formats << cell_format
214
+ end
215
+ write cell_formats.join(' ') + ".\n"
216
+ write header_contents.join("\t") + "\n"
217
+ when 'th'
218
+ raise 'internal error: unexpected <th> element'
219
+ when 'tbody'
220
+ # Let the 'tr' handle it
221
+ block_filter(node.children)
222
+ when 'tr'
223
+ # Convert to a table data row
224
+ node.children.each do |child|
225
+ block_filter(child)
226
+ write "\t"
227
+ end
228
+ write "\n"
229
+ when 'td'
230
+ inline_filter(node.children)
231
+
232
+ else
233
+ warn 'unrecognized block tag: %p', node.name
234
+ end
235
+
236
+ elsif node.is_a?(Nokogiri::XML::DTD)
237
+ # Ignore
238
+ nop
239
+ elsif node.is_a?(Nokogiri::XML::Comment)
240
+ # Ignore
241
+ nop
242
+ else
243
+ raise "unexpected node: #{node.inspect}"
244
+ end
245
+ end
246
+
247
+ def inline_filter(node)
248
+ return unless node # is an empty node
249
+
250
+ if node.is_a?(Array) || node.is_a?(Nokogiri::XML::NodeSet)
251
+ node.each { |ch| inline_filter(ch) }
252
+
253
+ elsif node.text?
254
+ text = node.to_html.dup
255
+ write escape(text)
256
+
257
+ elsif node.comment?
258
+ # ignore HTML comments
259
+
260
+ elsif node.elem?
261
+ case node.name
262
+ when 'span'
263
+ inline_filter(node.children)
264
+
265
+ when 'code'
266
+ if child_of?(node, 'pre')
267
+ inline_filter(node.children)
268
+ else
269
+ write '\fB'
270
+ inline_filter(node.children)
271
+ write '\fR'
272
+ end
273
+
274
+ when 'b', 'strong', 'kbd', 'samp'
275
+ write '\fB'
276
+ inline_filter(node.children)
277
+ write '\fR'
278
+
279
+ when 'var', 'em', 'i', 'u'
280
+ write '\fI'
281
+ inline_filter(node.children)
282
+ write '\fR'
283
+
284
+ when 'br'
285
+ macro 'br'
286
+
287
+ when 'a'
288
+ if node.classes.include?('man-ref')
289
+ inline_filter(node.children)
290
+ elsif node.has_attribute?('data-bare-link')
291
+ write '\fI'
292
+ inline_filter(node.children)
293
+ write '\fR'
294
+ else
295
+ inline_filter(node.children)
296
+ write ' '
297
+ write '\fI'
298
+ write escape(node.attributes['href'].content)
299
+ write '\fR'
300
+ end
301
+
302
+ when 'sup'
303
+ # This superscript equivalent is a big ugly hack.
304
+ write '^('
305
+ inline_filter(node.children)
306
+ write ')'
307
+
308
+ else
309
+ warn 'unrecognized inline tag: %p', node.name
310
+ end
311
+
312
+ else
313
+ raise "unexpected node: #{node.inspect}"
314
+ end
315
+ end
316
+
317
+ def maybe_new_line
318
+ write "\n" if @buf.last && @buf.last[-1] != "\n"
319
+ end
320
+
321
+ def macro(name, value = nil)
322
+ maybe_new_line
323
+ writeln ".#{[name, value].compact.join(' ')}"
324
+ end
325
+
326
+ HTML_ROFF_ENTITIES = {
327
+ '•' => '\(bu',
328
+ '&lt;' => '<',
329
+ '&gt;' => '>',
330
+ ' ' => '\~', # That's a literal non-breaking space character there
331
+ '©' => '\(co',
332
+ '”' => '\(rs',
333
+ '—' => '\(em',
334
+ '®' => '\(rg',
335
+ '§' => '\(sc',
336
+ '≥' => '\(>=',
337
+ '≤' => '\(<=',
338
+ '≠' => '\(!=',
339
+ '≡' => '\(=='
340
+ }.freeze
341
+
342
+ def escape(text)
343
+ return text.to_s if text.nil? || text.empty?
344
+ ent = HTML_ROFF_ENTITIES
345
+ text = text.dup
346
+ text.gsub!(/&#x([0-9A-Fa-f]+);/) { $1.to_i(16).chr } # hex entities
347
+ text.gsub!(/&#(\d+);/) { $1.to_i.chr } # dec entities
348
+ text.gsub!('\\', '\e') # backslash
349
+ text.gsub!('...', '\|.\|.\|.') # ellipses
350
+ text.gsub!(/[.-]/) { |m| "\\#{m}" } # control chars
351
+ ent.each do |key, val|
352
+ text.gsub!(key, val)
353
+ end
354
+ text.gsub!('&amp;', '&') # amps
355
+ text
356
+ end
357
+
358
+ def quote(text)
359
+ "\"#{text.gsub(/"/, '\\"')}\""
360
+ end
361
+
362
+ # write text to output buffer
363
+ def write(text)
364
+ return if text.nil? || text.empty?
365
+ # lines cannot start with a '.' or "'". insert zero-width character before.
366
+ text = text.gsub(/\n\\\./, "\n\\\\&\\.")
367
+ text = text.gsub(/\n'/, "\n\\&\\'")
368
+ buf_ends_in_newline = @buf.last && @buf.last[-1] == "\n"
369
+ @buf << '\&' if text[0, 2] == '\.' && buf_ends_in_newline
370
+ @buf << '\&' if text[0, 1] == "'" && buf_ends_in_newline
371
+ @buf << text
372
+ end
373
+
374
+ # write text to output buffer on a new line.
375
+ def writeln(text)
376
+ maybe_new_line
377
+ write text
378
+ write "\n"
379
+ end
380
+
381
+ def comment(text)
382
+ writeln %(.\\" #{text})
383
+ end
384
+
385
+ def warn(text, *args)
386
+ Kernel.warn format("warn: #{text}", args)
387
+ end
388
+
389
+ def nop
390
+ # Do nothing
391
+ end
392
+ end
393
+ end
@@ -0,0 +1,67 @@
1
+ require 'ronn'
2
+ require 'rack'
3
+ require 'sinatra/base'
4
+
5
+ module Ronn
6
+ # Ronn HTTP server. Serves a list of .ronn files as HTML. The options Hash is
7
+ # passed to Ronn::Document.new on each invocation.
8
+ #
9
+ # Use Ronn::Server.new to create a Rack app. See the config.ru file in the
10
+ # root of the Ronn distribution for example usage.
11
+ #
12
+ # Ronn::Server.run starts a server on port 1207.
13
+ module Server
14
+ def self.new(files, options = {})
15
+ files = Dir[files] if files.respond_to?(:to_str)
16
+ raise ArgumentError, 'no files' if files.empty?
17
+ Sinatra.new do
18
+ set :show_exceptions, true
19
+ set :public_dir, File.expand_path(__FILE__, '../templates')
20
+ set :static, false
21
+ set :views, File.expand_path(__FILE__, '../templates')
22
+
23
+ get '/' do
24
+ files.map do |f|
25
+ base = File.basename(f, '.ronn')
26
+ "<li><a href='./#{base}.html'>#{escape_html(base)}</a></li>"
27
+ end
28
+ end
29
+
30
+ options[:styles] ||= options[:style]
31
+ my_styles = if options[:styles].respond_to?(:to_ary)
32
+ options[:styles]
33
+ elsif options[:styles]
34
+ options[:styles].split(/[, ]+/)
35
+ else
36
+ []
37
+ end
38
+
39
+ files.each do |file|
40
+ basename = File.basename(file, '.ronn')
41
+
42
+ get "/#{basename}.html" do
43
+ options = options.merge(styles: my_styles)
44
+ %w[date manual organization].each do |attribute|
45
+ next unless params[attribute]
46
+ options[attribute] = params[attribute]
47
+ end
48
+ Ronn::Document.new(file, options).to_html
49
+ end
50
+ get "/#{basename}.roff" do
51
+ content_type 'text/plain+roff'
52
+ Ronn::Document.new(file, options.dup).to_roff
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ def self.run(files, options = {})
59
+ port_number = options['port'] || 1207
60
+ new(files, options).run!(
61
+ server: %w[mongrel thin webrick],
62
+ port: port_number,
63
+ logging: true
64
+ )
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,6 @@
1
+ /* 80c.css - condense width to emulate a classical 80 character terminal */
2
+
3
+ .mp { max-width:86ex }
4
+
5
+ /* .mp width + padding */
6
+ .man-navigation { left:101ex }
@@ -0,0 +1,18 @@
1
+ .mp, body#manpage {
2
+ background:#080706;
3
+ color:#888;
4
+ }
5
+ .mp, .mp code, .mp pre,
6
+ .mp pre code, .mp tt, .mp kbd,
7
+ .mp samp { color:#aaa }
8
+ .mp h1, .mp h2, .mp h3, .mp h4 { color:#fff }
9
+ .man-decor, .man-decor ol li { color:#666 }
10
+ .mp code, .mp strong, .mp b { color:#fff }
11
+
12
+ .mp em, .mp var, .mp u { color:#ddd }
13
+
14
+ .mp pre code { color:#ddd }
15
+
16
+ .mp a, .mp a:link, .mp a:hover,
17
+ .mp a code, .mp a pre, .mp a tt,
18
+ .mp a kbd, .mp a samp { color:#fff }
@@ -0,0 +1,17 @@
1
+ /* darktoc.css - enable table of contents */
2
+
3
+ .man-navigation {
4
+ border-left:2px solid #222;
5
+ background-color:#131211;
6
+ }
7
+ .man-navigation a,
8
+ .man-navigation a:hover,
9
+ .man-navigation a:link,
10
+ .man-navigation a:visited {
11
+ color:#777;
12
+ text-decoration:none;
13
+ }
14
+ .man-navigation a:hover {
15
+ color:#fff;
16
+ text-decoration:underline;
17
+ }
@@ -0,0 +1,41 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv='content-type' content='text/html;charset=utf8'>
5
+ <meta name='generator' content='{{ generator }}'>
6
+ <title>{{ title }}</title>
7
+ {{{ stylesheet_tags }}}
8
+ </head>
9
+ <!--
10
+ The following styles are deprecated and will be removed at some point:
11
+ div#man, div#man ol.man, div#man ol.head, div#man ol.man.
12
+
13
+ The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
14
+ .man-navigation should be used instead.
15
+ -->
16
+ <body id='manpage'>
17
+ <div class='mp' id='man'>
18
+
19
+ <div class='man-navigation' style='display:none'>
20
+ {{#section_heads}}
21
+ <a href="#{{id}}">{{text}}</a>
22
+ {{/section_heads}}
23
+ </div>
24
+
25
+ <ol class='man-decor man-head man head'>
26
+ <li class='tl'>{{ page_name }}</li>
27
+ <li class='tc'>{{ manual }}</li>
28
+ <li class='tr'>{{ page_name }}</li>
29
+ </ol>
30
+
31
+ {{{ html }}}
32
+
33
+ <ol class='man-decor man-foot man foot'>
34
+ <li class='tl'>{{ organization }}</li>
35
+ <li class='tc'>{{ date }}</li>
36
+ <li class='tr'>{{ page_name }}</li>
37
+ </ol>
38
+
39
+ </div>
40
+ </body>
41
+ </html>
@@ -0,0 +1,100 @@
1
+ /* man.css - core manpage styles */
2
+
3
+ /* STRUCTURE, INDENT, MARGINS */
4
+
5
+ body#manpage { margin:0 }
6
+ .mp {
7
+ max-width:100ex;
8
+ padding:0 9ex 1ex 4ex;
9
+ }
10
+
11
+ .mp p, .mp pre,
12
+ .mp ul, .mp ol, .mp dl { margin:0 0 20px 0 }
13
+ .mp h2 { margin:10px 0 0 0 }
14
+
15
+ .mp > p, .mp > pre, .mp > ul,
16
+ .mp > ol, .mp > dl { margin-left:8ex }
17
+ .mp h3 { margin:0 0 0 4ex }
18
+
19
+ .mp dt { margin:0; clear:left }
20
+ .mp dt.flush { float:left; width:8ex }
21
+ .mp dd { margin:0 0 0 9ex }
22
+ .mp h1, .mp h2, .mp h3, .mp h4 { clear:left }
23
+
24
+ .mp pre { margin-bottom:20px }
25
+ .mp pre+h2, .mp pre+h3 { margin-top:22px }
26
+ .mp h2+pre, .mp h3+pre { margin-top:5px }
27
+
28
+ .mp img { display:block;margin:auto }
29
+ .mp h1.man-title { display:none }
30
+
31
+ /* FONTS */
32
+
33
+ .mp, .mp code, .mp pre, .mp tt,
34
+ .mp kbd, .mp samp, .mp h3, .mp h4 {
35
+ font-family:monospace;
36
+ font-size:14px;
37
+ line-height:1.42857142857143;
38
+ }
39
+ .mp h2 {
40
+ font-size:16px;
41
+ line-height:1.25;
42
+ }
43
+ .mp h1 {
44
+ font-size:20px;
45
+ line-height:2;
46
+ }
47
+
48
+ /* TEXT STYLES */
49
+
50
+ .mp {
51
+ text-align:justify;
52
+ background:#fff;
53
+ }
54
+ .mp, .mp code, .mp pre,
55
+ .mp pre code, .mp tt, .mp kbd,
56
+ .mp samp { color:#131211 }
57
+ .mp h1, .mp h2, .mp h3, .mp h4 { color:#030201 }
58
+ .mp u { text-decoration:underline; }
59
+
60
+ .mp code, .mp strong, .mp b {
61
+ font-weight:bold;
62
+ color:#131211;
63
+ }
64
+
65
+ .mp em, .mp var {
66
+ font-style:italic;
67
+ color:#232221;
68
+ text-decoration:none;
69
+ }
70
+
71
+ /* LINKS */
72
+
73
+ .mp a, .mp a:link, .mp a:hover,
74
+ .mp a code, .mp a pre, .mp a tt,
75
+ .mp a kbd, .mp a samp { color:#0000ff }
76
+
77
+ .mp b.man-ref { font-weight:normal;color:#434241 }
78
+
79
+ /* PREFORMATTED BLOCKS */
80
+
81
+ .mp pre { padding:0 4ex }
82
+ .mp pre code { font-weight:normal;color:#434241 }
83
+ .mp h2+pre, h3+pre { padding-left:0 }
84
+
85
+ /* DOCUMENT HEADER AND FOOTER AREAS */
86
+
87
+ ol.man-decor, ol.man-decor li {
88
+ margin:3px 0 10px 0;
89
+ padding:0;
90
+ float:left;
91
+ width:33%;
92
+ list-style-type:none;
93
+ text-transform:uppercase;
94
+ color:#999;
95
+ letter-spacing:1px;
96
+ }
97
+ ol.man-decor { width:100% }
98
+ ol.man-decor li.tl { text-align:left }
99
+ ol.man-decor li.tc { text-align:center; letter-spacing:4px }
100
+ ol.man-decor li.tr { text-align:right; float:right }
@@ -0,0 +1,5 @@
1
+ .mp { max-width:none }
2
+ .man-navigation { display:none !important }
3
+ .mp a[href]:not([href^="#"]):not([data-bare-link]):after {
4
+ content:" " attr(href);
5
+ }