mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-10-30 18:40:08 +00:00 
			
		
		
		
	reworked loading, history and dom filters (not final)...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									96b2a23421
								
							
						
					
					
						commit
						e0f9b7eaa2
					
				| @ -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', { | ||||
|  | ||||
| @ -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' | ||||
|  | ||||
| @ -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 <span wikiwords=yes> .. </span> 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) }, | ||||
| }) | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										58
									
								
								pwiki2.html
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								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 <elem>.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 <elem>.scrollIntoView() to get to hash... | ||||
| 			//		...would also be nice to keep hash within location.hash... | ||||
| 		}) | ||||
| 
 | ||||
| 	// show current page... | ||||
| 	pwiki.path = location.hash.slice(1) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user