diff options
author | reuixiy <reuixiy@gmail.com> | 2020-01-08 20:57:52 +0300 |
---|---|---|
committer | reuixiy <reuixiy@gmail.com> | 2020-01-08 20:57:52 +0300 |
commit | 8c3cb2bcb9b51c20ab985b57aab195014627d3ed (patch) | |
tree | e31079baf65f250437dc71414b9e03e1c91cb4a1 | |
parent | e6c251a1ebf81a9e6e90306e5f57f4cf92796a24 (diff) |
Release v4.0.0v4.0.0
closed #26, fixed #14
22 files changed, 241 insertions, 102 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 08479de..d47e97a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,28 @@ +# [4.0.0](https://github.com/reuixiy/hugo-theme-meme/compare/v3.4.5...v4.0.0) (2020-01-08) + + +As I described in [#26](https://github.com/reuixiy/hugo-theme-meme/issues/26), I want to make MemE support Hugo's new default Markdown rendering engine Goldmark, and this is it. In this version, MemE will support Goldmark and *no longer support* Blackfriday. + +### Notes + +1. Goldmark problems, see [#43 (comment)](https://github.com/reuixiy/hugo-theme-meme/issues/43#issuecomment-571074162) + +2. Compatibility with LaTeX, see [gohugoio/hugo#6544](https://github.com/gohugoio/hugo/issues/6544) + + [Previously](https://github.com/reuixiy/hugo-theme-meme/issues/12), I suggested adding some backslashes to escape some characters to solve the syntax conflict between Markdown and LaTeX. Now, I think that is not the *right* way -- it's troublesome and stupid. + + In v4.0.0, MemE adds a new `compatibleWithLaTeX` option as a temporary workaround. But note that it has some limitations, such as it can't exclude equations inside code block, it supports `$ ... $` and `$$ ... $$` only. + + And at last, apology for my wrong suggestion, which may take some of your time to modify the equations again. + +3. With Hugo brand new Markdown renderer Goldmark, [#14](https://github.com/reuixiy/hugo-theme-meme/issues/14) should be fixed. + +### ATTENTION + +**MemE v4.0.0 requires Hugo v0.62.2 or higher.** + + + ## [3.4.5](https://github.com/reuixiy/hugo-theme-meme/compare/v3.3.9...v3.4.5) (2020-01-08) diff --git a/assets/scss/_common/indent.scss b/assets/scss/_common/indent.scss index 9e8b942..3253f0e 100644 --- a/assets/scss/_common/indent.scss +++ b/assets/scss/_common/indent.scss @@ -46,6 +46,9 @@ ol { margin: ($fontSize * 1.618) 0 0; list-style-position: outside; + p { + display: block; + } } } dl { diff --git a/config-examples/en-us/config.toml b/config-examples/en-us/config.toml index 7faa7bd..431bbbb 100644 --- a/config-examples/en-us/config.toml +++ b/config-examples/en-us/config.toml @@ -41,12 +41,6 @@ enableRobotsTXT = true # layout in MemE) paginate = 5 -# GitHub flavoured code fences -pygmentsCodefences = true -pygmentsUseClasses = true -pygmentsCodefencesGuessSyntax = true -pygmentsOptions = "linenos=table" - # URL related disablePathToLower = false relativeURLs = false @@ -66,18 +60,36 @@ uglyURLs = false [frontmatter] lastmod = ["lastmod", ":git", ":fileModTime", ":default"] -# v0.60.0 +# Markdown renderer [markup] - defaultMarkdownHandler = "blackfriday" - -# Markdown rendering engine -[blackfriday] - # Enable smart punctuation substitutions? - smartypants = true - # Open external links in a new window or tab? - hrefTargetBlank = true - # Disable some Blackfriday’s Markdown extensions - extensionsmask = ["hardLineBreak", "backslashLineBreak"] + defaultMarkdownHandler = "goldmark" + [markup.goldmark] + [markup.goldmark.extensions] + definitionList = true + footnote = true + linkify = true + strikethrough = true + table = true + taskList = true + typographer = true + [markup.goldmark.parser] + attribute = true + autoHeadingID = true + autoHeadingIDType = "github" + [markup.goldmark.renderer] + hardWraps = false + unsafe = true + xHTML = false + [markup.highlight] + codeFences = true + guessSyntax = false + lineNos = true + lineNumbersInTable = true + noClasses = false + [markup.tableOfContents] + startLevel = 2 + endLevel = 6 + ordered = true # Author’s information [author] @@ -734,6 +746,16 @@ uglyURLs = false ###################################### + # Markdown Related + + # Open external links in a new tab? + hrefTargetBlank = true + + # Compatibility with LaTeX? + compatibleWithLaTeX = false + + + ###################################### # Table of Contents enableTOC = false diff --git a/config-examples/zh-cn/config.toml b/config-examples/zh-cn/config.toml index b75ae5e..eea8e40 100644 --- a/config-examples/zh-cn/config.toml +++ b/config-examples/zh-cn/config.toml @@ -39,12 +39,6 @@ enableRobotsTXT = true # 每一分页的文章数(仅对「文章摘要」首页布局有效) paginate = 5 -# 代码高亮 -pygmentsCodefences = true -pygmentsUseClasses = true -pygmentsCodefencesGuessSyntax = true -pygmentsOptions = "linenos=table" - # URL 相关 disablePathToLower = false relativeURLs = false @@ -64,18 +58,36 @@ uglyURLs = false [frontmatter] lastmod = ["lastmod", ":git", ":fileModTime", ":default"] -# v0.60.0 -[markup] - defaultMarkdownHandler = "blackfriday" - # Markdown 渲染器 -[blackfriday] - # 是否开启智能标点符号替换 - smartypants = false - # 是否在新标签页打开外链 - hrefTargetBlank = true - # 屏蔽的扩展 - extensionsmask = ["hardLineBreak", "backslashLineBreak"] +[markup] + defaultMarkdownHandler = "goldmark" + [markup.goldmark] + [markup.goldmark.extensions] + definitionList = true + footnote = true + linkify = true + strikethrough = true + table = true + taskList = true + typographer = false + [markup.goldmark.parser] + attribute = true + autoHeadingID = true + autoHeadingIDType = "github" + [markup.goldmark.renderer] + hardWraps = false + unsafe = true + xHTML = false + [markup.highlight] + codeFences = true + guessSyntax = false + lineNos = true + lineNumbersInTable = true + noClasses = false + [markup.tableOfContents] + startLevel = 2 + endLevel = 6 + ordered = true # 作者信息 [author] @@ -694,6 +706,16 @@ uglyURLs = false ###################################### + # Markdown 相关 + + # 在新标签页打开外链? + hrefTargetBlank = true + + # 与 LaTeX 的兼容性? + compatibleWithLaTeX = false + + + ###################################### # 文章目录 # 是否开启(全局设置) diff --git a/exampleSite/resources/_gen/assets/scss/scss/main.scss_b04c21e44835e7dcdc8cb03d103b5ef1.content b/exampleSite/resources/_gen/assets/scss/scss/main.scss_b04c21e44835e7dcdc8cb03d103b5ef1.content index 5a9619f..e95d880 100644 --- a/exampleSite/resources/_gen/assets/scss/scss/main.scss_b04c21e44835e7dcdc8cb03d103b5ef1.content +++ b/exampleSite/resources/_gen/assets/scss/scss/main.scss_b04c21e44835e7dcdc8cb03d103b5ef1.content @@ -1 +1 @@ -:root{--color-primary:hsl(220, 90%, 56%);--color-primary-h:220;--color-primary-s:90%;--color-primary-l:56%;--color-bg:hsl(0, 0%, 100%);--color-bg-h:0;--color-bg-s:0%;--color-bg-l:100%;--color-contrast-lower:hsl(0, 0%, 95%);--color-contrast-lower-h:0;--color-contrast-lower-s:0%;--color-contrast-lower-l:95%;--color-contrast-low:hsl(240, 1%, 83%);--color-contrast-low-h:240;--color-contrast-low-s:1%;--color-contrast-low-l:83%;--color-contrast-medium:hsl(240, 1%, 48%);--color-contrast-medium-h:240;--color-contrast-medium-s:1%;--color-contrast-medium-l:48%;--color-contrast-high:hsl(240, 4%, 20%);--color-contrast-high-h:240;--color-contrast-high-s:4%;--color-contrast-high-l:20%;--color-contrast-higher:hsl(240, 8%, 12%);--color-contrast-higher-h:240;--color-contrast-higher-s:8%;--color-contrast-higher-l:12%}[data-theme="dark"]{--color-primary:hsl(201, 65%, 62%);--color-primary-h:201;--color-primary-s:65%;--color-primary-l:62%;--color-bg:hsl(240, 8%, 12%);--color-bg-h:240;--color-bg-s:8%;--color-bg-l:12%;--color-contrast-lower:hsl(240, 6%, 19%);--color-contrast-lower-h:240;--color-contrast-lower-s:6%;--color-contrast-lower-l:19%;--color-contrast-low:hsl(240, 3%, 27%);--color-contrast-low-h:240;--color-contrast-low-s:3%;--color-contrast-low-l:27%;--color-contrast-medium:hsl(240, 1%, 57%);--color-contrast-medium-h:240;--color-contrast-medium-s:1%;--color-contrast-medium-l:57%;--color-contrast-high:hsl(0, 0%, 89%);--color-contrast-high-h:0;--color-contrast-high-s:0%;--color-contrast-high-l:89%;--color-contrast-higher:hsl(0, 0%, 100%);--color-contrast-higher-h:0;--color-contrast-higher-s:0%;--color-contrast-higher-l:100%}#theme-toggle{padding:1em;cursor:pointer;float:right;position:relative;z-index:4}[data-theme="dark"] img{filter:brightness(50%)}html,body{margin:0;width:100%;height:100%}body{font-size:20px;tab-size:4;color:var(--color-contrast-high);background-color:var(--color-bg);overflow-wrap:break-word;word-wrap:break-word;line-height:1.618}.container{min-height:100%;min-width:100%;position:relative}.main{padding:2em 1em 15em;display:block}.main-inner{margin:0 auto;display:block}.icon{width:1em;height:1em;fill:currentColor;display:inline-block}svg{vertical-align:middle}h1,h2,h3,h4,h5,h6{margin:1.618em 0 1em;color:var(--color-contrast-higher)}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{text-decoration:none !important;color:var(--color-contrast-higher)}h1{font-size:2em}h2{font-size:1.8em}h3{font-size:1.6em}h4{font-size:1.4em}h5{font-size:1.2em}h6{font-size:1em}a{color:var(--color-contrast-high);text-decoration:none;transition:color .5s}a:hover{color:var(--color-primary)}::selection{background-color:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.3)}::-webkit-scrollbar{width:0.4em;height:0.2em}::-webkit-scrollbar-track{background-color:var(--color-bg)}::-webkit-scrollbar-thumb{background-color:var(--color-contrast-low)}::-webkit-scrollbar-thumb:hover{background-color:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.5)}::-webkit-scrollbar-thumb:active{background-color:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.75)}[data-hide="true"]{display:none}[data-small-caps="true"] .post-body h1,[data-small-caps="true"] .post-body h2,[data-small-caps="true"] .post-body h3,[data-small-caps="true"] .post-body h4,[data-small-caps="true"] .post-body h5,[data-small-caps="true"] .post-body h6{font-variant:small-caps}[data-small-caps="true"] .contents-title{font-variant:small-caps}[data-align="justify"] .post-body p{text-align:justify;text-justify:distribute}[data-align="center"] .post-body p{text-align:center}[data-type="poetry"] .post-body{display:table;margin:0 auto}.list-title,.term-title,.list-year,.list-month,.post-title,.post-subtitle,.related-title,.post-nav,thead,dt{font-family:Comfortaa,sans-serif}.post-body h1,.post-body h2,.post-body h3,.post-body h4,.post-body h5,.post-body h6{font-family:Comfortaa,sans-serif}.contents-title{font-family:Comfortaa,sans-serif}code,pre,sup,.post-meta,.updated-badge,.post-gitinfo,.minimal-footer,.minimal-footer-about,.busuanzi-site-uv-and-pv{font-family:"Source Code Pro",monospace}body{font-family:"IBM Plex Serif",serif}.header{z-index:3;position:relative}.site-brand{text-align:center}.site-brand{background-image:linear-gradient(90deg, #f79533 0, #f37055 15%, #ef4e7b 30%, #a166ab 44%, #5073b8 58%, #1098ad 72%, #07b39b 86%, #6dba82 100%)}.brand{width:250px;height:100px;fill:#fff}.nav{z-index:3;position:relative}.menu{padding:0;margin:0;list-style:none;text-align:center;background:var(--color-contrast-lower);line-height:1.5;font-weight:500}.menu-item{display:inline-block;margin:0 1em}.menu-item a{color:var(--color-contrast-medium)}.menu-item a:hover{color:var(--color-primary)}.active a{color:var(--color-primary)}.menu-item-name{display:flex}.post-meta{color:var(--color-contrast-medium);font-size:80%;text-align:center;margin:20px 0}.post-meta a{color:var(--color-contrast-medium)}.post-meta a:hover{color:var(--color-primary)}.home .post-meta{margin:20px 0}.post-meta-item{margin:0.5em;display:inline-block}.post-meta-icon{fill:hsla(var(--color-contrast-medium-h), var(--color-contrast-medium-s), var(--color-contrast-medium-l), 0.5);margin-bottom:0.3em}.single .main-inner{width:32em}.post-title{text-align:center}.post-subtitle{font-size:1.8em;text-align:center;font-weight:700;margin-top:-0.618em}.post-description{text-align:center;margin:20px 0;font-size:90%}.post-body{margin-top:5em !important}.post-body a{text-decoration:underline}.post p{margin:0 0 1em;line-height:1.618}.post img{display:block;margin:2em auto;max-width:100%;border:1px solid var(--color-contrast-lower);clear:both}.post video{display:block;max-width:100%;margin:2em auto;clear:both}.post sup{font-size:70%;vertical-align:super}.post sup a{text-decoration:none}.post ol,.post ul{padding-left:2em;line-height:1.618}.post hr{border:none;margin:2.427em 0 1.5em;text-align:center}.post hr::after{content:"···";letter-spacing:2em;padding-left:2em}blockquote{margin:2em 0;padding:0 1em;color:var(--color-contrast-medium);border-left:3px solid var(--color-contrast-low)}blockquote p{text-align:left !important}blockquote a{color:var(--color-contrast-medium)}blockquote a:hover{color:var(--color-primary)}.emphasis-point{font-weight:normal;text-emphasis:'•';-webkit-text-emphasis:'•';-moz-text-emphasis:'•';text-emphasis-position:under;-webkit-text-emphasis-position:under;-moz-text-emphasis-position:under}.drop-cap{float:left;font-size:62px;margin-right:12.36px;margin-top:10px;line-height:32.36px}.caption{display:block;text-align:center;margin:-1em 0 0;font-size:90%;color:var(--color-contrast-medium)}.contents{margin-top:5em}.contents ol{list-style:none;counter-reset:item}.contents ol li::before{content:counters(item, ".") ". ";counter-increment:item}ol.toc{padding:0;overflow:auto hidden;white-space:nowrap}.footnotes{font-size:90%;margin-top:100px}.footnotes hr{margin:0;height:1px;border:none;background-color:var(--color-contrast-medium)}.footnotes hr::after{content:none}.footnotes ol{margin:32.36px 0 0;padding:0 20px 0 40px}.anchor-link{position:absolute;transform:translate(-150%)}.anchor-icon{width:0.75em;height:0.75em;vertical-align:baseline}table{width:100%;border-collapse:collapse;border-spacing:0;border:1px solid var(--color-contrast-lower);margin:2em 0}thead{font-weight:700}th,td{font-size:0.9em;padding:0.4em;border:1px solid var(--color-contrast-lower)}table>tbody>tr:nth-of-type(odd){background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5)}table>tbody>tr:hover{background-color:var(--color-contrast-lower)}dt{font-weight:700}dd{margin-left:2em;text-align:left}code{padding:2.5px 5px;background-color:var(--color-contrast-lower);border-radius:3px;font-size:80%}pre{overflow:auto hidden;font-size:16px;margin:40px 0;padding:1em;line-height:1.618;background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.75)}pre code{background-color:unset;font-size:inherit;padding:0}.highlight{font-size:0.8em;margin:40px 0}.highlight pre{margin:0 !important;overflow:auto hidden;background-color:unset}.highlight th,.highlight td{font-size:inherit}.highlight table>tbody>tr:nth-of-type(odd){background-color:inherit}.highlight table>tbody>tr:hover{background-color:inherit}span.lnt{user-select:none;display:block;margin-right:-1em !important;padding:0 !important}.katex-display,mjx-container[jax="CHTML"][display="true"]{overflow:auto hidden;text-indent:0}:root{--anchor-opacity: 0}.anchor-link{opacity:var(--anchor-opacity);transition:all .25s}.post h1:hover,.post h2:hover,.post h3:hover,.post h4:hover,.post h5:hover,.post h6:hover,.post .anchor-link:hover{--anchor-opacity: 1}.footnote-icon{fill:hsla(var(--color-contrast-high-h), var(--color-contrast-high-s), var(--color-contrast-high-l), 0.5);transition:fill .5s}.footnote-icon:hover{fill:var(--color-primary)}[data-indent="true"] .contents-title{text-align:center}[data-indent="true"] .post-body p{text-indent:2em;margin:0}[data-indent="true"] .post-body .caption{text-indent:0;margin:0 0 1em}[data-indent="true"] .post-body blockquote{margin:1em 0;padding:0;border:none}[data-indent="true"] .post-body img,[data-indent="true"] .post-body video{margin:1em auto}[data-indent="true"] .post-body table{margin:1em 0}[data-indent="true"] .post-body pre,[data-indent="true"] .post-body .highlight{margin:20px 0}[data-indent="true"] .post-body h1,[data-indent="true"] .post-body h2,[data-indent="true"] .post-body h3,[data-indent="true"] .post-body h4,[data-indent="true"] .post-body h5,[data-indent="true"] .post-body h6{text-align:center}[data-indent="true"] .post-body .anchor-link{position:relative;transform:none;display:block;float:none}[data-indent="true"] .post-body ol,[data-indent="true"] .post-body ul{margin:0;list-style-position:inside}[data-indent="true"] .post-body ol p,[data-indent="true"] .post-body ul p{text-indent:0;display:inline-block}[data-indent="true"] .post-body .footnotes ol{margin:32.36px 0 0;list-style-position:outside}[data-indent="true"] .post-body dl{text-indent:2em}[data-indent="true"] .post-body dl dd{text-indent:0;margin-left:4em}[data-indent="true"] .post-body dl p{text-indent:0}.post-copyright{margin:0;list-style:none;margin-top:5em;padding:0.5em 1em;background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5);border-left:3px solid hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.5);line-height:2}.copyright-item{line-height:1.5;margin:0.5em 0}.updated-badge-container{margin-top:5em;text-align:center}.updated-badge-left{fill:var(--color-contrast-low)}.updated-badge-right{fill:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.5)}.related-posts{text-align:left;border:1px solid var(--color-contrast-lower);padding:0.6em 1em;line-height:2em;margin-top:5em}.related-title{font-size:1em;margin:0}.related-icon{float:right;margin-top:0.4em}.related-list{margin:0;padding:0;list-style:none}.related-link{line-height:1.5;display:inline-block}.post-tags{margin-top:100px;text-align:center;font-size:90%}.post-tags-link{color:hsla(var(--color-contrast-medium-h), var(--color-contrast-medium-s), var(--color-contrast-medium-l), 0.9);margin:0 0.5em;line-height:2;display:inline-block}.tag-icon{margin-right:0.3em;font-size:80%}.post-nav{list-style:none;padding:0;display:flex;justify-content:space-between;border-top:1px solid var(--color-contrast-lower);font-weight:700;margin-top:5em;padding-top:0.618em}.post-nav-prev{margin-right:auto;max-width:42%}.post-nav-next{margin-left:auto;text-align:right;max-width:42%}.list .main-inner{width:30em}.list-title{text-align:center}.list ul{list-style:none;padding:0}.list-item{line-height:2;position:relative;transition:border .5s;border-bottom:1px dashed var(--color-contrast-low);margin-top:1em;padding-bottom:0.5em;display:flex;align-items:baseline}.list-item:hover{border-bottom-color:var(--color-primary)}.list-item:hover ::before{background:var(--color-primary)}.list-item ::before{content:" ";position:absolute;left:0.618em;top:0.618em;width:6.66666667px;height:6.66666667px;background:var(--color-contrast-low);border-radius:50%;border:1px solid var(--color-bg);transition:background .5s;font-size:20px}.list-item-title{margin:0 0.618em 0 2em;font-size:1.2em;line-height:1.5}.list-item-time{margin:0 0.618em 0 2em;color:var(--color-contrast-medium);line-height:1.5}.list-year{display:flex;justify-content:space-between;align-items:baseline}.term-count{color:var(--color-contrast-medium);font-size:0.7em}.tree{margin-left:-2em;overflow:auto hidden;white-space:nowrap}.category-item{color:blue;font-size:1.2em}.category-item:hover{color:blueviolet}.category-count{color:var(--color-contrast-medium)}.tag-cloud{text-align:center}.tag-cloud-item{margin:10px;display:inline-block}.list-item-title{flex:1}.list-item-time{text-align:right;margin-left:1em}.back-to-top{position:fixed;right:0;z-index:1}.back-to-top a{display:block;padding:1em;color:var(--color-contrast-medium)}.back-to-top a:hover{color:var(--color-primary)}.back-to-top{bottom:-5em;transition:bottom 0.3s ease-in-out}.back-to-top.show{bottom:0}.footer{position:absolute;bottom:0;width:100%;font-size:90%;color:var(--color-contrast-medium)}.footer a{color:var(--color-contrast-medium)}.footer a:hover{color:var(--color-primary)}.footer-inner{padding:1em;text-align:center}.footer-icon{margin:0 0.25em 0.3em}.footer-icon{fill:#f06292}@keyframes heartbeat{0%,100%{transform:scale(1)}10%,30%{transform:scale(0.9)}20%,40%,50%,60%,70%,80%{transform:scale(1.1)}}.footer-icon{animation:heartbeat 1.33s ease-in-out infinite}.summary-title-link{color:var(--color-contrast-higher)}.summary{line-height:1.618;display:block}.read-more-container{text-align:center;margin-top:1.618em}.read-more-link{display:inline-block}.pagination{list-style:none;margin:5em 0 0;padding:0;display:flex;justify-content:space-between}.pagination-prev{margin-right:auto}.pagination-next{margin-left:auto;text-align:right}.fof::before{background-repeat:no-repeat;background-size:cover;background-position:50% 50%;content:" ";position:fixed;width:100%;height:100%;top:0;left:0;z-index:1}.fof .main-inner{background:rgba(0,0,0,0.25);min-height:100%;min-width:100%;position:absolute;z-index:3}.fof video{position:fixed;top:50%;left:50%;min-width:100%;min-height:100%;width:auto;height:auto;z-index:2;transform:translateX(-50%) translateY(-50%)}.fof h1{font-size:3rem;text-transform:uppercase;letter-spacing:0.3rem;text-align:center;top:15%;left:5%;right:5%;position:absolute;color:#fff;margin:0.67em 0}.fof .fof-footer{font-size:2rem;position:absolute;bottom:15%;left:10%;right:10%;text-align:center}.fof a{color:#eee}.fof a:hover{color:#fff}@media only screen and (max-device-width: 1024px){.fof #bgvid{display:none}}.fof::before{background-image:url()}.chroma{background-color:#ffffff}.chroma .err{color:#ff0000;background-color:#ffaaaa}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.chroma .hl{display:block;width:100%;background-color:#ffffcc}.chroma .lnt{margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f}.chroma .ln{margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f}.chroma .k{color:#0000aa}.chroma .kc{color:#0000aa}.chroma .kd{color:#0000aa}.chroma .kn{color:#0000aa}.chroma .kp{color:#0000aa}.chroma .kr{color:#0000aa}.chroma .kt{color:#00aaaa}.chroma .na{color:#1e90ff}.chroma .nb{color:#00aaaa}.chroma .nc{color:#00aa00}.chroma .no{color:#aa0000}.chroma .nd{color:#888888}.chroma .ni{color:#880000}.chroma .nf{color:#00aa00}.chroma .nn{color:#00aaaa}.chroma .nt{color:#1e90ff}.chroma .nv{color:#aa0000}.chroma .s{color:#aa5500}.chroma .sa{color:#aa5500}.chroma .sb{color:#aa5500}.chroma .sc{color:#aa5500}.chroma .dl{color:#aa5500}.chroma .sd{color:#aa5500}.chroma .s2{color:#aa5500}.chroma .se{color:#aa5500}.chroma .sh{color:#aa5500}.chroma .si{color:#aa5500}.chroma .sx{color:#aa5500}.chroma .sr{color:#009999}.chroma .s1{color:#aa5500}.chroma .ss{color:#0000aa}.chroma .m{color:#009999}.chroma .mb{color:#009999}.chroma .mf{color:#009999}.chroma .mh{color:#009999}.chroma .mi{color:#009999}.chroma .il{color:#009999}.chroma .mo{color:#009999}.chroma .ow{color:#0000aa}.chroma .c{color:#888888}.chroma .ch{color:#888888}.chroma .cm{color:#888888}.chroma .c1{color:#888888}.chroma .cs{color:#0000aa}.chroma .cp{color:#4c8317}.chroma .cpf{color:#4c8317}.chroma .gd{color:#aa0000}.chroma .gr{color:#aa0000}.chroma .gh{color:#000080}.chroma .gi{color:#00aa00}.chroma .go{color:#666666}.chroma .gp{color:#454545}.chroma .gu{color:#800080}.chroma .gt{color:#aa0000}.chroma .w{color:#999999}.chroma{color:var(--color-contrast-high);background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5)}.chroma-dark{color:#f8f8f2;background-color:#272822}.chroma-dark .err{color:#960050;background-color:#1e0010}.chroma-dark .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma-dark .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.chroma-dark .hl{display:block;width:100%;background-color:#ffffcc}.chroma-dark .lnt{margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f}.chroma-dark .ln{margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f}.chroma-dark .k{color:#66d9ef}.chroma-dark .kc{color:#66d9ef}.chroma-dark .kd{color:#66d9ef}.chroma-dark .kn{color:#f92672}.chroma-dark .kp{color:#66d9ef}.chroma-dark .kr{color:#66d9ef}.chroma-dark .kt{color:#66d9ef}.chroma-dark .na{color:#a6e22e}.chroma-dark .nc{color:#a6e22e}.chroma-dark .no{color:#66d9ef}.chroma-dark .nd{color:#a6e22e}.chroma-dark .ne{color:#a6e22e}.chroma-dark .nf{color:#a6e22e}.chroma-dark .nx{color:#a6e22e}.chroma-dark .nt{color:#f92672}.chroma-dark .l{color:#ae81ff}.chroma-dark .ld{color:#e6db74}.chroma-dark .s{color:#e6db74}.chroma-dark .sa{color:#e6db74}.chroma-dark .sb{color:#e6db74}.chroma-dark .sc{color:#e6db74}.chroma-dark .dl{color:#e6db74}.chroma-dark .sd{color:#e6db74}.chroma-dark .s2{color:#e6db74}.chroma-dark .se{color:#ae81ff}.chroma-dark .sh{color:#e6db74}.chroma-dark .si{color:#e6db74}.chroma-dark .sx{color:#e6db74}.chroma-dark .sr{color:#e6db74}.chroma-dark .s1{color:#e6db74}.chroma-dark .ss{color:#e6db74}.chroma-dark .m{color:#ae81ff}.chroma-dark .mb{color:#ae81ff}.chroma-dark .mf{color:#ae81ff}.chroma-dark .mh{color:#ae81ff}.chroma-dark .mi{color:#ae81ff}.chroma-dark .il{color:#ae81ff}.chroma-dark .mo{color:#ae81ff}.chroma-dark .o{color:#f92672}.chroma-dark .ow{color:#f92672}.chroma-dark .c{color:#75715e}.chroma-dark .ch{color:#75715e}.chroma-dark .cm{color:#75715e}.chroma-dark .c1{color:#75715e}.chroma-dark .cs{color:#75715e}.chroma-dark .cp{color:#75715e}.chroma-dark .cpf{color:#75715e}.chroma-dark .gd{color:#f92672}.chroma-dark .gi{color:#a6e22e}.chroma-dark .gu{color:#75715e}.chroma-dark{color:var(--color-contrast-high);background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5)}@media (max-width: 740px){.main-inner{width:auto !important}.anchor-link{position:relative;transform:none;float:right}.menu{display:flex;justify-content:space-around;word-break:break-all}.menu-item{margin:0}} +:root{--color-primary:hsl(220, 90%, 56%);--color-primary-h:220;--color-primary-s:90%;--color-primary-l:56%;--color-bg:hsl(0, 0%, 100%);--color-bg-h:0;--color-bg-s:0%;--color-bg-l:100%;--color-contrast-lower:hsl(0, 0%, 95%);--color-contrast-lower-h:0;--color-contrast-lower-s:0%;--color-contrast-lower-l:95%;--color-contrast-low:hsl(240, 1%, 83%);--color-contrast-low-h:240;--color-contrast-low-s:1%;--color-contrast-low-l:83%;--color-contrast-medium:hsl(240, 1%, 48%);--color-contrast-medium-h:240;--color-contrast-medium-s:1%;--color-contrast-medium-l:48%;--color-contrast-high:hsl(240, 4%, 20%);--color-contrast-high-h:240;--color-contrast-high-s:4%;--color-contrast-high-l:20%;--color-contrast-higher:hsl(240, 8%, 12%);--color-contrast-higher-h:240;--color-contrast-higher-s:8%;--color-contrast-higher-l:12%}[data-theme="dark"]{--color-primary:hsl(201, 65%, 62%);--color-primary-h:201;--color-primary-s:65%;--color-primary-l:62%;--color-bg:hsl(240, 8%, 12%);--color-bg-h:240;--color-bg-s:8%;--color-bg-l:12%;--color-contrast-lower:hsl(240, 6%, 19%);--color-contrast-lower-h:240;--color-contrast-lower-s:6%;--color-contrast-lower-l:19%;--color-contrast-low:hsl(240, 3%, 27%);--color-contrast-low-h:240;--color-contrast-low-s:3%;--color-contrast-low-l:27%;--color-contrast-medium:hsl(240, 1%, 57%);--color-contrast-medium-h:240;--color-contrast-medium-s:1%;--color-contrast-medium-l:57%;--color-contrast-high:hsl(0, 0%, 89%);--color-contrast-high-h:0;--color-contrast-high-s:0%;--color-contrast-high-l:89%;--color-contrast-higher:hsl(0, 0%, 100%);--color-contrast-higher-h:0;--color-contrast-higher-s:0%;--color-contrast-higher-l:100%}#theme-toggle{padding:1em;cursor:pointer;float:right;position:relative;z-index:4}[data-theme="dark"] img{filter:brightness(50%)}html,body{margin:0;width:100%;height:100%}body{font-size:20px;color:var(--color-contrast-high);background-color:var(--color-bg);overflow-wrap:break-word;word-wrap:break-word;line-height:1.618}.container{min-height:100%;min-width:100%;position:relative}.main{padding:2em 1em 15em;display:block}.main-inner{margin:0 auto;display:block}.icon{width:1em;height:1em;fill:currentColor;display:inline-block}svg{vertical-align:middle}h1,h2,h3,h4,h5,h6{margin:1.618em 0 1em;color:var(--color-contrast-higher)}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{text-decoration:none !important;color:var(--color-contrast-higher)}h1{font-size:2em}h2{font-size:1.8em}h3{font-size:1.6em}h4{font-size:1.4em}h5{font-size:1.2em}h6{font-size:1em}a{color:var(--color-contrast-high);text-decoration:none;transition:color .5s}a:hover{color:var(--color-primary)}::selection{background-color:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.3)}::-webkit-scrollbar{width:0.4em;height:0.2em}::-webkit-scrollbar-track{background-color:var(--color-bg)}::-webkit-scrollbar-thumb{background-color:var(--color-contrast-low)}::-webkit-scrollbar-thumb:hover{background-color:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.5)}::-webkit-scrollbar-thumb:active{background-color:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.75)}[data-hide="true"]{display:none}[data-small-caps="true"] .post-body h1,[data-small-caps="true"] .post-body h2,[data-small-caps="true"] .post-body h3,[data-small-caps="true"] .post-body h4,[data-small-caps="true"] .post-body h5,[data-small-caps="true"] .post-body h6{font-variant:small-caps}[data-small-caps="true"] .contents-title{font-variant:small-caps}[data-align="justify"] .post-body p{text-align:justify;text-justify:distribute}[data-align="center"] .post-body p{text-align:center}[data-type="poetry"] .post-body{display:table;margin:0 auto}.list-title,.term-title,.list-year,.list-month,.post-title,.post-subtitle,.related-title,.post-nav,thead,dt{font-family:Comfortaa,sans-serif}.post-body h1,.post-body h2,.post-body h3,.post-body h4,.post-body h5,.post-body h6{font-family:Comfortaa,sans-serif}.contents-title{font-family:Comfortaa,sans-serif}code,pre,sup,.post-meta,.updated-badge,.post-gitinfo,.minimal-footer,.minimal-footer-about,.busuanzi-site-uv-and-pv{font-family:"Source Code Pro",monospace}body{font-family:"IBM Plex Serif",serif}.header{z-index:3;position:relative}.site-brand{text-align:center}.site-brand{background-image:linear-gradient(90deg, #f79533 0, #f37055 15%, #ef4e7b 30%, #a166ab 44%, #5073b8 58%, #1098ad 72%, #07b39b 86%, #6dba82 100%)}.brand{width:250px;height:100px;fill:#fff}.nav{z-index:3;position:relative}.menu{padding:0;margin:0;list-style:none;text-align:center;background:var(--color-contrast-lower);line-height:1.5;font-weight:500}.menu-item{display:inline-block;margin:0 1em}.menu-item a{color:var(--color-contrast-medium)}.menu-item a:hover{color:var(--color-primary)}.active a{color:var(--color-primary)}.menu-item-name{display:flex}.post-meta{color:var(--color-contrast-medium);font-size:80%;text-align:center;margin:20px 0}.post-meta a{color:var(--color-contrast-medium)}.post-meta a:hover{color:var(--color-primary)}.home .post-meta{margin:20px 0}.post-meta-item{margin:0.5em;display:inline-block}.post-meta-icon{fill:hsla(var(--color-contrast-medium-h), var(--color-contrast-medium-s), var(--color-contrast-medium-l), 0.5);margin-bottom:0.3em}.single .main-inner{width:32em}.post-title{text-align:center}.post-subtitle{font-size:1.8em;text-align:center;font-weight:700;margin-top:-0.618em}.post-description{text-align:center;margin:20px 0;font-size:90%}.post-body{margin-top:5em !important}.post-body a{text-decoration:underline}.post p{margin:0 0 1em;line-height:1.618}.post img{display:block;margin:2em auto;max-width:100%;border:1px solid var(--color-contrast-lower);clear:both}.post video{display:block;max-width:100%;margin:2em auto;clear:both}.post sup{font-size:70%;vertical-align:super}.post sup a{text-decoration:none}.post ol,.post ul{padding-left:2em;line-height:1.618}.post hr{border:none;margin:2.427em 0 1.5em;text-align:center}.post hr::after{content:"···";letter-spacing:2em;padding-left:2em}blockquote{margin:2em 0;padding:0 1em;color:var(--color-contrast-medium);border-left:3px solid var(--color-contrast-low)}blockquote p{text-align:left !important}blockquote a{color:var(--color-contrast-medium)}blockquote a:hover{color:var(--color-primary)}.emphasis-point{font-weight:normal;text-emphasis:'•';-webkit-text-emphasis:'•';-moz-text-emphasis:'•';text-emphasis-position:under;-webkit-text-emphasis-position:under;-moz-text-emphasis-position:under}.drop-cap{float:left;font-size:62px;margin-right:12.36px;margin-top:10px;line-height:32.36px}.caption{display:block;text-align:center;margin:-1em 0 0;font-size:90%;color:var(--color-contrast-medium)}.contents{margin-top:5em}.contents ol{list-style:none;counter-reset:item}.contents ol li::before{content:counters(item, ".") ". ";counter-increment:item}ol.toc{padding:0;overflow:auto hidden;white-space:nowrap}.footnotes{font-size:90%;margin-top:100px}.footnotes hr{margin:0;height:1px;border:none;background-color:var(--color-contrast-medium)}.footnotes hr::after{content:none}.footnotes ol{margin:32.36px 0 0;padding:0 20px 0 40px}.anchor-link{position:absolute;transform:translate(-150%)}.anchor-icon{width:0.75em;height:0.75em;vertical-align:baseline}table{width:100%;border-collapse:collapse;border-spacing:0;border:1px solid var(--color-contrast-lower);margin:2em 0}thead{font-weight:700}th,td{font-size:0.9em;padding:0.4em;border:1px solid var(--color-contrast-lower)}table>tbody>tr:nth-of-type(odd){background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5)}table>tbody>tr:hover{background-color:var(--color-contrast-lower)}dt{font-weight:700}dd{margin-left:2em;text-align:left}code{padding:2.5px 5px;background-color:var(--color-contrast-lower);border-radius:3px;font-size:80%}pre{overflow:auto hidden;font-size:16px;margin:40px 0;padding:1em;line-height:1.618;background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.75)}pre code{background-color:unset;font-size:inherit;padding:0}.highlight{font-size:0.8em;margin:40px 0}.highlight pre{margin:0 !important;overflow:auto hidden;background-color:unset}.highlight th,.highlight td{font-size:inherit}.highlight table>tbody>tr:nth-of-type(odd){background-color:inherit}.highlight table>tbody>tr:hover{background-color:inherit}span.lnt{user-select:none;display:block;margin-right:-1em !important;padding:0 !important}.katex-display,mjx-container[jax="CHTML"][display="true"]{overflow:auto hidden;text-indent:0}:root{--anchor-opacity: 0}.anchor-link{opacity:var(--anchor-opacity);transition:all .25s}.post h1:hover,.post h2:hover,.post h3:hover,.post h4:hover,.post h5:hover,.post h6:hover,.post .anchor-link:hover{--anchor-opacity: 1}.footnote-icon{fill:hsla(var(--color-contrast-high-h), var(--color-contrast-high-s), var(--color-contrast-high-l), 0.5);transition:fill .5s}.footnote-icon:hover{fill:var(--color-primary)}[data-indent="true"] .contents-title{text-align:center}[data-indent="true"] .post-body p{text-indent:2em;margin:0}[data-indent="true"] .post-body .caption{text-indent:0;margin:0 0 1em}[data-indent="true"] .post-body blockquote{margin:1em 0;padding:0;border:none}[data-indent="true"] .post-body img,[data-indent="true"] .post-body video{margin:1em auto}[data-indent="true"] .post-body table{margin:1em 0}[data-indent="true"] .post-body pre,[data-indent="true"] .post-body .highlight{margin:20px 0}[data-indent="true"] .post-body h1,[data-indent="true"] .post-body h2,[data-indent="true"] .post-body h3,[data-indent="true"] .post-body h4,[data-indent="true"] .post-body h5,[data-indent="true"] .post-body h6{text-align:center}[data-indent="true"] .post-body .anchor-link{position:relative;transform:none;display:block;float:none}[data-indent="true"] .post-body ol,[data-indent="true"] .post-body ul{margin:0;list-style-position:inside}[data-indent="true"] .post-body ol p,[data-indent="true"] .post-body ul p{text-indent:0;display:inline-block}[data-indent="true"] .post-body .footnotes ol{margin:32.36px 0 0;list-style-position:outside}[data-indent="true"] .post-body .footnotes ol p{display:block}[data-indent="true"] .post-body dl{text-indent:2em}[data-indent="true"] .post-body dl dd{text-indent:0;margin-left:4em}[data-indent="true"] .post-body dl p{text-indent:0}.post-copyright{margin:0;list-style:none;margin-top:5em;padding:0.5em 1em;background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5);border-left:3px solid hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.5);line-height:2}.copyright-item{line-height:1.5;margin:0.5em 0}.updated-badge-container{margin-top:5em;text-align:center}.updated-badge-left{fill:var(--color-contrast-low)}.updated-badge-right{fill:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.5)}.related-posts{text-align:left;border:1px solid var(--color-contrast-lower);padding:0.6em 1em;line-height:2em;margin-top:5em}.related-title{font-size:1em;margin:0}.related-icon{float:right;margin-top:0.4em}.related-list{margin:0;padding:0;list-style:none}.related-link{line-height:1.5;display:inline-block}.post-tags{margin-top:100px;text-align:center;font-size:90%}.post-tags-link{color:hsla(var(--color-contrast-medium-h), var(--color-contrast-medium-s), var(--color-contrast-medium-l), 0.9);margin:0 0.5em;line-height:2;display:inline-block}.tag-icon{margin-right:0.3em;font-size:80%}.post-nav{list-style:none;padding:0;display:flex;justify-content:space-between;border-top:1px solid var(--color-contrast-lower);font-weight:700;margin-top:5em;padding-top:0.618em}.post-nav-prev{margin-right:auto;max-width:42%}.post-nav-next{margin-left:auto;text-align:right;max-width:42%}.list .main-inner{width:30em}.list-title{text-align:center}.list ul{list-style:none;padding:0}.list-item{line-height:2;position:relative;transition:border .5s;border-bottom:1px dashed var(--color-contrast-low);margin-top:1em;padding-bottom:0.5em;display:flex;align-items:baseline}.list-item:hover{border-bottom-color:var(--color-primary)}.list-item:hover ::before{background:var(--color-primary)}.list-item ::before{content:" ";position:absolute;left:0.618em;top:0.618em;width:6.66666667px;height:6.66666667px;background:var(--color-contrast-low);border-radius:50%;border:1px solid var(--color-bg);transition:background .5s;font-size:20px}.list-item-title{margin:0 0.618em 0 2em;font-size:1.2em;line-height:1.5}.list-item-time{margin:0 0.618em 0 2em;color:var(--color-contrast-medium);line-height:1.5}.list-year{display:flex;justify-content:space-between;align-items:baseline}.term-count{color:var(--color-contrast-medium);font-size:0.7em}.tree{margin-left:-2em;overflow:auto hidden;white-space:nowrap}.category-item{color:blue;font-size:1.2em}.category-item:hover{color:blueviolet}.category-count{color:var(--color-contrast-medium)}.tag-cloud{text-align:center}.tag-cloud-item{margin:10px;display:inline-block}.list-item-title{flex:1}.list-item-time{text-align:right;margin-left:1em}.back-to-top{position:fixed;right:0;z-index:1}.back-to-top a{display:block;padding:1em;color:var(--color-contrast-medium)}.back-to-top a:hover{color:var(--color-primary)}.back-to-top{bottom:-5em;transition:bottom 0.3s ease-in-out}.back-to-top.show{bottom:0}.footer{position:absolute;bottom:0;width:100%;font-size:90%;color:var(--color-contrast-medium)}.footer a{color:var(--color-contrast-medium)}.footer a:hover{color:var(--color-primary)}.footer-inner{padding:1em;text-align:center}.footer-icon{margin:0 0.25em 0.3em}.footer-icon{fill:#f06292}@keyframes heartbeat{0%,100%{transform:scale(1)}10%,30%{transform:scale(0.9)}20%,40%,50%,60%,70%,80%{transform:scale(1.1)}}.footer-icon{animation:heartbeat 1.33s ease-in-out infinite}.summary-title-link{color:var(--color-contrast-higher)}.summary{line-height:1.618;display:block}.read-more-container{text-align:center;margin-top:1.618em}.read-more-link{display:inline-block}.pagination{list-style:none;margin:5em 0 0;padding:0;display:flex;justify-content:space-between}.pagination-prev{margin-right:auto}.pagination-next{margin-left:auto;text-align:right}.fof::before{background-repeat:no-repeat;background-size:cover;background-position:50% 50%;content:" ";position:fixed;width:100%;height:100%;top:0;left:0;z-index:1}.fof .main-inner{background:rgba(0,0,0,0.25);min-height:100%;min-width:100%;position:absolute;z-index:3}.fof video{position:fixed;top:50%;left:50%;min-width:100%;min-height:100%;width:auto;height:auto;z-index:2;transform:translateX(-50%) translateY(-50%)}.fof h1{font-size:3rem;text-transform:uppercase;letter-spacing:0.3rem;text-align:center;top:15%;left:5%;right:5%;position:absolute;color:#fff;margin:0.67em 0}.fof .fof-footer{font-size:2rem;position:absolute;bottom:15%;left:10%;right:10%;text-align:center}.fof a{color:#eee}.fof a:hover{color:#fff}@media only screen and (max-device-width: 1024px){.fof #bgvid{display:none}}.fof::before{background-image:url()}.chroma{background-color:#ffffff}.chroma .err{color:#ff0000;background-color:#ffaaaa}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.chroma .hl{display:block;width:100%;background-color:#ffffcc}.chroma .lnt{margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f}.chroma .ln{margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f}.chroma .k{color:#0000aa}.chroma .kc{color:#0000aa}.chroma .kd{color:#0000aa}.chroma .kn{color:#0000aa}.chroma .kp{color:#0000aa}.chroma .kr{color:#0000aa}.chroma .kt{color:#00aaaa}.chroma .na{color:#1e90ff}.chroma .nb{color:#00aaaa}.chroma .nc{color:#00aa00}.chroma .no{color:#aa0000}.chroma .nd{color:#888888}.chroma .ni{color:#880000}.chroma .nf{color:#00aa00}.chroma .nn{color:#00aaaa}.chroma .nt{color:#1e90ff}.chroma .nv{color:#aa0000}.chroma .s{color:#aa5500}.chroma .sa{color:#aa5500}.chroma .sb{color:#aa5500}.chroma .sc{color:#aa5500}.chroma .dl{color:#aa5500}.chroma .sd{color:#aa5500}.chroma .s2{color:#aa5500}.chroma .se{color:#aa5500}.chroma .sh{color:#aa5500}.chroma .si{color:#aa5500}.chroma .sx{color:#aa5500}.chroma .sr{color:#009999}.chroma .s1{color:#aa5500}.chroma .ss{color:#0000aa}.chroma .m{color:#009999}.chroma .mb{color:#009999}.chroma .mf{color:#009999}.chroma .mh{color:#009999}.chroma .mi{color:#009999}.chroma .il{color:#009999}.chroma .mo{color:#009999}.chroma .ow{color:#0000aa}.chroma .c{color:#888888}.chroma .ch{color:#888888}.chroma .cm{color:#888888}.chroma .c1{color:#888888}.chroma .cs{color:#0000aa}.chroma .cp{color:#4c8317}.chroma .cpf{color:#4c8317}.chroma .gd{color:#aa0000}.chroma .gr{color:#aa0000}.chroma .gh{color:#000080}.chroma .gi{color:#00aa00}.chroma .go{color:#666666}.chroma .gp{color:#454545}.chroma .gu{color:#800080}.chroma .gt{color:#aa0000}.chroma .w{color:#999999}.chroma{color:var(--color-contrast-high);background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5)}.chroma-dark{color:#f8f8f2;background-color:#272822}.chroma-dark .err{color:#960050;background-color:#1e0010}.chroma-dark .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma-dark .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.chroma-dark .hl{display:block;width:100%;background-color:#ffffcc}.chroma-dark .lnt{margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f}.chroma-dark .ln{margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f}.chroma-dark .k{color:#66d9ef}.chroma-dark .kc{color:#66d9ef}.chroma-dark .kd{color:#66d9ef}.chroma-dark .kn{color:#f92672}.chroma-dark .kp{color:#66d9ef}.chroma-dark .kr{color:#66d9ef}.chroma-dark .kt{color:#66d9ef}.chroma-dark .na{color:#a6e22e}.chroma-dark .nc{color:#a6e22e}.chroma-dark .no{color:#66d9ef}.chroma-dark .nd{color:#a6e22e}.chroma-dark .ne{color:#a6e22e}.chroma-dark .nf{color:#a6e22e}.chroma-dark .nx{color:#a6e22e}.chroma-dark .nt{color:#f92672}.chroma-dark .l{color:#ae81ff}.chroma-dark .ld{color:#e6db74}.chroma-dark .s{color:#e6db74}.chroma-dark .sa{color:#e6db74}.chroma-dark .sb{color:#e6db74}.chroma-dark .sc{color:#e6db74}.chroma-dark .dl{color:#e6db74}.chroma-dark .sd{color:#e6db74}.chroma-dark .s2{color:#e6db74}.chroma-dark .se{color:#ae81ff}.chroma-dark .sh{color:#e6db74}.chroma-dark .si{color:#e6db74}.chroma-dark .sx{color:#e6db74}.chroma-dark .sr{color:#e6db74}.chroma-dark .s1{color:#e6db74}.chroma-dark .ss{color:#e6db74}.chroma-dark .m{color:#ae81ff}.chroma-dark .mb{color:#ae81ff}.chroma-dark .mf{color:#ae81ff}.chroma-dark .mh{color:#ae81ff}.chroma-dark .mi{color:#ae81ff}.chroma-dark .il{color:#ae81ff}.chroma-dark .mo{color:#ae81ff}.chroma-dark .o{color:#f92672}.chroma-dark .ow{color:#f92672}.chroma-dark .c{color:#75715e}.chroma-dark .ch{color:#75715e}.chroma-dark .cm{color:#75715e}.chroma-dark .c1{color:#75715e}.chroma-dark .cs{color:#75715e}.chroma-dark .cp{color:#75715e}.chroma-dark .cpf{color:#75715e}.chroma-dark .gd{color:#f92672}.chroma-dark .gi{color:#a6e22e}.chroma-dark .gu{color:#75715e}.chroma-dark{color:var(--color-contrast-high);background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5)}@media (max-width: 740px){.main-inner{width:auto !important}.anchor-link{position:relative;transform:none;float:right}.menu{display:flex;justify-content:space-around;word-break:break-all}.menu-item{margin:0}} diff --git a/exampleSite/resources/_gen/assets/scss/scss/main.scss_b04c21e44835e7dcdc8cb03d103b5ef1.json b/exampleSite/resources/_gen/assets/scss/scss/main.scss_b04c21e44835e7dcdc8cb03d103b5ef1.json index 3c52d0e..8240817 100644 --- a/exampleSite/resources/_gen/assets/scss/scss/main.scss_b04c21e44835e7dcdc8cb03d103b5ef1.json +++ b/exampleSite/resources/_gen/assets/scss/scss/main.scss_b04c21e44835e7dcdc8cb03d103b5ef1.json @@ -1 +1 @@ -{"Target":"css/meme.min.4b148ff5a3ef5b23cc4b3535a90689d12e6a69919d40258fc65e3a9c4c5697a9.css","MediaType":"text/css","Data":{"Integrity":"sha256-SxSP9aPvWyPMSzU1qQaJ0S5qaZGdQCWPxl46nExWl6k="}}
\ No newline at end of file +{"Target":"css/meme.min.ede3a5876aeee960ad67eb4ca39c46022b533542ba2769cedf49996a1566ff1f.css","MediaType":"text/css","Data":{"Integrity":"sha256-7eOlh2ru6WCtZ+tMo5xGAitTNUK6J2nO30mZahVm/x8="}}
\ No newline at end of file diff --git a/layouts/index.sectionsatom.xml b/layouts/index.sectionsatom.xml index 8adee4e..e97c68a 100644 --- a/layouts/index.sectionsatom.xml +++ b/layouts/index.sectionsatom.xml @@ -57,7 +57,10 @@ {{- end }} {{- partial "components/summary.html" $page -}} {{- $summary := .Description | default ($page.Scratch.Get "summary" | plainify | replaceRE `\n……` ``) -}} - {{ printf `<summary type="html"><![CDATA[%s]]></summary>` ($summary | markdownify | htmlUnescape) | safeHTML }} + {{- $raw := $summary -}} + {{- partial "components/markdownify.html" (dict "Deliver" $page "raw" $raw) -}} + {{- $summary := $page.Scratch.Get "Content" -}} + {{ printf `<summary type="html"><![CDATA[%s]]></summary>` ($summary | htmlUnescape) | safeHTML }} {{ if $.Site.Params.includeContent }} {{ printf `<content type="html"><![CDATA[%s]]></content>` .Content | safeHTML }} {{ end }} diff --git a/layouts/index.sectionsrss.xml b/layouts/index.sectionsrss.xml index d5ac9c6..7891ef4 100644 --- a/layouts/index.sectionsrss.xml +++ b/layouts/index.sectionsrss.xml @@ -52,7 +52,10 @@ {{ else }} {{- partial "components/summary.html" $page -}} {{- $summary := .Description | default ($page.Scratch.Get "summary" | plainify | replaceRE `\n……` ``) -}} - {{ printf `<description><![CDATA[%s]]></description>` ($summary | markdownify | htmlUnescape) | safeHTML }} + {{- $raw := $summary -}} + {{- partial "components/markdownify.html" (dict "Deliver" $page "raw" $raw) -}} + {{- $summary := $page.Scratch.Get "Content" -}} + {{ printf `<description><![CDATA[%s]]></description>` ($summary | htmlUnescape) | safeHTML }} {{ end }} <!-- Sections --> {{ if eq $.Site.Params.categoryBy "sections" }} diff --git a/layouts/partials/components/auto-detect-images.html b/layouts/partials/components/auto-detect-images.html index 808404e..9091118 100644 --- a/layouts/partials/components/auto-detect-images.html +++ b/layouts/partials/components/auto-detect-images.html @@ -2,7 +2,7 @@ <!-- https://gohugo.io/functions/replacere/ --> <!-- https://regex101.com/ --> {{- if and .IsPage (in .Site.Params.mainSections .Section) -}} - {{- $imgs := findRE `<img src="/?([^"]+)` .Content -}} + {{- $imgs := findRE `<img src="/?([^"]+)` .Content | uniq -}} {{- with $imgs -}} {{- $.Scratch.Delete "imgsURL" -}} {{- range . -}} diff --git a/layouts/partials/components/content.html b/layouts/partials/components/content.html index 797745c..f9e4862 100644 --- a/layouts/partials/components/content.html +++ b/layouts/partials/components/content.html @@ -1,5 +1,6 @@ -{{- $Content := .Content -}} -{{- .Scratch.Set "Content" $Content -}} +{{- $Deliver := . -}} +{{- $raw := .RawContent -}} +{{- partial "components/markdownify.html" (dict "Deliver" . "raw" $raw) -}} <!-- Link Headings to TOC --> {{- $Content := .Scratch.Get "Content" -}} @@ -67,34 +68,25 @@ {{- if ne .Type "poetry" -}} {{- if and .Site.Params.enableDropCap (.Params.dropCapAfterHr | default .Site.Params.enableDropCapAfterHr) -}} {{- if .Params.deleteHrBeforeDropCap | default .Site.Params.deleteHrBeforeDropCap -}} - {{- $replacement := `$2 style="text-indent:0"$3<span class="drop-cap">$4</span>$5` -}} + {{- $replacement := `$3 style="text-indent:0"$4<span class="drop-cap">$5</span>$6` -}} {{- $.Scratch.Set "replacement" $replacement -}} {{- else -}} - {{- $replacement := `$1$2 style="text-indent:0"$3<span class="drop-cap">$4</span>$5` -}} + {{- $replacement := `$1$3 style="text-indent:0"$4<span class="drop-cap">$5</span>$6` -}} {{- $.Scratch.Set "replacement" $replacement -}} {{- end -}} {{- $replacement := .Scratch.Get "replacement" -}} - {{- $regexPatternDropCapAfterHr := `(\n<hr />\n)(\n<p)(>)([^<])(.+(</p>|\n))` -}} + {{- $regexPatternDropCapAfterHr := `(\n(<hr />|<hr>))(\n\n?<p)(>)([^<])(.+(</p>|\n))` -}} {{- $regexReplacementDropCapAfterHr := $replacement -}} {{- $Content := $Content | replaceRE $regexPatternDropCapAfterHr $regexReplacementDropCapAfterHr | safeHTML -}} {{- .Scratch.Set "Content" $Content -}} {{- end -}} {{- end -}} -<!-- New Markdown Syntax: Emphasis Point `..text..` --> -{{- $Content := .Scratch.Get "Content" -}} -{{- if .Site.Params.enableEmphasisPoint -}} - {{- $regexPatternEmphasisPoint := `([^\.\x60])\.\.([^\.\s\n\/\\]+)\.\.([^\.\x60])` -}} - {{- $regexReplacementEmphasisPoint := `$1<strong class="emphasis-point">$2</strong>$3` -}} - {{- $Content := $Content | replaceRE $regexPatternEmphasisPoint $regexReplacementEmphasisPoint | safeHTML -}} - {{- .Scratch.Set "Content" $Content -}} -{{- end -}} - <!-- Footnote Ref with Square Brackets `[]` --> {{- $Content := .Scratch.Get "Content" -}} {{- if .Site.Params.squareBrackets -}} - {{- $regexPatternFootnoteRef := `(<sup class="footnote-ref" id="fnref:\d+"><a href="#fn:\d+">)(\d+)(</a></sup>)` -}} + {{- $regexPatternFootnoteRef := `(<sup id="fnref:\d+"><a href="#fn:\d+"[^>]+>)(\d+)(</a></sup>)` -}} {{- $regexReplacementFootnoteRef := `$1[$2]$3` -}} {{- $Content := $Content | replaceRE $regexPatternFootnoteRef $regexReplacementFootnoteRef | safeHTML -}} {{- .Scratch.Set "Content" $Content -}} @@ -110,8 +102,8 @@ <!-- Delete Footnote `<hr />` --> {{- $Content := .Scratch.Get "Content" -}} {{- if .Site.Params.insertHrBySelf -}} - {{- $regexPatternDeleteHr := `<hr />\n(<div class="footnotes">)` -}} - {{- $regexReplacementDeleteHr := `$1` -}} + {{- $regexPatternDeleteHr := `(<hr />|<hr>)\n(<section class="footnotes" role="doc-endnotes">)` -}} + {{- $regexReplacementDeleteHr := `$2` -}} {{- $Content := $Content | replaceRE $regexPatternDeleteHr $regexReplacementDeleteHr | safeHTML -}} {{- .Scratch.Set "Content" $Content -}} {{- end -}} @@ -120,9 +112,9 @@ {{- $Content := .Scratch.Get "Content" -}} {{- with .Site.Params.footnoteReturnLinkIcon -}} {{- $icon := (replace (index $.Site.Data.SVG .) "icon" "icon footnote-icon") -}} - {{- $replacement := (printf `${1}%v</$3` $icon) | safeHTML -}} + {{- $replacement := (printf `${1}%s$3` $icon) | safeHTML -}} - {{- $regexPatternfootnoteReturnLinkIcon := `(href="#fnref[^>]+>)([^a]+)(.+)` -}} + {{- $regexPatternfootnoteReturnLinkIcon := `(href="#fnref[^>]+>)([^<]+)(.+)` -}} {{- $regexReplacementfootnoteReturnLinkIcon := $replacement -}} {{- $Content := $Content | replaceRE $regexPatternfootnoteReturnLinkIcon $regexReplacementfootnoteReturnLinkIcon | safeHTML -}} {{- $.Scratch.Set "Content" $Content -}} @@ -149,7 +141,7 @@ {{- $Content := .Scratch.Get "Content" -}} {{- if and .Site.Params.enableImageHost (eq hugo.Environment "production") -}} {{- $hostURL := .Site.Params.imageHostURL -}} - {{- $temps := findRE `<(img) src="/?([^":]+)` $Content -}} + {{- $temps := findRE `<(img) src="/?([^":]+)` $Content | uniq -}} {{- with $temps -}} {{- range . -}} {{- if not (in (slice "http" "ttps") (substr . -1 4)) -}} @@ -167,7 +159,7 @@ {{- $Content := .Scratch.Get "Content" -}} {{- if and .Site.Params.enableVideoHost (eq hugo.Environment "production") -}} {{- $hostURL := .Site.Params.videoHostURL -}} - {{- $temps := findRE `<(video) src="/?([^":]+)` $Content -}} + {{- $temps := findRE `<(video) src="/?([^":]+)` $Content | uniq -}} {{- with $temps -}} {{- range . -}} {{- if not (in (slice "http" "ttps") (substr . -1 4)) -}} @@ -181,18 +173,11 @@ {{- end -}} {{- end -}} -<!-- Task List --> -{{- $Content := .Scratch.Get "Content" -}} -{{- $regexPatternTaskList := `(<ol |<ul )(class="task-list">\n<li><label>)` -}} -{{- $regexReplacementTaskList := `${1}style="list-style:none" $2` -}} -{{- $Content := $Content | replaceRE $regexPatternTaskList $regexReplacementTaskList | safeHTML -}} -{{- .Scratch.Set "Content" $Content -}} - <!-- Paragraph Indent --> {{- $Content := .Scratch.Get "Content" -}} {{- if ne .Type "poetry" -}} {{- if (and .Site.Params.enableParagraphIndent .Params.indent) | default (and .Site.Params.enableParagraphIndent (eq .Site.Params.paragraphStyle "indent")) -}} - {{- $regexPatternIndent := `(<p)(>)(.+<br />)` -}} + {{- $regexPatternIndent := `(</p>\n<p)(>)(.+(<br />|<br>))` -}} {{- $regexReplacementIndent := `$1 style="text-indent:0;padding-left:2em;margin:1em 0"$2$3` -}} {{- $Content := $Content | replaceRE $regexPatternIndent $regexReplacementIndent | safeHTML -}} {{- .Scratch.Set "Content" $Content -}} diff --git a/layouts/partials/components/markdownify.html b/layouts/partials/components/markdownify.html new file mode 100644 index 0000000..f31a0b1 --- /dev/null +++ b/layouts/partials/components/markdownify.html @@ -0,0 +1,59 @@ +{{- $Deliver := .Deliver -}} +{{- $raw := .raw -}} + +{{- $Deliver.Scratch.Set "Content" $raw -}} + +{{- $enableEmoji := replaceRE `enableEmoji = (.+)` `$1` (delimit (readFile "config.toml" | findRE `enableEmoji = (.+)` | uniq) "") -}} + +<!-- Emoji --> +{{- $Content := $Deliver.Scratch.Get "Content" -}} +{{- if eq $enableEmoji "true" -}} + {{- $Content := $Content | emojify -}} + {{- $Deliver.Scratch.Set "Content" $Content -}} +{{- end -}} + +<!-- LaTeX --> +{{- $Content := $Deliver.Scratch.Get "Content" -}} +{{- if $Deliver.Site.Params.compatibleWithLaTeX -}} + {{- if or ($Deliver.Params.katex | default $Deliver.Site.Params.enableKaTeX) ($Deliver.Params.mathjax | default $Deliver.Site.Params.enableMathJax) -}} + {{- $regexLaTeX := `([^\$]|\n)\$(.+)\$` -}} + {{- $replacementLaTeX := `$1<span>$$${2}$$</span>` -}} + {{- $Content := $Content | replaceRE $regexLaTeX $replacementLaTeX -}} + + {{- $regexLaTeX := `\$\$((.|\s)[^\$]+)\$\$` -}} + {{- $replacementLaTeX := `<div>$$$$${1}$$$$</div>` -}} + {{- $Content := $Content | replaceRE $regexLaTeX $replacementLaTeX -}} + + {{- $Deliver.Scratch.Set "Content" $Content -}} + {{- end -}} +{{- end -}} + +<!-- New Markdown Syntax: Emphasis Point `..text..` --> +{{- $Content := $Deliver.Scratch.Get "Content" -}} +{{- if $Deliver.Site.Params.enableEmphasisPoint -}} + {{- $regexPatternEmphasisPoint := `([^\.\x60])\.\.([^\.\s\n\/\\]+)\.\.([^\.\x60])` -}} + {{- $regexReplacementEmphasisPoint := `$1<strong class="emphasis-point">$2</strong>$3` -}} + {{- $Content := $Content | replaceRE $regexPatternEmphasisPoint $regexReplacementEmphasisPoint | safeHTML -}} + {{- $Deliver.Scratch.Set "Content" $Content -}} +{{- end -}} + +<!-- Markdown --> +{{- $Content := $Deliver.Scratch.Get "Content" -}} +{{- $Content := $Content | markdownify -}} +{{- $Deliver.Scratch.Set "Content" $Content -}} + +<!-- External Links --> +{{- $Content := $Deliver.Scratch.Get "Content" -}} +{{- if $Deliver.Site.Params.hrefTargetBlank -}} + {{- $temps := findRE `(<a href="[^"]+")` $Content | uniq -}} + {{- with $temps -}} + {{- range . -}} + {{- if eq (substr . 9 4) "http" -}} + {{- $raw := replaceRE `(<a href="[^"]+")` `$1` . -}} + {{- $replacement := printf `%s target="_blank" rel="noopener"` $raw -}} + {{- $Content := ($Deliver.Scratch.Get "Content") | replaceRE . $replacement | safeHTML -}} + {{- $Deliver.Scratch.Set "Content" $Content -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}}
\ No newline at end of file diff --git a/layouts/partials/components/open-graph.html b/layouts/partials/components/open-graph.html index b4d5240..1545f1c 100644 --- a/layouts/partials/components/open-graph.html +++ b/layouts/partials/components/open-graph.html @@ -32,7 +32,7 @@ {{- $author := ($Deliver.Scratch.Get "author") -}} <!-- languageCode --> {{- if $Deliver.Site.IsMultiLingual -}} - {{- $languageCode := readFile "config.toml" | findRE `languageCode = "([^"]+)` -}} + {{- $languageCode := readFile "config.toml" | findRE `languageCode = "([^"]+)` | uniq -}} {{- with $languageCode -}} {{- $Deliver.Scratch.Delete "languageCode" -}} {{- range . -}} diff --git a/layouts/partials/components/toc.html b/layouts/partials/components/toc.html index 9e3398c..ffbed6f 100644 --- a/layouts/partials/components/toc.html +++ b/layouts/partials/components/toc.html @@ -1,19 +1,18 @@ {{- $toc := .TableOfContents -}} -{{- $regexPatternTOC := `<nav id="TableOfContents">((.|\s)+)</nav>` -}} -{{- $regexReplacementTOC := `<nav class="contents">$1</nav>` -}} +<!-- Change TOC Attribute --> +{{- $regexPatternTOC := `<nav id="TableOfContents">` -}} +{{- $regexReplacementTOC := `<nav class="contents">` -}} {{- $toc := $toc | replaceRE $regexPatternTOC $regexReplacementTOC | safeHTML -}} -{{- $regexPatternTOC := `(</?)ul>` -}} -{{- $regexReplacementTOC := `${1}ol>` -}} -{{- $toc := $toc | replaceRE $regexPatternTOC $regexReplacementTOC | safeHTML -}} - -{{- $regexPatternTOC := `(<nav class="contents">\n)<ol>` -}} +<!-- Inject Class Attribute --> +{{- $regexPatternTOC := `(<nav class="contents">\n.+)<ol>` -}} {{- $regexReplacementTOC := `$1<ol class="toc">` -}} {{- $toc := $toc | replaceRE $regexPatternTOC $regexReplacementTOC | safeHTML -}} +<!-- Inject TOC Title --> {{- if .Site.Params.displayTOCTitle -}} - {{- $regexPatternTOC := `(<nav class="contents">\n)(<ol class="toc">)` -}} + {{- $regexPatternTOC := `(<nav class="contents">\n.+)(<ol class="toc">)` -}} {{- $regexReplacementTOC := (printf `$1<h2 id="contents" class="contents-title">%s</h2>$2` (i18n "tocTitle")) -}} {{- $toc := $toc | replaceRE $regexPatternTOC $regexReplacementTOC | safeHTML -}} {{- .Scratch.Set "toc" $toc -}} @@ -28,12 +27,5 @@ {{- .Scratch.Set "toc" $toc -}} {{ end }} -<!-- Delete Useless First Level When Post is Not Start With Heading 1 --> {{- $toc := .Scratch.Get "toc" | default $toc -}} -{{- $regexPatternTOC := `(<ol class="toc">)\n<li>\n<ol>(([\n].+)*)\n</ol></li>(\n</ol>)` -}} -{{- $regexReplacementTOC := `$1$2$4` -}} -{{- $toc := $toc | replaceRE $regexPatternTOC $regexReplacementTOC | safeHTML -}} -{{- .Scratch.Set "toc" $toc -}} - -{{- $toc := .Scratch.Get "toc" -}} {{- .Scratch.Set "toc" $toc -}}
\ No newline at end of file diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html index 7c1e760..6abb8fe 100644 --- a/layouts/partials/footer.html +++ b/layouts/partials/footer.html @@ -1,3 +1,4 @@ +{{- $Deliver := . -}} {{ if and .Site.Params.enableFooter (not (and .IsHome (in (slice "poetry" "footage") .Site.Params.homeLayout))) }} <footer id="footer" class="footer"> <div class="footer-inner"> @@ -25,15 +26,24 @@ <div class="site-info">{{ printf `%s%s%s%s` $siteInfoCopyright $siteInfoCreatedYear $siteInfoIcon .Site.Author.name | safeHTML }}</div> {{- if .Site.Params.displayPoweredBy }} - <div class="powered-by">{{ printf `Powered by [Hugo](https://github.com/gohugoio/hugo) | Theme is [MemE](https://github.com/reuixiy/hugo-theme-meme)` | markdownify | safeHTML }}</div> + {{- $raw := `Powered by [Hugo](https://github.com/gohugoio/hugo) | Theme is [MemE](https://github.com/reuixiy/hugo-theme-meme)` -}} + {{- partial "components/markdownify.html" (dict "Deliver" $Deliver "raw" $raw) -}} + {{- $Content := .Scratch.Get "Content" -}} + <div class="powered-by">{{ $Content | safeHTML }}</div> {{- end }} {{- if .Site.Params.displaySiteCopyright }} - <div class="site-copyright">{{ .Site.Copyright | markdownify | safeHTML }}</div> + {{- $raw := .Site.Copyright -}} + {{- partial "components/markdownify.html" (dict "Deliver" $Deliver "raw" $raw) -}} + {{- $Content := .Scratch.Get "Content" -}} + <div class="site-copyright">{{ $Content | safeHTML }}</div> {{- end }} {{- with .Site.Params.customFooter }} - <div class="custom-footer">{{ . | markdownify | safeHTML }}</div> + {{- $raw := . -}} + {{- partial "components/markdownify.html" (dict "Deliver" $Deliver "raw" $raw) -}} + {{- $Content := $Deliver.Scratch.Get "Content" -}} + <div class="custom-footer">{{ $Content | safeHTML }}</div> {{- end }} {{- if and .Site.Params.displayBusuanziSiteUVAndPV (eq hugo.Environment "production") }} diff --git a/layouts/partials/menu.html b/layouts/partials/menu.html index 0b55340..e233001 100644 --- a/layouts/partials/menu.html +++ b/layouts/partials/menu.html @@ -10,7 +10,7 @@ {{ range .Site.Menus.main }} <li class="menu-item{{ if or ($currentPage.IsMenuCurrent "main" .) ($currentPage.HasMenuCurrent "main" .) }} active{{ end }}"> {{- $linkType := (string .Pre) -}} - <a href="{{ .URL }}"{{ if eq $linkType "external" }} target="_blank" rel="external"{{ end }}> + <a href="{{ .URL }}"{{ if eq $linkType "external" }} target="_blank" rel="external noopener"{{ end }}> {{- $iconName := (string .Post) -}} {{- $icon := (index $.Site.Data.SVG $iconName) -}} {{- printf `%s` (replace $icon "icon" "icon menu-item-icon") | safeHTML -}} diff --git a/layouts/partials/minimal-footer-about.html b/layouts/partials/minimal-footer-about.html index 95c6751..91e20e8 100644 --- a/layouts/partials/minimal-footer-about.html +++ b/layouts/partials/minimal-footer-about.html @@ -7,7 +7,7 @@ {{- $linkType := (string .Pre) -}} {{- $iconName := (string .Post) -}} {{- $icon := (index $.Site.Data.SVG $iconName) -}} - <a href="{{ .URL }}"{{ if eq $linkType "external" }} target="_blank" rel="external"{{ end }}>{{ replace $icon "icon" (printf `icon %s` .Identifier) | safeHTML }}{{ .Name }}</a> + <a href="{{ .URL }}"{{ if eq $linkType "external" }} target="_blank" rel="external noopener"{{ end }}>{{ replace $icon "icon" (printf `icon %s` .Identifier) | safeHTML }}{{ .Name }}</a> {{- if lt $index $length -}} {{- print " " -}} {{- end -}} @@ -21,7 +21,7 @@ {{- $linkType := (string .Pre) -}} {{- $iconName := (string .Post) -}} {{- $icon := (index $.Site.Data.SVG $iconName) -}} - <a href="{{ .URL }}"{{ if eq $linkType "external" }} target="_blank" rel="external"{{ end }}>{{ replace $icon "icon" (printf `icon %s` .Identifier) | safeHTML }}{{ .Name }}</a> + <a href="{{ .URL }}"{{ if eq $linkType "external" }} target="_blank" rel="external noopener"{{ end }}>{{ replace $icon "icon" (printf `icon %s` .Identifier) | safeHTML }}{{ .Name }}</a> {{- if lt $index $length -}} {{- print " " -}} {{- end -}} diff --git a/layouts/partials/page/home-footage.html b/layouts/partials/page/home-footage.html index 7cc7a60..1b3682f 100644 --- a/layouts/partials/page/home-footage.html +++ b/layouts/partials/page/home-footage.html @@ -26,7 +26,7 @@ {{- $linkType := (string .Pre) -}} {{- $iconName := (string .Post) -}} {{- $icon := (index $.Site.Data.SVG $iconName) -}} - <a href="{{ .URL }}"{{ if eq $linkType "external" }} target="_blank" rel="external"{{ end }}>{{ replace $icon "icon" (printf `icon %s` .Identifier) | safeHTML }}{{ .Name }}</a> + <a href="{{ .URL }}"{{ if eq $linkType "external" }} target="_blank" rel="external noopener"{{ end }}>{{ replace $icon "icon" (printf `icon %s` .Identifier) | safeHTML }}{{ .Name }}</a> {{- if lt $index $length -}} {{- $.Site.Params.homeLinksDelimiter -}} {{- end -}} diff --git a/layouts/partials/page/home-poetry.html b/layouts/partials/page/home-poetry.html index a6381a0..e71681a 100644 --- a/layouts/partials/page/home-poetry.html +++ b/layouts/partials/page/home-poetry.html @@ -1,7 +1,11 @@ +{{- $Deliver := . -}} <main class="home"> <div class="poetry"> {{ range .Site.Params.homePoetry }} - <p>{{ . | markdownify }}</p> + {{- $raw := . -}} + {{- partial "components/markdownify.html" (dict "Deliver" $Deliver "raw" $raw) -}} + {{- $Content := $Deliver.Scratch.Get "Content" -}} + <p>{{ $Content | safeHTML }}</p> {{ end }} </div> <div class="links"> diff --git a/layouts/partials/post-copyright.html b/layouts/partials/post-copyright.html index 9ae2615..a66e17e 100644 --- a/layouts/partials/post-copyright.html +++ b/layouts/partials/post-copyright.html @@ -1,22 +1,26 @@ +{{- $Deliver := . -}} {{ if and .Site.Params.enablePostCopyright (.Params.displayCopyright | default .Site.Params.displayPostCopyright) }} {{ partial "components/author.html" . }} {{ $author := .Scratch.Get "author" }} {{ with $author.name }} <ul class="post-copyright"> - <li class="copyright-item author">{{ with $author.website }}{{ printf `%s<a href="%s" target="_blank">%s</a>` (i18n "copyrightAuthor") . $author.name | safeHTML }}{{ else }}{{ printf `%s%s` (i18n "copyrightAuthor") $author.name }}{{ end }}</li> + <li class="copyright-item author">{{ with $author.website }}{{ printf `%s<a href="%s" target="_blank" rel="noopener">%s</a>` (i18n "copyrightAuthor") . $author.name | safeHTML }}{{ else }}{{ printf `%s%s` (i18n "copyrightAuthor") $author.name }}{{ end }}</li> {{ if $.Params.original | default $.Site.Params.original }} {{ $url := urls.Parse $.Permalink }} {{ $decodedPath := $url.Path }} {{ $baseURLWithLangFix := (strings.TrimSuffix "/" (print `/` | absLangURL)) }} {{ $decodedPermalink := (printf `%s%s` $baseURLWithLangFix $decodedPath) }} - <li class="copyright-item link">{{ printf `%s<a href="%s" target="_blank">%s</a>` (i18n "copyrightLink") $.RelPermalink $decodedPermalink | safeHTML }}</li> + <li class="copyright-item link">{{ printf `%s<a href="%s" target="_blank" rel="noopener">%s</a>` (i18n "copyrightLink") $.RelPermalink $decodedPermalink | safeHTML }}</li> {{ else }} {{ with $.Params.link }} - <li class="copyright-item link">{{ printf `%s<a href="%s" target="_blank">%s</a>` (i18n "copyrightLink") . . | safeHTML }}</li> + <li class="copyright-item link">{{ printf `%s<a href="%s" target="_blank" rel="noopener">%s</a>` (i18n "copyrightLink") . . | safeHTML }}</li> {{ end }} {{ end }} {{ with $author.copyright }} - <li class="copyright-item license">{{ printf `%s%s` (i18n "copyrightLicense") (. | markdownify) | safeHTML }}</li> + {{- $raw := . -}} + {{- partial "components/markdownify.html" (dict "Deliver" $Deliver "raw" $raw) -}} + {{- $Content := $Deliver.Scratch.Get "Content" -}} + <li class="copyright-item license">{{ printf `%s%s` (i18n "copyrightLicense") $Content | safeHTML }}</li> {{ end }} </ul> {{ end }} diff --git a/layouts/partials/post-gitinfo.html b/layouts/partials/post-gitinfo.html index 53d692d..c08fe20 100644 --- a/layouts/partials/post-gitinfo.html +++ b/layouts/partials/post-gitinfo.html @@ -7,7 +7,7 @@ {{ $icon := (replace (index .Site.Data.SVG .Site.Params.gitIcon) "icon" "icon git-icon") }} <div class="gitinfo-item commit"> {{- with .Site.Params.repoURL -}} - {{- $commit := (printf `<a href="%s/commit/%s" target="_blank">%s%s</a>` . $.GitInfo.Hash $icon $.GitInfo.AbbreviatedHash) -}} + {{- $commit := (printf `<a href="%s/commit/%s" target="_blank" rel="noopener">%s%s</a>` . $.GitInfo.Hash $icon $.GitInfo.AbbreviatedHash) -}} {{- $.Scratch.Set "commit" $commit -}} {{- else -}} {{- $.Scratch.Set "commit" $.GitInfo.AbbreviatedHash -}} @@ -29,7 +29,7 @@ {{ if .Site.Params.displayFeedback }} {{ with .Site.Params.repoURL }} {{ $icon := (replace (index $.Site.Data.SVG $.Site.Params.feedbackIcon) "icon" "icon feedback-icon") }} - <div class="gitinfo-item feedback">{{ printf `<a href="%s/issues" target="_blank">%s%s</a>` . $icon $.Site.Params.feedbackText | safeHTML }}</div> + <div class="gitinfo-item feedback">{{ printf `<a href="%s/issues" target="_blank" rel="noopener">%s%s</a>` . $icon $.Site.Params.feedbackText | safeHTML }}</div> {{ end }} {{ end }} {{ if .Site.Params.displayEditLink }} @@ -37,7 +37,7 @@ {{ $icon := (replace (index $.Site.Data.SVG $.Site.Params.editIcon) "icon" "icon edit-icon") }} {{ $contentDir := $.Site.Params.contentDir }} {{ $content := (cond $.Site.IsMultiLingual (printf `/%s/` $contentDir) (printf `/content/`)) }} - <div class="gitinfo-item edit">{{ printf `<a href="%s%s%s" target="_blank">%s%s</a>` . $content $.Path $icon $.Site.Params.editText | safeHTML }}</div> + <div class="gitinfo-item edit">{{ printf `<a href="%s%s%s" target="_blank" rel="noopener">%s%s</a>` . $content $.Path $icon $.Site.Params.editText | safeHTML }}</div> {{ end }} {{ end }} </div> diff --git a/layouts/partials/post.html b/layouts/partials/post.html index 330420d..cdb6604 100644 --- a/layouts/partials/post.html +++ b/layouts/partials/post.html @@ -1,3 +1,4 @@ +{{- $Deliver := . -}} <main class="main single" id="main"> <div class="main-inner"> @@ -13,12 +14,18 @@ <h1 class="post-title">{{ .Title }}</h1> {{ with .Params.subtitle }} - <div class="post-subtitle">{{ . | markdownify | safeHTML }}</div> + {{- $raw := . -}} + {{- partial "components/markdownify.html" (dict "Deliver" $Deliver "raw" $raw) -}} + {{- $Content := $Deliver.Scratch.Get "Content" -}} + <div class="post-subtitle">{{ $Content | safeHTML }}</div> {{ end }} {{ if .Site.Params.displayPostDescription }} {{ with .Params.description }} - <div class="post-description">{{ . | markdownify | safeHTML }}</div> + {{- $raw := . -}} + {{- partial "components/markdownify.html" (dict "Deliver" $Deliver "raw" $raw) -}} + {{- $Content := $Deliver.Scratch.Get "Content" -}} + <div class="post-description">{{ $Content | safeHTML }}</div> {{ end }} {{ end }} @@ -8,7 +8,7 @@ description = "MemE is a powerful and highly customizable GoHugo theme for perso homepage = "https://github.com/reuixiy/hugo-theme-meme/" tags = ["Blog", "Minimal", "Clean", "Typography", "Multilingual"] features = ["Dark Mode", "InstantClick", "KaTeX", "JSON-LD", "Drop Cap", "PWA", "TOC"] -min_version = "0.57.0" +min_version = "0.62.2" [author] name = "reuixiy" |