WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Верстайте тексты правильно


Прислал: Виталий Свистунов [ 22.06.2001 @ 05:13 ]
Раздел:: [ Публикации ]


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

Вначале рассмотрим основные правила верстки текстов, касающиеся расстановки различных символов. Это лишь малая часть того, что требуется для создания красиво оформленных, а главное – приятных для чтения публикации. Интересующихся отправляю к, пожалуй, единственной книге в нашей стране по данному вопросу, «Справочнику художественного и технического редакторов». К сожалению, многие правила, описанные в этой книге, невозможно реализовать при верстке вебстраниц в силу технических особенностей броузеров.

Кавычки

Существует ряд правил, относящихся к кавычкам. Так, для русского языка приемлемы только кавычки вида « » (елочки) или „ “ (лапки), причем, первые предпочтительней. Лапки используются в рукописном тексте, ими же оформляются вложенные кавычки второго уровня (пример: Кандидат пишет в резюме: «Три года работал в компании „Русский дом Селенга“»).

«Черточки»

Бывают трех видов: тире, короткое тире и дефис. Дефис (-) используется только в сложных словах типа все-таки, мало-помалу, Олимпиада-80 и подобных и никогда не отбивается пробелами. Тире ( — ) используется во всех остальных случаях и отбивается с двух сторон — так оно куда лучше выглядит. Существует еще одно правило: тире не должно начинать строку. Поэтому перед тире необходимо вставлять неразрывный пробел, а после — обычный пробел.

Короткое тире — достаточно малоупотребительный элемент набора. Оно используется при указании границ диапазона: 15–20, XIX–XX вв. И, так же как и дефис, не отбивается пробелами. Оно же используется в качестве знака «минус» в арифметических выражениях.

Пробелы

Фамилия от инициалов отбивается неразрывным пробелом, а инициалы друг от друга не отбиваются (пример: Путин В.В.) Такое же правило используется и в сокращениях типа «и т.д., и т.п.» Неразрывным должен быть пробел, разделяющий порядки в больших числах типа 10 000 000… Пробелами никогда не отбиваются от предшествующего числа знаки %, показатели степени, подстрочные индексы и математические знаки. Пробел также не ставится после открывающей кавычки или скобки и перед закрывающей кавычкой или скобкой.

Неразрывный пробел всегда ставится перед единицами измерения (100 см) и после знаков #, §, ©, №.

Как реализовать?

Напоследок предлагаю небольшую функцию на PHP, реализующую вышеназванные правила типографики.

Пусть исходный тест содержится в переменной $txt.

Первая часть. Делает правильную верстку текста, вставленного, допустим, из Ворда. Обработка дефисов-тире, апострофов, расстановка неразрывных пробелов после предлогов, цифр, в сокращениях, «правильные „двойные кавычки“». Заметим, что внутри тегов кавычки не обрабатываются.

$search = array ("'[ ]([,\.:\?!;])'", "'\.\.\.'", "'([A-ZА-ЯЁ]\.)[ ]([A-ZА-ЯЁ]\.)'", "'([т]\.)[ ]([дп]\.)'", "' (\n)'", "'(^) '", "'(<[^\/\>]*>) '", "' ($)'", "' (\<\/)'", "'([ \n«\(\-\>])[\"“„]'", "'(^)[\"“„]'", "'[\"”„]($)'", "'[\"”„]([\- \n\.…,:;!\?\)»\<])'", "'(<[^>]*)[«»]([^<]*>)'", "'(«[^»]*)[«]([^«]*»)'", "'(«[^»]*)[»]([^«]*»)'", "'(<.*)[’](.*>)'", "'ё'", "'Ё'", "'(г.) ([A-Za-zА-я])'", "'(^[A-Za-zА-я]{1,3}) ([A-Za-zА-я«])'", "'([ \>][A-Za-zА-я]{1,3}) ([A-Za-zА-я«])'", "'([0-9]) ([0-9])'", "'([0-9]) ([A-Za-zА-я])'", "'([§©®№])([0-9A-Za-zА-я])'", "'([§©®№]) '", "'\-\-'", "'–'", "'[\-—]([0-9])'", "'([^ ])—([^ ])'", "' - '", "' —'");

$replace = array ("\\1", "…", "\\1\\2", "\\1\\2", "\\1", "\\1", "\\1", "\\1", "\\1", "\\1«", "\\1«", "»\\1", "»\\1", "\\1\"\\2", "\\1„\\2", "\\1“\\2", "\\1\'\\2", "е", "Е", "\\1 \\2", "\\1 \\2", "\\1 \\2", "\\1 \\2", "\\1 \\2", "\\1 \\2", "\\1 ", "—", "—", "–\\1", "\\1 — \\2", " — ", " —");

$txt = preg_replace ($search, $replace, $txt);

Далее, заменяем символы на HTML-код

$symb = array ("' '", "'—'", "'–'", "'«'", "'»'", "'“'", "'„'", "'§'", "'©'", "'®'", "'°'", "'…'", "'‘'", "'’'", "'™'", "'±'", "'№'");

$codes = array ("&nbsp;", "&#151;", "&#150;", "&#171;", "&#187;", "&#147;", "&#132;", "&#167;", "&#169;", "&#174;", "&#176;", "&#133;", "&#145;", "&#146;", "&#153;", "&#177;", "&#8470;");

$txt = preg_replace ($symb, $codes, $txt);

Вот и все! Советую делать это перед помещением текста на сайт, а не при выводе пользователю. Операция достаточно ресурсоемкая.




 :::::  iSmart пишет 26.06.2001 @ 19:56 
Вот каких публикаций не хватает в рунете! Побольше бы подобной информации :)
 :::::  Вовка пишет 26.06.2001 @ 20:02 
Хорошо, но мало...
 :::::  Андрей пишет 27.06.2001 @ 01:42 
Здорово! (это я насчет кода)
Правда, сам код не проверял еще, но надеюсь, что обрабатывает он корректно. Одно предложение. Было бы вообще классно, если бы можно было автоматически генерировать новый файл (или взамен старого), содержащий уже правильно набранный текст. Вышла бы замечательная штука. Например, пользователь отправляет исходный текст через браузер, он (текст), автоматически корректируется и с помощью скрипта сохраняется на сервере в виде отдельного файла и при запросе вставляется посредством SSI в HTML-шаблон. Или же вообще тект выкладывается на сервере с помощью аттачмента, один-единственный раз корректируется и уже в виде нового файла идет на HTML-страницу.
 :::::  Виталий Свистунов пишет 27.06.2001 @ 02:11 
Андрею:
На самом деле, для этого я и писал скрипт:) Пременная $txt может содержать текст, набранный пользователем в форме и отправленный серверу. В нее также можно поместить и текст, содержащийся в текстовом файле. После обработки с ней можно делать все, что угодно: записать в файл, поместить в базу данных.
Короче, все зависит от вашей фантазии и способа управления контентом конкретно в вашем случае. Я, допустим, автоматически обрабатываю этим скриптом все тексты, которые редакторы помещают на сайт.
 :::::  Александр пишет 27.06.2001 @ 04:04 
 :::::  bang пишет 27.06.2001 @ 07:32 
2Андрей... Ой, меня уже упоминают... :)
Виталий, спасибо за статью, очень полезно. Есть некоторые вещи, котороые у меня не учтены, буду дополнять и исправлять.

 :::::  Typhoon пишет 02.07.2001 @ 12:30 
А как бы сделать, чтобы оно хтмль-теги не трогало?
 :::::  Виталий Свистунов пишет 03.07.2001 @ 06:31 
HTML этот скрипт не изменяет. Точнее, сначала все кавычки заменяются на фигурные, а потом внутри тегов преобразуются в прямые ("). Так получается рациональнее, чем проверять каждую кавычку, находится она внутри тега, или нет.
 :::::  Андрей Лещук Hedgehog пишет 06.07.2001 @ 02:23 
Тема насущная! Молодец, что затронул. Безграмотность в Интернете уже добила. Надо приучать народ к культуре верстки. Только не понятно, зачем использовать для этих целей PHP, если все это решается на порядок проще и быстрее предварительной обработкой текстов в VBA или простейшими макросами в Word'e? Статью на эту тему начал писать два месяца назад, но жестокие обстоятельства... В общем, продолжение следует. И хоть оружие у нас разное, но мы по одну сторону баррикад.
 :::::  Good_Maks пишет 06.07.2001 @ 17:54 
Невлохо бы было выложить отдельный файл с кодом.
Например, я взял и скопировал код со страницы, и получилось, что в переменной txt каждый пробел заменяется на nbsp; Что не есть правильно. Похимичил я с массивом "replace", и вроде нормально стало. Может дать код? А может у меня глюки (Apache 1.3.6/PHP 4 mod/win32).
И еще, можно добавить обработку тел. номера, типа 123-33-33.
preg_replace = ("'([ ][0-9]{3}[-][0-9]{2}[-][0-9]{2})'", " <nobr>\\1</nobr>"
, $txt);
Можно изменить, чтобы любой номер телефона подходил (если нужно).
Сравнил я работу функции с результатом Лебедева (сайт-LG Electronics), вроде так же.
Мне не понятно вот что:
1. Зачем заменять букву ё?
2. Зачем все знаки препинания (кавычки, и т.д.) переводить в коды html.
3. Почему в последняя кавычка не обрабатывается правильно (фраза ниже) ?
"А "профи" - это такие же "чайники", только с заваркой по круче"".

Спасибо.


 :::::  Typhoon пишет 10.07.2001 @ 16:41 
В том-то всё и дело, что оно и в тегах заменяет кавычки.
в теге <img src="bla-bla-bla.gif" width=10> заменилась вторая кавычка. По крайней мере у меня, но я код скопировал полностью...
 :::::  unknown пишет 25.11.2001 @ 20:10 
еще проблема в том, что регэксп надо натравить не на символы, а на их коды...
 :::::   пишет 04.12.2001 @ 04:25 
Да уж. Типографские ГОСТЫ не найдешь днем с огнем. Равно как и «Справочник художественного и технического редакторов». Кстати. описание кавычек и тире приведено с ошибками
 :::::  nbah пишет 11.02.2004 @ 17:37 
Исправлений не будет, надо полагать?
 :::::  Khamoro пишет 18.10.2006 @ 15:33 
Большое спасибо, нужная информация, побольше бы таких статей!
 :::::  Алексей пишет 04.08.2013 @ 09:24 
По сути статьи понимаю, что полезность с этого есть немалая.
Но у меня возникла проблема - как и куда установить написанный код.
Хочу попробовать практически.
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0430830