Skip to content

Commit 78aab07

Browse files
yufeihp-kostov
authored andcommitted
feat: support multiple search languages (dotnet#9313)
1 parent d4a80b0 commit 78aab07

File tree

4 files changed

+72
-2
lines changed

4 files changed

+72
-2
lines changed

templates/modern/src/options.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ export type DocfxOptions = {
3636
/** Configures mermaid diagram options */
3737
mermaid?: MermaidConfig,
3838

39+
/** A list of [lunr languages](https://github.com/MihaiValentin/lunr-languages#readme) such as fr, es for full text search */
40+
lunrLanguages?: string[],
41+
3942
/** Configures [hightlight.js](https://highlightjs.org/) */
4043
configureHljs?: (hljs: HLJSApi) => void,
4144

templates/modern/src/search-worker.ts

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
import lunr from 'lunr'
5+
import stemmer from 'lunr-languages/lunr.stemmer.support'
6+
import multi from 'lunr-languages/lunr.multi'
57
import { get, set, createStore } from 'idb-keyval'
68

79
type SearchHit = {
@@ -31,14 +33,25 @@ async function loadIndexCore() {
3133
}
3234
}
3335

34-
const { configureLunr } = await import('./main.js').then(m => m.default) as DocfxOptions
36+
const { lunrLanguages, configureLunr } = await import('./main.js').then(m => m.default) as DocfxOptions
37+
38+
if (lunrLanguages && lunrLanguages.length > 0) {
39+
multi(lunr)
40+
stemmer(lunr)
41+
await Promise.all(lunrLanguages.map(initLanguage))
42+
}
3543

3644
const index = lunr(function() {
45+
lunr.tokenizer.separator = /[\s\-.()]+/
46+
3747
this.ref('href')
3848
this.field('title', { boost: 50 })
3949
this.field('keywords', { boost: 20 })
4050

41-
lunr.tokenizer.separator = /[\s\-.()]+/
51+
if (lunrLanguages && lunrLanguages.length > 0) {
52+
this.use(lunr.multiLanguage(...lunrLanguages))
53+
}
54+
4255
configureLunr?.(this)
4356

4457
for (const key in data) {
@@ -60,3 +73,45 @@ onmessage = function(e) {
6073
postMessage({ e: 'query-ready', d: search(e.data.q) })
6174
}
6275
}
76+
77+
const langMap = {
78+
ar: () => import('lunr-languages/lunr.ar.js'),
79+
da: () => import('lunr-languages/lunr.da.js'),
80+
de: () => import('lunr-languages/lunr.de.js'),
81+
du: () => import('lunr-languages/lunr.du.js'),
82+
el: () => import('lunr-languages/lunr.el.js'),
83+
es: () => import('lunr-languages/lunr.es.js'),
84+
fi: () => import('lunr-languages/lunr.fi.js'),
85+
fr: () => import('lunr-languages/lunr.fr.js'),
86+
he: () => import('lunr-languages/lunr.he.js'),
87+
hi: () => import('lunr-languages/lunr.hi.js'),
88+
hu: () => import('lunr-languages/lunr.hu.js'),
89+
hy: () => import('lunr-languages/lunr.hy.js'),
90+
it: () => import('lunr-languages/lunr.it.js'),
91+
ja: () => import('lunr-languages/lunr.ja.js'),
92+
jp: () => import('lunr-languages/lunr.jp.js'),
93+
kn: () => import('lunr-languages/lunr.kn.js'),
94+
ko: () => import('lunr-languages/lunr.ko.js'),
95+
nl: () => import('lunr-languages/lunr.nl.js'),
96+
no: () => import('lunr-languages/lunr.no.js'),
97+
pt: () => import('lunr-languages/lunr.pt.js'),
98+
ro: () => import('lunr-languages/lunr.ro.js'),
99+
ru: () => import('lunr-languages/lunr.ru.js'),
100+
sa: () => import('lunr-languages/lunr.sa.js'),
101+
sv: () => import('lunr-languages/lunr.sv.js'),
102+
ta: () => import('lunr-languages/lunr.ta.js'),
103+
te: () => import('lunr-languages/lunr.te.js'),
104+
th: () => import('lunr-languages/lunr.th.js'),
105+
tr: () => import('lunr-languages/lunr.tr.js'),
106+
vi: () => import('lunr-languages/lunr.vi.js')
107+
108+
// zh is currently not supported due to dependency on NodeJS.
109+
// zh: () => import('lunr-languages/lunr.zh.js')
110+
}
111+
112+
async function initLanguage(lang: string) {
113+
if (lang !== 'en') {
114+
const { default: init } = await langMap[lang]()
115+
init(lunr)
116+
}
117+
}

templates/package-lock.json

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

templates/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"jquery": "3.7.0",
3535
"lit-html": "^3.0.0",
3636
"lunr": "2.3.9",
37+
"lunr-languages": "^1.14.0",
3738
"mathjax": "^3.2.2",
3839
"mermaid": "^10.5.0"
3940
},

0 commit comments

Comments
 (0)