OmniMark

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar

OmniMark es un lenguaje de programación de cuarta generación que se utiliza principalmente en la industria editorial. Actualmente es un producto de software propietario de Stilo International. En julio de 2022, la versión más reciente de OmniMark fue la 11.0.

Uso

OmniMark se utiliza para procesar datos y convertirlos de un formato a otro, utilizando una arquitectura de transmisión que le permite manejar grandes volúmenes de contenido de forma secuencial sin tener que mantenerlo todo en la memoria. Tiene un analizador XML incorporado y soporte para XQuery mediante integración con la base de datos XML nativa de Sedna. También tiene características para procesar reglas de búsqueda que implementan un concepto similar a las expresiones regulares, aunque la sintaxis de expresión de patrón es más parecida al inglés que la sintaxis de expresión regular utilizada en Perl y otros lenguajes como el lenguaje de programación Ruby, los cuales son más ampliamente utilizados. utilizado que OmniMark. OmniMark también se puede utilizar para tareas de transformación de esquemas de la misma manera que XSLT, pero admite el cambio entre código de procedimiento y funcional sin la necesidad de construcciones adicionales para respaldar los elementos de procedimiento.

Historia

OmniMark fue creado originalmente en la década de 1980 por Exoterica, una empresa de software canadiense, como un programa de procesamiento SGML llamado XTRAN. Posteriormente, XTRAN pasó a llamarse OmniMark y Exoterica se convirtió en OmniMark Technologies. Los actuales propietarios de OmniMark, Stilo International, tienen sus oficinas principales en el Reino Unido pero también mantienen una oficina en Canadá.

En 1999, el presidente y director ejecutivo de OmniMark, John McFadden, anunció que OmniMark 5 estaría disponible de forma gratuita para competir mejor con Perl. OmniMark ya no se distribuye bajo ese modelo.

Modelo de programación

OmniMark trata la entrada como un flujo que se puede escanear una vez, en lugar de una colección estática de datos que admite el acceso aleatorio. Gran parte de un programa OmniMark tiene la forma de una regla condition=>action donde la condición reconoce una longitud de datos sobre los que se debe actuar y la acción especifica qué se debe hacer con los datos. Hay dos tipos de condición:

  • An elemento, que sólo se puede utilizar con documentos estructurados ( XML bien formado, XML válido o SGML), reconoce un elemento completo: la etiqueta de inicio, el contenido del elemento y la etiqueta final. Dado que el contenido puede contener otros elementos, las reglas de elementos pueden funcionar de forma anida. OmniMark administra el anidaje de tal manera que las reglas del elemento se pueden definir independientemente unos de otros.
  • A patrón, que se puede utilizar con documentos estructurados y no estructurados, reconoce una longitud de texto. Los patrones se utilizan como expresiones regulares en otros idiomas (pitón, Perl, awk,...) pero tienen una sintaxis similar al inglés que facilita la creación de expresiones complejas. Cuando se analiza un documento estructurado, los patrones se pueden utilizar en texto entrando en el parser o en texto saliendo del parser.

Procesamiento de entradas no estructuradas

Las reglas de búsqueda se utilizan para aplicar patrones a entradas no estructuradas. Las longitudes de texto se reconocen mediante un patrón que incluye variables de patrón temporales para capturar cualquier parte del texto que se necesitará en la salida. La acción utiliza esas variables para producir el resultado requerido:

; Cambio de precios de formato inglés a formato francésencontrar "$" dígito+ = dólares ". dígito{}2} = centavos ; salida del precio en nuevo formato Producto dólares Silencio " Silencio centavos Silencio "$"

Si dos reglas de búsqueda pueden reconocer la misma secuencia de texto, la primera regla "devorará" la secuencia y la segunda regla nunca verá el texto. La entrada que no es reconocida por ninguna regla de búsqueda no es "comida" y pasa directamente a la salida.

Procesamiento de entrada estructurada (XML, SGML)

OmniMark ve la entrada como un flujo; un programa no retiene datos de entrada en la memoria a menos que parte de los datos se haya guardado en variables. A medida que pasa la entrada, OmniMark mantiene una pila de elementos que contiene información que se puede utilizar para guiar la transformación del texto a través de la función de coincidencia de patrones de OmniMark. Cuando se encuentra cada etiqueta de inicio, OmniMark inserta otra descripción de elemento en la pila. La descripción del elemento incluye el nombre del elemento, los nombres de los atributos con los tipos y valores de los atributos, junto con otra información del analizador (como si ese elemento es un elemento VACÍO). Cuando se encuentra la etiqueta final correspondiente, la descripción del elemento aparece desde la parte superior de la pila. Con SGML, es posible que se omitan algunas etiquetas, pero OmniMark actúa como si las etiquetas estuvieran presentes y en los lugares correctos.

Pila de elementos OmniMark

 contenido
 c)h1. .h1 c)cuerpo Silencio. .cuerpo c)ejemplo Silencio. .ejemploSilencio, silencio.
Silencio, silencio.
Silencio, silencio.
A B C. D E F
X

X: posición actual en el documento de entrada

Escáneos disponibles
Información de ubicación
Ejemplo de elemento A a F
Ejemplo de elementos B a E, cuerpo
Ejemplo de elementos C a D, cuerpo, h1
C comienzo del contenido
D final of content

Un programa OmniMark utiliza reglas de elementos para procesar documentos XML o SGML. Una regla de elementos:

  • obtiene control justo después de que la etiqueta de inicio haya sido analizada, y la descripción de elementos ha sido empujada en la pila de elementos. La acción para la regla del elemento tiene acceso a las descripciones del elemento actual y todos los elementos del antepasado vuelven a la raíz del documento.
  • pasa control de vuelta al analizador solicitando el contenido analizado del elemento en el valor especial "%c". Por lo general, se solicita el contenido para escanear con la combinación de patrones, en lugar de para el almacenamiento en una variable.
  • consigue el control de nuevo cuando la etiqueta final correspondiente ha sido analizada, pero antes de que la descripción del elemento se salta de la pila de elementos. La acción para la regla del elemento todavía tiene acceso a las descripciones del elemento actual y todos los elementos del antepasado de vuelta a la raíz del documento.

Dado que los elementos se pueden anidar, pueden estar en juego varias reglas de elementos al mismo tiempo, cada una con una descripción de elemento correspondiente en la pila de elementos. Las reglas de elementos se suspenden mientras se espera que el analizador termine de analizar su contenido. Sólo puede estar activa la regla para el elemento en la parte superior de la pila. Cuando se llega al final del contenido del elemento en la parte superior de la pila, la acción para la regla del elemento correspondiente recupera el control. Cuando esa acción sale, la descripción del elemento aparece y se devuelve el control a la acción para el siguiente elemento inferior en la pila. Una regla de elemento podría simplemente generar el contenido analizado (como texto) y agregar un sufijo:

elemento "código" Producto "%c" ; contenido de elementos de par y salida do cuando padre # ()"H1" Silencio "h2" Silencio "h3" Silencio "h4" Silencio "h5" Silencio "h6") Producto "%n" ; Apéndice una nueva línea si no en una partida hecho

Un programa no necesita nombrar todos los elementos del documento si a los elementos sin nombre se les puede dar algún tipo de procesamiento genérico:

elemento #implido do cuando padre es "cabeza" Supresión ; descarte de elementos infantiles más Producto "%c" ; contenido de elementos de par y salida hecho

Coincidencia de patrones en la salida del analizador

El contenido analizado de cada elemento está disponible dentro de una regla de elemento y se puede modificar mediante un bloque repetir... escaneo que utiliza patrones para identificar el texto que se va a modificar:

elemento "p" ; Cambio de precios de formato inglés a formato francés repetición Escaneos "%c"; contenido de elementos de parse y escaneo partido "$" dígito+ = dólares ". dígito{}2} = centavos; salida del precio en nuevo formato Producto dólares Silencio " Silencio centavos Silencio "$" partido ()cualquiera Salvo "$")+ = texto; secuencias de salida no precio sin cambio Producto texto partido "$" = texto; símbolo de la moneda aislada de salida sin cambio Producto texto hecho

El primer patrón que coincida con una parte inicial del texto se “comerá” ese texto y el texto no estará disponible para los siguientes patrones incluso si una de las siguientes partes pudiera coincidir con una parte inicial más larga del texto. Cualquier parte inicial que no coincida con uno de los patrones en un bloque repetir... escaneo será descartada.

Coincidencia de patrones en la entrada al analizador

Las reglas de traducción obtienen el control justo después de que las etiquetas se hayan separado del texto, pero antes de completar el análisis. Cada regla de traducción tiene un patrón que identifica la longitud del texto que se procesará. Esa longitud de texto no incluirá ninguna etiqueta, pero podría ser tan larga como la longitud total del texto entre dos etiquetas.

Un uso de las reglas de traducción es realizar un cambio específico en todo un documento:

; Cambiar el carácter de marcación a entidad que lo representó en la entradatraducción " Producto "Tampoco"

Las etiquetas antes del punto actual en la entrada ya han pasado por el analizador, por lo que la pila de elementos ya tiene una descripción del elemento (o elementos anidados) que contiene el texto. En consecuencia, la información de la pila de elementos se puede utilizar para controlar lo que se hace con el texto. Por ejemplo, la operación de traducción se puede limitar al contenido de caracteres de uno o más elementos:

; Cambio de precios de formato inglés a formato francéstraducción "$" dígito+ = dólares ". dígito{}2} = centavos cuando elemento es ()"p"Silencio"código"); salida del precio en nuevo formato Producto dólares Silencio " Silencio centavos Silencio "$"

Código de ejemplo

En algunas aplicaciones, gran parte de un documento se puede manejar mediante una acción genérica bien diseñada, de modo que sólo una fracción del documento necesita un manejo especial. Esto puede reducir en gran medida el tamaño y la complejidad de un programa y, en el caso de documentos XML, puede hacer que un programa sea muy tolerante a los cambios en la estructura del documento de entrada.

Un programa sencillo

Este es el modo básico de "¡Hola, mundo!". programa:

 proceso
salida "¡Hola Mundo!"

Entrada no estructurada (texto)

Este programa genera todas las palabras que comienzan con una letra mayúscula, una palabra por línea, y descarta el resto del texto:

 proceso presentar archivo "mifile.txt" ; o enviar "ANY Text discard downcase words" ; palabra capitalizada de salida, apéndice una nueva línea encontrar ()Uc carta*)=tempestad Producto tempestad Silencio "%n" ; descartar a todos los demás personajes encontrar cualquiera ; sin salida

Entrada estructurada (XML)

OmniMark puede aceptar XML bien formado, XML válido o SGML como entrada estructurada. Este programa genera una lista de encabezados de primer y segundo nivel desde un archivo xhtml, sangrando los encabezados de segundo nivel:

; xhtml-headings.xom; Lista de encabezados de primer y segundo nivel de archivo xhtml o xhtml5; Los títulos de segundo nivel se identificanproceso ; transformar el documento de entrada ; hacer documento xml-parse; parse valid XML do xml-parse ; parse well-formed XML Escaneos archivo "example.html" Producto "%c" ; contenido de documentos de par y salida hechoelemento "cabeza" Supresión ; descarte de elementos infantileselemento "H1" Producto "%c" ; contenido de elementos de par y salida Producto "%n" ; añadir un extremo de líneaelemento "h2" Producto " ; indent 2 espacios Producto "%c" ; contenido de elementos de par y salida Producto "%n" ; añadir un extremo de línea; manejar cualquier elemento no nombrado en reglas explícitas arribaelemento #implido do cuando padre es "cuerpo" ; descartar todos los elementos del niño excepto los mencionados anteriormente Supresión ; descarte de elementos infantiles más ; mantener el contenido de cualquier otro elemento Producto "%c" ; contenido de elementos de par y salida hecho; descartar el contenido de caracteres del elemento "cuerpo" si ese elemento; tiene contenido mixtotraducción cualquiera+ = X cuando elemento es cuerpo ; sin salida (no haga nada con variable "X")

La regla elemento #implied selecciona cualquier elemento que no sea reconocido por una de las otras reglas de elementos.

Entrada estructurada (SGML)

Este programa reemplaza las etiquetas omitidas en un documento SGML simple y genera algo similar a un XML bien formado. El programa no traduce correctamente etiquetas vacías SGML a etiquetas vacías XML y no maneja muchas de las características SGML que se pueden usar en documentos SGML.

Programa

; Insertar etiquetas omitidas en el documento SGML;; Este programa es simplificado, sólo para demostración,; El programa no maneja muchas características de SGML; Se requeriría un programa más elaborado para producir; XML bien formado de la mayoría de documentos SGML.proceso do sgml-parse documento Escaneos archivo "example.sgml" Producto "%c" ; contenido de documentos de par y salida hechoelemento #implido Producto "Seguido" ; empezar etiqueta ; escribir atributos como pares nombre="valor" repetición sobre especificada atributos como attr Producto " Silencio clave de atributo attr Silencio "=%"%v()attr)%" otra vez Producto "No" ; terminar la etiqueta de inicio ; escribir contenido de elementos Producto "%c" ; escribir etiqueta final si elemento permite contenido Producto "Seguido" a) contenido es ()vacío Silencio conref); traducir caracteres de marcado (en texto) de vuelta a las entidades; que los representó en la entrada originaltraducción " Producto "Tampoco"traducción "Seguido" Producto "traducción "No" Producto "

Ejemplo de entrada

¡Seguido! Un simple documento SGML para la entrada a OmniMark demos --¡Seguido! Ejemplo DOCTYPE [ Ejemplo O - (cabeza, cuerpo) ¡Seguido! ELEMENT head O O (title?) ¡Seguido! Título del ELEMENTO - - (#PCDATA) cuerpo - O (vacío permanente)* ¡Seguido! ELEMENTO vacío - O EMPTY confianza (#PCDATA) ¡Seguido! ATTLIST P id ID #IMPLIED ################################################################################################################################################################################################################################################################ ¡Ciertamente! ################################################################################################################################################################################################################################################################"
]
Identificado▪ títuloTítulo■/títuloIdentificadoTexto
Identificado* id="P-2"<■/ejemplo

Salida de ejemplo

- No.Título> >Texto> > ID="P-2"<> >
Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save