mirror of
https://github.com/flynx/pWiki.git
synced 2025-10-29 18:10:09 +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