摘要

上一篇 介绍了如何在 Hugo 中使用 Reveal.js 进行 Slide 分享后,这段时间把自己历史的分享逐一迁移到博客上了。这个过程中,又发现了上次方案的一些问题,并做了很多细节的调整,整理如下:

基础配置

layouts/partials/reveal.html 文件是 Reveal.js 的核心配置文件,这里有一些调整:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/5.0.2/reveal.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/5.0.2/plugin/highlight/monokai.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/5.0.2/theme/dracula.min.css"  />

<script src="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/5.0.2/reveal.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/5.0.2/plugin/markdown/markdown.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/5.0.2/plugin/highlight/highlight.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/5.0.2/plugin/math/math.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/[email protected]/plugin/mermaid/mermaid.js"></script>

{{ $js := resources.Get "js/pdfexport.js" | resources.Minify | resources.Fingerprint "sha512" }}
<script src="{{ $js.Permalink }}" integrity="{{ $js.Data.Integrity }}"></script>

<script>
document.addEventListener('DOMContentLoaded', function () {
    print_pdf = false;
    if (window.location.search.match(/\?print-pdf.*$/)) {
        print_pdf = true;
        document.querySelector('.reveal').removeAttribute('style');
        var body = document.querySelector('body');
        body.style.setProperty('--gap', '0', 'important');
        body.style.setProperty('--content-gap', '0', 'important');
        document.querySelector('#top-link').style.display = 'none';
        document.querySelectorAll('header, #vcomments').forEach(function (x) {
            x.style.height = '0';
            x.style.margin = '0';
        });
    };
    Reveal.initialize({
        mathjax3: {
            mathjax: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.min.js',
            tex: {
                inlineMath: [ [ '$', '$' ], [ '\\(', '\\)' ]  ],
                displayMath: [ ["$$", "$$"], ["\\[", "\\]"], ],
                processEscapes: true,
                processEnvironments: true,
            },
            options: {
                enableExplorer: false,
                skipHtmlTags: [ 'script', 'noscript', 'style', 'textarea', 'pre' ]
            },
        },
        mermaid: {
            theme: 'dark',
            darkMode: true,
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true,
            },
        },
        transition: 'fade',
        progress: true,
        embedded: !print_pdf,
        pdfSeparateFragments: false,
        plugins: [
            RevealMarkdown,
            RevealHighlight,
            RevealMath.MathJax3,
            RevealMermaid,
            PdfExport,
        ]
    }).then(()=>{
        if (print_pdf) {
            setTimeout(function() {
                window.print();
            }, 400);
        }
    });
});
</script>

跟之前的版本相比,主要做了以下调整:

  • 增加了 Mermaid.js 的支持,用于绘制流程图;
  • 添加了 assets/js/pdfexport.js 这个文件,它是 Reveal.js 的一个插件,用于导出 PDF,这里使用了 reveal-pdfexport,在 slide 界面中使用 E 键即可自动跳转到导出 PDF 的界面,然后使用浏览器的打印功能即可导出 PDF。代码中的大部分调整都是为了适配 PDF 导出功能;

CSS 调整

添加 assets/css/reveal.css 文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
.mermaid svg {
    max-width: 100% !important;
}

.reveal.embedded{
    height:50vh;
    max-height:540px;
}

.reveal h5 {
    font-size: 0.83em;
}

.reveal h6 {
    font-size: 0.67em;
}

.reveal code {
    background: unset;
}

.reveal .controls button {
    margin: unset;
    background-color: transparent !important;
}

使用 Shortcode 生成 Slide

layouts/shortcodes/reveal.html 文件是用于生成 Slide 的 Shortcode:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{{- $raw := ( .Inner | chomp) -}}
<div class="reveal">
  <div class="slides">
    <section data-markdown>
      <textarea data-template>
      {{ $raw }}
      </textarea>
    </section>
  </div>
</div>

删除了 layouts/_default/reveal.html 文件。 这样,在文章中使用 {{ <reveal> }} 就可以生成一个 Slide 了,不需要在 Front Matter 中添加 layout: slide 了。

因为功能同 layout 解耦了,后续甚至可以将这个 shortcode 制作成一个 Hugo 的 theme,这样就可以直接使用了。