By Zevan | February 13, 2009
Actionscript:
-
var path:String = "section/home.swf";
-
-
var deepLinkValue:String = path.split("/")[1].split(".swf")[0];
-
-
trace(deepLinkValue);
-
/*outputs:
-
home
-
*/
As a primarily self taught programmer there was a time when I didn't know what a regular expression was. There was also a time when ActionScript didn't have them (you had to use a library). Sometimes when I'm in a rush I still do weird things like the above instead of regular expressions... pretty nasty I know.
Here are two different regular expressions that do the same thing:
Actionscript:
-
var path = "section/home.swf"
-
-
trace(path.match(/\w+(?=\.)/))
-
/*outputs:
-
home
-
*/
-
-
trace(path.replace(/.+\/|\..+/g, ""))
-
/* also outputs:
-
home
-
*/
Actually, I'd be curious to see other regular expressions that only return one value (not an array) that achieve this same thing... feel free to post of a comment if you can think of one...
By Zevan | February 12, 2009
Actionscript:
-
var someString:String = "_file";
-
trace(someString.substr(1));
-
/*
-
ouptuts:
-
file
-
*/
Turns out the second argument of substr() is optional..... not sure how I never noticed that before.
By Zevan | February 8, 2009
Actionscript:
-
var encode:Object = new Object();
-
var decode:Object = new Object();
-
var a:Array = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".split("");
-
-
// change this for different encoded results
-
var offset:int = 10;
-
-
for (var i:int = 0; i<a.length; i++){
-
var index:int = (a.length - i - offset) % a.length;
-
encode[a[i]] = a[index];
-
decode[a[index]] = a[i];
-
}
-
-
function encodeString(str:String):String{
-
return map(str, encode);
-
}
-
-
function decodeString(str:String):String{
-
return map(str, decode);
-
}
-
-
function map(str:String, smode:Object):String{
-
var n:String = "";
-
for (var i:int = 0; i<str.length; i++){
-
var char:String = str.charAt(i);
-
var en:String = smode[char];
-
if (en){
-
n += en;
-
}else{
-
n += char;
-
}
-
}
-
return n;
-
}
-
-
// test out the functions
-
-
var input:String = "This is a regular string";
-
-
trace(input);
-
-
var encoded:String = encodeString(input);
-
-
trace("encoded: ", encoded);
-
-
trace("decoded: ",decodeString(encoded));
-
-
/*
-
outputs:
-
-
This is a regular string
-
encoded: gSRH1RH1Z1IVTFOZI1HGIRMT
-
decoded: This is a regular string
-
-
*/
The above demos an intentionally simple string encoding technique.
This is a technique I use if I need to encode strings but don't care if someone figures out what the string value actually is. For me, this is more common than needing hard/impossible to crack string encoding algorithms. A good example is an e-card... a url for an ecard could look like this:
www.birthdaycardthing.com/?name=joe&age=32
or it could look like this:
www.birthdaycardthing.com/?i=brx&x=5p
I wrapped this snippet up into a class and made a few minor tweaks. The class is called SimpleCipher it has two static methods and one static property...
Actionscript:
-
import com.actionsnippet.utils.SimpleCipher;
-
// same as offset above, but can be set at any time
-
// new encode and decode Objects will be calculated
-
SimpleCipher.offset = 1;
-
var input:String = "SimpleCipher encoding and decoding";
-
-
trace("input: ", input);
-
-
var encoded:String = SimpleCipher.encode(input);
-
-
trace("encoded: ", encoded);
-
trace("decoded: ", SimpleCipher.decode(encoded));
-
/*
-
outputs:
-
input: SimpleCipher encoding and decoding
-
encoded: RhlokdBhogdq0dmbnchmf0 mc0cdbnchmf
-
decoded: SimpleCipher encoding and decoding
-
*/
Download SimpleCipher Class
(this class uses a static initializer... see yesterdays post)
Also posted in OOP | Tagged actionscript, flash |
By Zevan | February 6, 2009
Actionscript:
-
// for simplicity I left this XML inline, this will work exactly the same if it were external
-
var program:XML=<body>
-
<draw>
-
<![CDATA[
-
beginFill(0xFF0000);
-
drawCircle(100,100,50);
-
endFill();
-
lineStyle(0, 0x666666);
-
moveTo(100, 100);
-
lineTo(200, 200);
-
moveTo(300, 200);
-
curveTo(350, 300, 400, 200);
-
lineStyle(0, 0x0000FF);
-
drawRect(200, 50,100,100) ;
-
]]>
-
</draw>
-
</body>;
-
-
// parse and run the Graphics class commands from the XML
-
render(parseFunctions(program.draw.toString()));
-
-
function parseFunctions(dat:String):Array{
-
var a:Array = dat.split(";") ;
-
for (var i:int = 0; i<a.length-1; i++){
-
a[i] = a[i].split(/\(\)|\(|\)/g);
-
var f:String = a[i][0] = a[i][0].replace(/\s/g,"");
-
a[i] = a[i].splice(0, a[i].length - 1);
-
if (a[i].length> 1){
-
a[i] = a[i][1].split(",");
-
a[i].unshift(f);
-
}
-
}
-
return a.splice(0,a.length - 1);
-
}
-
function render(p:Array):void {
-
for (var i:int = 0; i<p.length; i++) {
-
graphics[p[i][0]].apply(graphics,p[i].splice(1));
-
}
-
}
The above code builds on yesterdays post by showing how one could potentially store graphics class method calls in XML using a few regular expressions and Function.apply().
The parseFunctions() function reads through the CDATA string and formats it in a 2D array that looks like this:
Actionscript:
-
[[beginFill, 0xFF0000], [drawCircle, 100, 100, 50], etc...]
The render() function reads through this 2D array, using the first value of each nested array as the function and the remaining values as arguments...
As is this won't really work with most of the new fp10 graphics methods...