diff options
Diffstat (limited to 'clarkzjw.cc/config/bia/ansible/roles/cgit/templates/filters/md2html.py')
-rw-r--r-- | clarkzjw.cc/config/bia/ansible/roles/cgit/templates/filters/md2html.py | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/clarkzjw.cc/config/bia/ansible/roles/cgit/templates/filters/md2html.py b/clarkzjw.cc/config/bia/ansible/roles/cgit/templates/filters/md2html.py new file mode 100644 index 0000000..4421bdd --- /dev/null +++ b/clarkzjw.cc/config/bia/ansible/roles/cgit/templates/filters/md2html.py | |||
@@ -0,0 +1,309 @@ | |||
1 | #!/opt/cgit/bin/python3.9 | ||
2 | |||
3 | import markdown | ||
4 | import sys | ||
5 | import io | ||
6 | from pygments.formatters import HtmlFormatter | ||
7 | from markdown.extensions.toc import TocExtension | ||
8 | |||
9 | sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8') | ||
10 | sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') | ||
11 | sys.stdout.write(''' | ||
12 | <style> | ||
13 | .markdown-body { | ||
14 | font-size: 14px; | ||
15 | line-height: 1.6; | ||
16 | overflow: hidden; | ||
17 | } | ||
18 | .markdown-body>*:first-child { | ||
19 | margin-top: 0 !important; | ||
20 | } | ||
21 | .markdown-body>*:last-child { | ||
22 | margin-bottom: 0 !important; | ||
23 | } | ||
24 | .markdown-body a.absent { | ||
25 | color: #c00; | ||
26 | } | ||
27 | .markdown-body a.anchor { | ||
28 | display: block; | ||
29 | padding-left: 30px; | ||
30 | margin-left: -30px; | ||
31 | cursor: pointer; | ||
32 | position: absolute; | ||
33 | top: 0; | ||
34 | left: 0; | ||
35 | bottom: 0; | ||
36 | } | ||
37 | .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { | ||
38 | margin: 20px 0 10px; | ||
39 | padding: 0; | ||
40 | font-weight: bold; | ||
41 | -webkit-font-smoothing: antialiased; | ||
42 | cursor: text; | ||
43 | position: relative; | ||
44 | } | ||
45 | .markdown-body h1 .mini-icon-link, .markdown-body h2 .mini-icon-link, .markdown-body h3 .mini-icon-link, .markdown-body h4 .mini-icon-link, .markdown-body h5 .mini-icon-link, .markdown-body h6 .mini-icon-link { | ||
46 | display: none; | ||
47 | color: #000; | ||
48 | } | ||
49 | .markdown-body h1:hover a.anchor, .markdown-body h2:hover a.anchor, .markdown-body h3:hover a.anchor, .markdown-body h4:hover a.anchor, .markdown-body h5:hover a.anchor, .markdown-body h6:hover a.anchor { | ||
50 | text-decoration: none; | ||
51 | line-height: 1; | ||
52 | padding-left: 0; | ||
53 | margin-left: -22px; | ||
54 | top: 15%; | ||
55 | } | ||
56 | .markdown-body h1:hover a.anchor .mini-icon-link, .markdown-body h2:hover a.anchor .mini-icon-link, .markdown-body h3:hover a.anchor .mini-icon-link, .markdown-body h4:hover a.anchor .mini-icon-link, .markdown-body h5:hover a.anchor .mini-icon-link, .markdown-body h6:hover a.anchor .mini-icon-link { | ||
57 | display: inline-block; | ||
58 | } | ||
59 | div#cgit .markdown-body h1 a.toclink, div#cgit .markdown-body h2 a.toclink, div#cgit .markdown-body h3 a.toclink, div#cgit .markdown-body h4 a.toclink, div#cgit .markdown-body h5 a.toclink, div#cgit .markdown-body h6 a.toclink { | ||
60 | color: black; | ||
61 | } | ||
62 | .markdown-body h1 tt, .markdown-body h1 code, .markdown-body h2 tt, .markdown-body h2 code, .markdown-body h3 tt, .markdown-body h3 code, .markdown-body h4 tt, .markdown-body h4 code, .markdown-body h5 tt, .markdown-body h5 code, .markdown-body h6 tt, .markdown-body h6 code { | ||
63 | font-size: inherit; | ||
64 | } | ||
65 | .markdown-body h1 { | ||
66 | font-size: 28px; | ||
67 | color: #000; | ||
68 | } | ||
69 | .markdown-body h2 { | ||
70 | font-size: 24px; | ||
71 | border-bottom: 1px solid #ccc; | ||
72 | color: #000; | ||
73 | } | ||
74 | .markdown-body h3 { | ||
75 | font-size: 18px; | ||
76 | } | ||
77 | .markdown-body h4 { | ||
78 | font-size: 16px; | ||
79 | } | ||
80 | .markdown-body h5 { | ||
81 | font-size: 14px; | ||
82 | } | ||
83 | .markdown-body h6 { | ||
84 | color: #777; | ||
85 | font-size: 14px; | ||
86 | } | ||
87 | .markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { | ||
88 | margin: 15px 0; | ||
89 | } | ||
90 | .markdown-body hr { | ||
91 | background: transparent url("/dirty-shade.png") repeat-x 0 0; | ||
92 | border: 0 none; | ||
93 | color: #ccc; | ||
94 | height: 4px; | ||
95 | padding: 0; | ||
96 | } | ||
97 | .markdown-body>h2:first-child, .markdown-body>h1:first-child, .markdown-body>h1:first-child+h2, .markdown-body>h3:first-child, .markdown-body>h4:first-child, .markdown-body>h5:first-child, .markdown-body>h6:first-child { | ||
98 | margin-top: 0; | ||
99 | padding-top: 0; | ||
100 | } | ||
101 | .markdown-body a:first-child h1, .markdown-body a:first-child h2, .markdown-body a:first-child h3, .markdown-body a:first-child h4, .markdown-body a:first-child h5, .markdown-body a:first-child h6 { | ||
102 | margin-top: 0; | ||
103 | padding-top: 0; | ||
104 | } | ||
105 | .markdown-body h1+p, .markdown-body h2+p, .markdown-body h3+p, .markdown-body h4+p, .markdown-body h5+p, .markdown-body h6+p { | ||
106 | margin-top: 0; | ||
107 | } | ||
108 | .markdown-body li p.first { | ||
109 | display: inline-block; | ||
110 | } | ||
111 | .markdown-body ul, .markdown-body ol { | ||
112 | padding-left: 30px; | ||
113 | } | ||
114 | .markdown-body ul.no-list, .markdown-body ol.no-list { | ||
115 | list-style-type: none; | ||
116 | padding: 0; | ||
117 | } | ||
118 | .markdown-body ul li>:first-child, .markdown-body ul li ul:first-of-type, .markdown-body ul li ol:first-of-type, .markdown-body ol li>:first-child, .markdown-body ol li ul:first-of-type, .markdown-body ol li ol:first-of-type { | ||
119 | margin-top: 0px; | ||
120 | } | ||
121 | .markdown-body ul li p:last-of-type, .markdown-body ol li p:last-of-type { | ||
122 | margin-bottom: 0; | ||
123 | } | ||
124 | .markdown-body ul ul, .markdown-body ul ol, .markdown-body ol ol, .markdown-body ol ul { | ||
125 | margin-bottom: 0; | ||
126 | } | ||
127 | .markdown-body dl { | ||
128 | padding: 0; | ||
129 | } | ||
130 | .markdown-body dl dt { | ||
131 | font-size: 14px; | ||
132 | font-weight: bold; | ||
133 | font-style: italic; | ||
134 | padding: 0; | ||
135 | margin: 15px 0 5px; | ||
136 | } | ||
137 | .markdown-body dl dt:first-child { | ||
138 | padding: 0; | ||
139 | } | ||
140 | .markdown-body dl dt>:first-child { | ||
141 | margin-top: 0px; | ||
142 | } | ||
143 | .markdown-body dl dt>:last-child { | ||
144 | margin-bottom: 0px; | ||
145 | } | ||
146 | .markdown-body dl dd { | ||
147 | margin: 0 0 15px; | ||
148 | padding: 0 15px; | ||
149 | } | ||
150 | .markdown-body dl dd>:first-child { | ||
151 | margin-top: 0px; | ||
152 | } | ||
153 | .markdown-body dl dd>:last-child { | ||
154 | margin-bottom: 0px; | ||
155 | } | ||
156 | .markdown-body blockquote { | ||
157 | border-left: 4px solid #DDD; | ||
158 | padding: 0 15px; | ||
159 | color: #777; | ||
160 | } | ||
161 | .markdown-body blockquote>:first-child { | ||
162 | margin-top: 0px; | ||
163 | } | ||
164 | .markdown-body blockquote>:last-child { | ||
165 | margin-bottom: 0px; | ||
166 | } | ||
167 | .markdown-body table th { | ||
168 | font-weight: bold; | ||
169 | } | ||
170 | .markdown-body table th, .markdown-body table td { | ||
171 | border: 1px solid #ccc; | ||
172 | padding: 6px 13px; | ||
173 | } | ||
174 | .markdown-body table tr { | ||
175 | border-top: 1px solid #ccc; | ||
176 | background-color: #fff; | ||
177 | } | ||
178 | .markdown-body table tr:nth-child(2n) { | ||
179 | background-color: #f8f8f8; | ||
180 | } | ||
181 | .markdown-body img { | ||
182 | max-width: 100%; | ||
183 | -moz-box-sizing: border-box; | ||
184 | box-sizing: border-box; | ||
185 | } | ||
186 | .markdown-body span.frame { | ||
187 | display: block; | ||
188 | overflow: hidden; | ||
189 | } | ||
190 | .markdown-body span.frame>span { | ||
191 | border: 1px solid #ddd; | ||
192 | display: block; | ||
193 | float: left; | ||
194 | overflow: hidden; | ||
195 | margin: 13px 0 0; | ||
196 | padding: 7px; | ||
197 | width: auto; | ||
198 | } | ||
199 | .markdown-body span.frame span img { | ||
200 | display: block; | ||
201 | float: left; | ||
202 | } | ||
203 | .markdown-body span.frame span span { | ||
204 | clear: both; | ||
205 | color: #333; | ||
206 | display: block; | ||
207 | padding: 5px 0 0; | ||
208 | } | ||
209 | .markdown-body span.align-center { | ||
210 | display: block; | ||
211 | overflow: hidden; | ||
212 | clear: both; | ||
213 | } | ||
214 | .markdown-body span.align-center>span { | ||
215 | display: block; | ||
216 | overflow: hidden; | ||
217 | margin: 13px auto 0; | ||
218 | text-align: center; | ||
219 | } | ||
220 | .markdown-body span.align-center span img { | ||
221 | margin: 0 auto; | ||
222 | text-align: center; | ||
223 | } | ||
224 | .markdown-body span.align-right { | ||
225 | display: block; | ||
226 | overflow: hidden; | ||
227 | clear: both; | ||
228 | } | ||
229 | .markdown-body span.align-right>span { | ||
230 | display: block; | ||
231 | overflow: hidden; | ||
232 | margin: 13px 0 0; | ||
233 | text-align: right; | ||
234 | } | ||
235 | .markdown-body span.align-right span img { | ||
236 | margin: 0; | ||
237 | text-align: right; | ||
238 | } | ||
239 | .markdown-body span.float-left { | ||
240 | display: block; | ||
241 | margin-right: 13px; | ||
242 | overflow: hidden; | ||
243 | float: left; | ||
244 | } | ||
245 | .markdown-body span.float-left span { | ||
246 | margin: 13px 0 0; | ||
247 | } | ||
248 | .markdown-body span.float-right { | ||
249 | display: block; | ||
250 | margin-left: 13px; | ||
251 | overflow: hidden; | ||
252 | float: right; | ||
253 | } | ||
254 | .markdown-body span.float-right>span { | ||
255 | display: block; | ||
256 | overflow: hidden; | ||
257 | margin: 13px auto 0; | ||
258 | text-align: right; | ||
259 | } | ||
260 | .markdown-body code, .markdown-body tt { | ||
261 | margin: 0 2px; | ||
262 | padding: 0px 5px; | ||
263 | border: 1px solid #eaeaea; | ||
264 | background-color: #f8f8f8; | ||
265 | border-radius: 3px; | ||
266 | } | ||
267 | .markdown-body code { | ||
268 | white-space: nowrap; | ||
269 | } | ||
270 | .markdown-body pre>code { | ||
271 | margin: 0; | ||
272 | padding: 0; | ||
273 | white-space: pre; | ||
274 | border: none; | ||
275 | background: transparent; | ||
276 | } | ||
277 | .markdown-body .highlight pre, .markdown-body pre { | ||
278 | background-color: #f8f8f8; | ||
279 | border: 1px solid #ccc; | ||
280 | font-size: 13px; | ||
281 | line-height: 19px; | ||
282 | overflow: auto; | ||
283 | padding: 6px 10px; | ||
284 | border-radius: 3px; | ||
285 | } | ||
286 | .markdown-body pre code, .markdown-body pre tt { | ||
287 | margin: 0; | ||
288 | padding: 0; | ||
289 | background-color: transparent; | ||
290 | border: none; | ||
291 | } | ||
292 | ''') | ||
293 | sys.stdout.write(HtmlFormatter(style='solarized-light').get_style_defs('.highlight')) | ||
294 | sys.stdout.write(''' | ||
295 | </style> | ||
296 | ''') | ||
297 | sys.stdout.write("<div class='markdown-body'>") | ||
298 | sys.stdout.flush() | ||
299 | # Note: you may want to run this through bleach for sanitization | ||
300 | markdown.markdownFromFile( | ||
301 | output_format="html5", | ||
302 | extensions=[ | ||
303 | "markdown.extensions.fenced_code", | ||
304 | "markdown.extensions.codehilite", | ||
305 | "markdown.extensions.tables", | ||
306 | TocExtension(anchorlink=True)], | ||
307 | extension_configs={ | ||
308 | "markdown.extensions.codehilite":{"css_class":"highlight"}}) | ||
309 | sys.stdout.write("</div>") | ||