From 44a4dfb10bfac58ee2e04dd67caf7e8c4e081802 Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Sat, 16 Jul 2016 05:11:21 +0300 Subject: [PATCH] now parser almost working... Signed-off-by: Alex A. Naanou --- wiki.js | 82 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 65 insertions(+), 17 deletions(-) diff --git a/wiki.js b/wiki.js index 47bd824..3edc43d 100755 --- a/wiki.js +++ b/wiki.js @@ -498,14 +498,26 @@ var Wiki = { var macro = { - __macro__pattern__: null, + //__macro__pattern__: /<([a-zA-Z-_:]+)(.|[\n\r])*?(>(.|[\n\r])*?<\/\1>|\/>)/mg, + __macro__pattern__: + /<([a-zA-Z-_:]+)(.|[\n\r])*?(>(.|[\n\r])*?<\/\1>|\/>)|@([a-zA-Z-_]+)\(([^)]*)\)/mg, __filters__: [ ], context: null, + // XXX this is preliminary... + // XXX add wikiword... + // filter(text) -> html filter: { + default: 'html', + + html: function(text){ return $('
').html(text) }, + + json: 'text', + text: function(text){ return $('
').text(text) }, }, + // macro stage 1... macro: { // select filter to post-process text... @@ -529,15 +541,14 @@ var macro = { }, // fill/define slot (stage 1)... - // XXX slot_args: ['name'], slot: function(args, text, slots){ var name = args.name if(slots[name] == null){ slots[name] = text - // XXX return a slot macro parsable by stage 2... - return text + // return a slot macro parsable by stage 2... + return ''+ text +'' } else if(name in slots){ slots[name] = text @@ -545,6 +556,7 @@ var macro = { } }, }, + // macro stage 2... // XXX rename... macro2: { @@ -553,7 +565,6 @@ var macro = { var name = args.name if(slots[name] == null){ - // XXX ??? return text } else if(name in slots){ @@ -562,36 +573,73 @@ var macro = { }, }, - parseArgs: function(macro, args){ - // XXX parse args and populate the dict via .*_args attr... - // XXX + + 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