From fe5bfa9e10362bcad2c943fe2580249d9d2ea5e7 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Thu, 21 Oct 2021 23:25:59 -0400 Subject: [PATCH] Links to insert blocks in Ktxt2 --- projects/kiss-vscode/src/ktxt2/KTxt2.kiss | 1 + .../kiss-vscode/src/ktxt2/KTxt2Editor.kiss | 33 ++++++++++++++++--- .../src/ktxt2/KTxt2EditorProvider.hx | 3 +- .../src/ktxt2/KTxt2EditorProvider.kiss | 3 ++ 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/projects/kiss-vscode/src/ktxt2/KTxt2.kiss b/projects/kiss-vscode/src/ktxt2/KTxt2.kiss index 405210d3..430f8588 100644 --- a/projects/kiss-vscode/src/ktxt2/KTxt2.kiss +++ b/projects/kiss-vscode/src/ktxt2/KTxt2.kiss @@ -8,6 +8,7 @@ (var unlockedStart "|>|") (var lockedStart "|!|") (var outputStarts [unlockedStart lockedStart]) +(var emptyBlock "${blockStartEnd}${unlockedStart}${blockStartEnd}") // Return [sourceFile outputFile] (function :Array splitFileContents [:Stream fileStream] diff --git a/projects/kiss-vscode/src/ktxt2/KTxt2Editor.kiss b/projects/kiss-vscode/src/ktxt2/KTxt2Editor.kiss index 0ae20174..c6b63758 100644 --- a/projects/kiss-vscode/src/ktxt2/KTxt2Editor.kiss +++ b/projects/kiss-vscode/src/ktxt2/KTxt2Editor.kiss @@ -37,14 +37,27 @@ } EDIT_TIMEOUT_MILLI))) -(function pElement [text idx] - (let [p (document.createElement "p")] +(function commentElements [text idx] + (let [p (document.createElement "p") + blockLinkBefore (document.createElement "a") + blockLinkAfter (document.createElement "a")] + // Links that allow inserting a block between existing blocks: + (set blockLinkBefore.innerHTML "+") + (blockLinkBefore.addEventListener "click" + ->(insertBlockBeforeComment (nth ktxt2Elements idx))) + (set blockLinkAfter.innerHTML "+") + (blockLinkAfter.addEventListener "click" + ->(insertBlockAfterComment (nth ktxt2Elements idx))) + + // Paragraph displaying and allowing editing the comment (set p.innerHTML text) (p.setAttribute "style" "white-space: pre;") (p.setAttribute "contenteditable" "true") (p.addEventListener "input" ->(addEditTimeout idx ->(replaceComment (nth ktxt2Elements idx) p.innerHTML))) - (content.appendChild p))) + (content.appendChild blockLinkBefore) + (content.appendChild p) + (content.appendChild blockLinkAfter))) (function toPlaintext [:String text] (.htmlUnescape @@ -60,6 +73,18 @@ (vscode.postMessage (object type "replace" text (toPlaintext newText) start start end end))) (otherwise (throw "element $element is not a comment")))) +(function insertBlockBeforeComment [element] + (case element + ((Comment (object start position)) + (vscode.postMessage (object type "insert" text "${KTxt2.emptyBlock}\n" position position))) + (otherwise (throw "element $element is not a comment")))) + +(function insertBlockAfterComment [element] + (case element + ((Comment (object end position)) + (vscode.postMessage (object type "insert" text "${KTxt2.emptyBlock}\n" position position))) + (otherwise (throw "element $element is not a comment")))) + (function replaceSourceBlock [element newText] (case element ((Block (object source text sourceStart start sourceEnd end)) @@ -113,7 +138,7 @@ (case element // TODO make an objectWith macro for case that duplicates parameter names with the match expressions: ((Comment (object text text)) - (pElement text idx)) + (commentElements text idx)) ((Block (object source source output output outputLocked outputLocked)) (blockElements source output outputLocked idx)))) } diff --git a/projects/kiss-vscode/src/ktxt2/KTxt2EditorProvider.hx b/projects/kiss-vscode/src/ktxt2/KTxt2EditorProvider.hx index d070d76a..1ebc22e7 100644 --- a/projects/kiss-vscode/src/ktxt2/KTxt2EditorProvider.hx +++ b/projects/kiss-vscode/src/ktxt2/KTxt2EditorProvider.hx @@ -9,7 +9,8 @@ typedef MessageFromEditor = { type:String, ?text:String, ?start:kiss.Stream.Position, - ?end:kiss.Stream.Position + ?end:kiss.Stream.Position, + ?position:kiss.Stream.Position }; @:build(kiss.Kiss.build()) diff --git a/projects/kiss-vscode/src/ktxt2/KTxt2EditorProvider.kiss b/projects/kiss-vscode/src/ktxt2/KTxt2EditorProvider.kiss index 9faedfb7..9fe7c97d 100644 --- a/projects/kiss-vscode/src/ktxt2/KTxt2EditorProvider.kiss +++ b/projects/kiss-vscode/src/ktxt2/KTxt2EditorProvider.kiss @@ -33,6 +33,9 @@ ((object type "replace" text text start start end end) (makeEdit ->edit (edit.replace document.uri (rangeFromStartEnd start end) text))) + ((object type "insert" text text position position) + (makeEdit + ->edit (edit.insert document.uri (streamPosToDocumentPos position) text))) (otherwise (Vscode.window.showErrorMessage "bad message $e from KTxt2Editor"))))