题解
根据所要处理的对象可以分为多行规则、单行规则和行内规则。
单行规则:
1)标题:以‘#’开头的行是标题,需要统计出‘#’的个数,添加对应的h标签
2)单行无序列表:以*开头的单行,前后行加ul标签,本行加li标签
3)单行段落:不以#和*开头的行,前后加p标签
多行规则:
1)多行段落:连续多行构成段落,第一行开始加p标签,最后一行末尾加p标签
2)无序列表:多个连续用‘*‘开头的行,本行添加li标签,所有行前后加ul标签
行内规则:
1) 强调:行内的两个’_’所包含的内容,替换为em标签
2) 超链:行内以[Text](Link)表示的内容,转换为超链格式
代码
import sys
import re
text=[]
for i in sys.stdin.readlines():
text.append(i)
def process(lst):
if lst[-1] != "\n":
lst.append("\n")
ans = []
temp1 = []
for i in lst:
if i != "\n":
temp1.append(i)
else:
if len(temp1) != 0:
ans.append(temp1)
temp1 = []
return ans
def pro_oneline(lst): # 标题、单行无序列表、单行段落
s = lst[0]
if s.startswith("#"):
num_jin = s.count("#")
replacement = "<h"+str(num_jin)+">"
ans = re.sub(r'#+\s+',replacement,s.rstrip("\n"))
s = ans + "</h"+str(num_jin)+">"
s1 = pro_b(s)
s2 = pro_link(s1)
return [s2]
elif s.startswith("*"):
lst.insert(0,"<ul>")
s = re.sub(r'\*\s+',"<li>",s.rstrip("\n"))
s += "</li>"
s1 = pro_b(s)
s2 = pro_link(s1)
lst[1] = s2
lst.append("</ul>")
return lst
else: # 单行段落
s = "<p>"+s[:-1]+"</p>"
s1 = pro_b(s)
s2 = pro_link(s1)
return [s2]
def pro_multylines(lst): # 无序列表,多行段落
if lst[0].startswith("*"): # 无序列表
for i in range(len(lst)):
s = re.sub(r'\*\s+',"<li>",lst[i].rstrip("\n"))
s += "</li>"
s1 = pro_b(s)
s2 = pro_link(s1)
lst[i] = s2
lst.insert(0,"<ul>")
lst.append("</ul>")
return lst
else: # 段落
for i in range(len(lst)):
s = lst[i][:-1]
s1 = pro_b(s)
s2 = pro_link(s1)
lst[i] = s2
lst[0] = "<p>"+lst[0]
lst[-1] = lst[-1]+ "</p>"
return lst
# 行内规则,每一行都要处理
def pro_link(string): # 可能有多个强调
flag = -1
lst = list(string)
for i in range(len(lst)):
if lst[i] == "_" and flag == -1:
lst[i] = "<em>"
flag *= -1
elif lst[i] == "_" and flag == 1:
lst[i] = "</em>"
flag *= -1
return "".join(lst)
def pro_b(string): # 可能有多个链接
pattern = r'\[(.*?)\]\((.*?)\)'
sub_pat = r'<a href="\2">\1</a>'
res = re.sub(pattern, sub_pat, string)
return res
tpPro = process(text)
for box in tpPro:
if len(box) == 1:
# 单行情况:标题,无序列表,单行段落
box_right = pro_oneline(box)
[print(i) for i in box_right]
else:
# 多行情况:无序列表,文章段落
box_right = pro_multylines(box)
[print(i) for i in box_right]