diff --git a/browser.js b/browser.js index 82f505d..4cc8ab2 100755 --- a/browser.js +++ b/browser.js @@ -36,7 +36,8 @@ var pwiki = module.pwiki = // XXX //page.DOMPage('/', '/', store) - page.Page('/', '/', store) + //page.Page('/', '/', store) + page.pWikiPageElement('/', '/', store) pwiki.store.update('@local', { diff --git a/pwiki/dom/wikiword.js b/pwiki/dom/wikiword.js index bbaf5fc..657e61e 100755 --- a/pwiki/dom/wikiword.js +++ b/pwiki/dom/wikiword.js @@ -72,11 +72,11 @@ function*(root, skip_empty=true){ // a // [wikiwords=no] // -var wikiword = -module.wikiword = -function(root){ +var wikiWordText = +module.wikiWordText = +function(elem){ var tmp = document.createElement('div') - iterText(pwiki.dom) + iterText(elem) .forEach(function(text){ // skip stuff... if(text.parentNode.nodeName == 'a' diff --git a/pwiki/page.js b/pwiki/page.js index 613f2f8..0e57882 100755 --- a/pwiki/page.js +++ b/pwiki/page.js @@ -54,12 +54,18 @@ module.__HANDLE_NAVIGATE = var BasePage = module.BasePage = object.Constructor('BasePage', { - // NOTE: this can be inherited... - //store: undefined, - // root page used to clone new instances via the .clone(..) method... //root: undefined, + // NOTE: this can be inherited... + //store: undefined, + //__store: undefined, + get store(){ + return this.__store + ?? (this.root ?? {}).__store }, + set store(value){ + this.__store = value }, + // Path variables... // // XXX PATH_VARS should these be here??? @@ -470,7 +476,11 @@ object.Constructor('BasePage', { update: function(...data){ return Object.assign(this, ...data) }, + // XXX should this take an options/dict argument???? __init__: function(path, referrer, store){ + if(referrer && typeof(referrer) != 'string'){ + store = referrer + referrer = undefined } // NOTE: this will allow inheriting .store from the prototype if(store){ this.store = store } @@ -551,6 +561,8 @@ object.Constructor('Page', BasePage, { // XXX one way to do this in a stable manner is to wrap the source // in something like .. and only // process those removing the wrapper in dom... + // ...not sure how to handle -wikiword filter calls -- now + // this is entirely handled by the parser without calling this... wikiword: function(){}, 'quote-wikiword': function(){}, @@ -1095,23 +1107,61 @@ object.Constructor('Page', BasePage, { //--------------------------------------------------------------------- -// XXX do we actually need this??? -var DOMPage = -module.DOMPage = -object.Constructor('DOMPage', Page, { +var wikiword = require('./dom/wikiword') + +var pWikiPageElement = +module.pWikiPageElement = +object.Constructor('pWikiPageElement', Page, { + __page_constructor__: Page, + dom: undefined, - plugins: { - // XXX - wikiword: undefined, + domFilters: { + // XXX see Page.filters.wikiword for notes... + wikiword: wikiword.wikiWordText, }, + get title(){ + return this.dom.getAttribute('title') + || (this.dom.querySelector('h1') || {}).innerText + || this.path }, + // XXX this is not persistent, is this what we want??? + set title(value){ + this.dom.setAttribute('title', value) }, + // events... // - // XXX might be a good idea to move this up to Page and trigger when - // done updating... - onLoad: types.event.Event('onLoad'), + __pWikiLoadedDOMEvent: new Event('pwikiloaded'), + onLoad: types.event.Event('onLoad', function(){ + this.dom.dispatchEvent(this.__pWikiLoadedDOMEvent) }), + + refresh: async function(){ + var dom = this.dom + dom.innerHTML = await this.text + for(var filter of Object.values(this.domFilters)){ + filter + && filter.call(this, dom) } + this.onLoad() + return this }, + + // NOTE: cloning this will return .__page_constructor__ and not + // .constructor instances... + clone: function(){ + // NOTE: we only get full clones here specifically to copy all + // the relevant data... + var page = object.parentCall(pWikiPageElement.prototype.clone, this, ...arguments) + // mutate the constructor... + this.__page_constructor__ + && (page.__proto__ = this.__page_constructor__.prototype) + return page }, + + __init__: function(dom, ...args){ + if(dom instanceof Element){ + this.dom = dom + } else { + args.unshift(dom) } + return object.parentCall(pWikiPageElement.prototype.__init__, this, ...args) }, }) diff --git a/pwiki2.html b/pwiki2.html index a0fc5fc..72abea7 100755 --- a/pwiki2.html +++ b/pwiki2.html @@ -88,58 +88,34 @@ document.pwikiloaded = new Event('pwikiloaded') // start loading pWiki... -require(['./browser', './pwiki/dom/wikiword'], function(pwiki, wikiword){ +require(['./browser'], function(pwiki){ pwiki = window.pwiki = pwiki.pwiki - wikiword = window.wikiword = wikiword.wikiword - // XXX for some reason this sets to undefined... - var iterText = window.iterText = wikiword.iterText - - // XXX make a pWikiDom page to manage this... pwiki.dom = document.querySelector('#pWiki') - // handle location.hash (both directions) - var _debounceHashChange = false - pwiki.onNavigate(async function(){ - // update location.hash without retriggering... - _debounceHashChange = true - location.hash = this.path - setTimeout(function(){ - _debounceHashChange = false }, 0) - // render... - pwiki.dom.innerHTML = await this.text - // pwiki page loaded event... - // XXX do we need to use a MutationObserver here to trigger this - // after the above is done loading??? - // (see: https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver) - pwiki.dom.dispatchEvent(document.pwikiloaded) - - // wikiwords - // XXX this should be controllable from the page... - wikiword(pwiki.dom) - }) - + // handle location.hash/history (both directions) window.addEventListener('hashchange', function(evt){ evt.preventDefault() - if(_debounceHashChange){ - return } var [path, hash] = location.hash.slice(1).split('#') path = path.trim() == '' ? '/' : path - pwiki.path = path + pwiki.path = path }) + pwiki + .onNavigate(function(){ + // NOTE: we do not need to directly update location.hash here as + // that will push an extra history item... + history.replaceState({path: pwiki.path}, pwiki.title, '#'+pwiki.path) + // NOTE: we are intentionally not awaiting for this -- this + // separates the navigate and load events... + pwiki.refresh() }) + .onLoad(function(evt){ + // handle title... + document.querySelector('title').innerHTML = this.title - // XXX when loaded us .scrollIntoView() to get to hash... - // ...would also be nice to keep hash within location.hash... - }) - - - // XXX use a pwiki.onLoad event... - pwiki.dom.addEventListener('pwikiloaded', function(evt){ - console.log('pWiki loaded') - - // XXX scroll - }) + // XXX when loaded us .scrollIntoView() to get to hash... + // ...would also be nice to keep hash within location.hash... + }) // show current page... pwiki.path = location.hash.slice(1)