Skip to content

Instantly share code, notes, and snippets.

@williammalo
Forked from 140bytes/LICENSE.txt
Last active October 5, 2015 00:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save williammalo/2727112 to your computer and use it in GitHub Desktop.
Save williammalo/2727112 to your computer and use it in GitHub Desktop.
parse indentation of string

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>
@tsaniel
Copy link

tsaniel commented May 21, 2012

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}

@atk
Copy link

atk commented May 21, 2012

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}

@williammalo
Copy link
Author

@tsaniel ah thanks!
@atk Smart! Thanks!

@maettig
Copy link

maettig commented May 24, 2012

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}

@williammalo
Copy link
Author

@maettig
ah! very cool!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment