Skip to content

Commit 07b8fc6

Browse files
Merge pull request #7 from akinomyoga/html_attribute-fix-serialize
html_attribute: HTMLエンティティーが破壊される問題を修正
2 parents 46c8876 + 66b84e4 commit 07b8fc6

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

html_attribute.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import markdown
1111
from markdown import postprocessors
12+
from markdown import serializers
1213

1314
import xml.etree.ElementTree as etree
1415

@@ -312,6 +313,32 @@ def _add_meta(self, element):
312313
element.remove(e)
313314
element.append(body)
314315

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+
315342
def run(self, text):
316343
text = '<{tag}>{text}</{tag}>'.format(tag=self._markdown.doc_tag, text=text)
317344
try:
@@ -328,7 +355,7 @@ def run(self, text):
328355
self._iterate(root, self._adjust_url)
329356
self._add_meta(root)
330357

331-
output = self._markdown.serializer(root)
358+
output = self._tohtml(root)
332359
if self._markdown.stripTopLevelTags:
333360
try:
334361
start = output.index('<%s>' % self._markdown.doc_tag) + len(self._markdown.doc_tag) + 2

0 commit comments

Comments
 (0)