mirror of https://github.com/zulip/zulip.git
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:
parent
55047280c9
commit
87814572c9
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue