Skip to content
This repository was archived by the owner on Jun 17, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions buildSrc/src/main/kotlin/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ object Constants {
const val dependency = "com.github.jengelman.gradle.plugins:shadow:$version"
}

object RichTextFX {
const val version = "0.9.3"
const val dependency = "org.fxmisc.richtext:richtextfx:$version"
}

object KNote {
const val major = 1
const val minor = 0
Expand Down
10 changes: 1 addition & 9 deletions core/src/main/kotlin/knote/PageManagerImpl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -139,21 +139,18 @@ internal class PageManagerImpl(

page.errored = false
page.result = null
if (page.text != pageScript.text) {
page.text = pageScript.text
}
return page
}

private fun invalidatePage(id: String): Set<String>? {
val page = pages[id] as? PageImpl ?: return null
page.compiledScript?.invalidate()
page.compiledScript = null
page.text = ""
page.fileInputs.clear()

invalidateResult(id)

pages.remove(id)
return page.dependencies
}

Expand Down Expand Up @@ -285,11 +282,6 @@ internal class PageManagerImpl(
val result = executePageCached(pageId)
logger.info("[$pageId] => $result")
}
// notebookScript.pageFiles.forEach {
// val id = it.name.substringBeforeLast(".page.kts")
// val result = executePageCached(id)
// logger.info("[$id] => $result")
// }
}
}
}
Expand Down
2 changes: 0 additions & 2 deletions core/src/main/kotlin/knote/api/Page.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ interface Page {
val id: String
val fileObject: KObservableObject<Page, File>
val fileContentObject: KObservableObject<Page, String>
val textObject: KObservableObject<Page, String>
val compiledScriptObject: KObservableObject<Page, PageScript?>
val reportsObject: KObservableObject<Page, List<ScriptDiagnostic>?>
val resultObject: KObservableObject<Page, Any?>
Expand All @@ -20,7 +19,6 @@ interface Page {

val file get() = fileObject.value
val fileContent get() = fileContentObject.value
val text get() = textObject.value
val compiledScript get() = compiledScriptObject.value
val reports get() = reportsObject.value
val result get() = resultObject.value
Expand Down
2 changes: 0 additions & 2 deletions core/src/main/kotlin/knote/data/PageImpl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ class PageImpl(
compiledScript: PageScript? = null,
reports: List<ScriptDiagnostic>? = null
) : Page {
override val textObject: MutableKObservableObject<Page, String> = MutableKObservableObject(text)
override val fileObject: MutableKObservableObject<Page, File> = MutableKObservableObject(file)
override val fileContentObject: MutableKObservableObject<Page, String> = MutableKObservableObject(fileContent)
override val compiledScriptObject: MutableKObservableObject<Page, PageScript?> =
Expand All @@ -28,7 +27,6 @@ class PageImpl(
MutableKObservableObject(setOf())
override val fileInputs: MutableKObservableList<Path> = MutableKObservableList()

override var text by textObject
override var file by fileObject
override var fileContent by fileContentObject
override var compiledScript by compiledScriptObject
Expand Down
1 change: 1 addition & 0 deletions tornadofx-viewer/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
dependencies {
api(project(":core"))
api(Constants.TornadoFX.dependency)
api(Constants.RichTextFX.dependency)
}
9 changes: 5 additions & 4 deletions tornadofx-viewer/src/main/kotlin/knote/tornadofx/Styles.kt
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
package knote.tornadofx

import javafx.scene.layout.Priority
import javafx.scene.paint.Color
import tornadofx.*

class Styles: Stylesheet() {
companion object {
val evaluationConsole by cssclass()
}
object Styles: Stylesheet() {

val evaluationConsole by cssclass()

init {
evaluationConsole {
backgroundColor += Color.WHITE
padding = box(10.px)
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package knote.tornadofx.controller

import tornadofx.*
import java.util.regex.Pattern
import javafx.concurrent.Task
import knote.tornadofx.view.NotebookSpace
import org.fxmisc.richtext.model.StyleSpans
import org.fxmisc.richtext.model.StyleSpansBuilder
import java.util.*

class NotebookSpaceController: Controller() {

private val view: NotebookSpace by inject()

fun computeHighlightingAsync(): Task<StyleSpans<Collection<String>>> {
val text = view.codeArea.text
val task = object : Task<StyleSpans<Collection<String>>>() {
@Throws(Exception::class)
override fun call(): StyleSpans<Collection<String>> {
return computeHighlighting(text)
}
}
view.executor.execute(task)
return task
}

fun applyHighlighting(highlighting: StyleSpans<Collection<String>>) {
view.codeArea.setStyleSpans(0, highlighting)
}

private fun computeHighlighting(text: String): StyleSpans<Collection<String>> {
val matcher = PATTERN.matcher(text)
var lastKwEnd = 0
val spansBuilder = StyleSpansBuilder<Collection<String>>()
while (matcher.find()) {
val styleClass = (when {
matcher.group("KEYWORD") != null -> "keyword"
matcher.group("PAREN") != null -> "paren"
matcher.group("BRACE") != null -> "brace"
matcher.group("BRACKET") != null -> "bracket"
matcher.group("SEMICOLON") != null -> "semicolon"
matcher.group("STRING") != null -> "string"
matcher.group("COMMENT") != null -> "comment"
else -> ""
})
spansBuilder.add(Collections.emptyList(), matcher.start() - lastKwEnd);
spansBuilder.add(Collections.singleton(styleClass), matcher.end() - matcher.start())
lastKwEnd = matcher.end()
}
spansBuilder.add(listOf(), text.length - lastKwEnd)
return spansBuilder.create()
}

companion object {
private val KEYWORDS = arrayOf(
"abstract",
"assert",
"boolean",
"break",
"byte",
"case",
"catch",
"char",
"class",
"const",
"continue",
"default",
"do",
"double",
"else",
"enum",
"extends",
"final",
"finally",
"float",
"for",
"goto",
"if",
"implements",
"import",
"instanceof",
"int",
"interface",
"long",
"native",
"new",
"package",
"private",
"protected",
"public",
"return",
"short",
"static",
"strictfp",
"super",
"switch",
"synchronized",
"this",
"throw",
"throws",
"transient",
"try",
"void",
"volatile",
"while"
)

val KEYWORD_PATTERN = "\\b(" + KEYWORDS.joinToString("|") + ")\\b"
const val PAREN_PATTERN = "\\(|\\)"
const val BRACE_PATTERN = "\\{|\\}"
const val BRACKET_PATTERN = "\\[|\\]"
const val SEMICOLON_PATTERN = "\\;"
const val STRING_PATTERN = "\"([^\"\\\\]|\\\\.)*\""
const val COMMENT_PATTERN = "//[^\n]*" + "|" + "/\\*(.|\\R)*?\\*/"

private val PATTERN = Pattern.compile(
"(?<KEYWORD>" + KEYWORD_PATTERN + ")"
+ "|(?<PAREN>" + PAREN_PATTERN + ")"
+ "|(?<BRACE>" + BRACE_PATTERN + ")"
+ "|(?<BRACKET>" + BRACKET_PATTERN + ")"
+ "|(?<SEMICOLON>" + SEMICOLON_PATTERN + ")"
+ "|(?<STRING>" + STRING_PATTERN + ")"
+ "|(?<COMMENT>" + COMMENT_PATTERN + ")"
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,9 @@ class PageViewModel(val page: Page, dirtyState: Boolean = false) {

}

class NotebookScope(val notebook: Notebook,
class NotebookScope(val notebook: Notebook, // TODO make this observable
val pageManager: PageManager,
val pageViewModels: ObservableList<PageViewModel>
): Scope() {
val model = NotebookViewModel()
}

class PageManagerScope(val pageManager: PageManager,
val pageViewModels: List<PageViewModel>): Scope()



Loading