Артефакт

Подготовка текстов для WWW / 9 февраля 2007 г.

Сейчас я перевожу в HTML распознанную Екатериной Алфимовой книжку Grammatik der deutschen Sprache. Думаю, что это хороший повод описать последовательность действий по форматированию, тем более, что вопросы о том, как делаются такие вещи, я получаю по электронной почте вполне регулярно. На универсальность рецептов, естественно, не претендую, и с удовольствием внесу присланные вами поправки. Неплохо было бы, конечно, просто выложить макрос, но куда лучше будет всё-таки разобраться, что предстоит делать.

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

°1.°Der·bestimmte·Artikel
Der·Löwe·(d.°h.·alle·Löwen)°—·ist·„ein·Raubtier“.¶

Примечание: текст выглядит так со включенной опцией отображения специальных символов.

Предполагается, что существует файл с заранее созданными стилями CSS, и нам остаётся только разметить текст в максимальном приближении к оригиналу.

Что-то в дальнейшем изложении может быть непонятно, но я всё-таки предполагаю, что вы прочитали всё рекомендуемое в начале раздела «Текстовая лаборатория».

Шаг ноль. Пока ещё не до кодов.

Как мы уже говорили, всё сидит в .docе и дрожит от предвкушения. Начнём.

A. Убран ли мусор?

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

Вторая беда — табуляции (^t). FineReader втыкает их всюду, где, по его мнению, отступ элементов текста друг от друга не укладывается в формат пробела. Их нужно заменять пробелами (текст впоследствии форматируется с помощью тегов HTML), а где это не соответствует структуре — настоящими таблицами.

Все пробелы в документе должны быть одинарными. Отбивки, выполненные с помощью множественных пробелов, свидетельствуют о кривизне рук.

Ну и, помимо всего прочего, на веб-странице все эти пробелы-табуляции попросту схлопнутся.

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

B. Всё ли в порядке с абзацной разметкой?

Как ни странно, вряд ли. И не только с ней. Особенно если вы распознавали документ после сканера. Мне повезло, Екатерина отлично сделала работу, но так ли обстоит дело с вашим текстом?

Составим список того, в чём нужно убедиться.

1. Вокруг ^p нет пробелов.

Проверяется и лечится множественной заменой ·^p на ^p и ^p· на ^p. Точка в центральной позиции, напомню, обозначает пробел. Пробелы, оставленные в конце абзацев, в процессе дальнейших поисков и замен обязательно вызовут к жизни переходящие из версии в версию глюки MS Word, с которыми я вас познакомлю в других статьях.

2. Все переносы строки жёсткие, то есть нет мест, где вместо ^p стоит ^l.

Если не проделать замену ^l → ^p, где-то в документе обязательно исчезнет разбиение на абзацы. То есть в Wordе оно останется, но не перейдёт в форматирование HTML.

3. В тексте отсутствует принудительная структурная разметка.

Документ лучше обрабатывать поглавно (посекционно) в отдельных файлах, проделав заранее только те замены, которые относятся ко всему тексту. Символы ^n (Column Break), ^m (Manual Page Break), ^b (Section Break) и т. д. в нём будут совершенно лишними и, опять же, помогут потерять часть абзацной разбивки.

4. Все абзацы каждого стиля в документе оформлены одинаково.

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

C. Всё ли в порядке с плотностью текста?

После сканирования текст в различных частях документа иногда выглядит слишком плотным или, наоборот, разреженным: ответственен за это параметр Character Spacing, определяемый в диалоге Font. Это тоже нужно отрегулировать. Первая причина упомянута в пункте 4, кроме того, в случае с беспорядочной плотностью бывает невозможно определить на глаз, где есть пробел, а где нет, и т. п.

D. Как чувствуют себя неразрывные пробелы и пунктуация?

HTML, к которому мы стремимся, очень вольно обращается с переносом контента. Вряд ли вам захочется, чтобы в сочетании г. Самара буква г при изменении ширины страницы осталась на одной строке, а Самара переехала на следующую. Тут-то и спасают неразрывные пробелы. Подробный разговор о том, в каких ситуациях их нужно использовать — тема другой статьи.

Но пора переходить к обработке фрагмента текста, взятого в качестве примера.

Шаг один. Пунктуация и пробелы.

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

Итак, воспроизведём исходный материал ещё раз:

°1.°Der·bestimmte·Artikel
Der·Löwe·(d.°h.·alle·Löwen)°—·ist·„ein·Raubtier“.¶

Теперь вызовем диалог Find & Replace и заменим спецсимволы и «недружественные» HTML знаки препинания на Entities и обозначения Unicode (до букв с диакритикой дело ещё не дошло).

Строка поиска Строка замены Комментарий
^s (°)    неразрывный пробел
(Alt+0151) —  тире
(Alt+0150) –  минус
(Alt+0132) „  левая «лапка»
(Alt+0147) “  правая «лапка»
(Alt+0146) ’  апостроф
« (Alt+0171) «  левая «ёлочка»
» (Alt+0187) »  правая «ёлочка»

Примечание: «левая» и «правая» ёлочки в русском и немецком языках выполняют противоположные функции. Пример: »Die Aufgabe«. А вот с „лапками“, кстати, всё в порядке.

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

Наш текст теперь выглядит следующим образом:

 1. Der·bestimmte·Artikel
Der·Löwe·(d. h.·alle·Löwen) —·ist·„ein·Raubtier“

Пока этого достаточно.

Шаг два. Курсив и полужирный шрифт.

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

  Строка поиска Строка замены
курсив ([!^13])  <i>\1</i> 
</i><i>  пусто 
полужирный шрифт ([!^13])  <b>\1</b> 
</b><b>  пусто 

После первой замены для полужирного шрифта слово «Artikel» в первой строке, например, будет выглядеть так:

<b>A</b><b>r</b><b>t</b><b>i</b><b>k</b><b>e</b><b>l</b>

После второй замены разметка примет желаемый вид. То же относится к курсиву. Если в документе есть другие виды разметки (цветной текст, полужирный курсив и т. д.), для них можно придумать другие теги (напр. <c>, <d> и т. д.), которые впоследствии можно будет заменить на атрибуты соответствующих стилей.

Например, если для полужирного шрифта разработан специальный стиль, то после описанных выше замен можно проделать ещё две (опция Use Wildcards отключается):

Строка поиска Строка замены
</b>  </span> 
<b>  <span·class="style_name"> 

Текст теперь выглядит примерно так:

<b>&nbsp;1</b>.&nbsp;Der·bestimmte·<b>Artikel</b>
Der·Löwe·(d.&nbsp;h.·<i>alle·Löwen</i>)&nbsp;&#151;·ist
&#132;ein·Raubtier&#147;

Здесь обязательно нужно упомянуть о контекстах.

Это лирическое отступление снова отсылает нас к этапу форматирования текста до нашей с вами попытки сделать из него HTML.

Предположим в тексте встречается вот такая последовательность:

be-, ge-, er-, ver-, zer-, emp-, ent-, miß-

Неотделяемые приставки в списке должны быть выделены полужирным шрифтом. Вопрос: следует ли служащие разделителями запятые выделить аналогичным образом?

Ответ: да, или нет. Всё зависит от контекста.

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

 213. Die Vorsilgben be-, ge-, er-, ver-, zer-, emp-, ent- und miß-

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

Die Vorsilben sind: be-, ge-, er-, ver-, zer-, emp-, ent- und miß-.

То же самое можно сказать о курсиве и других видах форматирования.

Шаг три. Буквы с диакритикой и прочая галантерея.

На этом этапе нам нужно заменить на обозначения Unicode все оставшиеся в тексте символы, не входящие в стандартную таблицу ASCII. Можно использовать и Entities, но лично мне уже привычнее первое.

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

Не забывайте, что при выполнении операции Find & Replace с использованием приведённых ниже символов нужно обязательно включать галочку Match Case, иначе получится каша. Сам иногда наступаю на эти грабли.

Немецкий язык:

Строка поиска Строка замены
Ä &#196; 
ä &#228; 
Ö &#214; 
ö &#246; 
Ü &#220; 
ü &#252; 
ß &#223; 

Французский язык:

Строка поиска Строка замены
Û &#219; 
û &#251; 
Ô &#212; 
ô &#244; 
Ï &#207; 
ï &#239; 
Ë &#203; 
ë &#235; 
 &#194; 
â &#226; 
Ê &#202; 
ê &#234; 
Î &#206; 
î &#238; 
Ù &#217; 
ù &#249; 
Œ &#338; 
œ &#339; 
É &#201; 
é &#233; 
È &#200; 
è &#232; 
À &#192; 
à &#224; 
Ç &#199; 
ç &#231; 

На данном этапе текст приобретает следующий вид:

<b>&nbsp;1</b>.&nbsp;Der·bestimmte·<b>Artikel</b>
Der·L&#246;we·(d.&nbsp;h.·<i>alle·L&#246;wen</i>)&nbsp;&#151;·ist
&#132;ein·Raubtier&#147;

Вопрос: почему я оставляю эти буквы «на потом», не обрабатывая их на том же этапе, что и знаки пунктуации? Да просто потому, что хочется сохранить относительную читабельность текста как можно дольше, иначе ориентироваться в структуре документа станет очень непросто.

Шаг четыре. HTML-абзацы.

Для обрамления Wordовских абзацев тегами <p> достаточно всего одной замены:

Строка поиска Строка замены
^p  </p>^p<p> 

Документ после неё выглядит так:

<b>&nbsp;1</b>.&nbsp;Der·bestimmte·<b>Artikel</b>.</p>
<p>Der·L&#246;we·(d.&nbsp;h.·<i>alle·L&#246;wen</i>)&nbsp;&#151;·ist
&#132;ein·Raubtier&#147;.</p>
<p>

Теперь можно добавить открывающий тег <p> в самый первый абзац и убрать его из последнего. Получаем почти готовый код:

<p><b>&nbsp;1</b>.&nbsp;Der·bestimmte·<b>Artikel</b>.</p>
<p>Der·L&#246;we·(d.&nbsp;h.·<i>alle·L&#246;wen</i>)&nbsp;&#151;·ist
&#132;ein·Raubtier&#147;.</p>

Добавлю, что делать эту замену лучше всё-таки не сразу во всём документе, а поочерёдно в тех его частях, где нет таблиц. Иначе потом весьма утомительно будет выгребать из них лишние теги.

Шаг пять. Таблицы.

HTML-код для таблиц я раньше обычно делал так: открывал Dreamweaver, быстренько создавал там таблицу нужного формата, после чего переносил в неё текст из Wordовской таблицы. Недостаток: нужно постоянно переключаться между режимами Code View/Design View, первое — для вставки текста, второе — для ориентации в таблице. Ориентироваться, конечно, не особенно сложно и прямо в коде, но это требует немного больше времени.

По ссылке внизу вы можете скачать написанный мною макрос, генерирующий HTML-код, соответствующий исходной таблице Wordа, называется он setBasicTable. Этот макрос работает с любой таблицей, в которой нет объединённых ячеек. Для его запуска нужно скопировать таблицу в отдельный документ: генерируемый HTML-код появится сразу после неё.

Наиболее полное решение задачи конвертации таблиц, включающее проблему объединённых ячеек, вы можете найти вот здесь.

Шаг шесть. Заголовки и структура.

После того, как разметка документа практически закончена, можно бегло просмотреть его, заменяя по ходу дела теги <p> при заголовках на теги <h1>, <h2> и размечая при необходимости другие крупные структурные блоки.

<h1><b>&nbsp;1</b>.&nbsp;Der·bestimmte·<b>Artikel</b>.</h1>
<p>Der·L&#246;we·(d.&nbsp;h.·<i>alle·L&#246;wen</i>)&nbsp;&#151;·ist
&#132;ein·Raubtier&#147;.</p>

Работа закончена. Теперь можно честно открыть Notepad и поместить подготовленный HTML-код в тело страницы.

Последовательность всех описанных выше замен, как вы понимаете, может сильно отличаться от описанной. Их число и природа — тоже. Но принцип, я думаю, понятен.

И ещё кое-что...

В заключение — небольшой макрос, который не имеет практически никакого отношения к тому, что сказано выше, но зато генерирует базовый HTML-код для всей страницы сразу.

Предположим, что у вас есть документ Word, который не содержит никаких специальных символов (кроме разве что неразрывных пробелов, без которых дело никогда не обходится) ... а если содержит, то они уже преобразованы в код, как это было проделано в основной части статьи. Теги <p> в документе отсутствуют, заголовки вы пометите позже.

Что предстоит сделать?

В первую очередь — расставить пресловутые <p>, а кроме того — прописать <html>, <body>, <head> и задать параметры используемых в документе стилей при помощи тега <style> со всем содержимым. Для простоты названием документа (<h1>) и именем автора (<h2>) считаются соответственно первый и второй абзацы.

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

Макросы к этой статье

setItalic (расставляет теги <i>)
setBold (расставляет теги <b>)
setGFLetters (меняет на &#XXXX; немецкие и французские буквы с диакритикой)
addMarkup (делает HTML-документ с базовой разметкой)
setBasicTable (генерирует HTML-код для базовой таблицы Word)

Новости раздела

18 ноября 2020 г.
Комплектация библиотеки файлами .fb2

Ещё на сайте

Библиотека
Языки
Друзья
Канада
Авторский угол

Интернет

CPAN
Citforum
W3C.org
useit.com
Типомания
Code Charts
ру/ководство
Лаборатория dk
WebReference.com
Спецификация Perl
Заметки HTML-кодера
Анатомия Adobe Photoshop
The Apache Software Foundation


Рейтинг@Mail.ru

wordpress statistics

Рейтинг@Mail.ru