Mercurial > repos > tabletprog
diff src/editor.tp @ 126:a2d2d8e09291
Merge
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 05 Aug 2013 23:37:17 -0700 |
parents | 1157639353e7 |
children | 2b25d0ce2946 |
line wrap: on
line diff
--- a/src/editor.tp Mon Aug 05 23:36:18 2013 -0700 +++ b/src/editor.tp Mon Aug 05 23:37:17 2013 -0700 @@ -5,7 +5,10 @@ each <- foreign: :iterable fun {} addClass <- foreign: :node className {} removeClass <- foreign: :node className {} +hasClass <- foreign: :node className {} get <- foreign: :url onSuccess onFail onOther {} +getEl <- foreign: :from idx {} +setEl <- foreign: :to idx val {} newEl <- foreign: :tagname props {} //TP Parser @@ -24,9 +27,62 @@ } //kernel definitions -import: kernel +//import: kernel + +filter <- :arr pred { + output <- arr slice: 0 0 + each: arr :idx el { + if: (pred: el) { + output push: el + } else: {} + } + output +} //editor code +selection <- #{ + valid? <- false +} + +setSelection:withInNode <- :astnode :innode { + fakeEvent <- #{ + stopPropagation <- :Blah { + } + } + selection <- #{ + valid? <- true + in <- { + (innode domNode) onclick: fakeEvent + } + out <- { + fakeEvent <- #{ + stopPropagation <- :Blah { + } + } + ((astnode up) domNode) onclick: fakeEvent + } + } +} + +setSelection <- :astnode { + fakeEvent <- #{ + stopPropagation <- :Blah { + } + } + selection <- #{ + valid? <- true + in <- { + } + out <- { + fakeEvent <- #{ + stopPropagation <- :Blah { + } + } + ((astnode up) domNode) onclick: fakeEvent + } + } +} + editFile <- :path { get: path :request { addClass: (q: "body") "editorMode" @@ -59,9 +115,9 @@ selectParent <- :node { each: (qall: ".selectParent") :idx el { - removeClass: el "selected" + removeClass: el "selectParent" } - addClass: (node parentNode) "selectParent" + addClass: node "selectParent" } popInscope:onClick <- :syms :handler { @@ -70,34 +126,146 @@ each: syms :idx key { inscope appendChild: (newEl: "li" #{ textContent <- key - onclick <- { handler: key } + onclick <- :Event { handler: key } }) } } +scalarClick <- :domnode astnode event { + selectNode: domnode + setSelection: astnode + event stopPropagation: (foreign: undefined) + //TODO: set focus +} + symbolClick <- :domnode astnode event { - console log: astnode selectNode: domnode - popInscope: ((astnode symbols) allSymbols) onClick: :key { + popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key { domnode textContent!: key astnode name!: key } - event stopPropagation + setSelection: astnode + event stopPropagation: (foreign: undefined) +} + +assignClick <- :domnode astnode event { + selectParent: domnode + selectQuery: ".selectParent > .varname" in: domnode + popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key { + (domnode firstChild) textContent!: key + (astnode symbol) name!: key + } + setSelection: astnode withInNode: (astnode expression) + event stopPropagation: (foreign: undefined) +} + +opClick <- :domnode astnode event { + selectParent: domnode + selectQuery: ".selectParent > .opname" in: domnode + showOps + setSelection: astnode withInNode: (astnode left) + event stopPropagation: (foreign: undefined) } funClick <- :domnode astnode event { selectParent: domnode - selectQuery: ".selectParent > .funpart" in: (domnode parentNode) + selectQuery: ".selectParent > .funpart" in: domnode symtable <- astnode symbols - syms <- filter: (symtable allSymbols) :sym { + syms <- filter: (symtable allSymbols: (foreign: undefined)) :sym { isLambda: ((symtable find: sym) def) } - popInscope: syms onClick: {} - event stopPropagation + inner <- if: (astnode receiver) != (foreign: null) { + astnode receiver + } else: { + (astnode args) getEl: 0 + } + setSelection: astnode withInNode: inner + popInscope: syms onClick: :key { + astnode name!: key + parts <- key split: ":" + nodes <- [] + each: (domnode children) :idx val{ + nodes push: val + } + partIdx <- 0 + nodeIdx <- 0 + lastWasNamePart <- true + while: { partIdx < (parts length) || nodeIdx < (nodes length) } do: { + if: nodeIdx < (nodes length) { + node <-getEl: nodes nodeIdx + nodeIdx <- nodeIdx + 1 + if: (hasClass: node "funpart") { + if: partIdx < (parts length) { + postfix <- if: partIdx = 0 && nodeIdx = 2 && (parts length) = 1 && (nodes length) = 2 { "" } else: { ":" } + t <- (getEl: parts partIdx) + node textContent!: (getEl: parts partIdx) . postfix + partIdx <- partIdx + 1 + } else: { + domnode removeChild: node + } + lastWasNamePart <- true + } else: { + if: (not: lastWasNamePart) && partIdx < (parts length) && nodeIdx > 0 { + domnode insertBefore: (newEl: "span" #{ + className <- "funpart selected" + textContent <- (getEl: parts partIdx) . ":" + }) node + partIdx <- partIdx + 1 + } + lastWasNamePart <- false + } + } else: { + console log: "part: " . (getEl: parts partIdx) + domnode appendChild: (newEl: "span" #{ + className <- "funpart selected" + textContent <- (getEl: parts partIdx) . ":" + }) + partIdx <- partIdx + 1 + } + } + } + event stopPropagation: (foreign: undefined) } lambdaClick <- :domnode astnode event { - symbolClick: domnode astnode event + selectNode: domnode + popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key { + console log: "foooobar!" + } + inner <- if: ((astnode args) length) > 0 { + (astnode args) getEl: 0 + } else: { + (astnode expressions) getEl: 0 + } + setSelection: astnode withInNode: inner + event stopPropagation: (foreign: undefined) +} + +objectClick <- :domnode astnode event { + selectNode: domnode + popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key { + console log: "fooobar!" + } + setSelection: astnode withInNode: ((astnode messages) getEl: 0) + event stopPropagation: (foreign: undefined) +} + +visible <- "showops" + +showOps <- { + each: (qall: ".controls") :idx el { + removeClass: el visible + addClass: el "showops" + } + visible <- "showops" +} + +showLit <- { + each: (qall: ".controls") :idx el { + removeClass: el visible + addClass: el "showlit" + } + visible <- "showlit" } main <- { @@ -124,7 +292,7 @@ } } } - + //bind handlers for editor buttons each: (qall: ".controls li") :idx el { el onclick!: :event { @@ -133,15 +301,30 @@ } } (q: "#ops_button") onclick!: :event { - each: (qall: ".controls") :idx el { - addClass: el "showops" + showOps + } + (q: "#lit_button") onclick!: :event { + showLit + } + + (q: "#in") onclick!: :event { + console log: "inwards" + if: (selection valid?) { + selection in } } - + + (q: "#out") onclick!: :event { + console log: "outwards" + if: (selection valid?) { + selection out + } + } + path <- (window location) pathname if: (path indexOf: "/edit/") = 0 { editFile: (path substr: 5) - } else: {} + } } }