templating mostly working -- need docs...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2025-02-10 07:49:12 +03:00
parent debb98faa1
commit cf1beec0da
2 changed files with 49 additions and 15 deletions

View File

@ -311,11 +311,12 @@ var attributes = {
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// XXX make this collapsed...
// XXX handle cursor marker... // XXX handle cursor marker...
var templates = { var templates = {
__proto__: plugin, __proto__: plugin,
__default_button_text__: 'New',
nodeFromTemplate: function(){ nodeFromTemplate: function(){
}, },
@ -326,17 +327,33 @@ var templates = {
text = text text = text
.replace(/^TEMPLATE/, '') .replace(/^TEMPLATE/, '')
var [header, ...lines] = text.split(/\n/g) var [header, ...lines] = text.split(/\n/g)
header =
`<button>${ // set direction...
header.trim() == '' ? if(header[0] == '^'){
'new' header = header.slice(1)
: header.trim() elem.create_new = 'above'
}</button>` } else {
elem.create_new = 'below' }
// nested button...
var nested_button
header = header
.replace(/\[([^\]]*)\]/g,
function(_, text){
nested_button = true
return `<button>${ text.trim() }</button>` })
// whole text is a button...
if(!nested_button){
header =
`<button>${
header.trim() == '' ?
this.__default_button_text__
: header.trim()
}</button>` }
// body... // body...
// XXX only do this if we have nested elements... // XXX only do this if we have nested elements...
elem.collapsed = true elem.collapsed = true
// XXX
// button... // button...
return header }, return header },
@ -345,15 +362,22 @@ var templates = {
//var node = editor.get(elem) //var node = editor.get(elem)
//node.querySelector('button').focus() //node.querySelector('button').focus()
}, },
// XXX restrict this to the button???
__click__: function(evt, editor, elem){ __click__: function(evt, editor, elem){
if(evt.target.tagName == 'BUTTON'){ e = evt.target
// check if we are clicking a button...
while(e.tagName != 'BUTTON'
&& e.parentElement != null){
e = e.parentElement }
if(e.tagName == 'BUTTON'){
// get template data... // get template data...
var data = editor.data(elem) var data = editor.data(elem)
// subtree... // subtree...
if(data.children.length > 0){ if(data.children.length > 0){
data = data.children[0] // get the corresponding template...
// text... var i = [...editor.get(elem).querySelectorAll('button')]
.indexOf(e)
data = data.children[i]
// text -> trim off the TEMPLATE header...
} else { } else {
data.text = data.text data.text = data.text
.split(/\n/) .split(/\n/)
@ -363,8 +387,10 @@ var templates = {
// XXX handle cursor placement / selection... // XXX handle cursor placement / selection...
// XXX // XXX
// XXX how do we get this??? var direction =
var direction = 'next' editor.data(elem).create_new == 'above' ?
'prev'
: 'next'
editor.focus(elem) editor.focus(elem)
editor.edit( editor.edit(

View File

@ -164,10 +164,18 @@ var setup = function(){
- sub-tree - sub-tree
- TEMPLATE title - TEMPLATE title
- text [cursor] - text [cursor]
- TEMPLATE title *boo*
- text [cursor]
- TEMPLATE title [new]
- text [cursor]
- multi-template - multi-template
- TEMPLATE [A] [B] [C]
- aaa
- bbb
- ccc
- TEMPLATE title A - TEMPLATE title A
text [cursor] text [cursor]
- TEMPLATE title B - TEMPLATE^ title B
- text [cursor] - text [cursor]
- renders as: - renders as:
- <button>title</button> - <button>title</button>