reworked .match2(..) experiemnt into resolve, still thinking...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2022-05-22 13:51:29 +03:00
parent 213603690d
commit e9fa52f550

View File

@ -350,12 +350,11 @@ module.BaseStore = {
// a non-pattern then match the basedir and then add the basename // a non-pattern then match the basedir and then add the basename
// to each resulting path... // to each resulting path...
// XXX EXPERIMENTAL // XXX EXPERIMENTAL
match2: function(path, strict=false){ resolve: function(path){
// pattern match * / ** // pattern match * / **
if(path.includes('*') if(path.includes('*')
|| path.includes('**')){ || path.includes('**')){
path = module.path.split(path) path = module.path.split(path)
// match basedir and addon basename to the result... // match basedir and addon basename to the result...
var name = path[path.length-1] var name = path[path.length-1]
if(name if(name
@ -363,42 +362,11 @@ module.BaseStore = {
&& !name.includes('*')){ && !name.includes('*')){
path.pop() path.pop()
path.push('') path.push('')
return this.match2(path.join('/'), strict) return this.match(path.join('/'), false)
.map(function(p){ .map(function(p){
return module.path.join(p, name) }) } return module.path.join(p, name) }) } }
var order = (this.metadata(path) ?? {}).order || []
// NOTE: we are matching full paths only here so leading and
// trainling '/' are optional...
// NOTE: we ensure that we match full names and always split
// at '/' only...
var pattern = new RegExp(`^\\/?${
module.path.normalize(path, 'string')
.replace(/^\/|\/$/g, '')
.replace(/\//g, '\\/')
.replace(/\*\*/g, '.+')
.replace(/\*/g, '[^\\/]+')
}(?=[\\\\\/]|$)`)
return [...this.paths()
// NOTE: we are not using .filter(..) here as wee
// need to keep parts of the path only and not
// return the whole thing...
.reduce(function(res, p){
// skip metadata paths...
if(p.includes('*')){
return res }
var m = p.match(pattern)
m
&& (!strict
|| m[0] == p)
&& res.add(m[0])
return res }, new Set())]
.sortAs(order) }
// direct... // direct...
for(var p of module.path.paths(path)){ return this.match(path, false) },
p = this.exists(p)
if(p){
return p } } },
// //
// Resolve page // Resolve page
// .get(<path>) // .get(<path>)