PageSourceSearch

https://xiaoshame.github.io/js/lunr.zh.js

js xiaoshame.github.io collected 2026-10-03 10:11:37 UTC 5,064 bytes, 149 lines download raw bytes

vendor: 2,956 bytes, lines 1-94
1/*!
2 * Lunr languages, `Chinese` language
3 * https://github.com/MihaiValentin/lunr-languages
4 *
5 * Copyright 2019, Felix Lian (repairearth)
6 * http://www.mozilla.org/MPL/
7 */
8/*!
9 * based on
10 * Snowball zhvaScript Library v0.3
11 * http://code.google.com/p/urim/
12 * http://snowball.tartarus.org/
13 *
14 * Copyright 2010, Oleg Mazko
15 * http://www.mozilla.org/MPL/
16 */
17
18/**
19 * export the module via AMD, CommonJS or as a browser global
20 * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
21 */
22;
23(function(root, factory) {
24  if (typeof define === 'function' && define.amd) {
25    // AMD. Register as an anonymous module.
26    define(factory)
27  } else if (typeof exports === 'object') {
28    /**
29     * Node. Does not work with strict CommonJS, but
30     * only CommonJS-like environments that support module.exports,
31     * like Node.
32     */
33    // module.exports = factory(require('@node-rs/jieba'))
34    module.exports = factory()
35  } else {
36    // Browser globals (root is window)
37    factory()(root.lunr);
38  }
39}(this, function() {
40  /**
41   * Just return a value to define the module export.
42   * This example returns an object, but the module
43   * can return a function as the exported value.
44   */
45  return function(lunr) {
46    /* throw error if lunr is not yet included */
47    if ('undefined' === typeof lunr) {
48      throw new Error('Lunr is not present. Please include / require Lunr before this script.');
49    }
50
51    /* throw error if lunr stemmer support is not yet included */
52    if ('undefined' === typeof lunr.stemmerSupport) {
53      throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.');
54    }
55
56    /*
57    Chinese tokenization is trickier, since it does not
58    take into account spaces.
59    Since the tokenization function is represented different
60    internally for each of the Lunr versions, this had to be done
61    in order to try to try to pick the best way of doing this based
62    on the Lunr version
63     */
64    var isLunr2 = lunr.version[0] == "2";
65
66    /* register specific locale function */
67    lunr.zh = function() {
68      this.pipeline.reset();
69      this.pipeline.add(
70        lunr.zh.trimmer,
71        lunr.zh.stopWordFilter,
72        lunr.zh.stemmer
73      );
74
75      // change the tokenizer for Chinese one
76      if (isLunr2) { // for lunr version 2.0.0
77        this.tokenizer = lunr.zh.tokenizer;
78      } else {
79        if (lunr.tokenizer) { // for lunr version 0.6.0
80          lunr.tokenizer = lunr.zh.tokenizer;
81        }
82        if (this.tokenizerFn) { // for lunr version 0.7.0 -> 1.0.0
83          this.tokenizerFn = lunr.zh.tokenizer;
84        }
85      }
86    };
87
88    lunr.zh.tokenizer = function(obj) {
89      if (!arguments.length || obj == null || obj == undefined) return []
90      if (Array.isArray(obj)) return obj.map(function(t) {
91        return isLunr2 ? new lunr.Token(t.toLowerCase()) : t.toLowerCase()
92      })
93
94      var tokens = [];
95      try {
96        var segmenter = new Intl.Segmenter('zh', { granularity: 'word' });
97        var str = obj.toString().trim().toLowerCase();
98        var segments = segmenter.segment(str)
99        for (seg of segments) {
100          if (seg.isWordLike) { tokens = tokens.concat(seg.segment) }
101        }
102      } catch (error) {
103        console.error(error);
104      }
105
106      tokens = tokens.filter(function(token) {
107        return !!token;
108      });
109
110      var fromIndex = 0
111
112      return tokens.map(function(token, index) {
113        if (isLunr2) {
114          var start = str.indexOf(token, fromIndex)
115
116          var tokenMetadata = {}
117          tokenMetadata["position"] = [start, token.length]
118          tokenMetadata["index"] = index
119
120          fromIndex = start
121
122          return new lunr.Token(token, tokenMetadata);
123        } else {
124          return token
125        }
126      });
127    }
128
129    /* lunr trimmer function */
130    lunr.zh.wordCharacters = "\\w\u4e00-\u9fa5";
131    lunr.zh.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.zh.wordCharacters);
132    lunr.Pipeline.registerFunction(lunr.zh.trimmer, 'trimmer-zh');
133
134    /* lunr stemmer function */
135    lunr.zh.stemmer = (function() {
136
137      /* TODO Chinese stemmer  */
138      return function(word) {
139        return word;
140      }
141    })();
142    lunr.Pipeline.registerFunction(lunr.zh.stemmer, 'stemmer-zh');
143
144    /* lunr stop word filter. see https://www.ranks.nl/stopwords/chinese-stopwords */
145    lunr.zh.stopWordFilter = lunr.generateStopWordFilter(
146      '的 一 不 在 人 有 是 为 以 于 上 他 而 后 之 来 及 了 因 下 可 到 由 这 与 也 此 但 并 个 其 已 无 小 我 们 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 从 到 得 打 凡 儿 尔 该 各 给 跟 和 何 还 即 几 既 看 据 距 靠 啦 了 另 么 每 们 嘛 拿 哪 那 您 凭 且 却 让 仍 啥 如 若 使 谁 虽 随 同 所 她 哇 嗡 往 哪 些 向 沿 哟 用 于 咱 则 怎 曾 至 致 着 诸 自'.split(' '));
147    lunr.Pipeline.registerFunction(lunr.zh.stopWordFilter, 'stopWordFilter-zh');
148  };
149}))

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.