2

我有一个复杂的、生成的 Javascript 文件(它由 GWT 编译器生成),我需要能够以编程方式对此进行更改并输出文件的“清理”版本。特别是,我有:

function bookmark(){
    // lots-o-javascript
    var M=Vb+s+I+Wb;n.write(Xb+Yb+Zb+$b+_b+ac+bc+$b+_b+cc+dc+ec+M+fc+gc+hc+ic)
}
bookmark();

未经混淆,函数内部如下所示:

var compiledScriptTag = '"<script src=\\"' + base + strongName + '.cache.js\\"><\/scr" + "ipt>"';
$doc_0.write('<scr' + 'ipt><!-' + '-\n' + 'blah blah blah' + 'document.write(' + compiledScriptTag + ');' + '\n-' + '-><\/scr' + 'ipt>');

所以我需要做的是在一个 Java servlet 中,将上面两行转换为等价于:

eval('blah blah blah');
document.body.appendChild(document.createElement('script')).src=base + strongName + ".cache.js";

解析和重新排列这个 Javascript 文件的最佳选择是什么?我应该研究一下 Rhino,它是否能够为这些提供句柄(以及使用 $doc.write 编写的嵌套 Javascript)?任何想法,将不胜感激。

4

4 回答 4

1

您可以在 Java 中使用 RegEx,但我建议使用常规字符串搜索函数并在新的 StringBuilder 对象中重建 JavaScript 代码。

于 2011-01-18T19:57:50.293 回答
1

您可以将 -style PRETTY 添加到 GWT 编译器以获取未混淆的 JavaScript。

要使用 Rhino 评估您的 JavaScript,您需要提供特定于浏览器的对象,例如文档、窗口、... 在任何情况下 document.write 都会让一切变得非常复杂。

您还可以使用提供的 ECMAScript 语法使用 ANTLRv3 解析 JavaScript,但我不确定这是否会对您有所帮助。

于 2011-01-18T07:30:01.007 回答
1

也许更优雅和更少蛮力的选项是修改 iframe 链接器以更改您需要的内容,或者我认为您可以创建辅助链接器并在加载程序被混淆之前更改行。链接器是我还没有玩过的一件事,但我知道它们可能是做你想做的事情的最佳场所。

于 2011-01-19T00:50:22.897 回答
1

由于您需要进行的转换非常具体,因此我能看到的最简单的解决方案是将 js 作为纯文本使用,而不是将其视为一种语言。

您可以在 + 上拆分,然后获取相关的数组值。

于 2011-01-18T07:53:51.710 回答