ktxt2 comments are monaco editors
This commit is contained in:
@@ -4,6 +4,7 @@ import js.html.Document;
|
|||||||
import js.html.Window;
|
import js.html.Window;
|
||||||
import js.html.Element;
|
import js.html.Element;
|
||||||
import js.html.TextAreaElement;
|
import js.html.TextAreaElement;
|
||||||
|
import js.Lib;
|
||||||
import ktxt2.EditorExterns;
|
import ktxt2.EditorExterns;
|
||||||
import ktxt2.KTxt2;
|
import ktxt2.KTxt2;
|
||||||
import kiss.Prelude;
|
import kiss.Prelude;
|
||||||
|
@@ -4,9 +4,6 @@
|
|||||||
(var &mut :Element content)
|
(var &mut :Element content)
|
||||||
(var &mut :Array<KTxt2Element> ktxt2Elements)
|
(var &mut :Array<KTxt2Element> ktxt2Elements)
|
||||||
|
|
||||||
// Free-wheeling without externs for now.
|
|
||||||
// This value is provided by other <script> tags in the editor's HTML skeleton.
|
|
||||||
(var &mut :Dynamic monaco)
|
|
||||||
|
|
||||||
(function main []
|
(function main []
|
||||||
(set vscode (EditorExterns.acquireVsCodeApi))
|
(set vscode (EditorExterns.acquireVsCodeApi))
|
||||||
@@ -20,13 +17,19 @@
|
|||||||
->:Void event
|
->:Void event
|
||||||
(case (the MessageToEditor event.data)
|
(case (the MessageToEditor event.data)
|
||||||
((object type "update" text text)
|
((object type "update" text text)
|
||||||
(updateContent text)
|
(whenMonacoIsAvailable ->(updateContent text))
|
||||||
(vscode.setState (object text text)))
|
(vscode.setState (object text text)))
|
||||||
(otherType (throw "bad message $event for KTxt2Editor"))))
|
(otherType (throw "bad message $event for KTxt2Editor"))))
|
||||||
|
|
||||||
(whenLet [state (the Dynamic (vscode.getState))]
|
(whenLet [state (the Dynamic (vscode.getState))]
|
||||||
// Wait to set up the UI until monaco is loaded from the other scripts:
|
// Wait to set up the UI until monaco is loaded from the other scripts:
|
||||||
(window.addEventListener "load" ->(updateContent state.text))))
|
(whenMonacoIsAvailable ->(updateContent state.text))))
|
||||||
|
|
||||||
|
(var MONACO_CHECK_MILLI 100)
|
||||||
|
(function :Void whenMonacoIsAvailable [:Void->Void doThis]
|
||||||
|
(if Lib.global.monaco
|
||||||
|
(doThis)
|
||||||
|
(window.setTimeout ->(whenMonacoIsAvailable doThis) MONACO_CHECK_MILLI)))
|
||||||
|
|
||||||
(var &mut :Map<Int,Int> editTimeoutHandles (new Map))
|
(var &mut :Map<Int,Int> editTimeoutHandles (new Map))
|
||||||
(var EDIT_TIMEOUT_MILLI 2000)
|
(var EDIT_TIMEOUT_MILLI 2000)
|
||||||
@@ -42,8 +45,30 @@
|
|||||||
}
|
}
|
||||||
EDIT_TIMEOUT_MILLI)))
|
EDIT_TIMEOUT_MILLI)))
|
||||||
|
|
||||||
|
(function monacoEditor [div style content language readOnly :Dynamic->Void onChange]
|
||||||
|
(let [:Dynamic e
|
||||||
|
(Lib.global.monaco.editor.create div
|
||||||
|
(objectWith
|
||||||
|
[
|
||||||
|
value content
|
||||||
|
lineNumbers "on"
|
||||||
|
scrollBeyondLastLine false
|
||||||
|
theme "vs-dark"
|
||||||
|
]
|
||||||
|
language
|
||||||
|
readOnly))
|
||||||
|
updateSize
|
||||||
|
->[&opt _] {
|
||||||
|
(div.setAttribute "style" "${style} height: $(e.getContentHeight)px;")
|
||||||
|
(e.layout)
|
||||||
|
}]
|
||||||
|
(updateSize)
|
||||||
|
(e.onDidContentSizeChange updateSize)
|
||||||
|
(e.onDidChangeModelContent ->[&opt _] (onChange e))
|
||||||
|
e))
|
||||||
|
|
||||||
(function commentElements [text idx]
|
(function commentElements [text idx]
|
||||||
(let [:TextAreaElement p (cast (document.createElement "textarea")) // keeping variable name the same, but it's a textarea not a <p> element
|
(let [p (document.createElement "div") // keeping variable name the same, but it's a div not a <p> element
|
||||||
blockLinkBefore (document.createElement "a")
|
blockLinkBefore (document.createElement "a")
|
||||||
blockLinkAfter (document.createElement "a")]
|
blockLinkAfter (document.createElement "a")]
|
||||||
// Links that allow inserting a block between existing blocks:
|
// Links that allow inserting a block between existing blocks:
|
||||||
@@ -55,15 +80,18 @@
|
|||||||
->(insertBlockAfterComment (nth ktxt2Elements idx)))
|
->(insertBlockAfterComment (nth ktxt2Elements idx)))
|
||||||
|
|
||||||
// Paragraph displaying and allowing editing the comment
|
// Paragraph displaying and allowing editing the comment
|
||||||
(set p.value text)
|
//(set p.value text)
|
||||||
(set p.rows .length (text.split "\n"))
|
//(set p.rows .length (text.split "\n"))
|
||||||
(p.setAttribute "class" "block")
|
//(p.setAttribute "class" "block")
|
||||||
(p.setAttribute "style" "width: 90%;")
|
|
||||||
(p.addEventListener "input"
|
|
||||||
->(addEditTimeout idx ->{(p.blur)(replaceComment (nth ktxt2Elements idx) p.value)}))
|
|
||||||
(content.appendChild blockLinkBefore)
|
(content.appendChild blockLinkBefore)
|
||||||
(content.appendChild p)
|
(content.appendChild p)
|
||||||
(content.appendChild blockLinkAfter)))
|
(content.appendChild blockLinkAfter)
|
||||||
|
(monacoEditor p "width: 90%;" text "txt" false
|
||||||
|
->editor (addEditTimeout idx ->{
|
||||||
|
/*(p.blur)*/
|
||||||
|
(replaceComment (nth ktxt2Elements idx) (editor.getValue))
|
||||||
|
}))))
|
||||||
|
|
||||||
|
|
||||||
// This used to turn HTML to plaintext, but with textareas it's no longer needed:
|
// This used to turn HTML to plaintext, but with textareas it's no longer needed:
|
||||||
(function toPlaintext [:String text]
|
(function toPlaintext [:String text]
|
||||||
|
@@ -78,7 +78,7 @@
|
|||||||
(webview.asWebviewUri (Uri.joinPath monacoDir "editor" "editor.main.js"))
|
(webview.asWebviewUri (Uri.joinPath monacoDir "editor" "editor.main.js"))
|
||||||
ktxt2EditorScriptUri
|
ktxt2EditorScriptUri
|
||||||
(webview.asWebviewUri (Uri.joinPath (Uri.parse this.context.extensionUri) "bin" "ktxt2editor.js"))]
|
(webview.asWebviewUri (Uri.joinPath (Uri.parse this.context.extensionUri) "bin" "ktxt2editor.js"))]
|
||||||
~"<!DOCTYPE html>
|
"<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset=\"UTF-8\">
|
<meta charset=\"UTF-8\">
|
||||||
|
Reference in New Issue
Block a user