1 問題由來
前幾天將個人簡書的markdown文章直接copy到然后發(fā)布到個人博客上發(fā)現(xiàn)以下兩大格式問題号醉。
1.1 圖片布局
簡書的markdown文章中的圖片不用做其他設(shè)置都是默認(rèn)居中,而在個人博客中卻默認(rèn)左對齊计雌,具體效果如下圖。對于有輕微強迫癥的筆者決定將所有圖片修改為居中對齊旬痹,搜索了一下乐设,只需在markdown文件中的圖片引用前后加上*** HTML <div> *** 標(biāo)簽即可實現(xiàn)居中。
圖片居中效果實現(xiàn):
-----空行----
<div align=center>
![網(wǎng)頁關(guān)系可視化結(jié)果](http://upload-images.jianshu.io/upload_images/3471485-81b21488533234e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
</div>
-----空行----
1.2 標(biāo)題導(dǎo)航
在簡書中需手動設(shè)定目錄姻采,如1、1.1爵憎、1.1.1等慨亲,在個人博客中,由于使用hexo主題宝鼓,其默認(rèn)目錄如下圖:
所以并不需要手動添加1刑棵、1.1、1.1.1等標(biāo)志愚铡,只需要用md語法寫完之后其會自動識別蛉签,假如還手動添加則如“1. 從Google網(wǎng)頁排序到PageRank算法”會變成“1. 1 從Google網(wǎng)頁排序到PageRank算法”。
1.3 文章題目
在簡書markdown文件頭部插入如下三行以設(shè)置文章題目沥寥。
---
title:fileName
---
那么問題就來了碍舍,每篇文章中引用的圖片肯定不止一張,標(biāo)題肯定不止一個邑雅,手動修改肯定很耗時的片橡,考慮到后續(xù)的文章大部分都會在簡書和個人博客中同步更新,所以決定偷懶利用Python字符串處理的相關(guān)知識寫個小小的Python程序?qū)崿F(xiàn)此格式轉(zhuǎn)換功能蒂阱。
2 方案步驟
- 導(dǎo)入:設(shè)置文件所在路徑锻全,導(dǎo)入md文件并將其轉(zhuǎn)換為字符串列表狂塘;
- 處理:插入文章題目录煤;循環(huán)獲取圖片引用所在列表位置索引,利用索引插入相應(yīng)居中標(biāo)簽荞胡;正則格式化標(biāo)題妈踊,將如“## 1.1.1”轉(zhuǎn)換為“## ”;
- 導(dǎo)出:設(shè)置文件導(dǎo)出路徑將其導(dǎo)出為md文件泪漂。
3 Python腳本
3.1 知識應(yīng)用
3.1.1 Python文件處理(如導(dǎo)入導(dǎo)出)
3.1.2 Python正則表達(dá)式
-
字符
點("*** . *** "):匹配任意除換行符"\n"外的字符廊营,如a.b可以匹配出abc歪泳、adc等。 -
數(shù)量詞
星號(" *** * *** "):匹配前一個字符0次或無限次露筒;
加號(" ** + ** "):匹配前一個字符1次或無限次呐伞;
問號(" ** ? ** "):匹配前一個字符0次或1次。 -
邏輯
中括號(" ** [] ** "):字符集慎式,如[0-9]伶氢,只要滿足0-9數(shù)字都會被匹配出來;
括號(" ** () ** "):被括起來的表達(dá)式作為分組瘪吏,如(abc){2}則會匹配兩個分組的字符abc癣防,即"abcabc";
或(" ** | ** "):左右表達(dá)式任意匹配一個掌眠,優(yōu)先匹配左邊表達(dá)式蕾盯,一旦左邊被匹配成功則直接跳過右邊。
詳見:
常見正則表達(dá)式
最全正則表達(dá)式
正則表達(dá)式 - 教程
正則表達(dá)式30分鐘入門教程
3.2 Python實現(xiàn)
#######################################
####實現(xiàn)簡書md和個人博客md的格式問題####
#######################################
#######################################
################使用說明################
##參數(shù)設(shè)置:文件導(dǎo)入路徑蓝丙、文件導(dǎo)出路徑##
#######################################
import re
def getContent(input_path):
'''
功能:導(dǎo)入markdown文件
@input_path:md文件所在路徑
'''
content = []
for line in open(input_path,'rb'):#二進(jìn)制讀入
content.append(line.decode())
return content
def formatCon(content,input_path):
'''
功能:統(tǒng)一markdown文件格式
@content:文章內(nèi)容列表
@input_path:md文件所在路徑
'''
#定義全局變量
global reple
#(1)插入標(biāo)題
content.insert(0,"---")
content.insert(1,"title:"+(input_path.split('/'))[-1][0:-3]) #從文件路徑提取文件名
content.insert(2,"---")
#(2)設(shè)置目錄格式
img_pat = '!['
img_index = [] #獲取圖片所在位置索引
for i in range(len(content)):
con = content[i]
tmp1 = re.findall('^\#+',con.rstrip()) #匹配模式“一個或者無數(shù)個#號開頭”
if len(tmp1)!=0:
reple = tmp1[0] +' '
content[i] = re.sub('\#+\s[0-9]\.?[0-9]?\.?[0-9]?\s+',tmp2,con.rstrip()) #匹配模式“一個或者無數(shù)個#號+空格+標(biāo)題數(shù)字+空格”
if img_pat in con:
img_index.append(i)
#(3)設(shè)置圖片居中
count = 0
for idx in img_index:
if (content[idx+count-1].strip())!="":#假如有空行則不插入空行
content.insert(idx+count,"")
count += 1
content.insert(idx+count,"<div align=center>")#設(shè)置div使圖片居中
count += 1
content.insert(idx+count+1,"</div>")
count += 1
if (content[idx+count+1].strip())!="":#假如有空行則不插入空行
content.insert(idx+count+1,"")
count += 1
return content
def writeCon(format_con,output_path):
'''
功能:導(dǎo)出markdown文件
@format_con:已格式化的文章內(nèi)容列表
@output_path:md文件導(dǎo)出路徑
'''
fh = open(output_path,'wb')
try:
for i in range(len(format_con)):
data = format_con[i]
if "\r\n" in data:
data = data
else:
data = data+"\r\n"
data = data.encode()
#print(data)
fh.write(data)
except Exception as er:
print('寫入文件時出現(xiàn)錯誤')
print(er)
finally:
fh.close()
def main(input_path,output_path):
'''
功能:主函數(shù)级遭,函數(shù)調(diào)用接口
'''
content = getContent(input_path)#獲取文本
format_con = formatCon(content,input_path)#格式化文本
writeCon(format_con,output_path)#輸出格式化文本
if __name__ == '__main__':
#1、輸入文件路徑
input_path = "C:/Users/whenif/Desktop/ggtest.md"
#2渺尘、輸出文件路徑
output_path = "C:/Users/whenif/Desktop/ggtestnew.md"
main(input_path,output_path)
參考:
[1] 常見正則表達(dá)式
本文所有代碼只用于技術(shù)交流装畅,拒絕任何商用活動
個人Github
后續(xù)的學(xué)習(xí)細(xì)節(jié)將會記錄在個人博客DebugNLP中,歡迎各路同學(xué)互相交流