当我第一次开始在自己的博客上工作时,我开始工作的第一件事之一就是让我的条目突出显示代码语法。我甚至实施了一个乱写文章关于这个话题。
挑战的关键正在扩展knardown,以具有表示应突出显示块的语法。我对我选择的语法感到非常舒服:
它没有任何花哨的东西,但它完成了工作。但是,我的第一次尝试延伸Python-Markdown以呈现语法正确是有点可怕的。它工作, 我是认真的工作好的,但是该死如果它没有蒙修Python-Markdown库虽然它做到了。
这是一个不可原谅的罪在某些情况下,但Python-Markdown的实施者脱离了它的方式来使它成为可扩展...所以我感觉有点肮脏。因为我一直在工作我的博客软件,我决定现在是时候修复我以前的奇迹。
让我们上班。
第1步:获取新的标记副本
我的旧副本的倒数瘫痪,在我的第一次修改后泪流满面,所以我必须得到一个新鲜的副本。你还想抓住一份pygments.当你在它的时候。
第2步:写下该死的东西
Markdown库中有一个全功能榜样(搜索脚注跳转到它),这是一个福音。每当混乱发现你时,请看看它以获取指导。
现在我们需要制作一个新模块来放入我们的代码。它没有(而不应该是)在同一文件中markdown.py.py.。我命名了code.py.,因为我在名为的文件夹中标记。如果您在具有较少暗示名称的文件夹中将您的文件夹放置,则可能需要尝试更好的名称。
您需要写的第一件事是预处理器。预处理器需要定义一个功能:
Markdown库将所有行拆分为“\ n”,然后为您提供结果。如果您想在文本上运行作为百波形,那么您必须自己重新加入:
所以我们的班级将被称为codeblockpreprocessor.(吸引人,我知道),它会有这个跑步方法:
def跑步(自己那线):纽约=[]看见=错误的郎=没有任何堵塞=[]为了线在线:如果线。以。。开始(“@@”)是真的和看见是错误的:郎=线。条(“@@”)看见=真的el线。以。。开始(“@@”)是真的和看见是真的:Lexer.=get_lexer_by_name.(郎)内容=“\ n“。加入(堵塞)突出显示=强调(内容那Lexer.那htmlformatter.())纽约。附加(“\ n%S.\ n“%(突出显示)))郎=没有任何堵塞=[]看见=错误的el看见是真的:堵塞。附加(线)别的:纽约。附加(线)返回纽约
我们走过所有正在寻找开始到代码块的行(在行开头的符号(@)上由两个连续两个连续表示)。如果我们找到一个,我们会忽略文本,直到找到一个结算块(如果没有关闭块,那么打开块后的一切都将被丢弃......有点忘记,但不允许任何不期间的不期间)。然后我们使用Pygments在开始和结束中占用的代码,使用Lexer.在块的开口线上表示(例如@@ Ruby使用红宝石,和@@ html + django使用html + django.)。
完成运行方法后,我们只需编写一些通用代码,很快我们就会对Python-Markdown进行干净的扩展。
首先,我们需要在我们的文件顶部进行一些导入:
进口关于从ddmarkup.进口啰嗦从pygments.进口强调从pygments.formatters.进口htmlformatter.从pygments.LEXERS.进口get_lexer_by_name.
然后我们需要编写一个将用于控制我们新预处理的简单类。
班级CodeExtension.:def扩展标记(自己那m):指数=m。预处理器。指数(啰嗦。html_block_preprocessor.)预处理器=codeblockpreprocessor.()预处理器。m=mm。预处理器。插(指数那预处理器)
这与课程获得一样简单。您拍摄了Markdown类的实例,然后将CodeBlockPreprocessor的一个实例添加到其预处理器列表(在HTML_Block_Prepossor之前)。
最后,我们需要使用我们的新预处理器调用Markdown来进行函数。
def使成为(文本):m=啰嗦。啰嗦()CodeExtension.=CodeExtension.()CodeExtension.。扩展标记(m)m。来源=文本返回unicode.(m)
我们创建了一个实例啰嗦,添加我们的扩展,然后渲染。如果我们想要我们可以让它从命令行接受参数:
如果__名称__==.'__主要的__':打印使成为(文件(SYS.。argv.[1])。读())
虽然它似乎是第一次修改Python-Markdown的努力,但它真的是一个精心设计的图书馆,以及设计图书馆的一个很好的例子,以便其他人可以清洁它们。在某个时候给出代码。