From 2024df3c0726a01d98d2e4842471a11b054420ac Mon Sep 17 00:00:00 2001
From: Marijn Haverbeke <marijnh@gmail.com>
Date: Tue, 2 Apr 2013 11:39:54 +0200
Subject: [PATCH] Remove a whole lot of tabs

---
 addon/hint/javascript-hint.js |    8 +-
 addon/lint/javascript-lint.js |  118 +--
 addon/lint/lint.js            |   12 +-
 mode/ecl/ecl.js               |   24 +-
 mode/gas/gas.js               |   82 +-
 mode/lua/lua.js               |   14 +-
 mode/mirc/mirc.js             |  114 +--
 mode/perl/perl.js             | 1582 ++++++++++++++++-----------------
 mode/pig/pig.js               |  326 +++----
 mode/smalltalk/smalltalk.js   |  258 +++---
 mode/smarty/smarty.js         |    6 +-
 mode/tiddlywiki/tiddlywiki.js |  690 +++++++-------
 mode/tiki/tiki.js             |  595 +++++++------
 mode/turtle/turtle.js         |   28 +-
 mode/vbscript/vbscript.js     |    8 +-
 mode/yaml/yaml.js             |  180 ++--
 mode/z80/z80.js               |  192 ++--
 17 files changed, 2104 insertions(+), 2133 deletions(-)

diff --git a/addon/hint/javascript-hint.js b/addon/hint/javascript-hint.js
index 99e4eadc..e3366147 100644
--- a/addon/hint/javascript-hint.js
+++ b/addon/hint/javascript-hint.js
@@ -4,7 +4,7 @@
   function forEach(arr, f) {
     for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
   }
-  
+
   function arrayContains(arr, item) {
     if (!Array.prototype.indexOf) {
       var i = arr.length;
@@ -44,9 +44,9 @@
           }
         } while (level > 0);
         tprop = getToken(editor, Pos(cur.line, tprop.start));
-	if (tprop.type.indexOf("variable") === 0)
-	  tprop.type = "function";
-	else return; // no clue
+        if (tprop.type.indexOf("variable") === 0)
+          tprop.type = "function";
+        else return; // no clue
       }
       if (!context) var context = [];
       context.push(tprop);
diff --git a/addon/lint/javascript-lint.js b/addon/lint/javascript-lint.js
index db9ff6b2..9a815c82 100644
--- a/addon/lint/javascript-lint.js
+++ b/addon/lint/javascript-lint.js
@@ -3,11 +3,11 @@
   var bogus = [ "Dangerous comment" ];
 
   var warnings = [ [ "Expected '{'",
-		     "Statement body should be inside '{ }' braces." ] ];
+                     "Statement body should be inside '{ }' braces." ] ];
 
   var errors = [ "Missing semicolon", "Extra comma", "Missing property name",
-	         "Unmatched ", " and instead saw", " is not defined",
-	         "Unclosed string", "Stopping, unable to continue" ];
+                 "Unmatched ", " and instead saw", " is not defined",
+                 "Unclosed string", "Stopping, unable to continue" ];
 
   function validator(options, text) {
     JSHINT(text, options);
@@ -42,10 +42,10 @@
       found = description.indexOf(find) !== -1;
 
       if (force || found) {
-	error.severity = severity;
+        error.severity = severity;
       }
       if (found && replace) {
-	error.description = replace;
+        error.description = replace;
       }
     }
   }
@@ -54,7 +54,7 @@
     var description = error.description;
     for ( var i = 0; i < bogus.length; i++) {
       if (description.indexOf(bogus[i]) !== -1) {
-	return true;
+        return true;
       }
     }
     return false;
@@ -64,59 +64,59 @@
     for ( var i = 0; i < errors.length; i++) {
       var error = errors[i];
       if (error) {
-	var linetabpositions, index;
-
-	linetabpositions = [];
-
-	// This next block is to fix a problem in jshint. Jshint
-	// replaces
-	// all tabs with spaces then performs some checks. The error
-	// positions (character/space) are then reported incorrectly,
-	// not taking the replacement step into account. Here we look
-	// at the evidence line and try to adjust the character position
-	// to the correct value.
-	if (error.evidence) {
-	  // Tab positions are computed once per line and cached
-	  var tabpositions = linetabpositions[error.line];
-	  if (!tabpositions) {
-	    var evidence = error.evidence;
-	    tabpositions = [];
-	    // ugggh phantomjs does not like this
-	    // forEachChar(evidence, function(item, index) {
-	    Array.prototype.forEach.call(evidence, function(item,
-							    index) {
-	      if (item === '\t') {
-		// First col is 1 (not 0) to match error
-		// positions
-		tabpositions.push(index + 1);
-	      }
-	    });
-	    linetabpositions[error.line] = tabpositions;
-	  }
-	  if (tabpositions.length > 0) {
-	    var pos = error.character;
-	    tabpositions.forEach(function(tabposition) {
-	      if (pos > tabposition) pos -= 1;
-	    });
-	    error.character = pos;
-	  }
-	}
-
-	var start = error.character - 1, end = start + 1;
-	if (error.evidence) {
-	  index = error.evidence.substring(start).search(/.\b/);
-	  if (index > -1) {
-	    end += index;
-	  }
-	}
-
-	// Convert to format expected by validation service
-	error.description = error.reason;// + "(jshint)";
-	error.start = error.character;
-	error.end = end;
-	error = cleanup(error);
-
-	if (error)
+        var linetabpositions, index;
+
+        linetabpositions = [];
+
+        // This next block is to fix a problem in jshint. Jshint
+        // replaces
+        // all tabs with spaces then performs some checks. The error
+        // positions (character/space) are then reported incorrectly,
+        // not taking the replacement step into account. Here we look
+        // at the evidence line and try to adjust the character position
+        // to the correct value.
+        if (error.evidence) {
+          // Tab positions are computed once per line and cached
+          var tabpositions = linetabpositions[error.line];
+          if (!tabpositions) {
+            var evidence = error.evidence;
+            tabpositions = [];
+            // ugggh phantomjs does not like this
+            // forEachChar(evidence, function(item, index) {
+            Array.prototype.forEach.call(evidence, function(item,
+                                                            index) {
+              if (item === '\t') {
+                // First col is 1 (not 0) to match error
+                // positions
+                tabpositions.push(index + 1);
+              }
+            });
+            linetabpositions[error.line] = tabpositions;
+          }
+          if (tabpositions.length > 0) {
+            var pos = error.character;
+            tabpositions.forEach(function(tabposition) {
+              if (pos > tabposition) pos -= 1;
+            });
+            error.character = pos;
+          }
+        }
+
+        var start = error.character - 1, end = start + 1;
+        if (error.evidence) {
+          index = error.evidence.substring(start).search(/.\b/);
+          if (index > -1) {
+            end += index;
+          }
+        }
+
+        // Convert to format expected by validation service
+        error.description = error.reason;// + "(jshint)";
+        error.start = error.character;
+        error.end = end;
+        error = cleanup(error);
+
+        if (error)
           output.push({message: error.description,
                        severity: error.severity,
                        from: CodeMirror.Pos(error.line - 1, start),
diff --git a/addon/lint/lint.js b/addon/lint/lint.js
index 1fa5aa98..d8961ac3 100644
--- a/addon/lint/lint.js
+++ b/addon/lint/lint.js
@@ -91,11 +91,11 @@ CodeMirror.validate = (function() {
   }
 
   function startLinting(cm) {
-	  var state = cm._lintState, options = state.options;
-	  if (options.async)
-		  options.getAnnotations(cm, updateLinting, options);
-	  else
-		 updateLinting(cm, options.getAnnotations(cm.getValue()));
+          var state = cm._lintState, options = state.options;
+          if (options.async)
+                  options.getAnnotations(cm, updateLinting, options);
+          else
+                 updateLinting(cm, options.getAnnotations(cm.getValue()));
   }
 
   function updateLinting(cm, annotationsNotSorted) {
@@ -117,7 +117,7 @@ CodeMirror.validate = (function() {
         if (!SEVERITIES.test(severity)) severity = "error";
         maxSeverity = getMaxSeverity(maxSeverity, severity);
 
-	if (options.formatAnnotation) ann = options.formatAnnotation(ann);
+        if (options.formatAnnotation) ann = options.formatAnnotation(ann);
         if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));
 
         if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {
diff --git a/mode/ecl/ecl.js b/mode/ecl/ecl.js
index 3ee7a681..7601b189 100644
--- a/mode/ecl/ecl.js
+++ b/mode/ecl/ecl.js
@@ -75,18 +75,18 @@ CodeMirror.defineMode("ecl", function(config) {
     } else if (builtin.propertyIsEnumerable(cur)) {
       if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
       return "builtin";
-    } else { //Data types are of from KEYWORD## 
-		var i = cur.length - 1;
-		while(i >= 0 && (!isNaN(cur[i]) || cur[i] == '_'))
-			--i;
-		
-		if (i > 0) {
-			var cur2 = cur.substr(0, i + 1);
-	    	if (variable_3.propertyIsEnumerable(cur2)) {
-	      		if (blockKeywords.propertyIsEnumerable(cur2)) curPunc = "newstatement";
-	      		return "variable-3";
-	      	}
-	    }
+    } else { //Data types are of from KEYWORD##
+                var i = cur.length - 1;
+                while(i >= 0 && (!isNaN(cur[i]) || cur[i] == '_'))
+                        --i;
+
+                if (i > 0) {
+                        var cur2 = cur.substr(0, i + 1);
+                if (variable_3.propertyIsEnumerable(cur2)) {
+                        if (blockKeywords.propertyIsEnumerable(cur2)) curPunc = "newstatement";
+                        return "variable-3";
+                }
+            }
     }
     if (atoms.propertyIsEnumerable(cur)) return "atom";
     return null;
diff --git a/mode/gas/gas.js b/mode/gas/gas.js
index a03382b6..5ef4bb04 100644
--- a/mode/gas/gas.js
+++ b/mode/gas/gas.js
@@ -205,8 +205,8 @@ CodeMirror.defineMode("gas", function(_config, parserConfig) {
 
     custom.push(function(ch, stream) {
       if (ch === '#') {
-	stream.eatWhile(/\w/);
-	return "number";
+        stream.eatWhile(/\w/);
+        return "number";
       }
     });
   }
@@ -222,7 +222,7 @@ CodeMirror.defineMode("gas", function(_config, parserConfig) {
     var escaped = false, next;
     while ((next = stream.next()) != null) {
       if (next === end && !escaped) {
-	return false;
+        return false;
       }
       escaped = !escaped && next === "\\";
     }
@@ -233,8 +233,8 @@ CodeMirror.defineMode("gas", function(_config, parserConfig) {
     var maybeEnd = false, ch;
     while ((ch = stream.next()) != null) {
       if (ch === "/" && maybeEnd) {
-	state.tokenize = null;
-	break;
+        state.tokenize = null;
+        break;
       }
       maybeEnd = (ch === "*");
     }
@@ -244,82 +244,82 @@ CodeMirror.defineMode("gas", function(_config, parserConfig) {
   return { 
     startState: function() {
       return {
-	tokenize: null
+        tokenize: null
       };
     },
 
     token: function(stream, state) {
       if (state.tokenize) {
-	return state.tokenize(stream, state);
+        return state.tokenize(stream, state);
       }
 
       if (stream.eatSpace()) {
-	return null;
+        return null;
       }
 
       var style, cur, ch = stream.next();
 
       if (ch === "/") {
-	if (stream.eat("*")) {
-	  state.tokenize = clikeComment;
-	  return clikeComment(stream, state);
-	}
+        if (stream.eat("*")) {
+          state.tokenize = clikeComment;
+          return clikeComment(stream, state);
+        }
       }
 
       if (ch === lineCommentStartSymbol) {
-	stream.skipToEnd();
-	return "comment";
+        stream.skipToEnd();
+        return "comment";
       }
 
       if (ch === '"') {
-	nextUntilUnescaped(stream, '"');
-	return "string";
+        nextUntilUnescaped(stream, '"');
+        return "string";
       }
 
       if (ch === '.') {
-	stream.eatWhile(/\w/);
-	cur = stream.current().toLowerCase();
-	style = directives[cur];
-	return style || null;
+        stream.eatWhile(/\w/);
+        cur = stream.current().toLowerCase();
+        style = directives[cur];
+        return style || null;
       }
 
       if (ch === '=') {
-	stream.eatWhile(/\w/);
-	return "tag";
+        stream.eatWhile(/\w/);
+        return "tag";
       }
 
       if (ch === '{') {
-	return "braket";
+        return "braket";
       }
 
       if (ch === '}') {
-	return "braket";
+        return "braket";
       }
 
       if (/\d/.test(ch)) {
-	if (ch === "0" && stream.eat("x")) {
-	  stream.eatWhile(/[0-9a-fA-F]/);
-	  return "number";
-	}
-	stream.eatWhile(/\d/);
-	return "number";
+        if (ch === "0" && stream.eat("x")) {
+          stream.eatWhile(/[0-9a-fA-F]/);
+          return "number";
+        }
+        stream.eatWhile(/\d/);
+        return "number";
       }
 
       if (/\w/.test(ch)) {
-	stream.eatWhile(/\w/);
-	if (stream.eat(":")) {
-	  return 'tag';
-	}
-	cur = stream.current().toLowerCase();
-	style = registers[cur];
-	return style || null;
+        stream.eatWhile(/\w/);
+        if (stream.eat(":")) {
+          return 'tag';
+        }
+        cur = stream.current().toLowerCase();
+        style = registers[cur];
+        return style || null;
       }
 
       for (var i = 0; i < custom.length; i++) {
-	style = custom[i](ch, stream, state);
-	if (style) {
-	  return style;
-	}
+        style = custom[i](ch, stream, state);
+        if (style) {
+          return style;
+        }
       }
     }
   };
diff --git a/mode/lua/lua.js b/mode/lua/lua.js
index 97fb2c6f..90761e29 100644
--- a/mode/lua/lua.js
+++ b/mode/lua/lua.js
@@ -1,7 +1,7 @@
 // LUA mode. Ported to CodeMirror 2 from Franciszek Wawrzak's
 // CodeMirror 1 mode.
 // highlights keywords, strings, comments (no leveling supported! ("[==[")), tokens, basic indenting
- 
+
 CodeMirror.defineMode("lua", function(config, parserConfig) {
   var indentUnit = config.indentUnit;
 
@@ -12,7 +12,7 @@ CodeMirror.defineMode("lua", function(config, parserConfig) {
     return new RegExp("^(?:" + words.join("|") + ")$", "i");
   }
   var specials = wordRE(parserConfig.specials || []);
- 
+
   // long list of standard functions from lua manual
   var builtins = wordRE([
     "_G","_VERSION","assert","collectgarbage","dofile","error","getfenv","getmetatable","ipairs","load",
@@ -47,8 +47,8 @@ CodeMirror.defineMode("lua", function(config, parserConfig) {
     "table.concat","table.insert","table.maxn","table.remove","table.sort"
   ]);
   var keywords = wordRE(["and","break","elseif","false","nil","not","or","return",
-			 "true","function", "end", "if", "then", "else", "do", 
-			 "while", "repeat", "until", "for", "in", "local" ]);
+                         "true","function", "end", "if", "then", "else", "do",
+                         "while", "repeat", "until", "for", "in", "local" ]);
 
   var indentTokens = wordRE(["function", "if","repeat","do", "\\(", "{"]);
   var dedentTokens = wordRE(["end", "until", "\\)", "}"]);
@@ -68,7 +68,7 @@ CodeMirror.defineMode("lua", function(config, parserConfig) {
         return (state.cur = bracketed(readBracket(stream), "comment"))(stream, state);
       stream.skipToEnd();
       return "comment";
-    } 
+    }
     if (ch == "\"" || ch == "'")
       return (state.cur = string(ch))(stream, state);
     if (ch == "[" && /[\[=]/.test(stream.peek()))
@@ -108,7 +108,7 @@ CodeMirror.defineMode("lua", function(config, parserConfig) {
       return "string";
     };
   }
-    
+
   return {
     startState: function(basecol) {
       return {basecol: basecol || 0, indentDepth: 0, cur: normal};
@@ -121,7 +121,7 @@ CodeMirror.defineMode("lua", function(config, parserConfig) {
       if (style == "variable") {
         if (keywords.test(word)) style = "keyword";
         else if (builtins.test(word)) style = "builtin";
-	else if (specials.test(word)) style = "variable-2";
+        else if (specials.test(word)) style = "variable-2";
       }
       if ((style != "comment") && (style != "string")){
         if (indentTokens.test(word)) ++state.indentDepth;
diff --git a/mode/mirc/mirc.js b/mode/mirc/mirc.js
index f76f7827..fc88bc56 100644
--- a/mode/mirc/mirc.js
+++ b/mode/mirc/mirc.js
@@ -8,65 +8,65 @@ CodeMirror.defineMode("mirc", function() {
   }
   var specials = parseWords("$! $$ $& $? $+ $abook $abs $active $activecid " +
                             "$activewid $address $addtok $agent $agentname $agentstat $agentver " +
-	                    "$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime " +
-	                    "$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind " +
-	                    "$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes " +
-	                    "$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color " +
-	                    "$com $comcall $comchan $comerr $compact $compress $comval $cos $count " +
-	                    "$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight " +
-	                    "$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress " +
-	                    "$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll " +
-	                    "$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error " +
-	                    "$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir " +
-	                    "$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve " +
-	                    "$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt " +
-	                    "$group $halted $hash $height $hfind $hget $highlight $hnick $hotline " +
-	                    "$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil " +
-	                    "$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect " +
-	                    "$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile " +
-	                    "$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive " +
-	                    "$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock " +
-	                    "$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer " +
-	                    "$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext " +
-	                    "$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode " +
-	                    "$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile " +
-	                    "$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly " +
-	                    "$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree " +
-	                    "$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo " +
-	                    "$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex " +
-	                    "$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline " +
-	                    "$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin " +
-	                    "$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname " +
-	                    "$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped " +
-	                    "$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp " +
-	                    "$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel " +
-	                    "$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver " +
-	                    "$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor");
+                            "$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime " +
+                            "$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind " +
+                            "$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes " +
+                            "$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color " +
+                            "$com $comcall $comchan $comerr $compact $compress $comval $cos $count " +
+                            "$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight " +
+                            "$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress " +
+                            "$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll " +
+                            "$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error " +
+                            "$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir " +
+                            "$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve " +
+                            "$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt " +
+                            "$group $halted $hash $height $hfind $hget $highlight $hnick $hotline " +
+                            "$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil " +
+                            "$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect " +
+                            "$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile " +
+                            "$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive " +
+                            "$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock " +
+                            "$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer " +
+                            "$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext " +
+                            "$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode " +
+                            "$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile " +
+                            "$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly " +
+                            "$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree " +
+                            "$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo " +
+                            "$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex " +
+                            "$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline " +
+                            "$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin " +
+                            "$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname " +
+                            "$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped " +
+                            "$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp " +
+                            "$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel " +
+                            "$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver " +
+                            "$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor");
   var keywords = parseWords("abook ajinvite alias aline ame amsg anick aop auser autojoin avoice " +
                             "away background ban bcopy beep bread break breplace bset btrunc bunset bwrite " +
-	                    "channel clear clearall cline clipboard close cnick color comclose comopen " +
-	                    "comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver " +
-	                    "debug dec describe dialog did didtok disable disconnect dlevel dline dll " +
-	                    "dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace " +
-	                    "drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable " +
-	                    "events exit fclose filter findtext finger firewall flash flist flood flush " +
-	                    "flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove " +
-	                    "gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd " +
-	                    "halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear " +
-	                    "ialmark identd if ignore iline inc invite iuser join kick linesep links list " +
-	                    "load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice " +
-	                    "notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice " +
-	                    "qme qmsg query queryn quit raw reload remini remote remove rename renwin " +
-	                    "reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini " +
-	                    "say scid scon server set showmirc signam sline sockaccept sockclose socklist " +
-	                    "socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite " +
-	                    "sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize " +
-	                    "toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho " +
-	                    "var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum " +
-	                    "isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower " +
-	                    "isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs " +
-	                    "elseif else goto menu nicklist status title icon size option text edit " +
-	                    "button check radio box scroll list combo link tab item");
+                            "channel clear clearall cline clipboard close cnick color comclose comopen " +
+                            "comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver " +
+                            "debug dec describe dialog did didtok disable disconnect dlevel dline dll " +
+                            "dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace " +
+                            "drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable " +
+                            "events exit fclose filter findtext finger firewall flash flist flood flush " +
+                            "flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove " +
+                            "gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd " +
+                            "halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear " +
+                            "ialmark identd if ignore iline inc invite iuser join kick linesep links list " +
+                            "load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice " +
+                            "notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice " +
+                            "qme qmsg query queryn quit raw reload remini remote remove rename renwin " +
+                            "reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini " +
+                            "say scid scon server set showmirc signam sline sockaccept sockclose socklist " +
+                            "socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite " +
+                            "sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize " +
+                            "toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho " +
+                            "var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum " +
+                            "isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower " +
+                            "isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs " +
+                            "elseif else goto menu nicklist status title icon size option text edit " +
+                            "button check radio box scroll list combo link tab item");
   var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch");
   var isOperatorChar = /[+\-*&%=<>!?^\/\|]/;
   function chain(stream, state, f) {
diff --git a/mode/perl/perl.js b/mode/perl/perl.js
index 52361c61..5954b1a6 100644
--- a/mode/perl/perl.js
+++ b/mode/perl/perl.js
@@ -1,816 +1,816 @@
 // CodeMirror2 mode/perl/perl.js (text/x-perl) beta 0.10 (2011-11-08)
 // This is a part of CodeMirror from https://github.com/sabaca/CodeMirror_mode_perl (mail@sabaca.com)
 CodeMirror.defineMode("perl",function(){
-	// http://perldoc.perl.org
-	var PERL={				    	//   null - magic touch
-							//   1 - keyword
-							//   2 - def
-							//   3 - atom
-							//   4 - operator
-							//   5 - variable-2 (predefined)
-							//   [x,y] - x=1,2,3; y=must be defined if x{...}
-						//	PERL operators
-		'->'				:   4,
-		'++'				:   4,
-		'--'				:   4,
-		'**'				:   4,
-							//   ! ~ \ and unary + and -
-		'=~'				:   4,
-		'!~'				:   4,
-		'*'				:   4,
-		'/'				:   4,
-		'%'				:   4,
-		'x'				:   4,
-		'+'				:   4,
-		'-'				:   4,
-		'.'				:   4,
-		'<<'				:   4,
-		'>>'				:   4,
-							//   named unary operators
-		'<'				:   4,
-		'>'				:   4,
-		'<='				:   4,
-		'>='				:   4,
-		'lt'				:   4,
-		'gt'				:   4,
-		'le'				:   4,
-		'ge'				:   4,
-		'=='				:   4,
-		'!='				:   4,
-		'<=>'				:   4,
-		'eq'				:   4,
-		'ne'				:   4,
-		'cmp'				:   4,
-		'~~'				:   4,
-		'&'				:   4,
-		'|'				:   4,
-		'^'				:   4,
-		'&&'				:   4,
-		'||'				:   4,
-		'//'				:   4,
-		'..'				:   4,
-		'...'				:   4,
-		'?'				:   4,
-		':'				:   4,
-		'='				:   4,
-		'+='				:   4,
-		'-='				:   4,
-		'*='				:   4,	//   etc. ???
-		','				:   4,
-		'=>'				:   4,
-		'::'				:   4,
-				   			//   list operators (rightward)
-		'not'				:   4,
-		'and'				:   4,
-		'or'				:   4,
-		'xor'				:   4,
-						//	PERL predefined variables (I know, what this is a paranoid idea, but may be needed for people, who learn PERL, and for me as well, ...and may be for you?;)
-		'BEGIN'				:   [5,1],
-		'END'				:   [5,1],
-		'PRINT'				:   [5,1],
-		'PRINTF'			:   [5,1],
-		'GETC'				:   [5,1],
-		'READ'				:   [5,1],
-		'READLINE'			:   [5,1],
-		'DESTROY'			:   [5,1],
-		'TIE'				:   [5,1],
-		'TIEHANDLE'			:   [5,1],
-		'UNTIE'				:   [5,1],
-		'STDIN'				:    5,
-		'STDIN_TOP'			:    5,
-		'STDOUT'			:    5,
-		'STDOUT_TOP'			:    5,
-		'STDERR'			:    5,
-		'STDERR_TOP'			:    5,
-		'$ARG'				:    5,
-		'$_'				:    5,
-		'@ARG'				:    5,
-		'@_'				:    5,
-		'$LIST_SEPARATOR'		:    5,
-		'$"'				:    5,
-		'$PROCESS_ID'			:    5,
-		'$PID'				:    5,
-		'$$'				:    5,
-		'$REAL_GROUP_ID'		:    5,
-		'$GID'				:    5,
-		'$('				:    5,
-		'$EFFECTIVE_GROUP_ID'		:    5,
-		'$EGID'				:    5,
-		'$)'				:    5,
-		'$PROGRAM_NAME'			:    5,
-		'$0'				:    5,
-		'$SUBSCRIPT_SEPARATOR'		:    5,
-		'$SUBSEP'			:    5,
-		'$;'				:    5,
-		'$REAL_USER_ID'			:    5,
-		'$UID'				:    5,
-		'$<'				:    5,
-		'$EFFECTIVE_USER_ID'		:    5,
-		'$EUID'				:    5,
-		'$>'				:    5,
-		'$a'				:    5,
-		'$b'				:    5,
-		'$COMPILING'			:    5,
-		'$^C'				:    5,
-		'$DEBUGGING'			:    5,
-		'$^D'				:    5,
-		'${^ENCODING}'			:    5,
-		'$ENV'				:    5,
-		'%ENV'				:    5,
-		'$SYSTEM_FD_MAX'		:    5,
-		'$^F'				:    5,
-		'@F'				:    5,
-		'${^GLOBAL_PHASE}'		:    5,
-		'$^H'				:    5,
-		'%^H'				:    5,
-		'@INC'				:    5,
-		'%INC'				:    5,
-		'$INPLACE_EDIT'			:    5,
-		'$^I'				:    5,
-		'$^M'				:    5,
-		'$OSNAME'			:    5,
-		'$^O'				:    5,
-		'${^OPEN}'			:    5,
-		'$PERLDB'			:    5,
-		'$^P'				:    5,
-		'$SIG'				:    5,
-		'%SIG'				:    5,
-		'$BASETIME'			:    5,
-		'$^T'				:    5,
-		'${^TAINT}'			:    5,
-		'${^UNICODE}'			:    5,
-		'${^UTF8CACHE}'			:    5,
-		'${^UTF8LOCALE}'		:    5,
-		'$PERL_VERSION'			:    5,
-		'$^V'				:    5,
-		'${^WIN32_SLOPPY_STAT}'		:    5,
-		'$EXECUTABLE_NAME'		:    5,
-		'$^X'				:    5,
-		'$1'				:    5,	// - regexp $1, $2...
-		'$MATCH'			:    5,
-		'$&'				:    5,
-		'${^MATCH}'			:    5,
-		'$PREMATCH'			:    5,
-		'$`'				:    5,
-		'${^PREMATCH}'			:    5,
-		'$POSTMATCH'			:    5,
-		"$'"				:    5,
-		'${^POSTMATCH}'			:    5,
-		'$LAST_PAREN_MATCH'		:    5,
-		'$+'				:    5,
-		'$LAST_SUBMATCH_RESULT'		:    5,
-		'$^N'				:    5,
-		'@LAST_MATCH_END'		:    5,
-		'@+'				:    5,
-		'%LAST_PAREN_MATCH'		:    5,
-		'%+'				:    5,
-		'@LAST_MATCH_START'		:    5,
-		'@-'				:    5,
-		'%LAST_MATCH_START'		:    5,
-		'%-'				:    5,
-		'$LAST_REGEXP_CODE_RESULT'	:    5,
-		'$^R'				:    5,
-		'${^RE_DEBUG_FLAGS}'		:    5,
-		'${^RE_TRIE_MAXBUF}'		:    5,
-		'$ARGV'				:    5,
-		'@ARGV'				:    5,
-		'ARGV'				:    5,
-		'ARGVOUT'			:    5,
-		'$OUTPUT_FIELD_SEPARATOR'	:    5,
-		'$OFS'				:    5,
-		'$,'				:    5,
-		'$INPUT_LINE_NUMBER'		:    5,
-		'$NR'				:    5,
-		'$.'				:    5,
-		'$INPUT_RECORD_SEPARATOR'	:    5,
-		'$RS'				:    5,
-		'$/'				:    5,
-		'$OUTPUT_RECORD_SEPARATOR'	:    5,
-		'$ORS'				:    5,
-		'$\\'				:    5,
-		'$OUTPUT_AUTOFLUSH'		:    5,
-		'$|'				:    5,
-		'$ACCUMULATOR'			:    5,
-		'$^A'				:    5,
-		'$FORMAT_FORMFEED'		:    5,
-		'$^L'				:    5,
-		'$FORMAT_PAGE_NUMBER'		:    5,
-		'$%'				:    5,
-		'$FORMAT_LINES_LEFT'		:    5,
-		'$-'				:    5,
-		'$FORMAT_LINE_BREAK_CHARACTERS'	:    5,
-		'$:'				:    5,
-		'$FORMAT_LINES_PER_PAGE'	:    5,
-		'$='				:    5,
-		'$FORMAT_TOP_NAME'		:    5,
-		'$^'				:    5,
-		'$FORMAT_NAME'			:    5,
-		'$~'				:    5,
-		'${^CHILD_ERROR_NATIVE}'	:    5,
-		'$EXTENDED_OS_ERROR'		:    5,
-		'$^E'				:    5,
-		'$EXCEPTIONS_BEING_CAUGHT'	:    5,
-		'$^S'				:    5,
-		'$WARNING'			:    5,
-		'$^W'				:    5,
-		'${^WARNING_BITS}'		:    5,
-		'$OS_ERROR'			:    5,
-		'$ERRNO'			:    5,
-		'$!'				:    5,
-		'%OS_ERROR'			:    5,
-		'%ERRNO'			:    5,
-		'%!'				:    5,
-		'$CHILD_ERROR'			:    5,
-		'$?'				:    5,
-		'$EVAL_ERROR'			:    5,
-		'$@'				:    5,
-		'$OFMT'				:    5,
-		'$#'				:    5,
-		'$*'				:    5,
-		'$ARRAY_BASE'			:    5,
-		'$['				:    5,
-		'$OLD_PERL_VERSION'		:    5,
-		'$]'				:    5,
-						//	PERL blocks
-		'if'				:[1,1],
-		elsif				:[1,1],
-		'else'				:[1,1],
-		'while'				:[1,1],
-		unless				:[1,1],
-		'for'				:[1,1],
-		foreach				:[1,1],
-						//	PERL functions
-		'abs'				:1,	// - absolute value function
-		accept				:1,	// - accept an incoming socket connect
-		alarm				:1,	// - schedule a SIGALRM
-		'atan2'				:1,	// - arctangent of Y/X in the range -PI to PI
-		bind				:1,	// - binds an address to a socket
-		binmode				:1,	// - prepare binary files for I/O
-		bless				:1,	// - create an object
-		bootstrap			:1,	//
-		'break'				:1,	// - break out of a "given" block
-		caller				:1,	// - get context of the current subroutine call
-		chdir				:1,	// - change your current working directory
-		chmod				:1,	// - changes the permissions on a list of files
-		chomp				:1,	// - remove a trailing record separator from a string
-		chop				:1,	// - remove the last character from a string
-		chown				:1,	// - change the owership on a list of files
-		chr				:1,	// - get character this number represents
-		chroot				:1,	// - make directory new root for path lookups
-		close				:1,	// - close file (or pipe or socket) handle
-		closedir			:1,	// - close directory handle
-		connect				:1,	// - connect to a remote socket
-		'continue'			:[1,1],	// - optional trailing block in a while or foreach
-		'cos'				:1,	// - cosine function
-		crypt				:1,	// - one-way passwd-style encryption
-		dbmclose			:1,	// - breaks binding on a tied dbm file
-		dbmopen				:1,	// - create binding on a tied dbm file
-		'default'			:1,	//
-		defined				:1,	// - test whether a value, variable, or function is defined
-		'delete'			:1,	// - deletes a value from a hash
-		die				:1,	// - raise an exception or bail out
-		'do'				:1,	// - turn a BLOCK into a TERM
-		dump				:1,	// - create an immediate core dump
-		each				:1,	// - retrieve the next key/value pair from a hash
-		endgrent			:1,	// - be done using group file
-		endhostent			:1,	// - be done using hosts file
-		endnetent			:1,	// - be done using networks file
-		endprotoent			:1,	// - be done using protocols file
-		endpwent			:1,	// - be done using passwd file
-		endservent			:1,	// - be done using services file
-		eof				:1,	// - test a filehandle for its end
-		'eval'				:1,	// - catch exceptions or compile and run code
-		'exec'				:1,	// - abandon this program to run another
-		exists				:1,	// - test whether a hash key is present
-		exit				:1,	// - terminate this program
-		'exp'				:1,	// - raise I to a power
-		fcntl				:1,	// - file control system call
-		fileno				:1,	// - return file descriptor from filehandle
-		flock				:1,	// - lock an entire file with an advisory lock
-		fork				:1,	// - create a new process just like this one
-		format				:1,	// - declare a picture format with use by the write() function
-		formline			:1,	// - internal function used for formats
-		getc				:1,	// - get the next character from the filehandle
-		getgrent			:1,	// - get next group record
-		getgrgid			:1,	// - get group record given group user ID
-		getgrnam			:1,	// - get group record given group name
-		gethostbyaddr			:1,	// - get host record given its address
-		gethostbyname			:1,	// - get host record given name
-		gethostent			:1,	// - get next hosts record
-		getlogin			:1,	// - return who logged in at this tty
-		getnetbyaddr			:1,	// - get network record given its address
-		getnetbyname			:1,	// - get networks record given name
-		getnetent			:1,	// - get next networks record
-		getpeername			:1,	// - find the other end of a socket connection
-		getpgrp				:1,	// - get process group
-		getppid				:1,	// - get parent process ID
-		getpriority			:1,	// - get current nice value
-		getprotobyname			:1,	// - get protocol record given name
-		getprotobynumber		:1,	// - get protocol record numeric protocol
-		getprotoent			:1,	// - get next protocols record
-		getpwent			:1,	// - get next passwd record
-		getpwnam			:1,	// - get passwd record given user login name
-		getpwuid			:1,	// - get passwd record given user ID
-		getservbyname			:1,	// - get services record given its name
-		getservbyport			:1,	// - get services record given numeric port
-		getservent			:1,	// - get next services record
-		getsockname			:1,	// - retrieve the sockaddr for a given socket
-		getsockopt			:1,	// - get socket options on a given socket
-		given				:1,	//
-		glob				:1,	// - expand filenames using wildcards
-		gmtime				:1,	// - convert UNIX time into record or string using Greenwich time
-		'goto'				:1,	// - create spaghetti code
-		grep				:1,	// - locate elements in a list test true against a given criterion
-		hex				:1,	// - convert a string to a hexadecimal number
-		'import'			:1,	// - patch a module's namespace into your own
-		index				:1,	// - find a substring within a string
-		'int'				:1,	// - get the integer portion of a number
-		ioctl				:1,	// - system-dependent device control system call
-		'join'				:1,	// - join a list into a string using a separator
-		keys				:1,	// - retrieve list of indices from a hash
-		kill				:1,	// - send a signal to a process or process group
-		last				:1,	// - exit a block prematurely
-		lc				:1,	// - return lower-case version of a string
-		lcfirst				:1,	// - return a string with just the next letter in lower case
-		length				:1,	// - return the number of bytes in a string
-		'link'				:1,	// - create a hard link in the filesytem
-		listen				:1,	// - register your socket as a server
-		local				: 2,	// - create a temporary value for a global variable (dynamic scoping)
-		localtime			:1,	// - convert UNIX time into record or string using local time
-		lock				:1,	// - get a thread lock on a variable, subroutine, or method
-		'log'				:1,	// - retrieve the natural logarithm for a number
-		lstat				:1,	// - stat a symbolic link
-		m				:null,	// - match a string with a regular expression pattern
-		map				:1,	// - apply a change to a list to get back a new list with the changes
-		mkdir				:1,	// - create a directory
-		msgctl				:1,	// - SysV IPC message control operations
-		msgget				:1,	// - get SysV IPC message queue
-		msgrcv				:1,	// - receive a SysV IPC message from a message queue
-		msgsnd				:1,	// - send a SysV IPC message to a message queue
-		my				: 2,	// - declare and assign a local variable (lexical scoping)
-		'new'				:1,	//
-		next				:1,	// - iterate a block prematurely
-		no				:1,	// - unimport some module symbols or semantics at compile time
-		oct				:1,	// - convert a string to an octal number
-		open				:1,	// - open a file, pipe, or descriptor
-		opendir				:1,	// - open a directory
-		ord				:1,	// - find a character's numeric representation
-		our				: 2,	// - declare and assign a package variable (lexical scoping)
-		pack				:1,	// - convert a list into a binary representation
-		'package'			:1,	// - declare a separate global namespace
-		pipe				:1,	// - open a pair of connected filehandles
-		pop				:1,	// - remove the last element from an array and return it
-		pos				:1,	// - find or set the offset for the last/next m//g search
-		print				:1,	// - output a list to a filehandle
-		printf				:1,	// - output a formatted list to a filehandle
-		prototype			:1,	// - get the prototype (if any) of a subroutine
-		push				:1,	// - append one or more elements to an array
-		q				:null,	// - singly quote a string
-		qq				:null,	// - doubly quote a string
-		qr				:null,	// - Compile pattern
-		quotemeta			:null,	// - quote regular expression magic characters
-		qw				:null,	// - quote a list of words
-		qx				:null,	// - backquote quote a string
-		rand				:1,	// - retrieve the next pseudorandom number
-		read				:1,	// - fixed-length buffered input from a filehandle
-		readdir				:1,	// - get a directory from a directory handle
-		readline			:1,	// - fetch a record from a file
-		readlink			:1,	// - determine where a symbolic link is pointing
-		readpipe			:1,	// - execute a system command and collect standard output
-		recv				:1,	// - receive a message over a Socket
-		redo				:1,	// - start this loop iteration over again
-		ref				:1,	// - find out the type of thing being referenced
-		rename				:1,	// - change a filename
-		require				:1,	// - load in external functions from a library at runtime
-		reset				:1,	// - clear all variables of a given name
-		'return'			:1,	// - get out of a function early
-		reverse				:1,	// - flip a string or a list
-		rewinddir			:1,	// - reset directory handle
-		rindex				:1,	// - right-to-left substring search
-		rmdir				:1,	// - remove a directory
-		s				:null,	// - replace a pattern with a string
-		say				:1,	// - print with newline
-		scalar				:1,	// - force a scalar context
-		seek				:1,	// - reposition file pointer for random-access I/O
-		seekdir				:1,	// - reposition directory pointer
-		select				:1,	// - reset default output or do I/O multiplexing
-		semctl				:1,	// - SysV semaphore control operations
-		semget				:1,	// - get set of SysV semaphores
-		semop				:1,	// - SysV semaphore operations
-		send				:1,	// - send a message over a socket
-		setgrent			:1,	// - prepare group file for use
-		sethostent			:1,	// - prepare hosts file for use
-		setnetent			:1,	// - prepare networks file for use
-		setpgrp				:1,	// - set the process group of a process
-		setpriority			:1,	// - set a process's nice value
-		setprotoent			:1,	// - prepare protocols file for use
-		setpwent			:1,	// - prepare passwd file for use
-		setservent			:1,	// - prepare services file for use
-		setsockopt			:1,	// - set some socket options
-		shift				:1,	// - remove the first element of an array, and return it
-		shmctl				:1,	// - SysV shared memory operations
-		shmget				:1,	// - get SysV shared memory segment identifier
-		shmread				:1,	// - read SysV shared memory
-		shmwrite			:1,	// - write SysV shared memory
-		shutdown			:1,	// - close down just half of a socket connection
-		'sin'				:1,	// - return the sine of a number
-		sleep				:1,	// - block for some number of seconds
-		socket				:1,	// - create a socket
-		socketpair			:1,	// - create a pair of sockets
-		'sort'				:1,	// - sort a list of values
-		splice				:1,	// - add or remove elements anywhere in an array
-		'split'				:1,	// - split up a string using a regexp delimiter
-		sprintf				:1,	// - formatted print into a string
-		'sqrt'				:1,	// - square root function
-		srand				:1,	// - seed the random number generator
-		stat				:1,	// - get a file's status information
-		state				:1,	// - declare and assign a state variable (persistent lexical scoping)
-		study				:1,	// - optimize input data for repeated searches
-		'sub'				:1,	// - declare a subroutine, possibly anonymously
-		'substr'			:1,	// - get or alter a portion of a stirng
-		symlink				:1,	// - create a symbolic link to a file
-		syscall				:1,	// - execute an arbitrary system call
-		sysopen				:1,	// - open a file, pipe, or descriptor
-		sysread				:1,	// - fixed-length unbuffered input from a filehandle
-		sysseek				:1,	// - position I/O pointer on handle used with sysread and syswrite
-		system				:1,	// - run a separate program
-		syswrite			:1,	// - fixed-length unbuffered output to a filehandle
-		tell				:1,	// - get current seekpointer on a filehandle
-		telldir				:1,	// - get current seekpointer on a directory handle
-		tie				:1,	// - bind a variable to an object class
-		tied				:1,	// - get a reference to the object underlying a tied variable
-		time				:1,	// - return number of seconds since 1970
-		times				:1,	// - return elapsed time for self and child processes
-		tr				:null,	// - transliterate a string
-		truncate			:1,	// - shorten a file
-		uc				:1,	// - return upper-case version of a string
-		ucfirst				:1,	// - return a string with just the next letter in upper case
-		umask				:1,	// - set file creation mode mask
-		undef				:1,	// - remove a variable or function definition
-		unlink				:1,	// - remove one link to a file
-		unpack				:1,	// - convert binary structure into normal perl variables
-		unshift				:1,	// - prepend more elements to the beginning of a list
-		untie				:1,	// - break a tie binding to a variable
-		use				:1,	// - load in a module at compile time
-		utime				:1,	// - set a file's last access and modify times
-		values				:1,	// - return a list of the values in a hash
-		vec				:1,	// - test or set particular bits in a string
-		wait				:1,	// - wait for any child process to die
-		waitpid				:1,	// - wait for a particular child process to die
-		wantarray			:1,	// - get void vs scalar vs list context of current subroutine call
-		warn				:1,	// - print debugging info
-		when				:1,	//
-		write				:1,	// - print a picture record
-		y				:null};	// - transliterate a string
+        // http://perldoc.perl.org
+        var PERL={                                      //   null - magic touch
+                                                        //   1 - keyword
+                                                        //   2 - def
+                                                        //   3 - atom
+                                                        //   4 - operator
+                                                        //   5 - variable-2 (predefined)
+                                                        //   [x,y] - x=1,2,3; y=must be defined if x{...}
+                                                //      PERL operators
+                '->'                            :   4,
+                '++'                            :   4,
+                '--'                            :   4,
+                '**'                            :   4,
+                                                        //   ! ~ \ and unary + and -
+                '=~'                            :   4,
+                '!~'                            :   4,
+                '*'                             :   4,
+                '/'                             :   4,
+                '%'                             :   4,
+                'x'                             :   4,
+                '+'                             :   4,
+                '-'                             :   4,
+                '.'                             :   4,
+                '<<'                            :   4,
+                '>>'                            :   4,
+                                                        //   named unary operators
+                '<'                             :   4,
+                '>'                             :   4,
+                '<='                            :   4,
+                '>='                            :   4,
+                'lt'                            :   4,
+                'gt'                            :   4,
+                'le'                            :   4,
+                'ge'                            :   4,
+                '=='                            :   4,
+                '!='                            :   4,
+                '<=>'                           :   4,
+                'eq'                            :   4,
+                'ne'                            :   4,
+                'cmp'                           :   4,
+                '~~'                            :   4,
+                '&'                             :   4,
+                '|'                             :   4,
+                '^'                             :   4,
+                '&&'                            :   4,
+                '||'                            :   4,
+                '//'                            :   4,
+                '..'                            :   4,
+                '...'                           :   4,
+                '?'                             :   4,
+                ':'                             :   4,
+                '='                             :   4,
+                '+='                            :   4,
+                '-='                            :   4,
+                '*='                            :   4,  //   etc. ???
+                ','                             :   4,
+                '=>'                            :   4,
+                '::'                            :   4,
+                                                        //   list operators (rightward)
+                'not'                           :   4,
+                'and'                           :   4,
+                'or'                            :   4,
+                'xor'                           :   4,
+                                                //      PERL predefined variables (I know, what this is a paranoid idea, but may be needed for people, who learn PERL, and for me as well, ...and may be for you?;)
+                'BEGIN'                         :   [5,1],
+                'END'                           :   [5,1],
+                'PRINT'                         :   [5,1],
+                'PRINTF'                        :   [5,1],
+                'GETC'                          :   [5,1],
+                'READ'                          :   [5,1],
+                'READLINE'                      :   [5,1],
+                'DESTROY'                       :   [5,1],
+                'TIE'                           :   [5,1],
+                'TIEHANDLE'                     :   [5,1],
+                'UNTIE'                         :   [5,1],
+                'STDIN'                         :    5,
+                'STDIN_TOP'                     :    5,
+                'STDOUT'                        :    5,
+                'STDOUT_TOP'                    :    5,
+                'STDERR'                        :    5,
+                'STDERR_TOP'                    :    5,
+                '$ARG'                          :    5,
+                '$_'                            :    5,
+                '@ARG'                          :    5,
+                '@_'                            :    5,
+                '$LIST_SEPARATOR'               :    5,
+                '$"'                            :    5,
+                '$PROCESS_ID'                   :    5,
+                '$PID'                          :    5,
+                '$$'                            :    5,
+                '$REAL_GROUP_ID'                :    5,
+                '$GID'                          :    5,
+                '$('                            :    5,
+                '$EFFECTIVE_GROUP_ID'           :    5,
+                '$EGID'                         :    5,
+                '$)'                            :    5,
+                '$PROGRAM_NAME'                 :    5,
+                '$0'                            :    5,
+                '$SUBSCRIPT_SEPARATOR'          :    5,
+                '$SUBSEP'                       :    5,
+                '$;'                            :    5,
+                '$REAL_USER_ID'                 :    5,
+                '$UID'                          :    5,
+                '$<'                            :    5,
+                '$EFFECTIVE_USER_ID'            :    5,
+                '$EUID'                         :    5,
+                '$>'                            :    5,
+                '$a'                            :    5,
+                '$b'                            :    5,
+                '$COMPILING'                    :    5,
+                '$^C'                           :    5,
+                '$DEBUGGING'                    :    5,
+                '$^D'                           :    5,
+                '${^ENCODING}'                  :    5,
+                '$ENV'                          :    5,
+                '%ENV'                          :    5,
+                '$SYSTEM_FD_MAX'                :    5,
+                '$^F'                           :    5,
+                '@F'                            :    5,
+                '${^GLOBAL_PHASE}'              :    5,
+                '$^H'                           :    5,
+                '%^H'                           :    5,
+                '@INC'                          :    5,
+                '%INC'                          :    5,
+                '$INPLACE_EDIT'                 :    5,
+                '$^I'                           :    5,
+                '$^M'                           :    5,
+                '$OSNAME'                       :    5,
+                '$^O'                           :    5,
+                '${^OPEN}'                      :    5,
+                '$PERLDB'                       :    5,
+                '$^P'                           :    5,
+                '$SIG'                          :    5,
+                '%SIG'                          :    5,
+                '$BASETIME'                     :    5,
+                '$^T'                           :    5,
+                '${^TAINT}'                     :    5,
+                '${^UNICODE}'                   :    5,
+                '${^UTF8CACHE}'                 :    5,
+                '${^UTF8LOCALE}'                :    5,
+                '$PERL_VERSION'                 :    5,
+                '$^V'                           :    5,
+                '${^WIN32_SLOPPY_STAT}'         :    5,
+                '$EXECUTABLE_NAME'              :    5,
+                '$^X'                           :    5,
+                '$1'                            :    5, // - regexp $1, $2...
+                '$MATCH'                        :    5,
+                '$&'                            :    5,
+                '${^MATCH}'                     :    5,
+                '$PREMATCH'                     :    5,
+                '$`'                            :    5,
+                '${^PREMATCH}'                  :    5,
+                '$POSTMATCH'                    :    5,
+                "$'"                            :    5,
+                '${^POSTMATCH}'                 :    5,
+                '$LAST_PAREN_MATCH'             :    5,
+                '$+'                            :    5,
+                '$LAST_SUBMATCH_RESULT'         :    5,
+                '$^N'                           :    5,
+                '@LAST_MATCH_END'               :    5,
+                '@+'                            :    5,
+                '%LAST_PAREN_MATCH'             :    5,
+                '%+'                            :    5,
+                '@LAST_MATCH_START'             :    5,
+                '@-'                            :    5,
+                '%LAST_MATCH_START'             :    5,
+                '%-'                            :    5,
+                '$LAST_REGEXP_CODE_RESULT'      :    5,
+                '$^R'                           :    5,
+                '${^RE_DEBUG_FLAGS}'            :    5,
+                '${^RE_TRIE_MAXBUF}'            :    5,
+                '$ARGV'                         :    5,
+                '@ARGV'                         :    5,
+                'ARGV'                          :    5,
+                'ARGVOUT'                       :    5,
+                '$OUTPUT_FIELD_SEPARATOR'       :    5,
+                '$OFS'                          :    5,
+                '$,'                            :    5,
+                '$INPUT_LINE_NUMBER'            :    5,
+                '$NR'                           :    5,
+                '$.'                            :    5,
+                '$INPUT_RECORD_SEPARATOR'       :    5,
+                '$RS'                           :    5,
+                '$/'                            :    5,
+                '$OUTPUT_RECORD_SEPARATOR'      :    5,
+                '$ORS'                          :    5,
+                '$\\'                           :    5,
+                '$OUTPUT_AUTOFLUSH'             :    5,
+                '$|'                            :    5,
+                '$ACCUMULATOR'                  :    5,
+                '$^A'                           :    5,
+                '$FORMAT_FORMFEED'              :    5,
+                '$^L'                           :    5,
+                '$FORMAT_PAGE_NUMBER'           :    5,
+                '$%'                            :    5,
+                '$FORMAT_LINES_LEFT'            :    5,
+                '$-'                            :    5,
+                '$FORMAT_LINE_BREAK_CHARACTERS' :    5,
+                '$:'                            :    5,
+                '$FORMAT_LINES_PER_PAGE'        :    5,
+                '$='                            :    5,
+                '$FORMAT_TOP_NAME'              :    5,
+                '$^'                            :    5,
+                '$FORMAT_NAME'                  :    5,
+                '$~'                            :    5,
+                '${^CHILD_ERROR_NATIVE}'        :    5,
+                '$EXTENDED_OS_ERROR'            :    5,
+                '$^E'                           :    5,
+                '$EXCEPTIONS_BEING_CAUGHT'      :    5,
+                '$^S'                           :    5,
+                '$WARNING'                      :    5,
+                '$^W'                           :    5,
+                '${^WARNING_BITS}'              :    5,
+                '$OS_ERROR'                     :    5,
+                '$ERRNO'                        :    5,
+                '$!'                            :    5,
+                '%OS_ERROR'                     :    5,
+                '%ERRNO'                        :    5,
+                '%!'                            :    5,
+                '$CHILD_ERROR'                  :    5,
+                '$?'                            :    5,
+                '$EVAL_ERROR'                   :    5,
+                '$@'                            :    5,
+                '$OFMT'                         :    5,
+                '$#'                            :    5,
+                '$*'                            :    5,
+                '$ARRAY_BASE'                   :    5,
+                '$['                            :    5,
+                '$OLD_PERL_VERSION'             :    5,
+                '$]'                            :    5,
+                                                //      PERL blocks
+                'if'                            :[1,1],
+                elsif                           :[1,1],
+                'else'                          :[1,1],
+                'while'                         :[1,1],
+                unless                          :[1,1],
+                'for'                           :[1,1],
+                foreach                         :[1,1],
+                                                //      PERL functions
+                'abs'                           :1,     // - absolute value function
+                accept                          :1,     // - accept an incoming socket connect
+                alarm                           :1,     // - schedule a SIGALRM
+                'atan2'                         :1,     // - arctangent of Y/X in the range -PI to PI
+                bind                            :1,     // - binds an address to a socket
+                binmode                         :1,     // - prepare binary files for I/O
+                bless                           :1,     // - create an object
+                bootstrap                       :1,     //
+                'break'                         :1,     // - break out of a "given" block
+                caller                          :1,     // - get context of the current subroutine call
+                chdir                           :1,     // - change your current working directory
+                chmod                           :1,     // - changes the permissions on a list of files
+                chomp                           :1,     // - remove a trailing record separator from a string
+                chop                            :1,     // - remove the last character from a string
+                chown                           :1,     // - change the owership on a list of files
+                chr                             :1,     // - get character this number represents
+                chroot                          :1,     // - make directory new root for path lookups
+                close                           :1,     // - close file (or pipe or socket) handle
+                closedir                        :1,     // - close directory handle
+                connect                         :1,     // - connect to a remote socket
+                'continue'                      :[1,1], // - optional trailing block in a while or foreach
+                'cos'                           :1,     // - cosine function
+                crypt                           :1,     // - one-way passwd-style encryption
+                dbmclose                        :1,     // - breaks binding on a tied dbm file
+                dbmopen                         :1,     // - create binding on a tied dbm file
+                'default'                       :1,     //
+                defined                         :1,     // - test whether a value, variable, or function is defined
+                'delete'                        :1,     // - deletes a value from a hash
+                die                             :1,     // - raise an exception or bail out
+                'do'                            :1,     // - turn a BLOCK into a TERM
+                dump                            :1,     // - create an immediate core dump
+                each                            :1,     // - retrieve the next key/value pair from a hash
+                endgrent                        :1,     // - be done using group file
+                endhostent                      :1,     // - be done using hosts file
+                endnetent                       :1,     // - be done using networks file
+                endprotoent                     :1,     // - be done using protocols file
+                endpwent                        :1,     // - be done using passwd file
+                endservent                      :1,     // - be done using services file
+                eof                             :1,     // - test a filehandle for its end
+                'eval'                          :1,     // - catch exceptions or compile and run code
+                'exec'                          :1,     // - abandon this program to run another
+                exists                          :1,     // - test whether a hash key is present
+                exit                            :1,     // - terminate this program
+                'exp'                           :1,     // - raise I to a power
+                fcntl                           :1,     // - file control system call
+                fileno                          :1,     // - return file descriptor from filehandle
+                flock                           :1,     // - lock an entire file with an advisory lock
+                fork                            :1,     // - create a new process just like this one
+                format                          :1,     // - declare a picture format with use by the write() function
+                formline                        :1,     // - internal function used for formats
+                getc                            :1,     // - get the next character from the filehandle
+                getgrent                        :1,     // - get next group record
+                getgrgid                        :1,     // - get group record given group user ID
+                getgrnam                        :1,     // - get group record given group name
+                gethostbyaddr                   :1,     // - get host record given its address
+                gethostbyname                   :1,     // - get host record given name
+                gethostent                      :1,     // - get next hosts record
+                getlogin                        :1,     // - return who logged in at this tty
+                getnetbyaddr                    :1,     // - get network record given its address
+                getnetbyname                    :1,     // - get networks record given name
+                getnetent                       :1,     // - get next networks record
+                getpeername                     :1,     // - find the other end of a socket connection
+                getpgrp                         :1,     // - get process group
+                getppid                         :1,     // - get parent process ID
+                getpriority                     :1,     // - get current nice value
+                getprotobyname                  :1,     // - get protocol record given name
+                getprotobynumber                :1,     // - get protocol record numeric protocol
+                getprotoent                     :1,     // - get next protocols record
+                getpwent                        :1,     // - get next passwd record
+                getpwnam                        :1,     // - get passwd record given user login name
+                getpwuid                        :1,     // - get passwd record given user ID
+                getservbyname                   :1,     // - get services record given its name
+                getservbyport                   :1,     // - get services record given numeric port
+                getservent                      :1,     // - get next services record
+                getsockname                     :1,     // - retrieve the sockaddr for a given socket
+                getsockopt                      :1,     // - get socket options on a given socket
+                given                           :1,     //
+                glob                            :1,     // - expand filenames using wildcards
+                gmtime                          :1,     // - convert UNIX time into record or string using Greenwich time
+                'goto'                          :1,     // - create spaghetti code
+                grep                            :1,     // - locate elements in a list test true against a given criterion
+                hex                             :1,     // - convert a string to a hexadecimal number
+                'import'                        :1,     // - patch a module's namespace into your own
+                index                           :1,     // - find a substring within a string
+                'int'                           :1,     // - get the integer portion of a number
+                ioctl                           :1,     // - system-dependent device control system call
+                'join'                          :1,     // - join a list into a string using a separator
+                keys                            :1,     // - retrieve list of indices from a hash
+                kill                            :1,     // - send a signal to a process or process group
+                last                            :1,     // - exit a block prematurely
+                lc                              :1,     // - return lower-case version of a string
+                lcfirst                         :1,     // - return a string with just the next letter in lower case
+                length                          :1,     // - return the number of bytes in a string
+                'link'                          :1,     // - create a hard link in the filesytem
+                listen                          :1,     // - register your socket as a server
+                local                           : 2,    // - create a temporary value for a global variable (dynamic scoping)
+                localtime                       :1,     // - convert UNIX time into record or string using local time
+                lock                            :1,     // - get a thread lock on a variable, subroutine, or method
+                'log'                           :1,     // - retrieve the natural logarithm for a number
+                lstat                           :1,     // - stat a symbolic link
+                m                               :null,  // - match a string with a regular expression pattern
+                map                             :1,     // - apply a change to a list to get back a new list with the changes
+                mkdir                           :1,     // - create a directory
+                msgctl                          :1,     // - SysV IPC message control operations
+                msgget                          :1,     // - get SysV IPC message queue
+                msgrcv                          :1,     // - receive a SysV IPC message from a message queue
+                msgsnd                          :1,     // - send a SysV IPC message to a message queue
+                my                              : 2,    // - declare and assign a local variable (lexical scoping)
+                'new'                           :1,     //
+                next                            :1,     // - iterate a block prematurely
+                no                              :1,     // - unimport some module symbols or semantics at compile time
+                oct                             :1,     // - convert a string to an octal number
+                open                            :1,     // - open a file, pipe, or descriptor
+                opendir                         :1,     // - open a directory
+                ord                             :1,     // - find a character's numeric representation
+                our                             : 2,    // - declare and assign a package variable (lexical scoping)
+                pack                            :1,     // - convert a list into a binary representation
+                'package'                       :1,     // - declare a separate global namespace
+                pipe                            :1,     // - open a pair of connected filehandles
+                pop                             :1,     // - remove the last element from an array and return it
+                pos                             :1,     // - find or set the offset for the last/next m//g search
+                print                           :1,     // - output a list to a filehandle
+                printf                          :1,     // - output a formatted list to a filehandle
+                prototype                       :1,     // - get the prototype (if any) of a subroutine
+                push                            :1,     // - append one or more elements to an array
+                q                               :null,  // - singly quote a string
+                qq                              :null,  // - doubly quote a string
+                qr                              :null,  // - Compile pattern
+                quotemeta                       :null,  // - quote regular expression magic characters
+                qw                              :null,  // - quote a list of words
+                qx                              :null,  // - backquote quote a string
+                rand                            :1,     // - retrieve the next pseudorandom number
+                read                            :1,     // - fixed-length buffered input from a filehandle
+                readdir                         :1,     // - get a directory from a directory handle
+                readline                        :1,     // - fetch a record from a file
+                readlink                        :1,     // - determine where a symbolic link is pointing
+                readpipe                        :1,     // - execute a system command and collect standard output
+                recv                            :1,     // - receive a message over a Socket
+                redo                            :1,     // - start this loop iteration over again
+                ref                             :1,     // - find out the type of thing being referenced
+                rename                          :1,     // - change a filename
+                require                         :1,     // - load in external functions from a library at runtime
+                reset                           :1,     // - clear all variables of a given name
+                'return'                        :1,     // - get out of a function early
+                reverse                         :1,     // - flip a string or a list
+                rewinddir                       :1,     // - reset directory handle
+                rindex                          :1,     // - right-to-left substring search
+                rmdir                           :1,     // - remove a directory
+                s                               :null,  // - replace a pattern with a string
+                say                             :1,     // - print with newline
+                scalar                          :1,     // - force a scalar context
+                seek                            :1,     // - reposition file pointer for random-access I/O
+                seekdir                         :1,     // - reposition directory pointer
+                select                          :1,     // - reset default output or do I/O multiplexing
+                semctl                          :1,     // - SysV semaphore control operations
+                semget                          :1,     // - get set of SysV semaphores
+                semop                           :1,     // - SysV semaphore operations
+                send                            :1,     // - send a message over a socket
+                setgrent                        :1,     // - prepare group file for use
+                sethostent                      :1,     // - prepare hosts file for use
+                setnetent                       :1,     // - prepare networks file for use
+                setpgrp                         :1,     // - set the process group of a process
+                setpriority                     :1,     // - set a process's nice value
+                setprotoent                     :1,     // - prepare protocols file for use
+                setpwent                        :1,     // - prepare passwd file for use
+                setservent                      :1,     // - prepare services file for use
+                setsockopt                      :1,     // - set some socket options
+                shift                           :1,     // - remove the first element of an array, and return it
+                shmctl                          :1,     // - SysV shared memory operations
+                shmget                          :1,     // - get SysV shared memory segment identifier
+                shmread                         :1,     // - read SysV shared memory
+                shmwrite                        :1,     // - write SysV shared memory
+                shutdown                        :1,     // - close down just half of a socket connection
+                'sin'                           :1,     // - return the sine of a number
+                sleep                           :1,     // - block for some number of seconds
+                socket                          :1,     // - create a socket
+                socketpair                      :1,     // - create a pair of sockets
+                'sort'                          :1,     // - sort a list of values
+                splice                          :1,     // - add or remove elements anywhere in an array
+                'split'                         :1,     // - split up a string using a regexp delimiter
+                sprintf                         :1,     // - formatted print into a string
+                'sqrt'                          :1,     // - square root function
+                srand                           :1,     // - seed the random number generator
+                stat                            :1,     // - get a file's status information
+                state                           :1,     // - declare and assign a state variable (persistent lexical scoping)
+                study                           :1,     // - optimize input data for repeated searches
+                'sub'                           :1,     // - declare a subroutine, possibly anonymously
+                'substr'                        :1,     // - get or alter a portion of a stirng
+                symlink                         :1,     // - create a symbolic link to a file
+                syscall                         :1,     // - execute an arbitrary system call
+                sysopen                         :1,     // - open a file, pipe, or descriptor
+                sysread                         :1,     // - fixed-length unbuffered input from a filehandle
+                sysseek                         :1,     // - position I/O pointer on handle used with sysread and syswrite
+                system                          :1,     // - run a separate program
+                syswrite                        :1,     // - fixed-length unbuffered output to a filehandle
+                tell                            :1,     // - get current seekpointer on a filehandle
+                telldir                         :1,     // - get current seekpointer on a directory handle
+                tie                             :1,     // - bind a variable to an object class
+                tied                            :1,     // - get a reference to the object underlying a tied variable
+                time                            :1,     // - return number of seconds since 1970
+                times                           :1,     // - return elapsed time for self and child processes
+                tr                              :null,  // - transliterate a string
+                truncate                        :1,     // - shorten a file
+                uc                              :1,     // - return upper-case version of a string
+                ucfirst                         :1,     // - return a string with just the next letter in upper case
+                umask                           :1,     // - set file creation mode mask
+                undef                           :1,     // - remove a variable or function definition
+                unlink                          :1,     // - remove one link to a file
+                unpack                          :1,     // - convert binary structure into normal perl variables
+                unshift                         :1,     // - prepend more elements to the beginning of a list
+                untie                           :1,     // - break a tie binding to a variable
+                use                             :1,     // - load in a module at compile time
+                utime                           :1,     // - set a file's last access and modify times
+                values                          :1,     // - return a list of the values in a hash
+                vec                             :1,     // - test or set particular bits in a string
+                wait                            :1,     // - wait for any child process to die
+                waitpid                         :1,     // - wait for a particular child process to die
+                wantarray                       :1,     // - get void vs scalar vs list context of current subroutine call
+                warn                            :1,     // - print debugging info
+                when                            :1,     //
+                write                           :1,     // - print a picture record
+                y                               :null}; // - transliterate a string
 
-	var RXstyle="string-2";
-	var RXmodifiers=/[goseximacplud]/;		// NOTE: "m", "s", "y" and "tr" need to correct real modifiers for each regexp type
+        var RXstyle="string-2";
+        var RXmodifiers=/[goseximacplud]/;              // NOTE: "m", "s", "y" and "tr" need to correct real modifiers for each regexp type
 
-	function tokenChain(stream,state,chain,style,tail){	// NOTE: chain.length > 2 is not working now (it's for s[...][...]geos;)
-		state.chain=null;                               //                                                          12   3tail
-		state.style=null;
-		state.tail=null;
-		state.tokenize=function(stream,state){
-			var e=false,c,i=0;
-			while(c=stream.next()){
-				if(c===chain[i]&&!e){
-					if(chain[++i]!==undefined){
-						state.chain=chain[i];
-						state.style=style;
-						state.tail=tail;}
-					else if(tail)
-						stream.eatWhile(tail);
-					state.tokenize=tokenPerl;
-					return style;}
-				e=!e&&c=="\\";}
-			return style;};
-		return state.tokenize(stream,state);}
+        function tokenChain(stream,state,chain,style,tail){     // NOTE: chain.length > 2 is not working now (it's for s[...][...]geos;)
+                state.chain=null;                               //                                                          12   3tail
+                state.style=null;
+                state.tail=null;
+                state.tokenize=function(stream,state){
+                        var e=false,c,i=0;
+                        while(c=stream.next()){
+                                if(c===chain[i]&&!e){
+                                        if(chain[++i]!==undefined){
+                                                state.chain=chain[i];
+                                                state.style=style;
+                                                state.tail=tail;}
+                                        else if(tail)
+                                                stream.eatWhile(tail);
+                                        state.tokenize=tokenPerl;
+                                        return style;}
+                                e=!e&&c=="\\";}
+                        return style;};
+                return state.tokenize(stream,state);}
 
-	function tokenSOMETHING(stream,state,string){
-		state.tokenize=function(stream,state){
-			if(stream.string==string)
-				state.tokenize=tokenPerl;
-			stream.skipToEnd();
-			return "string";};
-		return state.tokenize(stream,state);}
+        function tokenSOMETHING(stream,state,string){
+                state.tokenize=function(stream,state){
+                        if(stream.string==string)
+                                state.tokenize=tokenPerl;
+                        stream.skipToEnd();
+                        return "string";};
+                return state.tokenize(stream,state);}
 
-	function tokenPerl(stream,state){
-		if(stream.eatSpace())
-			return null;
-		if(state.chain)
-			return tokenChain(stream,state,state.chain,state.style,state.tail);
-		if(stream.match(/^\-?[\d\.]/,false))
-			if(stream.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/))
-				return 'number';
-		if(stream.match(/^<<(?=\w)/)){			// NOTE: <<SOMETHING\n...\nSOMETHING\n
-			stream.eatWhile(/\w/);
-			return tokenSOMETHING(stream,state,stream.current().substr(2));}
-		if(stream.sol()&&stream.match(/^\=item(?!\w)/)){// NOTE: \n=item...\n=cut\n
-			return tokenSOMETHING(stream,state,'=cut');}
-		var ch=stream.next();
-		if(ch=='"'||ch=="'"){				// NOTE: ' or " or <<'SOMETHING'\n...\nSOMETHING\n or <<"SOMETHING"\n...\nSOMETHING\n
-			if(stream.prefix(3)=="<<"+ch){
-				var p=stream.pos;
-				stream.eatWhile(/\w/);
-				var n=stream.current().substr(1);
-				if(n&&stream.eat(ch))
-					return tokenSOMETHING(stream,state,n);
-				stream.pos=p;}
-			return tokenChain(stream,state,[ch],"string");}
-		if(ch=="q"){
-			var c=stream.look(-2);
-			if(!(c&&/\w/.test(c))){
-				c=stream.look(0);
-				if(c=="x"){
-					c=stream.look(1);
-					if(c=="("){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);}
-					if(c=="["){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);}
-					if(c=="{"){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);}
-					if(c=="<"){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}
-					if(/[\^'"!~\/]/.test(c)){
-						stream.eatSuffix(1);
-						return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}}
-				else if(c=="q"){
-					c=stream.look(1);
-					if(c=="("){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,[")"],"string");}
-					if(c=="["){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,["]"],"string");}
-					if(c=="{"){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,["}"],"string");}
-					if(c=="<"){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,[">"],"string");}
-					if(/[\^'"!~\/]/.test(c)){
-						stream.eatSuffix(1);
-						return tokenChain(stream,state,[stream.eat(c)],"string");}}
-				else if(c=="w"){
-					c=stream.look(1);
-					if(c=="("){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,[")"],"bracket");}
-					if(c=="["){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,["]"],"bracket");}
-					if(c=="{"){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,["}"],"bracket");}
-					if(c=="<"){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,[">"],"bracket");}
-					if(/[\^'"!~\/]/.test(c)){
-						stream.eatSuffix(1);
-						return tokenChain(stream,state,[stream.eat(c)],"bracket");}}
-				else if(c=="r"){
-					c=stream.look(1);
-					if(c=="("){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);}
-					if(c=="["){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);}
-					if(c=="{"){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);}
-					if(c=="<"){
-						stream.eatSuffix(2);
-						return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}
-					if(/[\^'"!~\/]/.test(c)){
-						stream.eatSuffix(1);
-						return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}}
-				else if(/[\^'"!~\/(\[{<]/.test(c)){
-					if(c=="("){
-						stream.eatSuffix(1);
-						return tokenChain(stream,state,[")"],"string");}
-					if(c=="["){
-						stream.eatSuffix(1);
-						return tokenChain(stream,state,["]"],"string");}
-					if(c=="{"){
-						stream.eatSuffix(1);
-						return tokenChain(stream,state,["}"],"string");}
-					if(c=="<"){
-						stream.eatSuffix(1);
-						return tokenChain(stream,state,[">"],"string");}
-					if(/[\^'"!~\/]/.test(c)){
-						return tokenChain(stream,state,[stream.eat(c)],"string");}}}}
-		if(ch=="m"){
-			var c=stream.look(-2);
-			if(!(c&&/\w/.test(c))){
-				c=stream.eat(/[(\[{<\^'"!~\/]/);
-				if(c){
-					if(/[\^'"!~\/]/.test(c)){
-						return tokenChain(stream,state,[c],RXstyle,RXmodifiers);}
-					if(c=="("){
-						return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);}
-					if(c=="["){
-						return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);}
-					if(c=="{"){
-						return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);}
-					if(c=="<"){
-						return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}}}}
-		if(ch=="s"){
-			var c=/[\/>\]})\w]/.test(stream.look(-2));
-			if(!c){
-				c=stream.eat(/[(\[{<\^'"!~\/]/);
-				if(c){
-					if(c=="[")
-						return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers);
-					if(c=="{")
-						return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers);
-					if(c=="<")
-						return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers);
-					if(c=="(")
-						return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers);
-					return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}
-		if(ch=="y"){
-			var c=/[\/>\]})\w]/.test(stream.look(-2));
-			if(!c){
-				c=stream.eat(/[(\[{<\^'"!~\/]/);
-				if(c){
-					if(c=="[")
-						return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers);
-					if(c=="{")
-						return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers);
-					if(c=="<")
-						return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers);
-					if(c=="(")
-						return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers);
-					return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}
-		if(ch=="t"){
-			var c=/[\/>\]})\w]/.test(stream.look(-2));
-			if(!c){
-				c=stream.eat("r");if(c){
-				c=stream.eat(/[(\[{<\^'"!~\/]/);
-				if(c){
-					if(c=="[")
-						return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers);
-					if(c=="{")
-						return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers);
-					if(c=="<")
-						return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers);
-					if(c=="(")
-						return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers);
-					return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}}
-		if(ch=="`"){
-			return tokenChain(stream,state,[ch],"variable-2");}
-		if(ch=="/"){
-			if(!/~\s*$/.test(stream.prefix()))
-				return "operator";
-			else
-				return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);}
-		if(ch=="$"){
-			var p=stream.pos;
-			if(stream.eatWhile(/\d/)||stream.eat("{")&&stream.eatWhile(/\d/)&&stream.eat("}"))
-				return "variable-2";
-			else
-				stream.pos=p;}
-		if(/[$@%]/.test(ch)){
-			var p=stream.pos;
-			if(stream.eat("^")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(stream.look(-2))&&stream.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){
-				var c=stream.current();
-				if(PERL[c])
-					return "variable-2";}
-			stream.pos=p;}
-		if(/[$@%&]/.test(ch)){
-			if(stream.eatWhile(/[\w$\[\]]/)||stream.eat("{")&&stream.eatWhile(/[\w$\[\]]/)&&stream.eat("}")){
-				var c=stream.current();
-				if(PERL[c])
-					return "variable-2";
-				else
-					return "variable";}}
-		if(ch=="#"){
-			if(stream.look(-2)!="$"){
-				stream.skipToEnd();
-				return "comment";}}
-		if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(ch)){
-			var p=stream.pos;
-			stream.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/);
-			if(PERL[stream.current()])
-				return "operator";
-			else
-				stream.pos=p;}
-		if(ch=="_"){
-			if(stream.pos==1){
-				if(stream.suffix(6)=="_END__"){
-					return tokenChain(stream,state,['\0'],"comment");}
-				else if(stream.suffix(7)=="_DATA__"){
-					return tokenChain(stream,state,['\0'],"variable-2");}
-				else if(stream.suffix(7)=="_C__"){
-					return tokenChain(stream,state,['\0'],"string");}}}
-		if(/\w/.test(ch)){
-			var p=stream.pos;
-			if(stream.look(-2)=="{"&&(stream.look(0)=="}"||stream.eatWhile(/\w/)&&stream.look(0)=="}"))
-				return "string";
-			else
-				stream.pos=p;}
-		if(/[A-Z]/.test(ch)){
-			var l=stream.look(-2);
-			var p=stream.pos;
-			stream.eatWhile(/[A-Z_]/);
-			if(/[\da-z]/.test(stream.look(0))){
-				stream.pos=p;}
-			else{
-				var c=PERL[stream.current()];
-				if(!c)
-					return "meta";
-				if(c[1])
-					c=c[0];
-				if(l!=":"){
-					if(c==1)
-						return "keyword";
-					else if(c==2)
-						return "def";
-					else if(c==3)
-						return "atom";
-					else if(c==4)
-						return "operator";
-					else if(c==5)
-						return "variable-2";
-					else
-						return "meta";}
-				else
-					return "meta";}}
-		if(/[a-zA-Z_]/.test(ch)){
-			var l=stream.look(-2);
-			stream.eatWhile(/\w/);
-			var c=PERL[stream.current()];
-			if(!c)
-				return "meta";
-			if(c[1])
-				c=c[0];
-			if(l!=":"){
-				if(c==1)
-					return "keyword";
-				else if(c==2)
-					return "def";
-				else if(c==3)
-					return "atom";
-				else if(c==4)
-					return "operator";
-				else if(c==5)
-					return "variable-2";
-				else
-					return "meta";}
-			else
-				return "meta";}
-		return null;}
+        function tokenPerl(stream,state){
+                if(stream.eatSpace())
+                        return null;
+                if(state.chain)
+                        return tokenChain(stream,state,state.chain,state.style,state.tail);
+                if(stream.match(/^\-?[\d\.]/,false))
+                        if(stream.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/))
+                                return 'number';
+                if(stream.match(/^<<(?=\w)/)){                  // NOTE: <<SOMETHING\n...\nSOMETHING\n
+                        stream.eatWhile(/\w/);
+                        return tokenSOMETHING(stream,state,stream.current().substr(2));}
+                if(stream.sol()&&stream.match(/^\=item(?!\w)/)){// NOTE: \n=item...\n=cut\n
+                        return tokenSOMETHING(stream,state,'=cut');}
+                var ch=stream.next();
+                if(ch=='"'||ch=="'"){                           // NOTE: ' or " or <<'SOMETHING'\n...\nSOMETHING\n or <<"SOMETHING"\n...\nSOMETHING\n
+                        if(stream.prefix(3)=="<<"+ch){
+                                var p=stream.pos;
+                                stream.eatWhile(/\w/);
+                                var n=stream.current().substr(1);
+                                if(n&&stream.eat(ch))
+                                        return tokenSOMETHING(stream,state,n);
+                                stream.pos=p;}
+                        return tokenChain(stream,state,[ch],"string");}
+                if(ch=="q"){
+                        var c=stream.look(-2);
+                        if(!(c&&/\w/.test(c))){
+                                c=stream.look(0);
+                                if(c=="x"){
+                                        c=stream.look(1);
+                                        if(c=="("){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);}
+                                        if(c=="["){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);}
+                                        if(c=="{"){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);}
+                                        if(c=="<"){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}
+                                        if(/[\^'"!~\/]/.test(c)){
+                                                stream.eatSuffix(1);
+                                                return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}}
+                                else if(c=="q"){
+                                        c=stream.look(1);
+                                        if(c=="("){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,[")"],"string");}
+                                        if(c=="["){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,["]"],"string");}
+                                        if(c=="{"){
+stream.eatSuffix(2);
+                                                return tokenChain(stream,state,["}"],"string");}
+                                        if(c=="<"){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,[">"],"string");}
+                                        if(/[\^'"!~\/]/.test(c)){
+                                                stream.eatSuffix(1);
+                                                return tokenChain(stream,state,[stream.eat(c)],"string");}}
+                                else if(c=="w"){
+                                        c=stream.look(1);
+                                        if(c=="("){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,[")"],"bracket");}
+                                        if(c=="["){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,["]"],"bracket");}
+                                        if(c=="{"){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,["}"],"bracket");}
+                                        if(c=="<"){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,[">"],"bracket");}
+                                        if(/[\^'"!~\/]/.test(c)){
+                                                stream.eatSuffix(1);
+                                                return tokenChain(stream,state,[stream.eat(c)],"bracket");}}
+                                else if(c=="r"){
+                                        c=stream.look(1);
+                                        if(c=="("){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);}
+                                        if(c=="["){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);}
+                                        if(c=="{"){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);}
+                                        if(c=="<"){
+                                                stream.eatSuffix(2);
+                                                return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}
+                                        if(/[\^'"!~\/]/.test(c)){
+                                                stream.eatSuffix(1);
+                                                return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}}
+                                else if(/[\^'"!~\/(\[{<]/.test(c)){
+                                        if(c=="("){
+                                                stream.eatSuffix(1);
+                                                return tokenChain(stream,state,[")"],"string");}
+                                        if(c=="["){
+                                                stream.eatSuffix(1);
+                                                return tokenChain(stream,state,["]"],"string");}
+                                        if(c=="{"){
+                                                stream.eatSuffix(1);
+                                                return tokenChain(stream,state,["}"],"string");}
+                                        if(c=="<"){
+                                                stream.eatSuffix(1);
+                                                return tokenChain(stream,state,[">"],"string");}
+                                        if(/[\^'"!~\/]/.test(c)){
+                                                return tokenChain(stream,state,[stream.eat(c)],"string");}}}}
+                if(ch=="m"){
+                        var c=stream.look(-2);
+                        if(!(c&&/\w/.test(c))){
+                                c=stream.eat(/[(\[{<\^'"!~\/]/);
+                                if(c){
+                                        if(/[\^'"!~\/]/.test(c)){
+                                                return tokenChain(stream,state,[c],RXstyle,RXmodifiers);}
+                                        if(c=="("){
+                                                return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);}
+                                        if(c=="["){
+                                                return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);}
+                                        if(c=="{"){
+                                                return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);}
+                                        if(c=="<"){
+                                                return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}}}}
+                if(ch=="s"){
+                        var c=/[\/>\]})\w]/.test(stream.look(-2));
+                        if(!c){
+                                c=stream.eat(/[(\[{<\^'"!~\/]/);
+                                if(c){
+                                        if(c=="[")
+                                                return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers);
+                                        if(c=="{")
+                                                return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers);
+                                        if(c=="<")
+                                                return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers);
+                                        if(c=="(")
+                                                return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers);
+                                        return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}
+                if(ch=="y"){
+                        var c=/[\/>\]})\w]/.test(stream.look(-2));
+                        if(!c){
+                                c=stream.eat(/[(\[{<\^'"!~\/]/);
+                                if(c){
+                                        if(c=="[")
+                                                return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers);
+                                        if(c=="{")
+                                                return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers);
+                                        if(c=="<")
+                                                return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers);
+                                        if(c=="(")
+                                                return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers);
+                                        return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}
+                if(ch=="t"){
+                        var c=/[\/>\]})\w]/.test(stream.look(-2));
+                        if(!c){
+                                c=stream.eat("r");if(c){
+                                c=stream.eat(/[(\[{<\^'"!~\/]/);
+                                if(c){
+                                        if(c=="[")
+                                                return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers);
+                                        if(c=="{")
+                                                return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers);
+                                        if(c=="<")
+                                                return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers);
+                                        if(c=="(")
+                                                return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers);
+                                        return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}}
+                if(ch=="`"){
+                        return tokenChain(stream,state,[ch],"variable-2");}
+                if(ch=="/"){
+                        if(!/~\s*$/.test(stream.prefix()))
+                                return "operator";
+                        else
+                                return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);}
+                if(ch=="$"){
+                        var p=stream.pos;
+                        if(stream.eatWhile(/\d/)||stream.eat("{")&&stream.eatWhile(/\d/)&&stream.eat("}"))
+                                return "variable-2";
+                        else
+                                stream.pos=p;}
+                if(/[$@%]/.test(ch)){
+                        var p=stream.pos;
+                        if(stream.eat("^")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(stream.look(-2))&&stream.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){
+                                var c=stream.current();
+                                if(PERL[c])
+                                        return "variable-2";}
+                        stream.pos=p;}
+                if(/[$@%&]/.test(ch)){
+                        if(stream.eatWhile(/[\w$\[\]]/)||stream.eat("{")&&stream.eatWhile(/[\w$\[\]]/)&&stream.eat("}")){
+                                var c=stream.current();
+                                if(PERL[c])
+                                        return "variable-2";
+                                else
+                                        return "variable";}}
+                if(ch=="#"){
+                        if(stream.look(-2)!="$"){
+                                stream.skipToEnd();
+                                return "comment";}}
+                if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(ch)){
+                        var p=stream.pos;
+                        stream.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/);
+                        if(PERL[stream.current()])
+                                return "operator";
+                        else
+                                stream.pos=p;}
+                if(ch=="_"){
+                        if(stream.pos==1){
+                                if(stream.suffix(6)=="_END__"){
+                                        return tokenChain(stream,state,['\0'],"comment");}
+                                else if(stream.suffix(7)=="_DATA__"){
+                                        return tokenChain(stream,state,['\0'],"variable-2");}
+                                else if(stream.suffix(7)=="_C__"){
+                                        return tokenChain(stream,state,['\0'],"string");}}}
+                if(/\w/.test(ch)){
+                        var p=stream.pos;
+                        if(stream.look(-2)=="{"&&(stream.look(0)=="}"||stream.eatWhile(/\w/)&&stream.look(0)=="}"))
+                                return "string";
+                        else
+                                stream.pos=p;}
+                if(/[A-Z]/.test(ch)){
+                        var l=stream.look(-2);
+                        var p=stream.pos;
+                        stream.eatWhile(/[A-Z_]/);
+                        if(/[\da-z]/.test(stream.look(0))){
+                                stream.pos=p;}
+                        else{
+                                var c=PERL[stream.current()];
+                                if(!c)
+                                        return "meta";
+                                if(c[1])
+                                        c=c[0];
+                                if(l!=":"){
+                                        if(c==1)
+                                                return "keyword";
+                                        else if(c==2)
+                                                return "def";
+                                        else if(c==3)
+                                                return "atom";
+                                        else if(c==4)
+                                                return "operator";
+                                        else if(c==5)
+                                                return "variable-2";
+                                        else
+                                                return "meta";}
+                                else
+                                        return "meta";}}
+                if(/[a-zA-Z_]/.test(ch)){
+                        var l=stream.look(-2);
+                        stream.eatWhile(/\w/);
+                        var c=PERL[stream.current()];
+                        if(!c)
+                                return "meta";
+                        if(c[1])
+                                c=c[0];
+                        if(l!=":"){
+                                if(c==1)
+                                        return "keyword";
+                                else if(c==2)
+                                        return "def";
+                                else if(c==3)
+                                        return "atom";
+                                else if(c==4)
+                                        return "operator";
+                                else if(c==5)
+                                        return "variable-2";
+                                else
+                                        return "meta";}
+                        else
+                                return "meta";}
+                return null;}
 
-	return{
-		startState:function(){
-			return{
-				tokenize:tokenPerl,
-				chain:null,
-				style:null,
-				tail:null};},
-		token:function(stream,state){
-			return (state.tokenize||tokenPerl)(stream,state);},
-		electricChars:"{}"};});
+        return{
+                startState:function(){
+                        return{
+                                tokenize:tokenPerl,
+                                chain:null,
+                                style:null,
+                                tail:null};},
+                token:function(stream,state){
+                        return (state.tokenize||tokenPerl)(stream,state);},
+                electricChars:"{}"};});
 
 CodeMirror.defineMIME("text/x-perl", "perl");
 
 // it's like "peek", but need for look-ahead or look-behind if index < 0
 CodeMirror.StringStream.prototype.look=function(c){
-	return this.string.charAt(this.pos+(c||0));};
+        return this.string.charAt(this.pos+(c||0));};
 
 // return a part of prefix of current stream from current position
 CodeMirror.StringStream.prototype.prefix=function(c){
-	if(c){
-		var x=this.pos-c;
-		return this.string.substr((x>=0?x:0),c);}
-	else{
-		return this.string.substr(0,this.pos-1);}};
+        if(c){
+                var x=this.pos-c;
+                return this.string.substr((x>=0?x:0),c);}
+        else{
+                return this.string.substr(0,this.pos-1);}};
 
 // return a part of suffix of current stream from current position
 CodeMirror.StringStream.prototype.suffix=function(c){
-	var y=this.string.length;
-	var x=y-this.pos+1;
-	return this.string.substr(this.pos,(c&&c<y?c:x));};
+        var y=this.string.length;
+        var x=y-this.pos+1;
+        return this.string.substr(this.pos,(c&&c<y?c:x));};
 
 // return a part of suffix of current stream from current position and change current position
 CodeMirror.StringStream.prototype.nsuffix=function(c){
-	var p=this.pos;
-	var l=c||(this.string.length-this.pos+1);
-	this.pos+=l;
-	return this.string.substr(p,l);};
+        var p=this.pos;
+        var l=c||(this.string.length-this.pos+1);
+        this.pos+=l;
+        return this.string.substr(p,l);};
 
 // eating and vomiting a part of stream from current position
 CodeMirror.StringStream.prototype.eatSuffix=function(c){
-	var x=this.pos+c;
-	var y;
-	if(x<=0)
-		this.pos=0;
-	else if(x>=(y=this.string.length-1))
-		this.pos=y;
-	else
-		this.pos=x;};
+        var x=this.pos+c;
+        var y;
+        if(x<=0)
+                this.pos=0;
+        else if(x>=(y=this.string.length-1))
+                this.pos=y;
+        else
+                this.pos=x;};
diff --git a/mode/pig/pig.js b/mode/pig/pig.js
index f8818a9b..c2f611a1 100644
--- a/mode/pig/pig.js
+++ b/mode/pig/pig.js
@@ -1,171 +1,171 @@
 /*
- *	Pig Latin Mode for CodeMirror 2 
- *	@author Prasanth Jayachandran
- *	@link 	https://github.com/prasanthj/pig-codemirror-2
+ *      Pig Latin Mode for CodeMirror 2
+ *      @author Prasanth Jayachandran
+ *      @link   https://github.com/prasanthj/pig-codemirror-2
  *  This implementation is adapted from PL/SQL mode in CodeMirror 2.
-*/
+ */
 CodeMirror.defineMode("pig", function(_config, parserConfig) {
-	var keywords = parserConfig.keywords,
-		builtins = parserConfig.builtins,
-		types = parserConfig.types,
-		multiLineStrings = parserConfig.multiLineStrings;
-	
-	var isOperatorChar = /[*+\-%<>=&?:\/!|]/;
-	
-	function chain(stream, state, f) {
-		state.tokenize = f;
-		return f(stream, state);
-	}
-	
-	var type;
-	function ret(tp, style) {
-		type = tp;
-		return style;
-	}
-	
-	function tokenComment(stream, state) {
-		var isEnd = false;
-		var ch;
-		while(ch = stream.next()) {
-			if(ch == "/" && isEnd) {
-				state.tokenize = tokenBase;
-				break;
-			}
-			isEnd = (ch == "*");
-		}
-		return ret("comment", "comment");
-	}
-	
-	function tokenString(quote) {
-		return function(stream, state) {
-			var escaped = false, next, end = false;
-			while((next = stream.next()) != null) {
-				if (next == quote && !escaped) {
-					end = true; break;
-				}
-				escaped = !escaped && next == "\\";
-			}
-			if (end || !(escaped || multiLineStrings))
-				state.tokenize = tokenBase;
-			return ret("string", "error");
-		};
-	}
-	
-	function tokenBase(stream, state) {
-		var ch = stream.next();
-		
-		// is a start of string?
-		if (ch == '"' || ch == "'")
-			return chain(stream, state, tokenString(ch));
-		// is it one of the special chars
-		else if(/[\[\]{}\(\),;\.]/.test(ch))
-			return ret(ch);
-		// is it a number?
-		else if(/\d/.test(ch)) {
-			stream.eatWhile(/[\w\.]/);
-			return ret("number", "number");
-		}
-		// multi line comment or operator
-		else if (ch == "/") {
-			if (stream.eat("*")) {
-				return chain(stream, state, tokenComment);
-			}
-			else {
-				stream.eatWhile(isOperatorChar);
-				return ret("operator", "operator");
-			}
-		}
-		// single line comment or operator
-		else if (ch=="-") {
-			if(stream.eat("-")){
-				stream.skipToEnd();
-				return ret("comment", "comment");
-			}
-			else {
-				stream.eatWhile(isOperatorChar);
-				return ret("operator", "operator");
-			}
-		}
-		// is it an operator
-		else if (isOperatorChar.test(ch)) {
-			stream.eatWhile(isOperatorChar);
-			return ret("operator", "operator");
-		}
-		else {
-			// get the while word
-			stream.eatWhile(/[\w\$_]/);
-			// is it one of the listed keywords?
-			if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) {
-				if (stream.eat(")") || stream.eat(".")) {
-					//keywords can be used as variables like flatten(group), group.$0 etc..
-				}
-				else {
-					return ("keyword", "keyword");
-				}
-			}
-			// is it one of the builtin functions?
-			if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase()))
-			{
-				return ("keyword", "variable-2");
-			}
-			// is it one of the listed types?
-			if (types && types.propertyIsEnumerable(stream.current().toUpperCase()))
-				return ("keyword", "variable-3");
-			// default is a 'variable'
-			return ret("variable", "pig-word");
-		}
-	}
-	
-	// Interface
-	return {
-		startState: function() {
-			return {
-				tokenize: tokenBase,
-				startOfLine: true
-			};
-		},
-		
-		token: function(stream, state) {
-			if(stream.eatSpace()) return null;
-			var style = state.tokenize(stream, state);
-			return style;
-		}
-	};
+  var keywords = parserConfig.keywords,
+  builtins = parserConfig.builtins,
+  types = parserConfig.types,
+  multiLineStrings = parserConfig.multiLineStrings;
+
+  var isOperatorChar = /[*+\-%<>=&?:\/!|]/;
+
+  function chain(stream, state, f) {
+    state.tokenize = f;
+    return f(stream, state);
+  }
+
+  var type;
+  function ret(tp, style) {
+    type = tp;
+    return style;
+  }
+
+  function tokenComment(stream, state) {
+    var isEnd = false;
+    var ch;
+    while(ch = stream.next()) {
+      if(ch == "/" && isEnd) {
+        state.tokenize = tokenBase;
+        break;
+      }
+      isEnd = (ch == "*");
+    }
+    return ret("comment", "comment");
+  }
+
+  function tokenString(quote) {
+    return function(stream, state) {
+      var escaped = false, next, end = false;
+      while((next = stream.next()) != null) {
+        if (next == quote && !escaped) {
+          end = true; break;
+        }
+        escaped = !escaped && next == "\\";
+      }
+      if (end || !(escaped || multiLineStrings))
+        state.tokenize = tokenBase;
+      return ret("string", "error");
+    };
+  }
+
+  function tokenBase(stream, state) {
+    var ch = stream.next();
+
+    // is a start of string?
+    if (ch == '"' || ch == "'")
+      return chain(stream, state, tokenString(ch));
+    // is it one of the special chars
+    else if(/[\[\]{}\(\),;\.]/.test(ch))
+      return ret(ch);
+    // is it a number?
+    else if(/\d/.test(ch)) {
+      stream.eatWhile(/[\w\.]/);
+      return ret("number", "number");
+    }
+    // multi line comment or operator
+    else if (ch == "/") {
+      if (stream.eat("*")) {
+        return chain(stream, state, tokenComment);
+      }
+      else {
+        stream.eatWhile(isOperatorChar);
+        return ret("operator", "operator");
+      }
+    }
+    // single line comment or operator
+    else if (ch=="-") {
+      if(stream.eat("-")){
+        stream.skipToEnd();
+        return ret("comment", "comment");
+      }
+      else {
+        stream.eatWhile(isOperatorChar);
+        return ret("operator", "operator");
+      }
+    }
+    // is it an operator
+    else if (isOperatorChar.test(ch)) {
+      stream.eatWhile(isOperatorChar);
+      return ret("operator", "operator");
+    }
+    else {
+      // get the while word
+      stream.eatWhile(/[\w\$_]/);
+      // is it one of the listed keywords?
+      if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) {
+        if (stream.eat(")") || stream.eat(".")) {
+          //keywords can be used as variables like flatten(group), group.$0 etc..
+        }
+        else {
+          return ("keyword", "keyword");
+        }
+      }
+      // is it one of the builtin functions?
+      if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase()))
+      {
+        return ("keyword", "variable-2");
+      }
+      // is it one of the listed types?
+      if (types && types.propertyIsEnumerable(stream.current().toUpperCase()))
+        return ("keyword", "variable-3");
+      // default is a 'variable'
+      return ret("variable", "pig-word");
+    }
+  }
+
+  // Interface
+  return {
+    startState: function() {
+      return {
+        tokenize: tokenBase,
+        startOfLine: true
+      };
+    },
+
+    token: function(stream, state) {
+      if(stream.eatSpace()) return null;
+      var style = state.tokenize(stream, state);
+      return style;
+    }
+  };
 });
 
 (function() {
-	function keywords(str) {
-		var obj = {}, words = str.split(" ");
-		for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
- 		return obj;
- 	}
+  function keywords(str) {
+    var obj = {}, words = str.split(" ");
+    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
+    return obj;
+  }
+
+  // builtin funcs taken from trunk revision 1303237
+  var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL "
+    + "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS "
+    + "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG "
+    + "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN "
+    + "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER "
+    + "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS "
+    + "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA  "
+    + "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE "
+    + "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG "
+    + "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER ";
+
+  // taken from QueryLexer.g
+  var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP "
+    + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL "
+    + "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE "
+    + "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE "
+    + "NEQ MATCHES TRUE FALSE ";
+
+  // data types
+  var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP ";
 
-	// builtin funcs taken from trunk revision 1303237
-	var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL " 
-	+ "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS "
-	+ "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG "
-	+ "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN "
-	+ "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER "
-	+ "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS "
-	+ "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA  "
-	+ "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE "
-	+ "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG "
-	+ "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER "; 
-	
-	// taken from QueryLexer.g
-	var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP "
-	+ "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL "
-	+ "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE "
-	+ "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE " 
-	+ "NEQ MATCHES TRUE FALSE "; 
-	
-	// data types
-	var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP ";
-	
-	CodeMirror.defineMIME("text/x-pig", {
-	 name: "pig",
-	 builtins: keywords(pBuiltins),
-	 keywords: keywords(pKeywords),
-	 types: keywords(pTypes)
-	 });
+  CodeMirror.defineMIME("text/x-pig", {
+    name: "pig",
+    builtins: keywords(pBuiltins),
+    keywords: keywords(pKeywords),
+    types: keywords(pTypes)
+  });
 }());
diff --git a/mode/smalltalk/smalltalk.js b/mode/smalltalk/smalltalk.js
index 33ea11ea..f8c9026b 100644
--- a/mode/smalltalk/smalltalk.js
+++ b/mode/smalltalk/smalltalk.js
@@ -1,139 +1,139 @@
 CodeMirror.defineMode('smalltalk', function(config) {
 
-	var specialChars = /[+\-/\\*~<>=@%|&?!.:;^]/;
-	var keywords = /true|false|nil|self|super|thisContext/;
-
-	var Context = function(tokenizer, parent) {
-		this.next = tokenizer;
-		this.parent = parent;
-	};
-
-	var Token = function(name, context, eos) {
-		this.name = name;
-		this.context = context;
-		this.eos = eos;
-	};
-
-	var State = function() {
-		this.context = new Context(next, null);
-		this.expectVariable = true;
-		this.indentation = 0;
-		this.userIndentationDelta = 0;
-	};
-
-	State.prototype.userIndent = function(indentation) {
-		this.userIndentationDelta = indentation > 0 ? (indentation / config.indentUnit - this.indentation) : 0;
-	};
-
-	var next = function(stream, context, state) {
-		var token = new Token(null, context, false);
-		var aChar = stream.next();
-
-		if (aChar === '"') {
-			token = nextComment(stream, new Context(nextComment, context));
-
-		} else if (aChar === '\'') {
-			token = nextString(stream, new Context(nextString, context));
-
-		} else if (aChar === '#') {
-			stream.eatWhile(/[^ .]/);
-			token.name = 'string-2';
-
-		} else if (aChar === '$') {
-			stream.eatWhile(/[^ ]/);
-			token.name = 'string-2';
-
-		} else if (aChar === '|' && state.expectVariable) {
-			token.context = new Context(nextTemporaries, context);
-
-		} else if (/[\[\]{}()]/.test(aChar)) {
-			token.name = 'bracket';
-			token.eos = /[\[{(]/.test(aChar);
-
-			if (aChar === '[') {
-				state.indentation++;
-			} else if (aChar === ']') {
-				state.indentation = Math.max(0, state.indentation - 1);
-			}
-
-		} else if (specialChars.test(aChar)) {
-			stream.eatWhile(specialChars);
-			token.name = 'operator';
-			token.eos = aChar !== ';'; // ; cascaded message expression
-
-		} else if (/\d/.test(aChar)) {
-			stream.eatWhile(/[\w\d]/);
-			token.name = 'number';
-
-		} else if (/[\w_]/.test(aChar)) {
-			stream.eatWhile(/[\w\d_]/);
-			token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null;
-
-		} else {
-			token.eos = state.expectVariable;
-		}
-
-		return token;
-	};
-
-	var nextComment = function(stream, context) {
-		stream.eatWhile(/[^"]/);
-		return new Token('comment', stream.eat('"') ? context.parent : context, true);
-	};
-
-	var nextString = function(stream, context) {
-		stream.eatWhile(/[^']/);
-		return new Token('string', stream.eat('\'') ? context.parent : context, false);
-	};
-
-	var nextTemporaries = function(stream, context) {
-		var token = new Token(null, context, false);
-		var aChar = stream.next();
-
-		if (aChar === '|') {
-			token.context = context.parent;
-			token.eos = true;
-
-		} else {
-			stream.eatWhile(/[^|]/);
-			token.name = 'variable';
-		}
-
-		return token;
-	};
-
-	return {
-		startState: function() {
-			return new State;
-		},
-
-		token: function(stream, state) {
-			state.userIndent(stream.indentation());
-
-			if (stream.eatSpace()) {
-				return null;
-			}
+  var specialChars = /[+\-\/\\*~<>=@%|&?!.:;^]/;
+  var keywords = /true|false|nil|self|super|thisContext/;
+
+  var Context = function(tokenizer, parent) {
+    this.next = tokenizer;
+    this.parent = parent;
+  };
+
+  var Token = function(name, context, eos) {
+    this.name = name;
+    this.context = context;
+    this.eos = eos;
+  };
+
+  var State = function() {
+    this.context = new Context(next, null);
+    this.expectVariable = true;
+    this.indentation = 0;
+    this.userIndentationDelta = 0;
+  };
+
+  State.prototype.userIndent = function(indentation) {
+    this.userIndentationDelta = indentation > 0 ? (indentation / config.indentUnit - this.indentation) : 0;
+  };
+
+  var next = function(stream, context, state) {
+    var token = new Token(null, context, false);
+    var aChar = stream.next();
+
+    if (aChar === '"') {
+      token = nextComment(stream, new Context(nextComment, context));
+
+    } else if (aChar === '\'') {
+      token = nextString(stream, new Context(nextString, context));
+
+    } else if (aChar === '#') {
+      stream.eatWhile(/[^ .]/);
+      token.name = 'string-2';
+
+    } else if (aChar === '$') {
+      stream.eatWhile(/[^ ]/);
+      token.name = 'string-2';
+
+    } else if (aChar === '|' && state.expectVariable) {
+      token.context = new Context(nextTemporaries, context);
+
+    } else if (/[\[\]{}()]/.test(aChar)) {
+      token.name = 'bracket';
+      token.eos = /[\[{(]/.test(aChar);
+
+      if (aChar === '[') {
+        state.indentation++;
+      } else if (aChar === ']') {
+        state.indentation = Math.max(0, state.indentation - 1);
+      }
+
+    } else if (specialChars.test(aChar)) {
+      stream.eatWhile(specialChars);
+      token.name = 'operator';
+      token.eos = aChar !== ';'; // ; cascaded message expression
+
+    } else if (/\d/.test(aChar)) {
+      stream.eatWhile(/[\w\d]/);
+      token.name = 'number';
+
+    } else if (/[\w_]/.test(aChar)) {
+      stream.eatWhile(/[\w\d_]/);
+      token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null;
+
+    } else {
+      token.eos = state.expectVariable;
+    }
+
+    return token;
+  };
+
+  var nextComment = function(stream, context) {
+    stream.eatWhile(/[^"]/);
+    return new Token('comment', stream.eat('"') ? context.parent : context, true);
+  };
+
+  var nextString = function(stream, context) {
+    stream.eatWhile(/[^']/);
+    return new Token('string', stream.eat('\'') ? context.parent : context, false);
+  };
+
+  var nextTemporaries = function(stream, context) {
+    var token = new Token(null, context, false);
+    var aChar = stream.next();
+
+    if (aChar === '|') {
+      token.context = context.parent;
+      token.eos = true;
+
+    } else {
+      stream.eatWhile(/[^|]/);
+      token.name = 'variable';
+    }
+
+    return token;
+  };
+
+  return {
+    startState: function() {
+      return new State;
+    },
+
+    token: function(stream, state) {
+      state.userIndent(stream.indentation());
+
+      if (stream.eatSpace()) {
+        return null;
+      }
 
-			var token = state.context.next(stream, state.context, state);
-			state.context = token.context;
-			state.expectVariable = token.eos;
+      var token = state.context.next(stream, state.context, state);
+      state.context = token.context;
+      state.expectVariable = token.eos;
 
-			state.lastToken = token;
-			return token.name;
-		},
+      state.lastToken = token;
+      return token.name;
+    },
 
-		blankLine: function(state) {
-			state.userIndent(0);
-		},
+    blankLine: function(state) {
+      state.userIndent(0);
+    },
 
-		indent: function(state, textAfter) {
-			var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta;
-			return (state.indentation + i) * config.indentUnit;
-		},
+    indent: function(state, textAfter) {
+      var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta;
+      return (state.indentation + i) * config.indentUnit;
+    },
 
-		electricChars: ']'
-	};
+    electricChars: ']'
+  };
 
 });
 
-CodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'});
\ No newline at end of file
+CodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'});
diff --git a/mode/smarty/smarty.js b/mode/smarty/smarty.js
index 9ee1e485..7d7e62f8 100644
--- a/mode/smarty/smarty.js
+++ b/mode/smarty/smarty.js
@@ -88,7 +88,7 @@ CodeMirror.defineMode("smarty", function(config) {
 
       var str = "";
       if (ch != "/") {
-    	str += ch;
+        str += ch;
       }
       var c = "";
       while ((c = stream.eat(regs.validIdentifier))) {
@@ -101,7 +101,7 @@ CodeMirror.defineMode("smarty", function(config) {
         }
       }
       if (/\s/.test(ch)) {
-    	return null;
+        return null;
       }
       return ret("tag", "tag");
     }
@@ -145,4 +145,4 @@ CodeMirror.defineMode("smarty", function(config) {
   };
 });
 
-CodeMirror.defineMIME("text/x-smarty", "smarty");
\ No newline at end of file
+CodeMirror.defineMIME("text/x-smarty", "smarty");
diff --git a/mode/tiddlywiki/tiddlywiki.js b/mode/tiddlywiki/tiddlywiki.js
index 0d506ee6..24a24786 100644
--- a/mode/tiddlywiki/tiddlywiki.js
+++ b/mode/tiddlywiki/tiddlywiki.js
@@ -1,352 +1,352 @@
 /***
-|''Name''|tiddlywiki.js|
-|''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror|
-|''Author''|PMario|
-|''Version''|0.1.7|
-|''Status''|''stable''|
-|''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]|
-|''Documentation''|http://codemirror.tiddlyspace.com/|
-|''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]|
-|''CoreVersion''|2.5.0|
-|''Requires''|codemirror.js|
-|''Keywords''|syntax highlighting color code mirror codemirror|
-! Info
-CoreVersion parameter is needed for TiddlyWiki only!
+    |''Name''|tiddlywiki.js|
+    |''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror|
+    |''Author''|PMario|
+    |''Version''|0.1.7|
+    |''Status''|''stable''|
+    |''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]|
+    |''Documentation''|http://codemirror.tiddlyspace.com/|
+    |''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]|
+    |''CoreVersion''|2.5.0|
+    |''Requires''|codemirror.js|
+    |''Keywords''|syntax highlighting color code mirror codemirror|
+    ! Info
+    CoreVersion parameter is needed for TiddlyWiki only!
 ***/
 //{{{
 CodeMirror.defineMode("tiddlywiki", function () {
-	// Tokenizer
-	var textwords = {};
-
-	var keywords = function () {
-		function kw(type) {
-			return { type: type, style: "macro"};
-		}
-		return {
-			"allTags": kw('allTags'), "closeAll": kw('closeAll'), "list": kw('list'),
-			"newJournal": kw('newJournal'), "newTiddler": kw('newTiddler'),
-			"permaview": kw('permaview'), "saveChanges": kw('saveChanges'),
-			"search": kw('search'), "slider": kw('slider'),	"tabs": kw('tabs'),
-			"tag": kw('tag'), "tagging": kw('tagging'),	"tags": kw('tags'),
-			"tiddler": kw('tiddler'), "timeline": kw('timeline'),
-			"today": kw('today'), "version": kw('version'),	"option": kw('option'),
-
-			"with": kw('with'),
-			"filter": kw('filter')
-		};
-	}();
-
-	var isSpaceName = /[\w_\-]/i,
-		reHR = /^\-\-\-\-+$/,					// <hr>
-		reWikiCommentStart = /^\/\*\*\*$/,		// /***
-		reWikiCommentStop = /^\*\*\*\/$/,		// ***/
-		reBlockQuote = /^<<<$/,
-
-		reJsCodeStart = /^\/\/\{\{\{$/,			// //{{{ js block start
-		reJsCodeStop = /^\/\/\}\}\}$/,			// //}}} js stop
-		reXmlCodeStart = /^<!--\{\{\{-->$/,		// xml block start
-		reXmlCodeStop = /^<!--\}\}\}-->$/,		// xml stop
-
-		reCodeBlockStart = /^\{\{\{$/,			// {{{ TW text div block start
-		reCodeBlockStop = /^\}\}\}$/,			// }}} TW text stop
-
-		reUntilCodeStop = /.*?\}\}\}/;
-
-	function chain(stream, state, f) {
-		state.tokenize = f;
-		return f(stream, state);
-	}
-
-	// Used as scratch variables to communicate multiple values without
-	// consing up tons of objects.
-	var type, content;
-
-	function ret(tp, style, cont) {
-		type = tp;
-		content = cont;
-		return style;
-	}
-
-	function jsTokenBase(stream, state) {
-		var sol = stream.sol(), ch;
-			
-		state.block = false;	// indicates the start of a code block.
-
-		ch = stream.peek(); 	// don't eat, to make matching simpler
-		
-		// check start of  blocks
-		if (sol && /[<\/\*{}\-]/.test(ch)) {
-			if (stream.match(reCodeBlockStart)) {
-				state.block = true;
-				return chain(stream, state, twTokenCode);
-			}
-			if (stream.match(reBlockQuote)) {
-				return ret('quote', 'quote');
-			}
-			if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop)) {
-				return ret('code', 'comment');
-			}
-			if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop)) {
-				return ret('code', 'comment');
-			}
-			if (stream.match(reHR)) {
-				return ret('hr', 'hr');
-			}
-		} // sol
-		ch = stream.next();
-
-		if (sol && /[\/\*!#;:>|]/.test(ch)) {
-			if (ch == "!") { // tw header
-				stream.skipToEnd();
-				return ret("header", "header");
-			}
-			if (ch == "*") { // tw list
-				stream.eatWhile('*');
-				return ret("list", "comment");
-			}
-			if (ch == "#") { // tw numbered list
-				stream.eatWhile('#');
-				return ret("list", "comment");
-			}
-			if (ch == ";") { // definition list, term
-				stream.eatWhile(';');
-				return ret("list", "comment");
-			}
-			if (ch == ":") { // definition list, description
-				stream.eatWhile(':');
-				return ret("list", "comment");
-			}
-			if (ch == ">") { // single line quote
-				stream.eatWhile(">");
-				return ret("quote", "quote");
-			}
-			if (ch == '|') {
-				return ret('table', 'header');
-			}
-		}
-
-		if (ch == '{' && stream.match(/\{\{/)) {
-			return chain(stream, state, twTokenCode);
-		}
-
-		// rudimentary html:// file:// link matching. TW knows much more ...
-		if (/[hf]/i.test(ch)) {
-			if (/[ti]/i.test(stream.peek()) && stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i)) {
-				return ret("link", "link");
-			}
-		}
-		// just a little string indicator, don't want to have the whole string covered
-		if (ch == '"') {
-			return ret('string', 'string');
-		}
-		if (ch == '~') {	// _no_ CamelCase indicator should be bold
-			return ret('text', 'brace');
-		}
-		if (/[\[\]]/.test(ch)) { // check for [[..]]
-			if (stream.peek() == ch) {
-				stream.next();
-				return ret('brace', 'brace');
-			}
-		}
-		if (ch == "@") {	// check for space link. TODO fix @@...@@ highlighting
-			stream.eatWhile(isSpaceName);
-			return ret("link", "link");
-		}
-		if (/\d/.test(ch)) {	// numbers
-			stream.eatWhile(/\d/);
-			return ret("number", "number");
-		}
-		if (ch == "/") { // tw invisible comment
-			if (stream.eat("%")) {
-				return chain(stream, state, twTokenComment);
-			}
-			else if (stream.eat("/")) { // 
-				return chain(stream, state, twTokenEm);
-			}
-		}
-		if (ch == "_") { // tw underline
-			if (stream.eat("_")) {
-				return chain(stream, state, twTokenUnderline);
-			}
-		}
-		// strikethrough and mdash handling
-		if (ch == "-") {
-			if (stream.eat("-")) {
-				// if strikethrough looks ugly, change CSS.
-				if (stream.peek() != ' ')
-					return chain(stream, state, twTokenStrike);
-				// mdash
-				if (stream.peek() == ' ')
-					return ret('text', 'brace');
-			}
-		}
-		if (ch == "'") { // tw bold
-			if (stream.eat("'")) {
-				return chain(stream, state, twTokenStrong);
-			}
-		}
-		if (ch == "<") { // tw macro
-			if (stream.eat("<")) {
-				return chain(stream, state, twTokenMacro);
-			}
-		}
-		else {
-			return ret(ch);
-		}
-
-		// core macro handling
-		stream.eatWhile(/[\w\$_]/);
-		var word = stream.current(),
-			known = textwords.propertyIsEnumerable(word) && textwords[word];
-
-		return known ? ret(known.type, known.style, word) : ret("text", null, word);
-
-	} // jsTokenBase()
-
-	// tw invisible comment
-	function twTokenComment(stream, state) {
-		var maybeEnd = false,
-			ch;
-		while (ch = stream.next()) {
-			if (ch == "/" && maybeEnd) {
-				state.tokenize = jsTokenBase;
-				break;
-			}
-			maybeEnd = (ch == "%");
-		}
-		return ret("comment", "comment");
-	}
-
-	// tw strong / bold
-	function twTokenStrong(stream, state) {
-		var maybeEnd = false,
-			ch;
-		while (ch = stream.next()) {
-			if (ch == "'" && maybeEnd) {
-				state.tokenize = jsTokenBase;
-				break;
-			}
-			maybeEnd = (ch == "'");
-		}
-		return ret("text", "strong");
-	}
-
-	// tw code
-	function twTokenCode(stream, state) {
-		var ch, sb = state.block;
-		
-		if (sb && stream.current()) {
-			return ret("code", "comment");
-		}
-
-		if (!sb && stream.match(reUntilCodeStop)) {
-			state.tokenize = jsTokenBase;
-			return ret("code", "comment");
-		}
-
-		if (sb && stream.sol() && stream.match(reCodeBlockStop)) {
-			state.tokenize = jsTokenBase;
-			return ret("code", "comment");
-		}
-
-		ch = stream.next();
-		return (sb) ? ret("code", "comment") : ret("code", "comment");
-	}
-
-	// tw em / italic
-	function twTokenEm(stream, state) {
-		var maybeEnd = false,
-			ch;
-		while (ch = stream.next()) {
-			if (ch == "/" && maybeEnd) {
-				state.tokenize = jsTokenBase;
-				break;
-			}
-			maybeEnd = (ch == "/");
-		}
-		return ret("text", "em");
-	}
-
-	// tw underlined text
-	function twTokenUnderline(stream, state) {
-		var maybeEnd = false,
-			ch;
-		while (ch = stream.next()) {
-			if (ch == "_" && maybeEnd) {
-				state.tokenize = jsTokenBase;
-				break;
-			}
-			maybeEnd = (ch == "_");
-		}
-		return ret("text", "underlined");
-	}
-
-	// tw strike through text looks ugly
-	// change CSS if needed
-	function twTokenStrike(stream, state) {
-		var maybeEnd = false, ch;
-			
-		while (ch = stream.next()) {
-			if (ch == "-" && maybeEnd) {
-				state.tokenize = jsTokenBase;
-				break;
-			}
-			maybeEnd = (ch == "-");
-		}
-		return ret("text", "strikethrough");
-	}
-
-	// macro
-	function twTokenMacro(stream, state) {
-		var ch, word, known;
-
-		if (stream.current() == '<<') {
-			return ret('brace', 'macro');
-		}
-
-		ch = stream.next();
-		if (!ch) {
-			state.tokenize = jsTokenBase;
-			return ret(ch);
-		}
-		if (ch == ">") {
-			if (stream.peek() == '>') {
-				stream.next();
-				state.tokenize = jsTokenBase;
-				return ret("brace", "macro");
-			}
-		}
-
-		stream.eatWhile(/[\w\$_]/);
-		word = stream.current();
-		known = keywords.propertyIsEnumerable(word) && keywords[word];
-
-		if (known) {
-			return ret(known.type, known.style, word);
-		}
-		else {
-			return ret("macro", null, word);
-		}
-	}
-
-	// Interface
-	return {
-		startState: function () {
-			return {
-				tokenize: jsTokenBase,
-				indented: 0,
-				level: 0
-			};
-		},
-
-		token: function (stream, state) {
-			if (stream.eatSpace()) return null;
-			var style = state.tokenize(stream, state);
-			return style;
-		},
-
-		electricChars: ""
-	};
+  // Tokenizer
+  var textwords = {};
+
+  var keywords = function () {
+    function kw(type) {
+      return { type: type, style: "macro"};
+    }
+    return {
+      "allTags": kw('allTags'), "closeAll": kw('closeAll'), "list": kw('list'),
+      "newJournal": kw('newJournal'), "newTiddler": kw('newTiddler'),
+      "permaview": kw('permaview'), "saveChanges": kw('saveChanges'),
+      "search": kw('search'), "slider": kw('slider'),   "tabs": kw('tabs'),
+      "tag": kw('tag'), "tagging": kw('tagging'),       "tags": kw('tags'),
+      "tiddler": kw('tiddler'), "timeline": kw('timeline'),
+      "today": kw('today'), "version": kw('version'),   "option": kw('option'),
+
+      "with": kw('with'),
+      "filter": kw('filter')
+    };
+  }();
+
+  var isSpaceName = /[\w_\-]/i,
+  reHR = /^\-\-\-\-+$/,                                 // <hr>
+  reWikiCommentStart = /^\/\*\*\*$/,            // /***
+  reWikiCommentStop = /^\*\*\*\/$/,             // ***/
+  reBlockQuote = /^<<<$/,
+
+  reJsCodeStart = /^\/\/\{\{\{$/,                       // //{{{ js block start
+  reJsCodeStop = /^\/\/\}\}\}$/,                        // //}}} js stop
+  reXmlCodeStart = /^<!--\{\{\{-->$/,           // xml block start
+  reXmlCodeStop = /^<!--\}\}\}-->$/,            // xml stop
+
+  reCodeBlockStart = /^\{\{\{$/,                        // {{{ TW text div block start
+  reCodeBlockStop = /^\}\}\}$/,                 // }}} TW text stop
+
+  reUntilCodeStop = /.*?\}\}\}/;
+
+  function chain(stream, state, f) {
+    state.tokenize = f;
+    return f(stream, state);
+  }
+
+  // Used as scratch variables to communicate multiple values without
+  // consing up tons of objects.
+  var type, content;
+
+  function ret(tp, style, cont) {
+    type = tp;
+    content = cont;
+    return style;
+  }
+
+  function jsTokenBase(stream, state) {
+    var sol = stream.sol(), ch;
+
+    state.block = false;        // indicates the start of a code block.
+
+    ch = stream.peek();         // don't eat, to make matching simpler
+
+    // check start of  blocks
+    if (sol && /[<\/\*{}\-]/.test(ch)) {
+      if (stream.match(reCodeBlockStart)) {
+        state.block = true;
+        return chain(stream, state, twTokenCode);
+      }
+      if (stream.match(reBlockQuote)) {
+        return ret('quote', 'quote');
+      }
+      if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop)) {
+        return ret('code', 'comment');
+      }
+      if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop)) {
+        return ret('code', 'comment');
+      }
+      if (stream.match(reHR)) {
+        return ret('hr', 'hr');
+      }
+    } // sol
+    ch = stream.next();
+
+    if (sol && /[\/\*!#;:>|]/.test(ch)) {
+      if (ch == "!") { // tw header
+        stream.skipToEnd();
+        return ret("header", "header");
+      }
+      if (ch == "*") { // tw list
+        stream.eatWhile('*');
+        return ret("list", "comment");
+      }
+      if (ch == "#") { // tw numbered list
+        stream.eatWhile('#');
+        return ret("list", "comment");
+      }
+      if (ch == ";") { // definition list, term
+        stream.eatWhile(';');
+        return ret("list", "comment");
+      }
+      if (ch == ":") { // definition list, description
+        stream.eatWhile(':');
+        return ret("list", "comment");
+      }
+      if (ch == ">") { // single line quote
+        stream.eatWhile(">");
+        return ret("quote", "quote");
+      }
+      if (ch == '|') {
+        return ret('table', 'header');
+      }
+    }
+
+    if (ch == '{' && stream.match(/\{\{/)) {
+      return chain(stream, state, twTokenCode);
+    }
+
+    // rudimentary html:// file:// link matching. TW knows much more ...
+    if (/[hf]/i.test(ch)) {
+      if (/[ti]/i.test(stream.peek()) && stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i)) {
+        return ret("link", "link");
+      }
+    }
+    // just a little string indicator, don't want to have the whole string covered
+    if (ch == '"') {
+      return ret('string', 'string');
+    }
+    if (ch == '~') {    // _no_ CamelCase indicator should be bold
+      return ret('text', 'brace');
+    }
+    if (/[\[\]]/.test(ch)) { // check for [[..]]
+      if (stream.peek() == ch) {
+        stream.next();
+        return ret('brace', 'brace');
+      }
+    }
+    if (ch == "@") {    // check for space link. TODO fix @@...@@ highlighting
+      stream.eatWhile(isSpaceName);
+      return ret("link", "link");
+    }
+    if (/\d/.test(ch)) {        // numbers
+      stream.eatWhile(/\d/);
+      return ret("number", "number");
+    }
+    if (ch == "/") { // tw invisible comment
+      if (stream.eat("%")) {
+        return chain(stream, state, twTokenComment);
+      }
+      else if (stream.eat("/")) { //
+        return chain(stream, state, twTokenEm);
+      }
+    }
+    if (ch == "_") { // tw underline
+      if (stream.eat("_")) {
+        return chain(stream, state, twTokenUnderline);
+      }
+    }
+    // strikethrough and mdash handling
+    if (ch == "-") {
+      if (stream.eat("-")) {
+        // if strikethrough looks ugly, change CSS.
+        if (stream.peek() != ' ')
+          return chain(stream, state, twTokenStrike);
+        // mdash
+        if (stream.peek() == ' ')
+          return ret('text', 'brace');
+      }
+    }
+    if (ch == "'") { // tw bold
+      if (stream.eat("'")) {
+        return chain(stream, state, twTokenStrong);
+      }
+    }
+    if (ch == "<") { // tw macro
+      if (stream.eat("<")) {
+        return chain(stream, state, twTokenMacro);
+      }
+    }
+    else {
+      return ret(ch);
+    }
+
+    // core macro handling
+    stream.eatWhile(/[\w\$_]/);
+    var word = stream.current(),
+    known = textwords.propertyIsEnumerable(word) && textwords[word];
+
+    return known ? ret(known.type, known.style, word) : ret("text", null, word);
+
+  } // jsTokenBase()
+
+  // tw invisible comment
+  function twTokenComment(stream, state) {
+    var maybeEnd = false,
+    ch;
+    while (ch = stream.next()) {
+      if (ch == "/" && maybeEnd) {
+        state.tokenize = jsTokenBase;
+        break;
+      }
+      maybeEnd = (ch == "%");
+    }
+    return ret("comment", "comment");
+  }
+
+  // tw strong / bold
+  function twTokenStrong(stream, state) {
+    var maybeEnd = false,
+    ch;
+    while (ch = stream.next()) {
+      if (ch == "'" && maybeEnd) {
+        state.tokenize = jsTokenBase;
+        break;
+      }
+      maybeEnd = (ch == "'");
+    }
+    return ret("text", "strong");
+  }
+
+  // tw code
+  function twTokenCode(stream, state) {
+    var ch, sb = state.block;
+
+    if (sb && stream.current()) {
+      return ret("code", "comment");
+    }
+
+    if (!sb && stream.match(reUntilCodeStop)) {
+      state.tokenize = jsTokenBase;
+      return ret("code", "comment");
+    }
+
+    if (sb && stream.sol() && stream.match(reCodeBlockStop)) {
+      state.tokenize = jsTokenBase;
+      return ret("code", "comment");
+    }
+
+    ch = stream.next();
+    return (sb) ? ret("code", "comment") : ret("code", "comment");
+  }
+
+  // tw em / italic
+  function twTokenEm(stream, state) {
+    var maybeEnd = false,
+    ch;
+    while (ch = stream.next()) {
+      if (ch == "/" && maybeEnd) {
+        state.tokenize = jsTokenBase;
+        break;
+      }
+      maybeEnd = (ch == "/");
+    }
+    return ret("text", "em");
+  }
+
+  // tw underlined text
+  function twTokenUnderline(stream, state) {
+    var maybeEnd = false,
+    ch;
+    while (ch = stream.next()) {
+      if (ch == "_" && maybeEnd) {
+        state.tokenize = jsTokenBase;
+        break;
+      }
+      maybeEnd = (ch == "_");
+    }
+    return ret("text", "underlined");
+  }
+
+  // tw strike through text looks ugly
+  // change CSS if needed
+  function twTokenStrike(stream, state) {
+    var maybeEnd = false, ch;
+
+    while (ch = stream.next()) {
+      if (ch == "-" && maybeEnd) {
+        state.tokenize = jsTokenBase;
+        break;
+      }
+      maybeEnd = (ch == "-");
+    }
+    return ret("text", "strikethrough");
+  }
+
+  // macro
+  function twTokenMacro(stream, state) {
+    var ch, word, known;
+
+    if (stream.current() == '<<') {
+      return ret('brace', 'macro');
+    }
+
+    ch = stream.next();
+    if (!ch) {
+      state.tokenize = jsTokenBase;
+      return ret(ch);
+    }
+    if (ch == ">") {
+      if (stream.peek() == '>') {
+        stream.next();
+        state.tokenize = jsTokenBase;
+        return ret("brace", "macro");
+      }
+    }
+
+    stream.eatWhile(/[\w\$_]/);
+    word = stream.current();
+    known = keywords.propertyIsEnumerable(word) && keywords[word];
+
+    if (known) {
+      return ret(known.type, known.style, word);
+    }
+    else {
+      return ret("macro", null, word);
+    }
+  }
+
+  // Interface
+  return {
+    startState: function () {
+      return {
+        tokenize: jsTokenBase,
+        indented: 0,
+        level: 0
+      };
+    },
+
+    token: function (stream, state) {
+      if (stream.eatSpace()) return null;
+      var style = state.tokenize(stream, state);
+      return style;
+    },
+
+    electricChars: ""
+  };
 });
 
 CodeMirror.defineMIME("text/x-tiddlywiki", "tiddlywiki");
diff --git a/mode/tiki/tiki.js b/mode/tiki/tiki.js
index 81e87ab2..e789163d 100644
--- a/mode/tiki/tiki.js
+++ b/mode/tiki/tiki.js
@@ -1,309 +1,308 @@
 CodeMirror.defineMode('tiki', function(config) {
-	function inBlock(style, terminator, returnTokenizer) {
-		return function(stream, state) {
-			while (!stream.eol()) {
-				if (stream.match(terminator)) {
-					state.tokenize = inText;
-					break;
-				}
-				stream.next();
-			}
-			
-			if (returnTokenizer) state.tokenize = returnTokenizer;
-			
-			return style;
-		};
-	}
-	
-	function inLine(style) {
-		return function(stream, state) {
-			while(!stream.eol()) {
-				stream.next();
-			}
-			state.tokenize = inText;
-			return style;
-		};
-	}
-	
-	function inText(stream, state) {
-		function chain(parser) {
-			state.tokenize = parser;
-			return parser(stream, state);
-		}
-		
-		var sol = stream.sol();
-		var ch = stream.next();
-		
-		//non start of line
-		switch (ch) { //switch is generally much faster than if, so it is used here
-			case "{": //plugin
-				stream.eat("/");
-				stream.eatSpace();
-				var tagName = "";
-				var c;
-				while ((c = stream.eat(/[^\s\u00a0=\"\'\/?(}]/))) tagName += c;
-				state.tokenize = inPlugin;
-				return "tag";
-				break;
-			case "_": //bold
-				if (stream.eat("_")) {
-					return chain(inBlock("strong", "__", inText));
-				}
-				break;
-			case "'": //italics
-				if (stream.eat("'")) {
-					// Italic text
-					return chain(inBlock("em", "''", inText));
-				}
-				break;
-			case "(":// Wiki Link
-				if (stream.eat("(")) {
-					return chain(inBlock("variable-2", "))", inText));
-				}
-				break;
-			case "[":// Weblink
-				return chain(inBlock("variable-3", "]", inText));
-				break;
-			case "|": //table
-				if (stream.eat("|")) {
-					return chain(inBlock("comment", "||"));
-				}
-				break;
-			case "-": 
-				if (stream.eat("=")) {//titleBar
-					return chain(inBlock("header string", "=-", inText));
-				} else if (stream.eat("-")) {//deleted
-					return chain(inBlock("error tw-deleted", "--", inText));
-				}
-				break;
-			case "=": //underline
-				if (stream.match("==")) {
-					return chain(inBlock("tw-underline", "===", inText));
-				}
-				break;
-			case ":":
-				if (stream.eat(":")) {
-					return chain(inBlock("comment", "::"));
-				}
-				break;
-			case "^": //box
-				return chain(inBlock("tw-box", "^"));
-				break;
-			case "~": //np
-				if (stream.match("np~")) {
-					return chain(inBlock("meta", "~/np~"));
-				}
-				break;
-		}
-		
-		//start of line types
-		if (sol) {
-			switch (ch) {
-				case "!": //header at start of line
-					if (stream.match('!!!!!')) {
-						return chain(inLine("header string"));
-					} else if (stream.match('!!!!')) {
-						return chain(inLine("header string"));
-					} else if (stream.match('!!!')) {
-						return chain(inLine("header string"));
-					} else if (stream.match('!!')) {
-						return chain(inLine("header string"));
-					} else {
-						return chain(inLine("header string"));
-					}
-					break;
-				case "*": //unordered list line item, or <li /> at start of line
-				case "#": //ordered list line item, or <li /> at start of line
-				case "+": //ordered list line item, or <li /> at start of line
-					return chain(inLine("tw-listitem bracket"));
-					break;
-			}
-		}
-		
-		//stream.eatWhile(/[&{]/); was eating up plugins, turned off to act less like html and more like tiki
-		return null;
-	}
-	
-	var indentUnit = config.indentUnit;
+  function inBlock(style, terminator, returnTokenizer) {
+    return function(stream, state) {
+      while (!stream.eol()) {
+        if (stream.match(terminator)) {
+          state.tokenize = inText;
+          break;
+        }
+        stream.next();
+      }
 
-	// Return variables for tokenizers
-	var pluginName, type;
-	function inPlugin(stream, state) {
-		var ch = stream.next();
-		var peek = stream.peek();
-		
-		if (ch == "}") {
-			state.tokenize = inText;
-			//type = ch == ")" ? "endPlugin" : "selfclosePlugin"; inPlugin
-			return "tag";
-		} else if (ch == "(" || ch == ")") {
-			return "bracket";
-		} else if (ch == "=") {
-			type = "equals";
-			
-			if (peek == ">") {
-				ch = stream.next();
-				peek = stream.peek();
-			}
-			
-			//here we detect values directly after equal character with no quotes
-			if (!/[\'\"]/.test(peek)) {
-				state.tokenize = inAttributeNoQuote();
-			}
-			//end detect values
-			
-			return "operator";
-		} else if (/[\'\"]/.test(ch)) {
-			state.tokenize = inAttribute(ch);
-			return state.tokenize(stream, state);
-		} else {
-			stream.eatWhile(/[^\s\u00a0=\"\'\/?]/);
-			return "keyword";
-		}
-	}
+      if (returnTokenizer) state.tokenize = returnTokenizer;
 
-	function inAttribute(quote) {
-		return function(stream, state) {
-			while (!stream.eol()) {
-				if (stream.next() == quote) {
-					state.tokenize = inPlugin;
-					break;
-				}
-			}
-			return "string";
-		};
-	}
-	
-	function inAttributeNoQuote() {
-		return function(stream, state) {
-			while (!stream.eol()) {
-				var ch = stream.next();
-				var peek = stream.peek();
-				if (ch == " " || ch == "," || /[ )}]/.test(peek)) {
-					state.tokenize = inPlugin;
-					break;
-				}
-			}
-			return "string";
-		};
-	}
+      return style;
+    };
+  }
 
-	var curState, setStyle;
-	function pass() {
-		for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);
-	}
-	
-	function cont() {
-		pass.apply(null, arguments);
-		return true;
-	}
+  function inLine(style) {
+    return function(stream, state) {
+      while(!stream.eol()) {
+        stream.next();
+      }
+      state.tokenize = inText;
+      return style;
+    };
+  }
 
-	function pushContext(pluginName, startOfLine) {
-		var noIndent = curState.context && curState.context.noIndent;
-		curState.context = {
-			prev: curState.context,
-			pluginName: pluginName,
-			indent: curState.indented,
-			startOfLine: startOfLine,
-			noIndent: noIndent
-		};
-	}
-	
-	function popContext() {
-		if (curState.context) curState.context = curState.context.prev;
-	}
+  function inText(stream, state) {
+    function chain(parser) {
+      state.tokenize = parser;
+      return parser(stream, state);
+    }
 
-	function element(type) {
-		if (type == "openPlugin") {curState.pluginName = pluginName; return cont(attributes, endplugin(curState.startOfLine));}
-		else if (type == "closePlugin") {
-			var err = false;
-			if (curState.context) {
-				err = curState.context.pluginName != pluginName;
-				popContext();
-			} else {
-				err = true;
-			}
-			if (err) setStyle = "error";
-			return cont(endcloseplugin(err));
-		}
-		else if (type == "string") {
-			if (!curState.context || curState.context.name != "!cdata") pushContext("!cdata");
-			if (curState.tokenize == inText) popContext();
-			return cont();
-		}
-		else return cont();
-	}
-	
-	function endplugin(startOfLine) {
-		return function(type) {
-			if (
-			type == "selfclosePlugin" ||
-			type == "endPlugin"
-		)
-				return cont();
-			if (type == "endPlugin") {pushContext(curState.pluginName, startOfLine); return cont();}
-			return cont();
-		};
-	}
-	
-	function endcloseplugin(err) {
-		return function(type) {
-			if (err) setStyle = "error";
-			if (type == "endPlugin") return cont();
-			return pass();
-		};
-	}
+    var sol = stream.sol();
+    var ch = stream.next();
 
-	function attributes(type) {
-		if (type == "keyword") {setStyle = "attribute"; return cont(attributes);}
-		if (type == "equals") return cont(attvalue, attributes);
-		return pass();
-	}
-	function attvalue(type) {
-		if (type == "keyword") {setStyle = "string"; return cont();}
-		if (type == "string") return cont(attvaluemaybe);
-			return pass();
-	}
-	function attvaluemaybe(type) {
-		if (type == "string") return cont(attvaluemaybe);
-		else return pass();
-	}
-	return {
-		startState: function() {
-			return {tokenize: inText, cc: [], indented: 0, startOfLine: true, pluginName: null, context: null};
-		},
-		token: function(stream, state) {
-			if (stream.sol()) {
-				state.startOfLine = true;
-				state.indented = stream.indentation();
-			}
-			if (stream.eatSpace()) return null;
+    //non start of line
+    switch (ch) { //switch is generally much faster than if, so it is used here
+    case "{": //plugin
+      stream.eat("/");
+      stream.eatSpace();
+      var tagName = "";
+      var c;
+      while ((c = stream.eat(/[^\s\u00a0=\"\'\/?(}]/))) tagName += c;
+      state.tokenize = inPlugin;
+      return "tag";
+      break;
+    case "_": //bold
+      if (stream.eat("_")) {
+        return chain(inBlock("strong", "__", inText));
+      }
+      break;
+    case "'": //italics
+      if (stream.eat("'")) {
+        // Italic text
+        return chain(inBlock("em", "''", inText));
+      }
+      break;
+    case "(":// Wiki Link
+      if (stream.eat("(")) {
+        return chain(inBlock("variable-2", "))", inText));
+      }
+      break;
+    case "[":// Weblink
+      return chain(inBlock("variable-3", "]", inText));
+      break;
+    case "|": //table
+      if (stream.eat("|")) {
+        return chain(inBlock("comment", "||"));
+      }
+      break;
+    case "-":
+      if (stream.eat("=")) {//titleBar
+        return chain(inBlock("header string", "=-", inText));
+      } else if (stream.eat("-")) {//deleted
+        return chain(inBlock("error tw-deleted", "--", inText));
+      }
+      break;
+    case "=": //underline
+      if (stream.match("==")) {
+        return chain(inBlock("tw-underline", "===", inText));
+      }
+      break;
+    case ":":
+      if (stream.eat(":")) {
+        return chain(inBlock("comment", "::"));
+      }
+      break;
+    case "^": //box
+      return chain(inBlock("tw-box", "^"));
+      break;
+    case "~": //np
+      if (stream.match("np~")) {
+        return chain(inBlock("meta", "~/np~"));
+      }
+      break;
+    }
 
-			setStyle = type = pluginName = null;
-			var style = state.tokenize(stream, state);
-				if ((style || type) && style != "comment") {
-				curState = state;
-				while (true) {
-					var comb = state.cc.pop() || element;
-					if (comb(type || style)) break;
-				}
-			}
-			state.startOfLine = false;
-			return setStyle || style;
-				},
-		indent: function(state, textAfter) {
-			var context = state.context;
-			if (context && context.noIndent) return 0;
-			if (context && /^{\//.test(textAfter))
-				context = context.prev;
-			while (context && !context.startOfLine)
-				context = context.prev;
-			if (context) return context.indent + indentUnit;
-			else return 0;
-		},
-		electricChars: "/"
-	};
+    //start of line types
+    if (sol) {
+      switch (ch) {
+      case "!": //header at start of line
+        if (stream.match('!!!!!')) {
+          return chain(inLine("header string"));
+        } else if (stream.match('!!!!')) {
+          return chain(inLine("header string"));
+        } else if (stream.match('!!!')) {
+          return chain(inLine("header string"));
+        } else if (stream.match('!!')) {
+          return chain(inLine("header string"));
+        } else {
+          return chain(inLine("header string"));
+        }
+        break;
+      case "*": //unordered list line item, or <li /> at start of line
+      case "#": //ordered list line item, or <li /> at start of line
+      case "+": //ordered list line item, or <li /> at start of line
+        return chain(inLine("tw-listitem bracket"));
+        break;
+      }
+    }
+
+    //stream.eatWhile(/[&{]/); was eating up plugins, turned off to act less like html and more like tiki
+    return null;
+  }
+
+  var indentUnit = config.indentUnit;
+
+  // Return variables for tokenizers
+  var pluginName, type;
+  function inPlugin(stream, state) {
+    var ch = stream.next();
+    var peek = stream.peek();
+
+    if (ch == "}") {
+      state.tokenize = inText;
+      //type = ch == ")" ? "endPlugin" : "selfclosePlugin"; inPlugin
+      return "tag";
+    } else if (ch == "(" || ch == ")") {
+      return "bracket";
+    } else if (ch == "=") {
+      type = "equals";
+
+      if (peek == ">") {
+        ch = stream.next();
+        peek = stream.peek();
+      }
+
+      //here we detect values directly after equal character with no quotes
+      if (!/[\'\"]/.test(peek)) {
+        state.tokenize = inAttributeNoQuote();
+      }
+      //end detect values
+
+      return "operator";
+    } else if (/[\'\"]/.test(ch)) {
+      state.tokenize = inAttribute(ch);
+      return state.tokenize(stream, state);
+    } else {
+      stream.eatWhile(/[^\s\u00a0=\"\'\/?]/);
+      return "keyword";
+    }
+  }
+
+  function inAttribute(quote) {
+    return function(stream, state) {
+      while (!stream.eol()) {
+        if (stream.next() == quote) {
+          state.tokenize = inPlugin;
+          break;
+        }
+      }
+      return "string";
+    };
+  }
+
+  function inAttributeNoQuote() {
+    return function(stream, state) {
+      while (!stream.eol()) {
+        var ch = stream.next();
+        var peek = stream.peek();
+        if (ch == " " || ch == "," || /[ )}]/.test(peek)) {
+      state.tokenize = inPlugin;
+      break;
+    }
+  }
+  return "string";
+};
+                     }
+
+var curState, setStyle;
+function pass() {
+  for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);
+}
+
+function cont() {
+  pass.apply(null, arguments);
+  return true;
+}
+
+function pushContext(pluginName, startOfLine) {
+  var noIndent = curState.context && curState.context.noIndent;
+  curState.context = {
+    prev: curState.context,
+    pluginName: pluginName,
+    indent: curState.indented,
+    startOfLine: startOfLine,
+    noIndent: noIndent
+  };
+}
+
+function popContext() {
+  if (curState.context) curState.context = curState.context.prev;
+}
+
+function element(type) {
+  if (type == "openPlugin") {curState.pluginName = pluginName; return cont(attributes, endplugin(curState.startOfLine));}
+  else if (type == "closePlugin") {
+    var err = false;
+    if (curState.context) {
+      err = curState.context.pluginName != pluginName;
+      popContext();
+    } else {
+      err = true;
+    }
+    if (err) setStyle = "error";
+    return cont(endcloseplugin(err));
+  }
+  else if (type == "string") {
+    if (!curState.context || curState.context.name != "!cdata") pushContext("!cdata");
+    if (curState.tokenize == inText) popContext();
+    return cont();
+  }
+  else return cont();
+}
+
+function endplugin(startOfLine) {
+  return function(type) {
+    if (
+      type == "selfclosePlugin" ||
+        type == "endPlugin"
+    )
+      return cont();
+    if (type == "endPlugin") {pushContext(curState.pluginName, startOfLine); return cont();}
+    return cont();
+  };
+}
+
+function endcloseplugin(err) {
+  return function(type) {
+    if (err) setStyle = "error";
+    if (type == "endPlugin") return cont();
+    return pass();
+  };
+}
+
+function attributes(type) {
+  if (type == "keyword") {setStyle = "attribute"; return cont(attributes);}
+  if (type == "equals") return cont(attvalue, attributes);
+  return pass();
+}
+function attvalue(type) {
+  if (type == "keyword") {setStyle = "string"; return cont();}
+  if (type == "string") return cont(attvaluemaybe);
+  return pass();
+}
+function attvaluemaybe(type) {
+  if (type == "string") return cont(attvaluemaybe);
+  else return pass();
+}
+return {
+  startState: function() {
+    return {tokenize: inText, cc: [], indented: 0, startOfLine: true, pluginName: null, context: null};
+  },
+  token: function(stream, state) {
+    if (stream.sol()) {
+      state.startOfLine = true;
+      state.indented = stream.indentation();
+    }
+    if (stream.eatSpace()) return null;
+
+    setStyle = type = pluginName = null;
+    var style = state.tokenize(stream, state);
+    if ((style || type) && style != "comment") {
+      curState = state;
+      while (true) {
+        var comb = state.cc.pop() || element;
+        if (comb(type || style)) break;
+      }
+    }
+    state.startOfLine = false;
+    return setStyle || style;
+  },
+  indent: function(state, textAfter) {
+    var context = state.context;
+    if (context && context.noIndent) return 0;
+    if (context && /^{\//.test(textAfter))
+        context = context.prev;
+        while (context && !context.startOfLine)
+          context = context.prev;
+        if (context) return context.indent + indentUnit;
+        else return 0;
+       },
+    electricChars: "/"
+  };
 });
 
-//I figure, why not
 CodeMirror.defineMIME("text/tiki", "tiki");
diff --git a/mode/turtle/turtle.js b/mode/turtle/turtle.js
index 5c7c28eb..e118bfbc 100644
--- a/mode/turtle/turtle.js
+++ b/mode/turtle/turtle.js
@@ -33,23 +33,23 @@ CodeMirror.defineMode("turtle", function(config) {
       return null;
     }
     else if (ch == ":") {
-	  return "operator";
-	} else {
+          return "operator";
+        } else {
       stream.eatWhile(/[_\w\d]/);
       if(stream.peek() == ":") {
         return "variable-3";
       } else {
-	     var word = stream.current();
-	
-	     if(keywords.test(word)) {
-			return "meta";
-	     }
-	
-	     if(ch >= "A" && ch <= "Z") {
-		    return "comment";
-		 } else {
-			return "keyword";
-		 }
+             var word = stream.current();
+
+             if(keywords.test(word)) {
+                        return "meta";
+             }
+
+             if(ch >= "A" && ch <= "Z") {
+                    return "comment";
+                 } else {
+                        return "keyword";
+                 }
       }
       var word = stream.current();
       if (ops.test(word))
@@ -119,7 +119,7 @@ CodeMirror.defineMode("turtle", function(config) {
           state.context.col = stream.column();
         }
       }
-      
+
       return style;
     },
 
diff --git a/mode/vbscript/vbscript.js b/mode/vbscript/vbscript.js
index 65d6c212..3e1eedc7 100644
--- a/mode/vbscript/vbscript.js
+++ b/mode/vbscript/vbscript.js
@@ -6,12 +6,12 @@ CodeMirror.defineMode("vbscript", function() {
       if (stream.eatSpace()) return null;
       var ch = stream.next();
       if (ch == "'") {
-      	stream.skipToEnd();
-      	return "comment";
+        stream.skipToEnd();
+        return "comment";
       }
       if (ch == '"') {
-      	stream.skipTo('"');
-      	return "string";
+        stream.skipTo('"');
+        return "string";
       }
 
       if (/\w/.test(ch)) {
diff --git a/mode/yaml/yaml.js b/mode/yaml/yaml.js
index 59e2641a..bdd303df 100644
--- a/mode/yaml/yaml.js
+++ b/mode/yaml/yaml.js
@@ -1,95 +1,95 @@
 CodeMirror.defineMode("yaml", function() {
-	
-	var cons = ['true', 'false', 'on', 'off', 'yes', 'no'];
-	var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i');
-	
-	return {
-		token: function(stream, state) {
-			var ch = stream.peek();
-			var esc = state.escaped;
-			state.escaped = false;
-			/* comments */
-			if (ch == "#") { stream.skipToEnd(); return "comment"; }
-			if (state.literal && stream.indentation() > state.keyCol) {
-				stream.skipToEnd(); return "string";
-			} else if (state.literal) { state.literal = false; }
-			if (stream.sol()) {
-				state.keyCol = 0;
-				state.pair = false;
-				state.pairStart = false;
-				/* document start */
-				if(stream.match(/---/)) { return "def"; }
-				/* document end */
-				if (stream.match(/\.\.\./)) { return "def"; }
-				/* array list item */
-				if (stream.match(/\s*-\s+/)) { return 'meta'; }
-			}
-			/* pairs (associative arrays) -> key */
-			if (!state.pair && stream.match(/^\s*([a-z0-9\._-])+(?=\s*:)/i)) {
-				state.pair = true;
-				state.keyCol = stream.indentation();
-				return "atom";
-			}
-			if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; }
-			
-			/* inline pairs/lists */
-			if (stream.match(/^(\{|\}|\[|\])/)) {
-				if (ch == '{')
-					state.inlinePairs++;
-				else if (ch == '}')
-					state.inlinePairs--;
-				else if (ch == '[')
-					state.inlineList++;
-				else
-					state.inlineList--;
-				return 'meta';
-			}
-			
-			/* list seperator */
-			if (state.inlineList > 0 && !esc && ch == ',') {
-				stream.next();
-				return 'meta';
-			}
-			/* pairs seperator */
-			if (state.inlinePairs > 0 && !esc && ch == ',') {
-				state.keyCol = 0;
-				state.pair = false;
-				state.pairStart = false;
-				stream.next();
-				return 'meta';
-			}
-			
-			/* start of value of a pair */
-			if (state.pairStart) {
-				/* block literals */
-				if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; };
-				/* references */
-				if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; }
-				/* numbers */
-				if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; }
-				if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; }
-				/* keywords */
-				if (stream.match(keywordRegex)) { return 'keyword'; }
-			}
 
-			/* nothing found, continue */
-			state.pairStart = false;
-			state.escaped = (ch == '\\');
-			stream.next();
-			return null;
-		},
-		startState: function() {
-			return {
-				pair: false,
-				pairStart: false,
-				keyCol: 0,
-				inlinePairs: 0,
-				inlineList: 0,
-				literal: false,
-				escaped: false
-			};
-		}
-	};
+  var cons = ['true', 'false', 'on', 'off', 'yes', 'no'];
+  var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i');
+
+  return {
+    token: function(stream, state) {
+      var ch = stream.peek();
+      var esc = state.escaped;
+      state.escaped = false;
+      /* comments */
+      if (ch == "#") { stream.skipToEnd(); return "comment"; }
+      if (state.literal && stream.indentation() > state.keyCol) {
+        stream.skipToEnd(); return "string";
+      } else if (state.literal) { state.literal = false; }
+      if (stream.sol()) {
+        state.keyCol = 0;
+        state.pair = false;
+        state.pairStart = false;
+        /* document start */
+        if(stream.match(/---/)) { return "def"; }
+        /* document end */
+        if (stream.match(/\.\.\./)) { return "def"; }
+        /* array list item */
+        if (stream.match(/\s*-\s+/)) { return 'meta'; }
+      }
+      /* pairs (associative arrays) -> key */
+      if (!state.pair && stream.match(/^\s*([a-z0-9\._-])+(?=\s*:)/i)) {
+        state.pair = true;
+        state.keyCol = stream.indentation();
+        return "atom";
+      }
+      if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; }
+
+      /* inline pairs/lists */
+      if (stream.match(/^(\{|\}|\[|\])/)) {
+        if (ch == '{')
+          state.inlinePairs++;
+        else if (ch == '}')
+          state.inlinePairs--;
+        else if (ch == '[')
+          state.inlineList++;
+        else
+          state.inlineList--;
+        return 'meta';
+      }
+
+      /* list seperator */
+      if (state.inlineList > 0 && !esc && ch == ',') {
+        stream.next();
+        return 'meta';
+      }
+      /* pairs seperator */
+      if (state.inlinePairs > 0 && !esc && ch == ',') {
+        state.keyCol = 0;
+        state.pair = false;
+        state.pairStart = false;
+        stream.next();
+        return 'meta';
+      }
+
+      /* start of value of a pair */
+      if (state.pairStart) {
+        /* block literals */
+        if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; };
+        /* references */
+        if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; }
+        /* numbers */
+        if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; }
+        if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; }
+        /* keywords */
+        if (stream.match(keywordRegex)) { return 'keyword'; }
+      }
+
+      /* nothing found, continue */
+      state.pairStart = false;
+      state.escaped = (ch == '\\');
+      stream.next();
+      return null;
+    },
+    startState: function() {
+      return {
+        pair: false,
+        pairStart: false,
+        keyCol: 0,
+        inlinePairs: 0,
+        inlineList: 0,
+        literal: false,
+        escaped: false
+      };
+    }
+  };
 });
 
 CodeMirror.defineMIME("text/x-yaml", "yaml");
diff --git a/mode/z80/z80.js b/mode/z80/z80.js
index c026790d..ff43d32b 100644
--- a/mode/z80/z80.js
+++ b/mode/z80/z80.js
@@ -1,113 +1,85 @@
-CodeMirror.defineMode('z80', function()
-{
-	var keywords1 = /^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\b/i;
-	var keywords2 = /^(call|j[pr]|ret[in]?)\b/i;
-	var keywords3 = /^b_?(call|jump)\b/i;
-	var variables1 = /^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\b/i;
-	var variables2 = /^(n?[zc]|p[oe]?|m)\b/i;
-	var errors = /^([hl][xy]|i[xy][hl]|slia|sll)\b/i;
-	var numbers = /^([\da-f]+h|[0-7]+o|[01]+b|\d+)\b/i;
-	
-	return {startState: function()
-	{
-		return {context: 0};
-	}, token: function(stream, state)
-	{
-		if (!stream.column())
-			state.context = 0;
-		
-		if (stream.eatSpace())
-			return null;
-		
-		var w;
-		
-		if (stream.eatWhile(/\w/))
-		{
-			w = stream.current();
-			
-			if (stream.indentation())
-			{
-				if (state.context == 1 && variables1.test(w))
-					return 'variable-2';
-				
-				if (state.context == 2 && variables2.test(w))
-					return 'variable-3';
-				
-				if (keywords1.test(w))
-				{
-					state.context = 1;
-					return 'keyword';
-				}
-				else if (keywords2.test(w))
-				{
-					state.context = 2;
-					return 'keyword';
-				}
-				else if (keywords3.test(w))
-				{
-					state.context = 3;
-					return 'keyword';
-				}
-				
-				if (errors.test(w))
-					return 'error';
-			}
-			else if (numbers.test(w))
-			{
-				return 'number';
-			}
-			else
-			{
-				return null;
-			}
-		}
-		else if (stream.eat(';'))
-		{
-			stream.skipToEnd();
-			return 'comment';
-		}
-		else if (stream.eat('"'))
-		{
-			while (w = stream.next())
-			{
-				if (w == '"')
-					break;
-				
-				if (w == '\\')
-					stream.next();
-			}
-			
-			return 'string';
-		}
-		else if (stream.eat('\''))
-		{
-			if (stream.match(/\\?.'/))
-				return 'number';
-		}
-		else if (stream.eat('.') || stream.sol() && stream.eat('#'))
-		{
-			state.context = 4;
-			
-			if (stream.eatWhile(/\w/))
-				return 'def';
-		}
-		else if (stream.eat('$'))
-		{
-			if (stream.eatWhile(/[\da-f]/i))
-				return 'number';
-		}
-		else if (stream.eat('%'))
-		{
-			if (stream.eatWhile(/[01]/))
-				return 'number';
-		}
-		else
-		{
-			stream.next();
-		}
-		
-		return null;
-	}};
+CodeMirror.defineMode('z80', function() {
+  var keywords1 = /^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\b/i;
+  var keywords2 = /^(call|j[pr]|ret[in]?)\b/i;
+  var keywords3 = /^b_?(call|jump)\b/i;
+  var variables1 = /^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\b/i;
+  var variables2 = /^(n?[zc]|p[oe]?|m)\b/i;
+  var errors = /^([hl][xy]|i[xy][hl]|slia|sll)\b/i;
+  var numbers = /^([\da-f]+h|[0-7]+o|[01]+b|\d+)\b/i;
+
+  return {
+    startState: function() {
+      return {context: 0};
+    },
+    token: function(stream, state) {
+      if (!stream.column())
+        state.context = 0;
+
+      if (stream.eatSpace())
+        return null;
+
+      var w;
+
+      if (stream.eatWhile(/\w/)) {
+        w = stream.current();
+
+        if (stream.indentation()) {
+          if (state.context == 1 && variables1.test(w))
+            return 'variable-2';
+
+          if (state.context == 2 && variables2.test(w))
+            return 'variable-3';
+
+          if (keywords1.test(w)) {
+            state.context = 1;
+            return 'keyword';
+          } else if (keywords2.test(w)) {
+            state.context = 2;
+            return 'keyword';
+          } else if (keywords3.test(w)) {
+            state.context = 3;
+            return 'keyword';
+          }
+
+          if (errors.test(w))
+            return 'error';
+        } else if (numbers.test(w)) {
+          return 'number';
+        } else {
+          return null;
+        }
+      } else if (stream.eat(';')) {
+        stream.skipToEnd();
+        return 'comment';
+      } else if (stream.eat('"')) {
+        while (w = stream.next()) {
+          if (w == '"')
+            break;
+
+          if (w == '\\')
+            stream.next();
+        }
+        return 'string';
+      } else if (stream.eat('\'')) {
+        if (stream.match(/\\?.'/))
+          return 'number';
+      } else if (stream.eat('.') || stream.sol() && stream.eat('#')) {
+        state.context = 4;
+
+        if (stream.eatWhile(/\w/))
+          return 'def';
+      } else if (stream.eat('$')) {
+        if (stream.eatWhile(/[\da-f]/i))
+          return 'number';
+      } else if (stream.eat('%')) {
+        if (stream.eatWhile(/[01]/))
+          return 'number';
+      } else {
+        stream.next();
+      }
+      return null;
+    }
+  };
 });
 
 CodeMirror.defineMIME("text/x-z80", "z80");
-- 
GitLab