diff --git a/html_attribute.py b/html_attribute.py index 43f172a..850ab44 100644 --- a/html_attribute.py +++ b/html_attribute.py @@ -9,6 +9,7 @@ import markdown from markdown import postprocessors +from markdown import serializers import xml.etree.ElementTree as etree @@ -312,6 +313,32 @@ def _add_meta(self, element): element.remove(e) element.append(body) + def _tohtml(self, element): + # Note: 以下の様に etree.tostring(method="xml") を用いると + # や が や になってしまう。また、 + # HTML 属性の順序が保持されない。 + # + # return etree.tostring(element, encoding="unicode", method="xml") + + # Note: 代わりに etree.tostring(method="html") を用いると、今度は

になってしまい好ましくない。またこの時 + # も HTML 属性の順序が保持されない。 + # + # return etree.tostring(element, encoding="unicode", method="html") + + # 今は代わりに以下のようにして markdown.serializers の内部変数 + # markdown.serializers.RE_AMP を一時的に書き換えることによって期待する + # 動作を得ている。これは markdown.serializers の内部実装に依存している + # ので、markdown.serializers の上流で内部実装に変更があると動かなくなる + # 可能性があることに注意する。 + old_RE_AMP = serializers.RE_AMP + try: + serializers.RE_AMP = re.compile(r'&') + output = self._markdown.serializer(element) + finally: + serializers.RE_AMP = old_RE_AMP + return output + def run(self, text): text = '<{tag}>{text}'.format(tag=self._markdown.doc_tag, text=text) try: @@ -328,7 +355,7 @@ def run(self, text): self._iterate(root, self._adjust_url) self._add_meta(root) - output = self._markdown.serializer(root) + output = self._tohtml(root) if self._markdown.stripTopLevelTags: try: start = output.index('<%s>' % self._markdown.doc_tag) + len(self._markdown.doc_tag) + 2