Вы можете использовать свойство ant для хранения «static».
Вот очень упрощенный пример для одного файла.
<property name="lineNumber" value="0" />
<copy file="input.txt" tofile="output.txt" >
<filterchain>
<scriptfilter language="javascript">
project.setProperty( "lineNumber",
parseInt( project.getProperty( "lineNumber" ) ) + 1 );
if ( self.getToken().indexOf("__LINE__") != -1 ) {
lineNumber = project.getProperty( "lineNumber" );
self.setToken( self.getToken( ).replaceAll( "__LINE__", lineNumber ) );
}
</scriptfilter>
</filterchain>
</copy>
Проблема в том, что это не распространяется на несколько файлов - lineNumber
не переустанавливается на один между файлами.
Вы можете использовать filetokenizer
, чтобы получить весь файл в javascript за один раз, а затем обработать файл построчно.
Вот очень хороший пример (я знаю достаточно javascript, чтобы быть опасным). Я уверен, что у этого есть много ошибок (не в последнюю очередь: это не обрабатывает файлы без завершения строки; шокирующая цепочка строк).
Но принцип заключается в том, что, помещая каждый файл в сценарий, вам не нужно сохранять информацию между вызовами сценария.
<copy todir="output">
<fileset dir="input"/>
<filterchain>
<tokenfilter>
<filetokenizer/>
<scriptfilter language="javascript"><![CDATA[
// Get the whole input file to one string.
inputContent = self.getToken( );
lineNum = 1;
fileEnd = inputContent.length( );
// Build the new file up line-by-line in this var.
outputContent = "";
lineStart = 0;
lineEnd = inputContent.indexOf( "\n" );
while ( lineEnd < fileEnd ) {
outputContent += inputContent
.substring( lineStart, lineEnd )
.replaceAll( "__LINE__", lineNum ) + "\n";
lineStart = lineEnd + 1;
fc = inputContent.substring( lineStart );
lineEnd = fc.indexOf( "\n" );
if ( lineEnd == -1 )
break;
lineEnd += lineStart;
lineNum++;
}
self.setToken( outputContent );
]]></scriptfilter>
</tokenfilter>
</filterchain>
</copy>