Быстрый и грязный текст на основе хака в TXR:
script.txr:
@(collect)
@prolog
@(last)
<script>
@(end)
@(collect :vars (code))
@ (block occurs)
@ (cases)
@{decl /(var )?/}@{var /[a-z]+/}=@expr
@ (trailer)
@ (skip)
@ (cases)
@ (skip)@var@(skip)
@ (bind code `@decl@var=@expr`)
@ (or)
</script>
@ (fail occurs)
@ (end)
@ (or)
@code
@ (end)
@ (end)
@(last)
</script>
@(end)
@(collect)
@epilog
@(end)
@(output)
@{prolog "\n"}
<script>
@{code "\n"}
</script>
@{epilog "\n"}
@(end)
Контрольный пример script.html
:
verbatim
text
<script>
a={name:"abc"};
b={xyz:"123"};
this.c='aaa';
this.cc='bbb';
d=new Date();
var e=new Array();
var f=false;
this.g=123;
this.g++;
</script>
left
alone
Запуск:
$ txr script.txr script.html
verbatim
text
<script>
a={name:"abc"};
b={xyz:"123"};
this.c='aaa';
this.cc='bbb';
var e=new Array();
this.g=123;
this.g++;
</script>
left
alone
Как видите, некоторая конденсация была достигнута.
Однако код считает, что aaa
представляет собой использование переменной a
.Переменная e
сохраняется, поскольку e
встречается в var f=false
;но вы больше этого не видите, потому что сама эта строка удалена, поскольку f
не происходит.
Если вы хотите больше, чем просто тупые текстовые хаки, вам нужно проанализировать Javascript.(Возможно и в TXR ясным и дисциплинированным грамматическим способом, но кодирование всех грамматических правил утомительно.)