Flash、Ant和大量正则表达式替换



我有一个flash项目,出于优化的目的,在发布构建期间必须将常量引用替换为文字。

有数百个我想要替换的常量。所有这些都存储在一个文件中,格式如下:

FILE: Constants.as
public static const CONST_1         :uint = 0;
public static const CONST_LOLO      :int = -1;
public static const CONST_WHEE      :Number = 2.55;
public static const OTHER_CONST     :String = "La string!";
public static const ITSAMEMARIO     :String = "O, HAI!";
public static const MAGE_WALL       :uint = 15;

我想我可以手动操作,像这样:

<replaceregexp match="CONST_1" replace="0">
    <fileset dir="${project.sourcePath}" includes="**/*.as" />
</replaceregexp>
<replaceregexp match="CONST_LOLO" replace="-1">
    <fileset dir="${project.sourcePath}" includes="**/*.as" />
</replaceregexp>

等等,对于所有其他变量。问题是双重的——首先,这是相当多的工作。但更大的问题是,这些常数可以改变,我必须记住在两个地方做改变。

一般来说,我使用Ant(我也刚刚开始学习)来完成这个任务,但如果你认为有更好的方法,我洗耳恭听。我能想到两种解决方案,但我都不知道如何执行:
    写一些聪明的Ant代码来解析这个常量文件,并愉快地进行替换,将所有内容保存在内存中。
  1. 让任务首先解析常量。作为,输出一个新的Ant脚本,然后由第一个任务执行。

我使用Flash Builder 4.5来满足我所有的Ant需求。

编辑:一些澄清。在项目中,我使用常量,例如LEVEL_WIDTH。所有这些常量都在前面提到的constants .as中声明。现在我要做的是用它们的实际值替换整个项目中这些常量的所有实例。这样一行:

return (x >= 0 && x < Constants.LEVEL_WIDTH);

将被替换为:

return (x >= 0 && x < 20);

对于ant来说,这不是最简单的事情。首先,你需要知道你可以改变什么。这意味着所有常量的名称以及相应的值。常量名是唯一的吗?如果是的话,这听起来像是一个地图结构。然后,您需要重新交换包含一个或多个这些变量的所有源文件,以便将每个常量替换为实际值。这不是ant的设计目的,但您可以通过脚本def来实现。

我将在java中这样做:

将所有的常量/值存储在map中(如果常量是唯一的),否则使用不同的结构

示例代码:
<project name="test" default="build">
  <property name="constants" value="constants.txt"/>
  <scriptdef name="replaceConstants" language="java">
    <attribute name="constants" />
    <attribute name="srcFile" />
    <![CDATA[
      import java.util.*;
      import java.util.regex.*;
      ArrayList constantNameList = new ArrayList();
      ArrayList constantValueList = new ArrayList();
      var constantFile = attributes.get("constants");
      Pattern regex = Pattern.compile("(?<=const)\s+(\b\w+\b).*?=\s*(.*?)\s*;");
        Matcher regexMatcher = regex.matcher(constantFile);
        while (regexMatcher.find()) {
            constantNameList.add(regexMatcher.group(1));
        constantValueList.add(regexMatcher.group(2));
        }
      for(int i = 0; i < constantNameList.size(); ++i)
      {
        //debugging
        System.out.print("key : ");
        System.out.print(constantNameList.get(i));
        System.out.print(" value : ");
        System.out.println(constantValueList.get(i));
        //do the actual replacement here
      }
     ]]>
  </scriptdef>
  <target name="build">
    <loadfile property="constants.file" srcFile="${constants}"/>
    <loadfile property="source.file" srcFile="sourceFile.txt"/>
    <echo message="${constants.file}"/>
    <replaceConstants constants="${constants.file}" srcFile="${source.file}"/>
  </target>
</project>

您将需要java 1.6或更高版本来运行此程序以及http://www.java2s.com/Code/Jar/ABC/bsh-2.0b5.jar.htm

这个jar来运行它。

输出:

[replaceConstants] key : CONST_1 value : 0
[replaceConstants] key : CONST_LOLO value : -1
[replaceConstants] key : CONST_WHEE value : 2.55
[replaceConstants] key : OTHER_CONST value : "La string!"
[replaceConstants] key : ITSAMEMARIO value : "O, HAI!"
[replaceConstants] key : MAGE_WALL value : 15

我所做的是将所有的常量名称/值存储到两个数组中。您需要遍历每个源文件的数组和正则表达式替换。整个东西可以是一个可以多次调用的macrodef

相关内容

  • 没有找到相关文章

最新更新