0% found this document useful (0 votes)
138 views14 pages

Code Script Tampermonkey

The document describes a userscript for improving autocomplete on AnimeMusicQuiz. It defines several classes and functions to handle autocomplete suggestions. The main classes are EntrySet which handles matching entries based on configuration, FilterManager which manages the list of entries and autocomplete logic, and SortedList/SuperString which are used to efficiently search entry strings. The script allows for flexible matching based on starts with, contains, partial matching, and special characters.

Uploaded by

patebolooucarbo
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
138 views14 pages

Code Script Tampermonkey

The document describes a userscript for improving autocomplete on AnimeMusicQuiz. It defines several classes and functions to handle autocomplete suggestions. The main classes are EntrySet which handles matching entries based on configuration, FilterManager which manages the list of entries and autocomplete logic, and SortedList/SuperString which are used to efficiently search entry strings. The script allows for flexible matching based on starts with, contains, partial matching, and special characters.

Uploaded by

patebolooucarbo
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd

// ==UserScript==

// @name Amq Autocomplete improvement


// @namespace [Link]
// @version 1.25
// @description faster and better autocomplete
// First searches for text startingWith, then includes and finally if input words
match words in anime (in any order). Special characters can be in any place in any
order
// @author Juvian
// @match [Link]
// @require
[Link]
// @grant none
// @copyright MIT license
// ==/UserScript==

let isNode = typeof window === 'undefined';

if (!isNode && typeof Listener === 'undefined') throw "rip";

if (isNode) {
FuzzySet = require('[Link]')
}

const cleanString = (str) => {


return removeDiacritics(str).replace(/[^\w\s]/gi, ' ').replace(/ +/g, '
').toLowerCase().trim();
}

const semiCleanString = (str) => {


return removeDiacritics(str).replace(/ +/g, ' ').toLowerCase().trim();
}

const onlySpecialChars = (str) => {


return [Link](/[\w\s]/gi, '').split('').sort().join('');
}

var options = {
highlight: true, // highlight or not the match
sorting : "partial", // Sets the order of the anime in the dropdown. total
sorts by last seen date order. Partial puts first the ones seen. Any other thing is
amq default
sortList: true, // true = consider matching animes by last seen order (after
checking startsWith)
allowRightLeftArrows: false, // use right and left arrows to move dropdown
selected options
daysToRemember: 90, // sets amount of days to consider an anime as seen in
sorting,
fuzzy: {
dropdown: true, // whether to show fuzzy matches if no matches found
answer: true, // whether to use top fuzzy match on round end as answer
if no matches found
},
addEntries: true, // whether to allow oo, ou and uu as ō/ū,
entrySets: [
{
startsWith: true, //change to true if you want more specific
results
contains: true, //change to true if you want more specific
results
partial: false, //not recommended to change
clean: semiCleanString // does not remove special characters so
you can filter with it
},
{
startsWith: true, // allow startsWith priotization (fastest
matching)
contains: true, // allow to search by contains
partial: true, // allow the words to be on any order (no hero
boku will match boku no hero),
clean: cleanString,
special: onlySpecialChars // adds filtering special chars instead
of just ignoring
},
]
}

var debug = false;

function log(msg) {
if(debug) [Link](msg)
}

var storedData = {}

if (!isNode && [Link]) {


storedData = [Link]([Link]("storedData") || "{}");
}

class SortedList {
constructor(list) {
[Link] = [Link](list);
[Link]();
}

alphabeticalSort (list) {
return [Link](function(a, b){
if ([Link] < [Link])
return -1;
if ([Link] > [Link])
return 1;
return 0;
});
}

reset() {
[Link] = 0;
[Link] = [Link];
}
}

class SuperString {
constructor(list) {
[Link] = [Link]("$$$");

[Link] = [{str: 0}];


for (var i = 0; i < [Link]; i++) {
[Link]({str: [Link][i].str + list[i].length + 3})
}

[Link]();
}

clone() {
let superString = new SuperString([]);
[Link](superString, this);
return superString;
}

reset() {
[Link] = 0;
}
}
//, specialStr: onlySpecialChars(v), splittedStr: cleanString(v).split(" ")

class EntrySet {
constructor(list, config, manager) {
[Link] = list;
[Link] = manager;
[Link] = new SortedList([Link] ? list : []);
[Link] = new SuperString([Link] || [Link] ?
[Link](v => [Link]) : []);
[Link] = [Link]();
[Link] = config;

if ([Link]) [Link](e => [Link] =


[Link](' '));

[Link] = new Set();


}

reset() {
[Link]();
[Link]();
[Link]();

[Link] = "";
[Link] = "";
[Link] = [];
[Link]();
[Link] = 0;
}

partialMatches (idx) {
var animeSplitted = [Link][idx].splittedStr;

if ([Link]((v) => [Link][idx].[Link](v) != -


1)) {
var used = [Link](v => false);
var matches = []
for (var i = 0; i < [Link]; i++) {
[Link]([])
for (var j = 0; j < [Link]; j++) {

matches[i].push(animeSplitted[j].indexOf([Link][i]) != -1);
}
}
return [Link](0, matches, used);
}
}

matches (currentIndex, matches, used) {


if (currentIndex == [Link]) return true;

for (var i = 0; i < matches[0].length; i++) {


if (!used[i] && matches[currentIndex][i]) {
used[i] = true;
if ([Link](currentIndex + 1, matches, used)) return
true;
used[i] = false;
}
}

return false;
}

setQuery(str) {
let specialStr = [Link] ? [Link](str) : '';
str = [Link](str);

if (![Link]([Link]) || ([Link] && !


specialMatchesStr([Link], specialStr))) [Link]();

[Link] = str;
[Link] = [Link](" ").filter((s) => [Link]());
[Link] = specialStr;
}

specialMatches(idx) {
return ![Link] || specialMatchesStr([Link],
[Link][idx].specialStr);
}

addResult(idx) {
if ([Link](idx) && (![Link] ||
[Link](idx))) {
[Link](idx);
[Link]([Link][idx].originalIndex)
}
}

checkOldResults() {
let oldResults = [Link]([Link]);

[Link]();

for (let idx of oldResults) {


let anime = [Link][idx].str;
if ([Link]([Link]) != -1 || ([Link] &&
[Link](idx))) [Link](idx);
}
}

addResults (range) {
for (var i = [Link]; i <= [Link] &&
[Link] < [Link]; i++) {
[Link](i);
}
}

addContainingResults (superString, qry) {


let re = new RegExp(escapeRegExp(qry), "g")
let match;

[Link] = [Link]
while ([Link] < [Link] &&
(match = [Link]([Link]))) {
let idx = first([Link], v => v > [Link], 0,
[Link]) - 1
[Link](idx);
[Link] = [Link];
}
}
}

class FilterManager {
constructor (list, limit, opts) {
[Link] = [Link](v => [Link]().length).map((v, idx) => ({idx:
idx, originalStr: v, originalIndex: idx}));
[Link] = limit
[Link] = {}
[Link] = [Link]({}, options, opts || {});
[Link] = new Date(); [Link]([Link]() -
[Link]);

[Link]();

if ([Link]) {
[Link] = [Link]([Link]);
}

[Link]((v, idx) => [Link] = idx);

[Link]();

if ([Link] || [Link]) {
let cleaned = [Link](v => cleanString([Link]));
[Link] = FuzzySet(cleaned);
[Link] = {}
[Link]((v, idx) => {
[Link][cleaned[idx]] =
[Link][cleaned[idx]] || []
[Link][cleaned[idx]].push([Link])
});
}

[Link] = new Set();

[Link]();
}

addEntries() {
if (![Link]) return;
[Link](e => [Link]('ō') ||
[Link]('ū')).forEach(e => {
let additional = [""];
for (let i = 0; i < [Link]; i++) {
if ([Link][i] == 'ō') {
additional = [Link](s => s +
'oo').concat([Link](s => s + 'ou'));
} else if ([Link][i] == 'ū') {
additional = [Link](s => s + 'uu');
} else {
additional = [Link](s => s + [Link][i]);
}
}
[Link] = [Link]([Link]((v, idx) => ({str: v,
idx: [Link], originalStr: [Link], originalIndex: [Link]})));
});
}

addEntrySets() {
[Link] = [];

let cache = new Set();


for (let entrySet of [Link]) {
if ([Link] || [Link] || [Link])
{
let list = [Link]((e, idx) => ({str:
[Link]([Link] || [Link]), specialStr: [Link] ?
[Link]([Link] || [Link]) : '', originalIndex: [Link],
listIndex: [Link]})).filter(e => {
if ([Link]([Link] + '|||' + [Link])) return
false;
return [Link]([Link] + '|||' + [Link]);
});
[Link](new EntrySet(list, entrySet, this));
}
}
}

getLastSeen(anime) {
return storedData[[Link]()] >= [Link]() ?
storedData[[Link]()] : 1
}

sortBySeen(arr) {
return [Link]((v) => ({val : v, d:
[Link]([Link])})).sort(function(a, b){
if (a.d < b.d) return 1;
if (b.d < a.d) return -1;
if ([Link] < [Link]) return -1;
return 1;
}).map((v) => [Link]);
}

reset () {
[Link](e => [Link]());
[Link]();
}

checkOldResults() {
[Link]();
[Link](e => [Link]());
}

processResultsFor(str) {
[Link](e => [Link](str));
[Link] = str;
[Link]();

for (let entrySet of [Link]) {


if ([Link] && [Link]) {
[Link](range([Link],
[Link]));
}
}

for (let entrySet of [Link]) {


if ([Link] && [Link]) {
[Link]([Link],
[Link]);
}
if (![Link] && [Link]) {
for (; [Link] < [Link] &&
[Link] < [Link]; [Link]++) {
[Link]([Link]);
}
}
}

for (let entrySet of [Link]) {


if ([Link] && [Link] >= 2)
{
let qry = [Link]((s) =>
[Link]()).sort((a, b) => [Link] - [Link])[0];
[Link]([Link], qry);
}
}
}

filterBy (str, fuzzy) {


if(debug) [Link](str + " filter")

if ([Link]().length == 0) return [];


[Link](str);

let results = [];


let s = new Set();

for (let entrySet of [Link]) {


for (let idx of [Link]) {
if (![Link]([Link][idx].originalIndex)) {
[Link]({lastQry: [Link], match:
[Link][idx], listMatch: [Link][[Link][idx].listIndex]});
[Link]([Link][idx].originalIndex);
}
}
}

//add fuzzy results


if ([Link] == 0 && fuzzy) {
let fuzzyResults = new Set(([Link](cleanString(str)) ||
[]).slice(0, [Link]).map(r => [Link][r[1]]).reduce((acc, val) =>
[Link](val), []).slice(0, [Link]));
for (let idx of [Link](fuzzyResults)) {
if (![Link]([Link][idx].originalIndex)) {
[Link]({match: [Link][idx], listMatch:
[Link][idx], lastQry: str})
[Link]([Link][idx].originalIndex);
}
}
}

if(debug) [Link](str + " filter")

return results
}
}

const specialMatchesStr = (qry, strToMatch) => {


let curIdx = 0;

for (let i = 0; strToMatch && i < [Link] && curIdx < [Link] &&
strToMatch[i] <= qry[curIdx]; i++) {
if (strToMatch[i] == qry[curIdx]) {
curIdx++;
}
}

return curIdx == [Link];


}

const range = (data, lastQry) => {


let firstIndex = first([Link], f => f >= lastQry, [Link], [Link]);

if (firstIndex < [Link] && [Link][firstIndex].[Link](lastQry)) {


return {
first: firstIndex,
last: first([Link], f => ![Link](lastQry), firstIndex,
[Link]) - 1,
list: [Link]
}
}

return {
first: [Link],
last: [Link] - 1, // on purpose
list: [Link]
}
}

const first = (array, pred, lo, hi) => {


while (lo != hi) {
const mi = lo + ((hi - lo) >> 1);
if (pred(array[mi].str)) {
hi = mi;
} else {
lo = mi + 1;
}
}
return hi;
}

class HightLightManager {
constructor (awesomeplete) {
$([Link]).on("awesomplete-highlight", function(event) {
[Link] = [Link];
})
}
}

if (!isNode) {

var oldProto = [Link];


var oldEvaluate = [Link];

AmqAwesomeplete = function(input, o) {
[Link](this, [Link](arguments))
[Link] = this._list.indexOf("Serial Experiments
Lain") != -1;
if ([Link]) [Link]();
}

[Link] = oldProto;

[Link] = function () {
[Link] = new FilterManager(this._list.sort([Link]),
[Link]);
[Link] = new HightLightManager(this);

if ([Link]) {
$([Link]).on("keydown", (e) => {
if ([Link] == 37) [Link]()
else if ([Link] == 39) [Link]();
})
}
}

[Link] = function () {
if ([Link] == false) return [Link](this);

let suggestions = [Link]([Link],


[Link]);

suggestions = [Link]((v) => ({v: v, d:


[Link]([Link])}));

if (![Link]) suggestions =
[Link]((a, b) => {
if ([Link] == "partial" || [Link] == "total") {
if (a.d != 1 && b.d == 1) return -1;
if (a.d == 1 && b.d != 1) return 1;
}
if ([Link] == "total") {
if (a.d < b.d) return 1;
if (b.d < a.d) return -1;
}

if ([Link] !== false) {


if ([Link] < [Link]) return -1;
}

return 1;
})

[Link] = [Link](v => new


Suggestion([Link]([Link], [Link])));

log([Link])

$("#qpAnswerInputLoadingContainer").removeClass("hide");
this.$[Link]('li').remove();

for (let i = [Link] - 1; i >= 0; i--) {


[Link]([Link]([Link][i],
[Link] ? suggestions[i].[Link] : "", i), [Link]);
}

if ([Link] === 0) {

[Link] = "No results found";

[Link]({ reason: "nomatches" });

} else {
[Link]();

[Link] = [Link] + " results


found";
}

$("#qpAnswerInputLoadingContainer").addClass("hide");
};

//auto send incomplete answer


var oldSendAnwer = [Link];

[Link] = function () {
try{
var awesome = [Link];

if(awesome && [Link] ==


[Link] && [Link] && [Link]()
&& [Link](s => cleanString([Link]) !=
cleanString([Link])) && ([Link] || (!
[Link] && [Link]))) {
[Link] = [Link] ?
[Link][0].value : [Link]([Link],
true)[0].originalStr;
}
} catch (ex) {
[Link](ex);
}
[Link](this, [Link](arguments))
}

new Listener("answer results", function (result) {


for (var lang in [Link]) {
storedData[[Link][lang].toLowerCase()] = new
Date().getTime();
}

log(storedData)

}).bindListener();

new Listener("quiz end result", function (payload) {


if (localStorage) [Link]("storedData",
[Link](storedData))
}).bindListener();
}

var defaultDiacriticsRemovalMap = [
{'base':'A', 'letters':'\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\
u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\
u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F'},
{'base':'AA','letters':'\uA732'},
{'base':'AE','letters':'\u00C6\u01FC\u01E2'},
{'base':'AO','letters':'\uA734'},
{'base':'AU','letters':'\uA736'},
{'base':'AV','letters':'\uA738\uA73A'},
{'base':'AY','letters':'\uA73C'},
{'base':'B', 'letters':'\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\
u0181'},
{'base':'C', 'letters':'\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\
u0187\u023B\uA73E'},
{'base':'D', 'letters':'\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\
u0110\u018B\u018A\u0189\uA779\u00D0'},
{'base':'DZ','letters':'\u01F1\u01C4'},
{'base':'Dz','letters':'\u01F2\u01C5'},
{'base':'E', 'letters':'\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\
u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\
u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E'},
{'base':'F', 'letters':'\u0046\u24BB\uFF26\u1E1E\u0191\uA77B'},
{'base':'G', 'letters':'\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\
u0122\u01E4\u0193\uA7A0\uA77D\uA77E'},
{'base':'H', 'letters':'\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\
u1E2A\u0126\u2C67\u2C75\uA78D'},
{'base':'I', 'letters':'\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\
u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197'},
{'base':'J', 'letters':'\u004A\u24BF\uFF2A\u0134\u0248'},
{'base':'K', 'letters':'\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\
u2C69\uA740\uA742\uA744\uA7A2'},
{'base':'L', 'letters':'\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\
u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780'},
{'base':'LJ','letters':'\u01C7'},
{'base':'Lj','letters':'\u01C8'},
{'base':'M', 'letters':'\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C'},
{'base':'N', 'letters':'\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\
u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4'},
{'base':'NJ','letters':'\u01CA'},
{'base':'Nj','letters':'\u01CB'},
{'base':'O', 'letters':'\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\
u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\
u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\
u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C'},
{'base':'OI','letters':'\u01A2'},
{'base':'OO','letters':'\uA74E'},
{'base':'OU','letters':'\u0222'},
{'base':'OE','letters':'\u008C\u0152'},
{'base':'oe','letters':'\u009C\u0153'},
{'base':'P', 'letters':'\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\
uA754'},
{'base':'Q', 'letters':'\u0051\u24C6\uFF31\uA756\uA758\u024A'},
{'base':'R', 'letters':'\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\
u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782'},
{'base':'S', 'letters':'\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\
u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784'},
{'base':'T', 'letters':'\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\
u1E6E\u0166\u01AC\u01AE\u023E\uA786'},
{'base':'TZ','letters':'\uA728'},
{'base':'U', 'letters':'\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\
u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\
u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244'},
{'base':'V', 'letters':'\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245'},
{'base':'VY','letters':'\uA760'},
{'base':'W', 'letters':'\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\
u2C72'},
{'base':'X', 'letters':'\u0058\u24CD\uFF38\u1E8A\u1E8C'},
{'base':'Y', 'letters':'\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\
u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE'},
{'base':'Z', 'letters':'\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\
u01B5\u0224\u2C7F\u2C6B\uA762'},
{'base':'a', 'letters':'\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\
u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\
u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250'},
{'base':'aa','letters':'\uA733'},
{'base':'ae','letters':'\u00E6\u01FD\u01E3'},
{'base':'ao','letters':'\uA735'},
{'base':'au','letters':'\uA737'},
{'base':'av','letters':'\uA739\uA73B'},
{'base':'ay','letters':'\uA73D'},
{'base':'b', 'letters':'\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\
u0253'},
{'base':'c', 'letters':'\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\
u0188\u023C\uA73F\u2184'},
{'base':'d', 'letters':'\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\
u0111\u018C\u0256\u0257\uA77A'},
{'base':'dz','letters':'\u01F3\u01C6'},
{'base':'e', 'letters':'\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\
u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\
u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD'},
{'base':'f', 'letters':'\u0066\u24D5\uFF46\u1E1F\u0192\uA77C'},
{'base':'g', 'letters':'\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\
u0123\u01E5\u0260\uA7A1\u1D79\uA77F'},
{'base':'h', 'letters':'\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\
u1E2B\u1E96\u0127\u2C68\u2C76\u0265'},
{'base':'hv','letters':'\u0195'},
{'base':'i', 'letters':'\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\
u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131'},
{'base':'j', 'letters':'\u006A\u24D9\uFF4A\u0135\u01F0\u0249'},
{'base':'k', 'letters':'\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\
u2C6A\uA741\uA743\uA745\uA7A3'},
{'base':'l', 'letters':'\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\
u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747'},
{'base':'lj','letters':'\u01C9'},
{'base':'m', 'letters':'\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F'},
{'base':'n', 'letters':'\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\
u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5'},
{'base':'nj','letters':'\u01CC'},
{'base':'o', 'letters':'\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\
u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\
u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\
u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275'},
{'base':'oi','letters':'\u01A3'},
{'base':'ou','letters':'\u0223'},
{'base':'oo','letters':'\uA74F'},
{'base':'p','letters':'\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\
uA755'},
{'base':'q','letters':'\u0071\u24E0\uFF51\u024B\uA757\uA759'},
{'base':'r','letters':'\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\
u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783'},
{'base':'s','letters':'\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\
u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B'},
{'base':'t','letters':'\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\
u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787'},
{'base':'tz','letters':'\uA729'},
{'base':'u','letters': '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\
u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\
u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289'},
{'base':'v','letters':'\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C'},
{'base':'vy','letters':'\uA761'},
{'base':'w','letters':'\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\
u1E89\u2C73'},
{'base':'x','letters':'\u0078\u24E7\uFF58\u1E8B\u1E8D'},
{'base':'y','letters':'\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\
u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF'},
{'base':'z','letters':'\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\
u01B6\u0225\u0240\u2C6C\uA763'}
];

var diacriticsMap = {};

for (var i=0; i < [Link]; i++){


var letters = defaultDiacriticsRemovalMap[i].letters;
for (var j=0; j < [Link] ; j++){
diacriticsMap[letters[j]] = defaultDiacriticsRemovalMap[i].base;
}
}

diacriticsMap["×"] = "x";
diacriticsMap["³"] = "3";
diacriticsMap["ß"] = "b";
diacriticsMap["–"] = "-";
diacriticsMap["²"] = "2";
diacriticsMap["’"] = "'";
diacriticsMap["@"] = "a";
diacriticsMap["æ"] = "a";
diacriticsMap["ñ"] = "n";

// "what?" version ... [Link]


function removeDiacritics (str) {
return [Link](/[^a-z]/gi, function(a){
return diacriticsMap[a] || a;
});
}

if (isNode) {
storedData["oh my kokoro"] = new Date().getTime()

let l = new FilterManager(["o", "asd", "asd!", "asd!!*hi", "o", "tt", "oh my


kokoro", "kokoro", "ktrōk"], 15);

escapeRegExp = (v) => [Link](/[.*+?^${}()|[\]\\]/g, '\\$&');


search = (str, len, first, fuzzy) => {
s = [Link](str, fuzzy);
if ([Link] != len || (len > 0 && first !==
s[0].[Link])) {
throw [Link](s, str, len)
}
return s
}

expect = (s, str) => {


if ([Link](s)[0] !== str) [Link](str)
}

search("s", 3, "asd")
search("!s", 2, "asd!")
search("*", 1, "asd!!*hi")
search("*!", 1, "asd!!*hi")
search("!*", 1, "asd!!*hi")
search("!asd!*hi", 1, "asd!!*hi")
search("ko", 2, "kokoro")
search("kororo", 2, "kokoro", true)
search("ads", 3, "asd", true)
search("ktr", 1, "ktrōk")

l = new FilterManager(["Kiss×sis", "Chōon Senshi Borgman: Lovers Rain",


"idolm@aster"], 15)
search("kissx", 1, "Kiss×sis")
search("ooo", 1, "Chōon Senshi Borgman: Lovers Rain")
search("idolma", 1, "idolm@aster")

l = new FilterManager(["asd!", "asd!!*hi"], 15, {entrySets: [{contains: true,


clean: semiCleanString}]});
search("!", 2, "asd!")
search("!*", 1, "asd!!*hi")
search("*!", 0, "")

[Link] = {FilterManager, options}


}

You might also like