This function returns an array of the indentation level of each line of a string.
I made this as part of a yaml parser I'm trying to do =D
you use it like this:
getIndent("\t\t\ttext\n\tmore text\nnot indented")
and it returns this:
[3,1,0]
function(a,b){ | |
for(a in b=a.split("\n")) //for each line | |
b[a]=/\t*/.exec(b[a])[0].length; //replace string with indentation level | |
return b //return the array | |
} |
function(a,b){for(a in b=a.split("\n"))b[a]=/\t*/.exec(b[a])[0].length;return b} | |
//@maettig's version | |
function(a,b){b=[];a.replace(/^\t*/gm,function(c){b.push(c.length)});return b} |
{ | |
"name": "getIndent", | |
"description": "Returns an array of the indentation level of each line of a string.", | |
"keywords": [ | |
"indentation", | |
"yaml", | |
"whitespace", | |
"haml", | |
"jade" | |
] | |
} |
<!DOCTYPE html> | |
<title>Foo</title> | |
<b id=foo></b> | |
<script> | |
foo = document.getElementById("foo") | |
getIndent = function(a,b){for(a in b=a.split("\n"))b[a]=/\t*/.exec(b[a])[0].length;return b} | |
foo.innerHTML = getIndent("\t\t\ttext\n\tmore text\nnot indented") | |
</script> |
Save 5 more bytes by reusing variables:
function(a,b){for(a in b=a.split("\n"))b[a]=/\t*/.exec(b[a])[0].length;return b}
I tried to come up with my own solution and ended with something 2 bytes smaller. This abuses replace
like it's a loop. Edit: Also it's a bit more reliable since your version returns [1] instead of [0] for "a\t".
function(a,b){b=[];a.replace(/^\t*/gm,function(c){b.push(c.length)});return b}
@maettig
ah! very cool!
Save 2 bytes:
function(a,b,i){b=[];for(i in a=a.split("\n"))b[i]=/\t*/.exec(a[i])[0].length;return b}