1
0
Fork 0

Added more HTML tags

This commit is contained in:
Casey 2022-10-11 09:00:37 +03:00
parent 6bff6fd73e
commit dd60de5067
Signed by: hkc
GPG Key ID: F0F6CFE11CDB0960
1 changed files with 107 additions and 18 deletions

View File

@ -1,4 +1,5 @@
from html import escape from html import escape
from typing import Callable, Dict
from bs4.element import Tag, PageElement from bs4.element import Tag, PageElement
@ -16,31 +17,119 @@ def md_escape(text: str) -> str:
def node_to_html(el: PageElement) -> str: def node_to_html(el: PageElement) -> str:
TAG_TRANSFORMS: Dict[str, Callable[[Tag,], str]] = {
"a": lambda tag: '<a href="{}">{}</a>'.format(
escape(tag.attrs["href"]),
str.join("", map(node_to_html, tag.children)),
),
"p": lambda tag: (
str.join("", map(node_to_html, tag.children)) + "\n\n"
),
"i": lambda tag: (
"<i>%s</i>" % str.join("", map(node_to_html, tag.children))
),
"b": lambda tag: (
"<b>%s</b>" % str.join("", map(node_to_html, tag.children))
),
"s": lambda tag: (
"<s>%s</s>" % str.join("", map(node_to_html, tag.children))
),
"u": lambda tag: (
"<u>%s</u>" % str.join("", map(node_to_html, tag.children))
),
"pre": lambda tag: (
"\n<pre>%s</pre>\n" % str.join("", map(node_to_html, tag.children))
),
"code": lambda tag: (
"<code>%s</code>" % str.join("", map(node_to_html, tag.children))
),
"blockquote": lambda tag: "\n%s"
% str.join(
"\n",
(
"| %s" % part
for part in str.join(
"", map(node_to_html, tag.children)
).split("\n")
),
),
"br": lambda _: "\n",
}
TAG_SUBSTITUTIONS: Dict[str, str] = {
"strong": "b",
"em": "i",
"del": "s",
"ins": "u",
}
if isinstance(el, Tag): if isinstance(el, Tag):
if el.name == "a": if el.name in TAG_TRANSFORMS:
return '<a href="{}">{}</a>'.format( return TAG_TRANSFORMS[el.name](el)
escape(el.attrs["href"]), if el.name in TAG_SUBSTITUTIONS:
str.join("", map(node_to_html, el.children)), sub = TAG_SUBSTITUTIONS[el.name]
) if sub in TAG_TRANSFORMS:
elif el.name == "p": return TAG_TRANSFORMS[sub](el)
return str.join("", map(node_to_html, el.children)) + "\n\n"
elif el.name == "br":
return "\n"
return str.join("", map(node_to_html, el.children)) return str.join("", map(node_to_html, el.children))
return escape(str(el)) return escape(str(el))
def node_to_markdown(el: PageElement) -> str: def node_to_markdown(el: PageElement) -> str:
if isinstance(el, Tag): TAG_TRANSFORMS: Dict[str, Callable[[Tag,], str]] = {
if el.name == "a": "a": lambda tag: "[{}]({})".format(
return "[%s](%s)" % ( md_escape(str.join("", map(node_to_markdown, tag.children))),
md_escape(str.join("", map(node_to_markdown, el.children))), tag.attrs["href"],
el.attrs["href"], ),
"p": lambda tag: (
str.join("", map(node_to_markdown, tag.children)) + "\n\n"
),
"i": lambda tag: (
"_%s_" % str.join("", map(node_to_markdown, tag.children))
),
"b": lambda tag: (
"*%s*" % str.join("", map(node_to_markdown, tag.children))
),
"s": lambda tag: (
"~%s~" % str.join("", map(node_to_markdown, tag.children))
),
"u": lambda tag: (
"__%s__" % str.join("", map(node_to_markdown, tag.children))
),
"pre": lambda tag: (
"\n``%s``\n" % str.join("", map(node_to_markdown, tag.children))
),
"code": lambda tag: (
"`%s`" % str.join("", map(node_to_markdown, tag.children))
),
"blockquote": lambda tag: (
"\n%s"
% str.join(
"\n",
(
"%s" % part
for part in str.join(
"", map(node_to_markdown, tag.children)
).split("\n")
),
) )
elif el.name == "p": ),
return str.join("", map(node_to_markdown, el.children)) + "\n\n" "br": lambda _: "\n",
elif el.name == "br": }
return "\n"
TAG_SUBSTITUTIONS: Dict[str, str] = {
"strong": "b",
"em": "i",
"del": "s",
"ins": "u",
}
if isinstance(el, Tag):
if el.name in TAG_TRANSFORMS:
return TAG_TRANSFORMS[el.name](el)
if el.name in TAG_SUBSTITUTIONS:
sub = TAG_SUBSTITUTIONS[el.name]
if sub in TAG_TRANSFORMS:
return TAG_TRANSFORMS[sub](el)
return str.join("", map(node_to_markdown, el.children)) return str.join("", map(node_to_markdown, el.children))
return md_escape(str(el)) return md_escape(str(el))