博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单的markdown在线解析服务
阅读量:6264 次
发布时间:2019-06-22

本文共 2672 字,大约阅读时间需要 8 分钟。

hot3.png

说明

之前要写一个项目文档,需要给上级审核之后才能push到线上。直接扔markdown文件有些不合适,但将它转为pdf文件发送有点麻烦,每次修改都需要转一次,再发送。因此就有了写一个简单的markdown在线解析服务的想法。在本地搭一个服务,到时候直接给地址,意见反馈后,直接本地修改,服务更新后就能看到新版本了。

dependences

  • github.com/microcosm-cc/bluemonday
  • gopkg.in/russross/blackfriday.v2

文件目录

  • ./markdowns/* 存放需要解析的markdown文件
  • ./templates/* 存放工程需要的html模板

接口

  • / index显示扫描到的文件列表
  • /read?file=${fileName} 显示markdown转换后的HTML页面
  • /update 调用后,重新扫描文件目录

基本思路

简单的在main.go里增加一个全局以文件名称为key,具体路径为value的map。index页面就遍历这个map,read接口就从这里获取文件路径,读取返回。update也是更新这个表。后期如果增加缓存,将路径string改为自定义的struck。

实现

index.html模板

  
Document

markdownlist

{
{range $key, $value := .}} {
{$key}}
{
{end}}

main.go

package mainimport (	"fmt"	"html/template"	"io/ioutil"	"net/http"	"os"	"path/filepath"	"strings"	"sync"	"github.com/microcosm-cc/bluemonday"	"gopkg.in/russross/blackfriday.v2")var (	MARK_DOWNS_PATH = "markdowns"	TEMPLATES_PATH  = "templates"	fileMap         map[string]string	globalLock      *sync.RWMutex)func init() {	globalLock = new(sync.RWMutex)	updateMarkdownFileList()}func updateMarkdownFileList() {	globalLock.Lock()	defer globalLock.Unlock()	fileMap = make(map[string]string)	files, _ := filepath.Glob(fmt.Sprintf("%s/*", MARK_DOWNS_PATH))	for _, f := range files {		fileName := f[strings.LastIndex(f, string(os.PathSeparator))+1 : len(f)-3]		fileMap[fileName] = f	}}func readMarkdownFile(fileName string) ([]byte, error) {	globalLock.RLock()	defer globalLock.RUnlock()	markdownFile, ok := fileMap[fileName]	if !ok {		return nil, fmt.Errorf("file(%s)NotExist", fileName)	}	if fileread, err := ioutil.ReadFile(markdownFile); err == nil {		unsafe := blackfriday.Run(fileread)		html := bluemonday.UGCPolicy().SanitizeBytes(unsafe)		return html, nil	} else {		return nil, fmt.Errorf("file(%s)ReadFail", fileName)	}}func indexHandler(w http.ResponseWriter, r *http.Request) {	t := template.New("index.html")	t, _ = t.ParseFiles(fmt.Sprintf("%s%sindex.html", TEMPLATES_PATH, string(os.PathSeparator)))	t.Execute(w, fileMap)}func readerHander(w http.ResponseWriter, r *http.Request) {	name := r.URL.Query().Get("file")	body, err := readMarkdownFile(name)	if err != nil {		w.WriteHeader(http.StatusNotFound)	} else {		w.Write(body)	}}func updateHandler(w http.ResponseWriter, req *http.Request) {	updateMarkdownFileList()	w.Write([]byte("success"))}func main() {	http.HandleFunc("/", indexHandler)	http.HandleFunc("/read", readerHander)	http.HandleFunc("/update", updateHandler)	http.ListenAndServe(":8000", nil)}

小结

项目的重点就在于markdown解析成html,既然都直接使用现成的第三方包,就基本没有什么技术性。唯一需要考虑的就是锁的问题。后期还可以增加缓存来提高性能,增加trylock限制update接口更新的问题。

ennn

以下是新版本pro的代码,主要是增加了一些锁增强并发和易用性的东西,与功能无大关系

转载于:https://my.oschina.net/u/3703365/blog/1802127

你可能感兴趣的文章
Mellanox公司计划利用系统芯片提升存储产品速度
查看>>
白帽子守护网络安全,高薪酬成大学生就业首选!
查看>>
ARM想将芯片装进人类大脑 降低能耗是一大挑战
查看>>
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.6 UDP回射客户程序:dg_cli函数...
查看>>
不要将时间浪费到编写完美代码上
查看>>
《算法基础:打开算法之门》一3.4 归并排序
查看>>
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>
《锋利的SQL(第2版)》——1.7 常用函数
查看>>