mirror of
https://github.com/hugo-fixit/FixIt.git
synced 2026-08-24 15:28:57 +00:00
Merge pull request #551 from hugo-fixit/google-cse
✨ Feat: add Google CSE support
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
---
|
||||
title: {{ T "assets.search" }}
|
||||
layout: search
|
||||
date: {{ .Date }}
|
||||
---
|
||||
@@ -118,7 +118,7 @@ header {
|
||||
}
|
||||
}
|
||||
|
||||
.search {
|
||||
.menu .search {
|
||||
position: relative;
|
||||
|
||||
input {
|
||||
|
||||
@@ -17,4 +17,3 @@
|
||||
@import '_home';
|
||||
@import '_404';
|
||||
@import '_offline';
|
||||
@import '_friends';
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
.special {
|
||||
.single-title,
|
||||
.single-subtitle {
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* @Description: Style of layout named 'friends'.
|
||||
* Style of layout named 'friends'.
|
||||
* @Author: Lruihao <https://lruihao.cn>
|
||||
* @Updated: 2022/3/11 21:36
|
||||
*/
|
||||
@@ -0,0 +1,14 @@
|
||||
.special {
|
||||
.single-title,
|
||||
.single-subtitle {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
&.friends {
|
||||
@import '_friends';
|
||||
}
|
||||
|
||||
&.search {
|
||||
@import '_search';
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
+37
-13
@@ -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: '<i class="fa-brands fa-searchengin fa-xl" aria-hidden="true"></i>',
|
||||
context: cseConfig.gotoResultsPage
|
||||
}]);
|
||||
}
|
||||
}
|
||||
},
|
||||
templates: {
|
||||
suggestion: ({ title, date, context }) =>
|
||||
`<div><span class="suggestion-title">${title}</span><span class="suggestion-date">${date}</span></div><div class="suggestion-context">${context}</div>`,
|
||||
empty: ({ query }) => `<div class="search-empty">${searchConfig.noResultsFound}: <span class="search-query">"${query}"</span></div>`,
|
||||
footer: ({}) => {
|
||||
const { searchType, icon, href } =
|
||||
searchConfig.type === 'algolia'
|
||||
? {
|
||||
searchType: 'algolia',
|
||||
icon: '<i class="fa-brands fa-algolia fa-fw" aria-hidden="true"></i>',
|
||||
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 = '<i class="fa-brands fa-algolia fa-fw" aria-hidden="true"></i>';
|
||||
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 = '<i class="fa-brands fa-google fa-fw" aria-hidden="true"></i>';
|
||||
href = 'https://programmablesearchengine.google.com/';
|
||||
}
|
||||
break;
|
||||
default:
|
||||
searchType = '';
|
||||
icon = '';
|
||||
href = '';
|
||||
}
|
||||
return `<div class="search-footer">Search by <a href="${href}" rel="noopener noreferrer" target="_blank">${icon} ${searchType}</a></div>`;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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 -}}
|
||||
<article class="page single special search">
|
||||
<div class="header">
|
||||
{{- /* Title */ -}}
|
||||
<h1 class="single-title animate__animated animate__pulse animate__faster">{{- cond (.Param "capitalizeTitles") (title .Title) .Title -}}</h1>
|
||||
|
||||
{{- /* Subtitle */ -}}
|
||||
{{- with $params.subtitle -}}<p class="single-subtitle animate__animated animate__fadeIn">{{ . | $.RenderString }}</p>{{- end -}}
|
||||
</div>
|
||||
|
||||
{{- /* Content */ -}}
|
||||
<div class="content" id="content">
|
||||
{{- dict "Content" .Content "Ruby" $params.ruby "Fraction" $params.fraction "Fontawesome" $params.fontawesome | partial "function/content.html" | safeHTML -}}
|
||||
</div>
|
||||
|
||||
{{- /* Google CSE */ -}}
|
||||
{{- if eq $cse.engine "google" -}}
|
||||
{{- with $cse.google.cx -}}
|
||||
<script async defer src="https://cse.google.com/cse.js?cx={{ . }}"></script>
|
||||
<div class="gcse-searchbox"></div>
|
||||
<div class="gcse-searchresults"></div>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- /* Bing CSE (Unsupported) */ -}}
|
||||
</article>
|
||||
{{- end -}}
|
||||
@@ -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 -}}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user