diff --git a/pwiki.js b/pwiki.js index e8dd9a1..3d75fe8 100755 --- a/pwiki.js +++ b/pwiki.js @@ -3,8 +3,8 @@ * * **********************************************************************/ -(typeof(define)[0]=='u'?function(f){module.exports=f(require)}:define)( -function(require){ var module={} // makes module AMD/node compatible... +((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define) +(function(require){ var module={} // make module AMD/node compatible... /*********************************************************************/ var object = require('lib/object') @@ -15,7 +15,7 @@ var features = require('lib/features') /*********************************************************************/ -var path2lst = function(path){ +var path2list = function(path){ return (path instanceof Array ? path : path.split(/[\\\/]+/g)) // handle '..' (lookahead) and trim path elements... // NOTE: this will not touch the leading '.' or '..' @@ -28,8 +28,7 @@ var path2lst = function(path){ .filter(function(p){ return p != null && p != '' })} -var normalizePath = function(path){ return path2lst(path).join('/') } - +var normalizePath = function(path){ return path2list(path).join('/') } @@ -58,6 +57,8 @@ var pWikiData = { // get a list of matching paths... // XXX sort API??? + // ...results shoulde be sorted via the saved order if available... + // .....or should this be done at a later stage as in gen1??? match: function(path){ // path patterns -- "*" if(path.indexOf('*') >= 0){ @@ -84,6 +85,7 @@ var pWikiData = { .concat(Object.keys(data.__proto__) // do not repeat overloaded stuff... .filter(function(e){ return !data.hasOwnProperty(e) })) + // XXX sort??? .map(function(p){ return tail != '' ? normalizePath(p +'/'+ tail) : p }) @@ -115,6 +117,9 @@ var pWikiData = { }, // clear data at path... clear: function(path){ + if(this.__data == null){ + return this + } var that = this this.match(path).forEach(function(p){ delete that.__data[p] @@ -127,6 +132,7 @@ var pWikiData = { /*********************************************************************/ +// XXX need a startup sequence... var pWikiPageActions = actions.Actions({ config: { 'home-page': 'WikiHome', @@ -138,6 +144,8 @@ var pWikiPageActions = actions.Actions({ 'Templates', ], 'post-acquesition-order': [], + + 'order-unsorted-first': false, }, // pWikiData... @@ -146,7 +154,7 @@ var pWikiPageActions = actions.Actions({ get length(){ return this.wiki.match(this.location().path).length }, - resolve: ['Resolve relative path and expand path variables', + resolve: ['Path/Resolve relative path and expand path variables', function(path){ path = normalizePath(path) @@ -172,74 +180,15 @@ var pWikiPageActions = actions.Actions({ return path }], - - location: ['Get or set location', - function(value){ - if(value == null){ - return - } - - // XXX should we set/return a default empty value here??? - this.__location = this.__location || {} - - // get location... - if(arguments.length == 0){ - return this.__location || this.config['home-page'] - } - - // set location index... - if(typeof(value) == typeof(123)){ - this.__location.at = value - - // set location path... - } else if(typeof(value) == typeof('str')){ - this.__location.path = this.resolve(value) - this.__location.at = 0 - - // object... - } else { - this.__location = value - } - }], - path: ['Page/Get or set path', - function(value){ - // get explcit path from location (acounting for 'at')... - if(arguments.length == 0){ - var location = this.location() - return this.wiki.match(location.path)[location.at] - - // move page to path... - } else if(value != null) { - this.wiki.move(this.path(), this.resolve(value)) - } - }], - title: ['Page/Get or set title', - function(value){ - if(arguments.length == 0){ - return path2list(this.path()).pop() - - } else if(value != null){ - this.path(this.base() +'/'+ value) - } - }] - base: ['Page/Get or set directory', - function(base){ - if(arguments.length == 0){ - return path2list(this.path()).slice(0, -1).join('/') - - } else if(base != null){ - this.path(base +'/'+ this.title()) - } - }] - - acquire: ['', + // XXX should this get a page??? + acquire: ['Path/Acquire the page path that the given path resolves to', function(path, no_default){ var that = this // handle paths and relative paths... var p = this.get(path) var title = p.title() - path = path2lst(p.base()) + path = path2list(p.base()) var acquire_from = this.config['acquesition-order'] || [] var post_acquire_from = this.config['post-acquesition-order'] || [] @@ -285,12 +234,105 @@ var pWikiPageActions = actions.Actions({ : null) }], + location: ['Page/Get or set location', + function(value){ + if(value == null){ + return + } + + // XXX should we set/return a default empty value here??? + this.__location = this.__location || {} + + // get location... + if(arguments.length == 0){ + return this.__location || this.config['home-page'] + } + + // set location index... + if(typeof(value) == typeof(123)){ + this.__location.at = value + + // set location path... + } else if(typeof(value) == typeof('str')){ + this.__location.path = this.resolve(value) + this.__location.at = 0 + + // object... + } else { + this.__location = value + } + }], + path: ['Page/Get or set path', + function(value){ + // get explcit path from location (acounting for 'at')... + if(arguments.length == 0){ + var location = this.location() + return this.order(true)[location.at] + //return this.wiki.match(location.path)[location.at] + + // move page to path... + } else if(value != null) { + this.wiki.move(this.path(), this.resolve(value)) + } + }], + title: ['Page/Get or set title', + function(value){ + if(arguments.length == 0){ + return path2list(this.path()).pop() + + } else if(value != null){ + this.path(this.base() +'/'+ value) + } + }] + base: ['Page/Get or set directory', + function(base){ + if(arguments.length == 0){ + return path2list(this.path()).slice(0, -1).join('/') + + } else if(base != null){ + this.path(base +'/'+ this.title()) + } + }] + + attr: ['Page/Get or set attribute', + function(name, value){ + var d = this.data() + // get... + if(arguments.length == 1){ + return d[name] + + // clear... + } else if(value === undefined){ + delete d[name] + + // set... + } else { + d[name] = value + } + // XXX is it good to write the whole thing??? + this.data(d) + }], + + // content shorthands... + // XXX raw/text/checked/... + exists: ['Page/Check if path explicitly exists.', function(path){ path = path || this.path() var location = this.location() return this.wiki.match(location.path)[location.at] !== undefined }], + // Format: + // { + // 'order': [