让Hugo Papermod主题支持 Mermaid

由于我的博客文章里面用到了mermaid绘制流程图,从Jekyll迁移到Hugo之后,使用的PaperMod主题是默认不支持mermaid渲染的,搜了很多帖子,看到有很多解决办法。 比如有定义 /layouts/shortcodes/mermaid.html 的,然后在代码里面,需要用到mermaid的地方(文章里面)这样写: {{ <mermaid> }} ... 这里写mermaid内容 {{ </mermaid> }} 但是这样的写法不是我想要的,我想要的是保留原来的写法,能够在渲染成html的时候,动态渲染 .language-mermaid 这个类的元素为 mermaid代码块。 查了一下PaperMod这个主题的代码,发现预留了 extend_head.html 这个扩展html头,太棒了!我们就可以在不改变原有主题代码的情况下,增添自己的head内容! 首先,我们新建一个文件: layouts/partials/extend_head.html,然后在里面写上mermaid的初始化代码: <!-- 使用cdn加载文件 --> <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script> <script> // 自定义mermaid配置 const config = { startOnLoad:true, theme: 'forest', themeVariables: { lineColor: "#fafafa" // 由于paperMod的代码块背景是黑色的,这里将线条设置为白色 }, flowchart: { useMaxWidth:false, htmlLabels:true } }; mermaid.initialize(config); // 需要注意的是,要将初始化代码放到 window.onload 回调函数里面才有用 // 否则会因为在html元素加载前进行初始化,找不到元素而失效 window.onload = () => { window.mermaid.init(undefined, document.querySelectorAll('.language-mermaid')); } </script> Ok!现在,我的文章就可以支持使用mermaid画图了! graph LR Hello --> Mermaid --> Yes

<span title='2022-03-10 09:40:06 +0800 +0800'>March 10, 2022</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;LingZihuan

Jinja2: 判断变量是否为空、存在等

在 Jinja2 模板中,我们经常需要判断一个变量是否存在,里面的值是否为空等等。 检查变量是否存在,或者是否被定义 {% if variable is defined %} variable is defined {% else %} variable is not defined {% endif %} 检查数据的长度是否为空 对于列表类型的变量,我们可能需要知道这个列表是否为空的 {% if variable | length %} variable is not empty {% else %} variable is empty {% endif %} 需要注意的是,如果这个变量为非列表类型,模板渲染的时候会报错 检查变量值是否为True {% if variable is sameas true %} variable is true {% else %} variable is not true {% endif %} 同样,我们也可以用关键字and来实现多个判断 判断变量存在且不为空(列表型变量) {% if variable is defined and variable | length %} variable is defined and is not empty {% else %} variable is not defined or empty {% endif %} 判断变量存在且为true(布尔型变量) {% if variable is defined and is sameas true %} variable is defined and is true {% else %} variable is not defined or not true {% endif %}

<span title='2022-03-09 00:00:00 +0000 UTC'>March 9, 2022</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;LingZihuan

10. go深入:Go 中的指针

什么是指针 可以简单将指针理解为内存地址。 指针是一种数据类型,用来存储一个内存地址,该地址指向存储在该内存中的对象,可以是整型、字符串、或者是我们自定义的任意结构体类型。 也可以理解为:指针就是一本书上的目录上面的页码,这个页码指向具体的内容。 指针的声明和定义 以字符串指针为例 // 声明一个字符串指针变量 var sp *string // 直接通过 & 操作符获取一个字符串的地址 s := "Hello world." sp := &s // 还可以使用 new 函数,传入一个类型作为参数,用以返回该类型的指针 sp := new(string) 指针的操作 针对指针的操作,有两种:获取或者修改指针指向的值 获取指针指向的值 使用 *指针变量 获取指针指向的值,如 *sp 获取sp指针指向的内存地址的值。 修改指针指向的值 修改跟获取值也是类似的,使用 *指针变量 = 值 来修改,如 *sp = "new value",这样,就把 sp指针指向的内存地址值修改为了 new value 注意 另外,通过 var sp *string 定义的sp指针,初始值是nil,表示它没有指向任何一块内存地址,我们不能够对它进行取值和赋值操作,否则,会提示: invalid memory address or nil pointer dereference 要解决这个问题,只需要使用 new 函数给该地址分配一块内存即可: var sp *string = new(string) ...

<span title='2022-03-06 00:00:00 +0000 UTC'>March 6, 2022</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;LingZihuan

9. go并发:Go 中的并发模式

for select 模式 这是一种常见的并发模式,我们一般使用 for {} 死循环,然后里面加select配合channel,获取协程的终止信号,来控制协程的退出 for { select { case <- done: // received stop signal, stopping. return default: // processing ... } } 类似的还有 for range select模式,主要就是使用 for ... range 遍历某个数据数组,将数据发送到channel里面: for _, value := range []int{} { select { case <- done: // 接受到终止信号 return case resultCh <- value: // do nothing but put value to rsult channel } } select timeout 模式 select timeout模式,核心在于使用 time.After(t time.Duration) 返回一个定时的channel,使用select配合这个channel控制协程的退出。 来看一个网络访问超时的demo: func main(){ result := make(chan string) go func(){ // simulate internet visiting... time.Sleep(5 * time.Second) result <- "Done, internet visited." }() select { case v := <-result: fmt.Println("result from internet: ", v) case <- time.After(3 * time.Second): fmt.Println("Timeout!") } } pipeline 模式 pipeline流水线模式,顾名思义,就是整一个生产流程中有多个工序,后面的工序依赖前面一道工序的结果。 ...

<span title='2022-03-04 00:00:00 +0000 UTC'>March 4, 2022</span>&nbsp;·&nbsp;3 min&nbsp;·&nbsp;LingZihuan

让github page支持mermaid语法

目前,github page 会将 markdown里面的 mermaid 块渲染成为一个 div.language-mermaid 的 html 代码块,但是,mermaid-js仅支持渲染 div.mermaid 的html代码块,因此,我们需要做一点处理。 我们只需要在文章模板的末尾,添加如下转化代码即可: 文件:_layouts/post.html {%- if content contains 'mermaid' -%} <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script> <script> const config = { startOnLoad:true, theme: 'forest', flowchart: { useMaxWidth:false, htmlLabels:true } }; mermaid.initialize(config); window.mermaid.init(undefined, document.querySelectorAll('.language-mermaid')); </script> {% endif %} 上述代码手动将 div.language-mermaid 添加到 mermaid引擎的渲染中。 引用 在文章里面指定文章layout,即可引用,并且渲染mermaid! --- layout: post --- 其他方法 当然也可以在 _config.yml 配置kramdown, 让其可以将 mermaid 块渲染成 div.mermaid 这样的html的代码块,但是实现起来有点复杂。 参考: Issue https://github.com/gettalong/kramdown/issues/637

<span title='2022-03-04 00:00:00 +0000 UTC'>March 4, 2022</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;LingZihuan