Articulo de referencia

OmniMark

OmniMark es un lenguaje de programación de cuarta generación utilizado principalmente en la industria editorial . Actualmente es un producto de software propietario de Stilo Int...

OmniMark es un lenguaje de programación de cuarta generación utilizado principalmente en la industria editorial . Actualmente es un producto de software propietario de Stilo International. A julio de 2022, la versión más reciente [ 1 ] de OmniMark era la 11.0.

Uso

OmniMark se utiliza para procesar datos y convertirlos de un formato a otro, utilizando una arquitectura de transmisión [ 2 ] que le permite manejar grandes volúmenes de contenido secuencialmente sin tener que mantenerlo todo en memoria. Tiene un analizador XML integrado y soporte para XQuery a través de la integración con la base de datos XML nativa de Sedna . También tiene funciones para procesar reglas de búsqueda que implementan un concepto similar a las expresiones regulares , aunque la sintaxis de la expresión de patrón es más parecida al inglés que la sintaxis de expresiones regulares utilizada en Perl y otros lenguajes como el lenguaje de programación Ruby , ambos más utilizados 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 procedimental y funcional sin necesidad de construcciones adicionales para admitir los elementos procedimentales.

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. [ 3 ] Posteriormente, XTRAN pasó a llamarse OmniMark, y Exoterica se convirtió en OmniMark Technologies. Los actuales propietarios de OmniMark, Stilo International, tienen sus oficinas centrales en el Reino Unido, pero también mantienen una oficina en Canadá. [ 4 ]

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. [ 5 ] OmniMark ya no se distribuye bajo ese modelo.

Modelo de programación

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

  • Una regla de elemento , que solo se puede usar 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 de cierre. Dado que el contenido puede incluir otros elementos, las reglas de elemento pueden operar de forma anidada. OmniMark gestiona el anidamiento de tal manera que las reglas de elemento se pueden definir de forma independiente.
  • Un patrón , que puede utilizarse tanto con documentos estructurados como no estructurados, reconoce un fragmento de texto. Los patrones se usan como expresiones regulares en otros lenguajes (python, Perl, awk , etc.), pero tienen una sintaxis similar al inglés que facilita la creación de expresiones complejas. Al analizar un documento estructurado , los patrones pueden aplicarse tanto al texto que entra al analizador como al que sale de él.

Procesamiento de entrada no estructurada

Las reglas de búsqueda se utilizan para aplicar patrones a entradas no estructuradas. La longitud del texto se reconoce mediante un patrón que incluye variables temporales para capturar cualquier parte del texto que se necesite en la salida. La acción utiliza esas variables para producir la salida requerida:

; Cambiar precios del formato inglés al formato francés buscar "$" dígito + => dólares "." dígito { 2 } => centavos ; mostrar el precio en el nuevo formato mostrar dólares || "," || centavos || "$"

Si dos reglas de búsqueda reconocen la misma secuencia de texto, la primera la descartará y la segunda nunca la verá. La entrada que no es reconocida por ninguna regla de búsqueda no se descarta y pasa directamente a la salida.

Procesamiento de datos de entrada estructurados (XML, SGML)

OmniMark considera la entrada como un flujo; un programa no almacena datos de entrada en memoria a menos que parte de ellos se hayan guardado en variables. A medida que la entrada fluye, OmniMark mantiene una pila de elementos que contiene información que puede utilizarse para guiar la transformación del texto mediante la función de coincidencia de patrones de OmniMark. Cuando se encuentra cada etiqueta de inicio, OmniMark agrega otra descripción de elemento a la pila. La descripción del elemento incluye el nombre del elemento, los nombres de los atributos con sus tipos y valores, junto con otra información del analizador (como si ese elemento es un elemento VACÍO). Cuando se encuentra la etiqueta de cierre correspondiente, la descripción del elemento se elimina de la parte superior de la pila. Con SGML, algunas etiquetas pueden omitirse, pero OmniMark actúa como si estuvieran presentes y en los lugares correctos.

Pila de elementos OmniMark

 contenido < h1 > . </ h1 > < body > | . | </ body > < example > | | . | | </ example > | | | . | | | | | | . | | | | | | . | | | ABC. DEF incógnita X: posición actual en el documento de entrada Escaneo disponible Información de ubicación Ejemplo de elemento de A a F Ejemplo de elementos B a E, cuerpo Ejemplo de elementos C a D, cuerpo, h1 C comienzo del contenido D fin del contenido 

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

  • El control se obtiene justo después de que se haya analizado la etiqueta de inicio y se haya agregado la descripción del elemento a la pila de elementos. La acción para la regla del elemento tiene acceso a las descripciones del elemento actual y de todos los elementos ancestros hasta la raíz del documento.
  • Devuelve el control al analizador solicitando el contenido analizado del elemento en el valor especial "%c". El contenido se suele solicitar para escanearlo mediante coincidencia de patrones , en lugar de para almacenarlo en una variable.
  • El control se recupera una vez analizada la etiqueta de cierre correspondiente, pero antes de que la descripción del elemento se elimine de la pila de elementos. La acción de la regla del elemento aún tiene acceso a las descripciones del elemento actual y de todos los elementos ancestros hasta la raíz del documento.

Dado que los elementos pueden estar anidados, varias reglas de elementos pueden estar activas simultáneamente, cada una con su descripción correspondiente en la pila de elementos. Las reglas de elementos se suspenden mientras esperan a que el analizador termine de analizar su contenido. Solo la regla del elemento en la parte superior de la pila puede estar activa. Cuando se alcanza el final del contenido del elemento en la parte superior de la pila, la acción de la regla de elemento correspondiente vuelve a tomar el control. Cuando finaliza esa acción, se elimina la descripción del elemento y el control regresa a la acción del siguiente elemento inferior en la pila. Una regla de elemento podría simplemente mostrar el contenido analizado (como texto) y agregarle un sufijo:

elemento "código" salida "%c" ; analizar y mostrar el contenido del elemento hacer cuando el padre no es ( "h1" | "h2" | "h3" | "h4" | "h5" | "h6" ) salida "%n" ; agregar una nueva línea si no está en un encabezado 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 #implícito hacer cuando el padre es "head" suprimir ; descartar elementos secundarios sino imprimir "%c" ; analizar y mostrar el contenido del elemento hecho

Coincidencia de patrones en la salida del analizador

El contenido analizado de cada elemento se pone a disposición dentro de una regla de elemento y puede modificarse mediante un bloque de escaneo de repetición... que utiliza patrones para identificar el texto que se va a modificar:

elemento "p"  ; Cambiar precios del formato inglés al formato francés repetir escaneo "%c"  ; analizar y escanear el contenido del elemento coincidencia "$" dígito + => dólares "." dígito { 2 } => centavos  ; mostrar el precio en el nuevo formato mostrar dólares || "," || centavos || "$" coincidencia ( cualquiera excepto "$" ) + => texto  ; mostrar secuencias que no sean de precio sin cambios mostrar texto coincidencia "$" => texto  ; mostrar símbolo de moneda aislado sin cambios mostrar texto hecho

El primer patrón que coincida con una parte inicial del texto lo "devorará" y este no estará disponible para los patrones siguientes, incluso si alguna de las partes subsiguientes pudiera coincidir con una parte inicial más larga del texto. Cualquier parte inicial que no coincida con ninguno de los patrones en un bloque de escaneo de repetición... será descartada.

Coincidencia de patrones en la entrada al analizador

Las reglas de traducción toman el control justo después de que las etiquetas se hayan separado del texto, pero antes de que finalice el análisis sintáctico. Cada regla de traducción tiene un patrón que identifica un segmento de texto que se procesará. Este segmento no incluirá ninguna etiqueta, pero podría abarcar todo el texto entre dos etiquetas.

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

; Cambiar el carácter de marcado a la entidad que lo representaba en la entrada traducir "&" salida "&"

Las etiquetas anteriores al 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 contienen el texto. En consecuencia, la información de la pila de elementos se puede usar para controlar qué 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:

; Cambiar precios del formato inglés al formato francés traducir "$" dígito + => dólares "." dígito { 2 } => centavos cuando el elemento es ( "p" | "código" )  ; mostrar el precio en el nuevo formato mostrar dólares || "," || centavos || "$"

Código de ejemplo

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

Un programa sencillo

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

proceso Salida "¡Hola mundo!" 

Entrada no estructurada (texto)

Este programa muestra todas las palabras que comienzan con mayúscula, una palabra por línea, y descarta todo el demás texto:

procesar enviar archivo "myfile.txt" ; o enviar "CUALQUIER texto descartar palabras en minúscula"; imprimir palabra en mayúsculas, agregar un salto de línea buscar ( uc letra * ) => temp imprimir temp || "%n"; descartar todos los demás caracteres encontrar cualquiera ; no hay 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 a partir de un archivo xhtml , indentando los encabezados de segundo nivel:

; xhtml-headings.xom ; Lista los encabezados de primer y segundo nivel de un archivo xhtml o xhtml5 ; Los encabezados de segundo nivel están indentadosprocesar ; transformar el documento de entrada ; hacer xml-parse documento; analizar XML válido hacer xml - parse ; analizar XML bien formado escanear archivo "example.html" salida "%c" ; analizar y mostrar el contenido del documento hechosuprimir el elemento "cabeza" ; descartar los elementos secundarioselemento "h1" salida "%c" ; analizar y mostrar el contenido del elemento salida "%n" ; agregar un final de líneaelemento "h2" salida " " ; sangría 2 espacios salida "%c" ; analizar y mostrar el contenido del elemento salida "%n" ; agregar un final de línea; manejar cualquier elemento no nombrado en las reglas explícitas anteriores elemento #implícito hacer cuando padre es "cuerpo" ; descartar todos los elementos secundarios excepto los nombrados anteriormente suprimir ; descartar elementos secundarios de lo contrario ; conservar el contenido de cualquier otro elemento salida "%c" ; analizar y mostrar el contenido del elemento hecho; descartar el contenido de caracteres del elemento "body" si ese elemento ; tiene contenido mixto traducir cualquier + => X cuando el elemento es body ; no hay salida (no hacer nada con la variable "X")

Esta element #impliedregla selecciona cualquier elemento que no sea reconocido por ninguna de las otras reglas de elementos.

Entrada estructurada (SGML)

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

Programa

; Insertar etiquetas omitidas en el documento SGML ; ; Este programa es simplificado, solo 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 a partir de la mayoría de los documentos SGML.El proceso realiza un análisis del documento SGML y escanea el archivo "example.sgml" con la salida "%c" ; el análisis y la salida del contenido del documento se han realizado correctamente.elemento #salida implícita "<%q" ; inicio etiqueta de inicio; escribir atributos como pares nombre="valor" repetir sobre los atributos especificados como salida attr " " || clave del atributo attr || "=%" % v ( attr ) % "" nuevamentesalida ">" ; etiqueta de inicio de terminación; escribir el contenido del elemento de salida "%c"; escribe la etiqueta de cierre si el elemento permite la salida de contenido "</%q>" a menos que el contenido sea ( vacío | conref ); traducir los caracteres de marcado (en el texto) de vuelta a las entidades ; que los representaban en la entrada originaltraducir "&" salida "&"traducir "<" salida "<"traducir ">" salida ">"

Ejemplo de entrada

<!-- Un documento SGML simple para la entrada a demostraciones de OmniMark --> <!DOCTYPE example [  <!ELEMENT example O - (head, body)> <!ELEMENT head OO (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 "> "> ]> <ejemplo> <título> Título </título> <cuerpo> <p> Texto <vacío> <p id= "P-2" > <&> </ejemplo>

Ejemplo de salida

<EJEMPLO><ENCABEZADO><TÍTULO> Título </TÍTULO></ENCABEZADO><CUERPO><P> Texto </P><VACÍO><P ID= "P-2" > <&> </P></CUERPO></EJEMPLO>

Lecturas adicionales

  • Baker, Mark (2000). Programación de Internet con OmniMark . Boston: Kluwer Academic Publishers.
  • Smith, Norman E. (1998). Guía práctica de filtros SGML/XML . Plano, TX: WordWare Publishing.

Referencias

  1. "Bienvenido a la documentación de OmniMark 11.0" . Recursos para desarrolladores de OmniMark . Consultado el 26 de julio de 2022 .
  2. Stilo International (2004). Guía para principiantes de OmniMark (PDF) . pág. 3. Consultado el 24 de septiembre de 2018 . 
  3. Travis, Brian E. (1997). OmniMark en acción: Primeros pasos . Englewood, CO: SGML University Press. pág. vii. 
  4. "Ubicaciones de oficinas" . Stilo . Consultado el 24 de septiembre de 2018 .
  5. "OmniMark 5 es gratis" . Portada . Consultado el 24 de septiembre de 2018 .
  • Stilo Omnimark
  • Recursos para desarrolladores de OmniMark
  • Principios de programación de OmniMark - Índice general (Instantánea del archivo de Internet del libro en línea de Errol Chopping)