目录

本文是关于从docsify转移到hugo的过程记录

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>
    

    https://gohugo.io/news/0.60.0-relnotes/

修改主题模板

使用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">&nbsp;</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">&nbsp;</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

    https://deserts.io/valine-admin-document/

  • 关于valine的评论管理

    由于Valine 是无后端评论系统,所以也就没有开发评论数据管理功能。请自行登录Leancloud应用管理。

    具体步骤:登录>选择你创建的应用>存储>选择Class Comment,然后就可以尽情的发挥你的权利啦(~ ̄▽ ̄)~

自定义站内搜索

在content下创建一个search.html,具体内容看下[搜索 - 9ong](/search.html)这个页面的源码即可

在content下的html文件也会被编译到网站根目录下

文章内容部分隐藏设置

直接贴代码

```js
<!-- 支持私藏阅读 -->
{{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 }}

```

后续考虑密码访问,甚至后续付费访问的可能

百度统计与收录提交

  • 百度统计

    https://tongji.baidu.com

    获取统计代码后,直接放入customJS定义的js文件中(去除<script>标签)

  • 百度收录

    https://ziyuan.baidu.com

    提供了快速收录、普通收录,普通收录可以主动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

禁止转载,如需转载请联系作者