Hugo:Alert块引用

配置 新建 layouts/_default/_markup/render-blockquote-alert.html,写入模板内容: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 {{ $alertTypes := dict "note" "<path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path>" "tip" "<path d=\"M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z\"></path>" "important" "<path d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>" "warning" "<path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>" "caution" "<path d=\"M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path>" }} {{ if eq .Type "alert" }} <blockquote class="alert-blockquote alert-{{ .AlertType }}"> <p class="alert-heading"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"> {{ index $alertTypes .AlertType | safeHTML }} </svg> <span>{{ or (i18n .AlertType) (title .AlertType) }}</span> </p> {{ .Text | safeHTML }} </blockquote> {{ else }} <blockquote> {{ .Text | safeHTML }} </blockquote> {{ end }} 新建 assets/css/extended/blockquote.css,根据 Hugo-notice 的样式而来,写入样式内容: 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 72 73 74 75 76 77 78 79 80 81 82 .alert-blockquote { --title-color: #fff; --content-color: inherit; padding: 18px; line-height: 24px; margin: 1rem 0; border-radius: 4px; color: var(--content-color); border-left: none !important; } .alert-blockquote * { color: var(--content-color) !important; } .alert-blockquote .alert-heading { margin: -18px -18px 12px; padding: 4px 18px; border-radius: 4px 4px 0 0; font-weight: 600; color: var(--title-color) !important; display: flex; align-items: center; } .alert-blockquote .alert-heading svg { width: 1em !important; height: 1em !important; margin-right: 0.5rem !important; fill: currentColor !important; } .alert-blockquote p:last-child { margin-bottom: 0; } /* Light theme */ .alert-blockquote.alert-note { --title-background-color: #166dd0; --content-background-color: #e7f2fa; } .alert-blockquote.alert-tip { --title-background-color: #1a7f37; --content-background-color: #efe; } .alert-blockquote.alert-important { --title-background-color: #8250df; --content-background-color: #f5f0ff; } .alert-blockquote.alert-warning { --title-background-color: #9a6700; --content-background-color: #fff8c5; } .alert-blockquote.alert-caution { --title-background-color: #cf222e; --content-background-color: #ffebe9; } /* Dark theme */ body.night .alert-blockquote { --content-color: #d0d7dd; } body.night .alert-blockquote.alert-note { --title-background-color: #58a6ff; --content-background-color: #0d1d30; } body.night .alert-blockquote.alert-tip { --title-background-color: #3fb950; --content-background-color: #0f2a1b; } body.night .alert-blockquote.alert-important { --title-background-color: #a371f7; --content-background-color: #2a1d3f; } body.night .alert-blockquote.alert-warning { --title-background-color: #d29922; --content-background-color: #3b2300; } body.night .alert-blockquote.alert-caution { --title-background-color: #f85149; --content-background-color: #3d0c0c; } .alert-blockquote .alert-heading { background: var(--title-background-color); } .alert-blockquote { background: var(--content-background-color); } 模板中使用了 i18n 来生成标题,所以需要在 i18n/ 下的文件中配置名称,中文文件参考如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - id: caution translation: '危险' - id: important translation: '重要' - id: note translation: '注释' - id: tip translation: '提示' - id: warning translation: '警告' 使用语法 1 2 > [!NOTE] 注意 > 内容 预览效果 注释 ...

 ·  · 

Hugo:优化博客速度

在 layouts\partials\extend_head.html 中添加以下代码: 1 2 3 4 5 6 7 8 9 <!-- Preload scripts --> <link rel="preload" as="script" href="https://www.googletagmanager.com/gtag/js?id=G-8TSPGDFPRC"> {{ if .IsPage -}} <link rel="preload" as="script" href="https://giscus.app/client.js"> <link rel="preload" as="script" href="https://cyrusyip.disqus.com/embed.js"> {{ end -}} <link rel="preload" as="script" href="https://unpkg.com/@swup/head-plugin@2"> <link rel="preload" as="script" href="https://unpkg.com/@swup/preload-plugin@3"> <link rel="preload" as="script" href="https://unpkg.com/swup@4"> 新建 layouts\partials\body-end.html,并添加以下代码: 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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 <!-- Load scripts --> 并添加以下代码: ```html <script> function loadScript({ url, delay, onloadCallback, async, preloadCallback, attributes = {}, }) { function load() { if (preloadCallback) preloadCallback(); const script = document.createElement("script"); script.src = url; script.async = async; // Set attributes Object.entries(attributes).forEach(([key, value]) => { script.setAttribute(key, value); }); if (onloadCallback) script.onload = onloadCallback; document.body.appendChild(script); } if (typeof delay !== "undefined") { setTimeout(load, delay); } else { load(); } } function isCyrusYipDomainOrLocalhost() { const currentDomain = window.location.hostname; const tartgetDomain = "cyrusyip.org"; console.log(`hostname: ${currentDomain}`); return ( currentDomain === tartgetDomain || currentDomain.endsWith("." + tartgetDomain) || currentDomain === "localhost" || currentDomain === "127.0.0.1" ) } // Google Analytics // Only load it on cyrusyip.org, preventing unwanted data collections when people fork this repository if (isCyrusYipDomainOrLocalhost()) { loadScript({ url: "https://www.googletagmanager.com/gtag/js?id=G-8TSPGDFPRC", delay: 100, async: false, onloadCallback: function () { window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag("js", new Date()); gtag("config", "G-8TSPGDFPRC"); console.log("Google Analytics loaded") } }) } </script> {{/* Only load comment services for regular page */}} {{ if .IsPage }} <script> // Check languages for comment services let giscusLang, disqusLang; if (document.documentElement.lang === "zh-CN") { giscusLang = "zh-CN"; disqusLang = "zh"; } else { giscusLang = "en"; disqusLang = "en"; } // Giscus const giscusConfig = { url: 'https://giscus.app/client.js', delay: 100, async: false, onloadCallback: () => console.log("Giscus loaded"), attributes: { 'data-repo': 'CyrusYip/blog-comments', 'data-repo-id': 'MDEwOlJlcG9zaXRvcnkzNDg2NjkxMTQ=', 'data-category': 'Comments', 'data-category-id': 'DIC_kwDOFMhEus4ChUiV', 'data-mapping': 'pathname', 'data-strict': '0', 'data-reactions-enabled': '1', 'data-emit-metadata': '0', 'data-input-position': 'bottom', 'data-theme': 'preferred_color_scheme', 'data-lang': giscusLang, 'data-loading': 'lazy', 'crossorigin': 'anonymous' } } loadScript(giscusConfig); // Disqus loadScript({ url: "https://cyrusyip.disqus.com/embed.js", delay: 100, async: false, attributes: { "data-timestamp": +new Date() }, preloadCallback: function () { window.disqus_config = function () { this.language = disqusLang; } }, onloadCallback: function () { console.log("Disqus loaded") }, }) </script> {{ end }} <script> // swup head plugin loadScript({ url: "https://unpkg.com/@swup/head-plugin@2", async: false, delay: 200, onloadCallback: function () { console.log("swup head plugin loaded"); }, }) // swup preload plugin loadScript({ url: "https://unpkg.com/@swup/preload-plugin@3", async: false, delay: 200, onloadCallback: function () { console.log("swup preload plugin loaded") } }) // swup progress bar plugin loadScript({ url: "https://unpkg.com/@swup/progress-plugin@3", async: false, delay: 200, onloadCallback: function () { console.log("swup progress bar plugin loaded") } }) // swup loadScript({ url: "https://unpkg.com/swup@4", async: false, delay: 200, onloadCallback: function () { const swup = new Swup({ containers: ["body"], plugins: [ new SwupHeadPlugin(), new SwupPreloadPlugin({ preloadVisibleLinks: true }), new SwupProgressPlugin(), ], animationSelector: false, }); console.log("swup loaded"); swup.hooks.on("page:view", () => { // Load comment services let giscusLang, disqusLang; if (document.documentElement.lang === "zh-CN") { giscusLang = "zh-CN"; disqusLang = "zh"; } else { giscusLang = "en"; disqusLang = "en"; } function loadGiscus() { const giscusConfig = { url: 'https://giscus.app/client.js', delay: 100, async: true, onloadCallback: () => console.log("Giscus loaded"), attributes: { 'data-repo': 'CyrusYip/blog-comments', 'data-repo-id': 'MDEwOlJlcG9zaXRvcnkzNDg2NjkxMTQ=', 'data-category': 'Comments', 'data-category-id': 'DIC_kwDOFMhEus4ChUiV', 'data-mapping': 'pathname', 'data-strict': '0', 'data-reactions-enabled': '1', 'data-emit-metadata': '0', 'data-input-position': 'bottom', 'data-theme': 'preferred_color_scheme', 'data-lang': giscusLang, 'data-loading': 'lazy', 'crossorigin': 'anonymous' } } loadScript(giscusConfig); } const giscusElement = document.querySelector("div.giscus"); // Only load Giscus if .giscus exists if (giscusElement) { loadGiscus(); } function loadDisqus() { // Reload if (typeof DISQUS === 'object') { DISQUS.reset({ reload: true, config: function () { this.page.url = window.location.href; this.language = disqusLang; } }); DISQUS_RECOMMENDATIONS.reset(); console.log("Disqus reloaded"); } else { // Load loadScript({ url: "https://cyrusyip.disqus.com/embed.js", // delay: 100, async: true, attributes: { "data-timestamp": +new Date() }, preloadCallback: function () { window.disqus_config = function () { this.language = disqusLang; } }, onloadCallback: function () { console.log("Disqus loaded") }, }) } } const disqusElement = document.querySelector("div#disqus_thread"); if (disqusElement) { setTimeout(() => { loadDisqus(); }, 100) } }) } }) </script> 参考教程 optimize-blog-speed-with-pjax-dynamic-script-preload-minification

 ·  · 

Hugo:添加图片点击放大功能

前言 通过 FancyBox 给 Hugo 博客添加图片点击放大功能。 配置 在 config/_default/params.yaml 中添加配置开关: 1 fancybox: true 新建 layouts/_default/_markup/render-image.html,写入内容: 1 2 3 4 5 6 7 {{if .Page.Site.Params.fancybox }} <div class="post-img-view"> <a data-fancybox="gallery" href="{{ .Destination | safeURL }}"> <img src="{{ .Destination | safeURL }}" alt="{{ .Text }}" {{ with .Title}} title="{{ . }}"{{ end }} /> </a> </div> {{ end }} 在 layouts/partials下的 extend_head.html 或者 extend_footer.html 中添加: 1 2 3 4 5 6 <!-- FancyBox --> {{if .Page.Site.Params.fancybox }} <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/[email protected]/dist/jquery.fancybox.min.css" /> <script src="https://cdn.jsdelivr.net/gh/fancyapps/[email protected]/dist/jquery.fancybox.min.js"></script> {{ end }} 使用语法: ...

 ·  · 

Hugo:代码配置

前言 优化代码块: 添加语言显示 Chroma主题切换 代码块折叠展开 PaperMod 主题默认使用的是 highlight.js, 这是一种由 js 生成的高亮方案。相比 highlight.js, Hugo 官方更倾向使用 Chroma 来生成代码高亮。 Chroma 是由 Go 写的语法高亮工具,其编译速度更快,且 Hugo 内置了 Chroma 工具。 Hugo 关于 Chroma 的文档在 Syntax Highlighting。 ...

 ·  · 

Shortcode:汇总使用指南

前言 Shortcodes 翻译为: 短代码或者简码 虽然 Markdown 的内容格式简单,但有时会达不到创作者的要求。通常,内容作者被迫将原始 HTML 添加到 Markdown 内容中。Hugo 认为这与 Markdown 语法的简单性相矛盾。 Hugo 创造了短代码(shortcodes)来规避这些限制。 ...

 ·  · 

PaperMod:配置搜索页

PaperMod 已集成 Fuse.js 实现搜索功能。 PaperMod 官方文档: Search Page 搜索页面 新建 search.md 文件,内容参考如下: 1 2 3 4 5 6 7 --- title: "🔍 搜索" layout: "search" url: "/search/" hideTags: true placeholder: "请输入关键词..." --- 在 config/_default/menus.yaml 添加下面内容: 1 2 3 4 5 6 7 --- main: - identifier: search name: 🔍 搜索 url: /search weight: 4 --- 在 config\_default\params.yaml 添加下面内容: 1 2 3 4 5 6 7 8 9 10 11 # 添加搜索参数,参考 https://fusejs.io/api/options.html fuseOpts: # 搜索配置 isCaseSensitive: false # 是否大小写敏感 includeMatches: true # 是否包含匹配项 shouldSort: true # 是否排序 location: 0 distance: 1000 threshold: 0.0 # 完全匹配。PaperMod 默认为 0.4 minMatchCharLength: 0 # limit: 10 keys: ["title", "permalink", "summary", "content"] 参考教程 hugo-papermodx-add-search 添加标签云 修改逻辑控制 layouts/_default/terms.html,把之前的 terms-tags 标签控制代码注释掉,替换: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <ul class="terms-tags"> {{- $type := .Type }} {{- range $key, $value := .Data.Terms.Alphabetical }} {{- $name := .Name }} {{- $count := .Count }} {{- with $.Site.GetPage (printf "/%s/%s" $type $name) }} <li> {{ $largestFontSize := 1.5 }} {{ $smallestFontSize := 1 }} {{ $fontSpread := sub $largestFontSize $smallestFontSize }} {{ $max := add (len (index $.Site.Taxonomies.tags.ByCount 0).Pages) 1 }} {{ $min := len (index $.Site.Taxonomies.tags.ByCount.Reverse 0).Pages }} {{ $spread := sub $max $min }} {{ $fontStep := div $fontSpread $spread }} {{ $weigth := div (sub (math.Log $count) (math.Log $min)) (sub (math.Log $max) (math.Log $min)) }} {{ $currentFontSize := (add $smallestFontSize (mul (sub $largestFontSize $smallestFontSize) $weigth)) }} <a href="{{ .Permalink }}" style="font-size: {{ $currentFontSize }}rem; font-weight: {{ mul $currentFontSize 200 }};"> {{ .Name }} <sup><strong><sup>{{ $count }}</sup></strong></sup> </a> </li> {{- end }} {{- end }} </ul> 修改样式 assets/css/common/terms.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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 .terms-tags { text-align: center; } .terms-tags li { display: inline-block; margin: 5px; font-weight: 500; } .terms-tags li:hover { transform: scale(1.1); } .terms-tags a { background: none; border-radius: 30px; transition: transform 0.5s; } .terms-tags a:hover { background: none; webkit-transform: scale(1.2); -moz-transform: scale(1.2); -ms-transform: scale(1.2); -o-transform: scale(1.2); transform: scale(1.3); } .dark .terms-tags a { background: none; } .dark .terms-tags a:hover { background: none; webkit-transform: scale(1.2); -moz-transform: scale(1.2); -ms-transform: scale(1.2); -o-transform: scale(1.2); transform: scale(1.3); } .terms-tags a:active { background: var(--tertiary); transform: scale(0.96); } 参考教程 tag-cloud 配置标签云到搜索页 修改 search.md 文件,内容参考如下: 1 2 3 4 5 6 7 8 --- title: "🔍 搜索" layout: "search" url: "/search/" hideTags: false tagsTitle: 🎯 标签 placeholder: "请输入关键词..." --- 修改 layouts/_default/search.html 添加下面内容: 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 {{- if not (.Param "hideTags") }} {{- $taxonomies := .Site.Taxonomies.tags }} {{- if gt (len $taxonomies) 0 }} <h2 style="margin-top: 32px">{{- (.Param "tagsTitle") | default "tags" }}</h2> <ul class="terms-tags"> {{- range $name, $value := $taxonomies }} {{- $count := .Count }} {{- with site.GetPage (printf "/tags/%s" $name) }} <li> {{ $largestFontSize := 1.5 }} {{ $smallestFontSize := 1 }} {{ $fontSpread := sub $largestFontSize $smallestFontSize }} {{ $max := add (len (index $.Site.Taxonomies.tags.ByCount 0).Pages) 1 }} {{ $min := len (index $.Site.Taxonomies.tags.ByCount.Reverse 0).Pages }} {{ $spread := sub $max $min }} {{ $fontStep := div $fontSpread $spread }} {{ $weigth := div (sub (math.Log $count) (math.Log $min)) (sub (math.Log $max) (math.Log $min)) }} {{ $currentFontSize := (add $smallestFontSize (mul (sub $largestFontSize $smallestFontSize) $weigth)) }} <a href="{{ .Permalink }}" style="font-size: {{ $currentFontSize }}rem; font-weight: {{ mul $currentFontSize 200 }};"> {{ .Name }} <sup><strong><sup>{{ $count }}</sup></strong></sup> </a> </li> {{- end }} {{- end }} </ul> {{- end }} {{- end }} {{- end }}{{/* end main */}} <!-- 在最后一行前加入上面的代码 -->

 ·  · 

博客部署:Vercel

基于Vercel自动化部署博客

 ·  · 

Hugo:PicX图床

本教程基于 PicX 搭建个人博客图床。 PicX 是基于 Github 仓库和 cdn 加速的免费图床工具。通过 Github 授权 PicX 仓库管理权限(包含 GitHub OAuth 授权登录 和 填写 GitHub Token 登录 这两种方式),PicX 通过 Github Api 管理 Github 仓库(也就是我们的图库),提供了图片压缩、自定义命名、自定义水印等功能,简单且免费。 ...

 ·  · 

Shortcode:MindMap

基于markmap实现MindMap支持。

 ·  · 

Hugo:文章添加密码

参考教程 Hugo文章添加密码

 ·  ·