From 9f68d7644774efea0777152a829029f9c59a42c7 Mon Sep 17 00:00:00 2001 From: romflorentz Date: Sun, 23 Apr 2023 22:44:01 +0200 Subject: [PATCH] Add armenian support --- README.md | 1 + build/build.js | 2 + lunr.hy.js | 98 ++++++++++++++++++++++++++++++++ min/lunr.hy.min.js | 1 + test/VersionsAndLanguagesTest.js | 5 +- test/testdata/hy.js | 36 ++++++++++++ 6 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 lunr.hy.js create mode 100644 min/lunr.hy.min.js create mode 100644 test/testdata/hy.js diff --git a/README.md b/README.md index 05fed6b..eb82355 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ Lunr Languages is a [Lunr](http://lunrjs.com/) addon that helps you search in do * ![](https://raw.githubusercontent.com/madebybowtie/FlagKit/master/Assets/PNG/CN.png) Chinese * ![](https://raw.githubusercontent.com/madebybowtie/FlagKit/master/Assets/PNG/IN.png) Tamil * ![](https://raw.githubusercontent.com/madebybowtie/FlagKit/master/Assets/PNG/KR.png) Korean +* ![](https://raw.githubusercontent.com/madebybowtie/FlagKit/master/Assets/PNG/AM.png) Armenian * [Contribute with a new language](CONTRIBUTING.md) Lunr Languages is compatible with Lunr version `0.6`, `0.7`, `1.0` and `2.X`. diff --git a/build/build.js b/build/build.js index cf9fb17..953fe62 100644 --- a/build/build.js +++ b/build/build.js @@ -134,6 +134,8 @@ var list = [ locale: 'zh', }, { locale: 'ko', +}, { + locale: 'hy', } ]; diff --git a/lunr.hy.js b/lunr.hy.js new file mode 100644 index 0000000..3336e0f --- /dev/null +++ b/lunr.hy.js @@ -0,0 +1,98 @@ +/*! + * Lunr languages, `Armenian` language + * https://github.com/turbobit/lunr-languages + * + * Copyright 2021, Manikandan Venkatasubban + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.hy = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.hy.trimmer, + lunr.hy.stopWordFilter + ); + }; + + /* lunr trimmer function */ + // http://www.unicode.org/charts/ + lunr.hy.wordCharacters = "[" + + "A-Za-z" + + "\u0530-\u058F" + // armenian alphabet + "\uFB00-\uFB4F" + // armenian ligatures + "]"; + lunr.hy.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.hy.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.hy.trimmer, 'trimmer-hy'); + + + /* lunr stop word filter */ + // https://www.ranks.nl/stopwords/armenian + lunr.hy.stopWordFilter = lunr.generateStopWordFilter('դու և եք էիր էիք հետո նաև նրանք որը վրա է որ պիտի են այս մեջ ն իր ու ի այդ որոնք այն կամ էր մի ես համար այլ իսկ էին ենք հետ ին թ էինք մենք նրա նա դուք եմ էի ըստ որպես ում'.split(' ')); + lunr.Pipeline.registerFunction(lunr.hy.stopWordFilter, 'stopWordFilter-hy'); + + /* lunr stemmer function */ + lunr.hy.stemmer = (function() { + + return function(word) { + // for lunr version 2 + if (typeof word.update === "function") { + return word.update(function(word) { + return word; + }) + } else { // for lunr version <= 1 + return word; + } + + } + })(); + lunr.Pipeline.registerFunction(lunr.hy.stemmer, 'stemmer-hy'); + }; +})) \ No newline at end of file diff --git a/min/lunr.hy.min.js b/min/lunr.hy.min.js new file mode 100644 index 0000000..b37f792 --- /dev/null +++ b/min/lunr.hy.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWordFilter)},e.hy.wordCharacters="[A-Za-z԰-֏ff-ﭏ]",e.hy.trimmer=e.trimmerSupport.generateTrimmer(e.hy.wordCharacters),e.Pipeline.registerFunction(e.hy.trimmer,"trimmer-hy"),e.hy.stopWordFilter=e.generateStopWordFilter("դու և եք էիր էիք հետո նաև նրանք որը վրա է որ պիտի են այս մեջ ն իր ու ի այդ որոնք այն կամ էր մի ես համար այլ իսկ էին ենք հետ ին թ էինք մենք նրա նա դուք եմ էի ըստ որպես ում".split(" ")),e.Pipeline.registerFunction(e.hy.stopWordFilter,"stopWordFilter-hy"),e.hy.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}(),e.Pipeline.registerFunction(e.hy.stemmer,"stemmer-hy")}}); \ No newline at end of file diff --git a/test/VersionsAndLanguagesTest.js b/test/VersionsAndLanguagesTest.js index a309232..923a5b4 100644 --- a/test/VersionsAndLanguagesTest.js +++ b/test/VersionsAndLanguagesTest.js @@ -30,9 +30,11 @@ var testDocuments = { fr: require('./testdata/fr'), hi: require('./testdata/hi'), hu: require('./testdata/hu'), + hy: require('./testdata/hy'), it: require('./testdata/it'), ja: require('./testdata/ja'), jp: require('./testdata/ja'), + ko: require('./testdata/ko'), no: require('./testdata/no'), pt: require('./testdata/pt'), ro: require('./testdata/ro'), @@ -42,8 +44,7 @@ var testDocuments = { tr: require('./testdata/tr'), th: require('./testdata/th'), vi: require('./testdata/vi'), - zh: require('./testdata/zh'), - ko: require('./testdata/ko') + zh: require('./testdata/zh') }; lunrVersions.forEach(function(lunrVersion) { diff --git a/test/testdata/hy.js b/test/testdata/hy.js new file mode 100644 index 0000000..b627f99 --- /dev/null +++ b/test/testdata/hy.js @@ -0,0 +1,36 @@ +module.exports = { + fields: [ + { + name: 'title', + config: { boost: 10 } + }, { + name: 'body' + } + ], + documents: [ + { + "title": "test", + "body": "Դուք չեք կարող փորձել աղալ միսը պատահականորեն, քանի որ ոչ բոլոր միսն է նույնը: Օրինակ՝ խոզի փորը աղալիս կարեւոր բաներ կան։", + "id": 1 + }, { + "title": "թեստ", + "body": "test Այն չի տրամադրում կորեերեն stop լեզվի տվյալներ: Դա պայմանավորված է նրանով, որ դուք կարող եք հեռացնել անհարկի հետաքննությունները եւ զուգակցումները տոկենիզացիայի փուլում:", + "id": 2 + }, + ], + tests: [ + { + what: "find the word %w", + search: "test", + found: 2 + }, { + what: "find the word %w", + search: "միսը", + found: 1 + }, { + what: "never find a word that does not exist, like %w", + search: "ձուկ", + found: 0 + } + ] +}