Files
SnowLuma/.pnpm-store/v11/files/40/3d07aacbb74e31f82cd35ef777f11c9757e9d1416041af4e84a27842884e922e8bfd35c1f9789931b1f89bad3be760e97c1b7107ee98ead2144263fe61c16c
TanTan 2a69b23b47
Dev Build / cleanup (push) Canceled after 0s
Dev Build / typecheck (push) Canceled after 0s
Dev Build / build (linux-arm64, ubuntu-24.04-arm, linux-arm64) (push) Canceled after 0s
Dev Build / build (linux-x64, ubuntu-latest, linux-x64) (push) Canceled after 0s
Dev Build / build (win-x64, windows-latest, win32-x64) (push) Canceled after 0s
Dev Build / dispatch-dev-docker (push) Skipped
docs: 仓库链接指向本镜像仓库
2026-11-13 09:27:07 +08:00

90 lines
2.9 KiB
Plaintext

import bruteforceMatcher from './matcher/bruteforce/feedback.mjs';
import dateMatcher from './matcher/date/feedback.mjs';
import dictionaryMatcher from './matcher/dictionary/feedback.mjs';
import regexMatcher from './matcher/regex/feedback.mjs';
import repeatMatcher from './matcher/repeat/feedback.mjs';
import sequenceMatcher from './matcher/sequence/feedback.mjs';
import spatialMatcher from './matcher/spatial/feedback.mjs';
import separatorMatcher from './matcher/separator/feedback.mjs';
import wordSequenceMatcher from './matcher/wordSequence/feedback.mjs';
const defaultFeedback = {
warning: null,
suggestions: []
};
/*
* -------------------------------------------------------------------------------
* Generate feedback ---------------------------------------------------------------
* -------------------------------------------------------------------------------
*/
class Feedback {
constructor(options) {
this.options = options;
this.matchers = {};
this.defaultFeedback = {
warning: null,
suggestions: []
};
this.setDefaultSuggestions();
this.matchers = {
bruteforce: bruteforceMatcher,
date: dateMatcher,
dictionary: dictionaryMatcher,
regex: regexMatcher,
repeat: repeatMatcher,
sequence: sequenceMatcher,
spatial: spatialMatcher,
separator: separatorMatcher,
wordSequence: wordSequenceMatcher
};
Object.entries(this.options.matchers).forEach(([key, matcher]) => {
if (matcher.feedback) {
this.matchers[key] = matcher.feedback;
}
});
}
setDefaultSuggestions() {
this.defaultFeedback.suggestions.push(this.options.translations.suggestions.useWords, this.options.translations.suggestions.noNeed);
}
getFeedback(score, sequence) {
if (sequence.length === 0) {
return this.defaultFeedback;
}
if (score > 2) {
return defaultFeedback;
}
const extraFeedback = this.options.translations.suggestions.anotherWord;
const longestMatch = this.getLongestMatch(sequence);
let feedback = this.getMatchFeedback(longestMatch, sequence.length === 1);
if (feedback !== null && feedback !== undefined) {
feedback.suggestions.unshift(extraFeedback);
} else {
feedback = {
warning: null,
suggestions: [extraFeedback]
};
}
return feedback;
}
getLongestMatch(sequence) {
let longestMatch = sequence[0];
// ignore first entry
for (let i = 1; i < sequence.length; i += 1) {
const match = sequence[i];
if (match.token.length > longestMatch.token.length) {
longestMatch = match;
}
}
return longestMatch;
}
getMatchFeedback(match, isSoleMatch) {
if (this.matchers[match.pattern]) {
return this.matchers[match.pattern](this.options, match, isSoleMatch);
}
return defaultFeedback;
}
}
export { Feedback as default };
//# sourceMappingURL=Feedback.mjs.map