<?xml version="1.0" encoding="UTF-8"?>
<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->
<project basedir="." default="build" name="php/php.latte">
    <description>Builds, tests, and runs the project org.netbeans.modules.php.latte</description>
    <import file="../../nbbuild/templates/projectized.xml"/>

    <!--taskdef name="jflex"
        classname="JFlex.anttask.JFlexTask"
        classpath="/opt/jflex-1.4/lib/JFlex.jar" /-->

    <target name="gen-toplexer" >
        <jflex file="tools/LatteTopColoringLexer.flex" destdir="src" skel="tools/skeleton.netbeans" />
    </target>
    <target name="gen-markuplexer" >
        <jflex file="tools/LatteMarkupColoringLexer.flex" destdir="src" skel="tools/skeleton.netbeans" />
        <replace file="src/org/netbeans/modules/php/latte/lexer/LatteMarkupColoringLexer.java">
            <replacetoken><![CDATA[
          if (zzCurrentPosL < zzEndReadL)
            zzInput = zzBufferL[zzCurrentPosL++];
          else if (zzAtEOF) {
            zzInput = YYEOF;
            break zzForAction;
          }
          else {
            // store back cached positions
            zzCurrentPos  = zzCurrentPosL;
            zzMarkedPos   = zzMarkedPosL;
            boolean eof = zzRefill();
            // get translated positions and possibly new buffer
            zzCurrentPosL  = zzCurrentPos;
            zzMarkedPosL   = zzMarkedPos;
            zzBufferL      = zzBuffer;
            zzEndReadL     = zzEndRead;
            if (eof) {
              zzInput = YYEOF;
              break zzForAction;
            }
            else {
              zzInput = zzBufferL[zzCurrentPosL++];
            }
          }]]></replacetoken>
            <replacevalue></replacevalue>
        </replace>
        <replace file="src/org/netbeans/modules/php/latte/lexer/LatteMarkupColoringLexer.java">
            <replacetoken><![CDATA[
      yychar+= zzMarkedPosL-zzStartRead;
]]></replacetoken>
            <replacevalue></replacevalue>
        </replace>
        <replace file="src/org/netbeans/modules/php/latte/lexer/LatteMarkupColoringLexer.java">
            <replacetoken><![CDATA[
  public LatteMarkupTokenId findNextToken() throws java.io.IOException {
]]></replacetoken>
            <replacevalue><![CDATA[
  @SuppressWarnings("fallthrough")
  public LatteMarkupTokenId findNextToken() throws java.io.IOException {
]]></replacevalue>
        </replace>
        <replaceregexp match="[ \t]+$" replace="" byline="true" >
            <fileset dir="src/org/netbeans/modules/php/latte/lexer">
                <include name="LatteMarkupColoringLexer.java"/>
            </fileset>
        </replaceregexp>
    </target>
</project>
