Я хочу имитировать функцию 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?