now parser almost working...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2016-07-16 05:11:21 +03:00
parent 089b2ce4b1
commit 44a4dfb10b

82
wiki.js
View File

@ -498,14 +498,26 @@ var Wiki = {
var macro = { 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__: [ __filters__: [
], ],
context: null, context: null,
// XXX this is preliminary...
// XXX add wikiword...
// filter(text) -> html
filter: { filter: {
default: 'html',
html: function(text){ return $('<div>').html(text) },
json: 'text',
text: function(text){ return $('<div>').text(text) },
}, },
// macro stage 1... // macro stage 1...
macro: { macro: {
// select filter to post-process text... // select filter to post-process text...
@ -529,15 +541,14 @@ var macro = {
}, },
// fill/define slot (stage 1)... // fill/define slot (stage 1)...
// XXX
slot_args: ['name'], slot_args: ['name'],
slot: function(args, text, slots){ slot: function(args, text, slots){
var name = args.name var name = args.name
if(slots[name] == null){ if(slots[name] == null){
slots[name] = text slots[name] = text
// XXX return a slot macro parsable by stage 2... // return a slot macro parsable by stage 2...
return text return '<slot name="'+name+'">'+ text +'</slot>'
} else if(name in slots){ } else if(name in slots){
slots[name] = text slots[name] = text
@ -545,6 +556,7 @@ var macro = {
} }
}, },
}, },
// macro stage 2... // macro stage 2...
// XXX rename... // XXX rename...
macro2: { macro2: {
@ -553,7 +565,6 @@ var macro = {
var name = args.name var name = args.name
if(slots[name] == null){ if(slots[name] == null){
// XXX ???
return text return text
} else if(name in slots){ } 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... parseElem: function(text, stage){
// XXX var res = {}
// @<name>(<args>)
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 = $('<div>').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<a.length; i++){
args[a[i].name] = a[i].value
}
res.text = elem.html()
}
return res
}, },
// XXX add support for disabled filters -- -filter
parse: function(text){ parse: function(text){
var that = this var that = this
var filters = [] var filters = []
var slots = {} var slots = {}
// macro stage 1... // macro stage 1...
text = text.replace(this.__macro__pattern__, function(match, macro, args, text){ text = text.replace(this.__macro__pattern__, function(match){
args = that.parseArgs(macro, args) var m = that.parseElem(match, that.macro)
return macro in that.macro ? return m.name in that.macro ?
that.macro[macro].call(that, args, text, slots, filters) that.macro[m.name].call(that, m.args, m.text, slots, filters)
: match : match
}) })
// macro stage 2... // macro stage 2...
text = text.replace(this.__macro__pattern__, function(match, macro, args, text){ text = text.replace(this.__macro__pattern__, function(match){
args = that.parseArgs(macro, args) var m = that.parseElem(match, that.macro2)
return macro in that.macro2 ? return m.name in that.macro2 ?
that.macro2[macro].call(that, args, text, slots, filters) that.macro2[m.name].call(that, m.args, m.text, slots, filters)
: match : match
}) })
// filter stage.... // filter stage....
filters.forEach(function(k){ filters.forEach(function(k){
text = that.filter[k].call(that, text) var seen = []
// get filter aliases...
while(typeof(k) == typeof('str') && seen.indexOf(k) == -1){
seen.push(k)
k = that.filter[k]
}
text = k.call(that, text)
}) })
return text return text