WWW.TEKCT.RU

Преобразование текста в формате Word в набор html-файлов

Эта статья была написана в 2013 году, а пересмотрена в 2022 году. Основной макрос переделан. Исправлен баг с неправильным вложением тегов, добавлен тег для надстрочного индекса (sup), предложены варианты для html-верстки абзацев (с элементами br или p). Но самое главное — решена проблема с кодировкой utf-8. Книга, которая была получена таким способом, находится здесь.

Задача такая. У нас есть достаточно объемный текст, назовем его условно «книга», подготовленный в редакторе Word. Нам надо преобразовать его в набор web-страниц. Кроме того, необходимо сформировать содержание с гиперссылками. Делать такую работу вручную — очевидно, потратить очень много времени. Необходим макрос для автоматизации процесса.

Разумеется, макрос пишется для определенных условий и допущений. Прежде чем использовать макрос — убедитесь, что текст соответствует алгоритму преобразования. Если нет — надо или доработать текст, или доработать макрос.

В нашем случае оформление документа Word можно считать традиционным. В тексте для заголовков глав использован стиль Заголовок 1, для заголовков разделов — Заголовок 2. Допустим, что каждый раздел должен попадать на отдельную web-страницу. Будем считать также, что существуют подразделы, заголовки которых отформатированы стилями Заголовок 3 и Заголовок 4. Для этих подразделов создавать отдельные web-страницы не нужно, но названия должны попасть в содержание.

Каким стилем отформатирован основной текст, не важно. Мы будем преобразовывать абзацы Word в абзацы HTML.

Если в тексте книги есть фрагменты текста, отформатированные курсивом или полужирным, это форматирование должно попасть и в html-код.

Надстрочные индексы форматируются при помощи элемента <sup></sup>.

Само собой, в книге могут быть рисунки. Примем правило: в том месте, где должен находиться рисунок, стоит «метка», состоящая из квадратных скобок и слова ris. Например, первый рисунок первой главы обозначается так: [ris01_01]. Файл рисунка подготавливается, естественно, отдельно, и в этом случае он должен быть назван ris01_01.jpg. Размеры в коде HTML придется проставить вручную.

Подрисуночные подписи находятся в отдельных абзацах, их надо выравнивать по центру (обычный текст — по ширине). Подрисуночные подписи будем опознавать по началу: фрагменту «Рис.».

Конвертация книги займет несколько этапов.

1. Подготовка исходного файла doc и шаблона

Разумеется, надо сделать копию файла с книгой и работать c этой копией. Если в книге есть таблицы, их надо изъять (оставив метки, например, [T 01], [T 02]) и преобразовать в формат html отдельно. Вот тут http://www.textfixer.com/html/convert-word-to-html.php я нашел очень хорошую онлайновую очищалку (очистить HTML от Word). Просто копируете туда таблицу, а на выходе получаете чистый html-код. Доработка его очень проста: добавить атрибуты по желанию в тег TABLE, и, опять же, при желании, выровнять данные в ячейках по ширине и высоте. Делается это элементарно в любом HTML-редакторе. Сохраните таблицы в отдельном файле docx и в конце работы вставьте на web-страницы.

Макросы рассчитаны на работу с папкой D:\mysite\ (будем называть ее рабочей). Или создайте такую же, или создайте свою и отредактируйте текст макросов (в начале каждого макроса задаются исходные данные).

Необходимо создать в рабочей папке шаблон раздела shablon.htm. В нем надо разместить весь стандартный html-код. В частности, должен быть тег TITLE с постоянной текстовой частью. Макрос будет разнообразить содержимое этого тега дополнительным текстом, взятым из заголовков (что хорошо для SEO). Место, куда должен быть вставлен текст раздела, требуется ЗАРАНЕЕ пометить комментарием <!--text-->

Места, куда должны быть вставлены ссылки к предыдущему разделу, пометить комментарием <!--prev--> (обычно такие ссылки вставляют в начале и в конце страницы, чтобы читающему было удобно).

Места, куда должны быть вставлены ссылки к следующему разделу, пометить комментарием <!--next-->.

Полезно сделать в шаблоне линк к CSS. Это позволяет решить много проблем. Например, часто бывает, что буквы, выделенные курсивом, выглядят более тонкими по сравнению с буквами обычного текста. Одно из решений проблемы — присвоить тегу I свойство {font-weight: bold}. Да и мало ли, какое оформление захочется еще добавить. Для абзацев обычного текста нами будет назначен класс maintext, для подрисуночных подписей — picturename. Если захотите использовать другие классы или что-то еще, пожалуйте ручками править макрос book_to_htm_web(). Предполагается также, что все рисунки находятся в папке images.

Всё с этим макросом было нормально, пока страницы делались в кодировке windows-1251. Но сегодня чаще всего используется кодировка utf-8. И оказалось, что Word в данном случае не справляется: в пределах одной web-страницы символы имеют разную кодировку (то есть часть текста не читается). Решение было найдено. Для этого надо:

1. Подготовить файл шаблона в формате html и кодировке utf-8;

2. Скопировать весь его текст в файл shablon.docx, который находится в рабочей папке. Макрос будет извлекать из него html-код шаблона.

2. Предварительная обработка файла doc

Откройте в Word подготовленный файл книги и запустите макрос book_to_htm_pre(). Он заменит в тексте угловые скобки и амперсанды (если они есть) на соответствующие спецсимволы, в соответствии с правилами HTML.

Кроме того, макрос оформит тегами форматирование текста полужирным и курсивом. То есть, если у нас в тексте есть выделенное слово, оно будет записано так: <b>слово</b> . Разумеется, после соответствующего допиливания кода макросов, подобным образом можно БЫЛО БЫ оформить и другое символьное форматирование (нижний индекс, подчеркнутое и зачеркнутое начертание), главное, чтобы в языке VBA имелось свойство для этого вида формата.

Тут есть небольшая хитрость: если полужирным или курсивом заканчивается абзац, в конце абзаца необходимо поставить закрывающий тег B или I. Это нужно, чтобы в дальнейшем теги были вложены правильно (макрос это учитывает).

После этого документ Word сохраняется (автоматизированной командой Сохранить как) в отдельном файле (в рабочей папке): к имени файла добавляется _to_html. В дальнейшем работа будет идти только с ним.

На этом этапе можно вручную расставить некоторые теги в тексте - т.е. редактируя документ в Word. Например, я знаю, что в моей книге один раз (!) встречается ненумерованный список. Можно, конечно, добавить в макрос необходимый код. Но гораздо быстрее и проще добавить в текст несколько тегов UL и LI. Да и мало ли какое еще оформление попадется в тексте! На каждый чих в аптеку не бегают.

Можно, конечно, да и полезно, просмотреть обработанный текст, чтобы выяснить, что получилось. Сохраните полученный документ в отдельном файле.

3. Конвертация docx в html

Откройте (если не открыт) обработанный файл книги в Word (тот, где в имени есть _to_html) и запустите макрос book_to_htm_web_br_v2(). Осталось дождаться конца его работы и можно начинать просмотр web-страниц (с файла contents1.htm). Если выполнение макроса прервется, необходимо удалить полученные web-страницы и запустить его снова.

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

Есть 2 варианта оформления абзацев. Если для одного абзаца используется элемент p, то абзацы разделяются пустыми строками (как в этой статье). Если используется элемент br, то вид текста более традиционный. Поэтому в макросе надо оставить одну из следующих строк (в переменной tx хранится текст абзаца):

Selection.TypeText text:="<p class=""maintext"" align=""justify"" >" & Trim(tx) & "</p>"

или

Selection.TypeText text:=Trim(tx) & "<br>" ' формируем конец "абзаца"

Ищите комментарий в тексте макроса.

Поскольку в текст формата HTML вставляются двойные кавычки, макрос командой Options отключает автозамену двойных кавычек (на типографские). Если для вас это важно, верните потом режим обратно (Сервис — Параметры автозамены — Автоформат при вводе).

Если вам интересно, для чего этот макрос можно использовать, посмотрите эту книгу или эту книгу. Макросы создавались 2 дня, конвертация заняла 20 минут. Работа «вркопашную» заняла бы намного больше времени, да и была бы намного скучнее :).

В этом архиве находится модуль со всеми необходимыми процедурами и функциями (с комментариями).

© TEKCT.RU, А. Гончаров, 2010-2022

Рейтинг@Mail.ru