作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个 Ant <scriptfilter...>
更改字符串 "__LINE__"
的出现次数到 Java 源文件中的正确行号。
有没有人有使用 JavaScript(或其他一些嵌入式脚本语言)来执行此操作的示例?特别是,如何创建一个初始化为 1
的“全局”变量脚本何时开始并随每一行递增?
谢谢。
更新: 刚刚尝试了 Martin Clayton 提供的解决方案(谢谢!),用 Beanshell 替换了 JavaScript,它运行良好。这是 Ant 目标代码:
<target name="preprocess" depends="ivy.resolve" description="Preprocess the source code">
<mkdir dir="${target.source.dir}"/>
<copy todir="${target.source.dir}" includeemptydirs="true" failonerror="true" verbose="true">
<fileset dir="${src.dir}"/>
<filterchain>
<tokenfilter>
<filetokenizer/>
<scriptfilter language="beanshell" byline="true" setbeans="true"><![CDATA[
import java.io.BufferedReader;
import java.io.StringReader;
int count = 1;
BufferedReader br = new BufferedReader(new StringReader(self.getToken()));
StringBuilder builder = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
builder.append(line.replace("\"__LINE__\"", Integer.toString(count))).append('\n');
count++;
}
self.setToken(builder.toString());
]]></scriptfilter>
</tokenfilter>
</filterchain>
</copy>
</target>
最佳答案
您可以使用 ant 属性来保存“静态”。
这是一个非常简化的示例,用于一个 文件。
<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,然后逐行处理文件。这是一个非常 noddy 示例(我知道足够多的 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>
关于javascript - 使用 Ant scriptfilter 计算行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3695585/
我正在尝试编写一个 Ant 更改字符串 "__LINE__" 的出现次数到 Java 源文件中的正确行号。 有没有人有使用 JavaScript(或其他一些嵌入式脚本语言)来执行此操作的示例?特别是,
我是一名优秀的程序员,十分优秀!