ОмниМарк
OmniMark — язык программирования четвертого поколения, используемый в основном в издательской индустрии. В настоящее время это собственный программный продукт компании Stilo International. По состоянию на июль 2022 г. самая последняя версия [ 1 ] ОмниМарк был 11,0.
Использование
[ редактировать ]OmniMark используется для обработки данных и преобразования их из одного формата в другой с использованием потоковой архитектуры. [ 2 ] это позволяет последовательно обрабатывать большие объемы контента без необходимости хранить все это в памяти. Он имеет встроенный XML анализатор и поддержку XQuery посредством интеграции с собственной базой данных XML Sedna . Он также имеет функции для обработки правил поиска, которые реализуют концепцию, аналогичную регулярному выражению , хотя синтаксис выражений шаблона больше похож на английский, чем синтаксис регулярных выражений, используемый в Perl и других языках, таких как язык программирования Ruby , оба из которых более широко распространены. используется, чем OmniMark. OmniMark также можно использовать для задач преобразования схемы так же, как XSLT , но поддерживает переключение между процедурным и функциональным кодом без необходимости использования каких-либо дополнительных конструкций для поддержки процедурных элементов.
История
[ редактировать ]OmniMark был первоначально создан в 1980-х годах канадской компанией-разработчиком программного обеспечения Exoterica как программа обработки SGML под названием XTRAN. [ 3 ] Позднее XTRAN был переименован в OmniMark, а Exoterica — в OmniMark Technologies. Нынешние владельцы OmniMark, Stilo International, имеют главный офис в Великобритании, но также имеют офис в Канаде. [ 4 ]
В 1999 году президент и генеральный директор OmniMark Джон Макфадден объявил, что OmniMark 5 будет доступен бесплатно, чтобы лучше конкурировать с Perl. [ 5 ] OmniMark больше не распространяется по такой модели.
Модель программирования
[ редактировать ]OmniMark рассматривает входные данные как поток, который можно просмотреть один раз, а не как статическую коллекцию данных, поддерживающую произвольный доступ. Большая часть программы OmniMark имеет форму правила условие=>действие , где условие определяет длину данных, над которыми необходимо действовать, а действие определяет, что следует делать с данными. Существует два вида состояний:
- Правило элемента , которое можно использовать только со структурированными документами (правильно сформированный XML, действительный XML или SGML), распознает полный элемент: начальный тег, содержимое элемента и конечный тег. Поскольку содержимое может содержать другие элементы, правила элементов могут работать вложенным образом. OmniMark управляет вложением таким образом, что правила элементов можно определять независимо друг от друга.
- Шаблон , который можно использовать как со структурированными , так и с неструктурированными документами, распознает длину текста. Шаблоны используются как регулярные выражения в других языках (Python, Perl, awk и т. д.), но имеют синтаксис, подобный английскому, который облегчает создание сложных выражений. При анализе структурированного документа шаблоны могут использоваться для текста, поступающего в анализатор, или для текста, выходящего из анализатора.
Обработка неструктурированного ввода
[ редактировать ]Правила поиска используются для применения шаблонов к неструктурированному вводу. Длины текста распознаются по шаблону , который включает временные переменные шаблона для захвата любой части текста, которая понадобится в выходных данных. Действие использует эти переменные для получения требуемого результата:
; Change prices from English format to French format
find "$" digit+ => dollars "." digit{2} => cents
; output the price in new format
output dollars || "," || cents || "$"
Если два правила поиска могут распознать одну и ту же последовательность текста, первое правило «съест» последовательность, а второе правило никогда не увидит текст. Входные данные, которые не распознаются ни одним правилом поиска, не «съедаются» и передаются прямо на выход.
Обработка структурированного ввода (XML, SGML)
[ редактировать ]OmniMark рассматривает ввод как поток; программа не хранит входные данные в памяти, если часть данных не сохранена в переменных. По мере прохождения входных данных OmniMark поддерживает стек элементов, содержащий информацию, которую можно использовать для управления преобразованием текста с помощью средства сопоставления шаблонов OmniMark. При обнаружении каждого начального тега OmniMark помещает в стек описание другого элемента. Описание элемента включает имя элемента, имена атрибутов с типами и значениями атрибутов, а также другую информацию от анализатора (например, является ли этот элемент ПУСТЫМ элементом). Когда встречается соответствующий закрывающий тег, описание элемента извлекается из вершины стека. При использовании SGML некоторые теги могут быть опущены, но OmniMark действует так, как если бы теги присутствовали и находились в нужных местах.
Стек элементов OmniMark
[ редактировать ] content
<h1> . </h1>
<body> | . | </body>
<example> | | . | | </example>
| | | . | | |
| | | . | | |
| | | . | | |
A B C . D E F
X
X: current position in the input document
Scan Available
Location Information
A to F element example
B to E elements example, body
C to D elements example, body, h1
C beginning of content
D end of content
Программа OmniMark использует правила элементов для обработки документов XML или SGML. элемента Правило :
- получает управление сразу после того, как начальный тег был проанализирован и описание элемента было помещено в стек элемента. Действие для правила элемента имеет доступ к описаниям текущего элемента и всех элементов-предков, возвращающихся в корень документа.
- передает управление обратно анализатору, запрашивая проанализированное содержимое элемента в специальном значении
"%c"
. Содержимое обычно запрашивается для сканирования с сопоставлением с образцом, а не для хранения в переменной. - получает управление снова, когда соответствующий конечный тег был проанализирован, но до того, как описание элемента будет извлечено из стека элементов. Действие для правила элемента по-прежнему имеет доступ к описаниям текущего элемента и всех родительских элементов обратно в корень документа.
Поскольку элементы могут быть вложенными, одновременно могут использоваться несколько правил элементов, каждое из которых имеет соответствующее описание элемента в стеке элементов. Правила элемента приостанавливаются в ожидании завершения синтаксического анализа их содержимого. Активным может быть только правило для элемента, находящегося на вершине стека. Когда для элемента на вершине стека достигается конец содержимого, действие для соответствующего правила элемента снова получает управление. Когда это действие завершается, описание элемента извлекается и управление возвращается действию для следующего нижнего элемента в стеке. Правило элемента может просто выводить проанализированное содержимое (в виде текста) и добавлять суффикс:
element "code"
output "%c" ; parse and output element content
do when parent isnt ("h1" | "h2" | "h3" | "h4" | "h5" | "h6")
output "%n" ; append a newline if not in a heading
done
Программе не обязательно давать имена всем элементам документа, если безымянным элементам можно дать некоторую общую обработку:
element #implied
do when parent is "head"
suppress ; discard child elements
else
output "%c" ; parse and output element content
done
Сопоставление с образцом на выходе анализатора
[ редактировать ]Разобранное содержимое каждого элемента становится доступным в правиле элемента и может быть изменено с помощью блока повтора... сканирования , который использует шаблоны для идентификации изменяемого текста:
element "p"
; Change prices from English format to French format
repeat scan "%c" ; parse and scan element content
match "$" digit+ => dollars "." digit{2} => cents
; output the price in new format
output dollars || "," || cents || "$"
match (any except "$")+ => text
; output non-price sequences without change
output text
match "$" => text
; output isolated currency symbol without change
output text
done
Первый шаблон, соответствующий ведущей части текста, «съест» этот текст, и текст не будет доступен для следующих шаблонов, даже если одна из следующих частей может соответствовать более длинной ведущей части текста. Любая ведущая часть, которая не соответствует ни одному из шаблонов в блоке повтора... сканирования, будет отброшена.
Сопоставление с образцом на входе в анализатор
[ редактировать ]Правила перевода получают управление сразу после отделения тегов от текста, но до завершения синтаксического анализа. Каждое правило перевода имеет шаблон, определяющий длину обрабатываемого текста. Эта длина текста не будет включать в себя какие-либо теги, но может достигать полной длины текста между двумя тегами.
Одним из вариантов использования правил перевода является внесение определенных изменений во весь документ:
; Change markup character to entity that represented it in the input
translate "&"
output "&"
Теги перед текущей точкой ввода уже прошли анализатор, поэтому в стеке элементов уже есть описание элемента (или вложенных элементов), содержащих текст. Следовательно, информация в стеке элементов может использоваться для управления тем, что делается с текстом. Например, операция перевода может быть ограничена символьным содержимым одного или нескольких элементов:
; Change prices from English format to French format
translate "$" digit+ => dollars "." digit{2} => cents
when element is ("p"|"code")
; output the price in new format
output dollars || "," || cents || "$"
Пример кода
[ редактировать ]В некоторых приложениях большая часть документа может обрабатываться с помощью хорошо продуманного общего действия, так что только часть документа требует специальной обработки. Это может значительно уменьшить размер и сложность программы и, в случае XML-документов, сделать программу очень терпимой к изменениям в структуре входного документа.
Простая программа
[ редактировать ]Это основной «Привет, мир!» программа :
process
output "Hello World!"
Неструктурированный ввод (текст)
[ редактировать ]Эта программа выводит все слова, начинающиеся с заглавной буквы, по одному слову в строке, и отбрасывает весь остальной текст:
process
submit file "myfile.txt"
; or submit "ANY Text discard lowercase words"
; output capitalized word, append a newline
find (uc letter*)=>temp
output temp || "%n"
; discard all other characters
find any
; no output
Структурированный ввод (XML)
[ редактировать ]OmniMark может принимать правильно сформированный XML, действительный XML или SGML в качестве структурированных входных данных. Эта программа выводит список заголовков первого и второго уровня из файла xhtml, делая отступы для заголовков второго уровня:
; xhtml-headings.xom
; List first- and second-level headings from xhtml or xhtml5 file
; Second-level headings are indented
process
; transform the input document
; do xml-parse document ; parse valid XML
do xml-parse ; parse well-formed XML
scan file "example.html"
output "%c" ; parse and output document content
done
element "head"
suppress ; discard child elements
element "h1"
output "%c" ; parse and output element content
output "%n" ; add a line-end
element "h2"
output " " ; indent 2 spaces
output "%c" ; parse and output element content
output "%n" ; add a line-end
; handle any element not named in explicit rules above
element #implied
do when parent is "body"
; discard all child elements except those named above
suppress ; discard child elements
else
; keep the content of any other element
output "%c" ; parse and output element content
done
; discard character content from element "body" if that element
; has mixed content
translate any+ => X when element is body
; no output (do nothing with variable "X")
The element #implied
Правило выбирает любой элемент, который не распознается ни одним из других правил элементов.
Структурированный ввод (SGML)
[ редактировать ]Эта программа заменяет пропущенные теги в простом документе SGML и выводит нечто похожее на правильно сформированный XML. Программа неправильно преобразует пустые теги SGML в пустые теги XML и не поддерживает многие функции SGML, которые можно использовать в документах SGML.
Программа
[ редактировать ]; Insert omitted tags in SGML document
;
; This program is simplified, for demonstration only,
; The program does not handle many features of SGML
; A more elaborate program would be required to produce
; well-formed XML from most SGML documents.
process
do sgml-parse document
scan file "example.sgml"
output "%c" ; parse and output document content
done
element #implied
output "<%q" ; begin start tag
; write attributes as name="value" pairs
repeat over specified attributes as attr
output " "
|| key of attribute attr
|| "=%"%v(attr)%""
again
output ">" ; terminate start tag
; write element content
output "%c"
; write end tag if element allows content
output "</%q>"
unless content is (empty | conref)
; translate markup characters (in text) back to the entities
; that represented them in the original input
translate "&"
output "&"
translate "<"
output "<"
translate ">"
output ">"
Пример ввода
[ редактировать ]<!-- A simple SGML document for input to OmniMark demos -->
<!DOCTYPE example [
<!ELEMENT example O - (head, body)>
<!ELEMENT head O O (title?)>
<!ELEMENT title - - (#PCDATA)>
<!ELEMENT body - O ((empty|p)*)>
<!ELEMENT empty - O EMPTY>
<!ELEMENT p - O (#PCDATA)>
<!ATTLIST P id ID #IMPLIED>
<!ENTITY amp "&">
<!ENTITY lt "<">
<!ENTITY gt ">">
]>
<example>
<title>Title</title>
<body>
<p>Text
<empty>
<p id="P-2"><&>
</example>
Пример вывода
[ редактировать ]<EXAMPLE><HEAD><TITLE>Title</TITLE></HEAD><BODY><P>Text</P><EMPTY><P ID="P-2"><&></P></BODY></EXAMPLE>
Дальнейшее чтение
[ редактировать ]- Бейкер, Марк (2000). Интернет-программирование с помощью OmniMark . Бостон: Академическое издательство Kluwer.
- Смит, Норман Э. (1998). Практическое руководство по фильтрам SGML/XML . Плано, Техас: Издательство WordWare.
Ссылки
[ редактировать ]- ^ «Добро пожаловать в документацию OmniMark 11.0» . Ресурсы для разработчиков OmniMark . Проверено 26 июля 2022 г.
- ^ Стило Интернэшнл (2004). Руководство для начинающих по OmniMark (PDF) . п. 3 . Проверено 24 сентября 2018 г.
- ^ Трэвис, Брайан Л. (1997). OmniMark в работе: начало работы . Энглвуд, Колорадо: Издательство SGML University Press. п. VII.
- ^ «Расположение офисов» . Стило . Проверено 24 сентября 2018 г.
- ^ «OmniMark 5 бесплатен» . Титульные страницы . Проверено 24 сентября 2018 г.
Внешние ссылки
[ редактировать ]- Стило Омнимарк
- Ресурсы для разработчиков OmniMark
- Принципы программирования OmniMark — общий указатель (снимок интернет-архива онлайн-книги Эррола Чоппинга)