mirror of
https://github.com/flynx/pWiki.git
synced 2025-12-21 02:21:40 +00:00
working on the macro macro...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
67d8212f2a
commit
5b93c36f58
78
pwiki2.js
78
pwiki2.js
@ -380,6 +380,13 @@ object.Constructor('BasePage', {
|
|||||||
set data(value){
|
set data(value){
|
||||||
this.store.update(this.location, value) },
|
this.store.update(this.location, value) },
|
||||||
|
|
||||||
|
// number of matching pages...
|
||||||
|
get length(){
|
||||||
|
var p = this.match(this.location)
|
||||||
|
return p instanceof Array ?
|
||||||
|
p.length
|
||||||
|
: 1 },
|
||||||
|
|
||||||
// relative proxies to store...
|
// relative proxies to store...
|
||||||
exists: relProxy('exists'),
|
exists: relProxy('exists'),
|
||||||
match: relProxy('match'),
|
match: relProxy('match'),
|
||||||
@ -659,7 +666,8 @@ module.parser = {
|
|||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// NOTE: this internaly uses macros to check for propper nesting
|
// NOTE: this internaly uses macros to check for propper nesting
|
||||||
group: function*(page, lex, to=false){
|
//group: function*(page, lex, to=false){
|
||||||
|
group: function*(page, lex, to=false, parent){
|
||||||
lex = lex
|
lex = lex
|
||||||
?? this.lex(page)
|
?? this.lex(page)
|
||||||
lex = typeof(lex) == 'string' ?
|
lex = typeof(lex) == 'string' ?
|
||||||
@ -676,8 +684,13 @@ module.parser = {
|
|||||||
'Premature end of unpit: Expected closing "'+ to +'"') }
|
'Premature end of unpit: Expected closing "'+ to +'"') }
|
||||||
return }
|
return }
|
||||||
// assert nesting rules...
|
// assert nesting rules...
|
||||||
|
// NOTE: we only check for direct nesting...
|
||||||
|
// XXX might be a good idea to link nested block to the parent...
|
||||||
if(page.macros[value.name] instanceof Array
|
if(page.macros[value.name] instanceof Array
|
||||||
&& page.macros[value.name].includes(to)){
|
&& !page.macros[value.name].includes(to)
|
||||||
|
// do not complain about closing nestable tags...
|
||||||
|
&& !(value.name == to
|
||||||
|
&& value.type == 'closing')){
|
||||||
throw new Error(
|
throw new Error(
|
||||||
'Unexpected "'+ value.name +'" macro'
|
'Unexpected "'+ value.name +'" macro'
|
||||||
+(to ?
|
+(to ?
|
||||||
@ -685,7 +698,8 @@ module.parser = {
|
|||||||
: '')) }
|
: '')) }
|
||||||
// open block...
|
// open block...
|
||||||
if(value.type == 'opening'){
|
if(value.type == 'opening'){
|
||||||
value.body = [...this.group(page, lex, value.name)]
|
//value.body = [...this.group(page, lex, value.name)]
|
||||||
|
value.body = [...this.group(page, lex, value.name, value)]
|
||||||
value.type = 'block'
|
value.type = 'block'
|
||||||
yield value
|
yield value
|
||||||
continue
|
continue
|
||||||
@ -733,7 +747,7 @@ module.parser = {
|
|||||||
// macro...
|
// macro...
|
||||||
var {name, args, body} = value
|
var {name, args, body} = value
|
||||||
var res =
|
var res =
|
||||||
page.macros[name].call(page, args, body, state)
|
page.macros[name].call(page, args, body, state, value)
|
||||||
?? ''
|
?? ''
|
||||||
if(res instanceof Array
|
if(res instanceof Array
|
||||||
|| page.macros[name] instanceof types.Generator){
|
|| page.macros[name] instanceof types.Generator){
|
||||||
@ -1010,7 +1024,61 @@ object.Constructor('Page', BasePage, {
|
|||||||
''
|
''
|
||||||
: function(state){
|
: function(state){
|
||||||
return state.slots[name] } },
|
return state.slots[name] } },
|
||||||
macro: function(){},
|
|
||||||
|
// XXX BUG: '<macro src="/moo/*"> <else> no moo!</else> </macro>' breaks...
|
||||||
|
// ...seams to be a bug in the parser...
|
||||||
|
macro: function(args, body, state){
|
||||||
|
// XXX
|
||||||
|
//return
|
||||||
|
|
||||||
|
var name = args.name ?? args[0]
|
||||||
|
var src = args.src
|
||||||
|
var sort = (args.sort ?? '')
|
||||||
|
.split(/\s+/g)
|
||||||
|
.filter(function(e){
|
||||||
|
return e != '' })
|
||||||
|
var text = args.text
|
||||||
|
?? body
|
||||||
|
?? []
|
||||||
|
|
||||||
|
if(name){
|
||||||
|
// define new named macro...
|
||||||
|
if(text){
|
||||||
|
state.macros[name] = text
|
||||||
|
// use existing macro...
|
||||||
|
} else if(name in state.macros){
|
||||||
|
text = state.macros[name] } }
|
||||||
|
|
||||||
|
if(src){
|
||||||
|
var pages = this.get(src).each()
|
||||||
|
// no matching pages -> get the else block...
|
||||||
|
if(pages.length == 0 && text){
|
||||||
|
// XXX get the else block...
|
||||||
|
var else_block = (text ?? [])
|
||||||
|
.filter(function(e){
|
||||||
|
return typeof(e) != 'string'
|
||||||
|
&& e.name == 'else' })
|
||||||
|
// XXX do we take the first or the last (now) block???
|
||||||
|
else_block = else_block.pop()
|
||||||
|
else_block =
|
||||||
|
else_block.args.text
|
||||||
|
?? else_block.body
|
||||||
|
console.log('---', else_block)
|
||||||
|
return else_block ?
|
||||||
|
this.__parser__.expand(this, else_block, state)
|
||||||
|
: '' }
|
||||||
|
|
||||||
|
// sort pages...
|
||||||
|
if(sort.length > 0){
|
||||||
|
// XXX
|
||||||
|
throw new Error('macro sort: not implemented')
|
||||||
|
}
|
||||||
|
|
||||||
|
// XXX apply macro text...
|
||||||
|
return pages
|
||||||
|
.map(function(page){
|
||||||
|
return this.__parser__.expand(page, text, state) })
|
||||||
|
} },
|
||||||
|
|
||||||
// nesting rules...
|
// nesting rules...
|
||||||
'else': ['macro'],
|
'else': ['macro'],
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user