Как я набрел на SGML-технологию
Все началось с интранета. Это модное слово означало для меня на практике то, что документы, которые я регулярно писал по роду своей деятельности, стало можно и нужно делать доступными "online". До сих пор я просто набирал документы в TEX-e и печатал их на бумаге. Идея дублировать их в HTML вручную отпала сразу: немедленно возникла бы проблема синхронизации бумажной и электронной версий одного и того же документа.
А вскоре потребовалось периодическая передача документов посторонним людям в электронной форме, что, по сложившейся у нас практике, означает -- в формате Microsoft Word. Работать с MS Word у меня по ряду причин не было никакого желания, к тому же это только усугубило бы проблему синхронизации версий.
Значит, нужно было придумать способ автоматического преобразования набираемых документов в различные форматы: TEX-a -- для печати на бумаге, HTML -- для помещения на WWW сервер, Word -- для обмена с работающими в Windows. Кроме того, мне хотелось, чтобы такое средство отвечало еще ряду требований:
- быть модульным, чтобы можно было при необходимости легко добавлять новые выходные форматы или изменять алгоритмы преобразования в существующие;
- быть открытым, бесплатным, как можно меньше привязанным к конкретным программам;
- быть мобильным: работать, как минимум, на разных UNIX-платформах;
- быть легко русифицируемым.
Первым, что попалось мне под руку после похода на Altavista, оказался пакет под названием linuxdoc-sgml. Он как раз и предназначался для генерации HTML, TEX и RTF из одного входного файла. Широко используемый в рамках Linux Documentation Project, он использовал в качестве входного формата незнакомый мне до сих пор язык SGML. Впрочем, ничего сложного в нем не оказалось -- он весьма напоминал знакомый мне HTML и выглядел вполне понятно. Вот, к примеру, кусочек SGML-документа:
|
Для того, чтобы начать на этом писать, потребовалось всего лишь запомнить несколько основных элементов разметки, например, что означает начало параграфа, -- начало перечисления и т.п.
Набранный в SGML текст далее запуском одного фильтра преобразуется в HTML, другого -- в TEX, третьего -- в RTF, и так далее.
Что такое SGML и чем он хорош
Терминология
GML (Generalized Markup Language) разработан в недрах вездесущей корпорации IBM. Его наследник SGML (Standard Generalized Markup Language) принят в 1986 году в качестве международного стандарта[1] для определения независимых от устройств ввода/вывода, независимых от вычислительной среды методов представления текстов в электронной форме. Более точно, SGML -- это метаязык, то есть средство формального описания языка, в данном случае, языка разметки.
Исторически слово разметка использовалось для описаний аннотаций или других обозначений внутри текста, предназначенных для указаний составителю или "верстальщику" того, как именно конкретное место должно быть напечатано или сверстано. Примеры включают подчеркивание волнистой чертой, обозначающее курсив, специальные значки для пропуска фраз или их печати конкретным шрифтом, и так далее. Когда форматирование и печать текстов стали автоматизированными, этот термин стал охватывать все виды специальных кодов разметки, вставляемых в электронные тексты для управления форматированием, печатью или другой обработкой.
Обобщая, разметку, или кодировку, определяют как любое средство сделать явным интерпретацию текста. На банальном уровне все напечатанные тексты кодированы в этом смысле: знаки препинания, использование заглавных букв, расположение букв по странице, даже интервалы между словами можно считать в какой-то степени разметкой, функция которой -- помочь человеку, читающему текст, определить, где кончается одно слово и начинается другое, или как идентифицировать особенности структуры, такие как заголовки, или простые синтаксические единица вроде подчиненных предложений. Кодирование текста для компьютерной обработки, в принципе, как расшифровка манускрипта с пергамента, -- процесс делания явным неявного или подразумеваемого, процесс указания пользователю того, как должно интерпретироваться содержимое текста.
Под языком разметки понимают набор соглашений о разметке, применяемых для кодирования текстов. Язык разметки должен специфицировать, какая разметка допустима, какая разметка обязательна, как отличить разметку от текста и что разметка значит. SGML предоставляет решения для первых трех задач, отдельная документация обычно необходима для последней.
Особенности SGML
Три характеристики SGML отличают его от прочих языков разметки.
Описательная разметка
Система с описательной разметкой использует коды разметки, которые просто предоставляют названия для категоризации частей документа. Коды разметки, такие как
С описательной, а не процедурной, разметкой один и тот же документ может быть обработан разнообразными программами, каждая из которых может применять различные инструкции обработки к тем его частям, которые она считает важными. Например, программа анализа содержимого может полностью игнорировать сноски, тогда как программа форматирования может извлекать и собирать их для печать в конце каждой части. Различные виды инструкций обработки могут ассоциироваться с одной и той же частью файла. Например, одна программа может извлекать из документа фамилии людей и географические названия для создания индекса или базы данных, тогда как другая, обрабатывающая тот же самый текст, может печатать фамилии и названия отличающимся шрифтом.
Типы документов
SGML вводит понятие типа документа, и, соответственно, определения типа документа (document type definition, DTD). Документы считаются типизированными, так же, как и другие обрабатываемые компьютерами объекты. Тип документа формально определяется его составными частями и их структурой. Определение, например, отчета может быть таким, что он состоит из заголовка и, возможно, автора, за которыми следует аннотация и последовательность одного или более абзацев. Любой документ в отсутствие заголовка, в соответствии с этим формальным определением, не будет формально являться отчетом, так же как не будет им являться и последовательность абзацев, за которой следует аннотация, невзирая на то, насколько похож на отчет такой документ с точки зрения читателя-человека.
Поскольку документы относятся к известным типам, можно использовать специальную программу, называемую анализатором (parser), для того, чтобы обработать документ, утверждающий, что он относится к конкретному типу, и проверить, действительно ли все элементы, требуемые для данного типа документов, присутствуют и находятся в правильной последовательности. Что еще более важно, разные документы одного типа могут обрабатываться унифицированным образом. Можно писать более интеллектуальные программы, использующие знания, заключенные в информационной структуре документа.
Независимость данных
Основная цель проектирования SGML была в создании гарантий того, что документ, закодированный согласно его положениям, будет переносимым с одной аппаратной и программной среды в другую без потери информации. Два его свойства, описанных выше, отвечают этому требованию на абстрактном уровне; третье свойство -- на уровне строчек байтов (символов), которые составляют документ. SGML предоставляет обобщенный механизм строковой подстановки, то есть, простой машинно-независимый способ указания, что конкретная строка символов в документе в момент обработки документа должна заменяться на некоторую другую строку. Одно очевидное применение этому механизму -- обеспечение единой терминологии; другое, и более значительное, -- противодействие известной неспособности разных компьютерных систем понимать наборы символов друг друга, например, одной системе представлять все графические символы, необходимые приложению, путем описательного отображения непередаваемых символов. Строки, определяемые этим механизмом, называются сущностями (entities).
О преимуществах
Что дает использование SGML в реальной жизни? Мне оно сразу дало возможность производить документы в любом требуемом виде. Удобно оказалось и написание "вордовых" бумажек в привычной среде XEmacs без использования Windows. Все использованные программы -- бесплатны и распространяются в исходных текстах, что позволило установить их на всех используемых мной системах. Причем оказалось, что начать работать с SGML вовсе не сложно, каждый, кто хоть раз редактировал WWW страничку, не испугается вида конструкций SGML.
Потом уже, по мере постепенного изучения SGML, я осознал, что эта техника дает громадное количество возможностей по сравнению с типичной "настольной типографией":
- Продуктивность
- Четко разделенные процессы ввода информации и ее форматирования позволяют автору сосредоточиться на изложении мыслей, не отвлекаясь на двигание текста по экрану и подбор стилей.
- Единая стилистика
- Легко выдерживать различные документы в едином стиле, используя единую терминологию. Если стиль или термины нужно изменить, это делается разом во всех документах, не трогая их содержимое.
- Повторное использование
- Этот термин, хорошо знакомый программистам, означает наличие возможности использовать детали старых проектов в новых, с минимальными изменениями. Часть документа, оформленная в виде SGML-элемента, может переноситься в другие документы, легко повторяться в разных местах текста.
- Долговечность информации
- Из-за того, что SGML -- простой и стандартный формат хранения данных, отсутствует необходимость переформатировать их ввиду устаревания аппаратной или программной платформы. Информация просто доступна навсегда. Она несет с собой все необходимое для создания документа.
- Лучшее управление данными
-
С SGML можно определять информационные элементы и манипуляции с ними с произвольной степенью детальности. Размеченные элементы могут иметь атрибуты, определяющие характеристики и свойства элементов. Эта информация не предназначена для печати, но может помочь в управлении элементами данных. Например, атрибут ID (идентификатор) может уникальным образом идентифицировать один абзац, или целый раздел, примечание, иллюстрацию, задание, -- любой элемент, как в этом примере:
Информация - Контролировать безопасность доступа к информации, позволяя только определенным людям просматривать или изменять ее.
- Автоматизировать перемещение информации -- например, обновление данных в одном месте может инициировать обновление той же информации в других приложениях.
- Разделяемость
- Возможность работы со структурированными компонентами документа позволяет строить целый документ из составных частей, разбросанных по организации. Это позволяет пользователям делиться информацией без ее дублирования.
- Мобильность
- В информационных сетях, объединяющих разнообразные компьютеры, операционные системы и приложения, мобильность становится ключом ко всеобщей доступности информации. Поскольку SGML не зависит от аппаратуры и приложений, можно легко обмениваться документами между различными системами.
- Гибкость в приложении
-
SGML позволяет использовать информацию далеко за рамками "настольной типографии". Например:
- страницы WWW;
- информационные базы данных;
- диагностические / экспертные системы;
- электронная почта;
- гипертекстовая документация;
- публикации на CD-ROM;
- интерактивные электронные мануалы.
Почему SGML?
Почему не Word? Потому, что это закрытый формат. Потому, что это формат одного приложения. Потому, что этого приложения нет под юниксами, с которыми я работаю. Потому, что это не текстовый формат. Потому, что нет средств автоматической генерации таких документов. Потому, что нет толковых средств управления версиями и коллективной работы. Потому, что это формат разметки печати, а не смысловой структуры, и нет возможности их соотносить. Потому, что при экспорте получается совершенно неудовлетворительный HTML. Потому, что качество верстки и печати ниже среднего.
Почему не TEX? Потому, что это слишком низкоуровневый язык. Его не дашь в руки начинающему. Потому, что это формат разметки печати, а не смысловой структуры[2]. Потому, что мало TEX-ориентированных редакторов. Потому, что нет удовлетворительных средств экспорта в Word.
Почему не HTML? Потому, что само понятие HTML сильно размыто гонкой WWW за коммерцией и войной производителей браузеров друг с другом. Потому, что HTML страдает все тем же недостатком: ориентирован на представление, а не на структуру. Потому, что он очень беден выразительными средствами, и отсутствуют возможности его расширения. Потому, что не решена проблема корректной русификации. Потому, что нет удовлетворительных средств экспорта в Word.
SGML против WYSIWYG
Для тех, кто привык пользоваться только "word processor"-ами, например, MS Word или WordPerfect, может быть интересно сопоставление их с SGML инструментами. Эти две группы программных средств, несмотря на схожесть решаемых задач -- производство документов -- весьма друг от друга отличаются по архитектуре и функциям.
Word processor -- это интеллектуальная пишущая машинка. Он ориентирован на работу с визуальным представлением текста, характеризующегося набором стилей: стилей символов (шрифт, кегль, начертание), абзацев (красная строка, выравнивание, положение по ширине страницы), страниц (колонтитулы, сноски), разделов и документов (формат бумаги, оглавление), и прочих. Word processor не работает с внутренней структурой документа.
SGML редактор, напротив, ориентирован на работу с содержимым документа. Для SGML редактора, например, раздел -- это элемент, в который могут включаться подразделы, а не промежуток от одного абзаца, набранного стилем "Заголовок" до другого, как для word processor-a.
Это позволяет автору сосредоточиться на содержании текста, а не возиться с его форматированием и выбором стилей. Визуальная стилистика документа определяется при его экспорте в выходные форматы, а не при наборе текста.
О программном обеспечении
Чтобы начать работать с документами в SGML пользователю нужны два основных средства: редактор и средства экспорта (форматирования).
SGML-редактор
SGML-редактор отличается как от привычных текстовых редакторов, так и от "word processor"-ов. От первых -- наличием поддержки структурированных документов, от вторых -- отсутствием поддержки визуального форматирования. Редактор разбирает DTD редактируемого документа и "ведет" пользователя в соответствии с ним. Например, если DTD предусматривает элемент , в котором могут встречаться только элементы
Из числа популярных SGML-редакторов можно назвать ArborText ADEPT*Editor, SoftQuad Author/Editor, psgml, Adobe FrameMaker+SGML, Corel WordPerfect, и множество других.
Средства форматирования
Существует множество средств работы с SGML текстами. Б?льшую их часть составляют средства форматирования -- экспорта SGML в другие форматы для печати, просмотра и т.п. Выходные форматы могут быть любыми, завися лишь от доступного программного обеспечения и нужд пользователя. Например, я использую конвертеры в HTML, RTF и LATEX.
SGML-процессоры могут быть устроены по-разному. Существует несколько поколений таких средств (стоит вспомнить, что SGML отсчитывает уже второй десяток лет своей истории). Обычно они включают:
- анализатор, разбирающий SGML документ, проверяющий корректность документа и строящий некоторое внутреннее представление иерархии элементов документа;
- ядро, предоставляющее базовые функции работы с SGML (возможно, объединенное с анализатором в единую программу);
- набор спецификаций, задающих ядру программы для конкретной обработки документа.
Синтаксический разбор SGML довольно сложен, поэтому полноценных анализаторов существует немного. Эталонным считается пакет SP.
Спецификации, или стили, пишутся на предлагаемом ядром языке программирования. Есть SGML-процессоры, программируемые на языках Perl, Tcl, диалектах Lisp, и т.п. Каждый процессор предлагает собственное представление иерархии документа и собственные примитивы работы с ним.
Такое положение призван изменить недавно принятый стандарт DSSSL (Document Style Semantics and Specification Language)[3]. Он специфицирует единый язык и интерфейсы SGML-процессоров. Используемый в нем язык программирования близок к популярному функциональному языку Scheme.
Используемые программы
В качестве SGML-редактора я использую XEmacs, включающий в комплект поставки SGML-модуль psgml. Ядром SGML-процессора был выбран CoST. Для форматирования в HTML, RTF и LATEX написан набор спецификаций на CoST. Используется nsgmls, парсер из пакета SP. Управлению версиями помогает пакет контроля версий RCS.
Выбор DTD
При переходе к использованию технологии SGML встает вопрос выбора DTD. Обычно без проб и ошибок обойтись не удается. Можно пробовать "стандартные" DTD, широко используемые в индустрии, например, TEI Lite или DocBook. Можно создавать свои DTD, ориентированные на типичные документы, встречающиеся в повседневной работе. Переход между DTD ввиду использования SGML-процессоров обычно безболезнен, поэтому тут возможно длительное экспериментирование.
SGML и Web
Язык форматирования Web-страниц HTML изначально вводился как приложение SGML. Позже, с бурным развитием WWW, HTML начал всячески расширяться с целью дать автору больший контроль над внешним представлением информации. Новые элементы и атрибуты, такие как или
Эту проблему отчасти призваны облегчить каскадируемые стили, стандарт на которые принят W3 консорциумом. CSS1 отделяет стиль, задающий визуальное представление элементов, от разметки элементов.
Большой интерес представляет язык XML, предположительно идущий на смену HTML в качестве языка разметки Web-страниц. Это -- вариант SGML, ориентированный в первую очередь на применение на WWW. Он не требует обязательного наличия DTD, упрощен и сам язык за счет редко используемых сложных конструкций. Это позволит сделать простыми анализаторы, что сделает возможным активное применение XML в браузерах.[4]
XML снимет одно из неприятных ограничений HTML -- фиксированное количество элементов и фиксированная их семантика. Скажем, публикуя в XML список вопросов и ответов, можно задать естественную структуру элементов в таком стиле:
|
Заданные в дополнение к самому документу стили форматирования элементов
Публикация в SGML
XML, все же, -- дело пусть недалекого, но будущего. Что делать для публикации SGML документов прямо сейчас? Можно придумать несколько подходов.
Если SGML используют для распространения документации в значительных объемах, например, на CD, то на тот же CD можно положить какой-либо SGML-браузер. Можно, к примеру назвать Panorama Viewer или DynaText Browser.
Если же документы делаются доступными через WWW, то их придется переводить в формат HTML. Это можно делать заранее, а можно -- "на лету", используя CGI или аналогичный интерфейс WWW сервера.
Информация к размышлению
Я только слегка затронул тему SGML и его применения. Тех, у кого есть доступ к Интернет, могут заинтересовать следующие ресурсы.
Документация
Страница ``The SGML Web Page'' (http://www.sil.org/sgml/sgml.html) содержит огромное количество информации об SGML.
Хорошее введение в SGML можно найти по адресу http://www-tei.uic.edu/orgs/tei/sgml/teip3sg.
В свободном доступе есть книга Мартина Брайана SGML and HTML explained (http://www.sgml.u-net.com/book/home.htm).
Программное обеспечение
Домашняя страница XEmacs находится по адресу http://www.xemacs.org.
Свободный SGML toolkit SP можно получить по адресу http://www.jclark.com/sp, и там же -- DSSSL-процессор Jade.
SGML-процессор CoST -- по адресу http://www.flightlab.com/cost.
Мой набор спецификаций для CoST, свободный к дальнейшему распространению, -- по адресу http://xtalk.msk.su/SGML/TEItools.