python 小练习之山寨版markdown格式txt文件转html文件

2 篇文章 0 订阅

本练习根据《python基础教程》课后练习一——《即时标记》改编
分为四个模块(不包括输出部分):文本解析、规则制定、过滤、处理程序,顺序如下:
这里写图片描述

规则制定

这里写图片描述
Rule模块由action和condition两部分实现,就是在遍历规则的时候通过调用condition这个东西来判断是否符合当前规则。

我们考虑了标题(H1Rule)、引用(GuideRule)、无序列表(ListItemRule&ListRule)、代码(CodeRule&CodeListRule)和普通段落(ParagraphRule),在处理程序(handlers)模块会有相应的实现。

过滤部分

采用正则表达式,对加粗、加斜和超链接做了相应的处理

        self.addFilter(r'\*([^*].+?)\*','emphasis')
        self.addFilter(r'\*{3}([^*].+?)\*{3}','bold')
        self.addFilter(r'(http://[\.a-zA-Z1-9]+)','url')

中文处理

#coding=utf-8
print data.decode('utf-8').encode('gbk')

这里写图片描述
请忽略我丑丑的布局T^T
这里写图片描述
具体代码如下:

handlers.py

class Handler:
    def callback(self,prefix,name,*args):
        method = getattr(self,prefix+name,None)
        if callable(method):
            return method(*args)
    def start(self,name):
        self.callback('start_',name)
    def end(self,name):
        self.callback('end_',name)
    def sub(self,name):
        def subsitution(match):
            result = self.callback('sub_',name,match)
            if result is None:
                match.group(0)
            return result
        return subsitution

class HTMLRenderer(Handler):
    def start_document(self):
        print '<html><head><title>...</title></head><body>'
    def end_document(self):
        print '</body></html>'
    def start_paragraph(self):
        print '<p>'
    def end_paragraph(self):
        print '</p>'
    def start_guide(self):
        print '<div style="background:#C0C0C0"><p>'
    def end_guide(self):
        print '</p></div>'
    def start_code(self):
        print '<div style="background:#F0F8FF"><ol>'
    def end_code(self):
        print '</ol></div>'
    def start_h1(self):
        print '<h1>'
    def end_h1(self):
        print '</h1>'
    def start_h2(self):
        print '<h2>'
    def end_h2(self):
        print '</h2>'
    def start_h3(self):
        print '<h3>'
    def end_h3(self):
        print '</h3>'
    def start_list(self):
        print '<ul>'
    def end_list(self):
        print '</ul>'
    def start_listitem(self):
        print '<li>'
    def end_listitem(self):
        print '</li>'
    def start_title(self):
        print '<h1>'
    def end_title(self):
        print '</h1>'
    def sub_bold(self,match):
        return '<b>%s</b>' %match.group(1)
    def sub_emphasis(self,match):
        return '<em>%s</em>' % match.group(1)
    def sub_boldandemphasis(self,match):
        return '<b>%s</b>' % match.group(1)
    def sub_url(self,match):
        return '<a href="%s">%s</a>' %(match.group(1),match.group(1))
    def feed(self,data):
        print data.decode('utf-8').encode('gbk')

rules.py

class Rule:
    flag=True
    def action(self,block,handler):
        handler.start(self.type)
        handler.feed(block)
        handler.end(self.type)
        return True
class H1Rule(Rule):
    def condition(self,block):
        return block[-1]=='#' and block[0]=='#'
    def action(self,block,handler):
        count=0;i=0;j=-1
        while block[j]=='#' and block[i]=='#':
            i=i+1;j=j-1;count=count+1
        type='h'+str(count)
        handler.start(type)
        handler.feed(block[i:j+1].strip())
        handler.end(type)
        return True
class GuideRule(Rule):
    type='guide'
    def condition(self,block):
        return block[0]=='>'
    def action(self,block,handler):
        handler.start(self.type)
        handler.feed(block[1:].strip())
        handler.end(self.type)
        return True
class ListItemRule(Rule):
    type='listitem'
    def condition(self,block):
        return block[0]=='-'
    def action(self,block,handler):
        handler.start(self.type)
        handler.feed(block[1:].strip())
        handler.end(self.type)
        return True
class ListRule(ListItemRule):
    type='list'
    inside=False
    def condition(self,block):
        return True
    def action(self,block,handler):
        if not self.inside and ListItemRule.condition(self,block):
            handler.start(self.type)
            self.inside=True
        elif self.inside and not ListItemRule.condition(self,block):
            handler.end(self.type)
            self.inside=False
        return False
class CodeRule(Rule):
    type='code'
    def condition(self,block):
        return block=='```'
    def action(self,block,handler):
        if self.flag==True:
            handler.start(self.type)
            self.flag=False
            print self.flag
        else:
            handler.end(self.type)
            self.flag=True
        return True
class CodeListRule(CodeRule):
    type='list'
    def condition(self,block):
        return True
    def action(self,block,handler):
        if self.flag==False and block!='```':
            handler.start(self.type)
            handler.feed(block)
            handler.end(self.type)
            return True
        else:
            return False

class ParagraphRule(Rule):
    type='paragraph'
    def condition(self,block):
        return True

执行

$python makeup.py

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,您需要安装 Pythonmarkdown 库,然后您可以使用以下代码来批量将 markdown 格式文件换为 html 格式文件: ``` import os import markdown # 遍历指定文件夹中的 markdown 文件 for file in os.listdir("path/to/markdown/files"): # 判断文件是否是 markdown 文件 if file.endswith(".md"): # 读取 markdown 文件内容 with open(file, "r") as f: content = f.read() # 使用 markdown 库将 markdown 格式换为 html 格式 html = markdown.markdown(content) # 将 html 代码写入新文件 with open(file[:-3] + ".html", "w") as f: f.write(html) ``` 该代码会遍历 "path/to/markdown/files" 文件夹中的所有 markdown 文件,然后使用 markdown 库将它们换为 html 代码,并将 html 代码写入新的 html 文件中。 ### 回答2: 使用Python批量将Markdown文件导出为HTML文件的代码如下: ```python import os import markdown def convert_to_html(md_file): # 读取Markdown文件内容 with open(md_file, 'r', encoding='utf-8') as file: markdown_content = file.read() # 将Markdown内容换为HTML html_content = markdown.markdown(markdown_content) # 修改文件后缀名为.html html_file = os.path.splitext(md_file)[0] + '.html' # 将HTML内容写入文件 with open(html_file, 'w', encoding='utf-8') as file: file.write(html_content) print(f'Successfully converted {md_file} to {html_file}') def batch_convert_to_html(md_folder): # 遍历文件夹下的所有Markdown文件 for root, dirs, files in os.walk(md_folder): for file in files: if file.endswith('.md'): md_file = os.path.join(root, file) convert_to_html(md_file) # 批量导出Markdown文件HTML文件 md_folder = 'path/to/markdown/folder' batch_convert_to_html(md_folder) ``` 使用这段代码,首先我们定义了一个`convert_to_html`函数,该函数接收一个Markdown文件的路径作为参数。函数内部读取Markdown文件内容,并使用`markdown`模块将其换为HTML内容。然后,我们修改文件后缀名为`.html`,并将HTML内容写入新文件中。 接下来,我们定义了`batch_convert_to_html`函数,该函数接收一个包含Markdown文件文件夹路径作为参数。函数内部使用`os.walk`方法遍历文件夹下的所有Markdown文件,并调用`convert_to_html`函数将其换为HTML文件。 最后,我们设置了一个`md_folder`变量,指定包含Markdown文件文件夹路径,并调用`batch_convert_to_html`函数进行批量换。你只需将`md_folder`变量修改为你的Markdown文件所在的文件夹路径即可。 ### 回答3: 使用Python批量导出Markdown格式文件HTML文件的代码可以使用Python的标准库markdown和os模块。 首先,需要导入所需的模块: ``` import markdown import os ``` 在代码中,首先需要指定要处理的Markdown文件所在的文件夹和导出的HTML文件存放的文件夹: ``` input_folder = 'markdown_files_folder' # Markdown文件所在的文件夹 output_folder = 'html_files_folder' # 导出的HTML文件存放文件夹 ``` 然后,可以使用os模块的listdir函数获取指定文件夹下所有文件文件名: ``` file_names = os.listdir(input_folder) ``` 接下来,通过遍历上一步得到的文件名列表,使用markdown模块的markdown函数将Markdown文件换为HTML格式的文本,并将结果写入对应的HTML文件: ``` for file_name in file_names: if file_name.endswith('.md'): # 构造输入和输出的文件路径 input_file = os.path.join(input_folder, file_name) output_file = os.path.join(output_folder, file_name.replace('.md', '.html')) # 读取Markdown文件内容 with open(input_file, 'r', encoding='utf-8') as f: markdown_text = f.read() # 换为HTML格式 html_text = markdown.markdown(markdown_text) # 写入HTML文件 with open(output_file, 'w', encoding='utf-8') as f: f.write(html_text) ``` 以上就是使用Python批量导出Markdown格式文件HTML文件的代码。通过遍历指定文件夹下的Markdown文件,将其逐个换为HTML格式并写入到指定文件夹下的HTML文件中。请注意,上述代码中需要调整文件夹路径为实际使用的文件夹路径。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值