mirror of
https://github.com/flynx/pWiki.git
synced 2025-12-17 08:31:38 +00:00
new gen parser flow done, need to update the macros...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
c6dfb4ceda
commit
a7c31969c2
81
wiki.js
81
wiki.js
@ -388,6 +388,9 @@ var macro = {
|
||||
},
|
||||
|
||||
|
||||
// XXX this expect a different macro signature:
|
||||
// macro(context, element, state)
|
||||
// -> text
|
||||
_parse: function(context, text, state, skip_post, pattern){
|
||||
var that = this
|
||||
|
||||
@ -396,23 +399,12 @@ var macro = {
|
||||
state.slots = state.slots || {}
|
||||
state.include = state.include || []
|
||||
|
||||
var parsed = $('<div>').html(text)
|
||||
// XXX update .__macro__pattern__ to only support the @macro style...
|
||||
//var pattern = pattern || this.__macro__pattern__
|
||||
pattern = pattern || RegExp('@([a-zA-Z-_]+)\\(([^)]*)\\)', 'mg')
|
||||
|
||||
// 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 parsed = $('<span>').html(text)
|
||||
|
||||
// XXX these expect a different macro signature:
|
||||
// macro(context, element, state)
|
||||
// -> text
|
||||
var _parseText = function(context, text, macro){
|
||||
return text.replace(pattern, function(match){
|
||||
// XXX parse match...
|
||||
@ -433,7 +425,7 @@ var macro = {
|
||||
|
||||
// add the attrs to the element...
|
||||
a.forEach(function(e, i){
|
||||
var k = ((stage[res.name] || {}).macro_args || [])[i]
|
||||
var k = ((macro[name] || {}).macro_args || [])[i]
|
||||
k && elem.attr(k, e)
|
||||
})
|
||||
|
||||
@ -444,14 +436,15 @@ var macro = {
|
||||
return match
|
||||
})
|
||||
}
|
||||
// NOTE: this modifies parsed in-place...
|
||||
var _parse = function(context, parsed, macro){
|
||||
parsed.contents().each(function(i, e){
|
||||
$(parsed).contents().each(function(_, e){
|
||||
// #text node -> parse the @ macros...
|
||||
if(e.nodeType == 3){
|
||||
// parse text...
|
||||
var t = $(e)
|
||||
|
||||
t.replaceWith(_parseText(contents, t.text(), macro))
|
||||
t.replaceWith(_parseText(context, t.text(), macro))
|
||||
|
||||
// node -> html-style + attrs...
|
||||
} else {
|
||||
@ -467,7 +460,7 @@ var macro = {
|
||||
for(var i=0; i < e.attributes.length; i++){
|
||||
var attr = e.attributes[i]
|
||||
|
||||
attr.value = _parseText(contents, attr.value, macro)
|
||||
attr.value = _parseText(context, attr.value, macro)
|
||||
}
|
||||
|
||||
// parse sub-tree...
|
||||
@ -481,11 +474,12 @@ var macro = {
|
||||
|
||||
|
||||
// macro stage...
|
||||
// XXX need to update this.macro...
|
||||
// XXX need to update .macro...
|
||||
_parse(context, parsed, this.macro)
|
||||
|
||||
// filter stage...
|
||||
// XXX need to update filters to take html and return html...
|
||||
// XXX need to update .filters to take html and return html...
|
||||
/*
|
||||
state.filters
|
||||
.concat(this.__filters__)
|
||||
// unique -- leave last occurance..
|
||||
@ -509,30 +503,59 @@ var macro = {
|
||||
}
|
||||
// could not find the filter...
|
||||
if(!k){
|
||||
console.warn('Unknown filter:', f)
|
||||
//console.warn('Unknown filter:', f)
|
||||
return
|
||||
}
|
||||
// use the filter...
|
||||
parsed = k.call(that, context, parsed)
|
||||
})
|
||||
//*/
|
||||
|
||||
// merge includes...
|
||||
// XXX the 'include' macro needs to only remove include elems without src attr...
|
||||
parsed.find('include').each(function(i, elem){
|
||||
var page = that.get($(elem).attr('src'))
|
||||
//
|
||||
// XXX the include macro should:
|
||||
// - for text input
|
||||
// -> create page and push to state.include
|
||||
// -> return placeholder
|
||||
// - for dom input
|
||||
// -> do nothing
|
||||
parsed
|
||||
// text includes...
|
||||
// XXX I do not like that we are reparsing the whole page here...
|
||||
// ...the only alternative I see is traversing the whole
|
||||
// page agin -- _parse(..) stage 1.5???...
|
||||
.html(parsed.html().replace(this.__include_marker__, function(){
|
||||
var page = state.include.shift()
|
||||
|
||||
$(elem).replaceWith($('<span/>')
|
||||
.addClass('include')
|
||||
return $('<include/>')
|
||||
.attr('src', page.path)
|
||||
.append(page._parse({ slots: state.slots }, true)))
|
||||
.append(page
|
||||
.parse({ slots: state.slots }, true))
|
||||
}))
|
||||
// tag includes...
|
||||
.find('include').each(function(i, elem){
|
||||
var src = $(elem).attr('src')
|
||||
|
||||
// ignore include tags without src...
|
||||
if(!src){
|
||||
return
|
||||
}
|
||||
|
||||
// fill the include element with page...
|
||||
// XXX this uses old Wiki.parse(..) method/parser...
|
||||
$(elem)
|
||||
.empty()
|
||||
.append(that.get(src)
|
||||
.parse({ slots: state.slots }, true))
|
||||
})
|
||||
|
||||
// post macro...
|
||||
// XXX need to update this.post_macro...
|
||||
// XXX need to update .post_macro...
|
||||
if(!skip_post){
|
||||
_parse(context, parsed, this.post_macro)
|
||||
}
|
||||
|
||||
// XXX shuld we get rid of the rot span???
|
||||
return parsed
|
||||
},
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user