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}