1.4.2隐藏文本进行中

This commit is contained in:
跨越晨昏 2024-10-04 18:45:48 +08:00
parent 241aedbdee
commit ddbe9a02ae
2 changed files with 92 additions and 61 deletions

View File

@ -1,8 +1,10 @@
import xml
import emoji import emoji
from markdown.extensions import Extension from markdown.extensions import Extension
from markdown.treeprocessors import Treeprocessor from markdown.treeprocessors import Treeprocessor
from markdown.inlinepatterns import Pattern from markdown.inlinepatterns import Pattern as Pattern_
from markdown.preprocessors import Preprocessor from markdown.preprocessors import Preprocessor
from markdown.inlinepatterns import InlineProcessor
from markdown import Markdown from markdown import Markdown
from typing import * from typing import *
import re import re
@ -35,62 +37,92 @@ except ModuleNotFoundError:
EXTRA_ABLE = False EXTRA_ABLE = False
class Style(Preprocessor): class BasicSimple(InlineProcessor):
"""
可通过简单的正则表达式和HTML标签实现的样式
"""
def __init__(self, pattern: str, tag: str):
"""
初始化
:param pattern: 正则表达式
:param tag: html标签
"""
super().__init__(pattern)
self.tag = tag
def handleMatch(self, match, match_line):
tag = xml.etree.ElementTree.Element(self.tag) # 创建标签
tag.text = match.group(1) # 获取匹配到的文本并设置为标签的内容
return tag, match.start(), match.end()
class BasicDifficult(InlineProcessor):
"""
不能通过简单的正则表达式和HTML标签实现的样式
"""
def __init__(self, pattern: str, outer_tag: str, inner_tag: str):
"""
初始化
:param pattern: 正则表达式
:param outer_tag: 外层html标签
:param inner_tag: 内层html标签
"""
super().__init__(pattern)
self.outer_tag = outer_tag
self.inner_tag = inner_tag
def handleMatch(self, match, match_line):
outer_tag = xml.etree.ElementTree.Element(self.outer_tag) # 创建外层标签
inner_tag = xml.etree.ElementTree.SubElement(outer_tag, self.inner_tag) # 创建内层标签
outer_tag.text = match.group(1) # 设置外层标签文本
inner_tag.text = match.group(2) # 设置内层标签文本
return outer_tag, match.start(), match.end()
class BasicPro(InlineProcessor):
"""
不能通过简单的正则表达式和HTML标签实现的样式
"""
def __init__(self, pattern: str, tag: str, key: str, value: str):
"""
初始化
:param pattern: 正则表达式
:param tag: html标签
:param key: html标签属性
:param value: html标签属性的值
"""
super().__init__(pattern)
self.tag = tag
self.key = key
self.value = value
def handleMatch(self, match, match_line):
outer_tag = xml.etree.ElementTree.Element(self.outer_tag) # 创建外层标签
inner_tag = xml.etree.ElementTree.SubElement(outer_tag, self.inner_tag) # 创建内层标签
outer_tag.text = match.group(1) # 设置外层标签文本
inner_tag.text = match.group(2) # 设置内层标签文本
return outer_tag, match.start(), match.end()
class Basic(Extension):
""" """
渲染字体样式 渲染字体样式
""" """
@staticmethod def extendMarkdown(self, md):
def underline(text): md.registerExtension(self) # 注册扩展
""" md.inlinePatterns.register(BasicSimple(r'~~(.*?)~~', tag='s'), 'strikethrough', 0) # ~~删除线~~
~下划线~ md.inlinePatterns.register(BasicSimple(r'~(.*?)~', tag='u'), 'underline', 0) # ~下划线~
:return: text md.inlinePatterns.register(BasicSimple(r'==(.*?)==', tag='mark'), 'high_light', 0) # ==高亮==
""" md.inlinePatterns.register(BasicDifficult(
return re.sub(r'~([^~\n]+)~', r'<u>\1</u>', text) r'\[(.*?)]\^\((.*?)\)', outer_tag='ruby', inner_tag='rt'), 'up', 0
) # [在文本的正上方添加一行小文本]^(主要用于标拼音)
@staticmethod md.inlinePatterns.register(BasicDifficult(
def strikethrough(text): r'\[(.*?)]-\((.*?)\)', outer_tag='ruby', inner_tag='rt'), 'hide', 0
""" ) # [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本)
~~删除线~~
:return: text
"""
return re.sub(r'~~([^~\n]+)~~', r'<s>\1</s>', text)
@staticmethod
def highlight(text):
"""
==高亮==
:return: text
"""
return re.sub(r'==([^=\n]+)==', r'<mark>\1</mark>', text)
@staticmethod
def up(text):
"""
[在文本的正上方添加一行小文本]^(主要用于标拼音)
:return: text
"""
return re.sub(r'\[(.*?)]\^\((.*?)\)', r'<ruby>\1<rt>\2</rt></ruby>', text)
@staticmethod
def hide(text):
"""
[在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本)
:return: text
"""
return re.sub(r'\[(.*?)]-\((.*?)\)', r'<span title="\2">\1</span>', text)
def run(self, lines: List[str]) -> List[str]:
new_line = []
for line in lines:
line = re.sub(r'~~([^~\n]+)~~', r'<s>\1</s>', line) # ~~删除线~~
line = re.sub(r'~([^~\n]+)~', r'<u>\1</u>', line) # ~下划线~
line = re.sub(r'==([^=\n]+)==', r'<mark>\1</mark>', line) # ==高亮==
line = re.sub(r'\[(.*?)]\^\((.*?)\)', r'<ruby>\1<rt>\2</rt></ruby>', line) # [在文本的正上方添加一行小文本]^(主要用于标拼音)
line = re.sub(r'\[(.*?)]-\((.*?)\)', r'<span title="\2">\1</span>', line) # [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本)
line = emoji.emojize(line) # 渲染Emoji
new_line.append(line)
return new_line
class Syllabus(Preprocessor): class Syllabus(Preprocessor):
@ -146,14 +178,13 @@ class Tag(Treeprocessor):
pass # 是普通的无序列表 pass # 是普通的无序列表
class Basic(Extension): class Basic_(Extension):
""" """
基本扩展 基本扩展
""" """
def extendMarkdown(self, md): def extendMarkdown(self, md):
md.registerExtension(self) # 注册扩展 md.registerExtension(self) # 注册扩展
md.preprocessors.register(Style(md), 'style', 0)
md.preprocessors.register(Syllabus(md), 'syllabus', 0) md.preprocessors.register(Syllabus(md), 'syllabus', 0)
@ -176,5 +207,5 @@ class Decorate(Extension):
def main(text: str) -> Tuple[str, Dict[str, List[str]]]: def main(text: str) -> Tuple[str, Dict[str, List[str]]]:
md = Markdown(extensions=[Basic(), More()] + list(Extensions.values()) + [Decorate()], safe_mode=False) md = Markdown(extensions=[Basic(), Basic_(), More()] + list(Extensions.values()) + [Decorate()], safe_mode=False)
return md.convert(text), md.Meta return md.convert(text), md.Meta

View File

@ -55,7 +55,7 @@
<li><a href="#1.2.5">1.2.5 删除线</a></li> <li><a href="#1.2.5">1.2.5 删除线</a></li>
<li><a href="#1.2.6">1.2.6 高亮</a></li> <li><a href="#1.2.6">1.2.6 高亮</a></li>
<li><a href="#1.2.7">1.2.7 在文本的正上方添加一行小文本主要用于标拼音</a></li> <li><a href="#1.2.7">1.2.7 在文本的正上方添加一行小文本主要用于标拼音</a></li>
<li><a href="#1.2.8">1.2.8 在指定的文本里面隐藏一段文本</a></li> <li><a href="#1.2.8">1.2.8 [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本)</a></li>
<li><a href="#1.2.9">1.2.9 分割线</a></li> <li><a href="#1.2.9">1.2.9 分割线</a></li>
</ul> </ul>
</li> </li>
@ -132,7 +132,7 @@
<h3 id="1.2.5">1.2.5 <s>删除线</s></h3> <h3 id="1.2.5">1.2.5 <s>删除线</s></h3>
<h3 id="1.2.6">1.2.6 <mark>高亮</mark></h3> <h3 id="1.2.6">1.2.6 <mark>高亮</mark></h3>
<h3 id="1.2.7">1.2.7 <ruby>在文本的正上方添加一行小文本<rt>主要用于标拼音</rt></ruby></h3> <h3 id="1.2.7">1.2.7 <ruby>在文本的正上方添加一行小文本<rt>主要用于标拼音</rt></ruby></h3>
<h3 id="1.2.8">1.2.8 <span title="只有鼠标放在上面才会显示隐藏文本">在指定的文本里面隐藏一段文本</span></h3> <h3 id="1.2.8">1.2.8 [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本)</h3>
<h3 id="1.2.9">1.2.9 分割线</h3> <h3 id="1.2.9">1.2.9 分割线</h3>
<hr /> <hr />
<hr /> <hr />
@ -207,7 +207,7 @@
</blockquote> </blockquote>
</blockquote> </blockquote>
</blockquote> </blockquote>
<p>引文内添加<em>斜体</em><strong>粗体</strong><u>下划线</u><s>删除线</s><mark>高亮</mark></p> <p>引文内添加<em>斜体</em><strong>粗体</strong>~下划线<s>~删除线</s><mark>高亮</mark></p>
</blockquote> </blockquote>
<h1 id="6">6 提纲</h1> <h1 id="6">6 提纲</h1>
<h2 id="6.1">6.1 提纲号</h2> <h2 id="6.1">6.1 提纲号</h2>
@ -272,8 +272,8 @@
<p class="admonition-title">这是一条警告</p> <p class="admonition-title">这是一条警告</p>
</div> </div>
<h1 id="11">11 Emoji</h1> <h1 id="11">11 Emoji</h1>
<p>🚴</p> <p>:person_biking:</p>
<p>😃</p> <p>:grinning_face_with_big_eyes:</p>
<h1 id="12">12 扩展语法</h1> <h1 id="12">12 扩展语法</h1>
</body> </body>
</html> </html>