Browse Source

Add characters to debug.

Martin Kleppe 13 years ago
parent
commit
e99d37b65f
1 changed files with 113 additions and 97 deletions
  1. 113 97
      jsfuck.js

+ 113 - 97
jsfuck.js

@@ -5,96 +5,96 @@
   var MIN = 32, MAX = 126;
   
   var MAPPING = {
-    "a":   '("false")[1]',
-    "b":   '(window+[])[2]',
-    "c":   '([]["filter"]+[])[3]',
-    "d":   '("undefined")[2]',
-    "e":   '("true")[3]',
-    "f":   '("false")[0]', 
-    "g":   '([]+("")["constructor"])[14]',
-    "h":   '(+(17))["toString"](18)',
-    "i":   '([false]+undefined)[10]',
-    "j":   '(window+"")[3]',
-    "k":   '(+(20))["toString"](21)',
-    "l":   '("false")[2]',
-    "m":   '(Number+"")[11]',
-    "n":   '("undefined")[1]',
-    "o":   '(true+[]["filter"])[10]',
-    "p":   '(+(25))["toString"](30)',
-    "q":   '(+(26))["toString"](30)',
-    "r":   '("true")[1]',
-    "s":   '("false")[3]',
-    "t":   '("true")[0]',
-    "u":   '("undefined")[0]',
-    "v":   '(+(31))["toString"](32)',
-    "w":   '(+(32))["toString"](33)',
-    "x":   '(+(33))["toString"](34)',
-    "y":   '(NaN+[Infinity])[10]',  // TODO: Shorten  
-    "z":   '(+(35))["toString"](36)',
-
-    "A":   '("function Array")[9]',
-    "B":   '("function Boolean")[9]',
-    "C":   'Function("return \'\\\\"+(103)+"\'")()',
-    "D":   USE_CHAR_CODE,
-    "E":   USE_CHAR_CODE,
-    "F":   '("function Function")[9]',
-    "G":   USE_CHAR_CODE,
-    "H":   USE_CHAR_CODE,
-    "I":   '("Infinity")[0]',
-    "J":   USE_CHAR_CODE,
-    "K":   USE_CHAR_CODE,
-    "L":   USE_CHAR_CODE,
-    "M":   USE_CHAR_CODE,
-    "N":   '("NaN")[0]',
-    "O":   USE_CHAR_CODE,
-    "P":   USE_CHAR_CODE,
-    "Q":   USE_CHAR_CODE,
-    "R":   USE_CHAR_CODE,
-    "S":   '("function String")[9]',
-    "T":   USE_CHAR_CODE,
-    "U":   USE_CHAR_CODE,
-    "V":   USE_CHAR_CODE,
-    "W":   USE_CHAR_CODE,
-    "X":   USE_CHAR_CODE,
-    "Y":   USE_CHAR_CODE,
-    "Z":   USE_CHAR_CODE,
-
-    " ":   '([]["filter"]+[])[8]',
-    "!":   USE_CHAR_CODE,
-    "\"":  '("")["link"]()[8]',
-    "#":   USE_CHAR_CODE,
-    "$":   USE_CHAR_CODE,
-    "%":   'window["escape"]("<")[0]',
-    "&":   USE_CHAR_CODE,
-    "'":   USE_CHAR_CODE,
-    "(":   '([]["filter"]+"")[15]',
-    ")":   '([]["filter"]+"")[16]',
-    "*":   USE_CHAR_CODE,
-    "+":   USE_CHAR_CODE,
-    ",":   USE_CHAR_CODE,
-    "-":   USE_CHAR_CODE,
-    ".":   USE_CHAR_CODE,
-    "/":   '("")["sub"]()[6]',
-    ":":   'window["Date"]()[21]',
-    ";":   USE_CHAR_CODE,
-    "<":   '("")["sub"]()[0]',
-    "=":   '("")["fontcolor"]()[11]',
-    ">":   '("")["sub"]()[10]',
-    "?":   USE_CHAR_CODE,
-    "@":   USE_CHAR_CODE,
-    "[":   USE_CHAR_CODE,
-    "\\":  'window["unescape"]("%"+(5)+"c")[0]',
-    "]":   USE_CHAR_CODE,
-    "^":   USE_CHAR_CODE,
-    "_":   USE_CHAR_CODE,
-    "`":   USE_CHAR_CODE,
-    "{":   '([]["filter"]+"")[18]',
-    "|":   USE_CHAR_CODE,
-    "}":   USE_CHAR_CODE,
-    "~":   USE_CHAR_CODE
+    'a':   '("false")[1]',
+    'b':   '(window+[])[2]',
+    'c':   '([]["filter"]+[])[3]',
+    'd':   '("undefined")[2]',
+    'e':   '("true")[3]',
+    'f':   '("false")[0]', 
+    'g':   '([]+String)[14]',
+    'h':   '(+(17))["toString"](18)',
+    'i':   '([false]+undefined)[10]',
+    'j':   '(window+"")[3]',
+    'k':   '(+(20))["toString"](21)',
+    'l':   '("false")[2]',
+    'm':   '(Number+"")[11]',
+    'n':   '("undefined")[1]',
+    'o':   '(true+[]["filter"])[10]', // todo
+    'p':   '(+(25))["toString"](30)',
+    'q':   '(+(26))["toString"](30)',
+    'r':   '("true")[1]',
+    's':   '("false")[3]',
+    't':   '("true")[0]',
+    'u':   '("undefined")[0]',
+    'v':   '(+(31))["toString"](32)',
+    'w':   '(+(32))["toString"](33)',
+    'x':   '(+(33))["toString"](34)',
+    'y':   '(NaN+[Infinity])[10]',  // TODO: Shorten  
+    'z':   '(+(35))["toString"](36)',
+    
+    'A':   '(Array+"")[9]',
+    'B':   '(Boolean+"")[9]',
+    'C':   'Function("return \'\\\\"+(103)+"\'")()',
+    'D':   USE_CHAR_CODE,
+    'E':   USE_CHAR_CODE,
+    'F':   '(Function+"")[9]',
+    'G':   USE_CHAR_CODE,
+    'H':   USE_CHAR_CODE,
+    'I':   '("Infinity")[0]',
+    'J':   USE_CHAR_CODE,
+    'K':   USE_CHAR_CODE,
+    'L':   USE_CHAR_CODE,
+    'M':   USE_CHAR_CODE,
+    'N':   '("NaN")[0]',
+    'O':   USE_CHAR_CODE,
+    'P':   USE_CHAR_CODE,
+    'Q':   USE_CHAR_CODE,
+    'R':   USE_CHAR_CODE,
+    'S':   '(String+[])[9]',
+    'T':   USE_CHAR_CODE,
+    'U':   USE_CHAR_CODE,
+    'V':   USE_CHAR_CODE,
+    'W':   USE_CHAR_CODE,
+    'X':   USE_CHAR_CODE,
+    'Y':   USE_CHAR_CODE,
+    'Z':   USE_CHAR_CODE,
+    
+    ' ':   '([]["filter"]+[])[8]',
+    '!':   USE_CHAR_CODE,
+    '"':   '("")["link"]()[8]',
+    '#':   USE_CHAR_CODE,
+    '$':   USE_CHAR_CODE,
+    '%':   'window["escape"]("<")[0]',
+    '&':   USE_CHAR_CODE,
+    '\'':  USE_CHAR_CODE,
+    '(':   '([]["filter"]+"")[15]',
+    ')':   '([]["filter"]+"")[16]',
+    '*':   USE_CHAR_CODE,
+    '+':   USE_CHAR_CODE,
+    ',':   USE_CHAR_CODE,
+    '-':   USE_CHAR_CODE,
+    '.':   USE_CHAR_CODE,
+    '/':   '("")["sub"]()[6]',
+    ':':   'window["Date"]()[21]',
+    ';':   USE_CHAR_CODE,
+    '<':   '("")["sub"]()[0]',
+    '=':   '("")["fontcolor"]()[11]',
+    '>':   '("")["sub"]()[10]',
+    '?':   USE_CHAR_CODE,
+    '@':   USE_CHAR_CODE,
+    '[':   USE_CHAR_CODE,
+    '\\':  'window["unescape"]("%"+(5)+"c")[0]',
+    ']':   USE_CHAR_CODE,
+    '^':   USE_CHAR_CODE,
+    '_':   USE_CHAR_CODE,
+    '`':   USE_CHAR_CODE,
+    '{':   '([]["filter"]+"")[18]',
+    '|':   USE_CHAR_CODE,
+    '}':   USE_CHAR_CODE,
+    '~':   USE_CHAR_CODE
   };
   
-  var CONST = {
+  var SIMPLE = {
     'false':      '![]',
     'true':       '!![]',
     'undefined':  '[][[]]',
@@ -102,11 +102,18 @@
     'Infinity':   '+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])'
   };
   
+  var CONSTRUCTORS = {
+    'Number':   '+[]',
+    'String':   '[]+[]',
+    'Array':    '[]',
+    'Boolean':  '![]',
+    'Function':  '[]["sort"]'
+  }
   
   function fillMissingChars(){
     for (var key in MAPPING){
       if (MAPPING[key] === USE_CHAR_CODE){
-        MAPPING[key] = 'window["String"]["fromCharCode"](' + key.charCodeAt(0) + ')';
+        MAPPING[key] = 'String["fromCharCode"](' + key.charCodeAt(0) + ')';
       }
     }
   }
@@ -114,12 +121,12 @@
   function fillMissingDigits(){
     var output, number, i;
     
-    for (number=0; number<10; number++){
+    for (number = 0; number < 10; number++){
       
       output = "+[]";
       
       if (number > 0){ output = "+!" + output; }
-      for (i=1; i < number; i++){ output = "+!+[]" + output; }
+      for (i = 1; i < number; i++){ output = "+!+[]" + output; }
       if (number > 1){ output = output.substr(1); }
       
       MAPPING[number] = "[" + output + "]";
@@ -134,8 +141,15 @@
       value = MAPPING[character];
       original = value;
       
-      for (key in CONST){
-        replacement = CONST[key];
+      for (key in CONSTRUCTORS){
+        replacement = CONSTRUCTORS[key];
+        
+        regEx = new RegExp("\\b" + key, "gi");
+        value = value.replace(regEx, "(" + replacement + ")['constructor']");
+      }
+      
+      for (key in SIMPLE){
+        replacement = SIMPLE[key];
         
         // replace quotes symbols
         regEx = new RegExp('"' + key + '"', "gi");
@@ -170,11 +184,12 @@
     var character = input[0], 
       length = 1, 
       replacement, 
+      next,
       key;
     
-    for (key in CONST){
+    for (key in SIMPLE){
       if (input.indexOf(key) === 0){
-        replacement = CONST[key];
+        replacement = SIMPLE[key];
         length = key.length;
         if (recursive && input.length === length) {
           replacement += "+[]";
@@ -184,9 +199,10 @@
     
     replacement = replacement || MAPPING[character];
     
-    input = input.substr(length);
+    next = input.substr(length);
+    input = input.substr(0, length);
     
-    return (recursive ? "" : " + \n" ) + replacement + swap(input, false);
+    return (recursive ? "" : " + \n" ) + "/* " + input + " */ " + replacement + swap(next, false);
   }
   
   window = this;