|
@@ -9,6 +9,7 @@
|
|
import { Events } from '@converse/skeletor/src/events.js';
|
|
import { Events } from '@converse/skeletor/src/events.js';
|
|
import { converse } from "@converse/headless/converse-core";
|
|
import { converse } from "@converse/headless/converse-core";
|
|
|
|
|
|
|
|
+converse.MENTION_BOUNDARIES = ['"', '(', '<', '#', '!', '\\', '/', '+', '~', '[', '{', '^', '>'];
|
|
const u = converse.env.utils;
|
|
const u = converse.env.utils;
|
|
|
|
|
|
|
|
|
|
@@ -93,6 +94,11 @@ const helpers = {
|
|
|
|
|
|
regExpEscape (s) {
|
|
regExpEscape (s) {
|
|
return s.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
return s.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ isMention (word, ac_triggers, mention_boundaries) {
|
|
|
|
+ return (ac_triggers.includes(word[0]) ||
|
|
|
|
+ (mention_boundaries.includes(word[0]) && ac_triggers.includes(word[1])));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -245,7 +251,7 @@ export class AutoComplete {
|
|
|
|
|
|
insertValue (suggestion) {
|
|
insertValue (suggestion) {
|
|
if (this.match_current_word) {
|
|
if (this.match_current_word) {
|
|
- u.replaceCurrentWord(this.input, suggestion.value);
|
|
|
|
|
|
+ u.replaceCurrentWord(this.input, suggestion.value, converse.MENTION_BOUNDARIES);
|
|
} else {
|
|
} else {
|
|
this.input.value = suggestion.value;
|
|
this.input.value = suggestion.value;
|
|
}
|
|
}
|
|
@@ -365,7 +371,7 @@ export class AutoComplete {
|
|
this.auto_completing = true;
|
|
this.auto_completing = true;
|
|
} else if (ev.key === "Backspace") {
|
|
} else if (ev.key === "Backspace") {
|
|
const word = u.getCurrentWord(ev.target, ev.target.selectionEnd-1);
|
|
const word = u.getCurrentWord(ev.target, ev.target.selectionEnd-1);
|
|
- if (this.ac_triggers.includes(word[0])) {
|
|
|
|
|
|
+ if (helpers.isMention(word, this.ac_triggers, converse.MENTION_BOUNDARIES)) {
|
|
this.auto_completing = true;
|
|
this.auto_completing = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -387,11 +393,13 @@ export class AutoComplete {
|
|
}
|
|
}
|
|
|
|
|
|
let value = this.match_current_word ? u.getCurrentWord(this.input) : this.input.value;
|
|
let value = this.match_current_word ? u.getCurrentWord(this.input) : this.input.value;
|
|
- const contains_trigger = this.ac_triggers.includes(value[0]);
|
|
|
|
|
|
+ const contains_trigger = helpers.isMention(value, this.ac_triggers, converse.MENTION_BOUNDARIES);
|
|
if (contains_trigger) {
|
|
if (contains_trigger) {
|
|
this.auto_completing = true;
|
|
this.auto_completing = true;
|
|
if (!this.include_triggers.includes(ev.key)) {
|
|
if (!this.include_triggers.includes(ev.key)) {
|
|
- value = value.slice('1');
|
|
|
|
|
|
+ value = converse.MENTION_BOUNDARIES.includes(value[0])
|
|
|
|
+ ? value.slice('2')
|
|
|
|
+ : value.slice('1');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|