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.pyempty_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的小程序的更多相关文章

  1. 微信小程序开发——活动规则类文案文件读取及自动转换为小程序排版代码

    前言: 最近做的小程序活动规则内容比较多,且一直处于修改中.由于小程序并不支持类似Html5中的预排版,所以,活动规则内容修改较大的时候,仍需要对新的内容用小程序的<text>组件做下排版 ...

  2. 采用pandas读取文件,进行自动化统计小程序

    自己完成的第二个自动化统计小程序,完成之后感觉:命名不够规范,造成可读性比较没那么好,幸好给自己很多地方都加了注释#coding:utf-8import os,sysimport reimport x ...

  3. 自动生成.py文件头部的C语言小程序

    每次都 vi xxx.py 然后再打 #!/usr/bin/env python 等等的程序头信息感觉有点麻烦,于是便想着写一个小程序自动生成这些头信息了,顺便在 ~/.bashrc 里写入 alia ...

  4. 关于markdown文件插入图片遇到的小问题和解决办法

    今天用md文件时候发现需要插入图片,以前没做过,所以写下来分享下. 1.先在自己的github上建一个仓库,里面新建个img文件夹存放图片,怎么建仓库可以上网找资料,这里就不详细说明了.建好的仓库如下 ...

  5. 根据文件夹更改样本文件名小程序.py

    #按照文件名设置标签并将其插入文件名中import osimport shutil#获取目标文件夹的路径a= r'C:\Users\yy\Desktop\tianchi大赛\guangdong_rou ...

  6. 小程序学习笔记三:页面文件详解之视图层WXML、WXS、WXSS文件

      视图层:Pages主要有 wxml页面文件和模板文件.wxs脚本文件.wxss样式文件:component是抽取出来的业务单元,同样拥有wxml页面文件和模板文件.wxs脚本文件.wxss样式文件 ...

  7. 微信小程序开发---各代码文件简介

    根据上一文,已建立QuickStart 项目,该项目系本人毕设部分内容,所以记录以便以后查阅 开发小程序就必须了解小程序项目目录结构和文件作用,接下来就根据我现在自学得到的知识把这些记录下来. 一.目 ...

  8. 小程序云开发--云函数上传文件或图片 base64

    云函数开发遇到的问题 在微信云开发环境当中,普通的用户并没有往云存储内写入文件的权限 所以普通用户想要使用wx.cloud.uploadFile显然是不现实的 但是我们同时也知道,云函数是后台服务端, ...

  9. C#windows桌面应用小程序制作——大文件数据分段解析存储

    现在的任务就是做一个大文件解析的桌面应用小程序,具体需求就是:将一个很大的文件里的数据按一定标志拆分然后分别保存到某个文件夹下面. 解析的文件内容为以下内容: windows 应用小程序界面 具体代码 ...

随机推荐

  1. 链上链下交互 以太坊Dapp接口开发

    主要是指的是用NodeJs调用 提供接口供前端使用 用户查询和转账 以太坊Dapp项目 众筹项目 功能需求 路人 查看所有众筹项目, 2 @ OK 根据众筹项目的address获取该众筹的详情 (参与 ...

  2. 使用ZSetOperations(有序)操作redis

    方法 c参数 s说明 Boolean add(K key, V value, double score); K key:集合key V value:key对应的值 double score:分数  向 ...

  3. ng2模板语法/内置指令速查表

    https://www.angular.cn/docs/ts/latest/guide/cheatsheet.html

  4. ArcGIS API for javascript中搜索框的使用问题

    我们在开发中常常需要用搜索框去搜索地图上的某个数据,然后在地图上显示出来.这个时候我们要用到esri.dijit.Search().在设置里面的sources的时候,需要注意一点:必须要使用在线的fe ...

  5. PokeCats开发者日志(五)

      现在是PokeCats游戏开发的第八天的上午,来记录一下将PokeCats上传到360移动开放平台的过程.   首先点创建游戏.   会弹出这个东东.   个人只能创建免费游戏啊,TAT.算了,反 ...

  6. JAVA第八周课堂笔记

  7. BZOJ4448 SCOI2015情报传递(离线+树链剖分+树状数组)

    即滋磁单点修改,询问路径上小于某数的值有多少个.暴力树剖套个主席树(或者直接树上主席树,似乎就1个log了?感觉不一定比两个log快)即可,然而不太优美. 开始觉得可以cdq,然而就变成log^3了. ...

  8. MySQL之数据库及表的修改和删除

    本文章来自实验楼的操作过程和其中相应地解释.(博客园不知道怎么回事,上传图片总是失败.) 一.对数据库修改 1)删除数据库的命令为:DROP DATABASE 数据名; 二.对表的修改 1)重命名一张 ...

  9. 微信小程序base64编码解码以及utf-8解码

    function base64_encode (str) { // 编码,配合encodeURIComponent使用 var c1, c2, c3; var base64EncodeChars = ...

  10. 安卓下拉刷新空间SwipeRefreshLayout的基本使用

    1.先写布局文件 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/refresh" androi ...