started work on a new gen parser...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2016-07-25 22:08:44 +03:00
parent 6d69d34a84
commit e826dd19d9
2 changed files with 104 additions and 5 deletions

View File

@ -19,7 +19,6 @@ var clear = () => {
} }
var reload = () => { var reload = () => {
$('.wiki') $('.wiki')
.html(Wiki.title[0] == '_' ? Wiki.text : Wiki.get('./_view').text) .html(Wiki.title[0] == '_' ? Wiki.text : Wiki.get('./_view').text)
.ready(update_editor) .ready(update_editor)

108
wiki.js
View File

@ -224,7 +224,7 @@ var macro = {
text: function(context, text){ return $('<div>').text(text).html() }, text: function(context, text){ return $('<div>').text(text).html() },
// XXX // XXX
nl2br: function(context, text){ return $('<div>').html(text.replace(/\n/g, '<br>\n')) }, //nl2br: function(context, text){ return $('<div>').html(text.replace(/\n/g, '<br>\n')) },
wikiword: function(context, text){ wikiword: function(context, text){
return setWikiWords(text, true, this.__include_marker__) }, return setWikiWords(text, true, this.__include_marker__) },
@ -294,6 +294,9 @@ var macro = {
}, },
// XXX need to parse argument value content for macros... // XXX need to parse argument value content for macros...
// XXX try and avoid parsing HTML by hand... // XXX try and avoid parsing HTML by hand...
// XXX BUG: for some reason in some pages (Dodo/_view) the contets of
// .text spill out of the element...
// ...the problem is in the post macro stage...
parse: function(context, text, state, skip_post, pattern){ parse: function(context, text, state, skip_post, pattern){
var that = this var that = this
@ -305,6 +308,9 @@ var macro = {
pattern = pattern || RegExp.apply(null, this.__macro__pattern__) pattern = pattern || RegExp.apply(null, this.__macro__pattern__)
// XXX need to parse argument value content for macros... // XXX need to parse argument value content for macros...
// XXX this does not account for nested tags -- e.g. the pattern
// will "eat" the first matching tag not regarding the nested
// tags (???)
var _parse = function(context, text, macro){ var _parse = function(context, text, macro){
return text.replace(pattern, function(match){ return text.replace(pattern, function(match){
var m = that.parseElem(match, macro) var m = that.parseElem(match, macro)
@ -363,11 +369,12 @@ var macro = {
// included html from messing up the outer structure with // included html from messing up the outer structure with
// things like unclosed tags and stuff... // things like unclosed tags and stuff...
// XXX can this be anything other than html? // XXX can this be anything other than html?
return $('<span/>') return $('<div/>')
.append($('<span/>')
.addClass('include') .addClass('include')
.attr('src', page.path) .attr('src', page.path)
.html(page.parse({ slots: state.slots }, true))[0] .html(page.parse({ slots: state.slots }, true)))
.outerHTML .html()
}) })
// post macro... // post macro...
@ -379,6 +386,85 @@ var macro = {
return text return text
}, },
_parse: function(context, text, state, skip_post, pattern){
var that = this
state = state || {}
state.filters = state.filters || []
state.slots = state.slots || {}
state.include = state.include || []
var parsed = $('<div>').html(text)
// XXX we need to parse macros in three places:
// - tags (html-style)
// - #text nodes
// - attr values
// Two ways to approach this:
// - .find('*') + .contents()
// + simple
// - ordering problems
// - manual recursion -- .contents() -> tag | #text
// - manual
// + more controllable
var _parseText = function(context, text, macro){
return text.replace(pattern, function(match){
// XXX parse match...
// XXX might be a good idea to construct an element
// representing the match...
// XXX
if(name in macro){
// XXX call macro...
return macro[name].call(context, e, state)
}
return match
})
}
var _parse = function(context, parsed, macro){
parsed.contents().each(function(i, e){
// #text node -> parse the @ macros...
if(e.nodeType == 3){
// parse text...
var t = $(e)
// XXX
t.replaceWith(_parseText(contents, t.text(), macro))
// node -> html-style + attrs...
} else {
var name = e.nodeName.toLowerCase()
// macro match...
if(name in macro){
// XXX call the macro...
$(e).replaceWith(macro[name].call(context, e, state))
// normal tag -> attrs + sub-tree...
} else {
// parse attr values...
for(var i=0; i < e.attributes.length; i++){
var attr = e.attributes[i]
// XXX
attr.value = _parseText(contents, attr.value, macro)
}
// parse sub-tree...
_parse(context, e, macro)
}
}
})
return parsed
}
// XXX
},
} }
@ -491,6 +577,20 @@ var data = {
+'\n', +'\n',
}, },
ParserTestPage: {
text: '<div>\n'
+'<h2>nested single line element</h2>\n'
// This breaks the parser on the post-macro stage...
+'<h3><span>\n'
+'nested multi-line</span> element\n'
+'</h3>\n'
// this will get completely messed up by the parser...
+'<span> abc <span> 123 </span> xyz </span>'
+'</div>'
},
'Templates/_raw': { 'Templates/_raw': {
text: '@source(..)', text: '@source(..)',
}, },