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

59 lines
2.0 KiB
JavaScript

/**********************************************
* PlantUML Language Theme Completion Provider *
***********************************************/
PlantUmlLanguageFeatures.prototype.getThemes = (function(){
let themes = undefined;
return async function() {
if (themes === undefined) {
themes = await PlantUmlLanguageFeatures.makeRequest("GET", "ui-helper?request=themes");
}
return themes;
}
})();
PlantUmlLanguageFeatures.prototype.registerThemeCompletion = function() {
const createThemeProposals = async (range, filter = undefined) => {
const themes = await this.getThemes();
return themes?.filter(theme => filter ? theme.includes(filter) : true)
.map(theme => ({
label: theme,
kind: monaco.languages.CompletionItemKind.Text,
documentation: "PlantUML " + theme + " theme",
insertText: theme,
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,
});
if (textUntilPosition.match(/^\s*!(t(h(e(m(e)?)?)?)?)?$/)) {
return {
suggestions: [
{
label: 'theme',
kind: monaco.languages.CompletionItemKind.Keyword,
documentation: "PlantUML theme command",
insertText: 'theme',
range: this.getWordRange(model, position),
}
]
};
}
const match = textUntilPosition.match(/^\s*!theme\s+([^\s]*)$/);
if (match) {
const suggestions = await createThemeProposals(this.getWordRange(model, position), match[1]);
return { suggestions };
}
return { suggestions: [] };
}
});
};