mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-10-31 02:50: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 =  | module.pwiki =  | ||||||
| 	// XXX
 | 	// XXX
 | ||||||
| 	//page.DOMPage('/', '/', store)
 | 	//page.DOMPage('/', '/', store)
 | ||||||
| 	page.Page('/', '/', store) | 	//page.Page('/', '/', store)
 | ||||||
|  | 	page.pWikiPageElement('/', '/', store) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| pwiki.store.update('@local', { | pwiki.store.update('@local', { | ||||||
|  | |||||||
| @ -72,11 +72,11 @@ function*(root, skip_empty=true){ | |||||||
| // 	a
 | // 	a
 | ||||||
| // 	[wikiwords=no]
 | // 	[wikiwords=no]
 | ||||||
| //
 | //
 | ||||||
| var wikiword = | var wikiWordText = | ||||||
| module.wikiword = | module.wikiWordText = | ||||||
| function(root){ | function(elem){ | ||||||
| 	var tmp = document.createElement('div') | 	var tmp = document.createElement('div') | ||||||
| 	iterText(pwiki.dom) | 	iterText(elem) | ||||||
| 		.forEach(function(text){ | 		.forEach(function(text){ | ||||||
| 			// skip stuff...
 | 			// skip stuff...
 | ||||||
| 			if(text.parentNode.nodeName == 'a' | 			if(text.parentNode.nodeName == 'a' | ||||||
|  | |||||||
| @ -54,12 +54,18 @@ module.__HANDLE_NAVIGATE = | |||||||
| var BasePage = | var BasePage = | ||||||
| module.BasePage =  | module.BasePage =  | ||||||
| object.Constructor('BasePage', { | object.Constructor('BasePage', { | ||||||
| 	// NOTE: this can be inherited...
 |  | ||||||
| 	//store: undefined,
 |  | ||||||
| 	 |  | ||||||
| 	// root page used to clone new instances via the .clone(..) method...
 | 	// root page used to clone new instances via the .clone(..) method...
 | ||||||
| 	//root: undefined,
 | 	//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...
 | 	// Path variables...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// XXX PATH_VARS should these be here???
 | 	// XXX PATH_VARS should these be here???
 | ||||||
| @ -470,7 +476,11 @@ object.Constructor('BasePage', { | |||||||
| 	update: function(...data){ | 	update: function(...data){ | ||||||
| 		return Object.assign(this, ...data) }, | 		return Object.assign(this, ...data) }, | ||||||
| 
 | 
 | ||||||
|  | 	// XXX should this take an options/dict argument????
 | ||||||
| 	__init__: function(path, referrer, store){ | 	__init__: function(path, referrer, store){ | ||||||
|  | 		if(referrer && typeof(referrer) != 'string'){ | ||||||
|  | 			store = referrer | ||||||
|  | 			referrer = undefined } | ||||||
| 		// NOTE: this will allow inheriting .store from the prototype
 | 		// NOTE: this will allow inheriting .store from the prototype
 | ||||||
| 		if(store){ | 		if(store){ | ||||||
| 			this.store = 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 
 | 		// XXX one way to do this in a stable manner is to wrap the source 
 | ||||||
| 		// 		in something like <span wikiwords=yes> .. </span> and only 
 | 		// 		in something like <span wikiwords=yes> .. </span> and only 
 | ||||||
| 		// 		process those removing the wrapper in dom...
 | 		// 		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(){},  | 		wikiword: function(){},  | ||||||
| 		'quote-wikiword': function(){}, | 		'quote-wikiword': function(){}, | ||||||
| 
 | 
 | ||||||
| @ -1095,23 +1107,61 @@ object.Constructor('Page', BasePage, { | |||||||
| 
 | 
 | ||||||
| //---------------------------------------------------------------------
 | //---------------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| // XXX do we actually need this???
 | var wikiword = require('./dom/wikiword') | ||||||
| var DOMPage = | 
 | ||||||
| module.DOMPage =  | var pWikiPageElement = | ||||||
| object.Constructor('DOMPage', Page, { | module.pWikiPageElement =  | ||||||
|  | object.Constructor('pWikiPageElement', Page, { | ||||||
|  | 	__page_constructor__: Page, | ||||||
|  | 
 | ||||||
| 	dom: undefined, | 	dom: undefined, | ||||||
| 
 | 
 | ||||||
| 	plugins: { | 	domFilters: { | ||||||
| 		// XXX
 | 		// XXX see Page.filters.wikiword for notes...
 | ||||||
| 		wikiword: undefined, | 		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...
 | 	// events...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// XXX might be a good idea to move this up to Page and trigger when 
 | 	__pWikiLoadedDOMEvent: new Event('pwikiloaded'), | ||||||
| 	// 		done updating...
 | 	onLoad: types.event.Event('onLoad', function(){ | ||||||
| 	onLoad: types.event.Event('onLoad'), | 		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) }, | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										52
									
								
								pwiki2.html
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								pwiki2.html
									
									
									
									
									
								
							| @ -88,59 +88,35 @@ document.pwikiloaded = new Event('pwikiloaded') | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // start loading pWiki... | // start loading pWiki... | ||||||
| require(['./browser', './pwiki/dom/wikiword'], function(pwiki, wikiword){  | require(['./browser'], function(pwiki){  | ||||||
| 	pwiki = window.pwiki = pwiki.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') | 	pwiki.dom = document.querySelector('#pWiki') | ||||||
| 
 | 
 | ||||||
| 	// handle location.hash (both directions) | 	// handle location.hash/history (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) |  | ||||||
| 	}) |  | ||||||
| 
 |  | ||||||
| 	window.addEventListener('hashchange', function(evt){ | 	window.addEventListener('hashchange', function(evt){ | ||||||
| 		evt.preventDefault() | 		evt.preventDefault() | ||||||
| 		if(_debounceHashChange){ |  | ||||||
| 			return } |  | ||||||
| 		var [path, hash] = location.hash.slice(1).split('#') | 		var [path, hash] = location.hash.slice(1).split('#') | ||||||
| 		path = path.trim() == '' ?  | 		path = path.trim() == '' ?  | ||||||
| 			'/'  | 			'/'  | ||||||
| 			: path | 			: 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... | 			// XXX when loaded us <elem>.scrollIntoView() to get to hash... | ||||||
| 			//		...would also be nice to keep hash within location.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 |  | ||||||
| 	}) |  | ||||||
| 
 |  | ||||||
| 	// show current page... | 	// show current page... | ||||||
| 	pwiki.path = location.hash.slice(1) | 	pwiki.path = location.hash.slice(1) | ||||||
| })  | })  | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user