mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-10-30 02:20:08 +00:00 
			
		
		
		
	now writing to direct actions like './name' works...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									39582485f7
								
							
						
					
					
						commit
						d73de66ac7
					
				| @ -211,10 +211,19 @@ object.Constructor('BasePage', { | ||||
| 	// XXX should these be writable???
 | ||||
| 	get name(){ | ||||
| 		return pwpath.basename(this.path) }, | ||||
| 	//set name(value){ },
 | ||||
| 	set name(value){ | ||||
| 		this.move( | ||||
| 			/^[\\\/]/.test(value) ? | ||||
| 				value | ||||
| 				: '../'+value) }, | ||||
| 	get dir(){ | ||||
| 		return pwpath.dirname(this.path) }, | ||||
| 	//set dir(value){ },
 | ||||
| 	set dir(value){  | ||||
| 		var to = pwpath.join(value, this.name) | ||||
| 		this.move( | ||||
| 			/^[\\\/]/.test(to) ? | ||||
| 				to | ||||
| 				: '../'+to) }, | ||||
| 
 | ||||
| 	/*/ XXX TITLE... | ||||
| 	// NOTE: .__title is intentionally not persistent...
 | ||||
| @ -315,7 +324,25 @@ object.Constructor('BasePage', { | ||||
| 			res.bind(this) | ||||
| 			: res }).call(this) }, | ||||
| 	set data(value){ | ||||
| 		this.__update__(value) }, | ||||
| 		if(this.actions  | ||||
| 				&& this.actions[this.name]){ | ||||
| 			var name =  | ||||
| 				this.actions[this.name] === true ? | ||||
| 					this.name | ||||
| 					: this.actions[this.name] | ||||
| 			var page = this.get('..') | ||||
| 			// NOTE: this can return a promise, as we'll need to assign 
 | ||||
| 			// 		we do not care about it as long as it's not a function...
 | ||||
| 			// 		XXX not sure if this is a good idea...
 | ||||
| 			var res = page[name] | ||||
| 			// set...
 | ||||
| 			typeof(res) == 'function' ? | ||||
| 				page[name](value.text ?? value) | ||||
| 			: (page[name] = value.text ?? value) | ||||
| 
 | ||||
| 		// normal update...
 | ||||
| 		} else { | ||||
| 			this.__update__(value) } }, | ||||
| 
 | ||||
| 	// metadata...
 | ||||
| 	//
 | ||||
| @ -1413,7 +1440,7 @@ object.Constructor('Page', BasePage, { | ||||
| 					.flat()) | ||||
|    			: data.text )}).call(this) }, | ||||
| 	set raw(value){ | ||||
| 		this.__update__({text: value}) }, | ||||
| 		this.data = {text: value} }, | ||||
| 		//this.onTextUpdate(value) },
 | ||||
| 
 | ||||
| 	// iterate matches or content list as pages...
 | ||||
| @ -1510,7 +1537,7 @@ object.Constructor('Page', BasePage, { | ||||
| 					renderer: this, | ||||
| 				}) }).call(this) }, | ||||
| 	set text(value){ | ||||
| 		this.__update__({text: value}) }, | ||||
| 		this.data = {text: value} }, | ||||
| 		//this.onTextUpdate(value) },
 | ||||
| 
 | ||||
| 	// pass on .renderer to clones...
 | ||||
| @ -1788,12 +1815,12 @@ module.System = { | ||||
| 	// XXX all of these should support pattern pages...
 | ||||
| 	_text: { | ||||
| 		text: '@include(.:$ARGS isolated join="@source(file-separator)")' }, | ||||
| 	// XXX /rootpath here is not relative -- makes reuse harder...
 | ||||
| 	_view: { | ||||
| 		text: object.doc` | ||||
| 			<slot name="header"> | ||||
| 				<a href="#/list">☰</a> | ||||
| 				@source(./location/!) | ||||
| 				<a href="javascript:refresh()">⟳</a> | ||||
| 				<a href="#@source(./path/!)/edit">✎</a> | ||||
| 			</slot> | ||||
| 			<hr> | ||||
| @ -1825,7 +1852,7 @@ module.System = { | ||||
| 					+'<pre class="editor" ' | ||||
| 							+'wikiwords="no" ' | ||||
| 							+'contenteditable ' | ||||
| 							+'oninput="saveContent(\'@source(./path)\', this.innerText)">' | ||||
| 							+'oninput="saveLiveContent(\'@source(./path)\', this.innerText)">' | ||||
| 						+'<quote filter="quote-tags" src="."/>' | ||||
| 					+'</pre>'  | ||||
| 				+'</macro>' | ||||
| @ -1839,13 +1866,13 @@ module.System = { | ||||
| 				+'<h1 ' | ||||
| 						+'contenteditable ' | ||||
| 						// XXX need to make this savable...
 | ||||
| 						+'oninput="saveContent(\'@source(./path)/name\')">'  | ||||
| 						+'oninput="saveLiveContent(\'@source(./path)/name\')">'  | ||||
| 					+'@source(./name)' | ||||
| 				+'</h1>' | ||||
| 				+'<pre class="editor" ' | ||||
| 						+'wikiwords="no" ' | ||||
| 						+'contenteditable ' | ||||
| 						+'oninput="saveContent(\'@source(./path)\', this.innerText)">' | ||||
| 						+'oninput="saveLiveContent(\'@source(./path)\', this.innerText)">' | ||||
| 					+'<quote filter="quote-tags" src="."/>' | ||||
| 				+'</pre>'  | ||||
| 			+'</macro>'}, | ||||
| @ -1858,13 +1885,13 @@ module.System = { | ||||
| 				<macro src=".." join="@source(file-separator)"> | ||||
| 					<h1 class="title-editor" | ||||
| 							contenteditable  | ||||
| 							oninput="saveContent(\'@source(./path)/name\')"> | ||||
| 							oninput="saveContent(\'@source(./path)/name\', this.innerText)"> | ||||
| 						@source(./name) | ||||
| 					</h1> | ||||
| 					<pre class="editor" | ||||
| 							wikiwords="no" | ||||
| 							contenteditable | ||||
| 							oninput="saveContent(\'@source(./path)\', this.innerText)" | ||||
| 							oninput="saveLiveContent(\'@source(./path)\', this.innerText)" | ||||
| 					><quote filter="quote-tags" src="."/></pre>  | ||||
| 				</macro> | ||||
| 			</slot>`}, | ||||
| @ -1967,20 +1994,16 @@ module.System = { | ||||
| 	// page actions...
 | ||||
| 	//
 | ||||
| 	 | ||||
| 	// XXX broken... 
 | ||||
| 	// XXX this does not work as energetic...
 | ||||
| 	time: async function(){ | ||||
| 		var t = Date.now() | ||||
| 		var text = await this.get('../_text').text | ||||
| 		var time = Date.now() - t | ||||
| 
 | ||||
| 		console.log('RENDER TIME:', time) | ||||
| 
 | ||||
| 		return object.doc` | ||||
| 		Time to render: ${time}ms <br> | ||||
| 		<ht> | ||||
| 		${text}`},
 | ||||
| 	//*/
 | ||||
| 			Time to render: ${time}ms <br> | ||||
| 			<hr> | ||||
| 			${text}`},
 | ||||
| 	 | ||||
| 	// XXX EXPERIMENTAL -- page types...
 | ||||
| 	isAction: async function(){ | ||||
| @ -2040,9 +2063,9 @@ module.System = { | ||||
| 			&& this.renderer.refresh() | ||||
| 		// XXX returning undefined will stop the redirect...
 | ||||
| 		return '' }, | ||||
| 	// XXX copy/move/...
 | ||||
| 	// XXX do we need this as a page action???
 | ||||
| 	move: function(){ | ||||
| 	// NOTE: this moves relative to the basedir and not relative to the 
 | ||||
| 	// 		page...
 | ||||
| 	move: async function(){ | ||||
| 		var from = this.get('..') | ||||
| 		// XXX this is ugly...
 | ||||
| 		// 		...need to standardize how we get arguments when rendering....
 | ||||
| @ -2050,19 +2073,25 @@ module.System = { | ||||
| 			|| (this.renderer || {args:{}}).args.to | ||||
| 
 | ||||
| 		console.log('MOVE:', from.path, to) | ||||
| 		// XXX
 | ||||
| 		if(to){ | ||||
| 			// XXX move...
 | ||||
| 		} | ||||
| 
 | ||||
| 		to | ||||
| 			&& await from.move( | ||||
| 				/^[\\\/]/.test(to[0]) ? | ||||
| 					to | ||||
| 					: pwpath.join('..', to)) | ||||
| 
 | ||||
| 		// redirect...
 | ||||
| 		this.renderer | ||||
| 			&& (this.renderer.location = this.referrer) | ||||
| 			&& to | ||||
| 			//&& (this.renderer.location = this.referrer)
 | ||||
| 			&& (this.renderer.location = from.path) | ||||
| 			// XXX this should not be needed...
 | ||||
| 			&& this.renderer.refresh() | ||||
| 		// XXX if we return undefined here this will not fully redirect, 
 | ||||
| 		// 		keeping the move page open but setting the url to the 
 | ||||
| 		// 		redirected page...
 | ||||
| 		return '' }, | ||||
| 	// XXX copy/...
 | ||||
| 
 | ||||
| 	// XXX System/back
 | ||||
| 	// XXX System/forward
 | ||||
|  | ||||
							
								
								
									
										68
									
								
								pwiki2.html
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								pwiki2.html
									
									
									
									
									
								
							| @ -173,22 +173,41 @@ require.config({ | ||||
| // Editor -- save changes... | ||||
| 
 | ||||
| // XXX versioning?? | ||||
| var SAVE_TIMEOUT = 5000 | ||||
| var SAVE_LIVE_TIMEOUT = 5000 | ||||
| var SAVE_LIVE_QUEUE = {} | ||||
| 
 | ||||
| var saveLiveContent =  | ||||
| function(path, text){ | ||||
| 	SAVE_LIVE_QUEUE[path] = text  | ||||
| 	// clear editor page cache... | ||||
| 	pwiki.cache = null } | ||||
| 
 | ||||
| var SAVE_QUEUE = {} | ||||
| var saveContent =  | ||||
| 	function(path, text){ | ||||
| 		SAVE_QUEUE[path] = text  | ||||
| 		// clear editor page cache... | ||||
| 		pwiki.cache = null } | ||||
| var saveContent = | ||||
| function(path, text){ | ||||
| 	SAVE_QUEUE[path] = text | ||||
| } | ||||
| 
 | ||||
| var saveAll = | ||||
| function(){ | ||||
| 	saveNow() | ||||
| 	var queue = Object.entries(SAVE_QUEUE) | ||||
| 	SAVE_QUEUE = {} | ||||
| 	queue | ||||
| 		.forEach(function([path, text]){ | ||||
| 			console.log('saving changes to:', path) | ||||
| 			pwiki.get(path).raw = text }) } | ||||
| 
 | ||||
| var saveNow =  | ||||
| 	function(){ | ||||
| 		var queue = Object.entries(SAVE_QUEUE) | ||||
| 		SAVE_QUEUE = {} | ||||
| 		queue | ||||
| 			.forEach(function([path, text]){ | ||||
| 				console.log('saving changes to:', path) | ||||
| 				pwiki.get(path).raw = text }) } | ||||
| setInterval(saveNow, 5000) | ||||
| function(){ | ||||
| 	var queue = Object.entries(SAVE_LIVE_QUEUE) | ||||
| 	SAVE_LIVE_QUEUE = {} | ||||
| 	NEW_TITLE = undefined | ||||
| 	queue | ||||
| 		.forEach(function([path, text]){ | ||||
| 			console.log('saving changes to:', path) | ||||
| 			pwiki.get(path).raw = text }) } | ||||
| setInterval(saveNow, SAVE_LIVE_TIMEOUT) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| @ -206,8 +225,6 @@ window.stopSpinner = function(){ | ||||
| //--------------------------------------------------------------------- | ||||
| // General setup... | ||||
| 
 | ||||
| REFRESH_DELAY = 20 | ||||
| 
 | ||||
| document.pwikiloaded = new Event('pwikiloaded') | ||||
| 
 | ||||
| var logTime = async function(promise, msg=''){ | ||||
| @ -223,6 +240,16 @@ var logTime = async function(promise, msg=''){ | ||||
| 	return res } | ||||
| 
 | ||||
| 
 | ||||
| REFRESH_DELAY = 20 | ||||
| 
 | ||||
| var refresh = async function(){ | ||||
| 	startSpinner() | ||||
| 	setTimeout(function(){ | ||||
| 		logTime( | ||||
| 			pwiki.refresh(),  | ||||
| 			pwiki.location) }, REFRESH_DELAY) } | ||||
| 
 | ||||
| 
 | ||||
| // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  | ||||
| // start loading pWiki... | ||||
| require(['./browser'], function(browser){  | ||||
| @ -248,7 +275,7 @@ require(['./browser'], function(browser){ | ||||
| 			pwiki.location = [path, hash] }, REFRESH_DELAY) }) | ||||
| 	pwiki | ||||
| 		.onBeforeNavigate(function(){ | ||||
| 			saveNow() }) | ||||
| 			saveAll() }) | ||||
| 		.onNavigate(async function(){ | ||||
| 			// NOTE: we do not need to directly update location.hash here as | ||||
| 			//		that will push an extra history item... | ||||
| @ -279,12 +306,7 @@ require(['./browser'], function(browser){ | ||||
| 			// NOTE: we need to do this as hashchange is only triggered  | ||||
| 			//		when the hash is actually changed... | ||||
| 			for(var lnk of this.dom.querySelectorAll(`a[href="${location.hash}"]`)){ | ||||
| 				lnk.addEventListener('click', function(evt){ | ||||
| 					startSpinner() | ||||
| 					setTimeout(function(){ | ||||
| 						logTime( | ||||
| 							that.refresh(),  | ||||
| 							that.location) }, REFRESH_DELAY) }) } }) | ||||
| 				lnk.addEventListener('click', refresh) } }) | ||||
| 
 | ||||
| 	// wait for stuff to finish... | ||||
| 	browser.setup.then(function(){ | ||||
|  | ||||
| @ -55,6 +55,8 @@ | ||||
| * 			i.e. a way to pass tags through path... | ||||
| * 				/some/path:tags=a,b,c | ||||
| * XXX FEATURE images... | ||||
| * XXX generalize html/dom api... | ||||
| * 		...see refresh() in pwiki2.html | ||||
| * XXX async/live render... | ||||
| * 		might be fun to push the async parts of the render to the dom... | ||||
| * 		...i.e. return a partially rendered DOM with handlers to fill  | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user