Flash, Ant и множество замен регулярных выражений - PullRequest
1 голос
/ 24 октября 2011

У меня есть флеш-проект, который для целей оптимизации должен содержать постоянные ссылки, заменяемые литералами во время сборки выпуска.

Есть сотни констант, которые я хочу заменить. Все они хранятся в одном файле в следующем формате:

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 (который я только начал изучать) для выполнения этой задачи, но если вы думаете, что есть лучший способ, я весь в ушах. Я могу придумать два решения, ни одно из которых я не знаю, как выполнить:

  1. Напишите какой-нибудь фрагмент кода Ant для умных штанов, который проанализирует этот файл констант и с радостью выполнит замены, сохранив все в памяти.
  2. Заставьте задачу сначала разобрать Constants.as , выведите новый скрипт Ant, который затем будет выполнен первой задачей.

Я использую Flash Builder 4.5 для всех своих потребностей в Ant.

EDIT: Некоторые уточнения. В проекте я использую константы, например LEVEL_WIDTH. Все эти константы объявлены в вышеупомянутых Constants.as. Теперь я хочу заменить все экземпляры этих констант во всем проекте их действительными значениями. Так что такая строка:

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

будет заменено на:

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

1 Ответ

1 голос
/ 24 октября 2011

ОК, это не самая простая вещь, которую можно сделать с муравьем.Сначала нужно знать, что вы можете изменить.Это означает, что все имена ваших констант, а также соответствующие значения.Являются ли имена констант уникальными?Если да, это звучит как структура карты для меня.Затем вам необходимо переопределить все ваши исходные файлы, которые содержат одну или несколько из этих переменных, чтобы каждая константа заменялась фактическим значением.Это не то, для чего предназначен муравей, но вы можете сделать это с помощью скрипта def.

Я бы сделал это с помощью Java следующим образом:

Сохранить все константы / значения на карте (есликонстанты уникальны) иначе используйте другую структуру.

Пример кода:

<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

Итак, все, что я сделал, сохранило все имена / значения констант в два массива.Вам нужно перебирать массивы и заменять регулярные выражения для каждого из ваших исходных файлов.Все это может быть макроопределением, которое вы можете вызывать несколько раз.

...