76 lines
2.0 KiB
JavaScript
76 lines
2.0 KiB
JavaScript
import Controller from "@ember/controller";
|
|
import ModalFunctionality from "discourse/mixins/modal-functionality";
|
|
import discourseComputed from "discourse-common/utils/decorators";
|
|
import { equal } from "@ember/object/computed";
|
|
import {
|
|
createWatchedWordRegExp,
|
|
toWatchedWord,
|
|
} from "discourse-common/utils/watched-words";
|
|
|
|
export default Controller.extend(ModalFunctionality, {
|
|
isReplace: equal("model.nameKey", "replace"),
|
|
isTag: equal("model.nameKey", "tag"),
|
|
isLink: equal("model.nameKey", "link"),
|
|
|
|
@discourseComputed(
|
|
"value",
|
|
"model.compiledRegularExpression",
|
|
"model.words",
|
|
"isReplace",
|
|
"isTag",
|
|
"isLink"
|
|
)
|
|
matches(value, regexpList, words, isReplace, isTag, isLink) {
|
|
if (!value || regexpList.length === 0) {
|
|
return [];
|
|
}
|
|
|
|
if (isReplace || isLink) {
|
|
const matches = [];
|
|
words.forEach((word) => {
|
|
const regexp = createWatchedWordRegExp(word);
|
|
let match;
|
|
|
|
while ((match = regexp.exec(value)) !== null) {
|
|
matches.push({
|
|
match: match[1],
|
|
replacement: word.replacement,
|
|
});
|
|
}
|
|
});
|
|
return matches;
|
|
} else if (isTag) {
|
|
const matches = {};
|
|
words.forEach((word) => {
|
|
const regexp = createWatchedWordRegExp(word);
|
|
let match;
|
|
|
|
while ((match = regexp.exec(value)) !== null) {
|
|
if (!matches[match[1]]) {
|
|
matches[match[1]] = new Set();
|
|
}
|
|
|
|
let tags = matches[match[1]];
|
|
word.replacement.split(",").forEach((tag) => {
|
|
tags.add(tag);
|
|
});
|
|
}
|
|
});
|
|
|
|
return Object.entries(matches).map((entry) => ({
|
|
match: entry[0],
|
|
tags: Array.from(entry[1]),
|
|
}));
|
|
} else {
|
|
let matches = [];
|
|
regexpList.forEach((regexp) => {
|
|
const wordRegexp = createWatchedWordRegExp(toWatchedWord(regexp));
|
|
|
|
matches.push(...(value.match(wordRegexp) || []));
|
|
});
|
|
|
|
return matches;
|
|
}
|
|
},
|
|
});
|