Текстовый процессор: Logi c непрерывных секций - PullRequest
0 голосов
/ 12 марта 2020

Сегодня я пишу что-то необычное c, потому что мне нравится понимать, как это работает, процесс создания непрерывных разделов в программе обработки текста, как вы знаете это по Microsoft Word, Libre Office или Apple Pages.

В настоящее время я пишу свой собственный текстовый редактор. Это должно быть очень обширным. У меня есть два модуля. Один заботится о данных, другой заботится о представлении данных. Таким образом, второй является средством визуализации для класса данных.

Структура документа данных с отформатированными текстами можно приблизительно описать следующим образом:

Document
  + Section (2 Columns)
    + Paragraph
      + Text
      + Tabstop
      + Text
      + Picture
    + Paragraph
      + Text
  + Section
    ...

Итак, у нас есть структура данных с один раздел, который в свою очередь содержит два абзаца с различным содержанием. Механизм рендеринга в настоящее время переводит все это следующим образом:

Document
  + Page
    + PageColumn (1. Column)
      + Blocks
        + Paragraph
          + Line
            + Text
            + Tabstop
            + Text
            + Picture
          ...
        + Paragraph
          + Line
            + Text
          ...
    + PageColumn (2. Column)
      + Blocks
        ...

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

Это означает, что в данный момент я могу отображать «фиксированные» разделы с моей структурой, то есть те, которые начинаются на Even / Odd / NextPage. Для рисования элемента управления это просто означает, что для каждой страницы я вывожу все столбцы слева направо, с содержимым столбцов, затем блоки рисуются сверху вниз.

Внутри Word, Pages et c. однако возможно отображение непрерывных разделов на странице. Пример:

Page
  Section (1 Column)
  Section (2 Columns)
  Section (1 Column)

Как вам нужно изменить структуру, чтобы вы могли это реализовать? В непрерывном разделе с более чем одним столбцом необходимо каким-то образом заранее рассчитать, сколько блоков и строк поместится в каждый столбец, чтобы получить сбалансированный результат отображения.

У кого-нибудь есть предложения?

Большое спасибо. enter image description here

1 Ответ

1 голос
/ 12 марта 2020

Раздел с двумя столбцами уравновешивает текст по столбцам, потому что в действительности это один столбец, который перемещается по странице. Раздел расширяется, чтобы вместить общий объем текста. При вводе некоторого текста кажется, что столбец 1 будет занимать две строки текста, прежде чем курсор переместится в столбец 2. Когда столбцы сбалансированы, добавление дополнительного текста в столбец 2 переформатирует текст по двум столбцам, обычно оставляя две пустые строки в конце столбца 2 по сравнению с столбцом 1.

...