From 989c9accaacfeb2a93b403f32504a6da9db707b1 Mon Sep 17 00:00:00 2001 From: crossdark Date: Mon, 30 Sep 2024 17:12:54 +0800 Subject: [PATCH] =?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))