WIP parse out a control hierarchy

This commit is contained in:
2025-08-08 10:24:13 -05:00
parent 1c569a10bb
commit 28263919aa
4 changed files with 95 additions and 7 deletions

View File

@@ -1,4 +1,4 @@
# @install: lix --silent download "gh://github.com/kiss-lang/kiss-firefox#0d2d1f75b04b1d400ae844c4adffdeab690cb2af" into kiss-firefox/0.0.0/github/0d2d1f75b04b1d400ae844c4adffdeab690cb2af
# @install: lix --silent download "gh://github.com/kiss-lang/kiss-firefox#d30a26c93d556948d3a34e6069aa9d1389def4a9" into kiss-firefox/0.0.0/github/d30a26c93d556948d3a34e6069aa9d1389def4a9
-lib kiss
-cp ${HAXE_LIBCACHE}/kiss-firefox/0.0.0/github/0d2d1f75b04b1d400ae844c4adffdeab690cb2af/src/
-cp ${HAXE_LIBCACHE}/kiss-firefox/0.0.0/github/d30a26c93d556948d3a34e6069aa9d1389def4a9/src/
-D kiss-firefox=0.0.0

View File

@@ -1,12 +1,12 @@
# @install: lix --silent download "gh://github.com/kiss-lang/kiss#fb34feb6103e45cc1f408db59e4f277bbfaa97f1" into kiss/0.0.1/github/fb34feb6103e45cc1f408db59e4f277bbfaa97f1
# @run: haxelib run-dir kiss "${HAXE_LIBCACHE}/kiss/0.0.1/github/fb34feb6103e45cc1f408db59e4f277bbfaa97f1"
# @install: lix --silent download "gh://github.com/kiss-lang/kiss#e1bd5eff026a7d4e6b3b93e2bc148b27606583e7" into kiss/0.0.1/github/e1bd5eff026a7d4e6b3b93e2bc148b27606583e7
# @run: haxelib run-dir kiss "${HAXE_LIBCACHE}/kiss/0.0.1/github/e1bd5eff026a7d4e6b3b93e2bc148b27606583e7"
-lib haxe-strings
-lib hscript
-lib tink_json
-lib tink_macro
-lib tink_syntaxhub
-lib uuid
-cp ${HAXE_LIBCACHE}/kiss/0.0.1/github/fb34feb6103e45cc1f408db59e4f277bbfaa97f1/src
-cp ${HAXE_LIBCACHE}/kiss/0.0.1/github/e1bd5eff026a7d4e6b3b93e2bc148b27606583e7/src
-D kiss=0.0.1
-w -WUnusedPattern
--macro kiss.KissFrontend.use()

View File

@@ -1,5 +1,11 @@
package shortcutter;
typedef Hierarchy = {
key:String,
selector:String,
children:Array<Hierarchy>
};
class Main {
static function main() {
Main_.main();

View File

@@ -2,5 +2,87 @@
(loadFrom "kiss-firefox" "src/kiss_firefox/Util.kiss")
(loadFrom "kiss-firefox" "src/kiss_firefox/ContentUtil.kiss")
(set js.Lib.global.document.body.style.border "5px solid red")
(sendMessage "exampleMessage" [3 4])
(import shortcutter.Main)
(import kiss.Stream)
(import js.html.Document)
(import js.html.Element)
(import js.html.Node)
(import js.Browser)
(var exampleScript
".item-tracker
.menu-items > table:nth-child(1) > tbody:nth-child(1) > tr
.pearls > div > div
.chart-map-container
.extra-locations")
(function :Int countTabLevel [:String line]
(localVar &mut tabs 0)
(while (= (line.charAt tabs) "\t")
++tabs)
tabs)
(function :Hierarchy parseHierarchy [:Stream script &opt :Int tabLevel :String key :String selector]
(unless tabLevel (set tabLevel 0))
(unless key (set key ""))
(unless selector (set selector ""))
(let [:Hierarchy hierarchy (objectWith [children []] key selector)
linesAtTabLevel (extractOpt (script.takeLinesAsStreamWhile ->line (>= (countTabLevel line) tabLevel)))]
(until (linesAtTabLevel.isEmpty)
(let [nextChild (extractOpt (linesAtTabLevel.takeLine))
nextTabLevel (countTabLevel (extractOpt (linesAtTabLevel.peekLine) ""))]
// Indent inward
(if (> nextTabLevel tabLevel)
(hierarchy.children.push (parseHierarchy linesAtTabLevel nextTabLevel "" nextChild))
(hierarchy.children.push (object key "" selector nextChild children [])))))
hierarchy))
(var &mut currentHierarchy [])
(var &mut :Hierarchy rootHierarchy)
(function :Array<Element> elementsOfLevel [:Hierarchy level &opt :Element element]
(let [elements []]
(doFor child ~level.children
(doFor el
(if element
(element.querySelectorAll child.selector)
(Browser.window.document.querySelectorAll child.selector))
(elements.push (cast el))))
~elements))
// On first load, elements may not have populated if the page is dynamically generating anything. So timed-out retrying might be needed
(var &mut retry true)
(function :Null selectHierarchy [:Hierarchy level :Bool on &opt :Element element]
(ifLet [elements (elementsOfLevel level element)]
(if elements
(doFor element elements
(set retry false)
(set element.style.border "2px solid red"))
(when retry (Browser.window.setTimeout ->(selectHierarchy level on element) 500)))))
(function :Null popHierarchy []
(selectHierarchy (last currentHierarchy) false)
(currentHierarchy.pop)
(unless currentHierarchy (set currentHierarchy [rootHierarchy]))
(selectHierarchy (last currentHierarchy) true))
(function :Null pushHierarchy [:Hierarchy level]
(selectHierarchy (last currentHierarchy) false)
(selectHierarchy level true)
(currentHierarchy.push level))
(set rootHierarchy (parseHierarchy (Stream.fromString exampleScript)))
(set currentHierarchy [rootHierarchy])
(Browser.window.addEventListener "keydown"
->key
(case key.key
("Escape"
(popHierarchy))
("1"
(print "1"))
(otherwise)))
(Browser.window.addEventListener "load"
->_ (selectHierarchy rootHierarchy true))