plantuml-server/src/main/webapp/js/language/completion/emojis.js

56 lines
2.2 KiB
JavaScript

/**********************************************
* PlantUML Language Emoji Completion Provider *
***********************************************/
PlantUmlLanguageFeatures.prototype.getEmojis = (function(){
let emojis = undefined;
return async function() {
if (emojis === undefined) {
emojis = await PlantUmlLanguageFeatures.makeRequest("GET", "ui-helper?request=emojis");
}
return emojis;
}
})();
PlantUmlLanguageFeatures.prototype.registerEmojiCompletion = function() {
const createEmojiProposals = async (range, filter = undefined) => {
const emojis = await this.getEmojis();
return emojis?.filter(([unicode, name]) => filter ? unicode.includes(filter) || name?.includes(filter) : true)
.map(([unicode, name]) => {
// NOTE: load images direct from GitHub source: https://github.com/twitter/twemoji#download
const emojiUrl = "https://raw.githubusercontent.com/twitter/twemoji/gh-pages/v/13.1.0/svg/" + unicode + ".svg";
const docHint = (name) ? name + " (" + unicode + ")" : unicode;
const isUnicode = !name || (filter && unicode.includes(filter));
const label = isUnicode ? unicode : name;
return {
label: label,
kind: monaco.languages.CompletionItemKind.Constant,
documentation: {
//supportHtml: true, // also a possibility but quite limited html
value: "![emoji](" + emojiUrl + ")   " + docHint
},
insertText: label + ":>",
range: range
};
}) || [];
};
monaco.languages.registerCompletionItemProvider(PlantUmlLanguageFeatures.languageSelector, {
triggerCharacters: [":"],
provideCompletionItems: async (model, position) => {
const textUntilPosition = model.getValueInRange({
startLineNumber: position.lineNumber,
startColumn: 1,
endLineNumber: position.lineNumber,
endColumn: position.column,
});
const match = textUntilPosition.match(/<:([^\s>]*)$/);
if (match) {
const suggestions = await createEmojiProposals(this.getWordRange(model, position), match[1]);
return { suggestions };
}
return { suggestions: [] };
}
});
};