【CSP】201703-3Markdown-题解python代码

题解

根据所要处理的对象可以分为多行规则、单行规则和行内规则。

单行规则:

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]
        

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值