added auto-quote filters...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2022-05-03 01:36:27 +03:00
parent 8128c9b025
commit 7c35da904a

View File

@ -922,6 +922,16 @@ module.parser = {
} }
// XXX revise...
var Filter =
module.Filter =
function(...args){
var func = args.pop()
args.length > 0
&& Object.assign(func, args.pop())
return func }
// XXX PATH_VARS need to handle path variables... // XXX PATH_VARS need to handle path variables...
// XXX macros and filters should be features for simpler plugin handlng (???) // XXX macros and filters should be features for simpler plugin handlng (???)
var Page = var Page =
@ -949,10 +959,20 @@ object.Constructor('Page', BasePage, {
return source return source
.replace(/test/g, 'TEST') }, .replace(/test/g, 'TEST') },
wikiword: function(source){ wikiword: Filter(
{quote: 'quote-wikiword'},
function(source){
// XXX
return source }),
'quote-wikiword': function(source){
// XXX // XXX
return source }, return source },
markdown: function(source){
markdown: Filter(
{quote: 'quote-markdown'},
function(source){
return source }),
'quote-markdown': function(source){
// XXX // XXX
return source }, return source },
}, },
@ -989,7 +1009,7 @@ object.Constructor('Page', BasePage, {
// | -<filter> <filter-spec> // | -<filter> <filter-spec>
// //
// XXX support .NO_FILTERS ... // XXX support .NO_FILTERS ...
filter: function*(args, body, state, expand=true){ filter: function(args, body, state, expand=true){
var that = this var that = this
var filters = state.filters = var filters = state.filters =
state.filters ?? [] state.filters ?? []
@ -1000,7 +1020,17 @@ object.Constructor('Page', BasePage, {
[outer_filters] } [outer_filters] }
// merge in new filters... // merge in new filters...
filters.splice(filters.length, 0, ...Object.values(args)) var local = Object.values(args)
filters.splice(filters.length, 0, ...local)
// trigger quote-filter...
var quote = local
.map(function(filter){
return that.filters[filter]['quote'] ?? [] })
.flat()
quote.length > 0
&& this.macros['quote-filter']
.call(this, Object.fromEntries(Object.entries(quote)), null, state)
// local filters... // local filters...
if(body){ if(body){
@ -1022,7 +1052,7 @@ object.Constructor('Page', BasePage, {
state.filters = outer_filters state.filters = outer_filters
// parse the body after we are done expanding... // parse the body after we are done expanding...
yield function(state){ return function(state){
var outer_filters = state.filters var outer_filters = state.filters
state.filters = this.__parser__.normalizeFilters(filters) state.filters = this.__parser__.normalizeFilters(filters)
var res = var res =
@ -1115,8 +1145,7 @@ object.Constructor('Page', BasePage, {
// macro with one exception, when used in quote, the body is // macro with one exception, when used in quote, the body is
// not expanded... // not expanded...
// //
// XXX can we set default quote filters??? // XXX need a way to escape macros -- i.e. include </quote> in a quoted text...
// XXX need a way to escape macros...
quote: function(args, body, state){ quote: function(args, body, state){
var src = args.src //|| args[0] var src = args.src //|| args[0]
var text = args.text var text = args.text
@ -1133,16 +1162,37 @@ object.Constructor('Page', BasePage, {
if(!text){ if(!text){
return } return }
var filters = args.filter var filters =
&& Object.fromEntries( args.filter
Object.entries( && args.filter
args.filter .trim()
.trim() .split(/\s+/g)
.split(/\s+/g)))
return filters ? // NOTE: we are delaying .quote_filters handling here to
[...this.macros.filter.call(this, filters, text, state, false)] // make their semantics the same as general filters...
: text }, // ...and since we are internally calling .filter(..)
// macro we need to dance around it's architecture too...
// NOTE: since the body of quote(..) only has filters applied
// to it doing the first stage of .filter(..) as late
// as the second stage here will have no ill effect...
return function(state){
// add global quote-filters...
filters =
(state.quote_filters
&& !(filters ?? []).includes(this.ISOLATED_FILTERS)) ?
[...state.quote_filters, ...(filters ?? [])]
: filters
if(filters){
filters = Object.fromEntries(Object.entries(filters))
return this.macros.filter
.call(this, filters, text, state, false)
.call(this, state) }
return text } },
// very similar to @filter(..) but will affect @quote(..) filters...
'quote-filter': function(args, body, state){
var filters = state.quote_filters =
state.quote_filters ?? []
filters.splice(filters.length, 0, ...Object.values(args)) },
// //
// <slot name=<name>/> // <slot name=<name>/>
// //