使用Ant脚本过滤器对行进行计数 [英] Using Ant scriptfilter to count lines

查看:57
本文介绍了使用Ant脚本过滤器对行进行计数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写Ant <scriptfilter...>,以将字符串"__LINE__"的出现更改为Java源文件中的正确行号.

I am trying to write an Ant <scriptfilter...> to change occurrences of the string "__LINE__" to the correct line number in Java source files.

有人有使用JavaScript(或其他嵌入式脚本语言)来执行此操作的示例吗?特别是,如何创建一个全局"变量,该变量在脚本启动时初始化为1,并随每行新行递增?

Does anyone have an example of using JavaScript (or some other embedded scripting language) to do this? In particular, how do I create a "global" variable that is initialized to 1 when the script starts and is incremented with each new line?

谢谢.

更新:刚刚尝试了Martin Clayton提供的解决方案(谢谢!),用Beanshell替换了JavaScript,并且效果很好.这是Ant目标代码:

UPDATE: Just tried the solution offered by Martin Clayton (thanks!), replacing the JavaScript with Beanshell, and it worked perfectly. Here is the Ant target code:

<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属性来保存静态".

You could use an ant property to hold the 'static'.

这是一个非常简化的示例,用于一个文件.

Here's a very simplified example, for one file.

<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不会在文件之间重置为一个.

The problem is: that doesn't extend to multiple files - the lineNumber doesn't reset to one between files.

您可以使用 filetokenizer 来获取全部信息一次性将文件导入javascript,然后逐行处理该文件. 这是一个非常的点子示例(我知道足够多的javascript都是危险的).我确信这有很多错误(尤其是:它不处理非换行终止的文件;令人震惊的字符串连接). 但是原理是,通过将每个完整文件放入脚本中,您不需要任何信息即可在脚本调用之间持久化.

You might use a filetokenizer to get the whole file into javascript in one go, then process the file line-by-line. Here's a very noddy example (I know enough javascript to be dangerous). I'm sure this has lots of faults (not least: it doesn't handle non-newline terminated files; shocking string catenations). But the principle is that by getting each whole file into the script, you don't need any information to persist between script invocations.

<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>

这篇关于使用Ant脚本过滤器对行进行计数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆