Python / Javascript: WYSIWYG HTML-редактор - Быстрая обработка больших документов и / или теория дизайна - PullRequest
2 голосов
/ 07 декабря 2011

Справочная информация:

Я пишу программу для редактирования электронных книг на python. В настоящее время он использует представление исходного кода для редактирования, и я хотел бы перенести его в представление wysiwyg для редактирования. Лучший (только?) Рендеринг HTML, который я смог найти для python, был webkit (я использую версию PyQt).

Вопрос:

Как мне выполнить редактирование wysiwyg? Требования / проблемы заключаются в следующем:

  1. Электронная книга может содержать до 10 000 абзацев / 1 000 000 персонажи.
    • PyQt Webkit (ContentEditable): нет проблем.
    • PyQt Webkit (TinyMce и т. Д.): навсегда открывает их!
  2. Формат <body><p>...</p><p>...</p>...</body>. Элемент body содержит только абзацев, нет разделителей и т. Д. (Но в абзаце могут быть пролеты, ссылки и т. Д.). Редактирование должно происходить без существенных задержек, если это касается пользователя.
    • PyQt Webkit (ContentEditable): если вы попытаетесь удалить текст из нескольких абзацев, это займет вечность !! Насколько я понимаю, это происходит потому, что он сбрасывает общий родительский элемент изменяемых элементов - то есть всего элемента тела , поскольку два разных абзаца удаляются / объединяются. Но в этом не должно быть необходимости - нужно только удалить / объединить / изменить эти отдельные абзацы!

Я открыт для реализации своего собственного редактирования wysiwyg, но на всю жизнь я не могу понять, как правильно удалить / вырезать / вставить / объединить / изменить HTML-код. Я искал в Интернете статьи о теории дизайна html wysiwyg и пришел в себя.

Спасибо!

1 Ответ

1 голос
/ 07 декабря 2011

Могу ли я предложить совершенно другой подход?Поскольку ваша электронная книга имеет только <p></p>:

  • Разделите текст на <p></p>, чтобы получить индексированный массив всех ваших абзацев
  • Создайте собственную систему нумерации страниц и заполните экран.с N абзацами, которые автоматически получают достаточно текста для показа из индексированного массива
  • Когда вы делаете выделение, вы можете использовать [индекс абзаца + индекс символа в абзаце] для выбора начала / конца
  • Затем выполните вырезание / копирование / вставку / удаление / отмену / повтор на основе этих предположений.

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

...