9
9
10
10
import markdown
11
11
from markdown import postprocessors
12
+ from markdown import serializers
12
13
13
14
import xml .etree .ElementTree as etree
14
15
@@ -312,6 +313,32 @@ def _add_meta(self, element):
312
313
element .remove (e )
313
314
element .append (body )
314
315
316
+ def _tohtml (self , element ):
317
+ # Note: 以下の様に etree.tostring(method="xml") を用いると
318
+ # <span></span> や <td></td> が <span /> や <td /> になってしまう。また、
319
+ # HTML 属性の順序が保持されない。
320
+ #
321
+ # return etree.tostring(element, encoding="unicode", method="xml")
322
+
323
+ # Note: 代わりに etree.tostring(method="html") を用いると、今度は <img
324
+ # /> や <br /> が <img> や <br> になってしまい好ましくない。またこの時
325
+ # も HTML 属性の順序が保持されない。
326
+ #
327
+ # return etree.tostring(element, encoding="unicode", method="html")
328
+
329
+ # 今は代わりに以下のようにして markdown.serializers の内部変数
330
+ # markdown.serializers.RE_AMP を一時的に書き換えることによって期待する
331
+ # 動作を得ている。これは markdown.serializers の内部実装に依存している
332
+ # ので、markdown.serializers の上流で内部実装に変更があると動かなくなる
333
+ # 可能性があることに注意する。
334
+ old_RE_AMP = serializers .RE_AMP
335
+ try :
336
+ serializers .RE_AMP = re .compile (r'&' )
337
+ output = self ._markdown .serializer (element )
338
+ finally :
339
+ serializers .RE_AMP = old_RE_AMP
340
+ return output
341
+
315
342
def run (self , text ):
316
343
text = '<{tag}>{text}</{tag}>' .format (tag = self ._markdown .doc_tag , text = text )
317
344
try :
@@ -328,7 +355,7 @@ def run(self, text):
328
355
self ._iterate (root , self ._adjust_url )
329
356
self ._add_meta (root )
330
357
331
- output = self ._markdown . serializer (root )
358
+ output = self ._tohtml (root )
332
359
if self ._markdown .stripTopLevelTags :
333
360
try :
334
361
start = output .index ('<%s>' % self ._markdown .doc_tag ) + len (self ._markdown .doc_tag ) + 2
0 commit comments