docsify迁移到hugo过程
目录
本文是关于从docsify转移到hugo的过程记录
hugo介绍
批量转换markdown文章
python脚本实现,myscript/python/hugoMd.py
-
遍历完善md文件,遍历文件
walk方法遍历docsify下docs目录的所有目录与md文件
-
忽略index.md README.md more.md及非md后缀文件
-
获取文件完整路径及扩展名
-
获取文件名(作为Title)、文件父级目录、文件爷爷级目录(目录将作为hugo的Category,最多2级)
-
获取文件创建时间、修改时间、访问时间
-
读取文章内容
-
去除文章内容前后空白字符
-
文章内容词频分析,匹配标题,过滤2个汉字以下/3个字符以下,获取前三高频单词作为标签和关键词
-
生成hugo文章meta属性格式设置(标题、时间等含固定属性:isCJKLanguage: true)
-
检测<!–TOC–>,若存在,则将 <!–TOC–> 替换为 <!–TOC–><!–more–>;若不存在,文章内容按行转换成列表,将第4行追加<!–more–>,join成字符串,准备写入文件
-
检查content/post/pathdir/是否存在,否则创建(pathdir对应docsify下的docs/pathdir,支持多级目录创建)
-
将调整后的文章内容写入content/post/pathdir/文件名.md
-
python hugoMd.py > mdlog
修改内联md路径
内联md路径,原默认方式:
[window10搭建hugo博客](/互联网/GO/window10搭建hugo博客.md)
采用hugo 短代码 ref方式:
[window10搭建hugo博客]({{< ref"post/互联网/GO/window10搭建hugo博客.md" >}})
ref的方式,hugo在编译的时候,会动态替换成相应的文章真实URL地址,不需要写作者自己复制文章已经发布的地址,甚至解决无法使用未发布的文章地址问题。
-
vscode中项目搜索”.md)”
通过全局目录找出带有”.md)“关键词的文章,不多,直接手动每一篇文章
-
匹配到的文件正则替换
正则替换: (记住在替换的时候,一定要选择正则模式)
\(([^()]*\.md)\) 为 ({{< ref"post$1" >}})
注:
在已经生成的hugo项目新文章中批量修改(content/post/)
前提:原docsify中的内联路径必须是完整路径
一些关键配置
配置文件config.toml,使用tranquilpeak主题
-
uglyURLs:true
支持.html后缀地址
-
permalinks
post = “/:month:year/:slug”
-
[author] picture
注意sidebar.html中的头像并没有使用到该配置,需要调整成如下:
<div class="sidebar-profile"> <a href="{{ if $.Site.Params.sidebar.profile.url }}{{ $.Site.Params.sidebar.profile.url }}{{ else }}{{ "/" }}{{ end }}"> <img class="sidebar-profile-picture" src="{{ $.Site.Author.picture }}" alt="{{ i18n "global.author_picture" }}" /> </a> <h4 class="sidebar-profile-name">{{ $.Site.Author.name }}</h4> {{ with $.Site.Author.bio }} <h5 class="sidebar-profile-bio">{{ . | markdownify }}</h5> {{ end }} </div>
-
favicon
建议favicon上传到云端
-
params.customJS
开启customJS,后续补充百度统计及百度自动提交js代码
-
params.header.rightLink
[params.header.rightLink] class = "open-algolia-search" icon = "search" url = "/search.html"
搜索不采用algolia,后面将介绍如何实现自定义的search.html
-
params.valine
支持评论,后面将介绍valine使用
-
markup
# https://gohugo.io/news/0.60.0-relnotes/ # support inline html [markup] [markup.goldmark] [markup.goldmark.renderer] unsafe = true
该配置为了支持md文章中的html代码块,编译后可以渲染html代码块的效果,比如在md文件中嵌入一个腾讯视频的通用代码:
#上面视频的通用代码块 <iframe frameborder="0" src="https://v.qq.com/txp/iframe/player.html?vid=n0020yrnly7" allowFullScreen="true"></iframe>
修改主题模板
使用tranquilpeak主题,在其基础上进行一些微调整
-
调整post/meta.html支持字数、阅读时长、标签、分享、操作
<span> | 大约{{.WordCount}}字 | 预计{{.ReadingTime}}分钟读完 | {{ partial "post/valine-vistor.html" $}} </span>{{ partial "post/tag.html" $ }}
-
修改主题中不支持分类、标签 .html后缀
-
屏蔽自动生成的toc,使用手动添加的toc
_default/single.html
{{ (replaceRE "<!--\\s*[t|T][o|O][c|C]\\s*-->" (printf "<h1 id=\"table-of-contents\">%s</h1>" (i18n "post.toc") ) .Content) | safeHTML }}
接入valine评论及阅读数
valine官方:https://valine.js.org
-
评论与阅读数
增加post/valine.html
{{ if .IsPage }} {{ if not (eq .Params.comments false) }} <!-- valine --> {{- if .Site.Params.valine.enable -}} <!-- id 将作为查询条件 --> <span id="{{ .Permalink | relURL }}" class="leancloud_visitors" data-flag-title="{{ .Title }}" style="color: #b3b3b3;"> <span class="post-meta-item-text"> </span> <span class="post-meta-item-text">v </span> <span class="leancloud-visitors-count">1109</span> <p></p> </span> <span class="post-meta-item-text"> </span> <!-- <p></p> --> <div id="vcomments"></div> <script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script> <script src='//unpkg.com/valine/dist/Valine.min.js'></script> <script type="text/javascript"> new Valine({ el: '#vcomments' , appId: '{{ .Site.Params.valine.appId }}', appKey: '{{ .Site.Params.valine.appKey }}', notify: {{ .Site.Params.valine.notify }}, verify: {{ .Site.Params.valine.verify }}, avatar:'{{ .Site.Params.valine.avatar }}', placeholder: '{{ .Site.Params.valine.placeholder }}', visitor: {{ .Site.Params.valine.visitor }} }); </script> {{- end }} {{ end }} {{ end }}
在post/action.html中追加:
{{ partial "post/valine.html" . }} <ul class="post-actions post-action-share" ></ul>
在文章底部就会出现valine的评论框和阅读数,至于valine的注册使用请valine官方:https://valine.js.org
-
valine评论通知与过滤
@todo
-
关于valine的评论管理
由于Valine 是无后端评论系统,所以也就没有开发评论数据管理功能。请自行登录Leancloud应用管理。
具体步骤:登录>选择你创建的应用>存储>选择Class Comment,然后就可以尽情的发挥你的权利啦(~ ̄▽ ̄)~
自定义站内搜索
在content下创建一个search.html,具体内容看下搜索 - 9ong这个页面的源码即可
在content下的html文件也会被编译到网站根目录下
文章内容部分隐藏设置
直接贴代码
<!-- 支持私藏阅读 -->
{{if .Params.showless }}
<script>
let contentDiv = document.getElementsByClassName("post-content");
let allContent = contentDiv[0].innerHTML;
let partContentLength = allContent.length * 0.25;
contentDiv[0].innerHTML = allContent.substr(0,partContentLength) + '<p style="color:red;font-size:large;">【可能内容或版权原因,剩余内容未展示】...</p>';
// var btn = document.querySelector('view-button');
// btn.onclick = function(){
// contentDiv[0].innerHTML = allContent;
// btn.style.display = 'none'
// }
</script>
{{ end }}
后续考虑密码访问,甚至后续付费访问的可能
百度统计与收录提交
-
百度统计
获取统计代码后,直接放入customJS定义的js文件中(去除<script>标签)
-
百度收录
提供了快速收录、普通收录,普通收录可以主动API推送、自动推送(js)、sitemap、手动提交
我们这里除了提交sitemap外,还增加了自动推送,将百度资源提供的自动推送的js代码放入customJS定义的js文件中(去除<script>标签)
网站编译及部署
-
本地调试
直接启动自带服务器
hugo server
-
正式编译
这里我们把内容md文件、配置、主题 与 编译后的静态网站资源分开,比如原内容项目在9ong/目录,编译后的静态网站资源目录用9ong-html,而不是直接编译默认使用9ong/public/目录
hugo -d D:\9ong-html
-
部署
github、vps、云托管
github、vps可以采用git的方式push
云托管,比如七牛云,可以使用qiniu-sync.py同步
网站访问限流
参考这篇关于nginx限流的文章:https://www.cnblogs.com/biglittleant/p/8979915.html
禁止转载,如需转载请联系作者