使用 Python 将在博客园发布文章时生成的图片的 Markdown 语法改为 HTML 语法

缘由

在博客园发布随笔/博客时,上传图片后将会自动生成图片的 Markdown 语法格式,形如:

![Img_title](Img_url)

这样的话图片在文章中的位置会比较乱,导致文章排版并不是很美观,影响文章的整体阅读感受,但是好在可以使用 HTML 的语法替换掉 Markdown 的语法,并且可以添加一些属性,使得图片可以居中、缩放,整体看起来会比较舒适一些,可以使用下面这个 HTML 的代码来插入图片

<p align="center"><img src="Img_url" width=60% alt="Img_title"></p>

HTML代码解读

  • <p></p> 是段落标签,此处内容为一张图片
    • align 属性指定内容对齐方式,center 使段落居中,在这里达到使图片居中的效果
  • <img> 是图片标签
    • src 属性指定图片的链接
    • width 属性指定图片的缩放比例,这里定义为 60%,可以自己更改
    • alt 属性指定图片标题,当由于某些原因图片未正确显示时显示该文字,表示此处应有一张图片

效果预览

要明白写下面程序的目的,能完成什么任务,首先看一下效果,这要涉及到两个文件:contentfileoutput (是两个文件的文件名,但是没有后缀名)

  1. contentfile 的内容是在博客园后台发布文章时编辑区的内容,但是这里还只是将图片上传到相应的位置,图片的引用方式是 Markdown 的语法
  2. output 的内容是将文件 contentfile 的内容处理过后的信息,此时引用图片的语法应为 HTML 语法

例如:

contentfile 的内容为:

this is the first line
这是第二行
![图片](www.first.com)
这是第几行
下面是一张图片
![第二张图片](www.second.com)

那么经过程序处理后将会生成一个名为 output 的文件,内容为:

this is the first line
这是第二行
<p align="center"><img src="www.first.com" width=60% alt="图片"</p>

这是第几行
下面是一张图片
<p align="center"><img src="www.second.com" width=60% alt="第二张图片"</p>

对比一下,就能看到这个程序的功能。

“如果只是将引用图片从 Markdown 语法改为 HTML 语法,手动改一下不就可以吗?”

“你可以试试...”

逐步分析

思路分析

在开始写代码前先理清思路,大概流程是:

读取文件中的每一行 ——> 判断该行内容是否为图片语法 ——> 如果是则进行处理,否则跳过 ——> 将该行写入输出文件

打开文章内容文件与创建并打开输出文件

将文章写到博客园发布文章的后台,在相应的位置上传图片,每张图片对应一行 Markdown 语法,然后将编辑区所有内容复制到一个文件中,这一个文件用来让程序读取,所以就需要先查看要读取的文件是否存在

import os

# 判断待读取的文件是否存在
if not os.path.exists("contentfile"):    # contentfile 为文件名
    print("The file to be read does not exist")  # 提示文件不存在
    os._exit(0)                          # 主动退出,状态码 0 表示程序正常退出
    
# (创建并)打开输出文件
output_file = open("output", "w", encoding="utf-8")

# 以 r+(读写) 打开待读取文件,编码方式为 utf-8
with open("contentfile", "r+", encoding="utf-8") as file:

依次读取文件中的每一行并判断是否到达文件结束

# while 循环重复执行读取操作
while True:
    line = file.readline()    # 读取文件的一行内容
    # 判断是否读到文件末尾
    if not line:
        break

如果读取到了文件的末尾,那么 readline 读取到的将会是空的内容,line 也就变成了空(布尔值为False),那么 not line 的布尔值也就成了 True,所以将会执行 break 来跳出循环,不再继续读取内容。

此处的 “文件的末尾” 指的是文件最后的内容的后面的一个东西,称谓EOF(end-of-file),并不是实际的文件内容的最后一个字符(字节),而是最后一个字符(字节)再向后面一个字符(字节)

如果文件有一行为空行(看起来并没有内容),但是 readline 仍然是会读到内容的,如换行符等,line 转换为布尔值将会是 True

将图片的 Markdown 语法格式转换为 HTML 语法格式

首先判断从文件读取到的每一行内容是否为 Markdown 的图片语法,这里简单的将它的特征视为第一个非空格字符为!,当然这并不是完全正确的做法,因为有可能刚好一个!在某一行普通的文本内容的开头,这里暂时这么做吧_

import re

# HTML 语法格式的图片的链接
# 里面的两个 {} 将会使用字符串的 format 方法进行填充内容
# 注意:字符串最后有两个换行符(\n),这是我在测试过后发现两个换行符才可以使内容有较好的格式
img_pattern_html = '<p align="center"><img src="{}" width=60% alt="{}"</p>\n\n'

# 判断一行是否为空行,如果是,将会跳过
# 如果不是空行,那么将该行左边的空格去除
# 然后判断剩下的内容的第一个字符是否为 "!"
if (not line.isspace()) and line.lstrip()[0] == "!":
    # 如果符合假定的图片语法的“特征”,将会进行以下处理
    # 使用正则找到图片的标题以及图片的链接
    title_and_url = re.findall(r"!\[(.*?)]\((.*?)\)", line)
    # 注意 findall 获取的内容的顺序,以及正确传入字符串中
    # 将 line 的值更新
    line = img_pattern_html.format(title_and_url[0][1], title_and_url[0][0])

将内容写入到文件并关闭打开的输出文件

进行过上面的处理后,可以知道,如果变量 line 的内容是Markdown 引用图片的语法,那么将会处理一下,使代码转换为 HTML 的语法格式,并且再将 HTML 代码赋给变量 line,如果原来的内容只是普通的内容,将不会进行处理,line,的内容仍未原来的内容,那么只需要将 line 的内容写入到输出文件就可以了

# 使用 writelines 方法将一行内容写入文件
output_file.writelines(line)

还有一件重要的事,记得之前打开了输出文件,但是并不是使用 with ... as ... 这样上下文处理方式打开,所以需要手动来关闭该文件

output_file.close()

这样就差不多了

完整程序代码

上面对程序的一些细节之处做了解释,下面就是完整的程序的代码了

import re
import os

img_pattern_html = '<p align="center"><img src="{}" width=60% alt="{}"</p>\n\n'

if not os.path.exists("contentfile"):
    print("The file to be read does not exist")
    os._exit(0)
    
output_file = open("output", "w", encoding="utf-8")

print("Start")
with open("contentfile", "r+", encoding="utf-8") as file:
    while True:
        line = file.readline()
        if not line:
            break
		if (not line.isspace()) and line.lstrip()[0] == "!":
            title_and_url = re.findall("!\[(.*?)]\((.*?)\)", line)
            line = img_pattern_html.format(title_and_url[0][1], title_and_url[0][0])
		output_file.writelines(line)
output_file.close()
print("DONE")

到此程序已经写完了,下次再发文章时就不用再一张一张图片的上传然后再一个一个的修改了,省下了很多功夫

posted @ 2021-02-28 16:02  xiaozemo  阅读(205)  评论(0)    收藏  举报