pavone@11: #{ pavone@11: //mquery functions pavone@11: q <- foreign: :query {} pavone@11: qall <- foreign: :query {} pavone@11: each <- foreign: :iterable fun {} pavone@11: addClass <- foreign: :node className {} pavone@11: removeClass <- foreign: :node className {} pavone@110: hasClass <- foreign: :node className {} pavone@12: get <- foreign: :url onSuccess onFail onOther {} pavone@127: newEl <- foreign: :tagname props {} pavone@127: pavone@127: //editor.js functions pavone@110: getEl <- foreign: :from idx {} pavone@110: setEl <- foreign: :to idx val {} pavone@127: goFullScreen <- foreign: {} pavone@141: create_symbol <- foreign: :name {} pavone@11: pavone@14: //TP Parser pavone@14: parser <- foreign: #{ pavone@14: parse <- foreign: :str {} pavone@14: } pavone@25: isLambda <- foreign: :astnode {} pavone@14: pavone@11: //js builtins pavone@11: console <- foreign: #{ pavone@23: log <- foreign: :val {} pavone@11: } pavone@25: window <- foreign: #{} pavone@23: Object <- foreign: #{ pavone@23: keys <- foreign: :object {} pavone@23: } pavone@11: pavone@108: filter <- :arr pred { pavone@108: output <- arr slice: 0 0 pavone@108: each: arr :idx el { pavone@108: if: (pred: el) { pavone@108: output push: el pavone@108: } else: {} pavone@108: } pavone@108: output pavone@108: } pavone@108: pavone@25: //editor code pavone@113: selection <- #{ pavone@113: valid? <- false pavone@113: } pavone@113: pavone@117: setSelection:withInNode <- :astnode :innode { pavone@117: fakeEvent <- #{ pavone@117: stopPropagation <- :Blah { pavone@117: } pavone@117: } pavone@131: pavone@117: selection <- #{ pavone@117: valid? <- true pavone@117: in <- { pavone@117: (innode domNode) onclick: fakeEvent pavone@117: } pavone@117: out <- { pavone@117: ((astnode up) domNode) onclick: fakeEvent pavone@117: } pavone@131: next <- { pavone@131: (((astnode up) getNext: astnode) domNode) onclick: fakeEvent pavone@131: } pavone@131: pavone@131: previous <- { pavone@131: (((astnode up) getPrev: astnode) domNode) onclick: fakeEvent pavone@131: } pavone@117: } pavone@117: } pavone@117: pavone@118: setSelection <- :astnode { pavone@118: fakeEvent <- #{ pavone@118: stopPropagation <- :Blah { pavone@118: } pavone@118: } pavone@118: selection <- #{ pavone@118: valid? <- true pavone@118: in <- { pavone@118: } pavone@118: out <- { pavone@118: fakeEvent <- #{ pavone@118: stopPropagation <- :Blah { pavone@118: } pavone@118: } pavone@118: ((astnode up) domNode) onclick: fakeEvent pavone@118: } pavone@131: next <- { pavone@131: console log: "selection next" pavone@131: (((astnode up) getNext: astnode) domNode) onclick: fakeEvent pavone@131: } pavone@131: previous <- { pavone@131: (((astnode up) getPrev: astnode) domNode) onclick: fakeEvent pavone@131: } pavone@118: } pavone@118: } pavone@118: pavone@17: editFile <- :path { pavone@17: get: path :request { pavone@17: addClass: (q: "body") "editorMode" pavone@21: src <- request responseText pavone@17: ast <- parser parse: src pavone@23: ast populateSymbols: (foreign: null) pavone@17: ast toHTML: (q: "#src") pavone@17: } pavone@17: } pavone@17: pavone@25: selectNode <- :node { pavone@25: each: (qall: ".selected") :idx el { pavone@25: removeClass: el "selected" pavone@25: } pavone@25: addClass: node "selected" pavone@25: } pavone@25: pavone@25: selectQuery <- :selector { pavone@25: selectQuery: selector in: (foreign: undefined) pavone@25: } pavone@25: pavone@25: selectQuery:in <- :selector :context { pavone@25: each: (qall: ".selected") :idx el { pavone@25: removeClass: el "selected" pavone@25: } pavone@25: each: (qall: selector context) :idx el { pavone@25: addClass: el "selected" pavone@25: } pavone@25: } pavone@25: pavone@25: selectParent <- :node { pavone@25: each: (qall: ".selectParent") :idx el { pavone@109: removeClass: el "selectParent" pavone@25: } pavone@113: addClass: node "selectParent" pavone@25: } pavone@25: pavone@25: popInscope:onClick <- :syms :handler { pavone@23: inscope <- q: "#inscope" pavone@23: inscope innerHTML!: "" pavone@24: each: syms :idx key { pavone@23: inscope appendChild: (newEl: "li" #{ pavone@23: textContent <- key pavone@107: onclick <- :Event { handler: key } pavone@23: }) pavone@23: } pavone@23: } pavone@23: pavone@119: scalarClick <- :domnode astnode event { pavone@119: selectNode: domnode pavone@119: setSelection: astnode pavone@119: event stopPropagation: (foreign: undefined) pavone@119: //TODO: set focus pavone@119: } pavone@119: pavone@29: symbolClick <- :domnode astnode event { pavone@25: selectNode: domnode pavone@105: popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key { pavone@25: domnode textContent!: key pavone@25: astnode name!: key pavone@25: } pavone@118: setSelection: astnode pavone@118: event stopPropagation: (foreign: undefined) pavone@118: } pavone@118: pavone@118: assignClick <- :domnode astnode event { pavone@118: selectParent: domnode pavone@118: selectQuery: ".selectParent > .varname" in: domnode pavone@118: popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key { pavone@118: (domnode firstChild) textContent!: key pavone@118: (astnode symbol) name!: key pavone@118: } pavone@118: setSelection: astnode withInNode: (astnode expression) pavone@107: event stopPropagation: (foreign: undefined) pavone@25: } pavone@25: pavone@116: opClick <- :domnode astnode event { pavone@116: selectParent: domnode pavone@116: selectQuery: ".selectParent > .opname" in: domnode pavone@116: showOps pavone@117: setSelection: astnode withInNode: (astnode left) pavone@116: event stopPropagation: (foreign: undefined) pavone@116: } pavone@116: pavone@29: funClick <- :domnode astnode event { pavone@25: selectParent: domnode pavone@113: selectQuery: ".selectParent > .funpart" in: domnode pavone@25: symtable <- astnode symbols pavone@108: syms <- filter: (symtable allSymbols: (foreign: undefined)) :sym { pavone@25: isLambda: ((symtable find: sym) def) pavone@25: } pavone@117: inner <- if: (astnode receiver) != (foreign: null) { pavone@117: astnode receiver pavone@117: } else: { pavone@117: (astnode args) getEl: 0 pavone@113: } pavone@117: setSelection: astnode withInNode: inner pavone@110: popInscope: syms onClick: :key { pavone@110: astnode name!: key pavone@110: parts <- key split: ":" pavone@110: nodes <- [] pavone@113: each: (domnode children) :idx val{ pavone@110: nodes push: val pavone@110: } pavone@110: partIdx <- 0 pavone@110: nodeIdx <- 0 pavone@110: lastWasNamePart <- true pavone@110: while: { partIdx < (parts length) || nodeIdx < (nodes length) } do: { pavone@110: if: nodeIdx < (nodes length) { pavone@110: node <-getEl: nodes nodeIdx pavone@110: nodeIdx <- nodeIdx + 1 pavone@110: if: (hasClass: node "funpart") { pavone@110: if: partIdx < (parts length) { pavone@110: postfix <- if: partIdx = 0 && nodeIdx = 2 && (parts length) = 1 && (nodes length) = 2 { "" } else: { ":" } pavone@110: t <- (getEl: parts partIdx) pavone@110: node textContent!: (getEl: parts partIdx) . postfix pavone@110: partIdx <- partIdx + 1 pavone@110: } else: { pavone@113: domnode removeChild: node pavone@110: } pavone@110: lastWasNamePart <- true pavone@110: } else: { pavone@110: if: (not: lastWasNamePart) && partIdx < (parts length) && nodeIdx > 0 { pavone@113: domnode insertBefore: (newEl: "span" #{ pavone@110: className <- "funpart selected" pavone@110: textContent <- (getEl: parts partIdx) . ":" pavone@110: }) node pavone@110: partIdx <- partIdx + 1 pavone@110: } pavone@110: lastWasNamePart <- false pavone@110: } pavone@110: } else: { pavone@110: console log: "part: " . (getEl: parts partIdx) pavone@113: domnode appendChild: (newEl: "span" #{ pavone@110: className <- "funpart selected" pavone@110: textContent <- (getEl: parts partIdx) . ":" pavone@110: }) pavone@110: partIdx <- partIdx + 1 pavone@110: } pavone@110: } pavone@110: } pavone@107: event stopPropagation: (foreign: undefined) pavone@25: } pavone@25: pavone@141: replaceNode:with <- :astnode domnode :newnode { pavone@141: pavone@141: } pavone@141: pavone@29: lambdaClick <- :domnode astnode event { pavone@119: selectNode: domnode pavone@119: popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key { pavone@141: replaceNode: astnode domnode with: (create_symbol: key) pavone@119: } pavone@119: inner <- if: ((astnode args) length) > 0 { pavone@119: (astnode args) getEl: 0 pavone@119: } else: { pavone@119: (astnode expressions) getEl: 0 pavone@119: } pavone@119: setSelection: astnode withInNode: inner pavone@119: event stopPropagation: (foreign: undefined) pavone@28: } pavone@28: pavone@120: objectClick <- :domnode astnode event { pavone@120: selectNode: domnode pavone@120: popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key { pavone@120: console log: "fooobar!" pavone@120: } pavone@124: setSelection: astnode withInNode: ((astnode messages) getEl: 0) pavone@120: event stopPropagation: (foreign: undefined) pavone@120: } pavone@120: pavone@116: visible <- "showops" pavone@116: pavone@116: showOps <- { pavone@116: each: (qall: ".controls") :idx el { pavone@116: removeClass: el visible pavone@116: addClass: el "showops" pavone@116: } pavone@116: visible <- "showops" pavone@116: } pavone@116: pavone@116: showLit <- { pavone@116: each: (qall: ".controls") :idx el { pavone@116: removeClass: el visible pavone@116: addClass: el "showlit" pavone@116: } pavone@116: visible <- "showlit" pavone@116: } pavone@116: pavone@11: main <- { pavone@30: get: "/src/" :data { pavone@30: fakeEl <- newEl: "div" #{ pavone@30: innerHTML <- data response pavone@30: } pavone@30: each: (qall: "a" fakeEl) :idx el { pavone@30: if: ((el textContent) = "../") {} else: { pavone@30: nel <- newEl: "a" #{ pavone@30: href <- "/edit/src/" + (el textContent) pavone@30: textContent <- el textContent pavone@30: } pavone@30: nel onclick!: :event { pavone@30: link <- foreign: this pavone@30: path <- link href pavone@30: path <- path substr: (path indexOf: "/edit/") + 5 pavone@30: editFile: path pavone@30: foreign: false pavone@30: } pavone@30: li <- newEl: "li" pavone@30: li appendChild: nel pavone@30: (q: "#browser ul") appendChild: li pavone@30: } pavone@12: } pavone@12: } pavone@124: pavone@12: //bind handlers for editor buttons pavone@12: each: (qall: ".controls li") :idx el { pavone@21: el onclick!: :event { pavone@11: srcel <- (q: "#src") pavone@21: srcel textContent!: (srcel textContent) + (el textContent) pavone@11: } pavone@11: } pavone@21: (q: "#ops_button") onclick!: :event { pavone@116: showOps pavone@111: } pavone@111: (q: "#lit_button") onclick!: :event { pavone@116: showLit pavone@11: } pavone@124: pavone@113: (q: "#in") onclick!: :event { pavone@113: console log: "inwards" pavone@113: if: (selection valid?) { pavone@113: selection in pavone@113: } pavone@113: } pavone@124: pavone@113: (q: "#out") onclick!: :event { pavone@113: console log: "outwards" pavone@113: if: (selection valid?) { pavone@113: selection out pavone@113: } pavone@113: } pavone@124: pavone@131: (q: "#next") onclick!: :event { pavone@131: if: (selection valid?) { pavone@131: selection next pavone@131: } pavone@131: } pavone@131: pavone@131: (q: "#prev") onclick!: :event { pavone@131: if: (selection valid?) { pavone@131: selection previous pavone@131: } pavone@131: } pavone@131: pavone@21: path <- (window location) pathname pavone@17: if: (path indexOf: "/edit/") = 0 { pavone@17: editFile: (path substr: 5) pavone@113: } pavone@127: (q: "#fullscreen") onclick!: :event { pavone@127: goFullScreen: pavone@127: } pavone@11: } pavone@11: pavone@11: }