Чуть не забыл о шрифтах
Имя шрифта определяется атрибутом style:font-name. Его определение просто надо добавить в функию my:calculate-styles. Ничего необычного, так что просто привожу текущую версию функции.
Для построения таблиц нам понадобятся элементы table:table - сами таблицы, table:table-row - строки таблиц и table:table-cell - ячейки. С таблицами все просто - для них создаются теги TABLE внутри которых (без пробелов переходов строк) размещается содержимое. Строки после обработанных дочерних элементов вставляют новую строку. Что до ячеек, то тут есть нюансы. Нам нужно получить содержимое ячеек на одной строке, а внутри ячеек в документе обычно расположен элемент text:p, который у нас обрабатывается как блочный. Поэтому для элементов text:p находящихся внутри ячеек мы создаем отдельный шаблон с атрибутом mode="table" и при вызове шаблонов из ячейки обрабатываем их именно в этом режиме. Кроме того(на всякий пожарный) обработанное содержимое ячеек сначала передадим переменной, а потом нормализуем строки. Если ячейка не последняя в строке добавляем после нее вертикальную черту.
По поводу обработки содержимого элементов списка. При вычислении отступов для списков вставляются дополнительные теги indent, это сильно разносит списки по документу, поскольку увеличиваются не столько отступы, сколько расстояния между пунктами. Поэтому в том месте, где мы вычисляли отступы для блочных элементов (text:h и text:p) неплохо бы ввести дополнительное условие, чтобы отступы вычислялись только если элемент не является непосредственным потомком пункта списка.
Списки создаются с помощью элементов text:list, а отдельные пункты списков - text:list-item. Вроде все просто, но тут сразу встает несколько вопросов: как определить нумерованный это список или маркированный. Типы маркеров в разметке Cyberforum не поддерживаются, а вот типы нумерации - вполне. Как определить тип нумерации, если список вложенный. Вот этими вопросами сейчас и займемся.
Итак, из разметки мы видим, что список не содержит информации о маркерах, а стало быть единственная зацепка, по которой мы можем что-то узнать - это уже известный нам атрибут text:style-name. Посмотрим на один из стилей списков, представленных в документе и попытаемся выяснить что-нибудь полезное.
Как нетрудно заметить, внутри стиля списка есть набор элементов text:list-level-style-bullet и text:list-level-style-number. Это отдельные стили, которые описывают каждый отдельный уровень вложенного списка. Первый тип указывает, что список должен быть маркированным, из него мы можем узнать тип маркера, но нам эта информация ни к чему. Второй указывает, что список на данном уровне должен быть нумерованным и он содержит тип нумерации style:num-format(1, I, i, a, A). Форматы имеют именно такой вид как нам и надо, так что, если мы будем их использовать, то можно использовать напрямую. Кроме того, атрибут text:level указывает к спискам какого уровня надо применять данные правила.
Большинство свойств мы просто проигнорируем, хотя, если нужно, то некоторые можно и задействовать. А вот формат числа для вложенных списков мы, пожалуй используем. Наша главная задача найти нужный стиль для нужного списка, а там уже поиск конкретного свойства - не проблема.
Итак, результат преобразования нашего тестового документа.
Кликните здесь для просмотра всего текста
Ссылка на закладку
Заголовок 1
Обычный текст
Заголовок 2
Заголовок 3 Заголовок 4
Заголовок 5
Заголовок 6 Заголовок 7
Название
Подзаголовок Сильное выделение Строгий
Цитата 2
Слабая ссылка Сильная ссылка
Название книги
Абзац списка.
Жирный Курисив Подчеркнутый Перечекнутый
ХНижний индекс
ХВерхний идекс
Крупный шрифт 72
Мелкий шрифт 8
Левое выравнивание
Выравнивание по центру
Правое выравнивание
Первый пункт маркированного списка
Второй пункт маркированного списка
Первый пункт н умерованного списка
Пункт 1.a;alfjasdf; lj l ;l lj ;lk
lkj;lkj l sdls dfslkj as;l
Пункт 1.b b xj 'nj pf [eqyz&
Второй пункт нумерованного списка
Текст до десяти пробелов Текст после десяти пробелов
Текст красного цвета
Текст синего цвета
Выделение желтым
/*Далее таблица*/
Окончательный вариант преобразования - во вложении. Так же там файл-источник, результат преобразования и fodt-файл - отформатированный источник. Возможно где-то будут несовпадения, я мог что-то поменять в процессе, но в общем это те файлы, на которых я все проверял.
Напомню, что изначально я не ставил перед собой цели написать фильтр, который выполнял бы экспорт в какой-то реальный формат, хотя фактически в результате именно это и сделал. Но нужно понимать, что этот фильтр более-менее работает на конкретном документе, но нет никаких гарантий того, что OpenOffice на вставит в документ что-нибудь эдакое, чего я не предусмотрел. Целью было исследование структуры документа, нахождение способов поиска нужной информации в нем и выработка способов обработки данных. В то же время полученный результат можно считать удовлетворительным, поскольку даже в таком виде он дает возможность использовать всю мощь офисных пакетов для написания статей, постов и чего угодно.
Описанные здесь возможности не являются исчерпывающими. Есть огромный ряд вопросов, которые я не рассмотрел. Например я не представляю себе, что делать с изображениями. Они в документе содержаться в формате base64string и что с этим делать я не знаю, хотя при желании можно что-то придумать. Также не были рассмотрены возможности, которые могут дать именованные стили. Например для вставки кода можно создать стили, которые не будут обрабатываться обычным образом, а будут обрамляться тегами соответствующего языка программирования.
Был рассмотрен только одни тип документа. А там их довольно много и это не только таблицы и прочее, но даже тот же Writer может создавать те же XML-формы к примеру и их структура будет сильно отличаться от того, что мы уже рассмотрели, хотя многое из рассмотренного тоже окажется полезным.
Не были рассмотрены фильтры импорта. Они хоть выглядят очень сложными, в силу того, что нужно сформировать сложный документ, но на самом деле с ними, как мне кажется, работать даже проще. Заготовку документа можно вставить в преобразование практически ничего не меняя. А потом брать ту часть содержимого, которая должна быть генерироваться фильтром и заменять конструкциями XSLT. В результате можно добиться, чтобы документ соответствовал определенным требованиям и этого будет достаточно. В случае же экспорта никогда нельзя быть уверенным в том, что программа не выдаст чего-то совсем неожиданного в содержимом документа.
В общем и целом, все что здесь описано, скорее база для дальнейшего исследования, нежели готовая методика.
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи.
. . .
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .