Add text completion (use SuggestionProvider) (#3974)

This commit is contained in:
Yasumichi Akahoshi
2026-03-04 02:24:37 +09:00
committed by GitHub
parent 74a9aaa31d
commit 3111ab3234
4 changed files with 84 additions and 0 deletions

View File

@@ -0,0 +1,57 @@
@(repository: gitbucket.core.service.RepositoryService.RepositoryInfo,
completionContext: String, generateScript: Boolean = true)(implicit context: gitbucket.core.controller.Context)
@import gitbucket.core.view.helpers
<style>
@gitbucket.core.plugin.PluginRegistry().getSuggestionProviders.map { provider =>
@if(provider.context.contains(completionContext)){
@if(provider.id == "emoji") {
@provider.options(repository).map { case (value, label) =>
@Html(s"""
.ace_${label.replaceAll("[^a-z0-9\\-_]", "_")}::after {
content: '';
display: inline-block;
background-image: url("${context.path}/plugin-assets/emoji/${label}.png");
width: 15px;
height: 15px;
background-size: contain;
vertical-align: middle;
}"""
)
}
}
}
}
</style>
<script>
var mdCompleters = [];
@gitbucket.core.plugin.PluginRegistry().getSuggestionProviders.map { provider =>
@if(provider.context.contains(completionContext)){
var @provider.id = @Html(helpers.json(provider.options(repository).map { case (value, label) =>
Map("value" -> (s"${provider.prefix}${value}${provider.suffix}"), "label" -> label)
}));
var @{provider.id}Completer = {
triggerCharacters: [ `@provider.prefix.charAt(0)` ],
getCompletions: function (editor, session, pos, prefix, callback) {
if (session.$mode && session.$mode.$id === 'ace/mode/markdown') {
callback(null, @{provider.id}.map(function (table) {
var token = session.getTokenAt(pos.row, pos.column).value.slice(-1);
return {
caption: table.description,
value: token == "@provider.prefix.charAt(0)" ? table.value.replace(token, "") : table.value,
className: "@{provider.id}" == "emoji" ? table.label.replace(/[^a-z0-9\-_]/g, '_') : "@{provider.id}",
meta: "@{provider.id}"
};
}));
}
},
id: "@{provider.id}Completer"
};
mdCompleters.push(@{provider.id}Completer);
@Html(provider.additionalScript(repository))
}
}
</script>

View File

@@ -74,12 +74,19 @@
</form>
<script src='@helpers.assets("/vendors/ace/ace.js")' type="text/javascript" charset="utf-8"></script>
<script src='@helpers.assets("/vendors/ace/ext-modelist.js")' type="text/javascript" charset="utf-8"></script>
<script src='@helpers.assets("/vendors/ace/ext-language_tools.js")' type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" src='@helpers.assets("/vendors/jsdifflib/difflib.js")'></script>
<link href='@helpers.assets("/vendors/jsdifflib/diffview.css")' type="text/css" rel="stylesheet" />
@gitbucket.core.helper.html.completion(
repository = repository,
completionContext = "wiki",
generateScript = false
)
<script>
const gitbucket = {
editor: null,
enableWikiLink: false,
pluginAssets: "@context.path/plugin-assets/",
protected: @protectedBranch,
previewTemplate: '<img src="@helpers.assets("/common/images/indicator.gif")"> Previewing...',
previewUrl: '@helpers.url(repository)/_preview',

View File

@@ -35,12 +35,19 @@
</form>
<script src='@helpers.assets("/vendors/ace/ace.js")' type="text/javascript" charset="utf-8"></script>
<script src='@helpers.assets("/vendors/ace/ext-modelist.js")' type="text/javascript" charset="utf-8"></script>
<script src='@helpers.assets("/vendors/ace/ext-language_tools.js")' type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" src='@helpers.assets("/vendors/jsdifflib/difflib.js")'></script>
<link href='@helpers.assets("/vendors/jsdifflib/diffview.css")' type="text/css" rel="stylesheet" />
@gitbucket.core.helper.html.completion(
repository = repository,
completionContext = "wiki",
generateScript = false
)
<script>
const gitbucket = {
editor: null,
enableWikiLink: true,
pluginAssets: "@context.path/plugin-assets/",
protected: false,
previewTemplate: '<img src="@helpers.assets("/common/images/indicator.gif")"> Previewing...',
previewUrl: '@helpers.url(repository)/_preview',

View File

@@ -291,6 +291,7 @@
gitbucket.editor.focus();
});
var originalCompleter = null;
/**
* A function to update the file mode of the Ace editor
@@ -302,11 +303,14 @@
gitbucket.editor.getSession().setMode(mode.mode);
if (mode.name == "markdown") {
markdownToolBar.style.display = "block";
gitbucket.editor.completers = mdCompleters ?? [];
} else {
markdownToolBar.style.display = "none";
gitbucket.editor.completers = originalCompleter ?? [];
}
} else {
markdownToolBar.style.display = "none";
gitbucket.editor.completers = originalCompleter ?? [];
}
};
@@ -325,6 +329,7 @@
$('#editor').text($('#initial').val());
// Initializing Ace editor
const langtools = ace.require("ace/ext/language_tools");
gitbucket.editor = ace.edit("editor");
// Initialize Ace editor keyboard handler
@@ -370,6 +375,14 @@
}
});
// enable auto completion
gitbucket.editor.setOptions({
enableBasicAutocompletion: true,
enableSnippets: true,
enableLiveAutocompletion: true
});
originalCompleter = gitbucket.editor.completers;
// Initialize file mode for Ace editor
updateFileMode();