© Иван Рощин, Москва
| : bestview@mtu-net.ru | |
| WWW | : http://www.ivr.da.ru |
(«Мир ПК» 6/2007)
Мне приходится заниматься редактированием
Как при обычном письме используются сокращения, чтобы облегчить и ускорить процесс, так и я решил использовать сокращения (табл. 1) при простановке вышеуказанных тегов. А после того как документ отредактирован, я заменяю в нём эти сокращения на полную форму записи с помощью специальной программы.
| Тег | Сокращение |
|---|---|
| <i> | [[ |
| </i> | ]] |
| <b> | {{ |
| </b> | }} |
| <li> | >> (в начале строки) |
| <br> | << (в конце строки) |
| <a href="адрес"> | <адрес> |
| </a> | <> |
Причём облегчение и ускорение происходит не только за счёт уменьшения
количества набираемых символов. Смотрите сами: чтобы ввести
«<i>», надо:
1) удерживая <Shift>, нажать «<»;
2) нажать «i»;
3) удерживая <Shift>, нажать «>».
То есть задействованы четыре разных клавиши. В то же время, чтобы ввести
соответствующее сокращение, «[[», достаточно лишь дважды нажать
одну клавишу.
Замечу, что при редактировании нужно учитывать следующее. Если надо выделить курсивом фрагмент текста, перед которым стоит открывающая квадратная скобка, то при этом после неё нельзя просто записать «[[». Дело в том, что получившееся «[[[» в итоге будет заменено на «<i>[», то есть первые два символа «[[» заменятся на «<i>», а это не то, что требуется. Надо использовать в таком случае не сокращение, а полную запись тега «<i>». Аналогично и при выделении жирным шрифтом фрагмента текста, если перед ним стоит открывающая фигурная скобка, пишем после неё не «{{», а «<b>».
А если надо выделить курсивом фрагмент текста, заканчивающийся закрывающей квадратной скобкой, то пишем после неё не «]]», а «</i>». Аналогично и при выделении жирным шрифтом фрагмента текста, заканчивающегося закрывающей фигурной скобкой, пишем после неё не «}}», а «</b>».
Программа, заменяющая сокращения, в служебной информации
Чтобы такие случайно попавшиеся сокращения после редактирования не заменялись на теги, перед редактированием я произвожу в тексте (за исключением служебной информации) замены, описанные в табл. 2.
| Что заменяется | На что заменяется |
|---|---|
| [[ | [[ |
| ]] | ]] |
| {{ | {{ |
| }} | }} |
| >> | >> |
Несколько комментариев насчёт этих замен:
Замены перед редактированием производятся с помощью той же самой программы, что и после редактирования (соответствующий режим работы программы указывается в командной строке).
Текст этой программы, подробно прокомментированный, вы можете найти в файле hdp.pl в Приложении. Программа написана на Perl (я использовал ActivePerl 5.8.6.811 для Windows).
Как работать с программой? При запуске в командной строке
указываются три аргумента. Первый это режим работы программы:
1 если она запускается для обработки
Если при запуске программы не указаны аргументы, или указано неверное их количество, или первый аргумент не равен 1 или 2, то программа выведет краткую справку по синтаксису её вызова.
При нормальном завершении код выхода будет нулевым, а при ошибке нет.
При необходимости можно изменить программу, например, если вы решите
использовать
Обращу внимание на один момент, который следует учитывать при
использовании программы. Выше я уже упоминал, что в служебной информации
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, а все что дальше будет посчитано за обычный текст, в результате чего «[[» будет заменено, что приведёт к порче обрабатываемого документа.
Таким образом, если в обрабатываемом документе используются такие виды служебной информации, которые не могут быть всегда правильно распознаны программой, то надо либо скорректировать программу, либо после её использования проверять, выполнила ли она все нужные замены и не выполнила ли ненужные.
Переходим ко второй части статьи. После того как
В вышеупомянутом массиве @tags_names помимо тегов «i»,
«b», «a», про которые я уже говорил, что мне
приходится проставлять их при редактировании, содержится ещё тег
«div», а также теги, применяемые при создании таблиц:
«table», «caption», «tr»,
«th», «td» их мне также иногда приходится
добавлять при редактировании. Изменив массив @tags_names, вы можете добавить и
ещё
Текст проверяющей программы приведён в Приложении, в файле testhtml.pl. Он в кодировке DOS (CP866) это нужно для того, чтобы сообщения на русском языке выводились правильно.
Пользоваться программой очень просто. При её запуске в командной
строке указывается имя проверяемого
Если программа не найдёт ошибок в проверяемом документе, то выдаст «All OK!» и завершится с нулевым кодом выхода. В противном случае выведет сообщение об ошибке с указанием, к какому тегу оно относится, и завершится с ненулевым кодом выхода.
Например, для такого обрабатываемого документа:
<i> </i> </b>
будет выведено такое сообщение:
Ошибка: перед закрывающим тегом "b" в строке 1 - нет соответствующего открывающего тега!
А для такого документа:
<b> </b> <b>
будет выведено такое сообщение:
Ошибка: после 2-го открывающего тега "b" в строке 1 - нет соответствующего закрывающего тега!
Здесь в строке несколько таких тегов, как связанный с ошибкой (т.е. два открывающих тега «b»), поэтому программа дополнительно выводит, какой этот тег из них по счёту, что позволяет его однозначно идентифицировать.
Кстати, почему для этого не указывается просто позиция тега в строке (а
ведь сначала я хотел сделать именно так)? Дело в том, что для определения
позиции
Программа завершается при обнаружении первой же ошибки. Таким образом, после исправления ошибки следует запустить программу повторно, чтобы убедиться в отсутствии других ошибок.
Замечу, что эта программа распознаёт служебную информацию в обрабатываемом документе так же, как и первая. И если в документе попадётся неизвестный программе элемент служебной информации и программа не сможет правильно его распознать, то не исключена выдача неверного результата проверки документа.
В завершение скажу, что приведённые в этой статье программы можно взять за
основу при написании
|
Другие мои статьи о создании, обработке или просмотре
|