WIP parse out a control hierarchy
This commit is contained in:
@@ -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
|
@@ -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()
|
@@ -1,5 +1,11 @@
|
||||
package shortcutter;
|
||||
|
||||
typedef Hierarchy = {
|
||||
key:String,
|
||||
selector:String,
|
||||
children:Array<Hierarchy>
|
||||
};
|
||||
|
||||
class Main {
|
||||
static function main() {
|
||||
Main_.main();
|
||||
|
@@ -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))
|
Reference in New Issue
Block a user