From 989c9accaacfeb2a93b403f32504a6da9db707b1 Mon Sep 17 00:00:00 2001 From: crossdark Date: Mon, 30 Sep 2024 17:12:54 +0800 Subject: [PATCH 01/47] =?UTF-8?q?1.0.0=E5=BC=80=E5=A7=8B=E9=87=8D=E6=9E=84?= =?UTF-8?q?,=E5=AE=9E=E7=8E=B0=E4=BA=86Style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 96 ++++++++++++++ CrossDown/CrossDown.py | 4 - CrossDown/__init__.py | 54 ++++++++ CrossDown.py => CrossDown_.py | 1 - README.html | 230 ++++++++++++---------------------- README.md | 14 ++- run.py | 32 +++++ 7 files changed, 269 insertions(+), 162 deletions(-) create mode 100644 CrossDown/Core.py delete mode 100644 CrossDown/CrossDown.py rename CrossDown.py => CrossDown_.py (99%) create mode 100644 run.py diff --git a/CrossDown/Core.py b/CrossDown/Core.py new file mode 100644 index 0000000..6af8bd2 --- /dev/null +++ b/CrossDown/Core.py @@ -0,0 +1,96 @@ +from markdown.extensions import Extension +from markdown.treeprocessors import Treeprocessor +from markdown.inlinepatterns import Pattern +from markdown.preprocessors import Preprocessor +from markdown import Markdown +from typing import * +import re + + +Extensions = { + "Extra": "markdown.extensions.extra", + "Abbreviations": "markdown.extensions.abbr", + "Attribute Lists": "markdown.extensions.attr_list", + "Definition Lists": "markdown.extensions.def_list", + "Fenced Code Blocks": "markdown.extensions.fenced_code", + "Footnotes": "markdown.extensions.footnotes", + "Tables": "markdown.extensions.tables", + # "Smart Strong": "markdown.extensions.smart_strong", + "Admonition": "markdown.extensions.admonition", + "CodeHilite": "markdown.extensions.codehilite", + # "HeaderId": "markdown.extensions.headerid", + "Meta-Data": "markdown.extensions.meta", + "New Line to Break": "markdown.extensions.nl2br", + "Sane Lists": "markdown.extensions.sane_lists", + "SmartyPants": "markdown.extensions.smarty", + "Table of Contents": "markdown.extensions.toc", + "WikiLinks": "markdown.extensions.wikilinks", +} + + +class Style(Preprocessor): + """ + 渲染字体样式 + """ + + @staticmethod + def underline(text): + """ + ~下划线~ + :return: + """ + return re.sub(r'~([^~\n]+)~', r'\1', text) + + @staticmethod + def strikethrough(text): + """ + ~~删除线~~ + :return: + """ + return re.sub(r'~~([^~\n]+)~~', r'\1', text) + + @staticmethod + def highlight(text): + """ + ==高亮== + :return: + """ + return re.sub(r'==([^=\n]+)==', r'\1', text) + + @staticmethod + def up(text): + """ + [在文本的正上方添加一行小文本]^(主要用于标拼音) + :return: + """ + return re.sub(r'\[(.*?)]\^\((.*?)\)', r'\1\2', text) + + @staticmethod + def hide(text): + """ + [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本) + :return: + """ + return re.sub(r'\[(.*?)]-\((.*?)\)', r'\1', text) + + def run(self, lines): + new_line = [] + for line in lines: + line = self.strikethrough(line) # 渲染删除线 + line = self.underline(line) # 渲染下划线 + line = self.highlight(line) # 渲染高亮 + line = self.up(line) # 渲染上部文本 + line = self.hide(line) # 渲染隐藏文本 + new_line.append(line) + return new_line + + +class Core(Extension): + def extendMarkdown(self, md): + md.registerExtension(self) # 注册扩展 + md.preprocessors.register(Style(md), 'custom_preprocessor', 0) + + +def main(text): + md = Markdown(extensions=[Core()] + list(Extensions.values())) + return md.convert(text), md.Meta diff --git a/CrossDown/CrossDown.py b/CrossDown/CrossDown.py deleted file mode 100644 index 3c8321f..0000000 --- a/CrossDown/CrossDown.py +++ /dev/null @@ -1,4 +0,0 @@ -from markdown.extensions import Extension -from markdown.treeprocessors import Treeprocessor -from markdown.inlinepatterns import Pattern -from markdown import Markdown diff --git a/CrossDown/__init__.py b/CrossDown/__init__.py index e69de29..5f80377 100644 --- a/CrossDown/__init__.py +++ b/CrossDown/__init__.py @@ -0,0 +1,54 @@ +from typing import * +from .Core import main + + +__all__ = [ + 'main', # 主函数 + 'indent', # 添加空格 + 'HEAD', # + 'BODY', # +] +__version__ = '0.11.2' +__author__ = 'CrossDark' +__email__ = 'liuhanbo333@icloud.com' +__source__ = 'https://crossdark.net/' +__license__ = """MIT""" + + +HEAD = ( + '', + '', + '', + '', + '', + '' +) + +BODY = ( + '', + '', +) + + +def indent(input_: Union[str, List, Tuple], indent_spaces: int = 4) -> str: + """ + 给字符串中的每一行前面加上缩进。 + :param input_: 原始字符串,可以包含多行。 + :param indent_spaces: 每行前面要添加的空格数,默认为4。 + :return: 带缩进的新字符串。 + """ + # 使用字符串的splitlines()方法分割原始字符串为行列表,如果是可迭代对象则直接遍历 + # 遍历行列表,给每行前面加上相应的缩进,并重新组合成字符串 + return "\n".join( + f"{' ' * indent_spaces}{line}" for line in (lambda x: x.splitlines() if isinstance(x, str) else x)(input_)) diff --git a/CrossDown.py b/CrossDown_.py similarity index 99% rename from CrossDown.py rename to CrossDown_.py index eddaf31..a161f34 100644 --- a/CrossDown.py +++ b/CrossDown_.py @@ -6,7 +6,6 @@ import markdown try: # 检测当前平台是否支持扩展语法 import CrossMore - EXTRA_ABLE = True except ModuleNotFoundError: EXTRA_ABLE = False diff --git a/README.html b/README.html index 8b77047..17a6056 100644 --- a/README.html +++ b/README.html @@ -29,10 +29,6 @@
-
-

title: "Markdown文档标题"
- author: "作者姓名"
- date: "2024-09-26"

-

CrossDown

-

自制的markdown,添加了一些自定义的语法 +

自制的markdown,添加了一些自定义的语法
效果请见README.html

-

1 基本语法

-

1.1 标题

+

1 基本语法

+

1.1 标题

一级标题

二级标题

三级标题

四级标题

五级标题
六级标题
-

1.2 样式

-

1.2.1 斜体

-

1.2.2 粗体

-

1.2.3 粗斜体

-

1.2.4 下划线

-

1.2.5 删除线

-

1.2.6 高亮

-

1.2.7 在文本的正上方添加一行小文本主要用于标拼音

-

1.2.8 在指定的文本里面隐藏一段文本

-

1.2.9 分割线

+

1.2 样式

+

1.2.1 斜体

+

1.2.2 粗体

+

1.2.3 粗斜体

+

1.2.4 下划线

+

1.2.5 删除线

+

1.2.6 高亮

+

1.2.7 在文本的正上方添加一行小文本主要用于标拼音

+

1.2.8 在指定的文本里面隐藏一段文本

+

1.2.9 分割线




-

1.3 链接

-

1.3.1 普通链接

+

1.3 链接

+

1.3.1 普通链接

链接文本

CrossDark

https://crossdark.net/

-

1.3.2 图片

+

1.3.2 图片

链接图片

sea

-

1.3.3 变量链接

+

1.3.3 变量链接

链接文本

-

2 变量

-

2.1 定义

-

2.2 赋值

-

锚点名

-

提纲的编号已经自动配置为了锚点,可直接使用2

-

2.3 添加锚点

-

-

3 代码块

-

3.1 单行

-

3.1.1 LaTex

-

\(CO_2\)

-

\(H_2O\)

-

3.1.2 函数

-

Base64 图片

-

Base64 图片

-

Base64 图片

-

3.2 多行

-

3.2.1 YAML

-


-    A:
+    

2 变量

+

2.1 定义

+

{变量名} = 值

+

2.2 赋值

+

{变量名} {锚点名}

+

提纲的编号已经自动配置为了锚点,可直接使用{2}

+

2.3 添加锚点

+

{#锚点名}

+

3 代码块

+

3.1 单行

+

3.1.1 LaTex

+

$CO_2$

+

$H_2O$

+

3.1.2 函数

+

¥y=x*2+1¥ // 不定义范围

+

¥y=x**2¥€-50,50€ // 定义了x范围

+

¥y=x**3¥€-50,50|-100,100€ // 定义了y范围

+

3.2 多行

+

3.2.1 YAML

+

A: 1. a 2. b 3. c B: - a - b - - c -

-

3.2.2 Python

-


-    print('CrossDown')
-    

-

3.2.3 Mermaid

-

+ - c

+

3.2.2 Python

+

python + print('CrossDown')

+

3.2.3 Mermaid

+

mermaid graph LR - A-->B - A-->C - B-->D - C-->D -

-

4 转义

+ A-->B + A-->C + B-->D + C-->D

+

4 转义

\

\a

*

-

5 引用

+

5 引用

一级引用

@@ -214,37 +142,37 @@

引文内添加斜体粗体下划线删除线高亮

-

6 提纲

-

6.1 提纲号

+

6 提纲

+

6.1 提纲号

以数字和点组成,通过空格与提纲名分隔,例如:

-

6.1.1 提纲号示例

+

6.1.1 提纲号示例

点不能出现在开头或结尾,例如

.6.1.2 错误示范

6.1.3. 错误示范

不能出现两个及以上连续的点,例如:

-

6..1...4 错误示范

-

提纲号会被自动配置为锚点,可直接使用66.1

-

7 注释

-

7.1 强注释

-

7.2 弱注释

-

只有在

-

// 代码中的注释弱不会被移除

-

8 列表

-

8.1 有序列表

-
    -
  1. a
  2. -
  3. b
  4. -
  5. c
  6. -
  7. d
  8. -
-

8.2 无序列表

- -

9 表格

+

6..1…4 错误示范

+

提纲号会被自动配置为锚点,可直接使用{6}{6.1}

+

7 注释

+

7.1 强注释

+

|=
+ 无论如何都会被移除
+ 放在代码块里也没用
+ =|

+

7.2 弱注释

+

只有在 // 后面才会被移除

+

// 代码中的注释弱不会被移除

+

8 列表

+

8.1 有序列表
+ 1. a
+ 2. b
+ 3. c
+ 4. d

+

8.2 无序列表
+ - A
+ - B
+ - C
+ - D

+

9 表格

@@ -266,12 +194,12 @@
-

10 警告

+

10 警告

这是一条警告

-

11 Emoji

-

🚴

-

😃

+

11 Emoji

+

:person_biking:

+

:grinning_face_with_big_eyes:

diff --git a/README.md b/README.md index 8a68aa7..7b44a1a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ -[TOC] +Title: My Document +Summary: A brief description of my document. +Authors: Waylan Limberg + John Doe +Date: October 2, 2007 +blank-value: +base_url: http://example.com ---- -title: "Markdown文档标题" -author: "作者姓名" -date: "2024-09-26" ---- +[TOC] # CrossDown 自制的markdown,添加了一些自定义的语法 diff --git a/run.py b/run.py new file mode 100644 index 0000000..51d28cb --- /dev/null +++ b/run.py @@ -0,0 +1,32 @@ +import time + +from CrossDown import * + + +if __name__ == '__main__': + # 开始计时 + start_time = time.perf_counter_ns() + # 主程序 + with open('README.md', encoding='utf-8') as test: + cd, meta = main(test.read()) + print(meta) + with open('README.html', 'w', encoding='utf-8') as html: + html.write(f""" + + + + + UTF-8编码示例 +{indent(HEAD)} + + + +{indent(BODY)} +{indent(cd, 4)} + + +""") + # 停止计时 + end_time = time.perf_counter_ns() + # 输出用时 + print("运行时间: {:.9f} 秒".format((end_time - start_time) / 1e9)) From e18dbf04accf1267bbdbe5a33e5d3759bbf97cad Mon Sep 17 00:00:00 2001 From: crossdark Date: Mon, 30 Sep 2024 18:03:40 +0800 Subject: [PATCH 02/47] =?UTF-8?q?1.0.1=E5=88=B6=E4=BD=9C=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 49 +++++++++++-- README.html | 179 +++++++++++++++++++++++++++++++++------------- README.md | 8 +++ setup.py | 7 +- 4 files changed, 182 insertions(+), 61 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 6af8bd2..7c562cd 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -6,7 +6,6 @@ from markdown import Markdown from typing import * import re - Extensions = { "Extra": "markdown.extensions.extra", "Abbreviations": "markdown.extensions.abbr", @@ -73,7 +72,7 @@ class Style(Preprocessor): """ return re.sub(r'\[(.*?)]-\((.*?)\)', r'\1', text) - def run(self, lines): + def run(self, lines: List[str]) -> List[str]: new_line = [] for line in lines: line = self.strikethrough(line) # 渲染删除线 @@ -85,12 +84,50 @@ class Style(Preprocessor): return new_line -class Core(Extension): +class Syllabus(Preprocessor): + def run(self, lines: List[str]) -> List[str]: + return [ + (lambda match, origen: + re.sub(f'^({match.groups()[0]})', # 按照提纲等级添加#和锚点 + fr'{"#" * len(match.groups()[0].split("."))} \1{{#' + match.groups()[0] + '}', origen) + if match is not None else origen) # 对于不是提纲的行,直接返回原始字符 + ((lambda x: re.match(r'^([\d.]+) ', x) # 判断是否是提纲 + if not any((x.startswith('.'), # 以.开头 + re.search('\. ', x) is not None, # 存在.+空格 + re.search('\.{2,}', x), # 存在连续的. + )) + else None)(line), line) # 排除.在提纲号开头或结尾的情况 + for line in lines # 分割并遍历文本的每一行 + ] + + +class Value(Preprocessor): + def run(self, lines: List[str]) -> List[str]: + values = { # 从text中提取所有变量并转换成字典 + key: value for key, value in [ + (lambda match: match.groups() if match is not None else ('', '')) # 未定义变量的行统一返回('', '') + (re.match(r'\{([^{}#]+)} ?= ?(.+?)(?=\n|$)', line)) for line in lines + ] + } + anchor = [ + re.match(r'\{#([^{}#]+)}', line) for line in lines + ] + print(anchor) + return lines + + +class Basic(Extension): def extendMarkdown(self, md): md.registerExtension(self) # 注册扩展 - md.preprocessors.register(Style(md), 'custom_preprocessor', 0) + md.preprocessors.register(Style(md), 'style', 0) + md.preprocessors.register(Syllabus(md), 'syllabus', 0) -def main(text): - md = Markdown(extensions=[Core()] + list(Extensions.values())) +class More(Extension): + def extendMarkdown(self, md): + md.preprocessors.register(Value(md), 'values', 0) + + +def main(text: str) -> Tuple[str, Dict[str, List[str]]]: + md = Markdown(extensions=[Basic(), More()] + list(Extensions.values())) return md.convert(text), md.Meta diff --git a/README.html b/README.html index 17a6056..58fff18 100644 --- a/README.html +++ b/README.html @@ -29,6 +29,10 @@
  • CrossDown
  • +
  • 1{#1} 基本语法 +
  • 一级标题 @@ -50,56 +118,56 @@

    CrossDown

    自制的markdown,添加了一些自定义的语法
    效果请见README.html

    -

    1 基本语法

    -

    1.1 标题

    +

    1{#1} 基本语法

    +

    1.1{#1.1} 标题

    一级标题

    二级标题

    三级标题

    四级标题

    五级标题
    六级标题
    -

    1.2 样式

    -

    1.2.1 斜体

    -

    1.2.2 粗体

    -

    1.2.3 粗斜体

    -

    1.2.4 下划线

    -

    1.2.5 删除线

    -

    1.2.6 高亮

    -

    1.2.7 在文本的正上方添加一行小文本主要用于标拼音

    -

    1.2.8 在指定的文本里面隐藏一段文本

    -

    1.2.9 分割线

    +

    1.2{#1.2} 样式

    +

    1.2.1{#1.2.1} 斜体

    +

    1.2.2{#1.2.2} 粗体

    +

    1.2.3{#1.2.3} 粗斜体

    +

    1.2.4{#1.2.4} 下划线

    +

    1.2.5{#1.2.5} 删除线

    +

    1.2.6{#1.2.6} 高亮

    +

    1.2.7{#1.2.7} 在文本的正上方添加一行小文本主要用于标拼音

    +

    1.2.8{#1.2.8} 在指定的文本里面隐藏一段文本

    +

    1.2.9{#1.2.9} 分割线




    -

    1.3 链接

    -

    1.3.1 普通链接

    +

    1.3{#1.3} 链接

    +

    1.3.1{#1.3.1} 普通链接

    链接文本

    CrossDark

    https://crossdark.net/

    -

    1.3.2 图片

    +

    1.3.2{#1.3.2} 图片

    链接图片

    sea

    -

    1.3.3 变量链接

    +

    1.3.3{#1.3.3} 变量链接

    链接文本

    -

    2 变量

    -

    2.1 定义

    +

    2{#2} 变量

    +

    2.1{#2.1} 定义

    {变量名} = 值

    -

    2.2 赋值

    +

    2.2{#2.2} 赋值

    {变量名} {锚点名}

    提纲的编号已经自动配置为了锚点,可直接使用{2}

    -

    2.3 添加锚点

    +

    2.3{#2.3} 添加锚点

    {#锚点名}

    -

    3 代码块

    -

    3.1 单行

    -

    3.1.1 LaTex

    +

    3{#3} 代码块

    +

    3.1{#3.1} 单行

    +

    3.1.1{#3.1.1} LaTex

    $CO_2$

    $H_2O$

    -

    3.1.2 函数

    +

    3.1.2{#3.1.2} 函数

    ¥y=x*2+1¥ // 不定义范围

    ¥y=x**2¥€-50,50€ // 定义了x范围

    ¥y=x**3¥€-50,50|-100,100€ // 定义了y范围

    -

    3.2 多行

    -

    3.2.1 YAML

    +

    3.2{#3.2} 多行

    +

    3.2.1{#3.2.1} YAML

    A: 1. a 2. b @@ -108,21 +176,21 @@ - a - b - c

    -

    3.2.2 Python

    +

    3.2.2{#3.2.2} Python

    python print('CrossDown')

    -

    3.2.3 Mermaid

    +

    3.2.3{#3.2.3} Mermaid

    mermaid graph LR A-->B A-->C B-->D C-->D

    -

    4 转义

    +

    4{#4} 转义

    \

    \a

    *

    -

    5 引用

    +

    5{#5} 引用

    一级引用

    @@ -142,37 +210,43 @@

    引文内添加斜体粗体下划线删除线高亮

    -

    6 提纲

    -

    6.1 提纲号

    +

    6{#6} 提纲

    +

    6.1{#6.1} 提纲号

    以数字和点组成,通过空格与提纲名分隔,例如:

    -

    6.1.1 提纲号示例

    +

    6.1.1{#6.1.1} 提纲号示例

    点不能出现在开头或结尾,例如

    .6.1.2 错误示范

    6.1.3. 错误示范

    不能出现两个及以上连续的点,例如:

    6..1…4 错误示范

    提纲号会被自动配置为锚点,可直接使用{6}{6.1}

    -

    7 注释

    -

    7.1 强注释

    +

    7{#7} 注释

    +

    7.1{#7.1} 强注释

    |=
    无论如何都会被移除
    放在代码块里也没用
    =|

    -

    7.2 弱注释

    +

    7.2{#7.2} 弱注释

    + +

    只有在 // 后面才会被移除

    // 代码中的注释弱不会被移除

    -

    8 列表

    -

    8.1 有序列表
    - 1. a
    - 2. b
    - 3. c
    - 4. d

    -

    8.2 无序列表
    - - A
    - - B
    - - C
    - - D

    -

    9 表格

    +

    8{#8} 列表

    +

    8.1{#8.1} 有序列表

    +
      +
    1. a
    2. +
    3. b
    4. +
    5. c
    6. +
    7. d
    8. +
    +

    8.2{#8.2} 无序列表

    +
      +
    • A
    • +
    • B
    • +
    • C
    • +
    • D
    • +
    +

    9{#9} 表格

    @@ -194,12 +268,17 @@
    -

    10 警告

    +

    10{#10} 警告

    这是一条警告

    -

    11 Emoji

    +

    11{#11} Emoji

    :person_biking:

    :grinning_face_with_big_eyes:

    +

    12{#12} 扩展语法

    +

    12.1{#12.1} 警告

    +
    +

    Don’t try this at home

    +
    diff --git a/README.md b/README.md index 7b44a1a..3f001ed 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,8 @@ graph LR 7.2 弱注释 + + 只有在 // 后面才会被移除 `// 代码中的注释弱不会被移除` @@ -218,3 +220,9 @@ graph LR :person_biking: :grinning_face_with_big_eyes: + +12 扩展语法 + +12.1 警告 + +!!! danger "Don't try this at home" diff --git a/setup.py b/setup.py index db7a1d8..56ce786 100644 --- a/setup.py +++ b/setup.py @@ -5,17 +5,14 @@ with open("README.md", "r") as fh: setuptools.setup( name="CrossDown", - version="0.11.2", + version="1.0.0", author="CrossDark", author_email="liuhanbo333@icloud.com", description="CrossDark's MarkDown", long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/CrossDark/CrossDown", - py_modules=[ - 'CrossDown', - 'CrossMore', - ], + packages=setuptools.find_packages(), install_requires=[ 'markdown', 'matplotlib', From b086a9eb84bf684ef7ecff27d9421a3f4d0abf10 Mon Sep 17 00:00:00 2001 From: crossdark Date: Mon, 30 Sep 2024 20:14:40 +0800 Subject: [PATCH 03/47] =?UTF-8?q?1.0.1=E4=BF=9D=E5=AD=98=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 56ce786..5cf9dec 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ with open("README.md", "r") as fh: setuptools.setup( name="CrossDown", - version="1.0.0", + version="1.0.1", author="CrossDark", author_email="liuhanbo333@icloud.com", description="CrossDark's MarkDown", From 6fbe5486a238857292f977871a81a04f0e919d36 Mon Sep 17 00:00:00 2001 From: crossdark Date: Tue, 1 Oct 2024 20:25:11 +0800 Subject: [PATCH 04/47] =?UTF-8?q?1.0.3=E6=8F=90=E7=BA=B2=E6=90=9E=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 19 ++++- CrossDown/Extra.py | 0 README.html | 190 ++++++++++++++++++++++----------------------- 3 files changed, 112 insertions(+), 97 deletions(-) create mode 100644 CrossDown/Extra.py diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 7c562cd..6683f38 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -89,7 +89,7 @@ class Syllabus(Preprocessor): return [ (lambda match, origen: re.sub(f'^({match.groups()[0]})', # 按照提纲等级添加#和锚点 - fr'{"#" * len(match.groups()[0].split("."))} \1{{#' + match.groups()[0] + '}', origen) + fr'{"#" * len(match.groups()[0].split("."))} \1', origen) if match is not None else origen) # 对于不是提纲的行,直接返回原始字符 ((lambda x: re.match(r'^([\d.]+) ', x) # 判断是否是提纲 if not any((x.startswith('.'), # 以.开头 @@ -116,6 +116,16 @@ class Value(Preprocessor): return lines +class Header(Treeprocessor): + def run(self, root): + """ + 通过修改AST来给标题添加锚点 + """ + for header in root.iter(): + if header.tag in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6'): # 查找标题 + header.set('id', header.text.split(' ')[0]) # 给标题添加锚点 + + class Basic(Extension): def extendMarkdown(self, md): md.registerExtension(self) # 注册扩展 @@ -128,6 +138,11 @@ class More(Extension): md.preprocessors.register(Value(md), 'values', 0) +class Decorate(Extension): + def extendMarkdown(self, md): + md.treeprocessors.register(Header(md), 'header', 0) + + def main(text: str) -> Tuple[str, Dict[str, List[str]]]: - md = Markdown(extensions=[Basic(), More()] + list(Extensions.values())) + md = Markdown(extensions=[Basic(), More()] + list(Extensions.values()) + [Decorate()]) return md.convert(text), md.Meta diff --git a/CrossDown/Extra.py b/CrossDown/Extra.py new file mode 100644 index 0000000..e69de29 diff --git a/README.html b/README.html index 58fff18..d3cb82c 100644 --- a/README.html +++ b/README.html @@ -29,8 +29,8 @@
    -

    CrossDown

    +

    CrossDown

    自制的markdown,添加了一些自定义的语法
    效果请见README.html

    -

    1{#1} 基本语法

    -

    1.1{#1.1} 标题

    -

    一级标题

    -

    二级标题

    -

    三级标题

    -

    四级标题

    -
    五级标题
    -
    六级标题
    -

    1.2{#1.2} 样式

    -

    1.2.1{#1.2.1} 斜体

    -

    1.2.2{#1.2.2} 粗体

    -

    1.2.3{#1.2.3} 粗斜体

    -

    1.2.4{#1.2.4} 下划线

    -

    1.2.5{#1.2.5} 删除线

    -

    1.2.6{#1.2.6} 高亮

    -

    1.2.7{#1.2.7} 在文本的正上方添加一行小文本主要用于标拼音

    -

    1.2.8{#1.2.8} 在指定的文本里面隐藏一段文本

    -

    1.2.9{#1.2.9} 分割线

    +

    1 基本语法

    +

    1.1 标题

    +

    一级标题

    +

    二级标题

    +

    三级标题

    +

    四级标题

    +
    五级标题
    +
    六级标题
    +

    1.2 样式

    +

    1.2.1 斜体

    +

    1.2.2 粗体

    +

    1.2.3 粗斜体

    +

    1.2.4 下划线

    +

    1.2.5 删除线

    +

    1.2.6 高亮

    +

    1.2.7 在文本的正上方添加一行小文本主要用于标拼音

    +

    1.2.8 在指定的文本里面隐藏一段文本

    +

    1.2.9 分割线




    -

    1.3{#1.3} 链接

    -

    1.3.1{#1.3.1} 普通链接

    +

    1.3 链接

    +

    1.3.1 普通链接

    链接文本

    CrossDark

    https://crossdark.net/

    -

    1.3.2{#1.3.2} 图片

    +

    1.3.2 图片

    链接图片

    sea

    -

    1.3.3{#1.3.3} 变量链接

    +

    1.3.3 变量链接

    链接文本

    -

    2{#2} 变量

    -

    2.1{#2.1} 定义

    +

    2 变量

    +

    2.1 定义

    {变量名} = 值

    -

    2.2{#2.2} 赋值

    +

    2.2 赋值

    {变量名} {锚点名}

    提纲的编号已经自动配置为了锚点,可直接使用{2}

    -

    2.3{#2.3} 添加锚点

    +

    2.3 添加锚点

    {#锚点名}

    -

    3{#3} 代码块

    -

    3.1{#3.1} 单行

    -

    3.1.1{#3.1.1} LaTex

    +

    3 代码块

    +

    3.1 单行

    +

    3.1.1 LaTex

    $CO_2$

    $H_2O$

    -

    3.1.2{#3.1.2} 函数

    +

    3.1.2 函数

    ¥y=x*2+1¥ // 不定义范围

    ¥y=x**2¥€-50,50€ // 定义了x范围

    ¥y=x**3¥€-50,50|-100,100€ // 定义了y范围

    -

    3.2{#3.2} 多行

    -

    3.2.1{#3.2.1} YAML

    +

    3.2 多行

    +

    3.2.1 YAML

    A: 1. a 2. b @@ -176,21 +176,21 @@ - a - b - c

    -

    3.2.2{#3.2.2} Python

    +

    3.2.2 Python

    python print('CrossDown')

    -

    3.2.3{#3.2.3} Mermaid

    +

    3.2.3 Mermaid

    mermaid graph LR A-->B A-->C B-->D C-->D

    -

    4{#4} 转义

    +

    4 转义

    \

    \a

    *

    -

    5{#5} 引用

    +

    5 引用

    一级引用

    @@ -210,43 +210,43 @@

    引文内添加斜体粗体下划线删除线高亮

    -

    6{#6} 提纲

    -

    6.1{#6.1} 提纲号

    +

    6 提纲

    +

    6.1 提纲号

    以数字和点组成,通过空格与提纲名分隔,例如:

    -

    6.1.1{#6.1.1} 提纲号示例

    +

    6.1.1 提纲号示例

    点不能出现在开头或结尾,例如

    .6.1.2 错误示范

    6.1.3. 错误示范

    不能出现两个及以上连续的点,例如:

    6..1…4 错误示范

    提纲号会被自动配置为锚点,可直接使用{6}{6.1}

    -

    7{#7} 注释

    -

    7.1{#7.1} 强注释

    +

    7 注释

    +

    7.1 强注释

    |=
    无论如何都会被移除
    放在代码块里也没用
    =|

    -

    7.2{#7.2} 弱注释

    +

    7.2 弱注释

    只有在 // 后面才会被移除

    // 代码中的注释弱不会被移除

    -

    8{#8} 列表

    -

    8.1{#8.1} 有序列表

    +

    8 列表

    +

    8.1 有序列表

    1. a
    2. b
    3. c
    4. d
    -

    8.2{#8.2} 无序列表

    +

    8.2 无序列表

    • A
    • B
    • C
    • D
    -

    9{#9} 表格

    +

    9 表格

    @@ -268,15 +268,15 @@
    -

    10{#10} 警告

    +

    10 警告

    这是一条警告

    -

    11{#11} Emoji

    +

    11 Emoji

    :person_biking:

    :grinning_face_with_big_eyes:

    -

    12{#12} 扩展语法

    -

    12.1{#12.1} 警告

    +

    12 扩展语法

    +

    12.1 警告

    Don’t try this at home

    From 2c796e7146066873287aa8b7331e26aa150b8030 Mon Sep 17 00:00:00 2001 From: crossdark Date: Tue, 1 Oct 2024 20:56:31 +0800 Subject: [PATCH 05/47] =?UTF-8?q?1.0.4=E5=8F=98=E9=87=8F=E6=9C=89=E4=BA=9B?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 15 +++++++++------ CrossDown/Extra.py | 3 +++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 6683f38..cf04512 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -27,6 +27,13 @@ Extensions = { } +try: # 检测当前平台是否支持扩展语法 + import Extra + Extensions += Extra.EXTRA +except ModuleNotFoundError: + EXTRA_ABLE = False + + class Style(Preprocessor): """ 渲染字体样式 @@ -105,15 +112,11 @@ class Value(Preprocessor): def run(self, lines: List[str]) -> List[str]: values = { # 从text中提取所有变量并转换成字典 key: value for key, value in [ - (lambda match: match.groups() if match is not None else ('', '')) # 未定义变量的行统一返回('', '') + (lambda match: match.groups() if match is not None else ('\1', '\2')) # 未定义变量的行统一返回('', '') (re.match(r'\{([^{}#]+)} ?= ?(.+?)(?=\n|$)', line)) for line in lines ] } - anchor = [ - re.match(r'\{#([^{}#]+)}', line) for line in lines - ] - print(anchor) - return lines + return [re.sub(line, values[line], line) if any(value in line for value in values) in values.keys() else line for line in lines] # TODO class Header(Treeprocessor): diff --git a/CrossDown/Extra.py b/CrossDown/Extra.py index e69de29..45f343c 100644 --- a/CrossDown/Extra.py +++ b/CrossDown/Extra.py @@ -0,0 +1,3 @@ +EXTRA = [ + +] From 7c9d21b32419d6ed1d7da2080caacbabce47387b Mon Sep 17 00:00:00 2001 From: crossdark Date: Wed, 2 Oct 2024 20:19:55 +0800 Subject: [PATCH 06/47] =?UTF-8?q?1.0.5=E5=8F=98=E9=87=8F=E6=90=9E=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 23 ++++++++++++++++------- README.html | 3 +-- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index cf04512..d27ca74 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -110,13 +110,22 @@ class Syllabus(Preprocessor): class Value(Preprocessor): def run(self, lines: List[str]) -> List[str]: - values = { # 从text中提取所有变量并转换成字典 - key: value for key, value in [ - (lambda match: match.groups() if match is not None else ('\1', '\2')) # 未定义变量的行统一返回('', '') - (re.match(r'\{([^{}#]+)} ?= ?(.+?)(?=\n|$)', line)) for line in lines - ] - } - return [re.sub(line, values[line], line) if any(value in line for value in values) in values.keys() else line for line in lines] # TODO + values = { + key: value.strip() # 去除值两侧的空白字符 + for line in lines + for match in [re.match(r'\{([^{}#]+)} ?= ?(.+?)(?=\n|$)', line)] + if match + for key, value in [match.groups()] + } # 识别变量定义 + print(values) + for index, line in enumerate(lines): + if any(value in line for value in values): # 匹配到了变量 + for key, value in values.items(): + if '=' in line: # 是变量定义 + lines.remove(line) # 删除 + else: # 应该被赋值 + lines[index] = re.sub('{' + key + '}', value, line) # 对变量赋值 + return lines class Header(Treeprocessor): diff --git a/README.html b/README.html index d3cb82c..7052124 100644 --- a/README.html +++ b/README.html @@ -151,9 +151,8 @@

    链接文本

    2 变量

    2.1 定义

    -

    {变量名} = 值

    2.2 赋值

    -

    {变量名} {锚点名}

    +

    值 {锚点名}

    提纲的编号已经自动配置为了锚点,可直接使用{2}

    2.3 添加锚点

    {#锚点名}

    From d255f8e2aa03e504f524668fadead12953a3e130 Mon Sep 17 00:00:00 2001 From: crossdark Date: Wed, 2 Oct 2024 21:04:14 +0800 Subject: [PATCH 07/47] =?UTF-8?q?1.1.0=E9=94=9A=E7=82=B9=E6=9C=89=E7=82=B9?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 50 +++++++++++++++++++++++++++++++++-------------- README.html | 9 ++++++--- README.md | 6 +++++- 3 files changed, 46 insertions(+), 19 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index d27ca74..5abbb29 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -26,9 +26,9 @@ Extensions = { "WikiLinks": "markdown.extensions.wikilinks", } - try: # 检测当前平台是否支持扩展语法 import Extra + Extensions += Extra.EXTRA except ModuleNotFoundError: EXTRA_ABLE = False @@ -43,7 +43,7 @@ class Style(Preprocessor): def underline(text): """ ~下划线~ - :return: + :return: text """ return re.sub(r'~([^~\n]+)~', r'\1', text) @@ -51,7 +51,7 @@ class Style(Preprocessor): def strikethrough(text): """ ~~删除线~~ - :return: + :return: text """ return re.sub(r'~~([^~\n]+)~~', r'\1', text) @@ -59,7 +59,7 @@ class Style(Preprocessor): def highlight(text): """ ==高亮== - :return: + :return: text """ return re.sub(r'==([^=\n]+)==', r'\1', text) @@ -67,7 +67,7 @@ class Style(Preprocessor): def up(text): """ [在文本的正上方添加一行小文本]^(主要用于标拼音) - :return: + :return: text """ return re.sub(r'\[(.*?)]\^\((.*?)\)', r'\1\2', text) @@ -75,7 +75,7 @@ class Style(Preprocessor): def hide(text): """ [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本) - :return: + :return: text """ return re.sub(r'\[(.*?)]-\((.*?)\)', r'\1', text) @@ -99,11 +99,11 @@ class Syllabus(Preprocessor): fr'{"#" * len(match.groups()[0].split("."))} \1', origen) if match is not None else origen) # 对于不是提纲的行,直接返回原始字符 ((lambda x: re.match(r'^([\d.]+) ', x) # 判断是否是提纲 - if not any((x.startswith('.'), # 以.开头 - re.search('\. ', x) is not None, # 存在.+空格 - re.search('\.{2,}', x), # 存在连续的. - )) - else None)(line), line) # 排除.在提纲号开头或结尾的情况 + if not any((x.startswith('.'), # 以.开头 + re.search('\. ', x) is not None, # 存在.+空格 + re.search('\.{2,}', x), # 存在连续的. + )) + else None)(line), line) # 排除.在提纲号开头或结尾的情况 for line in lines # 分割并遍历文本的每一行 ] @@ -117,7 +117,8 @@ class Value(Preprocessor): if match for key, value in [match.groups()] } # 识别变量定义 - print(values) + anchors = re.findall(r'\{#([^{}#]+)}', '\n'.join(lines)) # 识别锚点定义 + print(anchors) for index, line in enumerate(lines): if any(value in line for value in values): # 匹配到了变量 for key, value in values.items(): @@ -125,10 +126,15 @@ class Value(Preprocessor): lines.remove(line) # 删除 else: # 应该被赋值 lines[index] = re.sub('{' + key + '}', value, line) # 对变量赋值 + elif any(anchor in line for anchor in anchors): # 匹配到了锚点 + if re.search('\{#', line): # 是锚点定义 + lines[index] = re.sub(r'\{#(.+)}', r'', line) # 定义锚点 + else: # 是页内链接 + pass return lines -class Header(Treeprocessor): +class Tag(Treeprocessor): def run(self, root): """ 通过修改AST来给标题添加锚点 @@ -136,9 +142,15 @@ class Header(Treeprocessor): for header in root.iter(): if header.tag in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6'): # 查找标题 header.set('id', header.text.split(' ')[0]) # 给标题添加锚点 + if header.text is not None: # 不是空行 + pass class Basic(Extension): + """ + 基本扩展 + """ + def extendMarkdown(self, md): md.registerExtension(self) # 注册扩展 md.preprocessors.register(Style(md), 'style', 0) @@ -146,15 +158,23 @@ class Basic(Extension): class More(Extension): + """ + 高级扩展 + """ + def extendMarkdown(self, md): md.preprocessors.register(Value(md), 'values', 0) class Decorate(Extension): + """ + 修饰扩展,最后处理 + """ + def extendMarkdown(self, md): - md.treeprocessors.register(Header(md), 'header', 0) + md.treeprocessors.register(Tag(md), 'header', 0) def main(text: str) -> Tuple[str, Dict[str, List[str]]]: - md = Markdown(extensions=[Basic(), More()] + list(Extensions.values()) + [Decorate()]) + md = Markdown(extensions=[Basic(), More()] + list(Extensions.values()) + [Decorate()], safe_mode=False) return md.convert(text), md.Meta diff --git a/README.html b/README.html index 7052124..443941f 100644 --- a/README.html +++ b/README.html @@ -77,6 +77,7 @@
  • 3.1 单行
  • 3.2 多行
      @@ -155,7 +156,7 @@

      值 {锚点名}

      提纲的编号已经自动配置为了锚点,可直接使用{2}

      2.3 添加锚点

      -

      {#锚点名}

      +

      3 代码块

      3.1 单行

      3.1.1 LaTex

      @@ -165,6 +166,8 @@

      ¥y=x*2+1¥ // 不定义范围

      ¥y=x**2¥€-50,50€ // 定义了x范围

      ¥y=x**3¥€-50,50|-100,100€ // 定义了y范围

      +

      3.1.3 强调

      +

      {强调文本}

      3.2 多行

      3.2.1 YAML

      A: @@ -276,8 +279,8 @@

      :grinning_face_with_big_eyes:

      12 扩展语法

      12.1 警告

      -
      -

      Don’t try this at home

      +
      +

      危险

      diff --git a/README.md b/README.md index 3f001ed..8294740 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,10 @@ ___ `¥y=x**3¥€-50,50|-100,100€` // 定义了y范围 +3.1.3 强调 + +`{强调文本}` + 3.2 多行 3.2.1 YAML @@ -225,4 +229,4 @@ graph LR 12.1 警告 -!!! danger "Don't try this at home" +!!! 危险 From ccc4724d7d325f8fb1f19d97777b2cd41a3f0cbe Mon Sep 17 00:00:00 2001 From: crossdark Date: Thu, 3 Oct 2024 21:27:28 +0800 Subject: [PATCH 08/47] =?UTF-8?q?1.1.1=E9=94=9A=E7=82=B9=E4=BE=9D=E7=84=B6?= =?UTF-8?q?=E6=9C=89=E7=82=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 12 ++++-- README.html | 104 +++++++++++++++++++++++----------------------- 2 files changed, 60 insertions(+), 56 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 5abbb29..a4ab04f 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -126,11 +126,11 @@ class Value(Preprocessor): lines.remove(line) # 删除 else: # 应该被赋值 lines[index] = re.sub('{' + key + '}', value, line) # 对变量赋值 - elif any(anchor in line for anchor in anchors): # 匹配到了锚点 + if any(anchor in line for anchor in anchors): # 匹配到了锚点 if re.search('\{#', line): # 是锚点定义 lines[index] = re.sub(r'\{#(.+)}', r'', line) # 定义锚点 else: # 是页内链接 - pass + print(line) return lines @@ -142,8 +142,12 @@ class Tag(Treeprocessor): for header in root.iter(): if header.tag in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6'): # 查找标题 header.set('id', header.text.split(' ')[0]) # 给标题添加锚点 - if header.text is not None: # 不是空行 - pass + elif header.tag == 'ul': # 是无序列表 + for i in header: # 遍历列表内容 + try: + i[0].set('id', i[0].text.split(' ')[0]) # 是目录 + except IndexError: + pass # 是普通的无序列表 class Basic(Extension): diff --git a/README.html b/README.html index 443941f..c971d65 100644 --- a/README.html +++ b/README.html @@ -28,17 +28,17 @@

      CrossDown

      @@ -153,7 +150,7 @@

      2 变量

      2.1 定义

      2.2 赋值

      -

      值 {锚点名}

      +

      {变量名} {锚点名}

      提纲的编号已经自动配置为了锚点,可直接使用{2}

      2.3 添加锚点

      @@ -278,9 +275,5 @@

      🚴

      😃

      12 扩展语法

      -

      12.1 警告

      -
      -

      危险

      -
      diff --git a/README.md b/README.md index 8294740..0686290 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ -Title: My Document -Summary: A brief description of my document. -Authors: Waylan Limberg - John Doe -Date: October 2, 2007 -blank-value: -base_url: http://example.com +Title: CrossDown示例 +Summary: 够简洁的了 +Authors: CrossDark +Date: __date__ +blank-value: g +base_url: http://crossdark.net:3000/crossdark/CrossDown [TOC] @@ -226,7 +225,3 @@ graph LR :grinning_face_with_big_eyes: 12 扩展语法 - -12.1 警告 - -!!! 危险 From 241aedbdee4e586f1543c8d3eb5ac1ace4c92939 Mon Sep 17 00:00:00 2001 From: crossdark Date: Thu, 3 Oct 2024 22:08:59 +0800 Subject: [PATCH 12/47] =?UTF-8?q?1.3=E5=8F=98=E9=87=8F=E5=A5=BD=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 25 ++++++++----------------- README.html | 2 +- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 47b151f..704b29b 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -120,23 +120,14 @@ class Value(Preprocessor): for key, value in [match.groups()] } # 识别变量定义 anchors = re.findall(r'\{#([^{}#]+)}', '\n'.join(lines)) # 识别锚点定义 - for index, line in enumerate(lines): - if any(value in line for value in values): # 匹配到了变量 - for key, value in values.items(): - if '=' in line: # 是变量定义 - lines.remove(line) # 删除 - else: # 应该被赋值 - lines[index] = re.sub('{' + key + '}', value, line) # 对变量赋值 - if any(anchor in line for anchor in anchors): # 匹配到了锚点 - if re.search('\{#', line): # 是锚点定义 - lines[index] = re.sub(r'\{#(.+)}', r'', line) # 定义锚点 - else: # 是页内链接 - lines[index] = re.sub(r'\{#' - + (lambda x: x if x in anchors else '\0') # 识别ID是否为锚点 - ((lambda x: x[0] if x is not None else '\0') # 排除匹配不成功的情况 - (re.search(r'\{#(.+)}', line))) + '}', # 匹配链接id - r'\1', line) # 添加页内链接 - return lines + text = '\n'.join(lines) # 先合并成一行 + for item in anchors: + text = re.sub(r'\{#(' + item + ')}', r'', text) # 添加锚点 + text = re.sub(r'\{' + item + '}', fr'{item}', text) # 添加页内链接 + for k, v in values.items(): + text = re.sub(r'\{' + k + '} ?= ?(.+?)(?=\n|$)', '', text) # 移除变量的定义 + text = re.sub(r'\{' + k + '}', fr'{v}', text) # 给变量赋值 + return text.split('\n') # 再分割为列表 class Tag(Treeprocessor): diff --git a/README.html b/README.html index c2cb4ae..f8d84c7 100644 --- a/README.html +++ b/README.html @@ -150,7 +150,7 @@

      2 变量

      2.1 定义

      2.2 赋值

      -

      {变量名} {锚点名}

      +

      锚点名

      提纲的编号已经自动配置为了锚点,可直接使用{2}

      2.3 添加锚点

      From ddbe9a02ae6ce145f45729305ad10fd377aabd4a Mon Sep 17 00:00:00 2001 From: crossdark Date: Fri, 4 Oct 2024 18:45:48 +0800 Subject: [PATCH 13/47] =?UTF-8?q?1.4.2=E9=9A=90=E8=97=8F=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 143 ++++++++++++++++++++++++++++------------------ README.html | 10 ++-- 2 files changed, 92 insertions(+), 61 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 704b29b..590f96a 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -1,8 +1,10 @@ +import xml import emoji from markdown.extensions import Extension from markdown.treeprocessors import Treeprocessor -from markdown.inlinepatterns import Pattern +from markdown.inlinepatterns import Pattern as Pattern_ from markdown.preprocessors import Preprocessor +from markdown.inlinepatterns import InlineProcessor from markdown import Markdown from typing import * import re @@ -35,62 +37,92 @@ except ModuleNotFoundError: 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 underline(text): - """ - ~下划线~ - :return: text - """ - return re.sub(r'~([^~\n]+)~', r'\1', text) - - @staticmethod - def strikethrough(text): - """ - ~~删除线~~ - :return: text - """ - return re.sub(r'~~([^~\n]+)~~', r'\1', text) - - @staticmethod - def highlight(text): - """ - ==高亮== - :return: text - """ - return re.sub(r'==([^=\n]+)==', r'\1', text) - - @staticmethod - def up(text): - """ - [在文本的正上方添加一行小文本]^(主要用于标拼音) - :return: text - """ - return re.sub(r'\[(.*?)]\^\((.*?)\)', r'\1\2', text) - - @staticmethod - def hide(text): - """ - [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本) - :return: text - """ - return re.sub(r'\[(.*?)]-\((.*?)\)', r'\1', text) - - def run(self, lines: List[str]) -> List[str]: - new_line = [] - for line in lines: - line = re.sub(r'~~([^~\n]+)~~', r'\1', line) # ~~删除线~~ - line = re.sub(r'~([^~\n]+)~', r'\1', line) # ~下划线~ - line = re.sub(r'==([^=\n]+)==', r'\1', line) # ==高亮== - line = re.sub(r'\[(.*?)]\^\((.*?)\)', r'\1\2', line) # [在文本的正上方添加一行小文本]^(主要用于标拼音) - line = re.sub(r'\[(.*?)]-\((.*?)\)', r'\1', line) # [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本) - line = emoji.emojize(line) # 渲染Emoji - new_line.append(line) - return new_line + def extendMarkdown(self, md): + md.registerExtension(self) # 注册扩展 + md.inlinePatterns.register(BasicSimple(r'~~(.*?)~~', tag='s'), 'strikethrough', 0) # ~~删除线~~ + md.inlinePatterns.register(BasicSimple(r'~(.*?)~', tag='u'), 'underline', 0) # ~下划线~ + md.inlinePatterns.register(BasicSimple(r'==(.*?)==', tag='mark'), 'high_light', 0) # ==高亮== + md.inlinePatterns.register(BasicDifficult( + r'\[(.*?)]\^\((.*?)\)', outer_tag='ruby', inner_tag='rt'), 'up', 0 + ) # [在文本的正上方添加一行小文本]^(主要用于标拼音) + md.inlinePatterns.register(BasicDifficult( + r'\[(.*?)]-\((.*?)\)', outer_tag='ruby', inner_tag='rt'), 'hide', 0 + ) # [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本) class Syllabus(Preprocessor): @@ -146,14 +178,13 @@ class Tag(Treeprocessor): pass # 是普通的无序列表 -class Basic(Extension): +class Basic_(Extension): """ 基本扩展 """ def extendMarkdown(self, md): md.registerExtension(self) # 注册扩展 - md.preprocessors.register(Style(md), 'style', 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]]]: - 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 diff --git a/README.html b/README.html index f8d84c7..bc2b785 100644 --- a/README.html +++ b/README.html @@ -55,7 +55,7 @@
    • 1.2.5 删除线
    • 1.2.6 高亮
    • 1.2.7 在文本的正上方添加一行小文本主要用于标拼音
    • -
    • 1.2.8 在指定的文本里面隐藏一段文本
    • +
    • 1.2.8 [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本)
    • 1.2.9 分割线
  • @@ -132,7 +132,7 @@

    1.2.5 删除线

    1.2.6 高亮

    1.2.7 在文本的正上方添加一行小文本主要用于标拼音

    -

    1.2.8 在指定的文本里面隐藏一段文本

    +

    1.2.8 [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本)

    1.2.9 分割线



    @@ -207,7 +207,7 @@ -

    引文内添加斜体粗体下划线删除线高亮

    +

    引文内添加斜体粗体~下划线~删除线高亮

    6 提纲

    6.1 提纲号

    @@ -272,8 +272,8 @@

    这是一条警告

11 Emoji

-

🚴

-

😃

+

:person_biking:

+

:grinning_face_with_big_eyes:

12 扩展语法

From 6efb2afd0c52be25af4cd7a7a45d897883a5a49f Mon Sep 17 00:00:00 2001 From: crossdark Date: Fri, 4 Oct 2024 21:00:23 +0800 Subject: [PATCH 14/47] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 0686290..8c72e01 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ base_url: http://crossdark.net:3000/crossdark/CrossDown [TOC] # CrossDown -自制的markdown,添加了一些自定义的语法 +自制的markdown,添加了一些自定义的语法 效果请见[README.html](https://github.com/CrossDark/CrossDown/blob/main/README.html) 1 基本语法 @@ -68,19 +68,17 @@ ___ [变量]: https://crossdark.com -2 变量 +2 缩写 2.1 定义 -{变量名} = 值 +*[缩写]: 长的文本 2.2 赋值 -{变量名} {锚点名} +直接在文本中使用缩写即可 -提纲的编号已经自动配置为了锚点,可直接使用{2} - -2.3 添加锚点 +2.3 锚点 {#锚点名} From ee3a51215bc7770ab7d0c8a267cfcad6bf8b5f67 Mon Sep 17 00:00:00 2001 From: crossdark Date: Fri, 4 Oct 2024 21:31:07 +0800 Subject: [PATCH 15/47] =?UTF-8?q?1.4.3=E9=9A=90=E8=97=8F=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E6=8C=81=E7=BB=AD=E8=BF=9B=E8=A1=8C=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.html | 177 ++++++++++++++++++++++++++++------------------------ README.md | 82 +++++++++++++----------- run.py | 1 + styles.css | 75 ++++++++++++++++++++++ 4 files changed, 215 insertions(+), 120 deletions(-) create mode 100644 styles.css diff --git a/README.html b/README.html index bc2b785..1986eb1 100644 --- a/README.html +++ b/README.html @@ -4,6 +4,7 @@ UTF-8编码示例 + @@ -55,7 +56,7 @@
  • 1.2.5 删除线
  • 1.2.6 高亮
  • 1.2.7 在文本的正上方添加一行小文本主要用于标拼音
  • -
  • 1.2.8 [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本)
  • +
  • 1.2.8 在指定的文本里面隐藏一段文本只有鼠标放在上面才会显示隐藏文本
  • 1.2.9 分割线
  • @@ -67,54 +68,55 @@ -
  • 2 变量
      +
    • 2 缩写
    • -
    • 3 代码块
        -
      • 3.1 单行
          -
        • 3.1.1 LaTex
        • -
        • 3.1.2 函数
        • -
        • 3.1.3 强调
        • +
        • 3 锚点
        • +
        • 4 代码块
            +
          • 4.1 单行
          • -
          • 3.2 多行 +
          • +
          • 5 转义
          • +
          • 6 引用
          • +
          • 7 提纲
          • -
          • 4 转义
          • -
          • 5 引用
          • -
          • 6 提纲
              -
            • 6.1 提纲号

              CrossDown

              -

              自制的markdown,添加了一些自定义的语法
              +

              自制的markdown,添加了一些自定义的语法
              效果请见README.html

              1 基本语法

              1.1 标题

              @@ -132,7 +134,7 @@

              1.2.5 删除线

              1.2.6 高亮

              1.2.7 在文本的正上方添加一行小文本主要用于标拼音

              -

              1.2.8 [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本)

              +

              1.2.8 在指定的文本里面隐藏一段文本只有鼠标放在上面才会显示隐藏文本

              1.2.9 分割线



              @@ -147,49 +149,57 @@

              sea

              1.3.3 变量链接

              链接文本

              -

              2 变量

              +

              2 缩写

              2.1 定义

              2.2 赋值

              -

              锚点名

              -

              提纲的编号已经自动配置为了锚点,可直接使用{2}

              -

              2.3 添加锚点

              +

              直接在文本中使用 缩写 即可

              +

              3 锚点

              -

              3 代码块

              -

              3.1 单行

              -

              3.1.1 LaTex

              +

              4 代码块

              +

              4.1 单行

              +

              4.1.1 LaTex

              $CO_2$

              $H_2O$

              -

              3.1.2 函数

              +

              4.1.2 函数

              ¥y=x*2+1¥ // 不定义范围

              ¥y=x**2¥€-50,50€ // 定义了x范围

              ¥y=x**3¥€-50,50|-100,100€ // 定义了y范围

              -

              3.1.3 强调

              +

              4.1.3 强调

              {强调文本}

              -

              3.2 多行

              -

              3.2.1 YAML

              -

              A: - 1. a - 2. b - 3. c - B: - - a - - b - - c

              -

              3.2.2 Python

              -

              python - print('CrossDown')

              -

              3.2.3 Mermaid

              -

              mermaid - graph LR - A-->B - A-->C - B-->D - C-->D

              -

              4 转义

              +

              4.2 多行

              +

              4.2.1 YAML

              +
              A:
              +        1. a
              +        2. b
              +        3. c
              +    B:
              +        - a
              +        - b
              +        - c
              +    
              + +

              4.2.2 Python

              +
              :::python
              +    print('CrossDown')
              +    
              + +

              4.2.3 Mermaid

              +
              graph LR
              +        A-->B
              +        A-->C
              +        B-->D
              +        C-->D
              +    
              + +

              4.3 代码高亮

              +
              
              +    
              + +

              5 转义

              \

              \a

              *

              -

              5 引用

              +

              6 引用

              一级引用

              @@ -209,43 +219,43 @@

              引文内添加斜体粗体~下划线~删除线高亮

              -

              6 提纲

              -

              6.1 提纲号

              +

              7 提纲

              +

              7.1 提纲号

              以数字和点组成,通过空格与提纲名分隔,例如:

              -

              6.1.1 提纲号示例

              +

              7.1.1 提纲号示例

              点不能出现在开头或结尾,例如

              -

              .6.1.2 错误示范

              -

              6.1.3. 错误示范

              +

              .7.1.2 错误示范

              +

              7.1.3. 错误示范

              不能出现两个及以上连续的点,例如:

              -

              6..1…4 错误示范

              -

              提纲号会被自动配置为锚点,可直接使用{6}{6.1}

              -

              7 注释

              -

              7.1 强注释

              +

              7..1…4 错误示范

              +

              提纲号会被自动配置为锚点,可直接使用{7}76.1}

              +

              8 注释

              +

              8.1 强注释

              |=
              无论如何都会被移除
              放在代码块里也没用
              =|

              -

              7.2 弱注释

              +

              8.2 弱注释

              只有在 // 后面才会被移除

              // 代码中的注释弱不会被移除

              -

              8 列表

              -

              8.1 有序列表

              +

              9 列表

              +

              9.1 有序列表

              1. a
              2. b
              3. c
              4. d
              -

              8.2 无序列表

              +

              9.2 无序列表

              • A
              • B
              • C
              • D
              -

              9 表格

              +

              10 表格

              @@ -267,13 +277,14 @@
              -

              10 警告

              -
              -

              这是一条警告

              +

              11 警告

              +
              +

              警告标题

              +

              警告内容

              -

              11 Emoji

              +

              12 Emoji

              :person_biking:

              :grinning_face_with_big_eyes:

              -

              12 扩展语法

              +

              13 扩展语法

              diff --git a/README.md b/README.md index 8c72e01..d3fa654 100644 --- a/README.md +++ b/README.md @@ -76,23 +76,23 @@ ___ 2.2 赋值 -直接在文本中使用缩写即可 +直接在文本中使用 缩写 即可 -2.3 锚点 +3 锚点 {#锚点名} -3 代码块 +4 代码块 -3.1 `单行` +4.1 `单行` -3.1.1 LaTex +4.1.1 LaTex `$CO_2$` `$H_2O$` -3.1.2 函数 +4.1.2 函数 `¥y=x*2+1¥` // 不定义范围 @@ -100,15 +100,15 @@ ___ `¥y=x**3¥€-50,50|-100,100€` // 定义了y范围 -3.1.3 强调 +4.1.3 强调 `{强调文本}` -3.2 多行 +4.2 多行 -3.2.1 YAML +4.2.1 YAML -` +```yaml A: 1. a 2. b @@ -117,25 +117,31 @@ B: - a - b - c -` +``` -3.2.2 Python +4.2.2 Python -`python +```python print('CrossDown') -` +``` -3.2.3 Mermaid +4.2.3 Mermaid -`mermaid +```mermaid graph LR A-->B A-->C B-->D C-->D -` +``` -4 转义 +4.3 代码高亮 + +```python + +``` + +5 转义 \\ @@ -143,7 +149,7 @@ graph LR \* -5 引用 +6 引用 > 一级引用 >> 二级引用 @@ -154,36 +160,36 @@ graph LR > > 引文内添加*斜体***粗体**~下划线~~~删除线~~==高亮== -6 提纲 +7 提纲 -6.1 提纲号 +7.1 提纲号 以数字和点组成,通过空格与提纲名分隔,例如: -6.1.1 提纲号示例 +7.1.1 提纲号示例 点不能出现在开头或结尾,例如 -.6.1.2 错误示范 +.7.1.2 错误示范 -6.1.3. 错误示范 +7.1.3. 错误示范 不能出现两个及以上连续的点,例如: -6..1...4 错误示范 +7..1...4 错误示范 -提纲号会被自动配置为锚点,可直接使用{6}{6.1} +提纲号会被自动配置为锚点,可直接使用{7}76.1} -7 注释 +8 注释 -7.1 强注释 +8.1 强注释 |= 无论如何都会被移除 `放在代码块里也没用` =| -7.2 弱注释 +8.2 弱注释 @@ -191,35 +197,37 @@ graph LR `// 代码中的注释弱不会被移除` -8 列表 +9 列表 + +9.1 有序列表 -8.1 有序列表 1. a 2. b 3. c 4. d -8.2 无序列表 +9.2 无序列表 - A - B - C - D -9 表格 +10 表格 | 表头1 | 表头2 | 表头3 | |:----:|:----:|:----:| | 单元格1 | 单元格2 | 单元格3 | | 单元格4 | 单元格5 | 单元格6 | -10 警告 +11 警告 -!!! 这是一条警告 +!!! warning "警告标题" + 警告内容 -11 Emoji +12 Emoji :person_biking: :grinning_face_with_big_eyes: -12 扩展语法 +13 扩展语法 diff --git a/run.py b/run.py index 51d28cb..4b00fee 100644 --- a/run.py +++ b/run.py @@ -17,6 +17,7 @@ if __name__ == '__main__': UTF-8编码示例 + {indent(HEAD)} diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..c4b2fd9 --- /dev/null +++ b/styles.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.codehilite .hll { background-color: #ffffcc } +.codehilite { background: #f8f8f8; } +.codehilite .c { color: #3D7B7B; font-style: italic } /* Comment */ +.codehilite .err { border: 1px solid #FF0000 } /* Error */ +.codehilite .k { color: #008000; font-weight: bold } /* Keyword */ +.codehilite .o { color: #666666 } /* Operator */ +.codehilite .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.codehilite .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.codehilite .cp { color: #9C6500 } /* Comment.Preproc */ +.codehilite .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.codehilite .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.codehilite .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.codehilite .gd { color: #A00000 } /* Generic.Deleted */ +.codehilite .ge { font-style: italic } /* Generic.Emph */ +.codehilite .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.codehilite .gr { color: #E40000 } /* Generic.Error */ +.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.codehilite .gi { color: #008400 } /* Generic.Inserted */ +.codehilite .go { color: #717171 } /* Generic.Output */ +.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.codehilite .gs { font-weight: bold } /* Generic.Strong */ +.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.codehilite .gt { color: #0044DD } /* Generic.Traceback */ +.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.codehilite .kp { color: #008000 } /* Keyword.Pseudo */ +.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.codehilite .kt { color: #B00040 } /* Keyword.Type */ +.codehilite .m { color: #666666 } /* Literal.Number */ +.codehilite .s { color: #BA2121 } /* Literal.String */ +.codehilite .na { color: #687822 } /* Name.Attribute */ +.codehilite .nb { color: #008000 } /* Name.Builtin */ +.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.codehilite .no { color: #880000 } /* Name.Constant */ +.codehilite .nd { color: #AA22FF } /* Name.Decorator */ +.codehilite .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.codehilite .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.codehilite .nf { color: #0000FF } /* Name.Function */ +.codehilite .nl { color: #767600 } /* Name.Label */ +.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.codehilite .nv { color: #19177C } /* Name.Variable */ +.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.codehilite .w { color: #bbbbbb } /* Text.Whitespace */ +.codehilite .mb { color: #666666 } /* Literal.Number.Bin */ +.codehilite .mf { color: #666666 } /* Literal.Number.Float */ +.codehilite .mh { color: #666666 } /* Literal.Number.Hex */ +.codehilite .mi { color: #666666 } /* Literal.Number.Integer */ +.codehilite .mo { color: #666666 } /* Literal.Number.Oct */ +.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */ +.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */ +.codehilite .sc { color: #BA2121 } /* Literal.String.Char */ +.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */ +.codehilite .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.codehilite .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.codehilite .sx { color: #008000 } /* Literal.String.Other */ +.codehilite .sr { color: #A45A77 } /* Literal.String.Regex */ +.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */ +.codehilite .ss { color: #19177C } /* Literal.String.Symbol */ +.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.codehilite .fm { color: #0000FF } /* Name.Function.Magic */ +.codehilite .vc { color: #19177C } /* Name.Variable.Class */ +.codehilite .vg { color: #19177C } /* Name.Variable.Global */ +.codehilite .vi { color: #19177C } /* Name.Variable.Instance */ +.codehilite .vm { color: #19177C } /* Name.Variable.Magic */ +.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */ From 42640173d350b82abf290512deb9baa3f060ce9a Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 13:40:05 +0800 Subject: [PATCH 16/47] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20CrossDown/Core.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BasicSimple->Simple --- CrossDown/Core.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 590f96a..c6fc961 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -37,7 +37,7 @@ except ModuleNotFoundError: EXTRA_ABLE = False -class BasicSimple(InlineProcessor): +class Simple(InlineProcessor): """ 可通过简单的正则表达式和HTML标签实现的样式 """ @@ -114,9 +114,9 @@ class Basic(Extension): def extendMarkdown(self, md): md.registerExtension(self) # 注册扩展 - md.inlinePatterns.register(BasicSimple(r'~~(.*?)~~', tag='s'), 'strikethrough', 0) # ~~删除线~~ - md.inlinePatterns.register(BasicSimple(r'~(.*?)~', tag='u'), 'underline', 0) # ~下划线~ - md.inlinePatterns.register(BasicSimple(r'==(.*?)==', tag='mark'), 'high_light', 0) # ==高亮== + md.inlinePatterns.register(Simple(r'~~(.*?)~~', tag='s'), 'strikethrough', 0) # ~~删除线~~ + md.inlinePatterns.register(Simple(r'~(.*?)~', tag='u'), 'underline', 0) # ~下划线~ + md.inlinePatterns.register(Simple(r'==(.*?)==', tag='mark'), 'high_light', 0) # ==高亮== md.inlinePatterns.register(BasicDifficult( r'\[(.*?)]\^\((.*?)\)', outer_tag='ruby', inner_tag='rt'), 'up', 0 ) # [在文本的正上方添加一行小文本]^(主要用于标拼音) From 8f7cbd2e6f74dd67d3efbd17da807e70b2dd8e8b Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 13:45:04 +0800 Subject: [PATCH 17/47] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20CrossDown/Core.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index c6fc961..5358eed 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -57,9 +57,9 @@ class Simple(InlineProcessor): return tag, match.start(), match.end() -class BasicDifficult(InlineProcessor): +class Nest(InlineProcessor): """ - 不能通过简单的正则表达式和HTML标签实现的样式 + 需要嵌套HTML标签实现的样式 """ def __init__(self, pattern: str, outer_tag: str, inner_tag: str): """ @@ -81,9 +81,9 @@ class BasicDifficult(InlineProcessor): return outer_tag, match.start(), match.end() -class BasicPro(InlineProcessor): +class ID(InlineProcessor): """ - 不能通过简单的正则表达式和HTML标签实现的样式 + 需要对HTML标签设置ID实现的样式 """ def __init__(self, pattern: str, tag: str, key: str, value: str): """ @@ -117,7 +117,7 @@ class Basic(Extension): md.inlinePatterns.register(Simple(r'~~(.*?)~~', tag='s'), 'strikethrough', 0) # ~~删除线~~ md.inlinePatterns.register(Simple(r'~(.*?)~', tag='u'), 'underline', 0) # ~下划线~ md.inlinePatterns.register(Simple(r'==(.*?)==', tag='mark'), 'high_light', 0) # ==高亮== - md.inlinePatterns.register(BasicDifficult( + md.inlinePatterns.register(Nest( r'\[(.*?)]\^\((.*?)\)', outer_tag='ruby', inner_tag='rt'), 'up', 0 ) # [在文本的正上方添加一行小文本]^(主要用于标拼音) md.inlinePatterns.register(BasicDifficult( From 579ba149b2833ff226cfc97562261853316d7d6d Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 13:46:05 +0800 Subject: [PATCH 18/47] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20CrossDown/Core.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 5358eed..0e84bdd 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -120,7 +120,7 @@ class Basic(Extension): md.inlinePatterns.register(Nest( r'\[(.*?)]\^\((.*?)\)', outer_tag='ruby', inner_tag='rt'), 'up', 0 ) # [在文本的正上方添加一行小文本]^(主要用于标拼音) - md.inlinePatterns.register(BasicDifficult( + md.inlinePatterns.register(ID( r'\[(.*?)]-\((.*?)\)', outer_tag='ruby', inner_tag='rt'), 'hide', 0 ) # [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本) From fd653014336846532c9507912428239c91c4e66e Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 13:54:37 +0800 Subject: [PATCH 19/47] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20CrossDown/Core.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 0e84bdd..42d585d 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -85,7 +85,7 @@ class ID(InlineProcessor): """ 需要对HTML标签设置ID实现的样式 """ - def __init__(self, pattern: str, tag: str, key: str, value: str): + def __init__(self, pattern: str, tag: str, property: str): """ 初始化 :param pattern: 正则表达式 @@ -95,16 +95,14 @@ class ID(InlineProcessor): """ super().__init__(pattern) self.tag = tag - self.key = key - self.value = value + self.property = property 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) # 设置内层标签文本 + tag = xml.etree.ElementTree.Element(self.tag) # 创建标签 + tag.text = match.groups(1) + tag.set(self.property, match.groups(2)) - return outer_tag, match.start(), match.end() + return tag, match.start(), match.end() class Basic(Extension): @@ -121,7 +119,7 @@ class Basic(Extension): r'\[(.*?)]\^\((.*?)\)', outer_tag='ruby', inner_tag='rt'), 'up', 0 ) # [在文本的正上方添加一行小文本]^(主要用于标拼音) md.inlinePatterns.register(ID( - r'\[(.*?)]-\((.*?)\)', outer_tag='ruby', inner_tag='rt'), 'hide', 0 + r'\[(.*?)]-\((.*?)\)', tag='ruby', property='rt'), 'hide', 0 ) # [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本) From 30ac4a34d1b8944e13fd1fc6fc4ae10825c10108 Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 13:55:34 +0800 Subject: [PATCH 20/47] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20CrossDown/Core.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 42d585d..fab0618 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -119,7 +119,7 @@ class Basic(Extension): r'\[(.*?)]\^\((.*?)\)', outer_tag='ruby', inner_tag='rt'), 'up', 0 ) # [在文本的正上方添加一行小文本]^(主要用于标拼音) md.inlinePatterns.register(ID( - r'\[(.*?)]-\((.*?)\)', tag='ruby', property='rt'), 'hide', 0 + r'\[(.*?)]-\((.*?)\)', tag='span', property='title'), 'hide', 0 ) # [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本) From e243daae9162f55aae0e0d2b3ae0cbfc5f15f4ad Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 14:00:18 +0800 Subject: [PATCH 21/47] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20CrossDown/Core.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index fab0618..49d062e 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -90,8 +90,7 @@ class ID(InlineProcessor): 初始化 :param pattern: 正则表达式 :param tag: html标签 - :param key: html标签属性 - :param value: html标签属性的值 + :param property: html标签属性名称 """ super().__init__(pattern) self.tag = tag @@ -99,8 +98,8 @@ class ID(InlineProcessor): def handleMatch(self, match, match_line): tag = xml.etree.ElementTree.Element(self.tag) # 创建标签 - tag.text = match.groups(1) - tag.set(self.property, match.groups(2)) + tag.text = match.groups(1) # 设置标签内容 + tag.set(self.property, match.groups(2)) # 设置标签属性 return tag, match.start(), match.end() From 38ae221755f5c5b130adf82401a3e7addb1ed756 Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 14:11:25 +0800 Subject: [PATCH 22/47] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d3fa654..4be20aa 100644 --- a/README.md +++ b/README.md @@ -230,4 +230,8 @@ graph LR :grinning_face_with_big_eyes: -13 扩展语法 +13 脚注 + +这是一个[^脚注] + +[^脚注]: 一段长的文本用于说明 From 213284caa2511111480bfefe5f08d8ab74857ee3 Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 14:22:39 +0800 Subject: [PATCH 23/47] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 4be20aa..5be6e4e 100644 --- a/README.md +++ b/README.md @@ -232,6 +232,14 @@ graph LR 13 脚注 +13.1 使用 + 这是一个[^脚注] +13.2 定义 + [^脚注]: 一段长的文本用于说明 + +13.3 放置 + +///Footnotes Go Here/// From d2265f0411c8f05f47e4655268c1cc3170def4a4 Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 17:36:46 +0800 Subject: [PATCH 24/47] =?UTF-8?q?1.4.4=E4=BF=9D=E5=AD=98=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.html | 8 +------- README.md | 6 ------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/README.html b/README.html index 1986eb1..54affa6 100644 --- a/README.html +++ b/README.html @@ -87,7 +87,6 @@
            • 4.2.3 Mermaid
          • -
          • 4.3 代码高亮
        • 5 转义
        • @@ -179,8 +178,7 @@

          4.2.2 Python

          -
          :::python
          -    print('CrossDown')
          +    
          print('CrossDown')
               

          4.2.3 Mermaid

          @@ -191,10 +189,6 @@ C-->D
          -

          4.3 代码高亮

          -
          
          -    
          -

          5 转义

          \

          \a

          diff --git a/README.md b/README.md index d3fa654..67489dc 100644 --- a/README.md +++ b/README.md @@ -135,12 +135,6 @@ graph LR C-->D ``` -4.3 代码高亮 - -```python - -``` - 5 转义 \\ From 1d64da0922bd77a72e1711921f4e96c8997aeb28 Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 17:42:35 +0800 Subject: [PATCH 25/47] =?UTF-8?q?1.4.5=E9=9A=90=E8=97=8F=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E5=A5=BD=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 12 ++++++------ README.html | 25 +++++++++++++++++++++---- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 49d062e..26a807b 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -85,21 +85,21 @@ class ID(InlineProcessor): """ 需要对HTML标签设置ID实现的样式 """ - def __init__(self, pattern: str, tag: str, property: str): + def __init__(self, pattern: str, tag: str, property_: str): """ 初始化 :param pattern: 正则表达式 :param tag: html标签 - :param property: html标签属性名称 + :param property_: html标签属性名称 """ super().__init__(pattern) self.tag = tag - self.property = property + self.property = property_ def handleMatch(self, match, match_line): tag = xml.etree.ElementTree.Element(self.tag) # 创建标签 - tag.text = match.groups(1) # 设置标签内容 - tag.set(self.property, match.groups(2)) # 设置标签属性 + tag.text = match.group(1) # 设置标签内容 + tag.set(self.property, match.group(2)) # 设置标签属性 return tag, match.start(), match.end() @@ -118,7 +118,7 @@ class Basic(Extension): r'\[(.*?)]\^\((.*?)\)', outer_tag='ruby', inner_tag='rt'), 'up', 0 ) # [在文本的正上方添加一行小文本]^(主要用于标拼音) md.inlinePatterns.register(ID( - r'\[(.*?)]-\((.*?)\)', tag='span', property='title'), 'hide', 0 + r'\[(.*?)]-\((.*?)\)', tag='span', property_='title'), 'hide', 0 ) # [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本) diff --git a/README.html b/README.html index 54affa6..a9314e3 100644 --- a/README.html +++ b/README.html @@ -56,7 +56,7 @@
        • 1.2.5 删除线
        • 1.2.6 高亮
        • 1.2.7 在文本的正上方添加一行小文本主要用于标拼音
        • -
        • 1.2.8 在指定的文本里面隐藏一段文本只有鼠标放在上面才会显示隐藏文本
        • +
        • 1.2.8 在指定的文本里面隐藏一段文本
        • 1.2.9 分割线
      • @@ -111,7 +111,12 @@
      • 10 表格
      • 11 警告
      • 12 Emoji
      • -
      • 13 扩展语法
      • +
      • 13 脚注 +

      CrossDown

      @@ -133,7 +138,7 @@

      1.2.5 删除线

      1.2.6 高亮

      1.2.7 在文本的正上方添加一行小文本主要用于标拼音

      -

      1.2.8 在指定的文本里面隐藏一段文本只有鼠标放在上面才会显示隐藏文本

      +

      1.2.8 在指定的文本里面隐藏一段文本

      1.2.9 分割线



      @@ -279,6 +284,18 @@

      12 Emoji

      :person_biking:

      :grinning_face_with_big_eyes:

      -

      13 扩展语法

      +

      13 脚注

      +

      13.1 使用

      +

      这是一个1

      +

      13.2 定义

      +

      13.3 放置

      +
      +
      +
        +
      1. +

        一段长的文本用于说明 

        +
      2. +
      +
      From 900d999b7a729911ec9c6407cf4b0766ce7a370c Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 17:55:30 +0800 Subject: [PATCH 26/47] =?UTF-8?q?1.4.6emoji=E5=A5=BD=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 21 ++++++++++++++++++++- README.html | 18 ++++++++---------- README.md | 8 +++++++- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 26a807b..6c33d28 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -104,9 +104,25 @@ class ID(InlineProcessor): return tag, match.start(), match.end() +class Emoji(InlineProcessor): + """ + 需要对HTML标签设置ID实现的样式 + """ + + def __init__(self, pattern: str): + """ + 初始化 + :param pattern: 正则表达式 + """ + super().__init__(pattern) + + def handleMatch(self, match, match_line): + return emoji.emojize(match.group(0)), match.start(), match.end() + + class Basic(Extension): """ - 渲染字体样式 + 渲染基本样式 """ def extendMarkdown(self, md): @@ -120,6 +136,9 @@ class Basic(Extension): md.inlinePatterns.register(ID( r'\[(.*?)]-\((.*?)\)', tag='span', property_='title'), 'hide', 0 ) # [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本) + md.inlinePatterns.register(Emoji( + r':(.+?):'), 'emoji', 0 + ) # 将emoji短代码转换为emoji字符 class Syllabus(Preprocessor): diff --git a/README.html b/README.html index a9314e3..6881a3b 100644 --- a/README.html +++ b/README.html @@ -117,11 +117,11 @@
    • 13.3 放置
  • +
  • 14 扩展
  • CrossDown

    -

    自制的markdown,添加了一些自定义的语法
    - 效果请见README.html

    +

    自制的markdown,添加了一些自定义的语法klzzwxh:0001效果请见klzzwxh:0000

    1 基本语法

    1.1 标题

    一级标题

    @@ -158,7 +158,7 @@

    2.2 赋值

    直接在文本中使用 缩写 即可

    3 锚点

    -

    +

    klzzwxh:0017klzzwxh:0018

    4 代码块

    4.1 单行

    4.1.1 LaTex

    @@ -216,7 +216,7 @@ -

    引文内添加斜体粗体~下划线~删除线高亮

    +

    引文内添加klzzwxhklzzwxhklzzwxh:00450042klzzwxh:0043

    7 提纲

    7.1 提纲号

    @@ -230,10 +230,7 @@

    提纲号会被自动配置为锚点,可直接使用{7}76.1}

    8 注释

    8.1 强注释

    -

    |=
    - 无论如何都会被移除
    - 放在代码块里也没用
    - =|

    +

    |=klzzwxhklzzwxhklzzwxh:00340029klzzwxh:0032=|

    8.2 弱注释

    @@ -282,8 +279,8 @@

    警告内容

    12 Emoji

    -

    :person_biking:

    -

    :grinning_face_with_big_eyes:

    +

    🚴

    +

    这是一个笑脸😃图案

    13 脚注

    13.1 使用

    这是一个1

    @@ -297,5 +294,6 @@ +

    14 扩展

    diff --git a/README.md b/README.md index db6a2ee..f377e5e 100644 --- a/README.md +++ b/README.md @@ -222,7 +222,7 @@ graph LR :person_biking: -:grinning_face_with_big_eyes: +这是一个笑脸:grinning_face_with_big_eyes:图案 13 脚注 @@ -236,4 +236,10 @@ graph LR 13.3 放置 +通过一下代码可以将文章中所有的脚注定义集中于一处 + ///Footnotes Go Here/// + +否则所有定义将被集中在文章末尾 + +14 扩展 From 54c2584b0fb9029a8de22d63624dda4c1bddd4a6 Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 18:25:00 +0800 Subject: [PATCH 27/47] =?UTF-8?q?1.5=E6=8F=90=E7=BA=B2=E5=A4=B4=E7=96=BC?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 143 +++++++++++++++++-------------------------- README.html | 150 +++++++++++++++++++++++++++++++++++++--------- 2 files changed, 179 insertions(+), 114 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 6c33d28..2bd158d 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -1,13 +1,14 @@ -import xml -import emoji from markdown.extensions import Extension from markdown.treeprocessors import Treeprocessor from markdown.inlinepatterns import Pattern as Pattern_ from markdown.preprocessors import Preprocessor from markdown.inlinepatterns import InlineProcessor +from markdown.blockprocessors import BlockProcessor from markdown import Markdown from typing import * import re +import xml +import emoji Extensions = { "Extra": "markdown.extensions.extra", @@ -120,6 +121,56 @@ class Emoji(InlineProcessor): return emoji.emojize(match.group(0)), match.start(), match.end() +class Syllabus_(InlineProcessor): + """ + 需要对HTML标签设置ID实现的样式 + """ + + def __init__(self, pattern: str): + """ + 初始化 + :param pattern: 正则表达式 + """ + super().__init__(pattern) + + def handleMatch(self, match, match_line): + tag = xml.etree.ElementTree.Element(f'h{len(match.group(1).split("."))}') # 创建标签 + tag.text = match.group(1) + ' ' + match.group(3) # 设置标签内容 + tag.set('id', match.group(1)) # 设置标签属性 + + return tag, match.start(), match.end() + + +class Syllabus(BlockProcessor): + # 定义提纲的正则表达式 + ALERT_RE = r'(\d+(\.\d+)*)\s+(.*)' + + def test(self, parent, block): + # 检查当前块是否匹配我们的正则表达式 + return bool(self.ALERT_RE.match(block)) + + def run(self, parent, blocks): + # 处理匹配的块 + block = blocks.pop(0) + m = self.ALERT_RE.search(block) + if m: + before = block[:m.start()] # 匹配之前的文本 + after = block[m.end():] # 匹配之后的文本 + if before: + # 如果匹配之前有文本,则创建一个新的段落来包含它 + p = etree.SubElement(parent, 'p') + p.text = before.strip() + # 创建包含警告内容的 div 元素 + div = etree.SubElement(parent, 'div', {'class': 'alert'}) + div.text = m.group(1).strip() + # 如果匹配之后还有文本,则将其重新添加到块列表中以便后续处理 + if after.strip(): + blocks.insert(0, after) + else: + # 如果没有匹配,则保留原始块以便后续处理器处理 + return False + + class Basic(Extension): """ 渲染基本样式 @@ -136,92 +187,10 @@ class Basic(Extension): md.inlinePatterns.register(ID( r'\[(.*?)]-\((.*?)\)', tag='span', property_='title'), 'hide', 0 ) # [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本) - md.inlinePatterns.register(Emoji( - r':(.+?):'), 'emoji', 0 - ) # 将emoji短代码转换为emoji字符 - - -class Syllabus(Preprocessor): - def run(self, lines: List[str]) -> List[str]: - return [ - (lambda match, origen: - re.sub(f'^({match.groups()[0]})', # 按照提纲等级添加#和锚点 - fr'{"#" * len(match.groups()[0].split("."))} \1', origen) - if match is not None else origen) # 对于不是提纲的行,直接返回原始字符 - ((lambda x: re.match(r'^([\d.]+) ', x) # 判断是否是提纲 - if not any((x.startswith('.'), # 以.开头 - re.search('\. ', x) is not None, # 存在.+空格 - re.search('\.{2,}', x), # 存在连续的. - )) - else None)(line), line) # 排除.在提纲号开头或结尾的情况 - for line in lines # 分割并遍历文本的每一行 - ] - - -class Value(Preprocessor): - def run(self, lines: List[str]) -> List[str]: - values = { - key: value.strip() # 去除值两侧的空白字符 - for line in lines - for match in [re.match(r'\{([^{}#]+)} ?= ?(.+?)(?=\n|$)', line)] - if match - for key, value in [match.groups()] - } # 识别变量定义 - anchors = re.findall(r'\{#([^{}#]+)}', '\n'.join(lines)) # 识别锚点定义 - text = '\n'.join(lines) # 先合并成一行 - for item in anchors: - text = re.sub(r'\{#(' + item + ')}', r'', text) # 添加锚点 - text = re.sub(r'\{' + item + '}', fr'{item}', text) # 添加页内链接 - for k, v in values.items(): - text = re.sub(r'\{' + k + '} ?= ?(.+?)(?=\n|$)', '', text) # 移除变量的定义 - text = re.sub(r'\{' + k + '}', fr'{v}', text) # 给变量赋值 - return text.split('\n') # 再分割为列表 - - -class Tag(Treeprocessor): - def run(self, root): - """ - 通过修改AST来给标题添加锚点 - """ - for header in root.iter(): - if header.tag in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6'): # 查找标题 - header.set('id', header.text.split(' ')[0]) # 给标题添加锚点 - elif header.tag == 'ul': # 是无序列表 - for i in header: # 遍历列表内容 - try: - i[0].set('href', '#' + i[0].text.split(' ')[0]) # 是目录,更改链接为标准格式 - except IndexError: - pass # 是普通的无序列表 - - -class Basic_(Extension): - """ - 基本扩展 - """ - - def extendMarkdown(self, md): - md.registerExtension(self) # 注册扩展 - md.preprocessors.register(Syllabus(md), 'syllabus', 0) - - -class More(Extension): - """ - 高级扩展 - """ - - def extendMarkdown(self, md): - md.preprocessors.register(Value(md), 'values', 0) - - -class Decorate(Extension): - """ - 修饰扩展,最后处理 - """ - - def extendMarkdown(self, md): - md.treeprocessors.register(Tag(md), 'header', 0) + md.inlinePatterns.register(Emoji(r':(.+?):'), 'emoji', 0) # 将emoji短代码转换为emoji字符 + md.inlinePatterns.register(Syllabus(r'(\d+(\.\d+)*)\s+(.*)'), 'syllabus', 0) # 渲染提纲 def main(text: str) -> Tuple[str, Dict[str, List[str]]]: - md = Markdown(extensions=[Basic(), Basic_(), More()] + list(Extensions.values()) + [Decorate()], safe_mode=False) + md = Markdown(extensions=[Basic()] + list(Extensions.values()), safe_mode=False) return md.convert(text), md.Meta diff --git a/README.html b/README.html index 6881a3b..c4f3dfb 100644 --- a/README.html +++ b/README.html @@ -29,17 +29,17 @@ -

    CrossDown

    +

    CrossDown

    自制的markdown,添加了一些自定义的语法klzzwxh:0001效果请见klzzwxh:0000

    +

    1 基本语法

    +

    +

    1.1 标题

    -

    一级标题

    -

    二级标题

    -

    三级标题

    -

    四级标题

    -
    五级标题
    -
    六级标题
    +

    +

    一级标题

    +

    二级标题

    +

    三级标题

    +

    四级标题

    +
    五级标题
    +
    六级标题
    +

    1.2 样式

    +

    +

    1.2.1 斜体

    +

    +

    1.2.2 粗体

    +

    +

    1.2.3 粗斜体

    +

    +

    1.2.4 下划线

    +

    +

    1.2.5 删除线

    +

    +

    1.2.6 高亮

    +

    +

    1.2.7 在文本的正上方添加一行小文本主要用于标拼音

    +

    +

    1.2.8 在指定的文本里面隐藏一段文本

    +

    +

    1.2.9 分割线

    +




    +

    1.3 链接

    +

    +

    1.3.1 普通链接

    +

    链接文本

    CrossDark

    https://crossdark.net/

    +

    1.3.2 图片

    +

    链接图片

    sea

    +

    1.3.3 变量链接

    +

    链接文本

    +

    2 缩写

    +

    +

    2.1 定义

    +

    +

    2.2 赋值

    +

    直接在文本中使用 缩写 即可

    +

    3 锚点

    -

    klzzwxh:0017klzzwxh:0018

    +

    +

    {#锚点名}

    +

    4 代码块

    +

    +

    4.1 单行

    +

    +

    4.1.1 LaTex

    +

    $CO_2$

    $H_2O$

    +

    4.1.2 函数

    +

    ¥y=x*2+1¥ // 不定义范围

    ¥y=x**2¥€-50,50€ // 定义了x范围

    ¥y=x**3¥€-50,50|-100,100€ // 定义了y范围

    +

    4.1.3 强调

    +

    {强调文本}

    +

    4.2 多行

    +

    +

    4.2.1 YAML

    +

    A:
             1. a
             2. b
    @@ -182,11 +238,15 @@
             - c
         
    +

    4.2.2 Python

    +

    print('CrossDown')
         
    +

    4.2.3 Mermaid

    +

    graph LR
             A-->B
             A-->C
    @@ -194,11 +254,15 @@
             C-->D
         
    +

    5 转义

    +

    \

    \a

    *

    +

    6 引用

    +

    一级引用

    @@ -216,42 +280,58 @@
    -

    引文内添加klzzwxhklzzwxhklzzwxh:00450042klzzwxh:0043

    +

    引文内添加klzzwxhklzzwxhklzzwxh:00990096klzzwxh:0097

    +

    7 提纲

    +

    +

    7.1 提纲号

    +

    以数字和点组成,通过空格与提纲名分隔,例如:

    +

    7.1.1 提纲号示例

    +

    点不能出现在开头或结尾,例如

    -

    .7.1.2 错误示范

    +

    .

    7.1.2 错误示范

    +

    7.1.3. 错误示范

    不能出现两个及以上连续的点,例如:

    -

    7..1…4 错误示范

    +

    7..1…

    4 错误示范

    +

    提纲号会被自动配置为锚点,可直接使用{7}76.1}

    +

    8 注释

    +

    +

    8.1 强注释

    -

    |=klzzwxhklzzwxhklzzwxh:00340029klzzwxh:0032=|

    +

    +

    |=klzzwxhklzzwxhklzzwxh:00690064klzzwxh:0067=|

    +

    8.2 弱注释

    +

    只有在 // 后面才会被移除

    // 代码中的注释弱不会被移除

    +

    9 列表

    +

    +

    9.1 有序列表

    +

    1. a
    2. b
    3. c
    4. d
    -

    9.2 无序列表

    -
      -
    • A
    • -
    • B
    • -
    • C
    • -
    • D
    • -
    +

    +

    9.2 无序列表klzzwxhklzzwxhklzzwxh:00800077- Cklzzwxh:0078- D

    +

    +

    10 表格

    +

    @@ -273,19 +353,32 @@
    +

    11 警告

    +

    警告标题

    警告内容

    +

    12 Emoji

    +

    🚴

    这是一个笑脸😃图案

    +

    13 脚注

    +

    +

    13.1 使用

    +

    这是一个1

    +

    13.2 定义

    +

    +

    13.3 放置

    +

    +

    通过一下代码可以将文章中所有的脚注定义集中于一处


      @@ -294,6 +387,9 @@
    +

    否则所有定义将被集中在文章末尾

    +

    14 扩展

    +

    From 97fe7ead59e1f0b735690c3914e43b9a4fe9410e Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 22:40:41 +0800 Subject: [PATCH 28/47] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20CrossDown/Core.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 2bd158d..39cb7db 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -171,6 +171,36 @@ class Syllabus(BlockProcessor): return False +class BoxBlockProcessor(BlockProcessor): + RE_FENCE_START = r'^ *!{3,} *\n' # start line, e.g., ` !!!! ` + RE_FENCE_END = r'\n *!{3,}\s*$' # last non-blank line, e.g, '!!!\n \n\n' + + def test(self, parent, block): + return re.match(self.RE_FENCE_START, block) + + def run(self, parent, blocks): + original_block = blocks[0] + blocks[0] = re.sub(self.RE_FENCE_START, '', blocks[0]) + + # Find block with ending fence + for block_num, block in enumerate(blocks): + if re.search(self.RE_FENCE_END, block): + # remove fence + blocks[block_num] = re.sub(self.RE_FENCE_END, '', block) + # render fenced area inside a new div + e = etree.SubElement(parent, 'div') + e.set('style', 'display: inline-block; border: 1px solid red;') + self.parser.parseBlocks(e, blocks[0:block_num + 1]) + # remove used blocks + for i in range(0, block_num + 1): + blocks.pop(0) + return True # or could have had no return statement + # No closing marker! Restore and do nothing + blocks[0] = original_block + return False # equivalent to our test() routine returning False + + + class Basic(Extension): """ 渲染基本样式 From f345be0894fcdb159d339419de4889ba2cec8b63 Mon Sep 17 00:00:00 2001 From: crossdark Date: Sat, 5 Oct 2024 23:14:40 +0800 Subject: [PATCH 29/47] =?UTF-8?q?1.5.1=E6=8F=90=E7=BA=B2=E6=8C=81=E7=BB=AD?= =?UTF-8?q?=E5=A4=B4=E7=96=BC=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 39cb7db..9939cab 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -143,32 +143,16 @@ class Syllabus_(InlineProcessor): class Syllabus(BlockProcessor): # 定义提纲的正则表达式 - ALERT_RE = r'(\d+(\.\d+)*)\s+(.*)' + syllabus_re = r'(\d+(\.\d+)*)\s+(.*)' def test(self, parent, block): # 检查当前块是否匹配我们的正则表达式 - return bool(self.ALERT_RE.match(block)) + return re.match(self.syllabus_re, block) def run(self, parent, blocks): # 处理匹配的块 - block = blocks.pop(0) - m = self.ALERT_RE.search(block) - if m: - before = block[:m.start()] # 匹配之前的文本 - after = block[m.end():] # 匹配之后的文本 - if before: - # 如果匹配之前有文本,则创建一个新的段落来包含它 - p = etree.SubElement(parent, 'p') - p.text = before.strip() - # 创建包含警告内容的 div 元素 - div = etree.SubElement(parent, 'div', {'class': 'alert'}) - div.text = m.group(1).strip() - # 如果匹配之后还有文本,则将其重新添加到块列表中以便后续处理 - if after.strip(): - blocks.insert(0, after) - else: - # 如果没有匹配,则保留原始块以便后续处理器处理 - return False + for num, block in enumerate(blocks): + pass class BoxBlockProcessor(BlockProcessor): @@ -188,7 +172,7 @@ class BoxBlockProcessor(BlockProcessor): # remove fence blocks[block_num] = re.sub(self.RE_FENCE_END, '', block) # render fenced area inside a new div - e = etree.SubElement(parent, 'div') + e = xml.etree.ElementTree.SubElement(parent, 'div') e.set('style', 'display: inline-block; border: 1px solid red;') self.parser.parseBlocks(e, blocks[0:block_num + 1]) # remove used blocks @@ -200,7 +184,6 @@ class BoxBlockProcessor(BlockProcessor): return False # equivalent to our test() routine returning False - class Basic(Extension): """ 渲染基本样式 From 97fe6ed5bd42000ef9612c5b60a10be911d9d5d0 Mon Sep 17 00:00:00 2001 From: crossdark Date: Sun, 6 Oct 2024 18:15:24 +0800 Subject: [PATCH 30/47] =?UTF-8?q?1.5.2=E6=8F=90=E7=BA=B2=E5=A5=BD=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 23 +++++++-- README.html | 124 ++++++---------------------------------------- README.md | 10 +++- 3 files changed, 43 insertions(+), 114 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 9939cab..f11b38b 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -150,9 +150,12 @@ class Syllabus(BlockProcessor): return re.match(self.syllabus_re, block) def run(self, parent, blocks): - # 处理匹配的块 - for num, block in enumerate(blocks): - pass + syllabus = re.match(self.syllabus_re, blocks[0]) # 匹配提纲的号和内容 + header = xml.etree.ElementTree.SubElement(parent, f'h{len(syllabus.group(1).split("."))}') # 按照提纲号等级创建标题 + header.set('id', syllabus.group(1)) # 设置提纲ID + header.text = syllabus.group(1) + ' ' + syllabus.group(3) # 设置提纲内容 + blocks[0] = '' + return False class BoxBlockProcessor(BlockProcessor): @@ -201,9 +204,19 @@ class Basic(Extension): r'\[(.*?)]-\((.*?)\)', tag='span', property_='title'), 'hide', 0 ) # [在指定的文本里面隐藏一段文本]-(只有鼠标放在上面才会显示隐藏文本) md.inlinePatterns.register(Emoji(r':(.+?):'), 'emoji', 0) # 将emoji短代码转换为emoji字符 - md.inlinePatterns.register(Syllabus(r'(\d+(\.\d+)*)\s+(.*)'), 'syllabus', 0) # 渲染提纲 + md.parser.blockprocessors.register(Syllabus(md.parser), 'syllabus', 11) # 渲染提纲 + + +class Box(Extension): + """ + 渲染外框 + """ + + def extendMarkdown(self, md): + md.registerExtension(self) # 注册扩展 + md.parser.blockprocessors.register(BoxBlockProcessor(md.parser), 'box', 175) def main(text: str) -> Tuple[str, Dict[str, List[str]]]: - md = Markdown(extensions=[Basic()] + list(Extensions.values()), safe_mode=False) + md = Markdown(extensions=[Basic(), Box()] + list(Extensions.values()), safe_mode=False) return md.convert(text), md.Meta diff --git a/README.html b/README.html index c4f3dfb..8a5a5ce 100644 --- a/README.html +++ b/README.html @@ -94,12 +94,10 @@
  • 7 提纲
  • -
  • 4 错误示范
  • 8 注释
  • -
  • 14 扩展
  • +
  • 14 外框 +
  • CrossDown

    自制的markdown,添加了一些自定义的语法klzzwxh:0001效果请见klzzwxh:0000

    -

    1 基本语法

    -

    -

    1.1 标题

    -

    一级标题

    二级标题

    三级标题

    四级标题

    五级标题
    六级标题
    -

    1.2 样式

    -

    -

    1.2.1 斜体

    -

    -

    1.2.2 粗体

    -

    -

    1.2.3 粗斜体

    -

    -

    1.2.4 下划线

    -

    -

    1.2.5 删除线

    -

    -

    1.2.6 高亮

    -

    -

    1.2.7 在文本的正上方添加一行小文本主要用于标拼音

    -

    -

    1.2.8 在指定的文本里面隐藏一段文本

    -

    -

    1.2.9 分割线

    -




    -

    1.3 链接

    -

    -

    1.3.1 普通链接

    -

    链接文本

    CrossDark

    https://crossdark.net/

    -

    1.3.2 图片

    -

    链接图片

    sea

    -

    1.3.3 变量链接

    -

    链接文本

    -

    2 缩写

    -

    -

    2.1 定义

    -

    -

    2.2 赋值

    -

    直接在文本中使用 缩写 即可

    -

    3 锚点

    -

    {#锚点名}

    -

    4 代码块

    -

    -

    4.1 单行

    -

    -

    4.1.1 LaTex

    -

    $CO_2$

    $H_2O$

    -

    4.1.2 函数

    -

    ¥y=x*2+1¥ // 不定义范围

    ¥y=x**2¥€-50,50€ // 定义了x范围

    ¥y=x**3¥€-50,50|-100,100€ // 定义了y范围

    -

    4.1.3 强调

    -

    {强调文本}

    -

    4.2 多行

    -

    -

    4.2.1 YAML

    -

    A:
             1. a
             2. b
    @@ -238,15 +185,11 @@
             - c
         
    -

    4.2.2 Python

    -

    print('CrossDown')
         
    -

    4.2.3 Mermaid

    -

    graph LR
             A-->B
             A-->C
    @@ -254,15 +197,11 @@
             C-->D
         
    -

    5 转义

    -

    \

    \a

    *

    -

    6 引用

    -

    一级引用

    @@ -280,58 +219,36 @@
    -

    引文内添加klzzwxhklzzwxhklzzwxh:00990096klzzwxh:0097

    +

    引文内添加klzzwxhklzzwxhklzzwxh:00420039klzzwxh:0040

    -

    7 提纲

    -

    -

    7.1 提纲号

    -

    以数字和点组成,通过空格与提纲名分隔,例如:

    -

    7.1.1 提纲号示例

    -

    点不能出现在开头或结尾,例如

    -

    .

    7.1.2 错误示范

    -

    +

    .7.1.2 错误示范

    7.1.3. 错误示范

    不能出现两个及以上连续的点,例如:

    -

    7..1…

    4 错误示范

    -

    +

    7..1…4 错误示范

    提纲号会被自动配置为锚点,可直接使用{7}76.1}

    -

    8 注释

    -

    -

    8.1 强注释

    -

    -

    |=klzzwxhklzzwxhklzzwxh:00690064klzzwxh:0067=|

    -

    +

    |=klzzwxhklzzwxhklzzwxh:00310026klzzwxh:0029=|

    8.2 弱注释

    -

    只有在 // 后面才会被移除

    // 代码中的注释弱不会被移除

    -

    9 列表

    -

    -

    9.1 有序列表

    -

    1. a
    2. b
    3. c
    4. d
    -

    -

    9.2 无序列表klzzwxhklzzwxhklzzwxh:00800077- Cklzzwxh:0078- D

    -

    -

    +

    9.2 无序列表

    10 表格

    -

    @@ -353,31 +270,19 @@
    -

    11 警告

    -

    警告标题

    警告内容

    -

    12 Emoji

    -

    🚴

    这是一个笑脸😃图案

    -

    13 脚注

    -

    -

    13.1 使用

    -

    这是一个1

    -

    13.2 定义

    -

    -

    13.3 放置

    -

    通过一下代码可以将文章中所有的脚注定义集中于一处


    @@ -388,8 +293,11 @@

    否则所有定义将被集中在文章末尾

    -

    -

    14 扩展

    -

    +

    14 外框

    +

    14.1 警告

    +

    !!!警告!!!

    +
    +

    这是一条警告

    +
    diff --git a/README.md b/README.md index f377e5e..f6f1b3e 100644 --- a/README.md +++ b/README.md @@ -242,4 +242,12 @@ graph LR 否则所有定义将被集中在文章末尾 -14 扩展 +14 外框 + +14.1 警告 + +!!!警告!!! + +!!! +这是一条警告 +!!! From 235d9228831551e9a629c8e4a6551c0ff4a1931a Mon Sep 17 00:00:00 2001 From: crossdark Date: Sun, 6 Oct 2024 22:00:55 +0800 Subject: [PATCH 31/47] =?UTF-8?q?1.6=E6=8F=90=E9=86=92=E5=88=B6=E4=BD=9C?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 28 +++++++++++++++++++--------- README.html | 6 +++++- README.md | 6 ++++++ run.py | 1 - 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index f11b38b..df88a35 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -158,25 +158,28 @@ class Syllabus(BlockProcessor): return False -class BoxBlockProcessor(BlockProcessor): - RE_FENCE_START = r'^ *!{3,} *\n' # start line, e.g., ` !!!! ` - RE_FENCE_END = r'\n *!{3,}\s*$' # last non-blank line, e.g, '!!!\n \n\n' +class BoxBlock(BlockProcessor): + def __init__(self, parser, re_start, re_end, style): + super().__init__(parser) + self.re_start = re_start # start line, e.g., ` !!!! + self.re_end = re_end # last non-blank line, e.g, '!!!\n \n\n' + self.style = style def test(self, parent, block): - return re.match(self.RE_FENCE_START, block) + return re.match(self.re_start, block) def run(self, parent, blocks): original_block = blocks[0] - blocks[0] = re.sub(self.RE_FENCE_START, '', blocks[0]) + blocks[0] = re.sub(self.re_start, '', blocks[0]) # Find block with ending fence for block_num, block in enumerate(blocks): - if re.search(self.RE_FENCE_END, block): + if re.search(self.re_end, block): # remove fence - blocks[block_num] = re.sub(self.RE_FENCE_END, '', block) + blocks[block_num] = re.sub(self.re_end, '', block) # render fenced area inside a new div e = xml.etree.ElementTree.SubElement(parent, 'div') - e.set('style', 'display: inline-block; border: 1px solid red;') + e.set('style', self.style) self.parser.parseBlocks(e, blocks[0:block_num + 1]) # remove used blocks for i in range(0, block_num + 1): @@ -214,7 +217,14 @@ class Box(Extension): def extendMarkdown(self, md): md.registerExtension(self) # 注册扩展 - md.parser.blockprocessors.register(BoxBlockProcessor(md.parser), 'box', 175) + # 红框警告 + md.parser.blockprocessors.register(BoxBlock( + md.parser, r'^ *!{3,} *\n', r'\n *!{3,}\s*$', 'display: inline-block; border: 1px solid red;' + ), 'warning_box', 175) # 块 + # 黄框提醒 + md.parser.blockprocessors.register(BoxBlock( + md.parser, r'^ *!{2,} *\n', r'\n *!{2,}\s*$', 'display: inline-block; border: 1px solid yellow;' + ), 'reminding_box', 175) def main(text: str) -> Tuple[str, Dict[str, List[str]]]: diff --git a/README.html b/README.html index 8a5a5ce..40f7aa5 100644 --- a/README.html +++ b/README.html @@ -4,7 +4,6 @@ UTF-8编码示例 - @@ -119,6 +118,7 @@
  • 14 外框
  • @@ -299,5 +299,9 @@

    这是一条警告

    +

    14.2 提醒

    +
    +

    这是一条提醒

    +
    diff --git a/README.md b/README.md index f6f1b3e..5e7fe8d 100644 --- a/README.md +++ b/README.md @@ -251,3 +251,9 @@ graph LR !!! 这是一条警告 !!! + +14.2 提醒 + +!! +这是一条提醒 +!! diff --git a/run.py b/run.py index 4b00fee..51d28cb 100644 --- a/run.py +++ b/run.py @@ -17,7 +17,6 @@ if __name__ == '__main__': UTF-8编码示例 - {indent(HEAD)} From abb07507aeeb44c5e4684834a69d63b0ce81516f Mon Sep 17 00:00:00 2001 From: crossdark Date: Sun, 6 Oct 2024 22:22:53 +0800 Subject: [PATCH 32/47] =?UTF-8?q?1.6.1=E9=94=9A=E7=82=B9=E5=BC=80=E5=A7=8B?= =?UTF-8?q?=E5=A4=B4=E7=96=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 83 +++++++++++++++++++++++++++++------------------ README.html | 48 ++++++++++++++------------- README.md | 5 ++- 3 files changed, 82 insertions(+), 54 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index df88a35..defa090 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -20,7 +20,7 @@ Extensions = { "Tables": "markdown.extensions.tables", # "Smart Strong": "markdown.extensions.smart_strong", "Admonition": "markdown.extensions.admonition", - "CodeHilite": "markdown.extensions.codehilite", + # "CodeHilite": "markdown.extensions.codehilite", # "HeaderId": "markdown.extensions.headerid", "Meta-Data": "markdown.extensions.meta", "New Line to Break": "markdown.extensions.nl2br", @@ -42,6 +42,7 @@ class Simple(InlineProcessor): """ 可通过简单的正则表达式和HTML标签实现的样式 """ + def __init__(self, pattern: str, tag: str): """ 初始化 @@ -62,6 +63,7 @@ class Nest(InlineProcessor): """ 需要嵌套HTML标签实现的样式 """ + def __init__(self, pattern: str, outer_tag: str, inner_tag: str): """ 初始化 @@ -86,21 +88,24 @@ class ID(InlineProcessor): """ 需要对HTML标签设置ID实现的样式 """ - def __init__(self, pattern: str, tag: str, property_: str): + + def __init__(self, pattern: str, tag: str, property_: str, value: Union[str, bool, int] = None): """ 初始化 :param pattern: 正则表达式 :param tag: html标签 :param property_: html标签属性名称 + :param value: html标签属性的值 """ super().__init__(pattern) self.tag = tag self.property = property_ + self.value = value def handleMatch(self, match, match_line): tag = xml.etree.ElementTree.Element(self.tag) # 创建标签 tag.text = match.group(1) # 设置标签内容 - tag.set(self.property, match.group(2)) # 设置标签属性 + tag.set(self.property, match.group(2) if self.value is None else self.value) # 设置标签属性,属性的值默认为第二个匹配组 return tag, match.start(), match.end() @@ -159,35 +164,35 @@ class Syllabus(BlockProcessor): class BoxBlock(BlockProcessor): - def __init__(self, parser, re_start, re_end, style): - super().__init__(parser) - self.re_start = re_start # start line, e.g., ` !!!! - self.re_end = re_end # last non-blank line, e.g, '!!!\n \n\n' - self.style = style + def __init__(self, parser, re_start, re_end, style): + super().__init__(parser) + self.re_start = re_start # start line, e.g., ` !!!! + self.re_end = re_end # last non-blank line, e.g, '!!!\n \n\n' + self.style = style - def test(self, parent, block): - return re.match(self.re_start, block) + def test(self, parent, block): + return re.match(self.re_start, block) - def run(self, parent, blocks): - original_block = blocks[0] - blocks[0] = re.sub(self.re_start, '', blocks[0]) + def run(self, parent, blocks): + original_block = blocks[0] + blocks[0] = re.sub(self.re_start, '', blocks[0]) - # Find block with ending fence - for block_num, block in enumerate(blocks): - if re.search(self.re_end, block): - # remove fence - blocks[block_num] = re.sub(self.re_end, '', block) - # render fenced area inside a new div - e = xml.etree.ElementTree.SubElement(parent, 'div') - e.set('style', self.style) - self.parser.parseBlocks(e, blocks[0:block_num + 1]) - # remove used blocks - for i in range(0, block_num + 1): - blocks.pop(0) - return True # or could have had no return statement - # No closing marker! Restore and do nothing - blocks[0] = original_block - return False # equivalent to our test() routine returning False + # Find block with ending fence + for block_num, block in enumerate(blocks): + if re.search(self.re_end, block): + # remove fence + blocks[block_num] = re.sub(self.re_end, '', block) + # render fenced area inside a new div + e = xml.etree.ElementTree.SubElement(parent, 'div') + e.set('style', self.style) + self.parser.parseBlocks(e, blocks[0:block_num + 1]) + # remove used blocks + for i in range(0, block_num + 1): + blocks.pop(0) + return True # or could have had no return statement + # No closing marker! Restore and do nothing + blocks[0] = original_block + return False # equivalent to our test() routine returning False class Basic(Extension): @@ -218,15 +223,31 @@ class Box(Extension): def extendMarkdown(self, md): md.registerExtension(self) # 注册扩展 # 红框警告 + md.inlinePatterns.register(ID( + r'!{3,}(.+?)!{3,}', tag='div', property_='style', value='display: inline-block; border: 1px solid red;' + ), 'warning_in_line', 0 + ) # 行内 md.parser.blockprocessors.register(BoxBlock( md.parser, r'^ *!{3,} *\n', r'\n *!{3,}\s*$', 'display: inline-block; border: 1px solid red;' ), 'warning_box', 175) # 块 # 黄框提醒 + md.inlinePatterns.register(ID( + r'!{2,}(.+?)!{2,}', tag='div', property_='style', value='display: inline-block; border: 1px solid yellow;' + ), 'reminding_in_line', 0 + ) # 行内 md.parser.blockprocessors.register(BoxBlock( md.parser, r'^ *!{2,} *\n', r'\n *!{2,}\s*$', 'display: inline-block; border: 1px solid yellow;' - ), 'reminding_box', 175) + ), 'reminding_box', 175) # 块 + + +class Anchor(Extension): + def extendMarkdown(self, md): + md.registerExtension(self) # 注册扩展 + md.inlinePatterns.register(ID( + r'\{#([^{}#]+)}', tag='span', property_='id'), 'hide', 0 + ) # 定义锚点 def main(text: str) -> Tuple[str, Dict[str, List[str]]]: - md = Markdown(extensions=[Basic(), Box()] + list(Extensions.values()), safe_mode=False) + md = Markdown(extensions=[Basic(), Box(), Anchor()] + list(Extensions.values()), safe_mode=False) return md.convert(text), md.Meta diff --git a/README.html b/README.html index 40f7aa5..5b2d5b9 100644 --- a/README.html +++ b/README.html @@ -175,28 +175,25 @@

    {强调文本}

    4.2 多行

    4.2.1 YAML

    -
    A:
    -        1. a
    -        2. b
    -        3. c
    -    B:
    -        - a
    -        - b
    -        - c
    -    
    - +
    A:
    +        1. a
    +        2. b
    +        3. c
    +    B:
    +        - a
    +        - b
    +        - c
    +    

    4.2.2 Python

    -
    print('CrossDown')
    -    
    - +
    print('CrossDown')
    +    

    4.2.3 Mermaid

    -
    graph LR
    -        A-->B
    -        A-->C
    -        B-->D
    -        C-->D
    -    
    - +
    graph LR
    +        A-->B
    +        A-->C
    +        B-->D
    +        C-->D
    +    

    5 转义

    \

    \a

    @@ -219,7 +216,7 @@ -

    引文内添加klzzwxhklzzwxhklzzwxh:00420039klzzwxh:0040

    +

    引文内添加klzzwxhklzzwxhklzzwxh:00440041klzzwxh:0042

    7 提纲

    7.1 提纲号

    @@ -248,6 +245,12 @@
  • d
  • 9.2 无序列表

    +
      +
    • A
    • +
    • B
    • +
    • C
    • +
    • D
    • +

    10 表格

    @@ -295,11 +298,12 @@

    否则所有定义将被集中在文章末尾

    14 外框

    14.1 警告

    -

    !!!警告!!!

    +

    这是一个

    警告
    ……

    这是一条警告

    14.2 提醒

    +

    这是一个

    提醒
    ……

    这是一条提醒

    diff --git a/README.md b/README.md index 5e7fe8d..b633f23 100644 --- a/README.md +++ b/README.md @@ -201,6 +201,7 @@ graph LR 4. d 9.2 无序列表 + - A - B - C @@ -246,7 +247,7 @@ graph LR 14.1 警告 -!!!警告!!! +这是一个!!!警告!!!…… !!! 这是一条警告 @@ -254,6 +255,8 @@ graph LR 14.2 提醒 +这是一个!!提醒!!…… + !! 这是一条提醒 !! From 0fef493d04ce617477c3837f2fc54c0975af5b45 Mon Sep 17 00:00:00 2001 From: crossdark Date: Sun, 6 Oct 2024 22:53:00 +0800 Subject: [PATCH 33/47] =?UTF-8?q?1.6.2=E9=94=9A=E7=82=B9=E5=A4=B4=E7=96=BC?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 31 +++++++------------------------ 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index defa090..bc00314 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -89,13 +89,13 @@ class ID(InlineProcessor): 需要对HTML标签设置ID实现的样式 """ - def __init__(self, pattern: str, tag: str, property_: str, value: Union[str, bool, int] = None): + def __init__(self, pattern: str, tag: str, property_: str, value: Union[str, bool] = None): """ 初始化 :param pattern: 正则表达式 :param tag: html标签 :param property_: html标签属性名称 - :param value: html标签属性的值 + :param value: html标签属性的值 不设置时为第二个匹配组,设置为整数时则为指定的匹配组,设置为字符串则为原始字符串 """ super().__init__(pattern) self.tag = tag @@ -126,26 +126,6 @@ class Emoji(InlineProcessor): return emoji.emojize(match.group(0)), match.start(), match.end() -class Syllabus_(InlineProcessor): - """ - 需要对HTML标签设置ID实现的样式 - """ - - def __init__(self, pattern: str): - """ - 初始化 - :param pattern: 正则表达式 - """ - super().__init__(pattern) - - def handleMatch(self, match, match_line): - tag = xml.etree.ElementTree.Element(f'h{len(match.group(1).split("."))}') # 创建标签 - tag.text = match.group(1) + ' ' + match.group(3) # 设置标签内容 - tag.set('id', match.group(1)) # 设置标签属性 - - return tag, match.start(), match.end() - - class Syllabus(BlockProcessor): # 定义提纲的正则表达式 syllabus_re = r'(\d+(\.\d+)*)\s+(.*)' @@ -244,10 +224,13 @@ class Anchor(Extension): def extendMarkdown(self, md): md.registerExtension(self) # 注册扩展 md.inlinePatterns.register(ID( - r'\{#([^{}#]+)}', tag='span', property_='id'), 'hide', 0 + r'\{#([^{}#]+)}', tag='span', property_='id', value=1), 'hide', 0 + ) # 定义锚点 + md.inlinePatterns.register(ID( + r'\{([^{}#]+)}', tag='span', property_='id', value=1), 'hide', 0 ) # 定义锚点 def main(text: str) -> Tuple[str, Dict[str, List[str]]]: - md = Markdown(extensions=[Basic(), Box(), Anchor()] + list(Extensions.values()), safe_mode=False) + md = Markdown(extensions=[Basic(), Box()] + list(Extensions.values()), safe_mode=False) return md.convert(text), md.Meta From dfbf9371a5604d6134dacfd1d9bd6e30925d9095 Mon Sep 17 00:00:00 2001 From: crossdark Date: Mon, 7 Oct 2024 18:11:00 +0800 Subject: [PATCH 34/47] =?UTF-8?q?1.6.3=E9=94=9A=E7=82=B9=E6=90=9E=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 28 +++++++++++++++++++++------- README.html | 17 ++++++++++++----- README.md | 6 ++++++ 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index bc00314..58b6fb4 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -175,6 +175,24 @@ class BoxBlock(BlockProcessor): return False # equivalent to our test() routine returning False +class _Anchor(InlineProcessor): + def handleMatch(self, match, match_line): + tag = xml.etree.ElementTree.Element('span') # 创建标签 + tag.text = match.group(1) + tag.set('id', match.group(1)) # 设置id + + return tag, match.start(), match.end() + + +class LinkLine(InlineProcessor): + def handleMatch(self, match, match_line): + tag = xml.etree.ElementTree.Element('a') # 创建标签 + tag.set('href', '#' + match.group(1)) # 设置id + tag.text = match.group(1) + + return tag, match.start(), match.end() + + class Basic(Extension): """ 渲染基本样式 @@ -223,14 +241,10 @@ class Box(Extension): class Anchor(Extension): def extendMarkdown(self, md): md.registerExtension(self) # 注册扩展 - md.inlinePatterns.register(ID( - r'\{#([^{}#]+)}', tag='span', property_='id', value=1), 'hide', 0 - ) # 定义锚点 - md.inlinePatterns.register(ID( - r'\{([^{}#]+)}', tag='span', property_='id', value=1), 'hide', 0 - ) # 定义锚点 + md.inlinePatterns.register(_Anchor(r'\{#([^{}#]+)}'), 'anchor', 0) # 定义锚点 + md.inlinePatterns.register(LinkLine(r'\{([^{}#]+)}'), 'line_link', 0) # 添加页内链接 def main(text: str) -> Tuple[str, Dict[str, List[str]]]: - md = Markdown(extensions=[Basic(), Box()] + list(Extensions.values()), safe_mode=False) + md = Markdown(extensions=[Basic(), Box(), Anchor()] + list(Extensions.values())) return md.convert(text), md.Meta diff --git a/README.html b/README.html index 5b2d5b9..3131b4e 100644 --- a/README.html +++ b/README.html @@ -72,7 +72,11 @@
  • 2.2 赋值
  • -
  • 3 锚点
  • +
  • 3 锚点 +
  • 4 代码块
    • 4.1 单行
      • 4.1.1 LaTex
      • @@ -161,7 +165,10 @@

        2.2 赋值

        直接在文本中使用 缩写 即可

        3 锚点

        -

        {#锚点名}

        +

        3.1 定义

        +

        锚点名

        +

        3.2 页内链接

        +

        锚点名

        4 代码块

        4.1 单行

        4.1.1 LaTex

        @@ -216,7 +223,7 @@ -

        引文内添加klzzwxhklzzwxhklzzwxh:00440041klzzwxh:0042

        +

        引文内添加klzzwxhklzzwxhklzzwxh:00470044klzzwxh:0045

        7 提纲

        7.1 提纲号

        @@ -227,10 +234,10 @@

        7.1.3. 错误示范

        不能出现两个及以上连续的点,例如:

        7..1…4 错误示范

        -

        提纲号会被自动配置为锚点,可直接使用{7}76.1}

        +

        提纲号会被自动配置为锚点,可直接使用776.1}

        8 注释

        8.1 强注释

        -

        |=klzzwxhklzzwxhklzzwxh:00310026klzzwxh:0029=|

        +

        |=klzzwxhklzzwxhklzzwxh:00340029klzzwxh:0032=|

        8.2 弱注释

        diff --git a/README.md b/README.md index b633f23..219abea 100644 --- a/README.md +++ b/README.md @@ -80,8 +80,14 @@ ___ 3 锚点 +3.1 定义 + {#锚点名} +3.2 页内链接 + +{锚点名} + 4 代码块 4.1 `单行` From b22a4f319ed1f3b0568d10b7c80abde9500ea56e Mon Sep 17 00:00:00 2001 From: crossdark Date: Wed, 9 Oct 2024 22:25:56 +0800 Subject: [PATCH 35/47] =?UTF-8?q?1.7=20latex=E5=A5=BD=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 23 +++++++++++++++++++++-- README.html | 4 ++-- README.md | 4 ++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 58b6fb4..2eabd9d 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -193,6 +193,19 @@ class LinkLine(InlineProcessor): return tag, match.start(), match.end() +class CodeLine(Treeprocessor): + def run(self, root): + for elem in root.iter('p'): # 在所有段落中查找单行代码 + if elem.findall('code'): # 找到单行代码 + for code in elem: + if re.match(r'\$[^$]*\$', code.text): # 渲染Latex + if isinstance(elem.text, str): + elem.text += fr'\({code.text[1:-1]}\){code.tail}' + else: + elem.text = fr'\({code.text}\)' + elem.remove(code) + + class Basic(Extension): """ 渲染基本样式 @@ -239,12 +252,18 @@ class Box(Extension): class Anchor(Extension): - def extendMarkdown(self, md): + def extendMarkdown(self, md: Markdown): md.registerExtension(self) # 注册扩展 md.inlinePatterns.register(_Anchor(r'\{#([^{}#]+)}'), 'anchor', 0) # 定义锚点 md.inlinePatterns.register(LinkLine(r'\{([^{}#]+)}'), 'line_link', 0) # 添加页内链接 +class Code(Extension): + def extendMarkdown(self, md: Markdown) -> None: + md.registerExtension(self) # 注册扩展 + md.treeprocessors.register(CodeLine(), 'code_block', 0) # 渲染多行代码块 + + def main(text: str) -> Tuple[str, Dict[str, List[str]]]: - md = Markdown(extensions=[Basic(), Box(), Anchor()] + list(Extensions.values())) + md = Markdown(extensions=[Basic(), Box(), Anchor()] + list(Extensions.values()) + [Code()]) return md.convert(text), md.Meta diff --git a/README.html b/README.html index 3131b4e..ea43ae0 100644 --- a/README.html +++ b/README.html @@ -172,8 +172,8 @@

        4 代码块

        4.1 单行

        4.1.1 LaTex

        -

        $CO_2$

        -

        $H_2O$

        +

        这是\(CO_2\)二氧化碳

        +

        这是\(H_2O\)水

        4.1.2 函数

        ¥y=x*2+1¥ // 不定义范围

        ¥y=x**2¥€-50,50€ // 定义了x范围

        diff --git a/README.md b/README.md index 219abea..b795604 100644 --- a/README.md +++ b/README.md @@ -94,9 +94,9 @@ ___ 4.1.1 LaTex -`$CO_2$` +这是`$CO_2$`二氧化碳 -`$H_2O$` +这是`$H_2O$`水 4.1.2 函数 From 30670780e8a892a1c0830b8eb5ee9d5ea2b43418 Mon Sep 17 00:00:00 2001 From: crossdark Date: Thu, 10 Oct 2024 18:32:52 +0800 Subject: [PATCH 36/47] =?UTF-8?q?1.7.1=20=E5=BC=BA=E8=B0=83=E5=A5=BD?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 15 ++++++++++++--- README.html | 12 ++++++------ README.md | 10 +++++----- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 2eabd9d..a532a9c 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -199,11 +199,20 @@ class CodeLine(Treeprocessor): if elem.findall('code'): # 找到单行代码 for code in elem: if re.match(r'\$[^$]*\$', code.text): # 渲染Latex - if isinstance(elem.text, str): - elem.text += fr'\({code.text[1:-1]}\){code.tail}' + if isinstance(elem.text, str): # 这个段落还有其它内容 + elem.text += fr'\({code.text[1:-1]}\){code.tail}' # 插入latex else: - elem.text = fr'\({code.text}\)' + elem.text = fr'\({code.text}\)' # latex是段落中唯一的内容 elem.remove(code) + elif re.match(r'¥[^$]*¥', code.text): # 是数学函数(单行) + if EXTRA_ABLE: + expression, range_ = re.findall(r'¥([^$]*)¥(€[^$]*€)?', code)[0] # 分离表达式与范围(如果有) + x_r = (-10, 10) + y_r = (-20, 20) + elif re.match(r'\{[^$]*}', code.text): # 是强调 + code.tag = 'span' + code.set('class', 'block') + code.text = code.text[1:-1] class Basic(Extension): diff --git a/README.html b/README.html index ea43ae0..f284751 100644 --- a/README.html +++ b/README.html @@ -179,7 +179,7 @@

        ¥y=x**2¥€-50,50€ // 定义了x范围

        ¥y=x**3¥€-50,50|-100,100€ // 定义了y范围

        4.1.3 强调

        -

        {强调文本}

        +

        强调文本

        4.2 多行

        4.2.1 YAML

        A:
        @@ -195,11 +195,11 @@
             
        print('CrossDown')
             

        4.2.3 Mermaid

        -
        graph LR
        -        A-->B
        -        A-->C
        -        B-->D
        -        C-->D
        +    
        graph TD  
        +        A[开始]-->B[流程]  
        +        B-->C{判断}  
        +        C-->|结果1|D[结束1]  
        +        C-->|结果2|E[结束2]
             

        5 转义

        \

        diff --git a/README.md b/README.md index b795604..a7094db 100644 --- a/README.md +++ b/README.md @@ -134,11 +134,11 @@ print('CrossDown') 4.2.3 Mermaid ```mermaid -graph LR - A-->B - A-->C - B-->D - C-->D +graph TD + A[开始]-->B[流程] + B-->C{判断} + C-->|结果1|D[结束1] + C-->|结果2|E[结束2] ``` 5 转义 From 990f72763a9725cb2c11cc2799ce2673fcfe0b3c Mon Sep 17 00:00:00 2001 From: crossdark Date: Fri, 11 Oct 2024 17:01:00 +0800 Subject: [PATCH 37/47] =?UTF-8?q?1.7.2=20=E5=87=BD=E6=95=B0=E5=A5=BD?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 18 ++++++++++++++---- CrossDown/Extra.py | 40 ++++++++++++++++++++++++++++++++++++++++ README.html | 6 +++--- 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index a532a9c..1a401b9 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -31,9 +31,8 @@ Extensions = { } try: # 检测当前平台是否支持扩展语法 - import Extra - - Extensions += Extra.EXTRA + from .Extra import * + EXTRA_ABLE = True except ModuleNotFoundError: EXTRA_ABLE = False @@ -206,9 +205,20 @@ class CodeLine(Treeprocessor): elem.remove(code) elif re.match(r'¥[^$]*¥', code.text): # 是数学函数(单行) if EXTRA_ABLE: - expression, range_ = re.findall(r'¥([^$]*)¥(€[^$]*€)?', code)[0] # 分离表达式与范围(如果有) + expression, range_ = re.findall(r'¥([^$]*)¥(€[^$]*€)?', code.text)[0] # 分离表达式与范围(如果有) x_r = (-10, 10) y_r = (-20, 20) + if range_ != '': # 定义了范围 + ranges = range_[1:-1].split('|') + if len(ranges) in (1, 2): # 定义的范围正确 + x_r = tuple(int(i) for i in ranges[0].split(',')) + if len(ranges) == 2: # 定义了y范围 + y_r = tuple(int(i) for i in ranges[1].split(',')) + code.tag = 'img' + code.set('src', f"""data:image/png;base64,{(function_drawing( + function=lambda x: eval(expression.split('=')[1]), x_range=x_r, y_range=y_r + ))}""") # 绘制函数图像 + code.set('alt', 'Base64 函数图片') elif re.match(r'\{[^$]*}', code.text): # 是强调 code.tag = 'span' code.set('class', 'block') diff --git a/CrossDown/Extra.py b/CrossDown/Extra.py index 45f343c..40efbb1 100644 --- a/CrossDown/Extra.py +++ b/CrossDown/Extra.py @@ -1,3 +1,43 @@ +import matplotlib.pyplot as plt +import numpy as np +import base64 +from io import BytesIO + + EXTRA = [ ] + + +def function_drawing(function, x_range=(-10, 10), y_range=(-20, 20), dpi=100): + # 创建一个图像和坐标轴对象 + fig, ax = plt.subplots() + + # 生成x值 + x = np.linspace(x_range[0], x_range[1], 400) + + # 计算y值 + y = function(x) + + # 绘制图像 + ax.plot(x, y) + + # 设置坐标轴范围 + ax.set_xlim(x_range) + ax.set_ylim(y_range) + + # 隐藏坐标轴 + ax.axis('on') + + # 将图像保存到BytesIO对象 + buf = BytesIO() + fig.savefig(buf, format='png', dpi=dpi) + + # 获取图像数据的Base64编码 + data = base64.b64encode(buf.getbuffer()).decode("ascii") + + # 关闭图像和坐标轴对象 + plt.close(fig) + + # 返回Base64编码的字符串 + return data diff --git a/README.html b/README.html index f284751..5e80a9e 100644 --- a/README.html +++ b/README.html @@ -175,9 +175,9 @@

        这是\(CO_2\)二氧化碳

        这是\(H_2O\)水

        4.1.2 函数

        -

        ¥y=x*2+1¥ // 不定义范围

        -

        ¥y=x**2¥€-50,50€ // 定义了x范围

        -

        ¥y=x**3¥€-50,50|-100,100€ // 定义了y范围

        +

        Base64 函数图片 // 不定义范围

        +

        Base64 函数图片 // 定义了x范围

        +

        Base64 函数图片 // 定义了y范围

        4.1.3 强调

        强调文本

        4.2 多行

        From bfe171fade915b299a277cdc982f6c33f2a74ba0 Mon Sep 17 00:00:00 2001 From: crossdark Date: Fri, 11 Oct 2024 17:54:30 +0800 Subject: [PATCH 38/47] =?UTF-8?q?1.7.3=20=E4=BF=AE=E5=A4=8D=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E9=83=A8=E5=88=86=E4=B9=B1=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 25 +++++++++++++++---------- CrossDown/__init__.py | 7 +------ README.html | 19 +++++++++---------- README.md | 1 - 4 files changed, 25 insertions(+), 27 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 1a401b9..0051ede 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -12,22 +12,16 @@ import emoji Extensions = { "Extra": "markdown.extensions.extra", - "Abbreviations": "markdown.extensions.abbr", - "Attribute Lists": "markdown.extensions.attr_list", - "Definition Lists": "markdown.extensions.def_list", - "Fenced Code Blocks": "markdown.extensions.fenced_code", - "Footnotes": "markdown.extensions.footnotes", - "Tables": "markdown.extensions.tables", # "Smart Strong": "markdown.extensions.smart_strong", "Admonition": "markdown.extensions.admonition", # "CodeHilite": "markdown.extensions.codehilite", # "HeaderId": "markdown.extensions.headerid", "Meta-Data": "markdown.extensions.meta", - "New Line to Break": "markdown.extensions.nl2br", + # "New Line to Break": "markdown.extensions.nl2br", "Sane Lists": "markdown.extensions.sane_lists", - "SmartyPants": "markdown.extensions.smarty", + # "SmartyPants": "markdown.extensions.smarty", "Table of Contents": "markdown.extensions.toc", - "WikiLinks": "markdown.extensions.wikilinks", + # "WikiLinks": "markdown.extensions.wikilinks", } try: # 检测当前平台是否支持扩展语法 @@ -225,6 +219,16 @@ class CodeLine(Treeprocessor): code.text = code.text[1:-1] +class CodeBlock(Treeprocessor): + def run(self, root): + for elem in root: # 在所有段落中查找单行代码 + print(elem.tag) + print(elem.text) + print('----------------------------------------------------------------------------------------') + for code in elem.findall('code'): # 找到代码块 + pass + + class Basic(Extension): """ 渲染基本样式 @@ -280,7 +284,8 @@ class Anchor(Extension): class Code(Extension): def extendMarkdown(self, md: Markdown) -> None: md.registerExtension(self) # 注册扩展 - md.treeprocessors.register(CodeLine(), 'code_block', 0) # 渲染多行代码块 + md.treeprocessors.register(CodeLine(), 'code_line', 0) # 渲染单行代码块 + md.treeprocessors.register(CodeBlock(), 'code_block', 0) # 渲染多行代码块 def main(text: str) -> Tuple[str, Dict[str, List[str]]]: diff --git a/CrossDown/__init__.py b/CrossDown/__init__.py index 5f80377..6e2ee5a 100644 --- a/CrossDown/__init__.py +++ b/CrossDown/__init__.py @@ -31,12 +31,7 @@ HEAD = ( BODY = ( '', - '', ) diff --git a/README.html b/README.html index 5e80a9e..22133f9 100644 --- a/README.html +++ b/README.html @@ -19,12 +19,7 @@ -
          @@ -128,7 +123,8 @@

        CrossDown

        -

        自制的markdown,添加了一些自定义的语法klzzwxh:0001效果请见klzzwxh:0000

        +

        自制的markdown,添加了一些自定义的语法 + 效果请见README.html

        1 基本语法

        1.1 标题

        一级标题

        @@ -223,7 +219,7 @@ -

        引文内添加klzzwxhklzzwxhklzzwxh:00470044klzzwxh:0045

        +

        引文内添加klzzwxhklzzwxhklzzwxh:00390036klzzwxh:0037

        7 提纲

        7.1 提纲号

        @@ -233,11 +229,14 @@

        .7.1.2 错误示范

        7.1.3. 错误示范

        不能出现两个及以上连续的点,例如:

        -

        7..1…4 错误示范

        +

        7..1...4 错误示范

        提纲号会被自动配置为锚点,可直接使用776.1}

        8 注释

        8.1 强注释

        -

        |=klzzwxhklzzwxhklzzwxh:00340029klzzwxh:0032=|

        +

        |= + 无论如何都会被移除 + 放在代码块里也没用 + =|

        8.2 弱注释

        diff --git a/README.md b/README.md index a7094db..e643eb1 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ Title: CrossDown示例 Summary: 够简洁的了 Authors: CrossDark Date: __date__ -blank-value: g base_url: http://crossdark.net:3000/crossdark/CrossDown [TOC] From 7c7efb86776b556f8344a226e196e8cdce17c019 Mon Sep 17 00:00:00 2001 From: crossdark Date: Sun, 13 Oct 2024 14:19:47 +0800 Subject: [PATCH 39/47] =?UTF-8?q?1.7.4=20=E6=9B=B4=E6=96=B0=E4=BA=86?= =?UTF-8?q?=E6=89=A9=E5=B1=95=E8=B0=83=E7=94=A8=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 25 ++++++++++++------------- README.html | 4 ++-- README.md | 2 +- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 0051ede..3de7a8e 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -1,4 +1,5 @@ -from markdown.extensions import Extension +from markdown.extensions import Extension, extra, admonition, meta, sane_lists, toc + from markdown.treeprocessors import Treeprocessor from markdown.inlinepatterns import Pattern as Pattern_ from markdown.preprocessors import Preprocessor @@ -11,16 +12,16 @@ import xml import emoji Extensions = { - "Extra": "markdown.extensions.extra", + "Extra": extra.ExtraExtension(), # "Smart Strong": "markdown.extensions.smart_strong", - "Admonition": "markdown.extensions.admonition", + "Admonition": admonition.AdmonitionExtension(), # "CodeHilite": "markdown.extensions.codehilite", # "HeaderId": "markdown.extensions.headerid", - "Meta-Data": "markdown.extensions.meta", + "Meta-Data": meta.MetaExtension(), # "New Line to Break": "markdown.extensions.nl2br", - "Sane Lists": "markdown.extensions.sane_lists", + "Sane Lists": sane_lists.SaneListExtension(), # "SmartyPants": "markdown.extensions.smarty", - "Table of Contents": "markdown.extensions.toc", + "Table of Contents": toc.TocExtension(), # "WikiLinks": "markdown.extensions.wikilinks", } @@ -221,12 +222,10 @@ class CodeLine(Treeprocessor): class CodeBlock(Treeprocessor): def run(self, root): - for elem in root: # 在所有段落中查找单行代码 - print(elem.tag) - print(elem.text) - print('----------------------------------------------------------------------------------------') - for code in elem.findall('code'): # 找到代码块 - pass + for code in root.findall('p'): + # 在这里处理
         标签
        +            # 例如,你可以添加属性或修改内容
        +            print(f'{code.text} | {code.tag}')
         
         
         class Basic(Extension):
        @@ -285,7 +284,7 @@ class Code(Extension):
             def extendMarkdown(self, md: Markdown) -> None:
                 md.registerExtension(self)  # 注册扩展
                 md.treeprocessors.register(CodeLine(), 'code_line', 0)  # 渲染单行代码块
        -        md.treeprocessors.register(CodeBlock(), 'code_block', 0)  # 渲染多行代码块
        +        md.treeprocessors.register(CodeBlock(), 'code_block', 1)  # 渲染多行代码块
         
         
         def main(text: str) -> Tuple[str, Dict[str, List[str]]]:
        diff --git a/README.html b/README.html
        index 22133f9..19794df 100644
        --- a/README.html
        +++ b/README.html
        @@ -219,7 +219,7 @@
             
             
             
        -    

        引文内添加klzzwxhklzzwxhklzzwxh:00390036klzzwxh:0037

        +

        引文内添加klzzwxhklzzwxhklzzwxh:00400037klzzwxh:0038

        7 提纲

        7.1 提纲号

        @@ -230,7 +230,7 @@

        7.1.3. 错误示范

        不能出现两个及以上连续的点,例如:

        7..1...4 错误示范

        -

        提纲号会被自动配置为锚点,可直接使用776.1}

        +

        提纲号会被自动配置为锚点,可直接使用77.1

        8 注释

        8.1 强注释

        |= diff --git a/README.md b/README.md index e643eb1..0c44131 100644 --- a/README.md +++ b/README.md @@ -177,7 +177,7 @@ graph TD 7..1...4 错误示范 -提纲号会被自动配置为锚点,可直接使用{7}76.1} +提纲号会被自动配置为锚点,可直接使用{7}{7.1} 8 注释 From 09f186799a5796aacf0331841d0d95d80be97507 Mon Sep 17 00:00:00 2001 From: crossdark Date: Sun, 13 Oct 2024 14:32:15 +0800 Subject: [PATCH 40/47] =?UTF-8?q?1.7.5=20=E5=A4=96=E6=A1=86=E8=BF=98?= =?UTF-8?q?=E6=9C=89bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 31 +++++++++++++++++++++++-------- README.html | 20 ++++++++++++++++---- README.md | 22 +++++++++++++++++++--- 3 files changed, 58 insertions(+), 15 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 3de7a8e..27638e4 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -257,19 +257,34 @@ class Box(Extension): md.registerExtension(self) # 注册扩展 # 红框警告 md.inlinePatterns.register(ID( - r'!{3,}(.+?)!{3,}', tag='div', property_='style', value='display: inline-block; border: 1px solid red;' - ), 'warning_in_line', 0 - ) # 行内 + r'!{3}(.+?)!{3}', tag='div', property_='style', value='display: inline-block; border: 1px solid red;' + ), 'warning_in_line', 0) # 行内 md.parser.blockprocessors.register(BoxBlock( - md.parser, r'^ *!{3,} *\n', r'\n *!{3,}\s*$', 'display: inline-block; border: 1px solid red;' + md.parser, r'^ *!{3} *\n', r'\n *!{3}\s*$', 'display: inline-block; border: 1px solid red;' ), 'warning_box', 175) # 块 + # 黄框提醒 md.inlinePatterns.register(ID( - r'!{2,}(.+?)!{2,}', tag='div', property_='style', value='display: inline-block; border: 1px solid yellow;' - ), 'reminding_in_line', 0 - ) # 行内 + r'!-!(.+?)!-!', tag='div', property_='style', value='display: inline-block; border: 1px solid yellow;' + ), 'reminding_in_line', 0) # 行内 md.parser.blockprocessors.register(BoxBlock( - md.parser, r'^ *!{2,} *\n', r'\n *!{2,}\s*$', 'display: inline-block; border: 1px solid yellow;' + md.parser, r'^ *!-! *\n', r'\n *!-!\s*$', 'display: inline-block; border: 1px solid yellow;' + ), 'reminding_box', 175) # 块 + + # 绿框安心 + md.inlinePatterns.register(ID( + r',{3}(.+?),{3}', tag='div', property_='style', value='display: inline-block; border: 1px solid green;' + ), 'reminding_in_line', 0) # 行内 + md.parser.blockprocessors.register(BoxBlock( + md.parser, r'^ *,{3} *\n', r'\n *,{3}\s*$', 'display: inline-block; border: 1px solid green;' + ), 'reminding_box', 175) # 块 + + # 蓝框怀疑 + md.inlinePatterns.register(ID( + r',-,(.+?),{2}', tag='div', property_='style', value='display: inline-block; border: 1px solid blue;' + ), 'reminding_in_line', 0) # 行内 + md.parser.blockprocessors.register(BoxBlock( + md.parser, r'^ *,-, *\n', r'\n *,-,\s*$', 'display: inline-block; border: 1px solid blue;' ), 'reminding_box', 175) # 块 diff --git a/README.html b/README.html index 19794df..466e2cd 100644 --- a/README.html +++ b/README.html @@ -118,6 +118,8 @@

      • 14 外框
      @@ -219,7 +221,7 @@ -

      引文内添加klzzwxhklzzwxhklzzwxh:00400037klzzwxh:0038

      +

      引文内添加klzzwxhklzzwxhklzzwxh:00390036klzzwxh:0037

      7 提纲

      7.1 提纲号

      @@ -309,9 +311,19 @@

      这是一条警告

      14.2 提醒

      -

      这是一个

      提醒
      ……

      -
      -

      这是一条提醒

      +

      这是一个!-!提醒!-!……

      +

      !-! + 这是一条提醒 + !-!

      +

      14.3 安心

      +

      这是一个,,,安心,,,……

      +

      ,,, + 这是一条安心 + ,,,

      +

      14.4 怀疑

      +

      这是一个,-,怀疑,-,……

      +
      +

      这是一条怀疑

      diff --git a/README.md b/README.md index 0c44131..5ca927e 100644 --- a/README.md +++ b/README.md @@ -260,8 +260,24 @@ graph TD 14.2 提醒 -这是一个!!提醒!!…… +这是一个!-!提醒!-!…… -!! +!-! 这是一条提醒 -!! +!-! + +14.3 安心 + +这是一个,,,安心,,,…… + +,,, +这是一条安心 +,,, + +14.4 怀疑 + +这是一个,-,怀疑,-,…… + +,-, +这是一条怀疑 +,-, From 38910cbe8b8b2518e61c7de66bc266b41cdc6bb7 Mon Sep 17 00:00:00 2001 From: crossdark Date: Sun, 13 Oct 2024 14:38:11 +0800 Subject: [PATCH 41/47] =?UTF-8?q?1.7.6=20=E6=94=AF=E6=8C=81=E5=86=85?= =?UTF-8?q?=E9=83=A8=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 11 +++-------- README.html | 5 ++++- README.md | 4 ++++ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index 27638e4..e78d45a 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -1,4 +1,4 @@ -from markdown.extensions import Extension, extra, admonition, meta, sane_lists, toc +from markdown.extensions import Extension, extra, admonition, meta, sane_lists, toc, wikilinks from markdown.treeprocessors import Treeprocessor from markdown.inlinepatterns import Pattern as Pattern_ @@ -12,17 +12,12 @@ import xml import emoji Extensions = { - "Extra": extra.ExtraExtension(), - # "Smart Strong": "markdown.extensions.smart_strong", + "Extra": extra.ExtraExtension(), # 基本扩展 "Admonition": admonition.AdmonitionExtension(), - # "CodeHilite": "markdown.extensions.codehilite", - # "HeaderId": "markdown.extensions.headerid", "Meta-Data": meta.MetaExtension(), - # "New Line to Break": "markdown.extensions.nl2br", "Sane Lists": sane_lists.SaneListExtension(), - # "SmartyPants": "markdown.extensions.smarty", "Table of Contents": toc.TocExtension(), - # "WikiLinks": "markdown.extensions.wikilinks", + "WikiLinks": wikilinks.WikiLinkExtension(), } try: # 检测当前平台是否支持扩展语法 diff --git a/README.html b/README.html index 466e2cd..89bb46e 100644 --- a/README.html +++ b/README.html @@ -122,6 +122,7 @@
    • 14.4 怀疑
  • +
  • 15 内部链接
  • CrossDown

    @@ -221,7 +222,7 @@ -

    引文内添加klzzwxhklzzwxhklzzwxh:00390036klzzwxh:0037

    +

    引文内添加klzzwxhklzzwxhklzzwxh:00400037klzzwxh:0038

    7 提纲

    7.1 提纲号

    @@ -325,5 +326,7 @@

    这是一条怀疑

    +

    15 内部链接

    +

    Bracketed

    diff --git a/README.md b/README.md index 5ca927e..953424a 100644 --- a/README.md +++ b/README.md @@ -281,3 +281,7 @@ graph TD ,-, 这是一条怀疑 ,-, + +15 内部链接 + +[[Bracketed]] From ff42b7683c62532a92486073fb551f48fcf367ce Mon Sep 17 00:00:00 2001 From: crossdark Date: Sun, 13 Oct 2024 22:13:10 +0800 Subject: [PATCH 42/47] =?UTF-8?q?1.8.0=20=E5=BC=BA=E8=B0=83=E5=9D=97?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=8F=98=E9=87=8F=E8=B5=8B=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CrossDown/Core.py | 23 ++++++++++++++++++----- CrossDown/__init__.py | 15 ++++++++++++--- README.html | 20 +++++++++++++------- README.md | 4 ++++ 4 files changed, 47 insertions(+), 15 deletions(-) diff --git a/CrossDown/Core.py b/CrossDown/Core.py index e78d45a..2d9dc3e 100644 --- a/CrossDown/Core.py +++ b/CrossDown/Core.py @@ -12,7 +12,7 @@ import xml import emoji Extensions = { - "Extra": extra.ExtraExtension(), # 基本扩展 + "Extra": extra.ExtraExtension(fenced_code={'lang_prefix': ''}), # 基本扩展 "Admonition": admonition.AdmonitionExtension(), "Meta-Data": meta.MetaExtension(), "Sane Lists": sane_lists.SaneListExtension(), @@ -20,6 +20,7 @@ Extensions = { "WikiLinks": wikilinks.WikiLinkExtension(), } + try: # 检测当前平台是否支持扩展语法 from .Extra import * EXTRA_ABLE = True @@ -183,6 +184,10 @@ class LinkLine(InlineProcessor): class CodeLine(Treeprocessor): + def __init__(self, variable: Dict): + super().__init__() + self.variable = variable + def run(self, root): for elem in root.iter('p'): # 在所有段落中查找单行代码 if elem.findall('code'): # 找到单行代码 @@ -212,7 +217,11 @@ class CodeLine(Treeprocessor): elif re.match(r'\{[^$]*}', code.text): # 是强调 code.tag = 'span' code.set('class', 'block') - code.text = code.text[1:-1] + key = code.text[1:-1] # 去掉两边的{} + if key in self.variable: + code.text = self.variable[key] + else: + code.text = key class CodeBlock(Treeprocessor): @@ -291,12 +300,16 @@ class Anchor(Extension): class Code(Extension): + def __init__(self, variable: Dict): + super().__init__() + self.variable = variable + def extendMarkdown(self, md: Markdown) -> None: md.registerExtension(self) # 注册扩展 - md.treeprocessors.register(CodeLine(), 'code_line', 0) # 渲染单行代码块 - md.treeprocessors.register(CodeBlock(), 'code_block', 1) # 渲染多行代码块 + md.treeprocessors.register(CodeLine(variable=self.variable), 'code_line', 0) # 渲染单行代码块 + # md.treeprocessors.register(CodeBlock(), 'code_block', 1) # 渲染多行代码块 def main(text: str) -> Tuple[str, Dict[str, List[str]]]: - md = Markdown(extensions=[Basic(), Box(), Anchor()] + list(Extensions.values()) + [Code()]) + md = Markdown(extensions=[Basic(), Box(), Anchor()] + list(Extensions.values()) + [Code({'a': 'b', '强调变量': '强调值'})]) return md.convert(text), md.Meta diff --git a/CrossDown/__init__.py b/CrossDown/__init__.py index 6e2ee5a..4af49aa 100644 --- a/CrossDown/__init__.py +++ b/CrossDown/__init__.py @@ -20,7 +20,18 @@ HEAD = ( '', '', '', + + # mermaid '', + '', + + # Highlight.js + '', + '', + '', + '