/*description:
{
    It takes in charge of translating any \CodeWorker\ script to HTML.

    The source file is highlighted and keywords plus particular symbols of the
    language are linked to the online-documentation.

    Note that \samp{this.docURL} designates the URL or the directory where both the CSS
    and the    HTML documentation of \CodeWorker\ are stored. If not populated, it will resolve
    links from the directory where is the target HTML file. Don't forget to end the URL or
    directory with a trailing slash.

    If \samp{this.includeCSS} is set to a path, the styles are included into the HTML file from the path,
    rather that being linked to a file while browsing.

    To highlight any script, type:\\
    \texttt{CodeWorker \textbf{-translate} CWscript2HTML.cwp \textit{<CW-script.cw>} \textit{<CW-script.html>}}\\
    to consider that the documentation and the CSS are in the same directory, and:\\
    \texttt{CodeWorker \textbf{-translate} CWscript2HTML.cwp \textit{<CW-script.cw>} \textit{<CW-script.html>} \textbf{-insert} docURL \textit{HTML-doc-URL}}\\
    otherwise.
}
*/

#include "CodeWorker_grammar.cwp"

#overload #ignore    ::=
        [
                ' ' | '\t' | '\r' | '\n'
            |
                "/*"
                => insertText($getOutputLocation() - 2$, "<span class=\"comment\">");
                ignoreEmbeddedComment
                => {@</span>@}
            |
                "//"
                => insertText($getOutputLocation() - 2$, "<span class=\"comment\">");
                [~[['\r']? '\n' | #empty]]*
                #explicitCopy
                [
                        ['\r']? '\n'
                        => {
                            @</span>@
                            if !this.multilineScript {@<br/>@}
                            @@endl()@@
                        }
                    |
                        => {@</span>@}
                ]
                    
        ]*
        ;

function transformChar(cChar : value) {
    if cChar == ' ' return (this.multilineScript) ? " " : "&nbsp;";
    if cChar == '\t' return (this.multilineScript) ? "    " : "&nbsp;&nbsp;&nbsp;&nbsp;";
    if cChar == '\n' return (this.multilineScript) ? endl() : "<br/>" + endl();
    if cChar != '\r' return composeHTMLLikeString(cChar);
}

#implicitCopy(transformChar)

#overload translation_unit    ::=
        => if !this.embeddedScript {@<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
@
            if this.includeCSS {
                @        <style type='text/css'>
            <!--
@loadFile(this.includeCSS)@
            -->
        </style>
@
            } else {
                @        <link rel="stylesheet" type="text/css" href="@this.docURL@CodeWorker.css" />
@
            }
@    </head>
    <body class="script">
        @}
        [!![->'\n'] => insert this.multilineScript = true;]?
        => if this.multilineScript {@<pre>@}
        script<this>
        => if this.multilineScript {@</pre>@}
        => if !this.embeddedScript {
            @<hr />
        <div style="background-color: #eeeedd">Generated by <a href="http://www.codeworker.org/index.html">@
        local sPath = getOutputFilename();
        sPath = sPath.rsubString(lengthString(sPath.getShortFilename()));
        if existFile(sPath + "CodeWorker99x38.png") {
            @<img border=0 src="CodeWorker99x38.png"/>@
        } else if this.docURL.startString("http://") || existFile(this.docURL + "CodeWorker99x38.png") {
            @<img border=0 src="@this.docURL@CodeWorker99x38.png"/>@
        } else {
            @<img border=0 src="http://www.codeworker.org/CodeWorker99x38.png"/>@
        }
        @</a> v@getVersion()@ from @
        
        if existFile(sPath + "CWscript2HTML.html") {
            @<a href="CWscript2HTML.html">CWscript2HTML.cwp</a>@
        } else if this.docURL.startString("http://") || existFile(this.docURL + "CWscript2HTML.html") {
            @<a href="@this.docURL@CWscript2HTML.html">CWscript2HTML.cwp</a>@
        } else {
            @<a href="http://www.codeworker.org/CWscript2HTML.html">CWscript2HTML.cwp</a>@
        }
        @.</div>
    </body>
</html>
@}
        ;

#overload instruction    ::=
        '{' #continue [instruction]* '}'
    |
        #readIdentifier:sKeyword
        => local iLocation = getOutputLocation();
        [
                instruction<sKeyword>
                => insertText(iLocation, "</A>");
                => insertText($iLocation - sKeyword.length()$, "<A class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#" + sKeyword + "\">");
            |
                predefined_function_call<sKeyword> ';'
                => insertText(iLocation, "</A>");
                => insertText($iLocation - sKeyword.length()$, "<A class=\"function\" href=\"" + this.docURL + "manual_The_scripting_language.html#" + sKeyword + "\">");
            |
                predefined_procedure_call<sKeyword> ';'
                => insertText(iLocation, "</A>");
                => insertText($iLocation - sKeyword.length()$, "<A class=\"procedure\" href=\"" + this.docURL + "manual_The_scripting_language.html#" + sKeyword + "\">");
            |
                module_function_call ';'
            |
                user_function_call ';'
        ]
    |
        preprocessor
    |
        variable_expression '.' #continue method_call ';'
    |
        //#check(this != "procedural")
        STARTING_TAG
        #!ignore
        #continue STARTING_ENDING_RAW_TEXT
        #ignore
        [!preprocessor expression ![!'@' !"%>" !#empty]]?
        ;

#overload instruction<"try">    ::=
        #continue instruction
        "catch"
        => insertText($getOutputLocation() - 5$, "<A class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#try\">");
        => {@</A>@}
        '(' variable_expression ')' instruction
        ;

#overload preprocessor    ::=
        => local iLocation = getOutputLocation();
        '#'
        #readIdentifier:sKeyword
        => insertText(iLocation, "<a class=\"directive\" href=\"" + this.docURL + "manual_The_scripting_language.html#_" + sKeyword + "\">");
        => {@</a>@}
        preprocessor<sKeyword>
        ;

#overload literal_expression<bNumeric>    ::=
        => local iLocation = getOutputLocation();
        [
                CONSTANT_STRING
            |
                '(' #continue expression<bNumeric> ')'
            |
                '$'
                => insertText(iLocation, "<a class=\"constant\" href=\"" + this.docURL + "manual_The_scripting_language.html#$\">");
                => {@</a>@}
                #continue #check(!bNumeric) expression<true>
                => {@<a class="constant" href="@this.docURL@manual_The_scripting_language.html#$">@}
                '$'
                => {@</a>@}
            |
                '~'
                => insertText(iLocation, "<a class=\"constant\" href=\"" + this.docURL + "manual_The_scripting_language.html#numeric_expression\">");
                => {@</a>@}
                #continue #check(bNumeric) literal_expression<true>
            |
                CONSTANT_CHAR
            |
                '!'
                => insertText(iLocation, "<a class=\"constant\" href=\"" + this.docURL + "manual_The_scripting_language.html#boolean_expression\">");
                => {@</a>@}
                #continue literal_expression<bNumeric>
            |
                #readNumeric
                => insertText(iLocation, "<span class=\"numeric\">");
                => {@</span>@}
            |
                #readIdentifier:{"true", "false"}
                => insertText(iLocation, "<a class=\"constant\" href=\"" + this.docURL + "manual_The_scripting_language.html#boolean_literals\">");
                => {@</a>@}
            |
                function_call
            |
                variable_expression ['.' #continue method_call]?
        ]
        ;

#overload function_call    ::=
        #readIdentifier:sFunctionName
        => local iLocation = getOutputLocation();
        [
                predefined_function_call<sFunctionName>
                => insertText(iLocation, "</A>");
                => insertText($iLocation - sFunctionName.length()$, "<A class=\"function\" href=\"" + this.docURL + "manual_The_scripting_language.html#" + sFunctionName + "\">");
            |
                module_function_call
            |
                user_function_call
        ];

#overload method_call    ::=
        #readIdentifier:sMethodName
        => local iLocation = getOutputLocation();
        [
                predefined_method_call<sMethodName>:sFunctionName
                => insertText(iLocation, "</A>");
                => insertText($iLocation - sMethodName.length()$, "<A class=\"function\" href=\"" + this.docURL + "manual_The_scripting_language.html#" + sFunctionName + "\">");
            |
                user_method_call
        ];

#overload variable_expression<sIdentifier> : #!ignore    ::=
        => if sIdentifier == "project" || sIdentifier == "this" || sIdentifier == "_ARGS" || sIdentifier == "_REQUEST" {
            insertText($getOutputLocation() - sIdentifier.length()$, "<a class = \"constant\" href=\"" + this.docURL + "manual_The_scripting_language.html#" + sIdentifier + "\">");
            @</a>@
        }
        #super::variable_expression<sIdentifier>
        ;

#overload function_parameter_type    ::=
        => {@<a class="constant" href="@this.docURL@manual_The_scripting_language.html#function_parameters">@}
        #super::function_parameter_type
        => {@</a>@};


#overload DEFAULT    ::=
        #readIdentifier:"default"
        => insertText($getOutputLocation() - 7$, "<a class = \"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#switch\">");
        => {@</a>@};

#overload CASE    ::=
        #readIdentifier:"case"
        => insertText($getOutputLocation() - 4$, "<a class = \"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#switch\">");
        => {@</a>@};

#overload START    ::=
        #readIdentifier:"start"
        => insertText($getOutputLocation() - 5$, "<a class = \"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#switch\">");
        => {@</a>@};

#overload CASCADING    ::=
        #readIdentifier:"cascading"
        => insertText($getOutputLocation() - 9$, "<a class = \"constant\" href=\"" + this.docURL + "manual_The_scripting_language.html#foreach\">");
        => {@</a>@};

#overload ELSE    ::=
        #readIdentifier:"else"
        => insertText($getOutputLocation() - 4$, "<a class = \"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#if\">");
        => {@</a>@};

#overload IN        ::=
        #readIdentifier:"in"
        => insertText($getOutputLocation() - 2$, "<a class = \"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#foreach\">");
        => {@</a>@};

#overload INSET        ::=
        #readIdentifier:"in"
        => insertText($getOutputLocation() - 2$, "<a class = \"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#boolean_expression\">");
        => {@</a>@};

#overload NO_CASE    ::=
        #readIdentifier:"no_case"
        => insertText($getOutputLocation() - 7$, "<a class = \"constant\" href=\"" + this.docURL + "manual_The_scripting_language.html#foreach\">");
        => {@</a>@};

#overload REVERSE    ::=
        #readIdentifier:"reverse"
        => insertText($getOutputLocation() - 7$, "<a class = \"constant\" href=\"" + this.docURL + "manual_The_scripting_language.html#foreach\">");
        => {@</a>@};

#overload SORTED    ::=
        #readIdentifier:"sorted"
        => insertText($getOutputLocation() - 6$, "<a class = \"constant\" href=\"" + this.docURL + "manual_The_scripting_language.html#foreach\">");
        => {@</a>@};

#overload WHILE    ::=
        #readIdentifier:"while"
        => insertText($getOutputLocation() - 5$, "<a class = \"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#while\">");
        => {@</a>@};

#overload CONSTANT_STRING    ::=
        => local iLocation = getOutputLocation();
        [#readCString]+
        => insertText(iLocation, "<span class=\"string\">");
        => {@</span>@}
        ;

#overload CONSTANT_CHAR    ::=
        => local iLocation = getOutputLocation();
        '\'' #!ignore #continue ['\\']? #readChar '\''
        => insertText(iLocation, "<span class=\"string\">");
        => {@</span>@}
        ;

#overload VARIABLE_SPECIAL_ACCESSOR ::=
        #super::VARIABLE_SPECIAL_ACCESSOR:sKeyword
        => insertText($getOutputLocation() - sKeyword.length()$, "<a class = \"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#_" + sKeyword + "\">");
        => {@</a>@};

#overload FUNCTION    ::=
        #readIdentifier:"function"
        => insertText($getOutputLocation() - 8$, "<a class = \"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#function\">");
        => {@</a>@};

#overload DECLARE    ::=
        #readIdentifier:"declare"
        => insertText($getOutputLocation() - 7$, "<a class = \"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#declare\">");
        => {@</a>@};

#overload EXTERNAL    ::=
        #readIdentifier:"external"
        => insertText($getOutputLocation() - 8$, "<a class = \"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#external\">");
        => {@</a>@};


#overload PRULE_SYMBOL    ::=
        => {@<a class="constant" href="@this.docURL@manual_The_scripting_language.html#parsing_BNF_syntax">@}
        "::="
        => {@</a>@}
        ;

#overload NON_TERMINAL    ::=
        => {@<i>@}
        #readIdentifier
        => {@</i>@}
        ;

#overload ALTERNATION    ::=
        => local iLocation = getOutputLocation();
        '|'
        => insertText(iLocation, "<a class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#parsing_alternation\">");
        => {@</a>@}
        ;

#overload TR_BEGIN    ::=
        => local iLocation = getOutputLocation();
        '<'
        => insertText(iLocation, "<a class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#BNF_declaring_a_clause\">");
        => {@</a>@}
        ;

#overload TR_END    ::=
        => local iLocation = getOutputLocation();
        '>'
        => insertText(iLocation, "<a class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#BNF_declaring_a_clause\">");
        => {@</a>@}
        ;

#overload PIPESUP    ::=
        => local iLocation = getOutputLocation();
        "|>"
        => insertText(iLocation, "<a class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#BNF_restricting_the_sentence\">");
        => {@</a>@}
        ;

#overload ANDOR    ::=
        => local iLocation = getOutputLocation();
        "&|"
        => insertText(iLocation, "<a class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#BNF_restricting_the_sentence\">");
        => {@</a>@}
        ;

#overload ADVICE_TYPE ::=
        => {@<a class="constant" href="@this.docURL@manual_The_scripting_language.html#advice">@}
        #super::ADVICE_TYPE
        => {@</a>@};
        
#overload STARTING_RAW_TEXT    ::= => {@<span class="raw_text">@} #super::STARTING_RAW_TEXT => {@</span>@};
#overload STARTING_ENDING_RAW_TEXT    ::= => {@<span class="raw_text">@} #super::STARTING_ENDING_RAW_TEXT => {@</span>@};
#overload STARTING_TAG    ::= => {@<span class="raw_text">@} #super::STARTING_TAG => {@</span>@};
#overload STARTING_TAG_OR_END    ::= => {@<span class="raw_text">@} #super::STARTING_TAG_OR_END => {@</span>@};

#overload BNF_general_directive    ::=
        => local iLocation = getOutputLocation();
        '#'
        #readIdentifier:sKeyword
        => insertText(iLocation, "<a class=\"directive\" href=\"" + this.docURL + "manual_The_scripting_language.html#_" + sKeyword + "\">");
        => {@</a>@}
        BNF_general_directive<sKeyword>
        ;

#overload BNF_general_directive<"overload">    ::=
        '#'
        => insertText($getOutputLocation() - 1$, "<a class=\"directive\" href=\"" + this.docURL + "manual_The_scripting_language.html#_ignore\">");
        #continue #readIdentifier:"ignore"
        => {@</a>@}
        BNF_general_directive<"ignore">
    |
        production_rule;

#overload BNF_catch    ::=
        '#'
        => insertText($getOutputLocation() - 1$, "<a class=\"directive\" href=\"" + this.docURL + "manual_The_scripting_language.html#_try\">");
        #continue
        "catch"
        => {@</a>@}
        '(' variable_expression ')';

#overload clause_parameter_type    ::=
        => {@<a class="constant" href="@this.docURL@manual_The_scripting_language.html#BNF_declaring_a_clause">@}
        #super::function_parameter_type
        => {@</a>@};

#overload BNF_clause_return_value    ::=
        => {@<a class="constant" href="@this.docURL@manual_The_scripting_language.html#BNF_declaring_a_clause">@}
        #super::BNF_clause_return_value
        => {@</a>@}
        ;

#overload BNF_clause_preprocessing    ::=
        ':' '#'
        => insertText($getOutputLocation() - 1$, "<a class=\"directive\" href=\"" + this.docURL + "manual_The_scripting_language.html#BNF_preprocessing_of_a_clause\">");
        #continue
        [
                '!'
                #continue
                #readIdentifier:"ignore"
            |
                #readIdentifier:"ignore"
                ['(' #continue BNF_ignore_type ')']?
        ]
        => {@</a>@};

#overload BNF_ignore_type    ::=
        => {
            @<a class="constant" href="@this.docURL@manual_The_scripting_language.html#BNF_directives__ignore">@
        }
        #super::BNF_ignore_type
        => {@</a>@};

#overload BNF_literal<bTokenCondition>    ::=
    [
            CONSTANT_STRING
            [#check(bTokenCondition) BNF_variable_assignation]?
        |
            CONSTANT_CHAR
            [
                    ".." #continue CONSTANT_CHAR
                    [#check(bTokenCondition) BNF_token_post_processing]?
                |
                    [#check(bTokenCondition) BNF_variable_assignation]?
            ]
        |
            [
                    '~'
                    => insertText($getOutputLocation() - 1$, "<a class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#BNF_token_complementary\">");
                    => {@</a>@}
                |
                    '^'
                    => insertText($getOutputLocation() - 1$, "<a class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#BNF_token_complementary\">");
                    => {@</a>@}
                |
                    '!'
                    => insertText($getOutputLocation() - 1$, "<a class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#BNF_token_negation\">");
                    => {@</a>@}
                |
                    "->"
                    => insertText($getOutputLocation() - 5$, "<a class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#-_amp_gt_\">");
                    [multiplicity]?
                    => {@</a>@}
                    [
                        '('    #continue
                        [BNF_variable_assignation]?
                        ['-' BNF_variable_assignation]?
                        [BNF_sequence]?
                        ')'
                    ]?
            ]
            #continue BNF_literal<false>
            [#check(bTokenCondition) BNF_token_post_processing]?
        |
            '['
            => insertText($getOutputLocation() - 1$, "<a class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#BNF_token_repeating_a_token\">");
            => {@</a>@}
            #continue BNF_sequence [ALTERNATION #continue BNF_sequence]*
            => {@<a class="instruction" href="@this.docURL@manual_The_scripting_language.html#BNF_token_repeating_a_token">@}
            ']'
            [multiplicity]?
            => {@</a>@}
            [#check(bTokenCondition) BNF_token_post_processing]?
        |
            '#'
            => local iLocation = $getOutputLocation() - 1$;
            #continue
            [
                    '!'
                    #continue
                    #readIdentifier:"ignore"
                    => insertText(iLocation, "<a class=\"directive\" href=\"" + this.docURL + "manual_The_scripting_language.html#_ignore\">");
                    => {@</a>@}
                |
                    #readIdentifier:sDirective
                    => insertText(iLocation, "<a class=\"directive\" href=\"" + this.docURL + "manual_The_scripting_language.html#_" + sDirective + "\">");
                    => {@</a>@}
                    BNF_directive<sDirective>:bTokenConditionAllowed
                    [
                        #check(bTokenCondition && bTokenConditionAllowed)
                        BNF_token_post_processing
                    ]?
            ]
        |
            "=>"
            => insertText($getOutputLocation() - 5$, "<a class=\"instruction\" href=\"" + this.docURL + "manual_The_scripting_language.html#BNF_operator__eq__amp_gt_\">");
            => {@</a>@}
            #continue instruction
        |
            BNF_clause_call
            [#check(bTokenCondition) BNF_token_post_processing]?
    ]
    [
        [PIPESUP | ANDOR]
        #continue
        BNF_literal<bTokenCondition>
    ]?
    ;


script_file_link(T : value) ::=
        => local iLocation = getOutputLocation();
        #readCString:sCWFilename
        !![',' | ')' | #check(T == "include")]
        #check(sCWFilename.rightString(4) in {".cwt", ".cws", ".cwp", ".gen"})
        => local sTargetPath = rsubString(getOutputFilename(), lengthString(getShortFilename(getOutputFilename())));
        => local sHTMLFilename = sTargetPath + sCWFilename + ".html";
        #check(sHTMLFilename.existFile())
        => insertText(iLocation, "<a href=\"" + sCWFilename + ".html" + "\" class=\"string\">");
        => {@</a>@}
    |
        #super::script_file_expression<T>
    ;

#overload script_file_expression<"free"> ::= script_file_link("free");
#overload script_file_expression<"pattern"> ::= script_file_link("pattern");
#overload script_file_expression<"BNF"> ::= script_file_link("BNF");
#overload script_file_expression<"translate"> ::= script_file_link("translate");

Generated by v4.5.3 from CWscript2HTML.cwp.