Как воспроизвести функцию CodeMirror replaceRange (code, from, to, origin) и редактор в python? - PullRequest
0 голосов
/ 20 июня 2020

Я хочу имитировать функцию do c .replaceRange (replace: string, from: {line, ch}, to: {line, ch},? Origin: string) (https://codemirror.net/doc/manual.html) со списком python и строками.

Каждое событие изменения отправляет данные (замена: строка, от: {строка, ch}, до: {строка, ch},? origin: строка) в сервер. Цель этого - воспроизвести изменения клиента (функция do c .replaceRange) на сервере flask python в другом формате (список и строка), потому что сервер должен хранить текущее значение редактора, что, если клиент повторно подключается, он загрузит код редактора с сервера.

Клиент JS:

editor.on("change", function (cm, change) {
        socket.emit('clientText', {
                'text': change.text,
                'from': change.from,
                'to': change.to,
                'origin': change.origin,
                'room': 'default'
        });
});

Функция, которую я хочу реализовать в python, задокументирована следующим образом:

do c .replaceRange (replace: string, from: {line, ch}, to: {line, ch},? Origin: string) Заменить часть документа между from и to на заданную строку . from и to должны быть объектами {line, ch}. to можно оставить, чтобы просто вставить строку в позицию from. Когда задано происхождение, оно будет передано в события «изменения», и его первая буква будет использоваться, чтобы определить, можно ли объединить это изменение с предыдущими историческими событиями, как описано для источников выбора.

Похоже, что перевести replaceRange из редактора CodeMirror в список python строк не так-то просто.

На веб-сервере flask я получил такой формат сохранения кода редактора:

    sc_codes = {'sample_code': ['class Car {',
                                      'constructor(brand) {',
                                      'this.carname = brand;',
                                      '}']
                }

Моя текущая версия python code:

@socketio.on('clientText')
def on_client_text(data):
    save_editor_text_on_server(data['text'], data['from'], data['to'], data['origin'], data['room'])


def save_editor_text_on_server(text, from1, to1, origin, room):
    from_line = from1['line']
    from_char = from1['ch']
    to_line = to1['line']
    to_char = to1['ch']

    if len(text) == 2 and text[0] == '' and text[1] == '':
        # break line
        char_list = list(sc_codes[room][from_line])
        sc_codes[room][from_line] = ''.join(char_list[from_char:])
        sc_codes[room].insert(from_line, ''.join(char_list[:from_char]))
    else:
        if from_line == to_line:
            char_list = list(sc_codes[room][from_line])
            if not char_list:
                char_list.append('')
            del char_list[from_char:to_char]
            if origin == 'paste' or origin == '+input':
                char_list.insert(from_char, text[0])
            sc_codes[room][from_line] = ''.join(char_list)
        else:
            for line in range(from_line, to_line + 1):
                char_list = list(sc_codes[room][line])
                if line == from_line:
                    del char_list[from_char:]
                    if origin == 'paste' or origin == '+input':
                        char_list.insert(from_char, text[0])
                elif line == to_line:
                    del char_list[:to_char]
                else:
                    char_list = ['']
                if not char_list or char_list == ['']:
                    del sc_codes[room][line]
                else:
                    sc_codes[room][line] = ''.join(char_list)

Есть ли у вас простая версия реализации функции replaceRange с javascript на python? Могу ли я использовать редактор кода codemirror с теми же функциями в python?

...