mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-10-31 02:50:08 +00:00 
			
		
		
		
	more refactoring...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									5c69b03ad6
								
							
						
					
					
						commit
						8f83ea587c
					
				| @ -11,11 +11,38 @@ | |||||||
| var Outline = { | var Outline = { | ||||||
| 	dom: undefined, | 	dom: undefined, | ||||||
| 
 | 
 | ||||||
| 	focused: function(){}, | 	// config...
 | ||||||
| 	edited: function(){}, | 	//
 | ||||||
|  | 	left_key_expands: false, | ||||||
|  | 	right_key_collapses: true, | ||||||
| 
 | 
 | ||||||
| 	focus: function(node=undefined){}, | 
 | ||||||
| 	edit: function(node=undefined){}, | 	// XXX revise name...
 | ||||||
|  | 	Block: function(place=none){ | ||||||
|  | 		var block = document.createElement('div') | ||||||
|  | 		block.setAttribute('tabindex', '0') | ||||||
|  | 		block.append( | ||||||
|  | 			document.createElement('span'), | ||||||
|  | 			document.createElement('textarea') | ||||||
|  | 				.autoUpdateSize()) | ||||||
|  | 		var cur = getFocused() | ||||||
|  | 			|| getEditable()?.parentElement | ||||||
|  | 		place && cur | ||||||
|  | 			&& cur[place](block) | ||||||
|  | 		return block }, | ||||||
|  | 
 | ||||||
|  | 	// XXX
 | ||||||
|  | 	get: function(){ | ||||||
|  | 	}, | ||||||
|  | 	focused: function(offset, selector){ | ||||||
|  | 	}, | ||||||
|  | 	edited: function(offset){ | ||||||
|  | 		return this.focused(offset, 'textarea')}, | ||||||
|  | 
 | ||||||
|  | 	focus: function(node='focused'){}, | ||||||
|  | 	edit: function(node='focused'){}, | ||||||
|  | 	indent: function(node='focused'){}, | ||||||
|  | 	collapse: function(node='focused'){}, | ||||||
| 
 | 
 | ||||||
| 	// block serialization...
 | 	// block serialization...
 | ||||||
| 	__code2html__: function(code){ | 	__code2html__: function(code){ | ||||||
| @ -23,6 +50,37 @@ var Outline = { | |||||||
| 	__html2code__: function(html){ | 	__html2code__: function(html){ | ||||||
| 		return html }, | 		return html }, | ||||||
| 
 | 
 | ||||||
|  | 	// serialization...
 | ||||||
|  | 	json: function(node){ | ||||||
|  | 		var that = this | ||||||
|  | 		node ??= this.dom | ||||||
|  | 		return [...node.children] | ||||||
|  | 			.map(function(elem){ | ||||||
|  | 				return elem.nodeName != 'DIV' ? | ||||||
|  | 					[] | ||||||
|  | 					: [{ | ||||||
|  | 						text: that.__html2code__ ? | ||||||
|  | 							that.__html2code__(elem.querySelector('span').innerHTML) | ||||||
|  | 							: elem.querySelector('span').innerHTML, | ||||||
|  | 						collapsed: elem.getAttribute('collapsed') != null, | ||||||
|  | 						children: that.json(elem) | ||||||
|  | 					}] }) | ||||||
|  | 			.flat() }, | ||||||
|  | 	text: function(node, indent=''){ | ||||||
|  | 		node ??= this.json(node) | ||||||
|  | 		var text = '' | ||||||
|  | 		for(var elem of node){ | ||||||
|  | 			text +=  | ||||||
|  | 				indent | ||||||
|  | 				+'- ' | ||||||
|  | 				+ elem.text | ||||||
|  | 					.replace(/\n/g, '\n  '+indent)  | ||||||
|  | 				+'\n' | ||||||
|  | 				+ this.text(elem.children || [], indent+'  ') } | ||||||
|  | 		return text }, | ||||||
|  | 
 | ||||||
|  | 	// XXX use .__code2html__(..)
 | ||||||
|  | 	load: function(){}, | ||||||
| 
 | 
 | ||||||
| 	keyboard: { | 	keyboard: { | ||||||
| 		// vertical navigation...
 | 		// vertical navigation...
 | ||||||
| @ -52,7 +110,7 @@ var Outline = { | |||||||
| 			if(this.dom.querySelector('.editor textarea:focus')){ | 			if(this.dom.querySelector('.editor textarea:focus')){ | ||||||
| 				// XXX if at end of element move to next...
 | 				// XXX if at end of element move to next...
 | ||||||
| 				return } | 				return } | ||||||
| 			if(LEFT_COLLAPSE){ | 			if(this.left_key_expands){ | ||||||
| 					toggleCollapse(true) | 					toggleCollapse(true) | ||||||
| 					getFocused('parent')?.focus() | 					getFocused('parent')?.focus() | ||||||
| 			} else {  | 			} else {  | ||||||
| @ -63,7 +121,7 @@ var Outline = { | |||||||
| 			if(this.dom.querySelector('.editor textarea:focus')){ | 			if(this.dom.querySelector('.editor textarea:focus')){ | ||||||
| 				// XXX if at end of element move to next...
 | 				// XXX if at end of element move to next...
 | ||||||
| 				return } | 				return } | ||||||
| 			if(RIGHT_EXPAND){ | 			if(this.right_key_collapses){ | ||||||
| 				toggleCollapse(false)  | 				toggleCollapse(false)  | ||||||
| 				var child = getFocused('child') | 				var child = getFocused('child') | ||||||
| 				child?.focus() | 				child?.focus() | ||||||
| @ -87,11 +145,11 @@ var Outline = { | |||||||
| 		O: function(evt){ | 		O: function(evt){ | ||||||
| 			if(evt.target.nodeName != 'TEXTAREA'){ | 			if(evt.target.nodeName != 'TEXTAREA'){ | ||||||
| 				evt.preventDefault() | 				evt.preventDefault() | ||||||
| 				createBlock('before')?.querySelector('textarea')?.focus() } }, | 				this.Block('before')?.querySelector('textarea')?.focus() } }, | ||||||
| 		o: function(evt){ | 		o: function(evt){ | ||||||
| 			if(evt.target.nodeName != 'TEXTAREA'){ | 			if(evt.target.nodeName != 'TEXTAREA'){ | ||||||
| 				evt.preventDefault() | 				evt.preventDefault() | ||||||
| 				createBlock('after')?.querySelector('textarea')?.focus() } }, | 				this.Block('after')?.querySelector('textarea')?.focus() } }, | ||||||
| 		Enter: function(evt){ | 		Enter: function(evt){ | ||||||
| 			/*if(evt.target.isContentEditable){ | 			/*if(evt.target.isContentEditable){ | ||||||
| 				// XXX create new node...
 | 				// XXX create new node...
 | ||||||
| @ -102,7 +160,7 @@ var Outline = { | |||||||
| 				return } | 				return } | ||||||
| 			evt.preventDefault() | 			evt.preventDefault() | ||||||
| 			evt.target.nodeName == 'TEXTAREA' ? | 			evt.target.nodeName == 'TEXTAREA' ? | ||||||
| 				createBlock('after')?.querySelector('textarea')?.focus() | 				this.Block('after')?.querySelector('textarea')?.focus() | ||||||
| 				: getFocused()?.querySelector('textarea')?.focus() }, | 				: getFocused()?.querySelector('textarea')?.focus() }, | ||||||
| 		Escape: function(evt){ | 		Escape: function(evt){ | ||||||
| 			this.dom.querySelector('textarea:focus')?.parentElement?.focus() }, | 			this.dom.querySelector('textarea:focus')?.parentElement?.focus() }, | ||||||
| @ -148,14 +206,11 @@ var Outline = { | |||||||
| 							that.__code2html__(node.value) | 							that.__code2html__(node.value) | ||||||
| 							: node.value } }) | 							: node.value } }) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 		return this }, | 		return this }, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| //---------------------------------------------------------------------
 | //---------------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -267,43 +322,7 @@ var toggleCollapse = function(node, state='next'){ | |||||||
| 	return node } | 	return node } | ||||||
| 
 | 
 | ||||||
| // XXX add reference node...
 | // XXX add reference node...
 | ||||||
| var createBlock = function(place=none){ |  | ||||||
| 	var block = document.createElement('div') |  | ||||||
| 	block.setAttribute('tabindex', '0') |  | ||||||
| 	block.append( |  | ||||||
| 		document.createElement('span'), |  | ||||||
| 		document.createElement('textarea') |  | ||||||
| 			.autoUpdateSize()) |  | ||||||
| 	var cur = getFocused() |  | ||||||
| 		|| getEditable()?.parentElement |  | ||||||
| 	place && cur |  | ||||||
| 		&& cur[place](block) |  | ||||||
| 	return block } |  | ||||||
| 
 | 
 | ||||||
| var json = function(node){ |  | ||||||
| 	node ??= document.querySelector('.editor') |  | ||||||
| 	return [...node.children] |  | ||||||
| 		.map(function(elem){ |  | ||||||
| 			return elem.nodeName != 'DIV' ? |  | ||||||
| 				[] |  | ||||||
| 				: [{ |  | ||||||
| 					text: elem.querySelector('span').innerHTML, |  | ||||||
| 					collapsed: elem.getAttribute('collapsed') != null, |  | ||||||
| 					children: json(elem) |  | ||||||
| 				}] }) |  | ||||||
| 		.flat() } |  | ||||||
| var markdown = function(node, indent=''){ |  | ||||||
| 	node ??= json(node) |  | ||||||
| 	var text = '' |  | ||||||
| 	for(var elem of node){ |  | ||||||
| 		text +=  |  | ||||||
| 			indent |  | ||||||
| 			+'- ' |  | ||||||
| 			+ elem.text |  | ||||||
| 				.replace(/\n/g, '\n  '+indent)  |  | ||||||
| 			+'\n' |  | ||||||
| 			+ markdown(elem.children || [], indent+'  ') } |  | ||||||
| 	return text }  |  | ||||||
| 
 | 
 | ||||||
| // XXX do a caret api...
 | // XXX do a caret api...
 | ||||||
| 
 | 
 | ||||||
| @ -328,9 +347,6 @@ var atLine = function(index){ | |||||||
| 	return false | 	return false | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var LEFT_COLLAPSE = false |  | ||||||
| var RIGHT_EXPAND = true |  | ||||||
| 
 |  | ||||||
| // XXX add scrollIntoView(..) to nav...
 | // XXX add scrollIntoView(..) to nav...
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -16,5 +16,6 @@ HTMLTextAreaElement.prototype.autoUpdateSize = function(){ | |||||||
| 	return this } | 	return this } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| /********************************************************************** | /********************************************************************** | ||||||
| * vim:set ts=4 sw=4 :                                                */ | * vim:set ts=4 sw=4 :                                                */ | ||||||
|  | |||||||
| @ -19,6 +19,8 @@ | |||||||
| 
 | 
 | ||||||
| 	display: block; | 	display: block; | ||||||
| 	width: 100%; | 	width: 100%; | ||||||
|  | 	/* XXX this is a tiny bit off and using textarea's height here is off too... */ | ||||||
|  | 	min-height: 1em; | ||||||
| 	padding: var(--padding); | 	padding: var(--padding); | ||||||
| 	margin: 0; | 	margin: 0; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user