From bc254bcab044aaa40346dadb0843aa638cf9444c Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Mon, 12 Aug 2024 17:46:33 +0800
Subject: [PATCH 01/22] :mag: Refactor: add JSON feed support and refactor
output formats build in FixIt
Close #475
---
hugo.toml | 51 ++++++++++++++---------
layouts/index.feed.json | 46 ++++++++++++++++++++
layouts/{index.json => index.search.json} | 0
layouts/partials/assets.html | 2 +-
layouts/partials/head/link.html | 20 +++++----
layouts/partials/head/meta.html | 5 ++-
layouts/partials/init/index.html | 2 +-
7 files changed, 94 insertions(+), 32 deletions(-)
create mode 100644 layouts/index.feed.json
rename layouts/{index.json => index.search.json} (100%)
diff --git a/hugo.toml b/hugo.toml
index 2c62cea4..135083f4 100644
--- a/hugo.toml
+++ b/hugo.toml
@@ -231,12 +231,12 @@ enableEmoji = true
# -------------------------------------------------------------------------------------
[mediaTypes]
- # Options to make output .md files
- [mediaTypes."text/markdown"]
- suffixes = ["md"]
# Options to make output .txt files
[mediaTypes."text/plain"]
suffixes = ["txt"]
+ # Options to make output feed.json files
+ [mediaTypes."application/feed+json"]
+ suffixes = ["json"]
# -------------------------------------------------------------------------------------
# Output Format Definitions
@@ -244,11 +244,6 @@ enableEmoji = true
# -------------------------------------------------------------------------------------
[outputFormats]
- # Options to make output .md files
- [outputFormats.MarkDown]
- mediaType = "text/markdown"
- isPlainText = true
- isHTML = false
# FixIt 0.3.0 | NEW Options to make output /archives/index.html file
[outputFormats.archives]
path = "archives"
@@ -257,6 +252,7 @@ enableEmoji = true
isPlainText = false
isHTML = true
permalinkable = true
+ notAlternative = true
# FixIt 0.3.0 | NEW Options to make output /offline/index.html file
[outputFormats.offline]
path = "offline"
@@ -265,18 +261,35 @@ enableEmoji = true
isPlainText = false
isHTML = true
permalinkable = true
+ notAlternative = true
# FixIt 0.3.0 | NEW Options to make output readme.md file
- [outputFormats.README]
+ [outputFormats.readme]
baseName = "readme"
mediaType = "text/markdown"
isPlainText = true
isHTML = false
+ notAlternative = true
# FixIt 0.3.0 | CHANGED Options to make output baidu_urls.txt file
[outputFormats.baidu_urls]
baseName = "baidu_urls"
mediaType = "text/plain"
isPlainText = true
isHTML = false
+ notAlternative = true
+ # FixIt 0.3.10 | NEW Options to make output feed.json file
+ [outputFormats.feed]
+ baseName = "feed"
+ mediaType = "application/feed+json"
+ isPlainText = true
+ isHTML = false
+ # FixIt 0.3.10 | NEW Options to make output search.json file
+ [outputFormats.search]
+ baseName = "search"
+ mediaType = "application/json"
+ rel = "search"
+ isPlainText = true
+ isHTML = false
+ permalinkable = true
# -------------------------------------------------------------------------------------
# Customizing Output Formats
@@ -284,17 +297,17 @@ enableEmoji = true
# -------------------------------------------------------------------------------------
# Options to make hugo output files, the optional values are below:
-# home: ["HTML", "RSS", "JSON", "archives", "offline", "README", "baidu_urls"]
-# page: ["HTML", "MarkDown"]
-# section: ["HTML", "RSS"]
-# taxonomy: ["HTML", "RSS"]
-# term: ["HTML", "RSS"]
+# home: html, rss, json, feed, archives, offline, readme, baidu_urls, search etc.
+# page: html, markdown
+# section: html, rss
+# taxonomy: html, rss
+# term: html, rss
[outputs]
- home = ["HTML", "RSS", "JSON", "archives"]
- page = ["HTML", "MarkDown"]
- section = ["HTML", "RSS"]
- taxonomy = ["HTML"]
- term = ["HTML", "RSS"]
+ home = ["html", "rss", "feed", "archives", "offline", "readme", "baidu_urls", "search"]
+ page = ["html", "markdown"]
+ section = ["html", "rss"]
+ taxonomy = ["html", "rss"]
+ term = ["html", "rss"]
# -------------------------------------------------------------------------------------
# Taxonomies Configuration
diff --git a/layouts/index.feed.json b/layouts/index.feed.json
new file mode 100644
index 00000000..1720d6f5
--- /dev/null
+++ b/layouts/index.feed.json
@@ -0,0 +1,46 @@
+{{ $list := .Pages -}}
+{{ $length := (len $list) -}}
+
+{
+ "version" : "https://jsonfeed.org/version/1.1",
+ "title" : "{{- .Site.Title -}}",
+ "description": "{{- .Site.Params.description | default .Site.Title -}}",
+ "home_page_url" : "{{ .Site.BaseURL }}",
+ {{ with .OutputFormats.Get "JSONFeed" -}}
+ "feed_url" : "{{ .Permalink }}",
+ {{ end -}}
+ "icon" : "{{ `/apple-touch-icon.png` | absURL }}",
+ "favicon" : "{{ `/favicon.ico` | absURL }}",
+ {{ with .Site.Params.author.name -}}
+ "author" : {
+ "name" : "{{ . }}"{{ with $.Site.Params.author.link }},
+ "url": "{{ . }}"{{ end }}{{ with $.Site.Params.author.avatar }},
+ "avatar": "{{ . | absURL }}"{{ end }}
+ },
+ {{ end -}}
+ "items" : [
+ {{ range $index, $element := .Scratch.Get "mainSectionPages" -}}
+ {
+ "title" : {{ .Title | jsonify }},
+ "date_published" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
+ {{ if .Lastmod -}}
+ "date_modified" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
+ {{ else -}}
+ "date_modified" : "{{ .LastMod.Format "2006-01-02T15:04:05Z07:00" }}",
+ {{ end -}}
+ "id" : "{{ .Permalink }}",
+ "url" : "{{ .Permalink }}",
+ {{ with .Summary -}}
+ "summary": {{ . | plainify | jsonify }},
+ {{ end -}}
+ {{ with (.Param "author").name -}}
+ "author" : {
+ "name" : "{{ . }}"
+ },
+ {{ end -}}
+ "content_html" : {{ .Content | jsonify }},
+ "language": {{ .Language.Lang | default $.Lang | jsonify }}
+ }{{ if ne (add $index 1) $length }},{{ end }}
+ {{ end -}}
+ ]
+}
diff --git a/layouts/index.json b/layouts/index.search.json
similarity index 100%
rename from layouts/index.json
rename to layouts/index.search.json
diff --git a/layouts/partials/assets.html b/layouts/partials/assets.html
index ebdb2a00..54ff1e5f 100644
--- a/layouts/partials/assets.html
+++ b/layouts/partials/assets.html
@@ -16,7 +16,7 @@
{{- dict "Source" $source "Fingerprint" $fingerprint "Defer" true | dict "Scratch" .Scratch "Data" | partial "scratch/script.html" -}}
{{- $config = dict "type" "algolia" "algoliaIndex" $search.algolia.index "algoliaAppID" $search.algolia.appID "algoliaSearchKey" $search.algolia.searchKey | dict "search" | merge $config -}}
{{- else if eq $search.type "fuse" -}}
- {{- with .Site.Home.OutputFormats.Get "json" -}}
+ {{- with .Site.Home.OutputFormats.Get "search" -}}
{{- $config = dict "type" "fuse" "fuseIndexURL" .RelPermalink | dict "search" | merge $config -}}
{{- end -}}
{{- $source := $cdn.fuseJS | default "lib/fuse/fuse.min.js" -}}
diff --git a/layouts/partials/head/link.html b/layouts/partials/head/link.html
index a48979ba..701557f9 100644
--- a/layouts/partials/head/link.html
+++ b/layouts/partials/head/link.html
@@ -1,5 +1,9 @@
{{- $cdn := .Scratch.Get "cdn" | default dict -}}
{{- $fingerprint := .Scratch.Get "fingerprint" -}}
+{{- $title := printf "%s | %s" .Title site.Title -}}
+{{- if .IsHome -}}
+ {{- $title = site.Title -}}
+{{- end -}}
{{- if not .Site.Params.app.noFavicon -}}
{{- with .Site.Params.app.svgFavicon -}}
@@ -18,17 +22,15 @@
{{- end -}}
{{- end -}}
-
-{{- if .Prev -}}
-
+
+{{- with .Prev -}}
+
{{- end -}}
-{{- if .Next -}}
-
+{{- with .Next -}}
+
{{- end -}}
-
-{{- with .OutputFormats.Get "RSS" -}}
-
-
+{{- range .AlternativeOutputFormats -}}
+ {{- printf ` ` .Rel .MediaType.Type .Permalink $title | safeHTML -}}
{{- end -}}
{{- /* style.min.css */ -}}
diff --git a/layouts/partials/head/meta.html b/layouts/partials/head/meta.html
index dadc6cea..fda0a5e2 100644
--- a/layouts/partials/head/meta.html
+++ b/layouts/partials/head/meta.html
@@ -1,7 +1,8 @@
{{- $params := partial "function/params.html" -}}
+{{- $author := .Param "author" -}}
-
-
+
+
{{- $keywords := .Keywords -}}
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index ea2a9a49..fff5310b 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-c936e541" -}}
+{{- .Scratch.Set "version" "v0.3.10-66e628d4" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
From 049f6bb1cd08ede12b4186cb58fb3da42afb8430 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Mon, 12 Aug 2024 22:14:57 +0800
Subject: [PATCH 02/22] :truck: Feat: migrate index templates to
layouts/_default folder and home.[name].html
---
demo/hugo.toml | 2 ++
layouts/{ => _default}/index.baidu_urls.txt | 0
layouts/{ => _default}/index.feed.json | 0
layouts/{ => _default}/index.html | 0
layouts/{ => _default}/index.readme.md | 0
layouts/{ => _default}/index.search.json | 0
layouts/{index.archives.html => home.archives.html} | 0
layouts/{index.offline.html => home.offline.html} | 0
layouts/partials/init/index.html | 2 +-
layouts/{index.rss.xml => rss.xml} | 0
10 files changed, 3 insertions(+), 1 deletion(-)
rename layouts/{ => _default}/index.baidu_urls.txt (100%)
rename layouts/{ => _default}/index.feed.json (100%)
rename layouts/{ => _default}/index.html (100%)
rename layouts/{ => _default}/index.readme.md (100%)
rename layouts/{ => _default}/index.search.json (100%)
rename layouts/{index.archives.html => home.archives.html} (100%)
rename layouts/{index.offline.html => home.offline.html} (100%)
rename layouts/{index.rss.xml => rss.xml} (100%)
diff --git a/demo/hugo.toml b/demo/hugo.toml
index 03e4d21d..a38746df 100644
--- a/demo/hugo.toml
+++ b/demo/hugo.toml
@@ -35,3 +35,5 @@ baseURL = "http://example.org/"
# FixIt theme version
version = "0.3.X" # e.g. "0.2.X", "0.2.15", "v0.2.15" etc.
# ...
+ [params.search]
+ enable = true
diff --git a/layouts/index.baidu_urls.txt b/layouts/_default/index.baidu_urls.txt
similarity index 100%
rename from layouts/index.baidu_urls.txt
rename to layouts/_default/index.baidu_urls.txt
diff --git a/layouts/index.feed.json b/layouts/_default/index.feed.json
similarity index 100%
rename from layouts/index.feed.json
rename to layouts/_default/index.feed.json
diff --git a/layouts/index.html b/layouts/_default/index.html
similarity index 100%
rename from layouts/index.html
rename to layouts/_default/index.html
diff --git a/layouts/index.readme.md b/layouts/_default/index.readme.md
similarity index 100%
rename from layouts/index.readme.md
rename to layouts/_default/index.readme.md
diff --git a/layouts/index.search.json b/layouts/_default/index.search.json
similarity index 100%
rename from layouts/index.search.json
rename to layouts/_default/index.search.json
diff --git a/layouts/index.archives.html b/layouts/home.archives.html
similarity index 100%
rename from layouts/index.archives.html
rename to layouts/home.archives.html
diff --git a/layouts/index.offline.html b/layouts/home.offline.html
similarity index 100%
rename from layouts/index.offline.html
rename to layouts/home.offline.html
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index fff5310b..a611c8d0 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-66e628d4" -}}
+{{- .Scratch.Set "version" "v0.3.10-288e10e8" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
diff --git a/layouts/index.rss.xml b/layouts/rss.xml
similarity index 100%
rename from layouts/index.rss.xml
rename to layouts/rss.xml
From dcd9d8148244db9646559e9547320caa86d4fa07 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Tue, 13 Aug 2024 10:35:26 +0800
Subject: [PATCH 03/22] :pencil: Style(ignore): fix typo
---
layouts/_default/index.feed.json | 2 +-
layouts/partials/init/index.html | 2 +-
layouts/rss.xml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/layouts/_default/index.feed.json b/layouts/_default/index.feed.json
index 1720d6f5..c440fef5 100644
--- a/layouts/_default/index.feed.json
+++ b/layouts/_default/index.feed.json
@@ -6,7 +6,7 @@
"title" : "{{- .Site.Title -}}",
"description": "{{- .Site.Params.description | default .Site.Title -}}",
"home_page_url" : "{{ .Site.BaseURL }}",
- {{ with .OutputFormats.Get "JSONFeed" -}}
+ {{ with .OutputFormats.Get "feed" -}}
"feed_url" : "{{ .Permalink }}",
{{ end -}}
"icon" : "{{ `/apple-touch-icon.png` | absURL }}",
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index a611c8d0..963390c1 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-288e10e8" -}}
+{{- .Scratch.Set "version" "v0.3.10-049f6bb1" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
diff --git a/layouts/rss.xml b/layouts/rss.xml
index dd7087f4..463b27cb 100644
--- a/layouts/rss.xml
+++ b/layouts/rss.xml
@@ -33,7 +33,7 @@
{{- .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" -}}
{{- end -}}
- {{ with .OutputFormats.Get "RSS" }}
+ {{ with .OutputFormats.Get "rss" }}
{{ printf " " .Permalink .MediaType | safeHTML }}
{{ end }}
{{- range .Scratch.Get "mainSectionPages" | first (.Site.Params.home.rss | default 10) -}}
From f9288d6cdd05dbdd9c27485f2c4686e332ea1be0 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Tue, 13 Aug 2024 12:17:16 +0800
Subject: [PATCH 04/22] :truck: Chore: migrate index templates to default home
templates
---
layouts/{ => _default}/home.archives.html | 0
...dex.baidu_urls.txt => home.baidu_urls.txt} | 0
.../{index.feed.json => home.feed.json} | 0
layouts/_default/{index.html => home.html} | 0
layouts/{ => _default}/home.offline.html | 0
.../{index.readme.md => home.readme.md} | 0
layouts/_default/home.search.json | 46 +++++++++++++++++++
layouts/_default/index.search.json | 46 -------------------
layouts/partials/init/index.html | 2 +-
9 files changed, 47 insertions(+), 47 deletions(-)
rename layouts/{ => _default}/home.archives.html (100%)
rename layouts/_default/{index.baidu_urls.txt => home.baidu_urls.txt} (100%)
rename layouts/_default/{index.feed.json => home.feed.json} (100%)
rename layouts/_default/{index.html => home.html} (100%)
rename layouts/{ => _default}/home.offline.html (100%)
rename layouts/_default/{index.readme.md => home.readme.md} (100%)
create mode 100644 layouts/_default/home.search.json
delete mode 100644 layouts/_default/index.search.json
diff --git a/layouts/home.archives.html b/layouts/_default/home.archives.html
similarity index 100%
rename from layouts/home.archives.html
rename to layouts/_default/home.archives.html
diff --git a/layouts/_default/index.baidu_urls.txt b/layouts/_default/home.baidu_urls.txt
similarity index 100%
rename from layouts/_default/index.baidu_urls.txt
rename to layouts/_default/home.baidu_urls.txt
diff --git a/layouts/_default/index.feed.json b/layouts/_default/home.feed.json
similarity index 100%
rename from layouts/_default/index.feed.json
rename to layouts/_default/home.feed.json
diff --git a/layouts/_default/index.html b/layouts/_default/home.html
similarity index 100%
rename from layouts/_default/index.html
rename to layouts/_default/home.html
diff --git a/layouts/home.offline.html b/layouts/_default/home.offline.html
similarity index 100%
rename from layouts/home.offline.html
rename to layouts/_default/home.offline.html
diff --git a/layouts/_default/index.readme.md b/layouts/_default/home.readme.md
similarity index 100%
rename from layouts/_default/index.readme.md
rename to layouts/_default/home.readme.md
diff --git a/layouts/_default/home.search.json b/layouts/_default/home.search.json
new file mode 100644
index 00000000..29336eff
--- /dev/null
+++ b/layouts/_default/home.search.json
@@ -0,0 +1,46 @@
+{{- if .Site.Params.search.enable -}}
+ {{- $index := slice -}}
+ {{- $pages := where .Site.RegularPages "Params.password" "eq" nil -}}
+ {{- if .Site.Params.page.hiddenFromSearch -}}
+ {{- $pages = where $pages "Params.hiddenfromsearch" false -}}
+ {{- else -}}
+ {{- $pages = where $pages "Params.hiddenfromsearch" "!=" true -}}
+ {{- end -}}
+ {{- range $pages -}}
+ {{- $uri := .RelPermalink -}}
+ {{- if $.Site.Params.search.absoluteURL -}}
+ {{- $uri = .Permalink -}}
+ {{- end -}}
+ {{- $meta := dict "uri" $uri "title" .Title "tags" .Params.tags "categories" .Params.categories -}}
+ {{- $meta = $.Site.Params.dateFormat | default "2006-01-02" | .PublishDate.Format | dict "date" | merge $meta -}}
+ {{- with .Description -}}
+ {{- $index = $index | append (dict "content" . "objectID" $uri | merge $meta) -}}
+ {{- end -}}
+ {{- $params := .Params | merge $.Site.Params.page -}}
+ {{/* Extended Markdown syntax */}}
+ {{- $content := dict "Content" .Content "Ruby" $params.ruby "Fraction" $params.fraction "Fontawesome" $params.fontawesome | partial "function/content.html" -}}
+ {{/* Remove line number for code */}}
+ {{- $content = $content | replaceRE ` *\d*\n? ` "" -}}
+ {{- range $i, $contenti := split $content "
*\d*\n?` "" -}}
- {{- range $i, $contenti := split $content "
Date: Tue, 13 Aug 2024 14:35:37 +0800
Subject: [PATCH 05/22] :truck: Chore: migrate section templates to
layouts/section folder
---
hugo.toml | 12 +++---
layouts/_default/home.feed.json | 4 +-
layouts/partials/init/index.html | 2 +-
layouts/{posts => section}/rss.xml | 0
layouts/section/section.feed.json | 46 ++++++++++++++++++++++
layouts/{_default => section}/section.html | 0
6 files changed, 55 insertions(+), 9 deletions(-)
rename layouts/{posts => section}/rss.xml (100%)
create mode 100644 layouts/section/section.feed.json
rename layouts/{_default => section}/section.html (100%)
diff --git a/hugo.toml b/hugo.toml
index 135083f4..c8ce3ddc 100644
--- a/hugo.toml
+++ b/hugo.toml
@@ -299,15 +299,15 @@ enableEmoji = true
# Options to make hugo output files, the optional values are below:
# home: html, rss, json, feed, archives, offline, readme, baidu_urls, search etc.
# page: html, markdown
-# section: html, rss
-# taxonomy: html, rss
-# term: html, rss
+# section: html, rss, feed
+# taxonomy: html, rss, feed
+# term: html, rss, feed
[outputs]
home = ["html", "rss", "feed", "archives", "offline", "readme", "baidu_urls", "search"]
page = ["html", "markdown"]
- section = ["html", "rss"]
- taxonomy = ["html", "rss"]
- term = ["html", "rss"]
+ section = ["html", "rss", "feed"]
+ taxonomy = ["html", "rss", "feed"]
+ term = ["html", "rss", "feed"]
# -------------------------------------------------------------------------------------
# Taxonomies Configuration
diff --git a/layouts/_default/home.feed.json b/layouts/_default/home.feed.json
index c440fef5..13144cd9 100644
--- a/layouts/_default/home.feed.json
+++ b/layouts/_default/home.feed.json
@@ -24,9 +24,9 @@
"title" : {{ .Title | jsonify }},
"date_published" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
{{ if .Lastmod -}}
- "date_modified" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
- {{ else -}}
"date_modified" : "{{ .LastMod.Format "2006-01-02T15:04:05Z07:00" }}",
+ {{ else -}}
+ "date_modified" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
{{ end -}}
"id" : "{{ .Permalink }}",
"url" : "{{ .Permalink }}",
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index eca413ff..8ac951e0 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-dcd9d814" -}}
+{{- .Scratch.Set "version" "v0.3.10-f9288d6c" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
diff --git a/layouts/posts/rss.xml b/layouts/section/rss.xml
similarity index 100%
rename from layouts/posts/rss.xml
rename to layouts/section/rss.xml
diff --git a/layouts/section/section.feed.json b/layouts/section/section.feed.json
new file mode 100644
index 00000000..13144cd9
--- /dev/null
+++ b/layouts/section/section.feed.json
@@ -0,0 +1,46 @@
+{{ $list := .Pages -}}
+{{ $length := (len $list) -}}
+
+{
+ "version" : "https://jsonfeed.org/version/1.1",
+ "title" : "{{- .Site.Title -}}",
+ "description": "{{- .Site.Params.description | default .Site.Title -}}",
+ "home_page_url" : "{{ .Site.BaseURL }}",
+ {{ with .OutputFormats.Get "feed" -}}
+ "feed_url" : "{{ .Permalink }}",
+ {{ end -}}
+ "icon" : "{{ `/apple-touch-icon.png` | absURL }}",
+ "favicon" : "{{ `/favicon.ico` | absURL }}",
+ {{ with .Site.Params.author.name -}}
+ "author" : {
+ "name" : "{{ . }}"{{ with $.Site.Params.author.link }},
+ "url": "{{ . }}"{{ end }}{{ with $.Site.Params.author.avatar }},
+ "avatar": "{{ . | absURL }}"{{ end }}
+ },
+ {{ end -}}
+ "items" : [
+ {{ range $index, $element := .Scratch.Get "mainSectionPages" -}}
+ {
+ "title" : {{ .Title | jsonify }},
+ "date_published" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
+ {{ if .Lastmod -}}
+ "date_modified" : "{{ .LastMod.Format "2006-01-02T15:04:05Z07:00" }}",
+ {{ else -}}
+ "date_modified" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
+ {{ end -}}
+ "id" : "{{ .Permalink }}",
+ "url" : "{{ .Permalink }}",
+ {{ with .Summary -}}
+ "summary": {{ . | plainify | jsonify }},
+ {{ end -}}
+ {{ with (.Param "author").name -}}
+ "author" : {
+ "name" : "{{ . }}"
+ },
+ {{ end -}}
+ "content_html" : {{ .Content | jsonify }},
+ "language": {{ .Language.Lang | default $.Lang | jsonify }}
+ }{{ if ne (add $index 1) $length }},{{ end }}
+ {{ end -}}
+ ]
+}
diff --git a/layouts/_default/section.html b/layouts/section/section.html
similarity index 100%
rename from layouts/_default/section.html
rename to layouts/section/section.html
From 008af168241b33c71dbc16375d741d2a48e9fcc3 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Tue, 13 Aug 2024 14:41:13 +0800
Subject: [PATCH 06/22] :sparkles: Feat: add JSON feed support for section
pages (#475)
---
layouts/_default/home.feed.json | 6 +-----
layouts/partials/init/index.html | 2 +-
layouts/section/section.feed.json | 6 +-----
3 files changed, 3 insertions(+), 11 deletions(-)
diff --git a/layouts/_default/home.feed.json b/layouts/_default/home.feed.json
index 13144cd9..6a177d25 100644
--- a/layouts/_default/home.feed.json
+++ b/layouts/_default/home.feed.json
@@ -23,11 +23,7 @@
{
"title" : {{ .Title | jsonify }},
"date_published" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
- {{ if .Lastmod -}}
- "date_modified" : "{{ .LastMod.Format "2006-01-02T15:04:05Z07:00" }}",
- {{ else -}}
- "date_modified" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
- {{ end -}}
+ "date_modified" : "{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}",
"id" : "{{ .Permalink }}",
"url" : "{{ .Permalink }}",
{{ with .Summary -}}
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index 8ac951e0..92740909 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-f9288d6c" -}}
+{{- .Scratch.Set "version" "v0.3.10-65de5cad" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
diff --git a/layouts/section/section.feed.json b/layouts/section/section.feed.json
index 13144cd9..6a177d25 100644
--- a/layouts/section/section.feed.json
+++ b/layouts/section/section.feed.json
@@ -23,11 +23,7 @@
{
"title" : {{ .Title | jsonify }},
"date_published" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
- {{ if .Lastmod -}}
- "date_modified" : "{{ .LastMod.Format "2006-01-02T15:04:05Z07:00" }}",
- {{ else -}}
- "date_modified" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
- {{ end -}}
+ "date_modified" : "{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}",
"id" : "{{ .Permalink }}",
"url" : "{{ .Permalink }}",
{{ with .Summary -}}
From 874913ce127a7b53c5cafe9eb43aaf709c7b8ca1 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Tue, 13 Aug 2024 16:37:51 +0800
Subject: [PATCH 07/22] :construction: Feat: add common template for JSON feed
(#475)
---
hugo.toml | 13 ++++--
layouts/_default/home.feed.json | 43 +------------------
layouts/partials/feed/json-feed.html | 64 ++++++++++++++++++++++++++++
layouts/partials/head/link.html | 2 +-
layouts/partials/init/index.html | 2 +-
layouts/section/section.feed.json | 41 +-----------------
layouts/taxonomy/list.feed.json | 3 ++
7 files changed, 81 insertions(+), 87 deletions(-)
create mode 100644 layouts/partials/feed/json-feed.html
create mode 100644 layouts/taxonomy/list.feed.json
diff --git a/hugo.toml b/hugo.toml
index c8ce3ddc..b63fc610 100644
--- a/hugo.toml
+++ b/hugo.toml
@@ -297,16 +297,16 @@ enableEmoji = true
# -------------------------------------------------------------------------------------
# Options to make hugo output files, the optional values are below:
-# home: html, rss, json, feed, archives, offline, readme, baidu_urls, search etc.
+# home: html, rss, feed, archives, offline, readme, baidu_urls, search etc.
# page: html, markdown
# section: html, rss, feed
-# taxonomy: html, rss, feed
+# taxonomy: html
# term: html, rss, feed
[outputs]
home = ["html", "rss", "feed", "archives", "offline", "readme", "baidu_urls", "search"]
page = ["html", "markdown"]
section = ["html", "rss", "feed"]
- taxonomy = ["html", "rss", "feed"]
+ taxonomy = ["html"]
term = ["html", "rss", "feed"]
# -------------------------------------------------------------------------------------
@@ -820,6 +820,13 @@ enableEmoji = true
# ["barber-shop", "big-counter", "bounce", "center-atom", "center-circle", "center-radar", "center-simple",
# "corner-indicator", "fill-left", "flash", "flat-top", "loading-bar", "mac-osx", "material", "minimal"]
theme = "minimal"
+
+ # FixIt 0.3.10 | NEW Feed config for RSS, Atom and JSON feed.
+ [params.feed]
+ # The number of posts to include in the feed. Default is -1, which means all posts.
+ limit = 10
+ # whether to show the full text content in feed.
+ fullText = false
# FixIt 0.2.15 | NEW Developer options
# Select the scope named `public_repo` to generate personal access token,
diff --git a/layouts/_default/home.feed.json b/layouts/_default/home.feed.json
index 6a177d25..8e6d15b7 100644
--- a/layouts/_default/home.feed.json
+++ b/layouts/_default/home.feed.json
@@ -1,42 +1 @@
-{{ $list := .Pages -}}
-{{ $length := (len $list) -}}
-
-{
- "version" : "https://jsonfeed.org/version/1.1",
- "title" : "{{- .Site.Title -}}",
- "description": "{{- .Site.Params.description | default .Site.Title -}}",
- "home_page_url" : "{{ .Site.BaseURL }}",
- {{ with .OutputFormats.Get "feed" -}}
- "feed_url" : "{{ .Permalink }}",
- {{ end -}}
- "icon" : "{{ `/apple-touch-icon.png` | absURL }}",
- "favicon" : "{{ `/favicon.ico` | absURL }}",
- {{ with .Site.Params.author.name -}}
- "author" : {
- "name" : "{{ . }}"{{ with $.Site.Params.author.link }},
- "url": "{{ . }}"{{ end }}{{ with $.Site.Params.author.avatar }},
- "avatar": "{{ . | absURL }}"{{ end }}
- },
- {{ end -}}
- "items" : [
- {{ range $index, $element := .Scratch.Get "mainSectionPages" -}}
- {
- "title" : {{ .Title | jsonify }},
- "date_published" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
- "date_modified" : "{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}",
- "id" : "{{ .Permalink }}",
- "url" : "{{ .Permalink }}",
- {{ with .Summary -}}
- "summary": {{ . | plainify | jsonify }},
- {{ end -}}
- {{ with (.Param "author").name -}}
- "author" : {
- "name" : "{{ . }}"
- },
- {{ end -}}
- "content_html" : {{ .Content | jsonify }},
- "language": {{ .Language.Lang | default $.Lang | jsonify }}
- }{{ if ne (add $index 1) $length }},{{ end }}
- {{ end -}}
- ]
-}
+{{- partial "feed/json-feed.html" . -}}
diff --git a/layouts/partials/feed/json-feed.html b/layouts/partials/feed/json-feed.html
new file mode 100644
index 00000000..09623e38
--- /dev/null
+++ b/layouts/partials/feed/json-feed.html
@@ -0,0 +1,64 @@
+{{- $pages := .Scratch.Get "mainSectionPages" -}}
+{{- $limit := .Site.Params.feed.limit -}}
+{{- if ge $limit 1 -}}
+ {{- $pages = $pages | first $limit }}
+{{- end -}}
+{{- $length := $pages.Len -}}
+{{- $fullText := (.Param "feed").fullText -}}
+{{- $title := title (.Params.Title | default ((T .Section) | default .Section | dict "Some" | T "allSome")) -}}
+{{- if .Site.Params.withSiteTitle -}}
+ {{- $title = printf "%s %s %s" $title .Site.Params.titleDelimiter .Site.Title -}}
+{{- end -}}
+{{- if .IsHome -}}
+ {{- $title = .Site.Title -}}
+{{- end -}}
+
+{
+ "version": "https://jsonfeed.org/version/1.1",
+ "title": "{{- $title -}}",
+ "description": "{{- .Site.Params.description | default .Site.Title -}}",
+ "home_page_url": "{{ .Site.BaseURL }}",
+ {{ with .OutputFormats.Get "feed" -}}
+ "feed_url": "{{ .Permalink }}",
+ {{ end -}}
+ {{ with .Site.LanguageCode -}}
+ "language": "{{ . }}",
+ {{ end -}}
+ "icon": "{{ `/apple-touch-icon.png` | absURL }}",
+ "favicon": "{{ `/favicon.ico` | absURL }}",
+ {{ with .Site.Params.author.name -}}
+ "author": {
+ "name": "{{ . }}"{{ with $.Site.Params.author.link }},
+ "url": "{{ . }}"{{ end }}{{ with $.Site.Params.author.avatar }},
+ "avatar": "{{ . | absURL }}"{{ end }}
+ },
+ {{ end -}}
+ "items": [
+ {{ range $index, $element := $pages -}}
+ {
+ "title": {{ .Title | jsonify }},
+ "date_published": "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
+ "date_modified": "{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}",
+ "id": "{{ .Permalink }}",
+ "url": "{{ .Permalink }}",
+ {{ with .Params.author.name -}}
+ "author": {
+ "name": "{{ . }}"{{ with $.Params.author.link }},
+ "url": "{{ . }}"{{ end }}{{ with $.Params.author.avatar }},
+ "avatar": "{{ . | absURL }}"{{ end }}
+ },
+ {{ end -}}
+ {{ with .Summary -}}
+ "summary": {{ . | plainify | jsonify }},
+ {{ if not $fullText -}}
+ "content_html": {{ . | plainify | jsonify }}
+ {{- end }}
+ {{- end -}}
+ {{- if $fullText -}}
+ "content_html": {{ .Content | jsonify }}
+ {{- end }}
+ }{{ if ne (add $index 1) $pages.Len }},
+ {{ end }}
+ {{- end }}
+ ]
+}
diff --git a/layouts/partials/head/link.html b/layouts/partials/head/link.html
index 701557f9..9f9677b1 100644
--- a/layouts/partials/head/link.html
+++ b/layouts/partials/head/link.html
@@ -1,6 +1,6 @@
{{- $cdn := .Scratch.Get "cdn" | default dict -}}
{{- $fingerprint := .Scratch.Get "fingerprint" -}}
-{{- $title := printf "%s | %s" .Title site.Title -}}
+{{- $title := printf "%s %s %s" .Title .Site.Params.titleDelimiter .Site.Title -}}
{{- if .IsHome -}}
{{- $title = site.Title -}}
{{- end -}}
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index 92740909..a9af1b43 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-65de5cad" -}}
+{{- .Scratch.Set "version" "v0.3.10-138c7ad1" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
diff --git a/layouts/section/section.feed.json b/layouts/section/section.feed.json
index 6a177d25..ba23ee71 100644
--- a/layouts/section/section.feed.json
+++ b/layouts/section/section.feed.json
@@ -1,42 +1,3 @@
-{{ $list := .Pages -}}
-{{ $length := (len $list) -}}
-
{
- "version" : "https://jsonfeed.org/version/1.1",
- "title" : "{{- .Site.Title -}}",
- "description": "{{- .Site.Params.description | default .Site.Title -}}",
- "home_page_url" : "{{ .Site.BaseURL }}",
- {{ with .OutputFormats.Get "feed" -}}
- "feed_url" : "{{ .Permalink }}",
- {{ end -}}
- "icon" : "{{ `/apple-touch-icon.png` | absURL }}",
- "favicon" : "{{ `/favicon.ico` | absURL }}",
- {{ with .Site.Params.author.name -}}
- "author" : {
- "name" : "{{ . }}"{{ with $.Site.Params.author.link }},
- "url": "{{ . }}"{{ end }}{{ with $.Site.Params.author.avatar }},
- "avatar": "{{ . | absURL }}"{{ end }}
- },
- {{ end -}}
- "items" : [
- {{ range $index, $element := .Scratch.Get "mainSectionPages" -}}
- {
- "title" : {{ .Title | jsonify }},
- "date_published" : "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
- "date_modified" : "{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}",
- "id" : "{{ .Permalink }}",
- "url" : "{{ .Permalink }}",
- {{ with .Summary -}}
- "summary": {{ . | plainify | jsonify }},
- {{ end -}}
- {{ with (.Param "author").name -}}
- "author" : {
- "name" : "{{ . }}"
- },
- {{ end -}}
- "content_html" : {{ .Content | jsonify }},
- "language": {{ .Language.Lang | default $.Lang | jsonify }}
- }{{ if ne (add $index 1) $length }},{{ end }}
- {{ end -}}
- ]
+ "test": "TODO for section list"
}
diff --git a/layouts/taxonomy/list.feed.json b/layouts/taxonomy/list.feed.json
new file mode 100644
index 00000000..d9431896
--- /dev/null
+++ b/layouts/taxonomy/list.feed.json
@@ -0,0 +1,3 @@
+{
+ "test": "TODO for term list"
+}
From 4b8b6856495ec865c6fb24a2e61abc5e2fe37cfd Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Tue, 13 Aug 2024 18:01:22 +0800
Subject: [PATCH 08/22] :construction: Feat: add JSON feed support for section
and term list pages
---
layouts/_default/home.feed.json | 4 +++-
layouts/partials/feed/json-feed.html | 16 +++++-----------
layouts/partials/init/index.html | 2 +-
layouts/section/section.feed.json | 10 +++++++---
layouts/taxonomy/list.feed.json | 10 +++++++---
5 files changed, 23 insertions(+), 19 deletions(-)
diff --git a/layouts/_default/home.feed.json b/layouts/_default/home.feed.json
index 8e6d15b7..75582f57 100644
--- a/layouts/_default/home.feed.json
+++ b/layouts/_default/home.feed.json
@@ -1 +1,3 @@
-{{- partial "feed/json-feed.html" . -}}
+{{- $options := dict "Page" . "Site" .Site "OutputFormats" .OutputFormats -}}
+{{- $options = dict "Title" .Site.Title "Pages" (.Scratch.Get "mainSectionPages") | merge $options -}}
+{{- partial "feed/json-feed.html" $options -}}
diff --git a/layouts/partials/feed/json-feed.html b/layouts/partials/feed/json-feed.html
index 09623e38..a4ae90fd 100644
--- a/layouts/partials/feed/json-feed.html
+++ b/layouts/partials/feed/json-feed.html
@@ -1,21 +1,14 @@
-{{- $pages := .Scratch.Get "mainSectionPages" -}}
+{{- $pages := .Pages -}}
{{- $limit := .Site.Params.feed.limit -}}
{{- if ge $limit 1 -}}
- {{- $pages = $pages | first $limit }}
+ {{- $pages = $pages | first $limit -}}
{{- end -}}
{{- $length := $pages.Len -}}
-{{- $fullText := (.Param "feed").fullText -}}
-{{- $title := title (.Params.Title | default ((T .Section) | default .Section | dict "Some" | T "allSome")) -}}
-{{- if .Site.Params.withSiteTitle -}}
- {{- $title = printf "%s %s %s" $title .Site.Params.titleDelimiter .Site.Title -}}
-{{- end -}}
-{{- if .IsHome -}}
- {{- $title = .Site.Title -}}
-{{- end -}}
+{{- /* TODO 加密的不显示,加入 hiddenFromFeed */ -}}
{
"version": "https://jsonfeed.org/version/1.1",
- "title": "{{- $title -}}",
+ "title": "{{- .Title -}}",
"description": "{{- .Site.Params.description | default .Site.Title -}}",
"home_page_url": "{{ .Site.BaseURL }}",
{{ with .OutputFormats.Get "feed" -}}
@@ -35,6 +28,7 @@
{{ end -}}
"items": [
{{ range $index, $element := $pages -}}
+ {{- $fullText := (.Param "feed").fullText -}}
{
"title": {{ .Title | jsonify }},
"date_published": "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index a9af1b43..688b63f5 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-138c7ad1" -}}
+{{- .Scratch.Set "version" "v0.3.10-874913ce" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
diff --git a/layouts/section/section.feed.json b/layouts/section/section.feed.json
index ba23ee71..cd70d6c9 100644
--- a/layouts/section/section.feed.json
+++ b/layouts/section/section.feed.json
@@ -1,3 +1,7 @@
-{
- "test": "TODO for section list"
-}
+{{- $title := title (.Params.Title | default ((T .Section) | default .Section | dict "Some" | T "allSome")) -}}
+{{- if .Site.Params.withSiteTitle -}}
+ {{- $title = printf "%s %s %s" $title .Site.Params.titleDelimiter .Site.Title -}}
+{{- end -}}
+{{- $options := dict "Page" . "Site" .Site "OutputFormats" .OutputFormats -}}
+{{- $options = dict "Title" $title "Pages" .Pages | merge $options -}}
+{{- partial "feed/json-feed.html" $options -}}
diff --git a/layouts/taxonomy/list.feed.json b/layouts/taxonomy/list.feed.json
index d9431896..c3f44242 100644
--- a/layouts/taxonomy/list.feed.json
+++ b/layouts/taxonomy/list.feed.json
@@ -1,3 +1,7 @@
-{
- "test": "TODO for term list"
-}
+{{- $title := printf "%s %s" .Title (T .Data.Singular | default .Data.Singular) -}}
+{{- if .Site.Params.withSiteTitle -}}
+ {{- $title = printf "%s %s %s" $title .Site.Params.titleDelimiter .Site.Title -}}
+{{- end -}}
+{{- $options := dict "Page" . "Site" .Site "OutputFormats" .OutputFormats -}}
+{{- $options = dict "Title" $title "Pages" .Pages | merge $options -}}
+{{- partial "feed/json-feed.html" $options -}}
From cd574fa2537f95b614ab0ffde0ba79dc79e53530 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Tue, 13 Aug 2024 20:35:14 +0800
Subject: [PATCH 09/22] :rocket: Chore: fix git stage error in update-version
script
---
build/update-version.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/build/update-version.js b/build/update-version.js
index b18a2114..378f3242 100644
--- a/build/update-version.js
+++ b/build/update-version.js
@@ -39,8 +39,8 @@ const latestVersion = stage === 'version' ? version : devVersion;
const lastVersion = initHtml.match(/v\d+\.\d+\.\d+(-\w+)?/)[0];
const newInitHtml = initHtml.replace(/v\d+\.\d+\.\d+(-\w+)?/, `v${latestVersion}`);
fs.writeFileSync(initHtmlPath, newInitHtml);
-// Add the updated file to the git stage
-execSync('git add .');
+// Add the updated files to the git stage
+execSync('git add layouts/partials/init/index.html package.json package-lock.json');
console.log(`Update the FixIt version from ${lastVersion} to v${latestVersion}.`);
export default latestVersion;
From cbdfa1b08606b9d0ffd48f9e93b366afffaeb626 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Tue, 13 Aug 2024 20:37:07 +0800
Subject: [PATCH 10/22] :zap: Perf: add front matter hiddenFromFeed for JSON
feed (#475)
---
hugo.toml | 2 +-
layouts/partials/feed/json-feed.html | 5 ++++-
layouts/partials/init/index.html | 2 +-
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/hugo.toml b/hugo.toml
index b63fc610..c8baf772 100644
--- a/hugo.toml
+++ b/hugo.toml
@@ -824,7 +824,7 @@ enableEmoji = true
# FixIt 0.3.10 | NEW Feed config for RSS, Atom and JSON feed.
[params.feed]
# The number of posts to include in the feed. Default is -1, which means all posts.
- limit = 10
+ limit = -1
# whether to show the full text content in feed.
fullText = false
diff --git a/layouts/partials/feed/json-feed.html b/layouts/partials/feed/json-feed.html
index a4ae90fd..d9745ef0 100644
--- a/layouts/partials/feed/json-feed.html
+++ b/layouts/partials/feed/json-feed.html
@@ -1,10 +1,13 @@
{{- $pages := .Pages -}}
+{{- /* Front matter: password */ -}}
+{{- $pages = where $pages "Params.password" "eq" nil -}}
+{{- /* Front matter: hiddenFromFeed */ -}}
+{{- $pages = where $pages "Params.hiddenFromFeed" "ne" true -}}
{{- $limit := .Site.Params.feed.limit -}}
{{- if ge $limit 1 -}}
{{- $pages = $pages | first $limit -}}
{{- end -}}
{{- $length := $pages.Len -}}
-{{- /* TODO 加密的不显示,加入 hiddenFromFeed */ -}}
{
"version": "https://jsonfeed.org/version/1.1",
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index 688b63f5..bc4167cf 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-874913ce" -}}
+{{- .Scratch.Set "version" "v0.3.10-cd574fa2" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
From eb8d0276a72aaec00ff11671d388c57b643d2cec Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Tue, 13 Aug 2024 20:41:49 +0800
Subject: [PATCH 11/22] :mag: Feat: add tags attribute for JSON feed (#475)
---
layouts/partials/feed/json-feed.html | 3 +++
layouts/partials/init/index.html | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/layouts/partials/feed/json-feed.html b/layouts/partials/feed/json-feed.html
index d9745ef0..e1abf399 100644
--- a/layouts/partials/feed/json-feed.html
+++ b/layouts/partials/feed/json-feed.html
@@ -45,6 +45,9 @@
"avatar": "{{ . | absURL }}"{{ end }}
},
{{ end -}}
+ {{ with .Params.tags -}}
+ "tags": {{ . | jsonify }},
+ {{ end -}}
{{ with .Summary -}}
"summary": {{ . | plainify | jsonify }},
{{ if not $fullText -}}
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index bc4167cf..0b92e8be 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-cd574fa2" -}}
+{{- .Scratch.Set "version" "v0.3.10-cbdfa1b0" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
From 2c123a3d602de9ed783c7c60f9f4964bd0b8c251 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Tue, 13 Aug 2024 22:01:50 +0800
Subject: [PATCH 12/22] :recycle: Refactor: refactor RSS feed templates
Close #488
---
layouts/_default/home.feed.json | 2 +-
layouts/{_default => page}/single.md | 0
layouts/partials/feed/json-feed.html | 6 +--
layouts/partials/feed/rss.html | 51 ++++++++++++++++++++++
layouts/partials/init/index.html | 2 +-
layouts/rss.xml | 50 ++--------------------
layouts/section/rss.xml | 64 ++++------------------------
layouts/section/section.feed.json | 2 +-
layouts/taxonomy/list.feed.json | 2 +-
layouts/taxonomy/rss.xml | 50 ++++------------------
10 files changed, 78 insertions(+), 151 deletions(-)
rename layouts/{_default => page}/single.md (100%)
create mode 100644 layouts/partials/feed/rss.html
diff --git a/layouts/_default/home.feed.json b/layouts/_default/home.feed.json
index 75582f57..45fbb691 100644
--- a/layouts/_default/home.feed.json
+++ b/layouts/_default/home.feed.json
@@ -1,3 +1,3 @@
-{{- $options := dict "Page" . "Site" .Site "OutputFormats" .OutputFormats -}}
+{{- $options := dict "Site" .Site "OutputFormats" .OutputFormats -}}
{{- $options = dict "Title" .Site.Title "Pages" (.Scratch.Get "mainSectionPages") | merge $options -}}
{{- partial "feed/json-feed.html" $options -}}
diff --git a/layouts/_default/single.md b/layouts/page/single.md
similarity index 100%
rename from layouts/_default/single.md
rename to layouts/page/single.md
diff --git a/layouts/partials/feed/json-feed.html b/layouts/partials/feed/json-feed.html
index e1abf399..5f125db1 100644
--- a/layouts/partials/feed/json-feed.html
+++ b/layouts/partials/feed/json-feed.html
@@ -11,13 +11,13 @@
{
"version": "https://jsonfeed.org/version/1.1",
- "title": "{{- .Title -}}",
- "description": "{{- .Site.Params.description | default .Site.Title -}}",
+ "title": "{{ .Title }}",
+ "description": "{{ .Site.Params.description | default .Site.Title }}",
"home_page_url": "{{ .Site.BaseURL }}",
{{ with .OutputFormats.Get "feed" -}}
"feed_url": "{{ .Permalink }}",
{{ end -}}
- {{ with .Site.LanguageCode -}}
+ {{ with .Site.Language.LanguageCode -}}
"language": "{{ . }}",
{{ end -}}
"icon": "{{ `/apple-touch-icon.png` | absURL }}",
diff --git a/layouts/partials/feed/rss.html b/layouts/partials/feed/rss.html
new file mode 100644
index 00000000..e1d6c3bf
--- /dev/null
+++ b/layouts/partials/feed/rss.html
@@ -0,0 +1,51 @@
+{{- $pages := .Pages -}}
+{{- /* Front matter: password */ -}}
+{{- $pages = where $pages "Params.password" "eq" nil -}}
+{{- /* Front matter: hiddenFromFeed */ -}}
+{{- $pages = where $pages "Params.hiddenFromFeed" "ne" true -}}
+{{- $limit := .Site.Params.feed.limit -}}
+{{- if ge $limit 1 -}}
+ {{- $pages = $pages | first $limit -}}
+{{- end -}}
+{{- $length := $pages.Len -}}
+{{- /* TODO 封面图、文章内图片链接、分类、标签等处理 */ -}}
+
+{{- printf "" | safeHTML }}
+
+
+ {{ .Title }}
+ {{ .Permalink }}
+ {{ .Site.Params.description | default .Site.Title }}
+ Hugo {{ hugo.Version }} & FixIt {{ .Version }}
+ {{ .Site.Language.LanguageCode }} {{ with .Site.Params.author.email }}
+ {{.}}{{ with $.Site.Params.author.name }} ({{ . }}){{ end }} {{ end }}{{ with .Site.Params.author.email }}
+ {{ . }}{{ with $.Site.Params.author.name }} ({{ . }}){{ end }} {{ end }}{{ with .Site.Copyright }}
+ {{ . }} {{ end }}{{ if not .Date.IsZero }}
+ {{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} {{ end }}
+ {{- with .OutputFormats.Get "rss" }}
+ {{ printf " " .Permalink .MediaType | safeHTML }}
+ {{- end }}
+ {{- range $pages }}
+ {{- $params := .Params | merge .Site.Params.Page }}
+ {{- $fullText := (.Param "feed").fullText }}
+ -
+
{{ .Title }}
+ {{ .Permalink }}
+ {{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}
+ {{- with .Params.author.email }}{{ . }}{{ with $.Params.author.name }} ({{ . }}){{ end }} {{ end }}
+ {{ .Permalink }}
+ {{- if $fullText }}
+
+ {{- "]*>.*` "" | replaceRE ` ]*( /)?>` "" | safeHTML -}} */ -}}
+ {{- $content | transform.XMLEscape | safeHTML }}
+ {{- "]]>" | safeHTML -}}
+
+ {{- else }}
+ {{ .Summary | transform.XMLEscape | safeHTML }}
+ {{- end }}
+
+ {{- end }}
+
+
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index 0b92e8be..4b61fbe1 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-cbdfa1b0" -}}
+{{- .Scratch.Set "version" "v0.3.10-eb8d0276" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
diff --git a/layouts/rss.xml b/layouts/rss.xml
index 463b27cb..81a2adab 100644
--- a/layouts/rss.xml
+++ b/layouts/rss.xml
@@ -1,46 +1,4 @@
-
-
-
- {{- .Site.Title -}}
-
-
- {{- .Permalink -}}
-
-
- {{- .Site.Params.description | default .Site.Title -}}
-
- Hugo -- gohugo.io
- {{- with .Site.LanguageCode -}}
-
- {{- . -}}
-
- {{- end -}}
- {{- with .Site.Params.author.email -}}
-
- {{- . }}{{ with $.Site.Params.author.name }} ({{ . }}){{ end -}}
-
-
- {{- . }}{{ with $.Site.Params.author.name }} ({{ . }}){{ end -}}
-
- {{- end -}}
- {{- with .Site.Copyright -}}
-
- {{- . -}}
-
- {{- end -}}
- {{- if not .Date.IsZero -}}
-
- {{- .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" -}}
-
- {{- end -}}
- {{ with .OutputFormats.Get "rss" }}
- {{ printf " " .Permalink .MediaType | safeHTML }}
- {{ end }}
- {{- range .Scratch.Get "mainSectionPages" | first (.Site.Params.home.rss | default 10) -}}
- {{- /* TODO 0.4.0 待重构为去掉 `.page` 改用 hugo 推荐的 .Param 方法获取页面参数 */ -}}
- {{- $params := .Params | merge site.Params.page -}}
- {{- if $params.password | or $params.hiddenFromRss }}{{ continue }}{{ end -}}
- {{- dict "Page" . "Site" .Site | partial "rss/item.html" -}}
- {{- end -}}
-
-
+{{- $options := dict "Site" .Site "OutputFormats" .OutputFormats -}}
+{{- $options = dict "Permalink" .Permalink "Version" (.Scratch.Get "version") | merge $options -}}
+{{- $options = dict "Title" .Site.Title "Pages" (.Scratch.Get "mainSectionPages") | merge $options -}}
+{{- partial "feed/rss.html" $options -}}
diff --git a/layouts/section/rss.xml b/layouts/section/rss.xml
index 6cb9c129..726cd5a4 100644
--- a/layouts/section/rss.xml
+++ b/layouts/section/rss.xml
@@ -1,56 +1,8 @@
-
-
-
- {{- title (.Params.Title | default ((T .Section) | default .Section | dict "Some" | T "allSome")) -}}
- {{- if .Site.Params.withSiteTitle }} {{ .Site.Params.titleDelimiter }} {{ .Site.Title }}{{- end -}}
-
-
- {{- .Permalink -}}
-
-
- {{- title (.Params.Title | default ((T .Section) | default .Section | dict "Some" | T "allSome")) }} | {{ .Site.Title -}}
-
- Hugo -- gohugo.io
- {{- with .Site.LanguageCode -}}
-
- {{- . -}}
-
- {{- end -}}
- {{- with .Site.Params.author.email -}}
-
- {{- . }}{{ with $.Site.Params.author.name }} ({{ . }}){{ end -}}
-
-
- {{- . }}{{ with $.Site.Params.author.name }} ({{ . }}){{ end -}}
-
- {{- end -}}
- {{- with .Site.Copyright -}}
-
- {{- . -}}
-
- {{- end -}}
- {{- if not .Date.IsZero -}}
-
- {{- .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" -}}
-
- {{- end -}}
-
- {{- if .Site.Params.section.recentlyUpdated.rss -}}
- {{- $postCount := 0 -}}
- {{- $maxPostCount := .Site.Params.section.recentlyUpdated.maxCount | default 10 -}}
- {{- $days := .Site.Params.section.recentlyUpdated.days | default 30 -}}
- {{- range (where .Data.Pages.ByLastmod.Reverse "Section" "!=" "") -}}
- {{- if gt (add .Lastmod.Unix (mul 86900 $days)) now.Unix -}}
- {{- if lt $postCount $maxPostCount -}}
- {{- if ne .Lastmod.Unix .Date.Unix }}
- {{- dict "Page" . "Site" .Site | partial "rss/item.html" -}}
- {{- end -}}
- {{- end -}}
- {{- end -}}
- {{- end -}}
- {{- end -}}
- {{- range .Pages | first (.Site.Params.section.rss | default 10) -}}
- {{- dict "Page" . "Site" .Site | partial "rss/item.html" -}}
- {{- end -}}
-
-
+{{- $title := title (.Params.Title | default ((T .Section) | default .Section | dict "Some" | T "allSome")) -}}
+{{- if .Site.Params.withSiteTitle -}}
+ {{- $title = printf "%s %s %s" $title .Site.Params.titleDelimiter .Site.Title -}}
+{{- end -}}
+{{- $options := dict "Site" .Site "OutputFormats" .OutputFormats -}}
+{{- $options = dict "Permalink" .Permalink "Version" (.Scratch.Get "version") | merge $options -}}
+{{- $options = dict "Title" $title "Pages" .Pages | merge $options -}}
+{{- partial "feed/rss.html" $options -}}
diff --git a/layouts/section/section.feed.json b/layouts/section/section.feed.json
index cd70d6c9..38be0179 100644
--- a/layouts/section/section.feed.json
+++ b/layouts/section/section.feed.json
@@ -2,6 +2,6 @@
{{- if .Site.Params.withSiteTitle -}}
{{- $title = printf "%s %s %s" $title .Site.Params.titleDelimiter .Site.Title -}}
{{- end -}}
-{{- $options := dict "Page" . "Site" .Site "OutputFormats" .OutputFormats -}}
+{{- $options := dict "Site" .Site "OutputFormats" .OutputFormats -}}
{{- $options = dict "Title" $title "Pages" .Pages | merge $options -}}
{{- partial "feed/json-feed.html" $options -}}
diff --git a/layouts/taxonomy/list.feed.json b/layouts/taxonomy/list.feed.json
index c3f44242..b31f7d16 100644
--- a/layouts/taxonomy/list.feed.json
+++ b/layouts/taxonomy/list.feed.json
@@ -2,6 +2,6 @@
{{- if .Site.Params.withSiteTitle -}}
{{- $title = printf "%s %s %s" $title .Site.Params.titleDelimiter .Site.Title -}}
{{- end -}}
-{{- $options := dict "Page" . "Site" .Site "OutputFormats" .OutputFormats -}}
+{{- $options := dict "Site" .Site "OutputFormats" .OutputFormats -}}
{{- $options = dict "Title" $title "Pages" .Pages | merge $options -}}
{{- partial "feed/json-feed.html" $options -}}
diff --git a/layouts/taxonomy/rss.xml b/layouts/taxonomy/rss.xml
index d3aab8e8..8a2d734c 100644
--- a/layouts/taxonomy/rss.xml
+++ b/layouts/taxonomy/rss.xml
@@ -1,42 +1,8 @@
-
-
-
- {{- .Title }} - {{ T .Data.Singular | default .Data.Singular -}}
- {{- if .Site.Params.withSiteTitle }} {{ .Site.Params.titleDelimiter }} {{ .Site.Title }}{{- end -}}
-
-
- {{- .Permalink -}}
-
-
- {{- .Title }} - {{ T .Data.Singular | default .Data.Singular }} | {{ .Site.Title -}}
-
- Hugo -- gohugo.io
- {{- with .Site.LanguageCode -}}
-
- {{- . -}}
-
- {{- end -}}
- {{- with .Site.Params.author.email -}}
-
- {{- . }}{{ with $.Site.Params.author.name }} ({{ . }}){{ end -}}
-
-
- {{- . }}{{ with $.Site.Params.author.name }} ({{ . }}){{ end -}}
-
- {{- end -}}
- {{- with .Site.Copyright -}}
-
- {{- . -}}
-
- {{- end -}}
- {{- if not .Date.IsZero -}}
-
- {{- .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" -}}
-
- {{- end -}}
-
- {{- range .Pages | first (.Site.Params.list.rss | default 10) -}}
- {{- dict "Page" . "Site" .Site | partial "rss/item.html" -}}
- {{- end -}}
-
-
+{{- $title := printf "%s %s" .Title (T .Data.Singular | default .Data.Singular) -}}
+{{- if .Site.Params.withSiteTitle -}}
+ {{- $title = printf "%s %s %s" $title .Site.Params.titleDelimiter .Site.Title -}}
+{{- end -}}
+{{- $options := dict "Site" .Site "OutputFormats" .OutputFormats -}}
+{{- $options = dict "Permalink" .Permalink "Version" (.Scratch.Get "version") | merge $options -}}
+{{- $options = dict "Title" $title "Pages" .Pages | merge $options -}}
+{{- partial "feed/rss.html" $options -}}
From 1d651b5a4b82ff4f432e250e12a026eacc3ccb80 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Tue, 13 Aug 2024 22:07:27 +0800
Subject: [PATCH 13/22] :construction: WIP: rename json-feed.html to json.html
---
layouts/_default/home.feed.json | 2 +-
layouts/partials/feed/{json-feed.html => json.html} | 0
layouts/partials/init/index.html | 2 +-
layouts/partials/rss/item.html | 1 +
layouts/section/section.feed.json | 2 +-
layouts/taxonomy/list.feed.json | 2 +-
6 files changed, 5 insertions(+), 4 deletions(-)
rename layouts/partials/feed/{json-feed.html => json.html} (100%)
diff --git a/layouts/_default/home.feed.json b/layouts/_default/home.feed.json
index 45fbb691..62e8d5f7 100644
--- a/layouts/_default/home.feed.json
+++ b/layouts/_default/home.feed.json
@@ -1,3 +1,3 @@
{{- $options := dict "Site" .Site "OutputFormats" .OutputFormats -}}
{{- $options = dict "Title" .Site.Title "Pages" (.Scratch.Get "mainSectionPages") | merge $options -}}
-{{- partial "feed/json-feed.html" $options -}}
+{{- partial "feed/json.html" $options -}}
diff --git a/layouts/partials/feed/json-feed.html b/layouts/partials/feed/json.html
similarity index 100%
rename from layouts/partials/feed/json-feed.html
rename to layouts/partials/feed/json.html
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index 4b61fbe1..4584b907 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-eb8d0276" -}}
+{{- .Scratch.Set "version" "v0.3.10-2c123a3d" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
diff --git a/layouts/partials/rss/item.html b/layouts/partials/rss/item.html
index bc86c4ab..90946f47 100644
--- a/layouts/partials/rss/item.html
+++ b/layouts/partials/rss/item.html
@@ -1,3 +1,4 @@
+{{/* TODO delate and delete rss config */}}
{{- $params := .Page.Params | merge .Site.Params.Page -}}
{{- $authorName := .Site.Params.author.name | default (T "single.author") -}}
{{- with .Params.author -}}
diff --git a/layouts/section/section.feed.json b/layouts/section/section.feed.json
index 38be0179..a6951eac 100644
--- a/layouts/section/section.feed.json
+++ b/layouts/section/section.feed.json
@@ -4,4 +4,4 @@
{{- end -}}
{{- $options := dict "Site" .Site "OutputFormats" .OutputFormats -}}
{{- $options = dict "Title" $title "Pages" .Pages | merge $options -}}
-{{- partial "feed/json-feed.html" $options -}}
+{{- partial "feed/json.html" $options -}}
diff --git a/layouts/taxonomy/list.feed.json b/layouts/taxonomy/list.feed.json
index b31f7d16..a43a75a5 100644
--- a/layouts/taxonomy/list.feed.json
+++ b/layouts/taxonomy/list.feed.json
@@ -4,4 +4,4 @@
{{- end -}}
{{- $options := dict "Site" .Site "OutputFormats" .OutputFormats -}}
{{- $options = dict "Title" $title "Pages" .Pages | merge $options -}}
-{{- partial "feed/json-feed.html" $options -}}
+{{- partial "feed/json.html" $options -}}
From 9cb752351bafb64ebd16eb7e5984e383e1ced5b1 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Tue, 13 Aug 2024 22:58:19 +0800
Subject: [PATCH 14/22] :construction: Feat: revert single.md
---
layouts/{page => _default}/single.md | 0
layouts/partials/init/index.html | 2 +-
2 files changed, 1 insertion(+), 1 deletion(-)
rename layouts/{page => _default}/single.md (100%)
diff --git a/layouts/page/single.md b/layouts/_default/single.md
similarity index 100%
rename from layouts/page/single.md
rename to layouts/_default/single.md
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index 4584b907..fd329307 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-2c123a3d" -}}
+{{- .Scratch.Set "version" "v0.3.10-1d651b5a" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
From 3581ee1c9b33c237b8188ab5c1713e9242913270 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Wed, 14 Aug 2024 14:53:00 +0800
Subject: [PATCH 15/22] :zap: Perf: enhance JSON feed 1.1 compatibility
---
hugo.toml | 23 +++++++++++------------
layouts/partials/feed/json.html | 24 ++++++++++++++----------
layouts/partials/head/link.html | 3 +++
layouts/partials/init/index.html | 2 +-
4 files changed, 29 insertions(+), 23 deletions(-)
diff --git a/hugo.toml b/hugo.toml
index c8baf772..c5b909c8 100644
--- a/hugo.toml
+++ b/hugo.toml
@@ -231,12 +231,10 @@ enableEmoji = true
# -------------------------------------------------------------------------------------
[mediaTypes]
- # Options to make output .txt files
- [mediaTypes."text/plain"]
- suffixes = ["txt"]
- # Options to make output feed.json files
- [mediaTypes."application/feed+json"]
- suffixes = ["json"]
+ # FixIt 0.3.10 | NEW Options to make output feed.json files
+ # Warning: The application/feed+json media type will cause an unknown error in resources.GetRemote!
+ # [mediaTypes."application/feed+json"]
+ # suffixes = ["json"]
# -------------------------------------------------------------------------------------
# Output Format Definitions
@@ -279,7 +277,8 @@ enableEmoji = true
# FixIt 0.3.10 | NEW Options to make output feed.json file
[outputFormats.feed]
baseName = "feed"
- mediaType = "application/feed+json"
+ # Warning: The application/feed+json media type will cause an unknown error in resources.GetRemote!
+ mediaType = "application/json"
isPlainText = true
isHTML = false
# FixIt 0.3.10 | NEW Options to make output search.json file
@@ -297,11 +296,11 @@ enableEmoji = true
# -------------------------------------------------------------------------------------
# Options to make hugo output files, the optional values are below:
-# home: html, rss, feed, archives, offline, readme, baidu_urls, search etc.
-# page: html, markdown
-# section: html, rss, feed
-# taxonomy: html
-# term: html, rss, feed
+# home = ["html", "rss", "feed", "archives", "offline", "readme", "baidu_urls", "search"]
+# page = ["html", "markdown"]
+# section = ["html", "rss", "feed"]
+# taxonomy = ["html"]
+# term = ["html", "rss", "feed"]
[outputs]
home = ["html", "rss", "feed", "archives", "offline", "readme", "baidu_urls", "search"]
page = ["html", "markdown"]
diff --git a/layouts/partials/feed/json.html b/layouts/partials/feed/json.html
index 5f125db1..375d8f02 100644
--- a/layouts/partials/feed/json.html
+++ b/layouts/partials/feed/json.html
@@ -23,11 +23,13 @@
"icon": "{{ `/apple-touch-icon.png` | absURL }}",
"favicon": "{{ `/favicon.ico` | absURL }}",
{{ with .Site.Params.author.name -}}
- "author": {
- "name": "{{ . }}"{{ with $.Site.Params.author.link }},
- "url": "{{ . }}"{{ end }}{{ with $.Site.Params.author.avatar }},
- "avatar": "{{ . | absURL }}"{{ end }}
- },
+ "authors": [
+ {
+ "name": "{{ . }}"{{ with $.Site.Params.author.link }},
+ "url": "{{ . }}"{{ end }}{{ with $.Site.Params.author.avatar }},
+ "avatar": "{{ . | absURL }}"{{ end }}
+ }
+ ],
{{ end -}}
"items": [
{{ range $index, $element := $pages -}}
@@ -39,11 +41,13 @@
"id": "{{ .Permalink }}",
"url": "{{ .Permalink }}",
{{ with .Params.author.name -}}
- "author": {
- "name": "{{ . }}"{{ with $.Params.author.link }},
- "url": "{{ . }}"{{ end }}{{ with $.Params.author.avatar }},
- "avatar": "{{ . | absURL }}"{{ end }}
- },
+ "authors": [
+ {
+ "name": "{{ . }}"{{ with $.Params.author.link }},
+ "url": "{{ . }}"{{ end }}{{ with $.Params.author.avatar }},
+ "avatar": "{{ . | absURL }}"{{ end }}
+ }
+ ],
{{ end -}}
{{ with .Params.tags -}}
"tags": {{ . | jsonify }},
diff --git a/layouts/partials/head/link.html b/layouts/partials/head/link.html
index 9f9677b1..45eb2a9b 100644
--- a/layouts/partials/head/link.html
+++ b/layouts/partials/head/link.html
@@ -32,6 +32,9 @@
{{- range .AlternativeOutputFormats -}}
{{- printf ` ` .Rel .MediaType.Type .Permalink $title | safeHTML -}}
{{- end -}}
+{{- with .OutputFormats.Get "feed" -}}
+
+{{- end -}}
{{- /* style.min.css */ -}}
{{- $options := dict "Source" "css/style.scss" "Fingerprint" $fingerprint -}}
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index fd329307..71846768 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-1d651b5a" -}}
+{{- .Scratch.Set "version" "v0.3.10-cf42e4ea" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
From 4017cc9ffb8833bbf4f4128a867def97a090b7ba Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Thu, 15 Aug 2024 14:50:36 +0800
Subject: [PATCH 16/22] :recycle: Refactor: refactor post author map getting
---
demo/hugo.toml | 3 +-
layouts/partials/feed/json.html | 8 ++--
layouts/partials/feed/rss.html | 3 +-
layouts/partials/function/get-author-map.html | 46 +++++++++++++++++++
layouts/partials/head/meta.html | 11 +++--
layouts/partials/init/index.html | 2 +-
layouts/partials/single/post-author.html | 32 +------------
7 files changed, 63 insertions(+), 42 deletions(-)
create mode 100644 layouts/partials/function/get-author-map.html
diff --git a/demo/hugo.toml b/demo/hugo.toml
index a38746df..001730db 100644
--- a/demo/hugo.toml
+++ b/demo/hugo.toml
@@ -35,5 +35,4 @@ baseURL = "http://example.org/"
# FixIt theme version
version = "0.3.X" # e.g. "0.2.X", "0.2.15", "v0.2.15" etc.
# ...
- [params.search]
- enable = true
+
diff --git a/layouts/partials/feed/json.html b/layouts/partials/feed/json.html
index 375d8f02..eb4c875e 100644
--- a/layouts/partials/feed/json.html
+++ b/layouts/partials/feed/json.html
@@ -8,6 +8,7 @@
{{- $pages = $pages | first $limit -}}
{{- end -}}
{{- $length := $pages.Len -}}
+{{- /* 支持 image 属性 */ -}}
{
"version": "https://jsonfeed.org/version/1.1",
@@ -34,17 +35,18 @@
"items": [
{{ range $index, $element := $pages -}}
{{- $fullText := (.Param "feed").fullText -}}
+ {{- $author := partial "function/get-author-map.html" .Params.author -}}
{
"title": {{ .Title | jsonify }},
"date_published": "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
"date_modified": "{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}",
"id": "{{ .Permalink }}",
"url": "{{ .Permalink }}",
- {{ with .Params.author.name -}}
+ {{ with $author.name -}}
"authors": [
{
- "name": "{{ . }}"{{ with $.Params.author.link }},
- "url": "{{ . }}"{{ end }}{{ with $.Params.author.avatar }},
+ "name": "{{ . }}"{{ with $author.link }},
+ "url": "{{ . }}"{{ end }}{{ with $author.avatar }},
"avatar": "{{ . | absURL }}"{{ end }}
}
],
diff --git a/layouts/partials/feed/rss.html b/layouts/partials/feed/rss.html
index e1d6c3bf..c04ce310 100644
--- a/layouts/partials/feed/rss.html
+++ b/layouts/partials/feed/rss.html
@@ -28,11 +28,12 @@
{{- range $pages }}
{{- $params := .Params | merge .Site.Params.Page }}
{{- $fullText := (.Param "feed").fullText }}
+ {{- $author := partial "function/get-author-map.html" .Params.author -}}
-
{{ .Title }}
{{ .Permalink }}
{{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}
- {{- with .Params.author.email }}{{ . }}{{ with $.Params.author.name }} ({{ . }}){{ end }} {{ end }}
+ {{- with $author.email }}{{ . }}{{ with $author.name }} ({{ . }}){{ end }} {{ end }}
{{ .Permalink }}
{{- if $fullText }}
diff --git a/layouts/partials/function/get-author-map.html b/layouts/partials/function/get-author-map.html
new file mode 100644
index 00000000..a4433692
--- /dev/null
+++ b/layouts/partials/function/get-author-map.html
@@ -0,0 +1,46 @@
+{{- /*
+Get author in map format.
+
+@param {String|Map} . the author name or map
+@returns {Map}
+
+@example {{- $author := partial "function/get-author-map.html" .Params.author -}}
+*/ -}}
+
+{{- if not (reflect.IsMap site.Params.author) -}}
+ {{- errorf "FixIt params error: site.Params.author must be a map, got %T." site.Params.author -}}
+{{- end -}}
+
+{{- $default := dict "name" "" "link" "" "email" "" "avatar" "" -}}
+{{- $author := site.Params.author | merge $default -}}
+{{- $authorParam := dict -}}
+{{- if reflect.IsMap . -}}
+ {{- $authorParam = . -}}
+{{- else -}}
+ {{- with . -}}
+ {{- $authorParam = dict "name" . -}}
+ {{- end -}}
+{{- end -}}
+
+{{- if isset $authorParam "name" | and (ne $authorParam.name site.Params.author.name) -}}
+ {{- $author = $authorParam | merge $default | merge $author -}}
+{{- else -}}
+ {{- with $authorParam.link -}}{{ $author = dict "link" . | merge $author }}{{- end -}}
+ {{- with $authorParam.email -}}{{ $author = dict "email" . | merge $author }}{{- end -}}
+ {{- with $authorParam.avatar -}}{{ $author = dict "avatar" . | merge $author }}{{- end -}}
+{{- end -}}
+
+{{- $gravatar := site.Params.gravatar -}}
+{{- if $gravatar.enable | and $author.email -}}
+ {{- with $gravatar -}}
+ {{- /* TODO migrate to gravatar */ -}}
+ {{- $author = dict "avatar" (printf "https://%v/avatar/%v?s=32&d=%v"
+ (path.Clean .Host | default "www.gravatar.com")
+ (md5 $author.email)
+ (.Style | default ""))
+ | merge $author
+ -}}
+ {{- end -}}
+{{- end -}}
+
+{{- return $author -}}
diff --git a/layouts/partials/head/meta.html b/layouts/partials/head/meta.html
index fda0a5e2..03c361e2 100644
--- a/layouts/partials/head/meta.html
+++ b/layouts/partials/head/meta.html
@@ -1,9 +1,7 @@
-{{- $params := partial "function/params.html" -}}
-{{- $author := .Param "author" -}}
+{{- $author := partial "function/get-author-map.html" .Params.author -}}
-
-
+
{{- $keywords := .Keywords -}}
{{- if not $keywords -}}
@@ -14,12 +12,15 @@
{{- end -}}
{{- end -}}
{{- with $keywords -}}
-
+
{{- end -}}
{{- template "_internal/schema.html" . -}}
{{- template "_internal/opengraph.html" . -}}
{{- template "_internal/twitter_cards.html" . -}}
+{{- with .Site.Params.social.Twitter -}}
+
+{{- end -}}
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index 71846768..c1249d6f 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-cf42e4ea" -}}
+{{- .Scratch.Set "version" "v0.3.10-3581ee1c" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
diff --git a/layouts/partials/single/post-author.html b/layouts/partials/single/post-author.html
index 61d0d246..d81308c7 100644
--- a/layouts/partials/single/post-author.html
+++ b/layouts/partials/single/post-author.html
@@ -1,39 +1,11 @@
{{- $params := .Params | merge .Site.Params.page -}}
-
-{{- /* Author data patch */ -}}
-{{- $authorDefault := dict "name" "" "link" "" "email" "" "avatar" "" -}}
-{{- $author := .Site.Params.author | merge $authorDefault -}}
-{{- $authorPost := dict -}}
-{{- if reflect.IsMap $params.author -}}
- {{- $authorPost = $params.author -}}
-{{- else if isset $params "author" -}}
- {{- warnf "检测到你的 author 参数格式错误,请参考主题文档设置为正常的格式。" -}}
- {{- $authorPost = dict "name" $params.author -}}
-{{- end -}}
-{{- if isset $authorPost "name" | and (ne $authorPost.name .Site.Params.author.name) -}}
- {{- $author = $authorPost | merge $authorDefault | merge $author -}}
-{{- else -}}
- {{- with $authorPost.link -}}{{ $author = dict "link" . | merge $author }}{{- end -}}
- {{- with $authorPost.email -}}{{ $author = dict "email" . | merge $author }}{{- end -}}
- {{- with $authorPost.avatar -}}{{ $author = dict "avatar" . | merge $author }}{{- end -}}
-{{- end -}}
-
-{{- $gravatar := .Site.Params.gravatar -}}
-{{- if $gravatar.enable | and $author.email -}}
- {{- with $gravatar -}}
- {{- $author = dict "avatar" (printf "https://%v/avatar/%v?s=32&d=%v"
- (path.Clean .Host | default "www.gravatar.com")
- (md5 $author.email)
- (.Style | default ""))
- | merge $author
- -}}
- {{- end -}}
-{{- end -}}
+{{- $author := partial "function/get-author-map.html" .Params.author -}}
{{- .Store.Set "author" $author -}}
{{- $content := $author.name | default "Anonymous" -}}
{{- $icon := dict "Class" "fa-solid fa-user-circle" -}}
+ {{- /* Deprecate $params.authorAvatar in favor of $params.showAvatar and dd front matter gravatar {bool} */ -}}
{{- if $author.avatar | and $params.authorAvatar -}}
{{- $content = printf "%v %v" (dict "Src" $author.avatar "Class" "avatar" "Alt" $content "Width" 20 "Height" 20 | partial "plugin/image.html") $content -}}
{{- $icon = "" -}}
From 3e8f4b03699f7cf4279b1647a5ca475c30466227 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Thu, 15 Aug 2024 16:48:39 +0800
Subject: [PATCH 17/22] :sparkles: WIP: add featured image support in feed
---
layouts/_default/summary.html | 6 ++++
layouts/partials/feed/json.html | 34 +++++++++++++++------
layouts/partials/feed/rss.html | 24 ++++++++++++---
layouts/partials/init/index.html | 2 +-
layouts/partials/rss/item.html | 52 --------------------------------
5 files changed, 51 insertions(+), 67 deletions(-)
delete mode 100644 layouts/partials/rss/item.html
diff --git a/layouts/_default/summary.html b/layouts/_default/summary.html
index 8abda62d..a72a3db3 100644
--- a/layouts/_default/summary.html
+++ b/layouts/_default/summary.html
@@ -3,6 +3,12 @@
{{- /* Featured image */ -}}
{{- $image := $params.featuredimagepreview | default $params.featuredimage -}}
+ {{- with $image }}
+ {{- if not (hasPrefix . "/") }}
+ {{- $image = (printf "%s%s" $.RelPermalink .) | safeURL }}
+ {{- end }}
+ {{- $image = $image | relURL }}
+ {{- end }}
{{- with .Resources.GetMatch "featured-image" -}}
{{- $image = .RelPermalink -}}
{{- end -}}
diff --git a/layouts/partials/feed/json.html b/layouts/partials/feed/json.html
index eb4c875e..d53825ae 100644
--- a/layouts/partials/feed/json.html
+++ b/layouts/partials/feed/json.html
@@ -8,7 +8,6 @@
{{- $pages = $pages | first $limit -}}
{{- end -}}
{{- $length := $pages.Len -}}
-{{- /* 支持 image 属性 */ -}}
{
"version": "https://jsonfeed.org/version/1.1",
@@ -33,9 +32,23 @@
],
{{ end -}}
"items": [
- {{ range $index, $element := $pages -}}
- {{- $fullText := (.Param "feed").fullText -}}
- {{- $author := partial "function/get-author-map.html" .Params.author -}}
+ {{- range $index, $page := $pages }}
+ {{- $params := .Params | merge .Site.Params.Page }}
+ {{- $fullText := (.Param "feed").fullText }}
+ {{- $author := partial "function/get-author-map.html" .Params.author }}
+ {{- $image := $params.featuredimagepreview | default $params.featuredimage }}
+ {{- with $image }}
+ {{- if not (hasPrefix . "/") }}
+ {{- $image = (printf "%s%s" $page.RelPermalink .) | safeURL }}
+ {{- end }}
+ {{- $image = $image | absURL }}
+ {{- end }}
+ {{- with .Resources.GetMatch "featured-image" }}
+ {{- $image = .Permalink }}
+ {{- end }}
+ {{- with .Resources.GetMatch "featured-image-preview" }}
+ {{- $image = .Permalink }}
+ {{- end }}
{
"title": {{ .Title | jsonify }},
"date_published": "{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}",
@@ -54,17 +67,18 @@
{{ with .Params.tags -}}
"tags": {{ . | jsonify }},
{{ end -}}
+ {{ with $image -}}
+ "image": "{{ . }}",
+ {{ end -}}
{{ with .Summary -}}
"summary": {{ . | plainify | jsonify }},
- {{ if not $fullText -}}
- "content_html": {{ . | plainify | jsonify }}
- {{- end }}
- {{- end -}}
+ {{ end -}}
{{- if $fullText -}}
"content_html": {{ .Content | jsonify }}
+ {{- else -}}
+ "content_html": {{ (.Summary | default .Description | default .Title) | jsonify }}
{{- end }}
- }{{ if ne (add $index 1) $pages.Len }},
- {{ end }}
+ }{{ if ne (add $index 1) $pages.Len }},{{ end -}}
{{- end }}
]
}
diff --git a/layouts/partials/feed/rss.html b/layouts/partials/feed/rss.html
index c04ce310..d3d969d8 100644
--- a/layouts/partials/feed/rss.html
+++ b/layouts/partials/feed/rss.html
@@ -8,7 +8,7 @@
{{- $pages = $pages | first $limit -}}
{{- end -}}
{{- $length := $pages.Len -}}
-{{- /* TODO 封面图、文章内图片链接、分类、标签等处理 */ -}}
+{{- /* TODO 文章内图片链接、分类、标签等处理 */ -}}
{{- printf "" | safeHTML }}
@@ -25,10 +25,23 @@
{{- with .OutputFormats.Get "rss" }}
{{ printf " " .Permalink .MediaType | safeHTML }}
{{- end }}
- {{- range $pages }}
+ {{- range $page := $pages }}
{{- $params := .Params | merge .Site.Params.Page }}
{{- $fullText := (.Param "feed").fullText }}
- {{- $author := partial "function/get-author-map.html" .Params.author -}}
+ {{- $author := partial "function/get-author-map.html" .Params.author }}
+ {{- $image := $params.featuredimagepreview | default $params.featuredimage }}
+ {{- with $image }}
+ {{- if not (hasPrefix . "/") }}
+ {{- $image = (printf "%s%s" $page.RelPermalink .) | safeURL }}
+ {{- end }}
+ {{- $image = $image | absURL }}
+ {{- end }}
+ {{- with .Resources.GetMatch "featured-image" }}
+ {{- $image = .Permalink }}
+ {{- end }}
+ {{- with .Resources.GetMatch "featured-image-preview" }}
+ {{- $image = .Permalink }}
+ {{- end }}
-
{{ .Title }}
{{ .Permalink }}
@@ -40,11 +53,14 @@
{{- "]*>.*` "" | replaceRE ` ]*( /)?>` "" | safeHTML -}} */ -}}
+ {{- with $image }}
+ {{- $content = add (printf " " . "featured image" "no-referrer") $content | safeHTML }}
+ {{- end }}
{{- $content | transform.XMLEscape | safeHTML }}
{{- "]]>" | safeHTML -}}
{{- else }}
- {{ .Summary | transform.XMLEscape | safeHTML }}
+ {{ (.Summary | default .Description | default .Title) | transform.XMLEscape | safeHTML }}
{{- end }}
{{- end }}
diff --git a/layouts/partials/init/index.html b/layouts/partials/init/index.html
index c1249d6f..bd783bfb 100644
--- a/layouts/partials/init/index.html
+++ b/layouts/partials/init/index.html
@@ -1,4 +1,4 @@
-{{- .Scratch.Set "version" "v0.3.10-3581ee1c" -}}
+{{- .Scratch.Set "version" "v0.3.10-5a715ca9" -}}
{{- .Scratch.Set "this" dict -}}
{{- partial "init/detection-env.html" . -}}
diff --git a/layouts/partials/rss/item.html b/layouts/partials/rss/item.html
deleted file mode 100644
index 90946f47..00000000
--- a/layouts/partials/rss/item.html
+++ /dev/null
@@ -1,52 +0,0 @@
-{{/* TODO delate and delete rss config */}}
-{{- $params := .Page.Params | merge .Site.Params.Page -}}
-{{- $authorName := .Site.Params.author.name | default (T "single.author") -}}
-{{- with .Params.author -}}
- {{- if reflect.IsMap . -}}
- {{- $authorName = cond (isset . "name") .name $authorName -}}
- {{- else -}}
- {{- $authorName = . -}}
- {{- end -}}
-{{- end -}}
-{{- $image := $params.featuredimagepreview | default $params.featuredimage -}}
-{{- with .Page.Resources.GetMatch "featured-image" -}}
- {{- $image = .Permalink -}}
-{{- end -}}
-{{- with .Page.Resources.GetMatch "featured-image-preview" -}}
- {{- $image = .Permalink -}}
-{{- end -}}
-
--
-
- {{- .Page.Title -}}
-
-
- {{- .Page.Permalink -}}
-
-
- {{- .Page.Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" -}}
-
- {{ $authorName }}
-
- {{- .Page.Permalink -}}
-
-
- {{- "
- {{- dict "Src" . "Title" $.Page.Description "Alt" $.Page.Title "Loading" "eager" "Referrerpolicy" "no-referrer" | partial "plugin/image.html" -}}
-
- {{- end -}}
- {{- $content := .Page.Description -}}
- {{- if $params.rssFullText -}}
- {{- $content = dict "Content" .Page.Content "Ruby" $params.ruby "Fraction" $params.fraction "Fontawesome" $params.fontawesome | partial "function/content.html" -}}
- {{- else -}}
- {{- with .Page.Summary -}}
- {{- $content = dict "Content" . "Ruby" $params.ruby "Fraction" $params.fraction "Fontawesome" $params.fontawesome | partial "function/content.html" -}}
- {{- end -}}
- {{- end -}}
- {{/* {{- $content | replaceRE `]*>.* ` "" | replaceRE ` ]*( /)?>` "" | safeHTML -}} */}}
- {{- $content | safeHTML -}}
- {{- "]]>" | safeHTML -}}
-
-
From 852b8836014463ce234168a855fbcf23ae3d5b95 Mon Sep 17 00:00:00 2001
From: Cell <1024@lruihao.cn>
Date: Thu, 15 Aug 2024 21:38:30 +0800
Subject: [PATCH 18/22] :pencil: Docs: update README and screenshot
---
CONTRIBUTING.md | 2 +
README.md | 68 ++++++++++++++++----------
README.zh-cn.md | 76 ++++++++++++++++++------------
images/apple-devices-preview.png | Bin 0 -> 146168 bytes
images/apple-devices-preview.webp | Bin 70052 -> 0 bytes
5 files changed, 90 insertions(+), 56 deletions(-)
create mode 100644 images/apple-devices-preview.png
delete mode 100644 images/apple-devices-preview.webp
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b686395c..ce0e8cf9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,5 +1,7 @@
# CONTRIBUTING
+Make sure that you follow [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) while contributing and engaging in the discussions.
+
## How to contribute to this project
First, fork this repository by clicking the fork button.
diff --git a/README.md b/README.md
index 69c69ba8..04e03cb9 100644
--- a/README.md
+++ b/README.md
@@ -1,37 +1,57 @@
-# FixIt Theme | Hugo
+
+![Hugo Theme FixIt](https://fixit.lruihao.cn/images/apple-devices-preview.png)
+
+
+
+
+
+# FixIt
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/hugo-fixit/FixIt?style=flat)](https://github.com/hugo-fixit/FixIt/releases)
[![Hugo](https://img.shields.io/badge/Hugo-%5E0.127.0-ff4088?style=flat&logo=hugo)](https://gohugo.io/)
[![License](https://img.shields.io/github/license/hugo-fixit/FixIt?style=flat)](/LICENSE)
[![Open Source Love](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)](https://github.com/hugo-fixit/FixIt)
-👉 English README | [简体中文说明](README.zh-cn.md)
+> «FixIt» is a **clean**, **elegant** but **advanced** blog theme for [Hugo](https://gohugo.io/).
-[FixIt](https://github.com/hugo-fixit/FixIt) is a **clean**, **elegant** but **advanced** blog theme for [Hugo](https://gohugo.io/).
+It is based on the original [LoveIt](https://github.com/dillonzq/LoveIt) Theme, [KeepIt](https://github.com/Fastbyte01/KeepIt) Theme and [LeaveIt](https://github.com/liuzc/LeaveIt) Theme.
-It is based on the original [LoveIt Theme](https://github.com/dillonzq/LoveIt), [KeepIt Theme](https://github.com/Fastbyte01/KeepIt) and [LeaveIt Theme](https://github.com/liuzc/LeaveIt).[^1]
+## Live Preview
-![Hugo Theme FixIt](https://fixit.lruihao.cn/images/apple-devices-preview.webp)
+
+ 💟 Production | ❇️ Preview | 🚼 Demo | 🆕 Starter
+
+
+ More «FixIt» examples here .
+
-## Getting started
+## Documentation
-1. [Installation](https://fixit.lruihao.cn/documentation/installation/)
-2. [Getting Started](https://fixit.lruihao.cn/documentation/getting-started/)
-3. [Content Management](https://fixit.lruihao.cn/documentation/content-management/)
-4. [Advanced Usage](https://fixit.lruihao.cn/documentation/advanced/)
+Head to the [Quick Start](https://fixit.lruihao.cn/documentation/getting-started/quick-start/) page for a step-by-step guide on how to create a new website with FixIt.
-Alternatively, you can run the [documentation site](https://fixit.lruihao.cn/) locally. For more details, see [hugo-fixit/docs](https://github.com/hugo-fixit/docs).
+Outline: [Installation](https://fixit.lruihao.cn/documentation/installation/) ➜ [Getting Started](https://fixit.lruihao.cn/documentation/getting-started/) ➜ [Content Management](https://fixit.lruihao.cn/documentation/content-management/) ➜ [Advanced Usage](https://fixit.lruihao.cn/documentation/advanced/)
## Template repository
-- [hugo-fixit/hugo-fixit-start](https://github.com/hugo-fixit/hugo-fixit-start/generate)
-- [hugo-fixit/hugo-fixit-start1](https://github.com/hugo-fixit/hugo-fixit-start1/generate)
-- [hugo-fixit/docs](https://github.com/hugo-fixit/docs/generate)
-- [Lruihao/hugo-blog](https://github.com/Lruihao/hugo-blog/generate)
+Click the following links to generate a new repository with template:
-## Who used FixIt
+| Template repository | Generate link |
+| :----------------------------------------- | :----------------------------: |
+| [hugo-fixit/hugo-fixit-starter][starter] | [Click][starter:generate] |
+| [hugo-fixit/hugo-fixit-starter1][starter1] | [Click][starter1:generate] |
+| [hugo-fixit/docs][docs] | [Click][docs:generate] |
+| [Lruihao/hugo-blog][lruihao-blog] | [Click][lruihao-blog:generate] |
-To see this theme in action, here are some [live demo sites](https://fixit.lruihao.cn/friends/) which are rendered with **FixIt** theme.
+[starter]: https://github.com/hugo-fixit/hugo-fixit-starter
+[starter:generate]: https://github.com/hugo-fixit/hugo-fixit-starter/generate
+[starter1]: https://github.com/hugo-fixit/hugo-fixit-starter1
+[starter1:generate]: https://github.com/hugo-fixit/hugo-fixit-starter1/generate
+[docs]: https://github.com/hugo-fixit/docs
+[docs:generate]: https://github.com/hugo-fixit/docs/generate
+[lruihao-blog]: https://github.com/Lruihao/hugo-blog
+[lruihao-blog:generate]: https://github.com/Lruihao/hugo-blog/generate
+
+
## Features
@@ -96,12 +116,12 @@ To see this theme in action, here are some [live demo sites](https://fixit.lruih
- Kinds of **admonitions** shortcode
- **Custom style** shortcode
- **Custom script** shortcode
+- Open more **custom blocks**
- **Animated typing** supported by [TypeIt](https://typeitjs.com/)
- **Cookie consent banner** supported by [cookieconsent](https://github.com/osano/cookieconsent)
- **Web Watermark** supported by [cell-watermark](https://github.com/Lruihao/watermark)
- **Chinese typesetting** supported by [pangu.js](https://github.com/vinta/pangu.js)
- Options to **cache remote image** locally
-- High **extensibility**
- ...
### Theme Components
@@ -152,13 +172,12 @@ Don't forget to leave a ⭐️ if you like this theme, thanks!
## Contributing
-- [Roadmap of FixIt](https://github.com/orgs/hugo-fixit/projects/2)
-
-Please see [CONTRIBUTING.md](CONTRIBUTING.md) for getting started with the contribution.
+We welcome you to join the development of FixIt. Please see [contributing document](CONTRIBUTING.md). 🤗
-Make sure that you follow [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) while contributing and engaging in the discussions.
+Also, we welcome Issue or PR to our [official-components](https://github.com/hugo-fixit).
-**When contributing, please first discuss the change you wish to make via an issue on this repository before making the actual change**.
+> [!note]
+> When contributing, please first discuss the change you wish to make via a discussion on this repository before making the actual change.
## Acknowledgements
@@ -226,6 +245,3 @@ If you enjoy the theme, please consider buying me a coffee ☕️. Thanks!
## Author
[Lruihao](https://github.com/Lruihao "Follow me on GitHub")
-
-
-[^1]: The theme name is interesting: "leave it, keep it, love it, fix it". Appears and leaves, loves but cannot keep. Doesn't it look like that damn love and BUG? 🤣
diff --git a/README.zh-cn.md b/README.zh-cn.md
index ceaaef63..72317a18 100644
--- a/README.zh-cn.md
+++ b/README.zh-cn.md
@@ -1,37 +1,57 @@
-# FixIt 主题 | Hugo
+
+![Hugo Theme FixIt](https://fixit.lruihao.cn/images/apple-devices-preview.png)
+
+
+
+
+
+# FixIt
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/hugo-fixit/FixIt?style=flat)](https://github.com/hugo-fixit/FixIt/releases)
[![Hugo](https://img.shields.io/badge/Hugo-%5E0.127.0-ff4088?style=flat&logo=hugo)](https://gohugo.io/)
[![License](https://img.shields.io/github/license/hugo-fixit/FixIt?style=flat)](/LICENSE)
[![Open Source Love](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)](https://github.com/hugo-fixit/FixIt)
-👉 [English README](README.md) | 简体中文说明
+> «FixIt» 是一个**简洁**、**优雅**且**高效**的 [Hugo](https://gohugo.io/) 博客主题。
-[FixIt](https://github.com/hugo-fixit/FixIt) 是一个**简洁**、**优雅**且**高效**的 [Hugo](https://gohugo.io/) 博客主题。
+它的原型基于 [LoveIt](https://github.com/dillonzq/LoveIt) 主题,[KeepIt](https://github.com/Fastbyte01/KeepIt) 主题和 [LeaveIt](https://github.com/liuzc/LeaveIt) 主题。
-它的原型基于 [LoveIt 主题](https://github.com/dillonzq/LoveIt),[KeepIt 主题](https://github.com/Fastbyte01/KeepIt) 和 [LeaveIt 主题](https://github.com/liuzc/LeaveIt)。[^1]
+## 即时预览
-![Hugo Theme FixIt](https://fixit.lruihao.cn/images/apple-devices-preview.webp)
+
+ 💟 Production | ❇️ Preview | 🚼 Demo | 🆕 Starter
+
+
+ 更多 «FixIt» 的例子参见 这里 。
+
## 主题文档
-1. [安装篇](https://fixit.lruihao.cn/zh-cn/documentation/installation/)
-2. [入门篇](https://fixit.lruihao.cn/zh-cn/documentation/getting-started/)
-3. [内容管理](https://fixit.lruihao.cn/zh-cn/documentation/content-management/)
-4. [进阶篇](https://fixit.lruihao.cn/zh-cn/documentation/advanced/)
+前往 [快速上手](https://fixit.lruihao.cn/zh-cn/documentation/getting-started/quick-start/) 页面,了解如何使用 FixIt 主题创建一个新网站的详细步骤。
-或者在本地运行 [文档站点](https://fixit.lruihao.cn/zh-cn/),更多细节详见 [hugo-fixit/docs](https://github.com/hugo-fixit/docs)。
+大纲:[安装篇](https://fixit.lruihao.cn/zh-cn/documentation/installation/) ➜ [入门篇](https://fixit.lruihao.cn/zh-cn/documentation/getting-started/) ➜ [内容管理](https://fixit.lruihao.cn/zh-cn/documentation/content-management/) ➜ [进阶篇](https://fixit.lruihao.cn/zh-cn/documentation/advanced/)
## 模板仓库
-- [hugo-fixit/hugo-fixit-start](https://github.com/hugo-fixit/hugo-fixit-start/generate)
-- [hugo-fixit/hugo-fixit-start1](https://github.com/hugo-fixit/hugo-fixit-start1/generate)
-- [hugo-fixit/docs](https://github.com/hugo-fixit/docs/generate)
-- [Lruihao/hugo-blog](https://github.com/Lruihao/hugo-blog/generate)
+点击以下链接使用模板生成一个新的仓库:
-## 谁在用 FixIt
+| 模板仓库 | 生成链接 |
+| :----------------------------------------- | :-------------------------------: |
+| [hugo-fixit/hugo-fixit-starter][starter] | [点击生成][starter:generate] |
+| [hugo-fixit/hugo-fixit-starter1][starter1] | [点击生成][starter1:generate] |
+| [hugo-fixit/docs][docs] | [点击生成][docs:generate] |
+| [Lruihao/hugo-blog][lruihao-blog] | [点击生成][lruihao-blog:generate] |
-为了直观地浏览主题特性,这里有一些基于 **FixIt** 主题渲染的 [预览网站](https://fixit.lruihao.cn/zh-cn/friends/)。
+[starter]: https://github.com/hugo-fixit/hugo-fixit-starter
+[starter:generate]: https://github.com/hugo-fixit/hugo-fixit-starter/generate
+[starter1]: https://github.com/hugo-fixit/hugo-fixit-starter1
+[starter1:generate]: https://github.com/hugo-fixit/hugo-fixit-starter1/generate
+[docs]: https://github.com/hugo-fixit/docs
+[docs:generate]: https://github.com/hugo-fixit/docs/generate
+[lruihao-blog]: https://github.com/Lruihao/hugo-blog
+[lruihao-blog:generate]: https://github.com/Lruihao/hugo-blog/generate
+
+
## 特性
@@ -96,17 +116,17 @@
- 支持多种**注释**的 shortcode
- 支持**自定义样式**的 shortcode
- 支持**自定义脚本**的 shortcode
+- 支持**自定义模板块**
- 支持基于 [TypeIt](https://typeitjs.com/) 的**打字动画** shortcode
- 支持基于 [cookieconsent](https://github.com/osano/cookieconsent) 的 **Cookie 许可横幅**
- 支持基于 [cell-watermark](https://github.com/Lruihao/watermark) 的**网页水印**
- 支持基于 [pangu.js](https://github.com/vinta/pangu.js) 的**中文排版**
- 支持本地**缓存远程图床图片**
-- 高**扩展性**
- ……
### 主题组件
-FixIt 主题旨在在 **简洁性** 和 **可扩展性** 之间取得平衡。为此,我们开发了一系列额外的 [Hugo 主题组件](https://fixit.lruihao.cn/zh-cn/components/) 供用户选择。
+FixIt 主题旨在在**简洁性**和**可扩展性**之间取得平衡。为此,我们开发了一系列额外的 [Hugo 主题组件](https://fixit.lruihao.cn/zh-cn/components/) 供用户选择。
## 多语言和国际化
@@ -130,6 +150,10 @@ FixIt 支持下列语言:
[语言兼容性](https://fixit.lruihao.cn/zh-cn/theme-documentation-basics/#language-compatibility)
+## 镜像
+
+Gitee 镜像仓库:
+
## 社区支持
所有的反馈都是欢迎的!详见 [Discussions][discussions]、[Pull requests][pulls] 和 [Issues][issues]。
@@ -152,17 +176,12 @@ FixIt 支持下列语言:
## 参与贡献
-- [Hugo FixIt 路线图](https://github.com/orgs/hugo-fixit/projects/2)
-
-请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 以了解贡献该项目的基本信息。
-
-确保在贡献和参与讨论时遵守 [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)。
+我们欢迎你加入 FixIt 的开发,贡献出你的一份力量。请看开源 [贡献指南](CONTRIBUTING.md)。 🤗
-**贡献时,请先通过此存储库上的问题讨论你希望进行的更改,然后再进行实际更改**。
+你也可以随时向我们的 [官方插件](https://github.com/hugo-fixit) 提交 Issue 或 Pull Request。
-## 镜像
-
-- Gitee 镜像仓库:
+> [!note]
+> 在贡献时,请先通过此存储库上的讨论来讨论你希望进行的更改,然后再进行实际更改。
## 致谢
@@ -230,6 +249,3 @@ FixIt 根据 **MIT** 许可协议授权。更多信息请查看 [LICENSE 文件]
## 作者
[Lruihao](https://github.com/Lruihao "在 GitHub 上关注我")
-
-
-[^1]: 主题名称趣谈:“leave it, keep it,love it,fix it”。出现又离开,爱而不得。这像不像那该死的爱情和 BUG 呢?🤣
diff --git a/images/apple-devices-preview.png b/images/apple-devices-preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b79b95e14a3a705276ac4ff78217e80566342ed
GIT binary patch
literal 146168
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
z
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