옴니마크

OmniMark

OmniMark출판업계에서 주로 사용되는 4세대 프로그래밍 언어입니다.현재 Stilo International의 독점 소프트웨어 제품입니다.2018년 9월 현재 OmniMark의 최신 릴리스는[1] 10.1.2이며, 2016년 4월입니다.

사용.

OmniMark는 대량의 콘텐츠를 메모리에 저장하지 않고 순차적으로 처리할 수 있는 스트리밍 아키텍처[2] 사용하여 데이터를 처리하고 포맷 간에 변환하는 데 사용됩니다.내장 XML 파서가 있으며 Sedna 네이티브 XML 데이터베이스와의 통합을 통해 XQuery를 지원합니다.또한 패턴 표현 구문은 Perl 및 OmniMark보다 널리 사용되는 루비 프로그래밍 언어 같은 다른 언어에서 사용되는 정규 표현 구문보다 영어에 가깝지만 정규 표현과 유사한 개념을 구현하는 규칙을 처리하는 기능도 있습니다.OmniMark는 XSLT와 같은 방법으로 스키마 변환 태스크에도 사용할 수 있지만 절차 요소를 지원하기 위한 추가 구성 없이 절차 코드와 기능 코드 간의 전환을 지원합니다.

역사

OmniMark는 1980년대 캐나다 소프트웨어 회사인 Exoterica에 의해 SGML 처리 프로그램인 [3]XTRAN으로 처음 만들어졌으며, XTRAN은 나중에 OmniMark로 이름이 바뀌었고, Exoterica는 OmniMark Technologies가 되었다.현재 OmniMark의 소유주인 Stilo International은 영국에 본사를 두고 있지만 [4]캐나다에도 사무실을 두고 있습니다.

1999년 OmniMark 사장 겸 CEO인 John McFadden은 Perl과 [5]더 잘 경쟁하기 위해 OmniMark 5를 무료로 이용할 수 있을 것이라고 발표했다.OmniMark는 더 이상 이러한 모델로 배포되지 않습니다.

프로그래밍 모델

OmniMark는 입력을 랜덤 액세스를 지원하는 정적 데이터 집합이 아니라 한 번 검색할 수 있는 흐름으로 처리합니다.OmniMark 프로그램의 대부분은 조건=> 액션 규칙의 형태로 되어 있습니다.조건은 동작할 데이터의 길이를 인식하고 동작은 데이터로 무엇을 할지를 지정합니다.두 가지 조건이 있습니다.

  • 구조화된 문서(올바른 형식의 XML, 유효한 XML 또는 SGML)에서만 사용할 수 있는 요소 규칙은 시작 태그, 요소 내용 및 끝 태그의 전체 요소를 인식합니다.내용이 다른 요소를 포함할 수 있으므로 요소 규칙은 중첩된 방식으로 작동할 수 있습니다.OmniMark는 요소 규칙을 서로 독립적으로 정의할 수 있도록 네스트를 관리합니다.
  • 정형 문서와 비정형 문서 모두에서 사용할 수 있는 패턴은 텍스트 길이를 인식합니다.패턴은 다른 언어(python, Perl, awk 등)의 정규 표현과 같이 사용되지만 복잡한 표현 작성을 용이하게 하는 영어와 같은 구문이 있습니다.구조화된 문서를 구문 분석할 때 파서로 들어가는 텍스트나 파서에서 나오는 텍스트에 패턴을 사용할 수 있습니다.

구조화되지 않은 입력 처리

찾기 규칙은 구조화되지 않은 입력에 패턴을 적용하는 데 사용됩니다.텍스트 길이는 출력에 필요한 텍스트의 모든 부분을 캡처하기 위한 임시 패턴 변수를 포함하는 패턴으로 인식됩니다.액션에서는 다음 변수를 사용하여 필요한 출력을 생성합니다.

; 가격을 영어 형식에서 프랑스어 형식으로 변경한다. 거라. "$" 숫자+ => 달러 "." 숫자{2} => 센츠     ; 새로운 형식으로 가격을 출력합니다.     산출량 달러    ","    센츠    "$" 

두 개의 검색 규칙이 동일한 텍스트 시퀀스를 인식할 수 있는 경우 첫 번째 규칙은 시퀀스를 "먹음"하고 두 번째 규칙은 텍스트를 보지 않습니다.검색 규칙에 의해 인식되지 않는 입력은 "먹음"이 되지 않고 출력으로 바로 전달됩니다.

구조화된 입력 처리(XML, SGML)

OmniMark는 입력을 흐름으로 간주합니다.데이터의 일부가 변수에 저장되지 않는 한 프로그램은 입력 데이터를 메모리에 보관하지 않습니다.입력이 통과할 때 OmniMark는 OmniMark 패턴 매칭 기능을 통해 텍스트 변환을 안내하는 데 사용할 수 있는 정보를 포함하는 요소 스택을 유지합니다.각 시작 태그가 발견되면 OmniMark는 스택에 다른 요소 설명을 푸시합니다.요소 설명에는 요소 이름, Atribute의 유형 및 값과 함께 Atribute 이름 및 파서의 기타 정보(예를 들어 해당 요소가 EMTIFY 요소인지 여부)가 포함됩니다.대응하는 엔드 태그가 발견되면 요소 설명은 스택의 맨 위에서 팝됩니다.SGML에서는 일부 태그를 생략할 수 있지만 OmniMark는 태그가 올바른 위치에 있는 것처럼 작동합니다.

OmniMark 요소 스택

콘텐츠<>h1>..<>/h1>,<>body>..<>/body>,<>example>..<>/example>.... ABC.DEF.                    xX: 입력 문서의 현재 위치 스캔 사용 가능한 위치 정보 A에서 F 요소 예제 B에서 E 요소 예제, 본문 C에서 D 요소 예제, 본문, 내용 D 끝의 h1 C

OmniMark 프로그램은 요소 규칙을 사용하여 XML 또는 SGML 문서를 처리합니다.요소 규칙:

  • 는 시작 태그가 해석되고 요소 설명이 요소 스택에 푸시된 직후에 제어를 가져옵니다.요소 규칙에 대한 작업은 현재 요소의 설명과 모든 상위 요소의 문서 루트에 대한 설명에 액세스할 수 있습니다.
  • 특수값으로 해석된 요소의 내용을 요구함으로써 파서로 제어를 되돌립니다."%c"콘텐츠는 보통 변수에 저장하기보다는 패턴 매칭을 통한 스캔을 위해 요구됩니다.
  • 는 대응하는 엔드 태그가 해석되었을 때, 그러나 요소 설명이 요소 스택에서 팝되기 전에 제어를 다시 가져옵니다.요소 규칙에 대한 작업은 여전히 문서 루트로 돌아가는 현재 요소 및 모든 상위 요소에 대한 설명에 액세스할 수 있습니다.

요소를 중첩할 수 있으므로 요소 스택에 대응하는 요소 설명이 있는 여러 요소 규칙을 동시에 실행할 수 있습니다.요소 규칙은 파서가 내용 해석을 완료할 때까지 대기하는 동안 일시 중단됩니다.스택의 맨 위에 있는 요소의 규칙만 활성화할 수 있습니다.스택의 맨 위에 있는 요소의 컨텐츠 끝에 도달하면 해당 요소 규칙에 대한 작업이 다시 제어됩니다.이 액션이 종료되면 요소 설명이 팝업되고 스택의 다음 하위 요소에 대한 작업으로 제어가 돌아갑니다.요소 규칙은 단순히 구문 분석된 내용을 텍스트로 출력하고 접미사를 추가할 수 있습니다.

요소 "코드"     산출량 %c      ; 요소의 내용을 해석 및 출력합니다.     하니 언제 부모 하지 않다 ('h1'   'h2'   'h3'   'h4'   'h5'   'h6')         산출량 %n  ; 제목에 없는 경우 새 행을 추가합니다.     다 했어요. 

이름 없는 요소에 범용 처리를 할 수 있는 경우, 프로그램은 모든 문서 요소에 이름을 붙일 필요는 없습니다.

요소 #실패하다     하니 언제 부모  "헤드"         진압하다        ; 자 요소를 폐기합니다.     또 다른         산출량 %c     ; 요소의 내용을 해석 및 출력합니다.     다 했어요. 

파서 출력 패턴 일치

각 요소의 구문 분석 내용은 요소 규칙 내에서 사용할 수 있으며 패턴을 사용하여 수정할 텍스트를 식별하는 반복... 스캔 블록에 의해 수정할 수 있습니다.

요소 "p"       ; 가격을 영어 형식에서 프랑스어 형식으로 변경한다.     따라하다 스캔 %c; 요소의 내용을 해석 및 스캔합니다.         경기 "$" 숫자+ => 달러 "." 숫자{2} => 센츠 ; 새로운 형식으로 가격을 출력합니다.             산출량 달러    ","    센츠    "$"         경기 (조금도 제외하고 "$")+ => 본문 ; 가격 이외의 시퀀스를 변경하지 않고 출력합니다.             산출량 본문         경기 "$" => 본문 ; 변경 없이 격리된 통화 기호를 출력합니다.             산출량 본문     다 했어요. 

텍스트의 선두 부분과 일치하는 첫 번째 패턴은 해당 텍스트를 "먹음"하며, 다음 중 하나가 텍스트의 긴 선두 부분과 일치하더라도 다음 패턴에서는 텍스트를 사용할 수 없습니다.반복... 스캔 블록의 패턴 중 하나와 일치하지 않는 선행 부품은 모두 폐기됩니다.

파서에 대한 입력 패턴 일치

변환 규칙은 태그가 텍스트에서 분리된 직후에 구문 분석이 완료되기 전에 제어됩니다.각 변환 규칙에는 처리할 텍스트 길이를 식별하는 패턴이 있습니다.이 텍스트 길이에는 태그가 포함되지 않지만 두 태그 사이의 전체 텍스트 길이와 같을 수 있습니다.

번역규칙의 한 가지 용도는 문서 전체에서 특정 변경을 하는 것입니다.

; 마크업 문자를 입력에 나타난 엔티티로 변경합니다. 번역하라 "&"     산출량 "&amp;" 

입력의 현재 포인트 앞의 태그는 이미 파서를 통과했기 때문에 요소 스택은 이미 텍스트를 포함하는 요소(또는 중첩 요소)에 대한 설명을 가지고 있습니다.그 결과, 요소 스택의 정보를 사용하여 텍스트의 처리를 제어할 수 있습니다.예를 들어 번역 조작은 1개 이상의 요소의 문자 콘텐츠로 제한할 수 있습니다.

; 가격을 영어 형식에서 프랑스어 형식으로 변경한다. 번역하라 "$" 숫자+ => 달러 "." 숫자{2} => 센츠         언제 요소  ("p" "코드") ; 새로운 형식으로 가격을 출력합니다.     산출량 달러    ","    센츠    "$" 

코드 예시

일부 응용 프로그램에서는 문서의 많은 부분을 잘 설계된 일반 작업으로 처리할 수 있으므로 문서의 일부만 특별한 취급이 필요합니다.이를 통해 프로그램의 크기와 복잡성을 크게 줄일 수 있으며 XML 문서의 경우 프로그램이 입력 문서의 구조 변경에 매우 관대해질 수 있습니다.

간단한 프로그램

다음은 기본적인 "Hello, World!" 프로그램입니다.

 프로세스 출력 "Hello World!"

비정형 입력(텍스트)

이 프로그램은 대문자로 시작하는 모든 단어를 한 줄에 하나씩 출력하고 다른 모든 텍스트를 삭제합니다.

 과정     제출하다 파일 "my file.txt"     또는 "모든 텍스트 폐기 소문자"를 제출합니다.    ; 대문자 출력 단어, 줄바꿈 추가  거라. (uc 편지*)=>임시직     산출량 임시직    %n   ; 다른 모든 문자를 삭제합니다.  거라. 조금도     ; 출력 없음 

구조화 입력(XML)

OmniMark는 올바른 형식의 XML, 유효한 XML 또는 SGML을 구조화된 입력으로 받아들일 수 있습니다.이 프로그램은 xhtml 파일에서 첫 번째 및 두 번째 수준 제목 목록을 출력하여 두 번째 수준 제목을 구분합니다.

; xhtml-syslog.xom ; xhtml 또는 xhtml5 파일에서 첫 번째 및 두 번째 수준의 제목을 나열합니다. ; 제2레벨의 표제는 들여쓰기되어 있다.  과정     ; 입력 문서를 변환합니다.     ; do xml-parse document; 유효한 XML 해석     하니 xml-해석            ; 올바른 형식의 XML을 해석         스캔 파일 "190.disples"         산출량 %c     ; 문서 내용 해석 및 출력     다 했어요.  요소 "헤드"     진압하다            ; 자 요소를 폐기합니다.  요소 'h1'     산출량 %c         ; 요소의 내용을 해석 및 출력합니다.     산출량 %n         ; 라인 엔드를 추가합니다.  요소 'h2'     산출량 "  "         ; 공백 2개 들여쓰기     산출량 %c         ; 요소의 내용을 해석 및 출력합니다.     산출량 %n         ; 라인 엔드를 추가합니다.  ; 위의 명시적 규칙에서 명명되지 않은 요소를 처리합니다. 요소 #실패하다     하니 언제 부모  "본체'         ; 위의 이름을 가진 요소를 제외한 모든 하위 요소를 삭제합니다.         진압하다        ; 자 요소를 폐기합니다.     또 다른         ; 다른 요소의 내용을 유지합니다.         산출량 %c     ; 요소의 내용을 해석 및 출력합니다.     다 했어요.  ; 요소 "본문"에서 문자 내용을 삭제합니다(요소가 있는 경우). ;의 내용은 혼재되어 있습니다. 번역하라 조금도+ => X 언제 요소       ; no output (변수 "X"를 사용하여 아무것도 실행하지 않음) 

element #implied규칙은 다른 요소 규칙 중 하나에 의해 인식되지 않는 요소를 선택합니다.

구조화 입력(SGML)

이 프로그램은 단순 SGML 문서에서 누락된 태그를 대체하고 XML과 유사한 형식의 태그를 출력합니다. 이 프로그램은 SGML 빈 태그를 XML 빈 태그로 올바르게 변환하지 않으며 SGML 문서에서 사용할 수 있는 많은 SGML 기능을 처리하지 않습니다.

프로그램.

; SGML 문서에 생략된 태그 삽입 ; 이 프로그램은 단순화되어 데모용으로만 제공되고 있습니다. 그 프로그램은 SGML의 많은 기능을 처리하지 않는다. 제작하려면 보다 정교한 프로그램이 필요합니다. ; 대부분의 SGML 문서에서 XML이 올바르게 형성되어 있습니다.  과정     하니 sgml-해석 문서         스캔 파일 "190.tmml"         산출량 %c     ; 문서 내용 해석 및 출력     다 했어요.  요소 #실패하다     산출량 "<%q"        ; 시작 태그      ; 속성을 name="value" 쌍으로 씁니다.     따라하다 에 걸쳐서 명시된 특성 ~하듯이 특성         산출량 " "                열쇠  기여하다 특성                "=%"%v(특성)%""     다시.      산출량 ">"          ; 시작 태그 종료      ; 요소의 내용을 기입합니다.     산출량 %c          ; 요소가 콘텐츠를 허용하는 경우 종료 태그를 씁니다.     산출량 "</%q>"         ~하지 않는 한 내용  (   콘레프)  ; 마크업 문자(텍스트)를 엔티티로 변환합니다. ; 원래 입력으로 나타남  번역하라 "&"     산출량 "&amp;"  번역하라 "<"     산출량 "&lt;"  번역하라 ">"     산출량 "&gt;" 

입력 예

<!-- OmniMark 데모에 입력하기 위한 간단한 SGML 문서 --> <!DOSCTYPE 예제 [<!ELEMENT의 예 O - (머리, 본체)> <!ELEment head O O(제목?> <! Element title - (#PCDATA)> <!ELEMENT 본문 - O ((빈 p)*)> <!ELEment empty - O ELECTY > <!ELEMENT p - O ( # PCDATA )> <!ATTLIST P ID #IMPLIED> <!엔티티 앰프 "&"> <!엔티티 lt "<"> <!ENTITY gt ">"> <예> <제목>제목 </title> <p> 텍스트 <빈칸> <p id="P-2"> &lt;&gt; </title>

출력 예

<예><HEAD></TITLE></HEAD><P>텍스트</P><EMPTY><PID="P-2"></P><BODY><예>

추가 정보

  • Baker, Mark (2000). Internet Programming with OmniMark. Boston: Kluwer Academic Publishers.
  • Smith, Norman E. (1998). Practical Guide to SGML/XML Filters. Plano, TX: WordWare Publishing.

레퍼런스

  1. ^ "Guide to OmniMark 10.1.2". OmniMark Developer Resources. Retrieved 24 September 2018.
  2. ^ Stilo International (2004). Beginner's Guide to OmniMark (PDF). p. 3. Retrieved 24 September 2018.
  3. ^ Travis, Brian L. (1997). OmniMark at work: Getting Started. Englewood, CO: SGML University Press. p. vii.
  4. ^ "Office Locations". Stilo. Retrieved 24 September 2018.
  5. ^ "OmniMark 5 is Free". Cover Pages. Retrieved 24 September 2018.

외부 링크