sorted out indexing and paths in .render2(..)...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2019-09-02 19:53:38 +03:00
parent 4c44cf7e8b
commit f5a1ccce77

View File

@ -3113,18 +3113,20 @@ var BaseBrowserPrototype = {
// XXX EXPERIMENTAL.... // XXX EXPERIMENTAL....
// XXX move this out??? // XXX move this out???
// ...should there be a placeholder renderer??? // ...should there be a placeholder renderer???
// XXX do we need i and path args???
__renderer__: { __renderer__: {
// placeholders... // placeholders...
root: null, root: null,
options: null, options: null,
// renderers... // renderers...
elem: function(e){ elem: function(elem, index, path){
return e.id || e }, //return elem.id || elem },
inline: function(lst){ return index },
inline: function(lst, index, path){
return lst }, return lst },
nest: function(header, lst){ nest: function(header, lst, index, path){
header = this.elem(header) header = this.elem(header, index, path)
return [ return [
header, header,
...(lst || []).map(function(e){ ...(lst || []).map(function(e){
@ -3148,10 +3150,20 @@ var BaseBrowserPrototype = {
render2: function(options, renderer){ render2: function(options, renderer){
var that = this var that = this
// XXX args... // XXX args parsing...
renderer = renderer || this.__renderer__ // XXX
renderer = renderer.root == null ?
renderer.start( var args = [...arguments]
var base_path = args[args.length-1] instanceof Array ?
args.pop()
: []
var base_index = typeof(args[args.length-1]) == typeof(123)?
args.pop()
: 0
var render = renderer || this.__renderer__
render = render.root == null ?
render.start(
this, this,
Object.assign( Object.assign(
Object.create(this.options || {}), Object.create(this.options || {}),
@ -3160,40 +3172,58 @@ var BaseBrowserPrototype = {
includeInlinedBlocks: true, includeInlinedBlocks: true,
}, },
options || {})) options || {}))
: renderer : render
options = renderer.options options = render.options
// XXX from/to/around/count...
// XXX
var l
return this.walk(
function(e, i, p, children){
// NOTE: since we let the nested browsers render sections
// of the list, we also need to compensate for the
// number of elements they render...
base_index += (l || []).length
l = []
i += base_index
p = base_path.concat(p)
return this.walk(function(e, i, p, children){
// do not go down child browsers -- use their mechanics for rendering... // do not go down child browsers -- use their mechanics for rendering...
;(e instanceof BaseBrowser || e.children instanceof BaseBrowser) ;(e instanceof BaseBrowser || e.children instanceof BaseBrowser)
&& children(false) && children(false)
return ( return (
// skip...
// XXX
false ?
[]
// inlined... // inlined...
e instanceof BaseBrowser ? : e instanceof BaseBrowser ?
renderer.inline(e.render2(options, renderer)) render.inline(l = e.render2(options, render, i+1, p), i, p)
: e instanceof Array ? : e instanceof Array ?
renderer.inline(children(true)) render.inline(children(true), i, p)
// nested... // nested...
: e.children instanceof BaseBrowser ? : e.children instanceof BaseBrowser ?
renderer.nest(e, render.nest(e,
// NOTE: we handle .collapsed here as the nested // NOTE: we handle .collapsed here as the nested
// browser is one level down and knows nothing // browser is one level down and knows nothing
// of it... // of it...
(options.iterateCollapsed || !e.collapsed) (options.iterateCollapsed || !e.collapsed)
&& e.children.render2(options, renderer)) && (l = e.children.render2(options, render, i+1, p)),
i, p)
: e.children instanceof Array ? : e.children instanceof Array ?
renderer.nest(e, children(true)) render.nest(e, children(true), i, p)
// normal item... // normal item...
: renderer.elem(e) ) : render.elem(e, i, p) )
}, options) }, options)
.run(function(){ .run(function(){
return renderer.root === that ? return render.root === that ?
// finalize render... // finalize render...
renderer.finalize(this) render.finalize(this)
: this }) }, : this }) },