Артефакт

Подготовка текстов для 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)

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

4 августа 2008 г.
Copy Editing: последняя часть

Ещё на сайте

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

Интернет

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