Экспорт статьи из LibreOffice Writer в Habr Flavored Markdown или HTML

Резюме.
В статье дается ссылка на файл в формате ODT (основной формат файлов, используемый в текстовом редакторе LibreOffice Writer), содержащий макросы на «родном» для LibreOffice языке программирования макросов BASIC, которые осуществляют экспорт текста из LibreOffice Writer в новый файл в формате Habr Flavored Markdown (далее - HFM) или HTML, в виде, пригодном для размещения статьи в интернете, например, на сайте habr.com.

Текст данной статьи был экспортирован в формат HFM для размещения на сайте habr.com с помощью библиотеки макросов, содержащихся в данном файле.

Для использования достаточно скачать указанный файл (его можно переименовать), заменить в нем текст на свой текст, подготовленный в соответствии с описанием в статье, и вызвать макрос. В папке со скачанным файлом появится новый файл в выбранном формате.

Рассмотрение макросов на языке BASIC, которые осуществляют экспорт, предполагается в отдельной статье.

Оглавление

1. Введение
2. Стили текста
2.1. Ссылки
2.2. Списки
2.3. Цитата
2.4. Исходный код
3. Таблицы
4. Картинки
4.1. Картинка вне текста
4.2. Картинка внутри текста (Inline Image)
5. Вставка раздела
6. Формулы
6.1. Вставка формулы в виде картинки
6.2. Вставка формулы в виде объекта LibreOffice Math
7. Оглавление

1. Введение

Для тестирования экспорта текста статьи из LibreOffice Writer в Habr Flavored Markdown:

  1. Установите LibreOffice версии 7.2.4.1 (х64) или выше

  2. Пройдите по ссылке: https://github.com/bda-user/libre_office_macro/blob/main/libre_office_export.odt

  3. Скачайте файл «libre_office_export.odt».

  4. Откройте указанный файл.

  5. Для запуска макроса выбираем в главном меню — Сервис — Макросы — Выполнить макрос.

  6. В поле «Библиотека»:

  • раскрываем пункт «libre_office_export.odt»,

  • раскрываем пункт «DocExport»,

  • выбираем пункт «DocModel»,

  1. В поле «Имя макроса» выбираем макрос «MakeDocHfmView». В папке со скачанным файлом появится новый файл «libre_office_export_export_hfm.txt».

Для экспорта в HTML в пункте 7 выбираем макрос «MakeDocHtmlView».
Для экспорта своего текста можно создать копию скачанного файла, заменить в нем текст на свой текст, подготовленный в соответствии с описанием в статье, и вызвать макрос.

Чтобы после замены текста в файле на свой текст он корректно экспортировался необходимо его подготовить в соответствии с описанием в статье.

2. Стили текста

Этот параграф содержит жирный текст публикации, курсивный текст, подчеркнутый текст зачеркнутый текст.

Во время экспорта, например, в формат HFM жирный текст выделяется двумя звездочками:
«параграф содержит жирный текст».

Особые случаи.
Однако иногда при просмотре файла экспорта можно увидеть следующее:
«параграф содержит **жир****ный** текст»,
что может нарушить форматирование.

Как правило, это случается когда мы сначала пишем слово «жир», форматируем его, применяя стиль «bold», затем продолжаем писать, вставляя буквы «ный», т. е. редактируем отформатированный текст. В результате внутри LibreOffice Writer слово «жирный» состоит из двух слов «жир» и «ный».

Подсказка.
Чтобы исправить ситуацию можно в файле ODT выделить слово «жирный» нажать комбинацию клавиш «Ctrl + X» (Вырезать), затем нажать комбинацию клавиш «Ctrl + Shift + V» (Вставить как) и выбрать пункт «Только текст».

2.1. Ссылки

Этот параграф содержит гиперссылку habr_ru (URL https://habr.ru/).

Подсказка.
Чтобы добавить гиперссылку необходимо выделить текст, который будет текстом ссылки, затем в меню «Вставка» выбрать пункт «Гиперссылка», во вкладке «Internet» в разделе «Тип гиперссылки» заполнить поле URL.

Этот параграф содержит ссылку внутри текста. См. листинг №1 (ссылка внутри текста #ref_1).

Подсказка.
Чтобы добавить ссылку внутри текста документа необходимо:

  1. В месте текста, куда будет вести ссылка, необходимо установить курсор, затем в меню «Вставка» выбрать пункт «Закладка», в поле «Имя» ввести текст, например, «ref_1» и нажать кнопку «Вставить».

  2. Необходимо выделить текст, который будет текстом ссылки, затем в меню «Вставка» выбрать пункт «Гиперссылка», во вкладке «Document» в разделе «Цель в документе» заполнить поле «Цель», вставив имя закладки, например, «ref_1» без решетки #.

2.2. Списки

Маркированный список, вложенный маркированный список

  • элемент 1

  • элемент 2

    • элемент 2.1

    • элемент 2.2

Нумерованный список, вложенный нумерованный список

  1. элемент

  2. элемент

    1. элемент 2.1

    2. элемент 2.2

Подсказка.

  1. Чтобы применить формат списков необходимо выделить фрагмент текста и в меню «Формат» выбрать пункт «Списки», затем выбрать тип списка: Маркированный список или Нумерованный список.

  2. Возможны «смешанные» списки, т. е. формат можно применять независимо к каждому пункту списка / вложенного списка.

  3. Перевод строки после нажатия клавиши «Enter» продолжает список, два подряд перевода строки отменяет дальнейшее использование формата списка.

  4. Нажатие клавиши «Tab» при установленном курсоре в начале пункта списка начинает вложенный список (визуально увеличивает отступ).

  5. Нажатие клавиш «Shift-Tab» при установленном курсоре в начале пункта списка переводит пункт вложенного списка на более высокий уровень (визуально уменьшает отступ).

2.3. Цитата

Пример цитаты

Текст цитаты (начало)
продолжение цитаты

Подсказка.

  1. Чтобы применить формат цитаты необходимо использовать стиль абзаца «Блочная цитата».

  2. Перевод строки после нажатия клавиши «Enter» продолжает цитату, два подряд перевода строки отменяет дальнейшее использование формата цитаты.

2.4. Исходный код

Листинг № 1. Для форматирования исходного кода используем стиль абзаца «code_vbscript».

Скрип автоматически добавляет нумерацию строк кода.

1 Sub Example
2     Dim FileNo As Integer, Filename As String, CurLine As String
3     Dim Doc As Object
4     Dim Enum1 As Object, Enum2 As Object
5     Dim TextElement As Object, TextPortion As Object
  1. Во время экспорта в формат HFM исходный код выделяется символами «```» в начале и в конце блока кода. Символы «```» в начале блока могут быть дополнены словом «vbscript» (```vbscript), чтобы HFM применил оформление соответствующее BASIC’у.

  2. Во время экспорта в формат HTML в начале блока кода вставляется строка: <pre class="code vbscript"> в конце блока кода: </pre>

Подсказка.

  1. Чтобы использовать формат исходного кода в файле ODT необходимо выделить текст и применить стиль абзаца «code_vbscript».

  2. Чтобы использовать в формате HFM исходный код на другом языке программирования необходимо в файле ODT создать новый стиль, например, «code_cpp» и использовать его для форматирования. Тогда блок кода в формате HFM начнется с символов «```cpp».

  3. Чтобы создать новый стиль в файле ODT, например, «code_cpp» на основе стиля «code_vbscript» необходимо в меню «Стили» выбрать пункт «Управление стилями» (F11), затем в панели выбрать стиль «code_vbscript», нажать на нем правой клавишей мыши и в контекстном меню выбрать пункт «Создать», в открывшемся диалоге на вкладке «Управление» в разделе «Стиль» в поле «Имя» ввести название стиля «code_cpp» и нажать кнопку «ОК».

  4. Перевод строки после нажатия клавиши «Enter» продолжает выбранный формат, два подряд перевода строки отменяет дальнейшее использование формата.

  5. Чтобы добавить пустую строку в блок кода необходимо после первого нажатия клавиши «Enter» ввести символ пробела, а затем повторно нажать клавишу «Enter», иначе стиль «code_vbscript» «сбросится» и у текущего абзаца будет стиль «Базовый».

3. Таблицы

Заголовок 1

Заголовок 2

Заголовок 3

Ячейка 1 Текст жирный Продолжение текста

Ячейка 2 Текст cursive, текст подчеркнутый, текст зачеркнутый

Ячейка 3 Ссылка habr_ru (гиперссылка https://habr.ru/)

Подсказка.

  1. Чтобы вставить в файл ODT таблицу необходимо в меню «Таблица» выбрать пункт «Вставить таблицу».

  2. Формат HFM поддерживает только «простые» таблицы без объединения ячеек и не поддерживает перевод строки внутри ячейки.

  3. Для корректного экспорта в формат HFM абзацы внутри каждой ячейки объединяются в один абзац, поэтому желательно в конце абзаца внутри ячейки в файле ODT ставить пробел.

4. Картинки

Для вставки изображения, необходимо выбрать в главном меню — Вставка — Изображение, затем выбрать файл картинки. Изображение будет добавлено в редактируемый файл ODT.

Подсказка.
Чтобы экспортировать документ в формат (HFM или HTML), пригодный для размещения в интернете, можно:

  1. Предварительно разместить картинки в интернете, например, на github.com.

  2. Для этого регистрируемся на github.com, создаем репозиторий. Чтобы файлы были доступны всем пользователям необходимо выбрать созданный репозиторий, нажать кнопку с шестеренкой «Settings», на вкладке «General» внизу в разделе «Danger Zone» в первом пункте «Change repository visibility» справа нажать кнопку «Change visibility» и выбрать «Change to public».

  3. Внутри репозитория нажимаем кнопку «Add file», выбираем «Create new file». Вместо имени файла вводим «имя_папки/» (после имени папки обязательно вводим слеш) затем «имя_файла». Это позволит создать каталог «имя_папки» и пустой файл «имя_файла». Входим в созданный каталог вызываем диалог «Add file», выбираем кнопку «Upload files», загружаем картинки. Войдя в каталог и нажав на ссылку загруженной картинки, наводим курсор на картинку, в контекстном меню выбираем «Открыть изображение в новой вкладке», в строке адреса будет постоянная ссылка на картинку в формате URL.

  4. После вставки изображения в файл ODT можно вызвать диалог «Свойства» картинки: клавиша «F4» или Контекстное меню — Свойства, на вкладке «Изображение» в разделе «Связь» в поле «Имя файла» можно указать ссылку на источник картинки в интернете в формате URL (например, https://raw.githubusercontent.com/bda-user/libre_office_macro/main/img/01.jpg).

  5. На вкладке «Параметры» в разделе «Имена» можно заполнить поля «Альтернатива» и «Описание», которые используются в форматах HFM или HTML. Например, в свойствах картинки в разделе 4.1 указано: 1) поле «Альтернатива»: Картинка недоступна, содержит заставку для статьи, 2) поле «Описание»: Рис. 1. Картинка. Заставка для статьи.

4.1. Картинка вне текста

Подсказка.
Контекстное меню - Обтекание - None
Контекстное меню - Привязка - К абзацу

Рис. 1. Картинка. Заставка для статьи

Картинка недоступна, содержит заставку для статьи
Рис. 1. Картинка. Заставка для статьи

4.2. Картинка внутри текста (Inline Image)

Подсказка.
Контекстное меню - Привязка - Как символ.
Пример картинки внутри текста (Inline Image)

5. Вставка раздела

Использование разделов необходимо для создания спойлеров в формате HFM. Чтобы в текст документа вставить раздел выбираем в меню «Вставка» пункт «Раздел».
В диалоге «Вставить раздел» на вкладке «Раздел» в поле «Новый раздел» вводим название раздела.

Вставка № 1
  1. Данный раздел начинается с абзаца «Вставка № 1» (текст может быть любым) и имеет название «Spoiler_1».
    Если имя раздела начинается с символов «Spoiler», то при экспорте в формат HFM в начале раздела будет вставлена строчка:
    <spoiler title="Вставка № 1">,
    в конце раздела:
    </spoiler>

  2. При экспорте в формат HTML в начале раздела будет вставлена строчка:
    <div class="section"><!-- section begin -->,
    в конце раздела:
    </div><!-- section end -->

Раздел может включать произвольное содержимое.
Разделы могут быть вложены друг в друга. Например, Раздел_1_1 находится внутри раздела Spoiler_1.

Вставка № 1.1
При экспорте в формат HFM вложенные разделы игнорируются. При экспорте в формат HTML вложенные разделы вкладываются друг в друга.
Конец Вставки № 1.1.

Конец Вставки № 1.

Подсказка.
Для корректного отображения в формате HFM в конец раздела необходимо добавить пустую строку.

6. Формулы

6.1. Вставка формулы в виде картинки

Формулу можно вставить в документ ODT в виде картинки

привязанной к абзацу:
Контекстное меню - Обтекание - None
Контекстное меню - Привязка - К абзацу
или inline image:
Контекстное меню - Привязка - Как символ

Подсказка.

  1. Чтобы получить картинку формулы, например, в формате PNG необходимо Объект LibreOffice Math (см. ниже) скопировать и вставить в программу LibreOffice Draw.

  2. Затем выделить вставленный объект, правой кнопкой мыши вызвать контекстное меню, выбрать пункт «Преобразовать — В растровое изображение».

  3. Затем полученное изображение необходимо выделить, правой кнопкой мыши вызвать контекстное меню, выбрать пункт «Сохранить».

6.2. Вставка формулы в виде объекта LibreOffice Math

Формулу можно вставить в документ ODT в виде объекта LibreOffice Math, привязанного к символу:
Контекстное меню - Привязка - Как символ
В настоящее время в макросах, транслирующих формулы их формата LibreOffice Math в формат LaTeX, реализовано ограниченное количество ключевых слов.

\begin{align} \text{1. Vector: } \vec R = \sqrt { w! } \text{, - formula N 1} \\ \text{2. Breckets: } \overbrace{ \underbrace{ x \left \lbrace \frac{\langle a _ { i \times 2 } ^ { 1...n } + b \rangle }{[ c + d ] } \right \rbrace y } _{ m }  } ^{ n }  \\ \text{3. Root: } z = \sqrt [{ 3 - q } ] { x + 1 }  \text{, - [2]} \\ \text{4. Integrals: } y = t + \int _{ 1 } ^{ n } x + \iint _{ i } y \text{, - {3}} \\ \text{5. Sym & Sum: } y = \pi  \times r ^ 2 + \sum _{ i = 1 } ^{ \infty } f ( i ) \text{, - #4} \\ \text{6. Matrix: } M = \left ( \begin{matrix}  x _ 1 &  ... &  x _ n \\  y _ 1 &  ... &  y _ n \\  z _ 1 &  ... &  z _ n \end{matrix} \right ) \end{align}

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

7. Оглавление

  1. Чтобы добавить оглавление необходимо предварительно выделить в структуре документа ODT разделы (1). Можно использовать для заголовков разделов стили абзаца (2): «Заголовок 1», «Заголовок 2» или «Заголовок 3».

  2. Чтобы вставить Оглавление необходимо, установив курсор в нужном месте документа ODT, выбираем в главном меню — Вставка — Оглавление и указатели — Оглавление, указатель или библиография, в открывшемся диалоге нажимаем кнопку «ОК».

  3. Чтобы удалить Оглавление необходимо установить на него курсор и в контекстном меню выбрать «Удалить указатель».

  4. Чтобы корректно обновить Оглавление, если были удалены / добавлены / изменены разделы, необходимо установить на него курсор и в контекстном меню выбрать «Update Index».

Подсказка.

  1. После многократной вставки / удаления Оглавления при просмотре файла экспорта можно увидеть многократное повторение заголовков. Поэтому Оглавление лучше вставлять в конце, когда структура уже определена.

  2. Если же какой-либо заголовок в файле экспорта «задваивается», то чтобы исправить ситуацию можно в файле ODT выделить Заголовок, нажать комбинацию клавиш «Ctrl + X» (Вырезать), затем нажать комбинацию клавиш «Ctrl + Shift + V» (Вставить как) и выбрать пункт «Только текст».

Комментарии (12)


  1. ivankudryavtsev
    23.10.2023 10:43

    Респект, отличный подвиг :)

    А эти макросы отдельно не живут, чтобы на GitHub можно было только код выложить, а не ODT? Может лучше было бы сделать standalone экспортер, это возможно с помощью макросов LibreOffice?


    1. economist75
      23.10.2023 10:43

      Самое главное что есть в ODT - документация и примеры, основанные на стилях. Отдельные макросы возможны, но они не сработают, если не придерживаться того, что написано в ODT.


    1. bda_0 Автор
      23.10.2023 10:43

      Спасибо :) Макросы можно экспортировать в файлы .bas и выложить на GitHub. Однако без среды исполнения, коей является LibreOffice, в общем случае их запустить нельзя, т.е. без / вне ее они не живут. ODT является контейнером для текста, стилей и макросов, что может быть удобно для пользователей в качестве инструмента "из коробки".


      1. ivankudryavtsev
        23.10.2023 10:43

        ну я про то, что GitHub показывает по "нормальным" форматам и диффы и подсветку кода.


        1. bda_0 Автор
          23.10.2023 10:43

          Выгрузил файлы макросов .bas на Github https://github.com/bda-user/libre_office_macro


          1. ivankudryavtsev
            23.10.2023 10:43

            Если в ридми еще напишите как их превратить в odt - это будет то, что пользователи обычно ждут от oss решения.


            1. bda_0 Автор
              23.10.2023 10:43

              Обновил файл README.TXT на Github https://github.com/bda-user/libre_office_macro


    1. bda_0 Автор
      23.10.2023 10:43

      Иван, спасибо за вопрос! Покопался в поиске и похоже можно сделать то, о чем Вы говорите, в некотором роде, правда без LibreOffice все равно не обойтись. Судя по всему LibreOffice Writer можно запустить из командной строки (без GUI, например на сервере), указав в качестве параметра Макрос, которому в качестве параметра можно передать имя файла .ODT, который надо преобразовать в HFM / HTML. Для этого надо изменить Макрос, чтобы он принимал в качестве параметра имя файла .ODT (сейчас макрос работает с документом, из которого он вызван). Такой подход вполне оправдан с точки зрения администратора / безопасности. Пользователям может быть запрещено использование / добавление сторонних макросов. Они могут готовить тексты в соответствии с соглашениями, приведенными в данной статье, и отправлять файлы для экспорта. Администратор может настроить макросы на одной машине (без скачивания файла .ODT, из исходников) и запускать задания в пакетом режиме


  1. bda_0 Автор
    23.10.2023 10:43
    +2

    Коллеги, написал в тех. поддержку Хабра (neo@habr.team): Вопрос по подготовке контента Habr Flavored Markdown, ссылки внутри текста статьи.

    В режиме редактирования вставляю следующий текст:

    См. [листинг №1](#ref_1) ссылка внутри текста.

    ...

    Далее в тексте вставляю как указано https://habr.com/ru/docs/help/markdown/

    • Якорь:

      <anchor>habr</anchor>

    <anchor>ref_1</anchor>Листинг № 1.

    В режиме просмотра формируется ссылка: https://habr.com/ru/sandbox/202330/#ref_1

    но якорь, куда должна вести ссылка, отсутствует и как следствие ссылка не работает

    То же самое с оглавлением: ссылки формируются, а якоря нет.

    Может быть кто-нибудь знает в чем дело?


    1. pacupa
      23.10.2023 10:43

      А вы пробовали использовать атрибут id?

      <element id=x>text</element>


      1. bda_0 Автор
        23.10.2023 10:43

        К сожалению, вставка <element id=x>text</element>в режиме редактирования HFM в режиме просмотра транслируется в <p>text</p>.


  1. bda_0 Автор
    23.10.2023 10:43

    К сожалению, вставка <element id=x>text</element>в режиме редактирования HFM в режиме просмотра транслируется в <p>text</p>.

    Exosphere сегодня в 00:04

    Добрый вечер! Уже утром завела баг — вы третий, кто пришёл с проблемой. Оперативно ищем причину.