').text(text) },
},
// macro stage 1...
macro: {
// select filter to post-process text...
filter_args: ['name'],
filter: function(args, text, _, filters){
var filter = args[0] || args.name
filters.push(filter)
return ''
},
// include page/slot...
include_args: ['src', 'slot'],
include: function(args){
var path = args.src
var text = this.context.get(path).text
return this.parse(text)
},
// fill/define slot (stage 1)...
slot_args: ['name'],
slot: function(args, text, slots){
var name = args.name
if(slots[name] == null){
slots[name] = text
// return a slot macro parsable by stage 2...
return '
'+ text +''
} else if(name in slots){
slots[name] = text
return ''
}
},
},
// macro stage 2...
// XXX rename...
macro2: {
slot_args: ['name'],
slot: function(args, text, slots){
var name = args.name
if(slots[name] == null){
return text
} else if(name in slots){
return slots[name]
}
},
},
parseElem: function(text, stage){
var res = {}
// @
()
if(text[0] == '@'){
var d = text.match(/@([a-zA-Z-_:]*)\(([^)]*)\)/)
res.text = ''
res.name = d[1]
var args = res.args = {}
var a = d[2].split(/\s+/g)
a.forEach(function(e, i){
args[(stage[res.name + '_args'] || [])[i]] = e
})
// html-like...
} else {
var elem = $('').html(text).children().eq(0)
res.name = elem.prop('tagName').toLowerCase()
var args = res.args = {}
var a = elem.prop('attributes')
for(var i=0; i