Страница Ивана Рощина > Статьи >

© Иван Рощин, Москва

E-mail: bestview@mtu-net.ru
WWW: http://www.ivr.da.ru

Облегчение редактирования HTML-документов

Мир ПК» 6/2007)

Мне приходится заниматься редактированием HTML-документов и, в частности, выполнять следующее:

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

Таблица 1
Тег Сокращение
<i> [[
</i> ]]
<b> {{
</b> }}
<li> >> (в начале строки)
<br> << (в конце строки)
<a href="адрес"> <адрес>
</a> <>

Причём облегчение и ускорение происходит не только за счёт уменьшения количества набираемых символов. Смотрите сами: чтобы ввести «<i>», надо:
1) удерживая <Shift>, нажать «<»;
2) нажать «i»;
3) удерживая <Shift>, нажать «>».
То есть задействованы четыре разных клавиши. В то же время, чтобы ввести соответствующее сокращение, «[[», достаточно лишь дважды нажать одну клавишу.

Замечу, что при редактировании нужно учитывать следующее. Если надо выделить курсивом фрагмент текста, перед которым стоит открывающая квадратная скобка, то при этом после неё нельзя просто записать «[[». Дело в том, что получившееся «[[[» в итоге будет заменено на «<i>[», то есть первые два символа «[[» заменятся на «<i>», а это не то, что требуется. Надо использовать в таком случае не сокращение, а полную запись тега — «<i>». Аналогично и при выделении жирным шрифтом фрагмента текста, если перед ним стоит открывающая фигурная скобка, пишем после неё не «{{», а «<b>».

А если надо выделить курсивом фрагмент текста, заканчивающийся закрывающей квадратной скобкой, то пишем после неё не «]]», а «</i>». Аналогично и при выделении жирным шрифтом фрагмента текста, заканчивающегося закрывающей фигурной скобкой, пишем после неё не «}}», а «</b>».

Программа, заменяющая сокращения, в служебной информации HTML-документа (тегах, скриптах и т.п.) никаких замен не производит, чтобы исключить ситуацию, когда какое-то сокращение попадётся там случайно и будет заменено, что приведёт к порче документа. В то же время нельзя исключить возможность того, что какие-либо сокращения случайно попадутся не в служебной информации, а в остальном содержимом HTML-документа. И возникает резонный вопрос: как же с ними быть?

Чтобы такие случайно попавшиеся сокращения после редактирования не заменялись на теги, перед редактированием я произвожу в тексте (за исключением служебной информации) замены, описанные в табл. 2.

Таблица 2
Что заменяется На что заменяется
[[ &#91;&#91;
]] &#93;&#93;
{{ &#123;&#123;
}} &#125;&#125;
>> &gt;&gt;

Несколько комментариев насчёт этих замен:

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

Текст этой программы, подробно прокомментированный, вы можете найти в файле hdp.pl в Приложении. Программа написана на Perl (я использовал ActivePerl 5.8.6.811 для Windows).

Как работать с программой? При запуске в командной строке указываются три аргумента. Первый — это режим работы программы: 1 — если она запускается для обработки HTML-документа перед его редактированием, и 2 — если запуск происходит после редактирования. Второй аргумент — это имя файла с обрабатываемым документом, а третий — имя файла, в который будет записан обработанный документ (можно указать одинаковые имена файлов, чтобы обработанный документ заменил собой исходный).

Если при запуске программы не указаны аргументы, или указано неверное их количество, или первый аргумент не равен 1 или 2, то программа выведет краткую справку по синтаксису её вызова.

При нормальном завершении код выхода будет нулевым, а при ошибке — нет.

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

Обращу внимание на один момент, который следует учитывать при использовании программы. Выше я уже упоминал, что в служебной информации HTML-документа никаких замен она не производит. Для этого она должна эту информацию как-то распознавать. Это осуществляется с помощью регулярных выражений (ниже приведены строки программы с ними), описывающих различные известные мне элементы служебной информации.

 my $comment=qr#<!--.*?(--\s*>|\z)#s;         # Комментарий.
 my $style=qr#<style\b.*?(</style>|\z)#si;    # Таблица стилей.
 my $script=qr#<script\b.*?(</script>|\z)#si; # Скрипт.
 my $e1=qr#<\?.*?(\?>|\z)#s;  # Элементы вида "<?...?>" или "<%...%>" (могут
 my $e2=qr#<%.*?(%>|\z)#s;    # использоваться, например, для включения
                              # PHP-кода).
 my $another=qr#< ('[^']*('|\z) | "[^"]*("|\z) | [^>])* (>|\z)#x; # Элемент
 # вида "<...>", но концом элемента считается не первый же встреченный ">", а
 # кроме тех ">", что в строках, ограниченных одинарными или двойными
 # кавычками. Пример элемента: '<aaaa b=">" c="1">'.

 # Как видно из вышеприведённых шести регулярных выражений, если описываемый
 # в них элемент не завершается корректно (например, начался скрипт, но
 # "</script>" отсутствует), то считается, что он продолжается до конца
 # текста.

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

Представим пример (гипотетический), когда в документе с какой-то целью используется служебная информация вида «<$…$>». Так как программе неизвестен данный формат, то при встрече, например, такой конструкции:

<$>[[$>

будет обнаружено соответствие её начала — «<$>» — регулярному выражению $another, а все что дальше — будет посчитано за обычный текст, в результате чего «[[» будет заменено, что приведёт к порче обрабатываемого документа.

Таким образом, если в обрабатываемом документе используются такие виды служебной информации, которые не могут быть всегда правильно распознаны программой, то надо либо скорректировать программу, либо после её использования проверять, выполнила ли она все нужные замены и не выполнила ли ненужные.

Переходим ко второй части статьи. После того как HTML-документ отредактирован и замены сокращений на теги выполнены, надо ещё проверить: может быть, при редактировании где-то пропущен тег или поставлен лишний. Для облегчения этого процесса я написал, тоже на Perl, другую простую программу, которая по заданному списку парных тегов (он хранится в массиве @tags_names) проверяет для каждого тега из списка, чтобы в документе все такие теги располагались правильно, то есть каждому открывающему тегу соответствовал закрывающий и наоборот. Например, документ «<i></i>» будет сочтён правильным, а «</i><i>» — нет.

В вышеупомянутом массиве @tags_names помимо тегов «i», «b», «a», про которые я уже говорил, что мне приходится проставлять их при редактировании, содержится ещё тег «div», а также теги, применяемые при создании таблиц: «table», «caption», «tr», «th», «td» — их мне также иногда приходится добавлять при редактировании. Изменив массив @tags_names, вы можете добавить и ещё какие-либо парные теги, так же как и убрать те, проверка которых вам не нужна.

Текст проверяющей программы приведён в Приложении, в файле testhtml.pl. Он в кодировке DOS (CP866) — это нужно для того, чтобы сообщения на русском языке выводились правильно.

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

Если программа не найдёт ошибок в проверяемом документе, то выдаст «All OK!» и завершится с нулевым кодом выхода. В противном случае — выведет сообщение об ошибке с указанием, к какому тегу оно относится, и завершится с ненулевым кодом выхода.

Например, для такого обрабатываемого документа:

<i> </i> </b>

будет выведено такое сообщение:

Ошибка: перед закрывающим тегом "b" в строке 1 -
нет соответствующего открывающего тега!

А для такого документа:

<b> </b> <b>

будет выведено такое сообщение:

Ошибка: после 2-го открывающего тега "b" в строке 1 -
нет соответствующего закрывающего тега!

Здесь в строке несколько таких тегов, как связанный с ошибкой (т.е. два открывающих тега «b»), поэтому программа дополнительно выводит, какой этот тег из них по счёту, что позволяет его однозначно идентифицировать.

Кстати, почему для этого не указывается просто позиция тега в строке (а ведь сначала я хотел сделать именно так)? Дело в том, что для определения позиции какого-либо символа в строке текстового файла надо знать, как именно интерпретируются символы горизонтальной табуляции, ведь они могут встретиться перед этим символом. Обычно табуляция означает переход к ближайшей следующей позиции с номером, кратным восьми (если нумеровать позиции с нуля). Но это не всегда так, а зависит от используемого текстового редактора и его настроек. А так как моей программе эти сведения недоступны, то и точное определение позиции тега в строке не представляется возможным.

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

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

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

Приложение

Скачать программы (5 КБ ZIP)

Другие мои статьи о создании, обработке или просмотре HTML-документов:

1. 

«Браузер Opera: несколько советов». «Радиомир. Ваш компьютер» 3/2003.

2. 

«Преобразование псевдографических таблиц в формат HTML». «Радиомир. Ваш компьютер» 5—7/2003.

3. 

«Добавление в HTML-документы информации об их кодировке». «Радиомир. Ваш компьютер» 10/2003.

4. 

«Браузер Opera: ещё несколько советов». «Радиомир. Ваш компьютер» 12/2003.

5. 

«Автоматическое проставление размеров файлов в HTML-документах». «Радиомир. Ваш компьютер» 11/2004.

6. 

«Расширения файлов TR-DOS». «Радиолюбитель. Ваш компьютер» 12/2000, «Радиомир. Ваш компьютер» 9/2001 (под псевдонимом BV_Creator), «Радиомир. Ваш компьютер» 2—5/2005 (исправленная и дополненная версия).

(В этой статье можно найти сведения о том, как просматривать HTML-документы на ZX Spectrum (в TR-DOS) и о том, где найти информацию об их формате.)

7. 

«Преобразование из текста в HTML». «Мир ПК» 7/2006.

8. 

«Автоматическое переименование файлов в соответствии с их содержимым». «Мир ПК» 9/2006.

(С помощью описанной в этой статье программы можно переименовывать HTML-файлы в соответствии с заголовками содержащихся в них документов.)

Страница Ивана Рощина > Статьи >