Home Reference Source

js/helpers/CodeMirror/AxtellPlaceholderMode.js

import LazyLoad, { CodeMirror as CM, CodeMirrorOverlay, CodeMirrorMode } from '~/helpers/LazyLoad';

const AxtellPlaceholder = /@@axtell:([a-z]+)@@/;

export default LazyLoad.once(
    CM,
    CodeMirrorOverlay,
    async () => {
        CodeMirror.defineMode("axtell", function(config, parserConfig) {
            return CodeMirror.overlayMode(
                CodeMirror.getMode(config, parserConfig.sourceLanguage), {
                token: function(stream, state) {
                    let results;
                    if (results = stream.match(AxtellPlaceholder)) {
                        let name = results[1];
                        return `axtell-template-${name}`;
                    }

                    while (stream.next() != null && !stream.match(AxtellPlaceholder, false)) {}
                    return null;
                }
            });
        });
    },
    LazyLoad.resolveValue(() => async (language) => {
        const codeMirrorName = language.cmName || null;
        if (codeMirrorName) await CodeMirrorMode(codeMirrorName);

        return {
            name: 'axtell',
            sourceLanguage: language.cmName // If this is null then will still work
        };
    })
);