This page describes yasco’s features. Each feature is explained using a before-after-scenario.
Identifier substitution
This basic feature is enabled by default. It can be disabled using the --no-mapping
option (or -M
). Both variable name and function name substitution are toggled using this option.
Variable name substitution
yasco can shorten the names of declared variables. The scope in which those are declared, are known to yasco.
Whenever a variable is implicitly declared using var
, yasco remembers its name and scope and substitutes it to vX
(X being a placeholder for a numeric value). In the following example, d
is not declared and is thus not substituted. It also knows beforehand, if a variable was declared within a scope and used before its declaration (which is valid Javascript). This is the case for a
.
Before
do {
a = 1;
var a, b = 0, c = 1;
d = 2;
alert(a+b+d+c);
} while(false);
After
do{v1=1;var v1,v2=0,v0=1;d=2;alert(v1+v2+d+v0);}while(false);
You can see that d
is still present, whereas the rest have been substituted. Also note a
being v1
now.
Function name substitution
yasco can shorten the names of functions. The scope in which those are declared, are known to yasco.
yasco knows functions and the scope in which they are available and substitutes their names to vX
(X being a placeholder for a numeric value).
As with substituted variable names, the function declaration is known even if the usage of the identifier precedes the declaration.
Before
function foo()
{
var a = bar(1,2);
return a;
}
function bar(a,b)
{
return a + b;
}
After
Option -n1
used for readability:
function v1(){var v2=v0(1,2);
return v2;}
function v0(p2,p3){return p2+p3;}
Note the arguments a
and b
to function bar()
having been substituted to p2
and p3
.
Keyword aliasing
Commonly used objects and methods are aliased. The following keywords are subject to aliasing:
clearTimeout
document
extend
fromCharCode
href
indexOf
location
match
navigator
Prototype
prototype
setTimeout
String
substr
substring
userAgent
window
The following options can be passed to the filter:
always_replace
verbose
wrapper_object
By default, the objects are aliased to global variables sequentially named starting with from the capital letter A. When using the
option wrapper_object
, a global object is used for aliasing instead:
yaso.pl ... --keywords -O Yaso::Filter::Keywords=verbose:1,wrapper_object=1
This will modify the following code
var a = document.location.href,
b = String.fromCharCode(64);
to look like this:
var Be={D:String,A:document,B:"location",C:"href",E:"fromCharCode"};
var v0=Be.A[Be.B][Be.C],
v1=Be.D[Be.E](64);
Actually, for this example to work, yasco needs the always_replace
option set to one. Aliasing will only be done for objects
referenced more than once.