Python脚本转换Typora中的Html标签(2)
在上文 Python脚本转换Typora中的Html标签(1)当中,介绍了一种转换
<span>
标签的方式,接下来分析转换Typora中<img>
标签的方法
需求分析
首先说明一下为什么在Typora中会出现<img>
标签,主要的原因是Typora支持对图像的缩放,而这种缩放是传统markdown语法所不具备的,是利用html中的<img>
实现的,具体可以参考一下以下的例子,对于同一张图片
-
使用markdown进行插入的格式如下图
-
使用
<img>
标签进行插入的格式如下图所示
而事实上对于Typora用户来说这是没有区别的,但是对于csdn来说,经过缩放后的图片是不会被转存的,也就是说博客当中使用的图片链接均是原有的链接,而对于使用自己图床的用户来说,就存在图片被盗链的风险(关于盗链可以自行搜索一下),而csdn是会对正常图片进行转存处理的,这样也相对比较安全,那么接下来就给出将<img>
标签转换为markdown语法的python脚本
首先建立了如下的目录结构
transmd
├── transform.py
├── transformed
└── wait_transform
其中
-
wait_transform
文件夹需要提前创建用于存放待转换的markdown文件 -
transformed
文件夹为脚本自动创建,用于存放转换后的markdown文件 -
transform.py
则是用于转换markdown文件的python脚本 -
关于脚本功能的介绍可以参考上一篇文章 Python脚本转换Typora中的Html标签(1)中的介绍
transform.py
的内容如下:
import os
import traceback
import bs4
from bs4 import BeautifulSoup
class TransformMD(object):
def __init__(self):
if not os.path.exists("transformed"):
os.mkdir("transformed")
def trans_img(self, line):
"""
完成img标签到markdown图片格式的转换
<img src="url" alt="xxx" style="zoom:33%;" />
to
![xxx](url)
"""
soup = BeautifulSoup(line, "html.parser")
newLine = ''
for content in soup.contents:
if isinstance(content, bs4.element.Tag):
url = content["src"]
alt = content["alt"]
newLine += "![" + alt + "](" + url +")"
else:
newLine += str(content)
return newLine
def transform(self, filename):
try:
name = filename.split("/")[1]
savepath = "transformed/" + name[:-3] + "-transformed" + name[-3:] #生成保存路径
with open (filename, "r") as r, open(savepath, "w") as w:
for line in r.readlines():
found_img = line.find("<img") # 查找img标签
if found_img != -1:
w.write(self.trans_img(line))
else:
w.write(line)
except Exception as e:
print(filename)
traceback.print_exc()
def transformDir(self, dirname):
"""
对dirname中对所有md文件进行转换
:param dirname: 文件夹路径
"""
for path, dir_list, file_list in os.walk(dirname):
for file_name in file_list:
if file_name[-3:] == ".md":
self.transform(os.path.join(path, file_name))
if __name__ == '__main__':
TMD = TransformMD()
TMD.transformDir("wait_transform")