Режимы CodeMirror: сопоставьте подмножество строк с регулярным выражением

Я пытаюсь создать оверлей режима для CodeMirror.

У меня есть куча протестированных регулярных выражений, которые соответствуют участкам строки (из потока), и я хотел бы использовать их для сопоставления и токенизации части строки.

Например:

# h1

Становится:

<span class="..."><span class="cm-overlay cm-markup">#</span> h1</span>

Кроме аддона simplemode, мне не удалось найти примеров использования регулярных выражений в режимах. Этот вопрос очень похож на то, что я делаю, но нет ответов о том, как вернуть токен только для подмножества строки потока: CodeMirror - Использование RegEx с наложением

Мне удалось создать следующий режим, который работает, но соответствует всей строке, поэтому выдает html вроде: <span class="cm-overlay cm-markup"># h1</span>

CodeMirror.defineMode("markdown-extra", function() {
    return {
        token: function(stream, state) {
            markup = stream.match(/^([#]{1,6})[^#]/g); // matches markdown header syntax
            stream.skipToEnd();

            if (markup){
                console.log(markup, stream)
                return "markup"
            }

            return null
        }
    };
});

Документация требует, чтобы я использовал stream.match, чтобы «съесть» совпадающие символы, но не упоминает, как только маркировать подраздел, продолжая использовать регулярные выражения.

Я действительно понятия не имею, как продолжить.


person lux    schedule 02.07.2017    source источник


Ответы (1)


Я немного разобрался.

Я до сих пор не совсем понимаю, почему это работает, но следующий код соответствует регулярному выражению, но по какой-то причине не ограничивается группами захвата (массив имеет размер всего 1).

CodeMirror.defineMode("markdown-extra", function() {
        return {
            token: function(stream, state) {

                // ## header matching
                matchArray = stream.match(/^([#]{1,6}) /g);
                if (matchArray != null) {
                        var match = matchArray[0];
                        console.log(matchArray);
                        stream.match(match);
                        return "markup"
       }
                while (stream.next() != null && !stream.match(/^([#]{1,6})[^#]/g, false)) {}
      return null;

            }
        };
    });
person lux    schedule 03.07.2017