Markdown文件导出为HTML的小程序
Markdown文件导出为HTML的小程序
为什么做
最近把一些学习经验记下来,总结成MarkDown文件,不知不觉已经有12篇了。
Sublime Text 的 MarkDown Preview 插件能够将MarkDown语法转换为HTML,并提供三种预览方式:浏览器预览、保存为HTML文件、输出到Sublime的新标签页。
但有一个缺点是,我有12个MarkDown文件,想分别转换为HTML文件,需要重复执行12次打开文件->Crtl+P调出命令面板->输入MarkDown Preview->选择Save To HTML->选择保存路径->确定。
我突发奇想,Sublime是基于Python的,何不利用MarkDown Preview的API,写一个Python脚本,进行批量转换。这样,无论是12篇,还是120篇,都可以通过一个命令轻松完成转换,避免了重复劳动。
怎么做的
我通过Sublime的Preferences->Browse Packages找到了一个名为python-markdwon的文件夹,似乎是用来支持MarkDown转换的。
阅读了其中的__init__.py文件,了解到这个包可以将MarkDown转换为HTML。它提供了两个API:
html = markdown.markdown(your_text_string)
html = markdown.markdownFromFile(file_name)
如此简单易用,就是它了!
经过测试,markdown.markdownFromFile()这个函数对中文支持较差:如果文件内容含有汉字,转换后的html字符串出现奇怪的乱码。似乎可以提供附加参数指定编码格式,但我决定不去偷这个懒(好吧,其实是懒得去研究源代码)。
设计思路很简单:
在指定文件夹内读取所有.md文件:
for x in os.listdir('./input'):
if os.path.splitext(x)[1]=='.md':
...
对每个.md文件,其内容是一个字符串
with open('/path/file_name.md', 'r') as f:
md = f.read()
利用
markdown.markdown()转换为HTML格式对字符串
html = markdown.markdown(md)
将HTML格式字符串写入到.html文件内
with open('/path/file_name.html', 'w') as f:
f.write(html)
当然,其中还要考虑路径、字符编码等问题。这里并没有列出,详细代码可参看下文。
怎么用
我建立了这样的文件结构:
.
|---markdown
|
|---input
| |---1.md
| |---2.md
|
|---output
| |---1.html
| |---2.html
|
|---run.py
|
|---empty_output.py
markdown文件夹是从Sublime插件目录的python-markdown直接复制过来的。
input文件夹内放的是转换前的MarkDown文件,目前只支持英文文件名。
output文件夹里是自动生产的转换后的HTML文件,与对应的MarkDown文件同名。
run.py是执行的脚本文件,用来将MarkDown转换为HTML。
empty_output.py用来清空output文件夹的内容,但不删除该文件夹。
运行步骤很简单:
将MarkDown文件通通放入input文件夹下
命令行执行
python run.py去output文件夹下找转换后的文件
为什么只支持英文文件名呢?这个问题我也想解决,搜了一些博客,在MacOS下测试中文文件名都一切OK。但是换到了Windows下就翻脸不认人。还是我Python道行太浅,索性就只支持英文文件名吧。
做出了什么
这里贴一下run.py和empty_output.py的代码。最核心的转换算法python-markdown可以在GitHub上搜到。
整个程序的源码可以在这里得到。
run.py
import os
import markdown
import codecs
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
input_dir = './input'
ouput_dir = './output'
input_file_type = '.md'
ouput_file_type = '.html'
print '\n'
for full_input_file_name in os.listdir(input_dir):
if os.path.splitext(full_input_file_name)[1]==input_file_type:
print 'Converting ' + full_input_file_name + ' ...'
file_name = os.path.splitext(full_input_file_name)[0]
full_input_file_name = input_dir + '/' + full_input_file_name
full_ouput_file_name = ouput_dir + '/' + file_name + ouput_file_type
with codecs.open(full_input_file_name, 'r') as ifile:
in_file_content = ifile.read()
ou_file_content = markdown.markdown(in_file_content)
with codecs.open(full_ouput_file_name, 'w', 'gbk') as ofile:
ofile.write(ou_file_content)
print '\nAll Done!'
empty_output.py
import os
import markdown
import codecs
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
ouput_dir = './output'
print '\n'
for file_name in os.listdir(ouput_dir):
print 'Deleting ' + file_name + ' ...'
full_file_name = ouput_dir + '/' + file_name
os.remove(full_file_name)
print '\nAll Done!'
Markdown文件导出为HTML的小程序的更多相关文章
- 微信小程序开发——活动规则类文案文件读取及自动转换为小程序排版代码
前言: 最近做的小程序活动规则内容比较多,且一直处于修改中.由于小程序并不支持类似Html5中的预排版,所以,活动规则内容修改较大的时候,仍需要对新的内容用小程序的<text>组件做下排版 ...
- 采用pandas读取文件,进行自动化统计小程序
自己完成的第二个自动化统计小程序,完成之后感觉:命名不够规范,造成可读性比较没那么好,幸好给自己很多地方都加了注释#coding:utf-8import os,sysimport reimport x ...
- 自动生成.py文件头部的C语言小程序
每次都 vi xxx.py 然后再打 #!/usr/bin/env python 等等的程序头信息感觉有点麻烦,于是便想着写一个小程序自动生成这些头信息了,顺便在 ~/.bashrc 里写入 alia ...
- 关于markdown文件插入图片遇到的小问题和解决办法
今天用md文件时候发现需要插入图片,以前没做过,所以写下来分享下. 1.先在自己的github上建一个仓库,里面新建个img文件夹存放图片,怎么建仓库可以上网找资料,这里就不详细说明了.建好的仓库如下 ...
- 根据文件夹更改样本文件名小程序.py
#按照文件名设置标签并将其插入文件名中import osimport shutil#获取目标文件夹的路径a= r'C:\Users\yy\Desktop\tianchi大赛\guangdong_rou ...
- 小程序学习笔记三:页面文件详解之视图层WXML、WXS、WXSS文件
视图层:Pages主要有 wxml页面文件和模板文件.wxs脚本文件.wxss样式文件:component是抽取出来的业务单元,同样拥有wxml页面文件和模板文件.wxs脚本文件.wxss样式文件 ...
- 微信小程序开发---各代码文件简介
根据上一文,已建立QuickStart 项目,该项目系本人毕设部分内容,所以记录以便以后查阅 开发小程序就必须了解小程序项目目录结构和文件作用,接下来就根据我现在自学得到的知识把这些记录下来. 一.目 ...
- 小程序云开发--云函数上传文件或图片 base64
云函数开发遇到的问题 在微信云开发环境当中,普通的用户并没有往云存储内写入文件的权限 所以普通用户想要使用wx.cloud.uploadFile显然是不现实的 但是我们同时也知道,云函数是后台服务端, ...
- C#windows桌面应用小程序制作——大文件数据分段解析存储
现在的任务就是做一个大文件解析的桌面应用小程序,具体需求就是:将一个很大的文件里的数据按一定标志拆分然后分别保存到某个文件夹下面. 解析的文件内容为以下内容: windows 应用小程序界面 具体代码 ...
随机推荐
- Mapper的方式总结
Mapper的方式总结: <mappers> <!-- 通过package元素将会把指定包下面的所有Mapper接口进行注册 --> <package name=&quo ...
- ajax 异步刷新,需要填写的参数
参数 options 类型:Object 可选.AJAX 请求设置.所有选项都是可选的. ******* async 类型:Boolean 默认值: true.默认设置下,所有请求均为异步请求.如果需 ...
- Daily Scrum02 11.29
今天大家都已经开始了进行第二轮迭代的工作!相比第一轮迭代,每个人都已经有了一定开发经验,这次做起来顺手很多.薛神和肖犇的挑战最大,他们需要实现好友功能,手机间的通信.服务器的搭建都是难点,但他们的热情 ...
- linux进程同步之信号量
首先了解一下,信号量机概念是由荷兰科学家Dijkstr引入,值得一提的是,它提出的Dijksrtr算法解决了最短路径问题. 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享 ...
- springmvc项目搭建四-基于前端框架完善页面的数据显示
上一篇把前端框架先放上去了,现在开始前后端进行交互,对数据进行显示. 效果如图所示...中间经历了数据显示不上去的问题,是对于spring的注解了解不够,问题及其解决可以参照上一篇问题处理... 目前 ...
- JQuery实现的智能表单提示
实现一个类似如此效果的表单验证:
- Resources for Browser/Webkit/GPU
Tali Garsiel's site: http://taligarsiel.com/ Webkit Main Flow Chromium Project: http://www.chromium. ...
- 关于如何利用原生js动态给一个空对象添加属性以及属性值
首先,回忆一下,访问对象属性一共有两种方法:点获取法和方括号获取法.而我们最常用的就是点获取法了.但是当我们遇到需要给对象动态添加属性和属性值时,点获取法好像就不太好用了,尤其是我们不知道属性名的时候 ...
- TCP/IP Note4
TCP/IP邮件 你的电子邮件程序会使用不同的TCP/IP协议: 使用SMTP来发送邮件: 使用POP从邮件服务器下载邮件: 使用IMAP连接到邮件服务器 1. SMTP - 简单邮件传输协议 SMT ...
- AGC018D Tree and Hamilton Path(树+树的重心)
题目大意: 给你一棵n个结点树,然后根据这棵树构造一个完全图,求完全图的一条最长的哈密顿路径. 构造方式是,完全图中的dis(u, v)就等于树上的u和v的距离. 题解: 这...这..不就是杜教的那 ...