Create tools/get-handlebar-vars utility.

This basically prints out a template JSON data structure to
be used with a handlebar template that you specify on the command
line.  (You can actually supply multiple files, too.)

Example usage:

    $ ./tools/get-handlebar-vars static/templates/tab_bar.handlebars
    === static/templates/tab_bar.handlebars
    {
        "tabs": [
            {
                "hash": "",
                "title": "",
                "active": "",
                "icon": true,
                "data": "",
                "cls": ""
            }
        ]
    }

(imported from commit d7239fcae7d94038fa0e4b34c8b1208a1070ecbb)
This commit is contained in:
Steve Howell 2013-12-04 12:57:55 -05:00
parent 55047280c9
commit 87814572c9
1 changed files with 106 additions and 0 deletions

106
tools/get-handlebar-vars Executable file
View File

@ -0,0 +1,106 @@
#!/usr/bin/env python
import sys
import re
import json
def debug(obj):
print(json.dumps(obj, indent=4))
def parse_file(fn):
text = open(fn).read()
tags = re.findall('{+\s*(.*?)\s*}+', text)
root = {}
context = root
stack = []
def set_var(var, val):
num_levels_up = len(re.findall('\.\.', var))
if num_levels_up:
var = var.split('/')[-1]
stack[-1 * num_levels_up][var] = val
else:
context[var] = val
for tag in tags:
if tag.startswith('! '):
continue
if tag == 'else':
continue
if tag[0] in '#^' and ' ' not in tag:
var = tag[1:]
set_var(var, True)
stack.append(context)
continue
if tag.startswith('#if'):
vars = tag.split()[1:]
for var in vars:
set_var(var, True)
stack.append(context)
continue
if tag.startswith('/if'):
context = stack.pop()
continue
if tag.startswith('#with '):
var = tag.split()[1]
new_context = {}
context[var] = new_context
stack.append(context)
context = new_context
continue
if tag.startswith('/with'):
context = stack.pop()
continue
if tag.startswith('#unless '):
var = tag.split()[1]
set_var(var, True)
stack.append(context)
continue
if tag.startswith('/unless'):
context = stack.pop()
continue
if tag.startswith('#each '):
var = tag.split()[1]
new_context = {}
context[var] = [new_context]
stack.append(context)
context = new_context
continue
if tag.startswith('/each'):
context = stack.pop()
continue
if tag.startswith('/'):
context = stack.pop()
continue
set_var(tag, '')
def clean_this(obj):
if isinstance(obj, list):
return [clean_this(item) for item in obj]
if isinstance(obj, dict):
if len(obj.keys()) == 1 and 'this' in obj:
return clean_this(obj['this'])
return {k: clean_this(v) for k, v in obj.items()}
return obj
root = clean_this(root)
return root
if __name__ == '__main__':
for fn in sys.argv[1:]:
print '===', fn
root = parse_file(fn)
debug(root)
print