diff --git a/archetypes/search.md b/archetypes/search.md new file mode 100644 index 00000000..3489fa5a --- /dev/null +++ b/archetypes/search.md @@ -0,0 +1,5 @@ +--- +title: {{ T "assets.search" }} +layout: search +date: {{ .Date }} +--- diff --git a/assets/css/_core/_header.scss b/assets/css/_core/_header.scss index 80522e0f..a231c86f 100644 --- a/assets/css/_core/_header.scss +++ b/assets/css/_core/_header.scss @@ -118,7 +118,7 @@ header { } } -.search { +.menu .search { position: relative; input { diff --git a/assets/css/_page/_index.scss b/assets/css/_page/_index.scss index 6ac5e31c..4d326c03 100644 --- a/assets/css/_page/_index.scss +++ b/assets/css/_page/_index.scss @@ -17,4 +17,3 @@ @import '_home'; @import '_404'; @import '_offline'; -@import '_friends'; diff --git a/assets/css/_page/_special.scss b/assets/css/_page/_special.scss deleted file mode 100644 index 3a8f18d2..00000000 --- a/assets/css/_page/_special.scss +++ /dev/null @@ -1,6 +0,0 @@ -.special { - .single-title, - .single-subtitle { - text-align: right; - } -} diff --git a/assets/css/_page/_friends.scss b/assets/css/_page/_special/_friends.scss similarity index 96% rename from assets/css/_page/_friends.scss rename to assets/css/_page/_special/_friends.scss index 5d0dce1a..25738af9 100644 --- a/assets/css/_page/_friends.scss +++ b/assets/css/_page/_special/_friends.scss @@ -1,5 +1,5 @@ /** - * @Description: Style of layout named 'friends'. + * Style of layout named 'friends'. * @Author: Lruihao * @Updated: 2022/3/11 21:36 */ diff --git a/assets/css/_page/_special/_index.scss b/assets/css/_page/_special/_index.scss new file mode 100644 index 00000000..090bcd81 --- /dev/null +++ b/assets/css/_page/_special/_index.scss @@ -0,0 +1,14 @@ +.special { + .single-title, + .single-subtitle { + text-align: right; + } + + &.friends { + @import '_friends'; + } + + &.search { + @import '_search'; + } +} diff --git a/assets/css/_page/_special/_search.scss b/assets/css/_page/_special/_search.scss new file mode 100644 index 00000000..6b6c9e6f --- /dev/null +++ b/assets/css/_page/_special/_search.scss @@ -0,0 +1,10 @@ +// Style of layout named 'search' +// TODO Adapting to dark mode, maybe use css variables + +// Google CSE +.gcse-searchbox:empty, +.gcse-searchresults:empty { + display: none; +} + +// Bing CSE (Unsupported) diff --git a/assets/js/theme.js b/assets/js/theme.js index fecdb263..fb33748b 100644 --- a/assets/js/theme.js +++ b/assets/js/theme.js @@ -159,8 +159,10 @@ class FixIt { document.body.classList.add('blur'); $header.classList.add('open'); $searchInput.focus(); + this.disableScrollEvent = true; }, false); $searchClear.addEventListener('click', () => { + this.disableScrollEvent = false; $searchClear.style.display = 'none'; this._searchDesktop && this._searchDesktop.autocomplete.setVal(''); }, false); @@ -289,25 +291,47 @@ class FixIt { finish([]); }); } else finish(search()); - } + } else if (searchConfig.type === 'cse') { + const cseConfig = this.config.cse; + if (cseConfig.engine === 'google' && cseConfig.cx) { + finish([{ + uri: `${cseConfig.resultsPage}#gsc.tab=0&gsc.q=${encodeURIComponent(query)}`, + title: cseConfig.searchIn, + date: '', + context: cseConfig.gotoResultsPage + }]); + } + } }, templates: { suggestion: ({ title, date, context }) => `
${title}${date}
${context}
`, empty: ({ query }) => `
${searchConfig.noResultsFound}: "${query}"
`, footer: ({}) => { - const { searchType, icon, href } = - searchConfig.type === 'algolia' - ? { - searchType: 'algolia', - icon: '', - href: 'https://www.algolia.com/' - } - : { - searchType: 'Fuse.js', - icon: '', - href: 'https://fusejs.io/' - } + let searchType, icon, href; + switch (searchConfig.type) { + case 'algolia': + searchType = 'algolia'; + icon = ''; + href = 'https://www.algolia.com/'; + break; + case 'fuse': + searchType = 'Fuse.js'; + icon = ''; + href = 'https://fusejs.io/'; + break; + case 'cse': + if (this.config.cse.engine === 'google') { + searchType = 'Google CSE'; + icon = ''; + href = 'https://programmablesearchengine.google.com/'; + } + break; + default: + searchType = ''; + icon = ''; + href = ''; + } return ``; } } diff --git a/hugo.toml b/hugo.toml index 2268c36a..ef0b7e22 100644 --- a/hugo.toml +++ b/hugo.toml @@ -389,7 +389,7 @@ enableEmoji = true # Search config [params.search] enable = false - # type of search engine ["algolia", "fuse"] + # type of search engine ["algolia", "fuse", "cse"] type = "fuse" # max index length of the chunked content contentLength = 4000 @@ -419,6 +419,19 @@ enableEmoji = true useExtendedSearch = false ignoreFieldNorm = false + # FixIt 0.3.16 | NEW Custom Search Engine (CSE) + [params.cse] + # Search Engine: ["google", "bing"] + engine = "" + # Search results page URL (layout: search) + resultsPage = "/search/" + # Google: https://programmablesearchengine.google.com/ + # Google Custom Search Engine Context + [params.cse.google] + cx = "" + # Bing (Unsupported): https://www.customsearch.ai/ + [params.cse.bing] + # Header config [params.header] # FixIt 0.2.13 | CHANGED desktop header mode ["sticky", "normal", "auto"] diff --git a/layouts/page/search.html b/layouts/page/search.html new file mode 100644 index 00000000..148fc177 --- /dev/null +++ b/layouts/page/search.html @@ -0,0 +1,34 @@ +{{- define "title" -}} + {{- cond (.Param "capitalizeTitles") (title .Title) .Title -}} + {{- if .Site.Params.withSiteTitle }} {{ .Site.Params.titleDelimiter }} {{ .Site.Title }}{{- end -}} +{{- end -}} + +{{- define "content" -}} + {{- $params := partial "function/params.html" -}} + {{- $cse := .Site.Params.cse -}} + +{{- end -}} diff --git a/layouts/partials/assets.html b/layouts/partials/assets.html index cfebaffb..03df5c2c 100644 --- a/layouts/partials/assets.html +++ b/layouts/partials/assets.html @@ -22,6 +22,16 @@ {{- $source := $cdn.fuseJS | default "lib/fuse/fuse.min.js" -}} {{- dict "Source" $source "Fingerprint" $fingerprint "Defer" true | dict "Scratch" .Scratch "Data" | partial "scratch/script.html" -}} {{- $config = dict "isCaseSensitive" $search.fuse.isCaseSensitive "minMatchCharLength" $search.fuse.minMatchCharLength "findAllMatches" $search.fuse.findAllMatches "location" $search.fuse.location "threshold" $search.fuse.threshold "distance" $search.fuse.distance "ignoreLocation" $search.fuse.ignoreLocation "useExtendedSearch" $search.fuse.useExtendedSearch "ignoreFieldNorm" $search.fuse.ignoreFieldNorm | dict "search" | merge $config -}} + {{- else if eq $search.type "cse" -}} + {{- $config = dict "type" "cse" | dict "search" | merge $config -}} + {{- $cse := .Site.Params.cse -}} + {{- $config = dict "resultsPage" $cse.resultsPage "gotoResultsPage" (T "assets.gotoResultsPage") | dict "cse" | merge $config -}} + {{- if (eq $cse.engine "google") | and $cse.google.cx -}} + {{- $config = dict "engine" "google" "cx" $cse.google.cx "searchIn" (T "assets.searchIn" "Google") | dict "cse" | merge $config -}} + {{- end -}} + {{- if eq $cse.engine "bing" -}} + {{- /* Unsupported */ -}} + {{- end -}} {{- end -}} {{- end -}}