From 5aef077d70c4073100355215154080564c0e2c60 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Mon, 18 Oct 2021 14:54:45 -0400 Subject: [PATCH] split ktxt2 blocks into array --- projects/kiss-vscode/src/commands/ktxt2.kiss | 35 ++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/projects/kiss-vscode/src/commands/ktxt2.kiss b/projects/kiss-vscode/src/commands/ktxt2.kiss index 3e6d8cd6..24d26214 100644 --- a/projects/kiss-vscode/src/commands/ktxt2.kiss +++ b/projects/kiss-vscode/src/commands/ktxt2.kiss @@ -4,7 +4,9 @@ // A file called README.md.html.ktxt2 would be for converting README.md to README.html. (var blockStartEnd "|||") -(var outputStarts ["|>|" "|!|"]) +(var unlockedStart "|>|") +(var lockedStart "|!|") +(var outputStarts [unlockedStart lockedStart]) // Return [sourceFile outputFile] (function :Array splitFileContents [] @@ -60,4 +62,33 @@ (sourceDocument.save) saveOutputSuccess (outputDocument.save)] - (assert (and saveSourceSuccess saveOutputSuccess)))))) \ No newline at end of file + (assert (and saveSourceSuccess saveOutputSuccess)))))) + +(function :Array splitFileBlocks [] + (let [fileText (activeTextEditor.document.getText) + fileStream (kiss.Stream.fromString fileText) + blocks []] + (loop + (let [block (object source "" output "" outputLocked false)] + (case (fileStream.takeUntilAndDrop blockStartEnd) + ((Some _) + (let [sourceBlock (fileStream.expect "A chunk of source text followed by one of $outputStarts" + ->(fileStream.takeUntilOneOf outputStarts))] + (set block.source sourceBlock)) + (assert (apply = (for outputStart outputStarts outputStart.length)) "all output starts must be the same length!") + (set block.outputLocked + (case (fileStream.expect "One of $outputStarts" ->(fileStream.takeChars .length (first outputStarts))) + (lockedStart true) + (unlockedStart false) + (otherwise + (throw "Expected one of $outputStarts")))) + (let [outputBlock (fileStream.expect "A chunk of output text followed by $blockStartEnd" + ->(fileStream.takeUntilAndDrop blockStartEnd))] + (set block.output outputBlock))) + (None + (break))) + (blocks.push block))) + blocks)) + +(function splitBlocks [&opt _] + (let [blocks (splitFileBlocks)] (print blocks))) \ No newline at end of file