;;; xml2ddml2.xom -- finish off the conversion (pass2) ;;; Copyright (C) 1999 Rick Jelliffe ricko@gate.sinica.edu.tw ;;; Permission granted to use granted under MPL or GPL ;;; We need two passes, because OmniMark Light edition only allows ;;; 200 "actions". If you have a full license, you can put merge ;;; the two files. CROSS-TRANSLATE GLOBAL STREAM theRealContentModel GLOBAL STREAM r GLOBAL STREAM g GLOBAL COUNTER group GLOBAL COUNTER level VARIABLE ;; a stack of indexes for the referents GLOBAL SWITCH MIXED-CONTENT FIND-START CLEAR level ;; stack.size==0 NEW level RESET level TO 999 RESET group TO 0 FIND "" ((LOOKAHEAD NOT "") ANY)+=theContentModel "" DEACTIVATE MIXED-CONTENT OUTPUT "%n%t" SET theRealContentModel TO "" DO SCAN PATTERN theContentModel MATCH WHITE-SPACE* "" ((LOOKAHEAD NOT "") ANY)+=theMixedContentModel "" OUTPUT "%n%t%t" ACTIVATE MIXED-CONTENT SET theRealContentModel TO PATTERN theMixedContentModel MATCH WHITE-SPACE* "" OUTPUT "%n%t%t" MATCH WHITE-SPACE* "" OUTPUT "%n%t%t" MATCH WHITE-SPACE* "" OUTPUT "%n%t%t" ELSE DEACTIVATE MIXED-CONTENT SET theRealContentModel TO PATTERN theContentModel DONE ;;; here is the regular expression factoring part REPEAT SCAN theRealContentModel MATCH "#PCDATA" WHITE-SPACE* ["|,"] ;; strip: mixed content already caught by another mechanism MATCH "(" WHITE-SPACE* "#PCDATA" WHITE-SPACE* ")" ["?*+"]? WHITE-SPACE* ["|,"]? ;; strip this out too MATCH WHITE-SPACE+ ; strip MATCH "(" INCREMENT group NEW level RESET LEVEL TO "%d(group)" ; default value OPEN g AS REFERENT "G%d(level)" PUT g "Seq" CLOSE g ; default value OPEN r AS REFERENT "R%d(level)" PUT r "Required" CLOSE r OUTPUT "%sn%t%t%t<" OUTPUT REFERENT "G%d(level)" OUTPUT " Frequency='" OUTPUT REFERENT "R%d(level)" OUTPUT "'>" MATCH ")" (["+?*"])?=theOptSeq WHITE-SPACE* [",|"]?=theOccur OUTPUT "%n%t%t%t" OPEN r AS REFERENT "R%d(level)" DO SCAN PATTERN theOptSeq MATCH "?" PUT r "Optional" MATCH "+" PUT r "OneOrMore" MATCH "*" PUT r "ZeroOrMore" ELSE PUT r "Required" DONE CLOSE r REMOVE level MATCH ((LOOKAHEAD NOT (["+?*"])? WHITE-SPACE* [")|,"]) ANY)+=theToken (["+?*"])?=theOpt WHITE-SPACE*"|" ; or connector OPEN g AS REFERENT "G%d(level)" ; USING level ITEM (NUMBER OF level - 1 ) PUT g "Choice" CLOSE g OUTPUT "%n%t%t%t%t" MATCH ((LOOKAHEAD NOT (["+?*"])? WHITE-SPACE* [")|,"]) ANY)+=theTokenA (["+?*"])?=theOptA WHITE-SPACE* "," ; seq connector OPEN g AS REFERENT "G%d(level)" ;USING level ITEM (NUMBER OF level - 1 ) PUT g "Seq" CLOSE g OUTPUT "%n%t%t%t%t" MATCH ((LOOKAHEAD NOT (["+?*"])? WHITE-SPACE* [")|,"]) ANY)+=theTokenB (["+?*"])?=theOptB WHITE-SPACE* ")" (["+?*"])?=theOptC WHITE-SPACE* ["|,]"]?=theOccurB ; end group OUTPUT "%n%t%t%t%t%n%t%t%t" OPEN r AS REFERENT "R%d(level)" DO SCAN PATTERN theOptC MATCH "?" PUT r "Optional" MATCH "+" PUT r "OneOrMore" MATCH "*" PUT r "ZeroOrMore" ELSE PUT r "Required" DONE CLOSE r REMOVE level MATCH WHITE-SPACE+ MATCH ANY=theChar OUTPUT "" AGAIN OUTPUT "%n%t%t" WHEN ACTIVE MIXED-CONTENT OUTPUT "%n%t"