Beginnings of autocomplete for headers

This commit is contained in:
Gregory Schier
2023-03-17 16:51:20 -07:00
parent cd39699467
commit cbe0d27a5e
17 changed files with 155 additions and 48 deletions

View File

@@ -6,6 +6,7 @@ const closeTag = ' ]}';
const variables = [
{ name: 'DOMAIN' },
{ name: 'BASE_URL' },
{ name: 'CONTENT_THINGY' },
{ name: 'TOKEN' },
{ name: 'PROJECT_ID' },
{ name: 'DUMMY' },
@@ -17,7 +18,7 @@ const variables = [
];
const MIN_MATCH_VAR = 2;
const MIN_MATCH_NAME = 4;
const MIN_MATCH_NAME = 3;
export function completions(context: CompletionContext) {
const toStartOfName = context.matchBefore(/\w*/);

View File

@@ -1,15 +1,21 @@
import { LanguageSupport, LRLanguage } from '@codemirror/language';
import { parseMixed } from '@lezer/common';
import { completions } from './completion';
import type { GenericCompletionOption } from '../genericCompletion';
import { genericCompletion } from '../genericCompletion';
import { placeholders } from '../widgets';
import { completions } from './completion';
import { parser as twigParser } from './twig';
export function twig(base?: LanguageSupport) {
export function twig(base?: LanguageSupport, autocompleteOptions?: GenericCompletionOption[]) {
const language = mixedOrPlainLanguage(base);
const additionalCompletion =
autocompleteOptions && base
? [language.data.of({ autocomplete: genericCompletion({ options: autocompleteOptions }) })]
: [];
const completion = language.data.of({
autocomplete: completions,
});
const languageSupport = new LanguageSupport(language, [completion]);
const languageSupport = new LanguageSupport(language, [completion, ...additionalCompletion]);
if (base) {
const completion2 = base.language.data.of({ autocomplete: completions });
@@ -23,18 +29,15 @@ export function twig(base?: LanguageSupport) {
function mixedOrPlainLanguage(base?: LanguageSupport): LRLanguage {
const name = 'twig';
if (base == null) {
if (!base) {
return LRLanguage.define({ name, parser: twigParser });
}
const parser = twigParser.configure({
wrap: parseMixed((node) => {
if (!node.type.isTop) return null;
return {
parser: base.language.parser,
overlay: (node) => node.type.name === 'Text',
};
}),
wrap: parseMixed(() => ({
parser: base.language.parser,
overlay: (node) => node.type.name === 'Text' || node.type.name === 'Template',
})),
});
return LRLanguage.define({ name, parser });