Введение
OmniMark — это язык программирования четвертого поколения, который в основном используется в издательском деле. В настоящее время это запатентованный программный продукт компании Stilo International. По состоянию на июль 2022 года, последней версией OmniMark была версия 11.0.
Использование
OmniMark используется для обработки данных и преобразования их из одного формата в другой, используя потоковую архитектуру, позволяющую обрабатывать большие объемы контента последовательно, не загружая их все в память. В него встроен XML-парсер и поддерживается XQuery через интеграцию с нативной XML-базой данных Sedna. Также имеются средства для обработки правил поиска, реализующих концепцию, аналогичную регулярным выражениям, хотя синтаксис шаблонов выражений более похож на английский язык, чем синтаксис регулярных выражений, используемый в Perl и других языках, таких как Ruby, которые более распространены, чем OmniMark. OmniMark также может применяться для задач преобразования схем, как и XSLT, но поддерживает переключение между процедурным и функциональным кодом без необходимости использования дополнительных конструкций для поддержки процедурных элементов.
История
OmniMark был первоначально создан в 1980-х годах компанией Exoterica из Канады как программа для обработки SGML под названием XTRAN. Позднее XTRAN был переименован в OmniMark, а Exoterica стала OmniMark Technologies. Нынешние владельцы OmniMark, Stilo International, имеют главный офис в Великобритании, но также поддерживают офис в Канаде. В 1999 году президент и генеральный директор OmniMark Джон МакФадден объявил о том, что OmniMark 5 будет доступен бесплатно, чтобы эффективнее конкурировать с Perl. В настоящее время OmniMark не распространяется по такой модели.
Модель программирования
OmniMark рассматривает входные данные как поток, который можно просканировать один раз, а не как статический набор данных, поддерживающий произвольный доступ. Большая часть программы OmniMark имеет форму правила "условие => действие", где условие распознает фрагмент данных для обработки, а действие определяет, что с этими данными нужно сделать. Существует два типа условий: правило элемента, которое может использоваться только со структурированными документами (хорошо сформированный XML, валидный XML или SGML), распознает полный элемент: начальный тег, содержимое элемента и конечный тег. Поскольку содержимое может содержать другие элементы, правила элементов могут работать вложенно. OmniMark управляет вложенностью таким образом, что правила элементов можно определять независимо друг от друга. Шаблон, который можно использовать как со структурированными, так и с неструктурированными документами, распознает фрагмент текста. Шаблоны используются аналогично регулярным выражениям в других языках (Python, Perl, awk и т.д.), но имеют синтаксис, близкий к английскому, что облегчает создание сложных выражений. При разборе структурированного документа шаблоны могут применяться к тексту, поступающему на вход анализатору, или к тексту, выходящему из анализатора.
An element rule, which can only be used with structured documents (well formed XML, valid XML, or SGML), recognizes a complete element: the start tag, the element content, and the end tag. Since the content may hold other elements, element rules can operate in a nested fashion. OmniMark manages the nesting in such a way that the element rules can be defined independently of each other. A pattern, which can be used with both structured and unstructured documents, recognizes a length of text. Patterns are used like regular expressions in other languages (python, Perl, awk, ) but have an English like syntax that facilitates the creation of complex expressions. When parsing a structured document, patterns can be used on text going into the parser or on text coming out of the parser.
Обработка структурированных входных данных (XML, SGML)
OmniMark рассматривает входные данные как поток; программа не хранит входные данные в памяти, пока часть данных не будет сохранена в переменных. По мере поступления входных данных OmniMark поддерживает стек элементов, содержащий информацию, которая может быть использована для управления преобразованием текста с помощью механизма сопоставления с образцом OmniMark. При обнаружении каждого начального тега OmniMark помещает в стек описание очередного элемента. Описание элемента включает в себя имя элемента, имена атрибутов с их типами и значениями, а также другую информацию от парсера (например, является ли элемент пустым). При обнаружении соответствующего конечного тега описание элемента извлекается из вершины стека. В SGML некоторые теги могут быть опущены, но OmniMark ведет себя так, как будто теги присутствуют и находятся на своих местах.
Пример кода
В некоторых приложениях значительная часть документа может быть обработана хорошо спроектированной универсальной операцией, так что лишь небольшая часть документа требует специальной обработки. Это может существенно уменьшить размер и сложность программы, а в случае с документами XML – повысить устойчивость программы к изменениям в структуре входного документа.
Структурированный вход (SGML)
Эта программа заменяет пропущенные теги в простом документе SGML и выдает результат, похожий на корректно сформированный XML. Программа некорректно преобразует пустые теги SGML в пустые теги XML и не поддерживает многие возможности SGML, используемые в документах SGML.