介绍
在本系列文章中,我想向您展示如何构建自己的markdown到HTML生成器。该系列由三部分组成:
第二部分通过一个模块扩展了实现的管线,该模块用于计算给定文章的预计阅读时间。
这三部分中使用的代码都可以在GitHub上找到。
项目构建
Markdown是一个包,它允许您将markdown代码转换为HTML。之后我们用Flask产生静态文件。
激活后,您可以使用pip安装requirements.txt中的依赖。
nerror="javascript:errorimg.call(this);">
posts包含生成的HTML文件,这些文件与应用程序根目录中posts目录中的文件相对应。
此外,我们还创建了一个名为services的目录。该目录将包含我们在Flask应用程序中使用的模块,或者为它生成某些东西。最后,创建一个名为static的目录带有两个子目录images和css。自定义CSS文件和文章的缩略图将存储在此处。
令人惊叹!我们完成了一般的项目设置。我们来看看Flask的设置。
路由
该文件定义了一个具有两个端点的基础版Flask应用程序。用户可以使用/route访问第一个端点返回索引页,其中列出了所有文章。
接下来,我们通过向app目录中添加一个__init__.py,将其转换为一个Python包。此文件为空。如果您使用UNIX计算机,则可以从项目的根目录运行以下命令:
nerror="javascript:errorimg.call(this);">
现在,我们创建两个模板文件index.html以及layout.html,都存储在templates/shared目录中。这个layout.html模板将用于单个博客条目,而index.html模板用于生成索引页,从中我们可以访问每个帖子。让我们从index.html模板开始。
nerror="javascript:errorimg.call(this);">
HTML文件的主体包含一个容器,其中包含Jinja2[2]逻辑,用于为每个post生成Bootstrap卡片[3]。您是否注意到我们不直接基于变量名访问这些值,而是需要将[0]添加到其中?这是因为文章中解析的元数据是列表。实际上,每个元数据元素都是由单一元素组成的列表。我们稍后再看。到目前为止,还不错。让我们看看layout.html模板。
nerror="javascript:errorimg.call(this);">
body中的容器仅定义一个h1标记。然后,我们提供给模板的内容被插入并呈现。
正如上一节所承诺的,我们将查看自定义CSS文件style.css. 我们在static/css中找到该文件,并根据需要自定义页面。下面是我们将用于基础示例的内容:
nerror="javascript:errorimg.call(this);">
最后但并非最不重要的是,左右两边的填充被删除。由于两边都有额外的填充,缩略图没有正确对齐,所以在这里删除它们。
写文章
在完成本文之后,我们需要在文章中添加一些元数据。此元数据添加在文章之前,并由三个破折号分隔开来---。下面是一个示例文章(post1.md)的摘录:
nerror="javascript:errorimg.call(this);">
在我们的例子中,元数据由标题、副标题、类别、发布日期和index.html中卡片对应缩略图的路径组成.
假设我们写完了文章。在我们可以开始转换之前,还有一件事要做:我们需要为我们的帖子生成缩略图!为了让事情更简单,只需从你的电脑或网络上随机选取一张图片,命名它为placeholder.jpg并把它放到static/images目录中。GitHub存储库中两篇文章的元数据包含一个代表图像的键值对,值是placeholder.jpg。
markdown到HTML转换器
首先,我们导入所需的所有内容并创建几个常量:
nerror="javascript:errorimg.call(this);">
POSTS_DIR是以markdown编写的文章的路径。
BLOG_TEMPLATE_文件存储layout.html的路径。
base_URL是我们项目的默认地址,例如。https://florian-dahlitz.de.默认值(如果不是通过环境变量DOMAIN提供的话)是http://0.0.0.0:5000。
在函数中,我们首先获取POSTS_DIR目录中所有markdown文件的路径。pathlib的awesome glob函数帮助我们实现它。
注意:您可以在文档[4]中找到有关扩展的更多信息。
我们启动for循环,并打印当前正在处理的post的路径。如果有什么东西出问题了,这尤其有用。然后我们就知道,哪个文章的转换失败了。
变量url_html存储的字符串与url相同,只是我们在末尾添加了.html。我们使用此变量定义另一个称为target_file.的变量。变量指向存储相应HTML文件的位置。
让我们转到for循环中的第一个with代码块。
nerror="javascript:errorimg.call(this);">
第二个with 代码块用于将第一个with 代码块中创建的文档写入目标文件。
我们现在出了for循环,因此,我们遍历了posts目录中找到的所有posts并对其进行了处理。让我们看看generate_entries函数中剩下的三行代码。
nerror="javascript:errorimg.call(this);">
最后我们在函数generate_entries之后添加以下if语句。
nerror="javascript:errorimg.call(this);">
太棒了,我们完成了converter.py脚本!让我们从项目的根目录运行以下命令来尝试:
nerror="javascript:errorimg.call(this);">
最后启动Flask应用程序并转到http://0.0.0.0:5000。
nerror="javascript:errorimg.call(this);">
太棒了,你完成了这个系列的第一部分!在本文中,您已经学习了如何利用Markdown包创建自己的Markdown to HTML生成器。您实现了整个管线,它是高度可扩展的,您将在接下来的文章中看到这一点。
参考文献
Bootstrap (http://getbootstrap.com/)
Primer on Jinja Templating (https://realpython.com/primer-on-jinja-templating/)
Bootstrap Card (https://getbootstrap.com/docs/4.4/components/card/)
Python-Markdown Extensions (https://python-markdown.github.io/extensions/)
Tweet
英文原文:https://florian-dahlitz.de/blog/build-a-markdown-to-html-conversion-pipeline-using-python
译者:阿布铥nerror="javascript:errorimg.call(this);">
