六一的部落格


关关难过关关过,前路漫漫亦灿灿。




说明

Hugo最终将markdown格式的博文转换成html格式

将markdown文件中的标题, 图片, 链接, 代码框转换成html格式时, 我们可以为其指定样式, 存放在 themes/tess/layouts/_default/_markup 目录下

Hugo转换时, 去该路径下查找, 一旦发现对应名称文件, 使用指定html样式生成元素. 也就是说, 存在对应名称文件, 文件内容如果为空, 将移去所有匹配元素

因为不需要我们指定路径, 文件路径不要写错


Markdown render hooks

Markdown render hooks

Hugo目前对标题, 图片, 链接, 代码框提供支持

文件名
标题 render-heading.html
图片 render-image.html
链接 render-link.html
代码框 render-codeblock.html

本文主要设置代码框样式


标题模板

1<!-- 
2     匹配
3     ### Section A
4  -->
5<h{{ .Level }} id="{{ .Anchor | safeURL }}">{{ .Text | safeHTML }} <a href="#{{ .Anchor | safeURL }}"  class="anchor" aria-hidden="true">#</a></h{{ .Level }}>

图片模板

添加了图片样式

Bootstrap 5-Images

1<!-- 
2     只能匹配
3     ![Text](https://gohugo.io/images/hugo-logo-wide.svg "Title")
4  -->
5<p class="md__image">
6  <img src="{{ .Destination | safeURL }}" class="img-thumbnail rounded" alt="{{ .Text }}" {{ with .Title }} title="{{ . }}"{{ end }} />
7</p>

链接模板

1<!-- 
2     只能匹配
3     [Text](https://www.gohugo.io "Title")
4  -->
5<a href="{{ .Destination | safeURL }}"{{ with .Title }} title="{{ . }}"{{ end }}{{ if strings.HasPrefix .Destination "http" }} target="_blank" rel="noopener"{{ end }}>{{ .Text | safeHTML }}</a>

代码框模板

  1. 支持的语言

    List of Chroma highlighting languages

  2. 高亮方案选择 dracula

    Chroma Style Gallery

  3. 使用merge合并配置选项

    collections.Merge

  4. 选项说明

    transform.Highlight-Options

    • 行号: 文本和无法识别的语言不显示行号

      关键字 linenos

      inline 时, 同时设置了两个选项, linenos 为true, lineNumbersInTable 为false

      code block render hooks

    • 高亮样式

      关键字 style

  5. 获取转换后的代码框

    transform.HighlightCodeBlock

    • .Wrapped返回使用<div>, <pre>和<code>封装后的元素

    • .Inner则在自定义封装时使用

    Bootstrap 5 - Reboot > code-blocks

    RUNOOB - Bootstrap 5 - 代码

render-codeblock.html

 1{{ $lineNumbers := false }}
 2{{ $ignoredLanguages := slice "md" "markdown" "text" "txt" }}
 3
 4{{ if and (transform.CanHighlight .Type ) (not (in $ignoredLanguages .Type)) }}
 5  {{ $lineNumbers = "inline" }}
 6{{ end }}
 7
 8{{ $style := "dracula" }}
 9
10{{ $opts := merge .Options (dict "linenos" $lineNumbers) }}
11{{ $opts = merge $opts (dict "style" $style) }}
12
13{{ $result := transform.HighlightCodeBlock . $opts }}
14{{ $result.Wrapped }}



添加样式

  1. 创建 assets/scss/_pre.scss 文件

    代码样式

    margin-top

     1pre {     
     2  font-family: Consolas;    
     3  text-align: left; 
     4  padding: 1em;
     5
     6  margin: 0;
     7  border-radius: 5px; 
     8  white-space: pre;  
     9  word-spacing: normal;   
    10  word-break: normal;    
    11  word-wrap: normal;    
    12  line-height: 1.5;
    13
    14  tab-width: 4;
    15} 
    16
    17pre span {    
    18  line-height: 1.5rem;  
    19  white-space: pre;
    20}
  2. assets/scss/app.scss 中导入

    1@import "pre";



显示代码语言

  1. 添加样式

    assets/scss/_pre.scss

    语言样式

    display

    border-bottom

    1pre[data-lang]::before {
    2  content: attr(data-lang);
    3  display: inline;
    4  margin: auto;
    5  color: gray;
    6  border-bottom: 1px solid gray;
    7}
  2. 修改代码框模板

    • 高亮样式改为vulcan, 该方案无背景色
    • 文本框不显示语言

      compare函数
    • 转换语言文本, 可省略

    render-codeblock.html

     1{{ $lineNumbers := false }}
     2{{ $ignoredLanguages := slice "md" "markdown" "text" "txt" }}
     3
     4{{ if and (transform.CanHighlight .Type ) (not (in $ignoredLanguages .Type)) }}
     5  {{ $lineNumbers = "inline" }}
     6{{ end }}
     7
     8{{ $style := "vulcan" }}
     9
    10{{ $opts := merge .Options (dict "linenos" $lineNumbers) }}
    11{{ $opts = merge $opts (dict "style" $style) }}
    12
    13{{ if ne .Type "text"}} 
    14  {{ $text := .Type }}
    15  {{ if eq .Type "bash" }}
    16    {{ $text = "BASH" }}
    17  {{ else if eq .Type "csharp" }}  
    18    {{ $text = "C#" }}
    19  {{ else if eq .Type "cpp" }}  
    20    {{ $text = "C++" }}
    21  {{ else if eq .Type "html" }}  
    22    {{ $text = "HTML" }}  
    23  {{ end }}
    24<pre data-lang={{ $text }} class="bg-dark my-4">{{ $result := transform.HighlightCodeBlock . $opts }} {{ $result.Inner }}</pre>
    25{{ else }}
    26<pre class="bg-dark my-4">{{ $result := transform.HighlightCodeBlock . $opts }} {{ $result.Inner }}</pre>
    27{{ end }}



图片样式


图片格式说明

  1. 使用ox-hugo导出的图片链接格式

    {{< figure src=“pic.png” width=“700” >}} <br/>

  2. markdown图片链接

    ![这是图片](pic.jpg "title")
  3. 最终都转换成html图片链接

    1<img src="image.jpg" width="120" />

直接在markdown文件中使用html图片链接

Raw HTML getting omitted

  1. 转换成html文件时会被忽略
  2. 开启选项后可以使用

    config.toml
    1[markup.goldmark.renderer]
    2unsafe=true

为图片添加样式

当前图片会超出区域显示

  1. 创建 assets/scss/_image.scss 文件

    CSS图片-响应式图片

    1img {
    2    border-radius: 3px;
    3    max-width: 100%;
    4    height: auto;
    5}
  2. assets/scss/app.scss 中导入

    1@import "image";

书签

-
关于对表格使用render hooks
文本超出区域 > white-space
html自动换行

Hugo Theme - Markdown Render Hooks



说明

Hugo最终将markdown格式的博文转换成html格式

将markdown文件中的标题, 图片, 链接, 代码框转换成html格式时, 我们可以为其指定样式, 存放在 themes/tess/layouts/_default/_markup 目录下

Hugo转换时, 去该路径下查找, 一旦发现对应名称文件, 使用指定html样式生成元素. 也就是说, 存在对应名称文件, 文件内容如果为空, 将移去所有匹配元素

因为不需要我们指定路径, 文件路径不要写错


Markdown render hooks

Markdown render hooks

Hugo目前对标题, 图片, 链接, 代码框提供支持

文件名
标题 render-heading.html
图片 render-image.html
链接 render-link.html
代码框 render-codeblock.html

本文主要设置代码框样式


标题模板

1<!-- 
2     匹配
3     ### Section A
4  -->
5<h{{ .Level }} id="{{ .Anchor | safeURL }}">{{ .Text | safeHTML }} <a href="#{{ .Anchor | safeURL }}"  class="anchor" aria-hidden="true">#</a></h{{ .Level }}>

图片模板

添加了图片样式

Bootstrap 5-Images

1<!-- 
2     只能匹配
3     ![Text](https://gohugo.io/images/hugo-logo-wide.svg "Title")
4  -->
5<p class="md__image">
6  <img src="{{ .Destination | safeURL }}" class="img-thumbnail rounded" alt="{{ .Text }}" {{ with .Title }} title="{{ . }}"{{ end }} />
7</p>

链接模板

1<!-- 
2     只能匹配
3     [Text](https://www.gohugo.io "Title")
4  -->
5<a href="{{ .Destination | safeURL }}"{{ with .Title }} title="{{ . }}"{{ end }}{{ if strings.HasPrefix .Destination "http" }} target="_blank" rel="noopener"{{ end }}>{{ .Text | safeHTML }}</a>

代码框模板

  1. 支持的语言

    List of Chroma highlighting languages

  2. 高亮方案选择 dracula

    Chroma Style Gallery

  3. 使用merge合并配置选项

    collections.Merge

  4. 选项说明

    transform.Highlight-Options

    • 行号: 文本和无法识别的语言不显示行号

      关键字 linenos

      inline 时, 同时设置了两个选项, linenos 为true, lineNumbersInTable 为false

      code block render hooks

    • 高亮样式

      关键字 style

  5. 获取转换后的代码框

    transform.HighlightCodeBlock

    • .Wrapped返回使用<div>, <pre>和<code>封装后的元素

    • .Inner则在自定义封装时使用

    Bootstrap 5 - Reboot > code-blocks

    RUNOOB - Bootstrap 5 - 代码

render-codeblock.html

 1{{ $lineNumbers := false }}
 2{{ $ignoredLanguages := slice "md" "markdown" "text" "txt" }}
 3
 4{{ if and (transform.CanHighlight .Type ) (not (in $ignoredLanguages .Type)) }}
 5  {{ $lineNumbers = "inline" }}
 6{{ end }}
 7
 8{{ $style := "dracula" }}
 9
10{{ $opts := merge .Options (dict "linenos" $lineNumbers) }}
11{{ $opts = merge $opts (dict "style" $style) }}
12
13{{ $result := transform.HighlightCodeBlock . $opts }}
14{{ $result.Wrapped }}



添加样式

  1. 创建 assets/scss/_pre.scss 文件

    代码样式

    margin-top

     1pre {     
     2  font-family: Consolas;    
     3  text-align: left; 
     4  padding: 1em;
     5
     6  margin: 0;
     7  border-radius: 5px; 
     8  white-space: pre;  
     9  word-spacing: normal;   
    10  word-break: normal;    
    11  word-wrap: normal;    
    12  line-height: 1.5;
    13
    14  tab-width: 4;
    15} 
    16
    17pre span {    
    18  line-height: 1.5rem;  
    19  white-space: pre;
    20}
  2. assets/scss/app.scss 中导入

    1@import "pre";



显示代码语言

  1. 添加样式

    assets/scss/_pre.scss

    语言样式

    display

    border-bottom

    1pre[data-lang]::before {
    2  content: attr(data-lang);
    3  display: inline;
    4  margin: auto;
    5  color: gray;
    6  border-bottom: 1px solid gray;
    7}
  2. 修改代码框模板

    • 高亮样式改为vulcan, 该方案无背景色
    • 文本框不显示语言

      compare函数
    • 转换语言文本, 可省略

    render-codeblock.html

     1{{ $lineNumbers := false }}
     2{{ $ignoredLanguages := slice "md" "markdown" "text" "txt" }}
     3
     4{{ if and (transform.CanHighlight .Type ) (not (in $ignoredLanguages .Type)) }}
     5  {{ $lineNumbers = "inline" }}
     6{{ end }}
     7
     8{{ $style := "vulcan" }}
     9
    10{{ $opts := merge .Options (dict "linenos" $lineNumbers) }}
    11{{ $opts = merge $opts (dict "style" $style) }}
    12
    13{{ if ne .Type "text"}} 
    14  {{ $text := .Type }}
    15  {{ if eq .Type "bash" }}
    16    {{ $text = "BASH" }}
    17  {{ else if eq .Type "csharp" }}  
    18    {{ $text = "C#" }}
    19  {{ else if eq .Type "cpp" }}  
    20    {{ $text = "C++" }}
    21  {{ else if eq .Type "html" }}  
    22    {{ $text = "HTML" }}  
    23  {{ end }}
    24<pre data-lang={{ $text }} class="bg-dark my-4">{{ $result := transform.HighlightCodeBlock . $opts }} {{ $result.Inner }}</pre>
    25{{ else }}
    26<pre class="bg-dark my-4">{{ $result := transform.HighlightCodeBlock . $opts }} {{ $result.Inner }}</pre>
    27{{ end }}



图片样式


图片格式说明

  1. 使用ox-hugo导出的图片链接格式

    {{< figure src=“pic.png” width=“700” >}} <br/>

  2. markdown图片链接

    ![这是图片](pic.jpg "title")
  3. 最终都转换成html图片链接

    1<img src="image.jpg" width="120" />

直接在markdown文件中使用html图片链接

Raw HTML getting omitted

  1. 转换成html文件时会被忽略
  2. 开启选项后可以使用

    config.toml
    1[markup.goldmark.renderer]
    2unsafe=true

为图片添加样式

当前图片会超出区域显示

  1. 创建 assets/scss/_image.scss 文件

    CSS图片-响应式图片

    1img {
    2    border-radius: 3px;
    3    max-width: 100%;
    4    height: auto;
    5}
  2. assets/scss/app.scss 中导入

    1@import "image";

书签

-
关于对表格使用render hooks
文本超出区域 > white-space
html自动换行