    // Special manipulation if we are going to write a new paragraph
    function handleBeginningOfParagraph(bBeginningOfParagraph : node) {
        if bBeginningOfParagraph {
            @<text:p text:style-name="P1">@
            bBeginningOfParagraph = false;
        }
    }

    TrafficLight2OASIS ::=
        => {
            // Invariant part of the document, such as styles
            @<?xml version="1.0" encoding="UTF-8"?>
    <office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" office:version="1.0"><office:scripts/><office:font-face-decls><style:font-face style:name="Tahoma1" svg:font-family="Tahoma"/><style:font-face style:name="Courier New" svg:font-family="&apos;Courier New&apos;" style:font-family-generic="modern" style:font-pitch="fixed"/><style:font-face style:name="Lucida Sans Unicode" svg:font-family="&apos;Lucida Sans Unicode&apos;" style:font-pitch="variable"/><style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:font-pitch="variable"/><style:font-face style:name="Times New Roman" svg:font-family="&apos;Times New Roman&apos;" style:font-family-generic="roman" style:font-pitch="variable"/></office:font-face-decls><office:automatic-styles><style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard"><style:paragraph-properties style:text-autospace="none"/><style:text-properties style:font-name="Courier New" fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/></style:style><style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard"><style:text-properties style:font-name="Courier New" fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/></style:style><style:style style:name="T1" style:family="text"><style:text-properties fo:color="#0000ff" fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/></style:style><style:style style:name="T2" style:family="text"><style:text-properties fo:font-style="italic" style:font-style-asian="italic" style:font-style-complex="italic"/></style:style><style:style style:name="T3" style:family="text"><style:text-properties fo:color="#0000ff"/></style:style><style:style style:name="T4" style:family="text"><style:text-properties fo:color="#008000"/></style:style><style:style style:name="T5" style:family="text"><style:text-properties fo:color="#0000ff" style:text-position="sub 58%" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt"/></style:style><style:style style:name="T6" style:family="text"><style:text-properties fo:color="#800000"/></style:style><style:style style:name="T7" style:family="text"><style:text-properties fo:color="#ff0000" fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/></style:style><style:style style:name="fr1" style:family="graphic" style:parent-style-name="Graphics"><style:graphic-properties style:mirror="none" fo:clip="rect(0in 0in 0in 0in)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard"/></style:style></office:automatic-styles><office:body><office:text><office:forms form:automatic-focus="false" form:apply-design-mode="false"/><text:sequence-decls><text:sequence-decl text:display-outline-level="0" text:name="Illustration"/><text:sequence-decl text:display-outline-level="0" text:name="Table"/><text:sequence-decl text:display-outline-level="0" text:name="Text"/><text:sequence-decl text:display-outline-level="0" text:name="Drawing"/></text:sequence-decls>@
        }
        => local bBeginningOfParagraph = true;
        // consume token by token
        [
                // an identifier: keyword or function of the language or sensor
                #readIdentifier:sWord
                => handleBeginningOfParagraph(bBeginningOfParagraph);
                [
                        // a keyword
                        #check(sWord in {"activate", "desactivate", "duration", "start", "strategy"})
                        => {@<text:span text:style-name="T1">@sWord@</text:span>@}
                    |
                        // the sensor: 'hour' is displayed in subscript
                        #check(sWord == "vehicles_hour")
                        => {@<text:span text:style-name="T3">vehicles</text:span><text:span text:style-name="T5">hour</text:span>@}
                    |
                        // a function
                        #check(sWord == "time")
                        => {@<text:span text:style-name="T3">@sWord@</text:span>@}
                    |
                        // other
                        => {@<text:span text:style-name="T2">@sWord@</text:span>@}
                ]
            |
                // a constant string
                #readCString:sText
                => handleBeginningOfParagraph(bBeginningOfParagraph);
                => {@<text:span text:style-name="T6">&quot;@sText.composeHTMLLikeString()@&quot;</text:span>@}
            |
                // symbols to highlight
                ["=>" | "->"]:sSymbol
                => handleBeginningOfParagraph(bBeginningOfParagraph);
                => {@<text:span text:style-name="T7">@sSymbol.composeHTMLLikeString()@</text:span>@}
            |
                // multi-line comment
                !!"/*"
                => handleBeginningOfParagraph(bBeginningOfParagraph);
                [->"*/"]:sComment
                => {@<text:span text:style-name="T4">@sComment.composeHTMLLikeString()@</text:span>@}
            |
                // inline comment
                !!"//"
                => handleBeginningOfParagraph(bBeginningOfParagraph);
                [~[['\r']? '\n']]*:sComment
                => {@<text:span text:style-name="T4">@sComment.composeHTMLLikeString()@</text:span>@}
            |
                // special case: tabulation
                '\t'
                => handleBeginningOfParagraph(bBeginningOfParagraph);
                => {@<text:tab />@}
            |
                // special case: end of paragraph
                ['\r']? '\n'
                => {
                    if bBeginningOfParagraph {
                        @<text:p text:style-name="P1">@
                    } else {
                        bBeginningOfParagraph = true;
                    }
                    @</text:p>@
                }
            |
                // any other non-empty character
                #readChar:cChar
                => handleBeginningOfParagraph(bBeginningOfParagraph);
                =>{@@cChar.composeHTMLLikeString()@@}
        ]*
        => {
            // may have a paragraph to close
            if !bBeginningOfParagraph {
                @</text:p>@
            }
            local sFileName = getShortFilename(getInputFilename());
            local sPictureFile = sFileName.rsubString(4) + ".png";
            if sFileName.endString(".tlc") && sPictureFile.existFile() {
                // reference the PNG diagram of the strategy in the document and
                // copy it to the directory devoted to pictures
                copyFile(sPictureFile, "OpenOffice2.0/Pictures/" + sPictureFile);
                @<text:p text:style-name="P1" /><text:p text:style-name="P1">@
                @<draw:frame draw:style-name="fr1" draw:name="graphics1" text:anchor-type="paragraph" @
                // extract the width and height of the picture, loaded as a binary file:
                // each byte is represented by two hexadecimal digits
                local sHexaDimensions = rightString(leftString(loadBinaryFile(sPictureFile), 48), 16);
                local dheight = $6.9*hexaToDecimal(sHexaDimensions.rightString(8)) / hexaToDecimal(sHexaDimensions.leftString(8))$;
                @svg:width="6.9in" @
                @svg:height="@$floor($1 + dheight*10$)/10$@in" @
                @draw:z-index="0"><draw:image xlink:href="Pictures/@sPictureFile@" xlink:type="simple"@
                @ xlink:show="embed" xlink:actuate="onLoad"/></draw:frame></text:p>@
            }
            // end of the document
            @</office:text></office:body></office:document-content>@
        }
        ;

Generated by CodeWorker v3.11.0.1 from CWscript2HTML.cwp.