perf analysis: customize float precision in reports
[nit.git] / lib / markdown / man.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # Simple *groff* decorator restricted for manpages.
16 module man
17
18 import markdown
19
20 # `Decorator` that outputs markdown.
21 class ManDecorator
22 super Decorator
23
24 redef fun add_ruler(v, block) do v.add "***\n"
25
26 redef fun add_headline(v, block) do
27 var lvl = block.depth
28 if lvl == 1 then
29 v.add ".SH "
30 else if lvl == 2 then
31 v.add ".SS "
32 else if lvl >= 3 then
33 # We use dictionary (titled paragraph) to simulate a 3rd level (or more)
34 v.add ".TP\n"
35 end
36 v.emit_in block
37 v.addn
38 end
39
40 redef fun add_paragraph(v, block) do
41 if not in_unorderedlist and not in_orderedlist then
42 v.addn
43 v.emit_in block
44 v.addn
45 else
46 v.emit_in block
47 end
48 end
49
50 redef fun add_code(v, block) do
51 v.add ".RS\n.nf\n\\f[C]\n"
52 v.emit_in block
53 v.addn
54 v.add "\\f[]\n.fi\n.RE\n"
55 end
56
57 redef fun add_blockquote(v, block) do
58 v.add ".RS\n"
59 v.emit_in block
60 v.add ".RE\n"
61 end
62
63 redef fun add_unorderedlist(v, block) do
64 v.add ".RS\n"
65 in_unorderedlist = true
66 v.emit_in block
67 in_unorderedlist = false
68 v.add ".RE\n"
69 end
70 private var in_unorderedlist = false
71
72 redef fun add_orderedlist(v, block) do
73 v.add ".RS\n"
74 in_orderedlist = true
75 current_li = 0
76 v.emit_in block
77 in_orderedlist = false
78 v.add ".RE\n"
79 end
80 private var in_orderedlist = false
81 private var current_li = 0
82
83 redef fun add_listitem(v, block) do
84 if in_unorderedlist then
85 v.add ".IP \\[bu] 3\n"
86 else if in_orderedlist then
87 current_li += 1
88 v.add ".IP \"{current_li}.\" 3\n"
89 end
90 v.emit_in block
91 v.addn
92 end
93
94 redef fun add_em(v, text) do
95 v.add "\\f[I]"
96 v.add text
97 v.add "\\f[]"
98 end
99
100 redef fun add_strong(v, text) do
101 v.add "\\f[B]"
102 v.add text
103 v.add "\\f[]"
104 end
105
106 redef fun add_strike(v, text) do
107 v.add "[STRIKEOUT:"
108 v.add text
109 v.add "]"
110 end
111
112 redef fun add_image(v, link, name, comment) do
113 v.add name
114 v.add " ("
115 append_value(v, link)
116 if comment != null and not comment.is_empty then
117 v.add " "
118 append_value(v, comment)
119 end
120 v.add ")"
121 end
122
123 redef fun add_link(v, link, name, comment) do
124 v.add name
125 v.add " ("
126 append_value(v, link)
127 if comment != null and not comment.is_empty then
128 v.add " "
129 append_value(v, comment)
130 end
131 v.add ")"
132 end
133
134 redef fun add_abbr(v, name, comment) do
135 v.add "\">"
136 v.emit_text(name)
137 v.add " ("
138 append_value(v, comment)
139 v.add ")"
140 end
141
142 redef fun add_span_code(v, text, from, to) do
143 v.add "\\f[C]"
144 append_code(v, text, from, to)
145 v.add "\\f[]"
146 end
147
148 redef fun add_line_break(v) do
149 v.addn
150 end
151
152 redef fun append_value(v, text) do for c in text do escape_char(v, c)
153
154 redef fun add_char(v, c) do
155 # Escape - because manpages
156 if c == '-' then
157 v.addc '\\'
158 end
159 v.addc(c)
160 end
161
162 redef fun escape_char(v, c) do add_char(v, c)
163
164 redef fun append_code(v, buffer, from, to) do
165 for i in [from..to[ do
166 var c = buffer[i]
167 if c == '-' or c == ' ' then
168 v.addc '\\'
169 end
170 v.addc c
171 end
172 end
173 end