diff --git a/pwiki.js b/pwiki.js index b4421ea..6474396 100755 --- a/pwiki.js +++ b/pwiki.js @@ -126,6 +126,10 @@ var pWikiData = { }) return this }, + + // XXX + json: function(data){ + }, } @@ -151,6 +155,11 @@ var pWikiPageActions = actions.Actions({ // pWikiData... wiki: null, + + // XXX should this be loca/dump??? + json: ['', function(){ }], + + get length(){ return this.wiki.match(this.location().path).length }, @@ -452,6 +461,11 @@ var pWikiPageActions = actions.Actions({ // .order('local') // -> order // + // Save current order... + // .order('current') + // -> order + // NOTE: this is a shorthand for p.order(p.order()) + // // Save list of titles as order... // .order([, .. ]) // -> order @@ -472,8 +486,13 @@ var pWikiPageActions = actions.Actions({ order = null // save local order... + // XXX is this correct??? } else if(order == 'local'){ order = this.__order + + // save current order... + } else if(order == 'current'){ + return this.order(this.order()) } // get order... @@ -540,12 +559,170 @@ var pWikiPageActions = actions.Actions({ this.__order = order } }], + + __default_sort_methods__: ['path'], + __sort_methods__: { + title: function(a, b){ + return a.page.title() < b.page.title() ? -1 + : a.page.title() > b.page.title() ? 1 + : 0 + }, + path: function(a, b){ + return a.page.path() < b.page.path() ? -1 + : a.page.path() > b.page.path() ? 1 + : 0 + }, + // XXX + /* + checked: function(a, b){ + // XXX chech if with similar states the order is kept.... + return a.page.checked() == b.page.checked() ? 0 + : a.page.checked() ? 1 + : -1 + }, + */ + // XXX date, ... + + // XXX use manual order and palce new items (not in order) at + // top/bottom (option)... + // XXX store the order in .__wiki_data + manual: function(a, b){ + // XXX + return 0 + }, + }, + + // Sort siblings... + // + // Sort pages via default method + // .sort() + // -> page + // + // Sort pages via method + // .sort(method) + // -> page + // + // Sort pages via method1, then method2, ... + // .sort(method1, method2, ...) + // -> page + // NOTE: the next method is used iff the previous returns 0, + // i.e. the items are equal. + // + // To reverse a specific method, prepend it's name with "-", e.g. + // "title" will do the default ascending sort while "-title" will do + // a descending sort. + // This is different from the "reverse" method which will simply + // reverse the result. + // + // NOTE: the sort is local to the returned object. + // NOTE: the sorted object may loose sync form the actual wiki as the + // list of siblings is cached. + // ...the resulting object is not to be stored for long. // XXX - sort: ['Page/', function(){ }], + sort: ['Page/', + function(){ + var that = this + var res = this.clone() + var path = res.path + + var methods = arguments[0] instanceof Array ? + arguments[0] + : [].slice.call(arguments) + + res.__order_by = methods = methods.length == 0 ? + (this.__default_sort_methods__ + || pWikiPage.__default_sort_methods__) + : methods + + res.update() + + return res + }], // XXX - reverse: ['Page/', function(){ }], + reverse: ['Page/', + function(){ + var res = this.clone() + + res.__order_by = (this.__order_by || []).slice() + + var i = res.__order_by.indexOf('reverse') + + i >= 0 ? + res.__order_by.splice(i, 1) + : res.__order_by.push('reverse') + + res.update() + + return res + }], // XXX not sure if this is the right way to go... - update: ['Page/', function(){ }], + // XXX + update: ['Page/', + function(){ + var that = this + + if(this.__order || this.__order_by){ + var path = this.path + var reverse = false + + var sort_methods = this.__sort_methods__ + || pWikiPage.__sort_methods__ + + var methods = (this.__order_by + || this.__default_sort_methods__ + || pWikiPage.__default_sort_methods__) + .map(function(m){ + var reversed = m[0] == '-' + m = reversed ? m.slice(1) : m + + if(m == 'reverse'){ + reverse = !reverse + return null + } + m = typeof(m) == typeof('str') ? sort_methods[m] + : m instanceof Function ? m + : null + + return m != null ? + (reversed ? + function(){ return -m.apply(this, arguments) } + : m) + : m + }) + .filter(function(m){ return !!m }) + + // XXX + //this.__order = this.resolveStarPath(this.location) + this.__order = this.order() + + if(methods.length > 0){ + var method = function(a, b){ + for(var i=0; i < methods.length; i++){ + var res = methods[i].call(that, a, b) + + if(res != 0){ + return res + } + } + // keep order if nothing else works... + return a.i - b.i + } + + this.__order = this.__order + .map(function(t, i){ return { + i: i, + page: that.get(t), + } }) + .sort(method) + .map(function(t){ return t.page.path }) + } + + reverse + && this.__order.reverse() + + this.__location_at = this.__order.indexOf(path) + } + }], }) var pWikiPage = pWikiFeatures.Featre({ @@ -602,6 +779,13 @@ var pWikiPouchDBStore = pWikiFeatures.Featre({ +var pWikiPeerJSSync = pWikiFeatures.Featre({ + title: '', + tag: 'peerjs-sync', +}) + + + /*********************************************************************/ // XXX should this extend pWiki or encapsulate??? @@ -609,14 +793,25 @@ var pWikiUIActions = actions.Actions({ config: { }, + // XXX url? + // - couch url + // - 'local' + load: ['', function(){}], + + reload: ['', function(){}], + // XXX navigation... + // ...these in addition to default scrolling should focus elements up: ['', function(){}], down: ['', function(){}], left: ['', function(){}], right: ['', function(){}], - toggleEdit: ['', function(){}], togglePages: ['', function(){}], + toggleWikis: ['', function(){}], + + // should this be in the editor feature??? + toggleEdit: ['', function(){}], }) var pWikiUI = pWikiFeatures.Featre({