golang实现markdown顶部导航移到左侧

victorl · 2018-07-12 15:15:16 · 1565 次点击 · 预计阅读时间 4 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2018-07-12 15:15:16 的文章,其中的信息可能已经有所发展或是发生改变。

最近写一个文档,由于文档太长,加上页面导航后,发现页面导航只能在页面顶部,查看文档很不方便。所以就写了个工具可以把生成好的HTML页面顶部导航移到左侧。我自己觉得挺好用的就分享出来了。

程序使用方式:
./mdleft -s ./test.html -d ./test_v0.1.0.html -t markdown左侧导航

说明:
-s    原HTML文件
-d    输出文件
-t    左侧导航标题和HTML文件标题

left.jpg


源码

package main

import (
    "bytes"
    "flag"
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
    "strings"

    "github.com/PuerkitoBio/goquery"
)

func main() {
    var err error
    var srcPath, destPath, title string
    flag.StringVar(&srcPath, "s", "", "source html file")
    flag.StringVar(&destPath, "d", "", "output html file")
    flag.StringVar(&title, "t", "", "title")
    flag.Parse()

    if srcPath == "" {
        flag.Usage()
        log.Fatalln("source file is empty")
    }

    srcPath, err = filepath.Abs(srcPath)
    if err != nil {
        flag.Usage()
        log.Fatalln(err)
    }

    if destPath == "" {
        fileName := filepath.Base(srcPath)
        if ind := strings.Index(fileName, "."); ind != -1 {
            fileName = fileName[:ind] + "_v0.0.0" + fileName[ind:]
        } else {
            fileName += "_v0.0.0"
        }
        destPath = filepath.Join(filepath.Dir(srcPath), fileName)
    }

    if !fileExists(srcPath) {
        log.Fatalf("file not exists:%s\n", srcPath)
    }

    // 读取文件
    data, err := ioutil.ReadFile(srcPath)
    if err != nil {
        log.Fatalln(err)
    }

    doc, err := goquery.NewDocumentFromReader(bytes.NewBuffer(data))
    if err != nil {
        log.Fatalln(err)
    }

    // 获取顶部导航列表
    leftUl := doc.Find("body").Find("ul").First()
    doc.Find("body").Find("ul").First().Remove()

    // 获取主体
    rightDiv := doc.Find("body").Find("div").First()
    doc.Find("body").Find("div").First().Remove()

    // 添加样式
    doc.Find("head").AppendHtml(styleLeftRight)

    // 添加左侧导航列表
    doc.Find("body").AppendHtml(leftDivStr)
    if title != "" {
        doc.Find("title").First().SetText(title)
        doc.Find("body").Find("div.left-div").AppendHtml(getDocTitle(title))
    }
    doc.Find("body").Find("div.left-div").AppendSelection(leftUl)
    doc.Find("body").AppendHtml(rightDivStr)

    // 添加右侧主体
    doc.Find("body").Find("div.right-div").AppendSelection(rightDiv)

    // 添加调整右侧宽度的js
    doc.Find("html").AppendHtml(scriptWidth)

    // 输出文件
    ret, err := doc.Html()
    if err != nil {
        log.Fatalln(err)
    }
    err = ioutil.WriteFile(destPath, []byte(ret), 0644)
    if err != nil {
        log.Fatalln(err)
    }
}

func fileExists(name string) (ok bool) {
    if _, err := os.Stat(name); err != nil {
        if os.IsNotExist(err) {
            return false
        }
    }
    return true
}

func getDocTitle(s string) (title string) {
    return fmt.Sprintf(`<h2  style="color:rgb(40, 153, 206)" >%s</h2>`, s)
}

var (
    leftDivStr     = `<div id="left-001" class="left-div"></div>`
    rightDivStr    = `<div id="right-001" class="right-div"></div>`
    styleLeftRight = `
    <style>
        body {
            border: 1px solid #ddd;
            outline: 1300px solid #fff;
            margin: 16px auto;
        }

        .left-div {
            float: left;
            padding-right: 10px;
            position: fixed;
            overflow-y: scroll;
            height: 100%
        }

        .right-div {
            float: right;
            padding-left: 10px;
        }
    </style>
      `
    scriptWidth = `
    <script type="text/javascript">
        var width = window.innerWidth - document.getElementById("left-001").offsetWidth-50;
        document.getElementById("right-001").style.width = width+"px";
    </script>
    `
)

`

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1565 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传