Python-Markdown学习笔记
写在前面
按照日常需求,
应该开启的扩展为:
- Fenced Code Blocks
- Tables
- Sane Lists
- SmartyPants
建议开启的扩展为:
- Codehilite
- Footnotes
- Meta-Data
- Table of Contents
Python-Markdown简介
Python-Markdown是John Gruber创造的Markdown语言的Python实现。除了极少的差异外(差别见下文),它几乎完全符合其语法参考。点击查看Markdown语法文档。
特性
除了基本的markdown语法,Python-Markdown还支持以下特性:
- 国际化语言输入(International Input) Python-Markdown 接受 Unicode 支持的任何语言,包括 bi-directional text。实际上测试套件包括用俄语和阿拉伯语写的文件。
- 扩展(Extensions) 支持多种扩展用于改变或扩展基本语法。有开放的extension API供你进行开发。
- 多种输出格式(Output Formats) Python-Markdown 支持以 HTML4、XHTML 和 HTML5 格式输出文档。
- 命令行界面(Command Line Interface) 提供了一个命令行脚本方便你进行 markdown 的转换。
差异
虽然 Python-Markdown 尽量贴合 markdown 的语法规则,但某些规则可以以不同的方式解释,不同的方式实现(相关示例请参阅 Babelmark FAQ)。Python-Markdown中发现的已知和有意义的差异总结如下:
- Middle-Word Emphasis Python-Markdown 默认忽略 Middle-Word Emphasis。换言之,
some_long_filename.txt
不会成为some<em>long</em>filename.txt
。如有需要,这个选项可以关闭。 - Indentation/Tab Length markdown语法 明确指出,当列表项包含多个段落时:
each subsequent paragraph in a list item must be indented by either 4 spaces or one tab
然而许多markdown语法的实现并不执行此规则,允许缩进少于4个空格。Python-Markdown开发者认为这么做是个bug。
这适用于嵌套在列表中的任何块级元素,包括段落,子列表,块引用,代码块等。对于每个级别的嵌套,必须始终缩进四个空格或一个tab。
- Consecutive Lists 虽然语法规则没有明确指出,但是当列表标记(星号,粗线,连字符和数字)更改时,许多实现(包括原始)不会结束一个列表并启动第二个列表。为了保持一致性,Python-Markdown保持相同的行为,目前没有更改的计划。
安装
|
|
或者
|
|
使用参考
简单的
|
|
详细的
Python-Markdown提供了两个公共函数(markdown.markdown
和markdown.markdownFromFile
),它们都包含公共类markdown.Markdown
。如果您一次处理一个文档,这些功能将满足您的需求。但是,如果您需要处理多个文档,那么创建markdown.Markdown
该类的单个实例并通过它传递多个文档可能是有利的。如果您确实使用单个实例,请确保正确调用该reset
方法。
markdown.markdown (text [, **kwargs])
text
(必需):源Unicode字符串。Python-Markdown期望Unicode作为输入(尽管一些简单的ASCII字符串可能正常工作),并返回输出为Unicode。不要将编码后的字符串传递给它!extensions
:扩展列表。Python-Markdown为第三方提供了一个API来为解析器编写extension,对语法进行添加或更改。一些常用的extension程序随着markdown库一起提供。有关可用extension的列表,请参阅文档。 extension列表可以包含extension实例或者extension名字符串。优先传extension实例。
|
|
extension_configs
:扩展名的配置字典。任何配置项只会传递给使用名称字符串加载的extension,使用类实例加载的extension将会在类初始化时直接传递参数。(优选的方法是使用类实例加载extension,因此并不需要使用extension_configs
关键字。) 配置字典必须采用以下格式(查看extension的配置参数请参阅extension相关文档):
|
|
output_format
:输出格式。支持的格式有(值可以是小写或大写):"xhtml1"
:输出XHTML 1.x. 默认。"xhtml5"
:输出HTML 5的XHTML样式标签。"xhtml"
:(不推荐使用)输出最新支持的XHTML版本(目前为XHTML 1.1)。"html4"
:输出HTML 4。"html5"
:输出HTML 5的HTML样式标签"html"
:(不推荐使用)输出最新支持的HTML版本(目前为HTML 4)。
safe_mode
:(已被弃用)禁止部分原生HTML标签。默认值:False,可选值replace
、remove
、escape
。“safe_mode” 也会更改enable_attributes
选项的默认值。该设置项已被弃用,建议使用HTML清理器(如 Bleach)处理用户提交的不受信任的HTML。
|
|
html_replacement_text
:当safe_mode设置为replace
时用于替换的文本。已被弃用。tab_length
:tab的长度。默认值:4enable_attributes
:启用属性的转换。默认为True
,除非safe_mode
启用,在这种情况下是默认值False
。safe_mode
仅覆盖默认值。如果enable_attributes
显式设置,则使用显式值,无论如何safe_mode
。但是,这可能会让不受信任的用户将JavaScript注入到文档中。smart_emphasis
:_connected_words_
智能处理默认值:True,即上文差异中说的第一点。lazy_ol
:忽略有序列表的第一个项目的数量。默认值:True,即上文差异中说的第三点。如果设置为False
,则给出以下列表:
|
|
将输出:
|
|
markdown.markdownFromFile (**kwargs)
除了极少数的情况,markdown.markdownFromFile
接受与markdown.markdown
相同的参数。但是其不接受text(或Unicode)类型字符串,而是接受以下必传参数:
input
(必填):源文本文件。可以设置为以下三种:
- 一个字符串,指定了文件系统中可读文件的路径;
- 一个可读的file-like对象;
- None(默认),此时将从stdin中读取;
output
:定义输出位置。可以设置为以下三种:
- 一个字符串,指定了文件系统中可写文件的路径;
- 一个可写的file-like对象;
- None(默认),此时输出到stdout;
encoding
:源文本文件的编码。默认值是utf-8
。输入和输出总是使用相同的编码。编码output时将会使用xmlcharrefreplace
错误处理程序。这是唯一可以在Python-Markdown中进行Unicode解码和编码的地方。如果这种天真的解决方案不能满足您的具体需求,建议您编写自己的代码来处理编码/解码需求。
markdown.Markdown ([**kwargs])
初始化markdown.Markdown
类时,可以使用与markdown.markdown
函数相同的参数,唯一的例外是该类在初始化时不接受源文本字符串。源文本字符串必须传递给以下两个实例方法之一:
Markdown.convert(source)
该source文本与
markdown.markdown
函数的text参数有相同的要求。你还可以用该方法处理多个字符串而不必为每个字符串创建一个新的类实例。
|
|
根据要使用的选项和扩展,解析器可能要在每个调用convert
方法之间进行复位(reset),否则可能会影响性能:
|
|
你也可以同时调用reset
方法和convert
方法:
|
|
Markdown.convertFile(**kwargs)
该方法的参数与
markdown.markdownFromFile
函数相同。与convert方法一样,该方法也用于处理多个文件而不必为每个文件创建一个新的类实例,也可在调用convertFile
之间调用reset
方法。
CLI命令
虽然Python-Markdown主要是一个Python库,但也包括一个命令行脚本。虽然还有许多其他的命令行的Markdown实现,但您可能没有安装它们,或者您更喜欢使用Python-Markdown的各种扩展:)
Python-Markdown的命令行脚本利用了Python的-m
标志。因此可以通过以下方式来运行:
|
|
最基本的用法是只传递一个文件名作为唯一的参数:
|
|
支持管道输入和输出(STDIN
和STDOUT
)。例如:
|
|
使用--help
参数查看所有可用选项和参数列表。
|
|
如果不想直接调用Python可执行文件(使用-m
标志),请按照以下说明使用封装后的脚本:
设置
Python-Markdown使用"markdown_py"作为脚本名称,因为Perl语言已经使用了更加明显的名称"markdown"。此外,某些系统上的默认Python配置会导致命名为"markdown.py"的脚本不能正常工作,因为系统错误地导入了脚本本身而不是markdown库。因此,我们将脚本命名为了"markdown_py",如果您希望在您的系统中使用不同的脚本名称,建议您使用软链接指定到markdown_py
命令。
使用说明
最简单的方式
|
|
或者
|
|
要查看所有可用选项的列表
|
|
加载extension
要从命令行加载Python-Markdown extension,请使用-x
(或--extension
)选项。扩展模块必须位于您的PYTHONPATH
环境变量中(有关详细信息,请参阅Extension API)。可以使用Python的点语法通过该模块的名称来调用extension:
|
|
要加载多个extension,请为每个extension都指定-x
选项:
|
|
如果extension支持配置选项,您也可以将它们传入:
|
|
该-c
(或--extension_configs
)选项接受一个文件名。该文件必须是YAML或JSON格式,并且包含YAML或JSON格式的内容,储存markdown.Markdown
的extension_configs关键字参数使用的dict。因此,config.yaml
上述示例中引用的文件可能如下所示:
|
|
请注意,虽然该--extension_configs
选项确实指定了“markdown.extensions.footnotes” extension,但您仍然需要使用-x
选项加载该extension,否则该extension的配置将被忽略。
如果您的系统中安装了PyYAML,--extension_configs
选项将能够支持YAML格式配置文件。JSON格式配置文件的支持不需要安装额外扩展。程序会自动检测配置文件的格式。
官方Extensions
下面列出的extensions都包含在最新版本的Python-Markdown包中,并且由Python-Markdown官方维护。
Extension | “Name” |
---|---|
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 |
Extra
这是一部分Python-Markdown扩展的集合,主要模仿了PHP Markdown Extra。
Abbreviations
该扩展提供定义缩写的功能。任何定义的缩写都会被包含在<abbr>
标签中。
举例说明,下面的文本
|
|
将会被解析为:
|
|
Attribute Lists
该扩展为HTML输出中的元素添加了属性定义。
语法
属性列表定义如下所示:
|
|
以hash(#
)开头的单词将设置为一个元素的id,以dot(.
)开头的单词将被添加到元素的class中,键值对(somekey='some value'
)将会作为属性分配给元素。注意,对于class,后定义的键值对会覆盖前定义的dot语法。
例如,下面的定义:
|
|
其属性定义的结果是:
|
|
使用
- 定义块级元素的属性,属性列表应该在块的最后一行定义。
|
|
以上的解析结果是:
|
|
对于标题,只能定义在同一行:
|
|
以上的解析结果是:
|
|
- 定义内联元素的属性,属性应在同一行的内联元素后定义,且中间不能有空格。
|
|
以上的解析结果是:
|
|
Definition Lists
该扩展用于定义HTML中的definition list。
|
|
将呈现为:
|
|
Fenced Code Blocks
该扩展用于定义多行代码块。
可以这样:
|
|
或者这样
|
|
对代码块中某些行进行强调(需要安装 Pygments依赖):
|
|
或者
|
|
Footnotes
该扩展支持在Markdown文档中定义脚注。
|
|
脚注标签定义在一组square brackets([]
)中,必须以caret(^
)开头,标签名中可能包含任何内联文本,包括空格。只有第一个^
是有特殊含义的。
脚注内容格式:在标签后必须跟冒号和至少一个空格,然后在同一行或者下一行添加脚注内容。内容可以包含多行、段落、代码块、引用和其他大多数markdown语法。从第二行开始应当缩进一级(四个空格或者一个tab)。
当使用多个块时,建议在块与块之间空一行分割内容,增加可读性。
|
|
Tables
该扩展支持在Markdown文档中定义表格。
|
|
将呈现为:
|
|
Smart_Strong
该扩展能智能处理双下划线标识的强调。
|
|
Admonition
该扩展支持在markdown中定义rST-style admonitions。
|
|
如果没有标题,type
将被用作css类名和默认标题。rST建议以下内容的type
:attention, caution, danger, error, hint, important, note, tip, warning。举个🌰:
|
|
|
|
如果不想有标题,可以将标题设置为空字符串""
|
|
|
|
CodeHilite
安装
该扩展使用 Pygments 为代码块添加语法高亮。使用该插件需要先安装 Pygments:
|
|
通过 Pygments 生成 css 样式文件:
|
|
-S
指定使用的 css 主题样式名称,Pygments 内置了多种主题,查看内置主题列表:
|
|
下面的网站提供了主题的预览:
-a
选项应与 codehilete 的配置 css_class
保持一致。
把生成的 css 文件集成到展示 markdown 文档的 html 中,即可实现代码块语法高亮。
配置
该扩展有以下配置项:
linenums
是否展示行号。默认为None
表示自动处理,可以设置为True
- 展示,False
- 不展示。guess_lang
猜测代码块语言。默认为True
,可以设置为False
。css_class
设置代码块div
标签中的 css类名,默认为codehilite
。pygments_style
Pygment HTML 主题样式名称,默认为default
。该选项只在noclasses
为True
时有效,否则应该另外提供 css 文件。noclasses
使用内联样式,默认为False
。use_pygments
使用 Pygment,默认为True
。
Headerld
该扩展自动为生成的HTML文件中的标题元素(h1-h6)生成id属性。
注意:该扩展即将被弃用,请使用提供了更多特性的TOC扩展作为替代。
语法
默认情况下,将会基于标题的文本生成唯一的标题id。举🌰如下:
|
|
渲染结果是:
|
|
使用
选项如下:
level
:设置标题的基本级别,默认值为1。假如你要设置所有的标题都不高于level 3(<h3>
):
|
|
fouceid
:强制所有headers都有id,默认值True。
|
|
separator
:单词分隔符,用于代替id中的空格。默认值-
。slugify
:用于生成锚点。默认值markdown.extensions.headerid.slugify
。如果你想使用不同的id生成算法,你可以传一个包含以下两个参数的可调用对象:value
:slugify字符串。separator
:单词分隔符。
使用Meta-data
该扩展支持Meta-data
扩展。使用的关键字是:
header_level
header_forceid
使用时,meta-data将会覆盖通过extension_configs
接口传入的设置。
|
|
渲染后:
|
|
Meta-Data
该扩展提供了定义文档元数据的方法。目前,该扩展并不使用元数据,而是作为Markdown实例的 Meta
属性,供其他扩展或直接被 Python 代码调用。
Syntax
Meta-data 定义在 markdown 文件的开头,包含一系列的 keyword 和 value。keyword 不区分大小写,可能包含字母、数字、下划线和短横线,必须以冒号结尾。value 包含冒号后当前行的所有内容,也可为空。
如果一行缩进不少于 4 个空格,这一行被认为是先前行 keyword 的 value 的附加行,可以有多行 keyword。
空行将会结束所有 Meta-data 的定义。因此,如果含有元数据定义,文档的第一行不能是空行。
|
|
你也可以使用 YAML 样式来标识 Meta-data 的起止行。此时,文档的第一行必须是 —--
,Meta-data 在遇到第一个空白行结束,或遇到包含结尾分隔符(---
或者 ...
)的行结束。如此做的话,即使 Markdown 支持 YAML 解析,元数据也不会被解析为 YAML 内容。
|
|
上面两个例子的解析结果:
|
|
访问Meta-data
meta-data 在 Markdown 类实例的 Meta 属性中作为一个 python Dict 提供。注意:所有的 keyword 都是小写的,value 是一个 String 组成的 List,其中的每一个元素是该 keyword 的一行,不包含换行符。如果有需要,可以保留换行符或者在合适的时候加上。
|
|
元数据可以在模版系统中传入,或者被其他Markdown扩展使用。只有你想不到哈哈哈~
已兼容的扩展
- HeaderId
header_level
header_forceid
- WikiLinks
wiki_base_url
wiki_end_url
wiki_html_class
New Line to Break
该扩展(nl2br)会把markdown中的换行视为”hard break“,类似StackOverFlow和GitHub的风格。
|
|
Sane Lists
该扩展改变了Markdown中列表的语法。
Sane List不允许列表项混合。即当遇到无序列表时,有序列表将不会继续,反之亦然。例如:
|
|
将产生以下输出:
|
|
而默认的Markdown行为是生成有序列表(实测)。
注意,与默认的Markdown行为不同,如果列表项之间未包含空白行,不同的列表类型将被忽略,这与段落的行为一致。
|
|
该扩展的输出为:
|
|
默认Markdown输出:
|
|
在其他方面,该扩展与正常的Markdown列表一致。
SmartyPants
该扩展将ASCII码的短横线dash、引号quotes、和省略号ellipses替换为他们的html表示法。
ASCII symbol | Replacements | HTML Entities | Substitution Keys |
---|---|---|---|
' | ‘ ’ | ‘ ’ | 'left-single-quote' , 'right-single-quote' |
" | “ ” | “ ” | 'left-double-quote' , 'right-double-quote' |
<< >> | « » | « » | 'left-angle-quote' , 'right-angle-quote' |
... | … | … | 'ellipsis' |
-- | – | – | 'ndash' |
--- | — | — | 'mdash' |
使用’substitutions’配置项你可以覆盖默认配置。只需要传一个dict映射key和替代的string。
举个🌰
|
|
扩展配置项:
选项 | 默认值 | 描述 |
---|---|---|
smart_dashes | True | 是否转换破折号 |
smart_quotes | True | 是否直接转换引号 |
smart_angled_quotes | False | 是否转换尖括号 |
smart_ellipses | True | 是否转换省略号 |
substitutions | {} | 即上面说到的配置项 |
Table of Contents
该扩展用于生成目录。
Syntax
使用扩展时默认情况下,所有标题将自动基于标题文本生成唯一的标题id属性,像HeaderId扩展一样。
在文档需要放置目录的地方放一个[TOC]
标记,将会替换为由所有标题生成的嵌套列表。
无论在文档中有没有maker
(默认是[TOC]
),都可以使用Markdown类实例的toc
属性读取目录内容,然后在页面模版中使用目录。
Usage
提供以下选项来配置输出:
maker
:在文档中用于寻找和替换目录的字符串,默认值是[TOC]
。设置为空字符串将会禁用搜索maker,这在长文档中能够节约转换的时间。title
:插入目录<div>
元素的title,默认值为None
。anchorlink
:设置为True将使所有标题链接到自己。默认值为False
。permalink
:设置为True
或一个String,以在每个标题的末尾生成永久链接。适用于Sphinx样式表。当设置为True
时,段落符号(¶
或¶
)用作链接文本;当设置为String时,提供的String作为链接文本。baselevel
:标题的基本级别,默认为1。举个例子,假如设置为3,那么所有标题的级别都不会高于3,如下:
|
|
slugify
:用于生成锚点,默认值markdown.extensions.headerid.slugify
。与HeaderId的slugify
参数用法相同。separator
:单词分隔符,用于替换id中的空格,默认值是-
。
WikiLinks
该扩展提供了对WikiLinks的支持。具体来说,任何的[[bracketed]]
标记都将转换为链接。
Syntax
[[bracketed]]
标记由大写字母、小写字母、数字、短横线dash、下划线和空格组成,被两个方括号包裹而成。WikiLinks会自动分配class="wikilink"
属性以使WikiLink的样式与页面上其他链接进行区别。下面会降到如何修改class名。因此:
|
|
将会被转换为:
|
|
注意,如果标记中含有空格,将会在链接中被转换为下划线,但在文本中保留原样。举个🌰:
|
|
会转换为:
|
|
Usage
默认情况下,链接将会指向域名的根目录,并使用尾部斜线关闭。此外,每个链接都分配了CSS class wikilink
。
配置项如下:
base_url
:添加到URL开头的字符串,默认值/
。end_url
:添加到URL末尾的字符串,默认值/
。html_class
:CSS类名,留空为None,默认值wikilink
。build_url
:可调用对象,用于格式化URL,传入三个参数(label
,base
,和end
),返回URL。
Examples
使链接始终指向/wiki/
的子目录并以.html
结尾:
|
|
将会使[[WikiLink]]
变为:
|
|
如果你想要的不只是改变url的开头和结尾,可以使用build_url
:
|
|
使用Meta-Data扩展
支持使用的meta-data关键字是:
wiki_base_url
wiki_end_url
wiki_html_class
使用时,meta-data将覆盖通过extension_configs
提供的设置。
如下的markdown文件:
|
|
将会导致以下输出(注意wiki_html_class
是空白的):
|
|
第三方Extensions
这有个第三方扩展的列表——Third Party Extensions
Extension API
放个链接,暂时用不上。https://pythonhosted.org/Markdown/extensions/api.html