最近写一个文档,由于文档太长,加上页面导航后,发现页面导航只能在页面顶部,查看文档很不方便。所以就写了个工具可以把生成好的HTML页面顶部导航移到左侧。我自己觉得挺好用的就分享出来了。
```text
程序使用方式:
./mdleft -s ./test.html -d ./test_v0.1.0.html -t markdown左侧导航
说明:
-s 原HTML文件
-d 输出文件
-t 左侧导航标题和HTML文件标题
```
---
![left.jpg](https://static.studygolang.com/180712/0e2c77c48d66b7d21720fe80678ce5ae.jpg)
---
---
## 源码
```go
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>
`
)
````
有疑问加站长微信联系(非本文作者))