Добавить в избранное | Сделать стартовой страницей

Большая Linux библиотека для пользователей OS Linux и ПО для нее
Есть что сказать? Нужен совет? Посети наш форум.




SGML: с чем это едят?

Автор : Борис Тоботрас

Как я набрел на 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-документа:

 
The Structure of a TEI Text
        
  

All TEI-conformant texts contain a TEI header (marked up as a teiHeader element) and the transcription of the text proper (marked up as a text element).

      Для того, чтобы начать на этом писать, потребовалось всего лишь запомнить несколько основных элементов разметки, например, что

означает начало параграфа,  -- начало перечисления и т.п.

      Набранный в SGML текст далее запуском одного фильтра преобразуется в HTML, другого -- в TEX, третьего -- в RTF, и так далее.


Что такое SGML и чем он хорош

Терминология

      GML (Generalized Markup Language) разработан в недрах вездесущей корпорации IBM. Его наследник SGML (Standard Generalized Markup Language) принят в 1986 году в качестве международного стандарта[1] для определения независимых от устройств ввода/вывода, независимых от вычислительной среды методов представления текстов в электронной форме. Более точно, SGML -- это метаязык, то есть средство формального описания языка, в данном случае, языка разметки.

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

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

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

Особенности SGML

      Три характеристики SGML отличают его от прочих языков разметки.

Описательная разметка

      Система с описательной разметкой использует коды разметки, которые просто предоставляют названия для категоризации частей документа. Коды разметки, такие как или \end{list}, просто идентифицируют порцию документа и утверждают, что "она является параграфом", или что "это -- конец последним начатого списка" и т.п. С другой стороны, система с процедурной разметкой определяет, какая обработка должна выполняться в конкретной точке документа: "в этом месте вызвать процедуру PARA с параметрами 1, b и x", или "передвинуть левую границу на 2мм левее, правую границу -- на 2мм правее, пропустить одну строку и встать на новую левую границу" и т.п. В 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-редактор также обычно содержит средства навигации по иерархии документ.

      Из числа популярных 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 начал всячески расширяться с целью дать автору больший контроль над внешним представлением информации. Новые элементы и атрибуты, такие как или , ориентировались на визуальное форматирование. Появились и стали активно использоваться средства, не входящие собственно в язык разметки: imagemaps, Java и JavaScript, plugins, и прочее. Много появилось также элементов HTML, поддерживаемых только определенным браузером, или по-разному работающих в разных браузерах. Поэтому сейчас уже сложно утверждать, является ли HTML приложением SGML или нет. Очень немногие страницы создаются в соответствии со спецификациями на HTML и соответствующими DTD.

      Эту проблему отчасти призваны облегчить каскадируемые стили, стандарт на которые принят W3 консорциумом. CSS1 отделяет стиль, задающий визуальное представление элементов, от разметки элементов.

      Большой интерес представляет язык XML, предположительно идущий на смену HTML в качестве языка разметки Web-страниц. Это -- вариант SGML, ориентированный в первую очередь на применение на WWW. Он не требует обязательного наличия DTD, упрощен и сам язык за счет редко используемых сложных конструкций. Это позволит сделать простыми анализаторы, что сделает возможным активное применение XML в браузерах.[4]

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

          
              Что такое XML?
              eXtensible Markup Language
         

      Заданные в дополнение к самому документу стили форматирования элементов , и дадут возможность браузеру показать этот документ в соответствии с замыслами автора.


Публикация в 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.


Обсудить данную тему на нашем форуме "Все о Linux"