').text(text).html() },
		wikiword: function(text){ return setWikiWords(text) },
	},
	// macro stage 1...
	// XXX do not like how args are defined....
	macro: {
		// select filter to post-process text...
		filter_args: ['name'],
		filter: function(args, text, _, filters){
			var filter = args[0] || args.name
			filter[0] == '-' ?
				// disabled -- keep at head of list...
				filters.unshift(filter)
				// normal -- tail...
				: 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 = res.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
 look inside...
					: m.elem && m.text != ''? 
						m.elem.html(_parse(m.text, macro))[0].outerHTML
					// else nothing changed...
					: match
			})
		}
		// macro stage 1...
		text = _parse(text, this.macro)
		// macro stage 2...
		text = _parse(text, this.macro2)
		// filter stage....
		filters
			.concat(this.__filters__)
			// unique -- leave last occurance..
			.filter(function(k, i, lst){ 
				return k[0] != '-'
					// filter dupplicates... 
					&& lst.slice(i+1).indexOf(k) == -1 
						// filter disabled...
					&& lst.slice(0, i).indexOf('-' + k) == -1
			})
			// unique -- leave first occurance..
			//.filter(function(k, i, lst){ return lst.slice(0, i).indexOf(k) == -1 })
			// apply the filters...
			.forEach(function(k){
				// get filter aliases...
				var seen = []
				while(typeof(k) == typeof('str') && seen.indexOf(k) == -1){
					seen.push(k)
					k = that.filter[k]
				}
				// call the filter
				text = k.call(that, text) 
			})
		return text
	},
}
/**********************************************************************
* vim:set ts=4 sw=4 :                                                */