diff src/editor.tp @ 30:608eb70fe261

Fix some compiler bugs and do initial work on module import
author Mike Pavone <pavone@retrodev.com>
date Thu, 19 Apr 2012 19:20:21 -0700
parents editor.tp@18cec540238a
children 668f533e5284
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/editor.tp	Thu Apr 19 19:20:21 2012 -0700
@@ -0,0 +1,167 @@
+#{
+//mquery functions
+q <- foreign: :query {}
+qall <- foreign: :query {}
+each <- foreign: :iterable fun {}
+addClass <- foreign: :node className {}
+removeClass <- foreign: :node className {}
+get <- foreign: :url onSuccess onFail onOther {}
+newEl <- foreign: :tagname props {}
+
+//TP Parser
+parser <- foreign: #{
+	parse <- foreign: :str {}
+}
+isLambda <- foreign: :astnode {}
+
+//js builtins
+console <- foreign: #{
+	log <- foreign: :val {}
+}
+window <- foreign: #{}
+Object <- foreign: #{
+	keys <- foreign: :object {}
+}
+
+//kernel definitions
+true <- #{
+  if:else <- :self trueblock :elseblock {
+    trueblock:
+  }
+}
+
+false <- #{
+  if:else <- :self trueblock :elseblock {
+    elseblock:
+  }
+}
+
+filter <- :arr pred {
+	output <- arr slice: 0 0
+	each: arr :idx el {
+		if: (pred: el) {
+			output push: el
+		} else: {}
+	}
+	output
+}
+
+//editor code
+editFile <- :path {
+	get: path :request {
+		addClass: (q: "body") "editorMode"
+		src <- request responseText
+		ast <- parser parse: src
+		ast populateSymbols: (foreign: null)
+		ast toHTML: (q: "#src")
+	}
+}
+
+selectNode <- :node {
+	each: (qall: ".selected") :idx el {
+		removeClass: el "selected"
+	}
+	addClass: node "selected"
+}
+
+selectQuery <- :selector {
+	selectQuery: selector in: (foreign: undefined)
+}
+
+selectQuery:in <- :selector :context {
+	each: (qall: ".selected") :idx el {
+		removeClass: el "selected"
+	}
+	each: (qall: selector context) :idx el {
+		addClass: el "selected"
+	}
+}
+
+selectParent <- :node {
+	each: (qall: ".selectParent") :idx el {
+		removeClass: el "selected"
+	}
+	addClass: (node parentNode) "selectParent"
+}
+
+popInscope:onClick <- :syms :handler {
+	inscope <- q: "#inscope"
+	inscope innerHTML!: ""
+	each: syms :idx key {
+		inscope appendChild: (newEl: "li" #{
+			textContent <- key
+			onclick <- { handler: key }
+		})
+	}
+}
+
+symbolClick <- :domnode astnode event {
+	console log: astnode
+	selectNode: domnode
+	popInscope: ((astnode symbols) allSymbols) onClick: :key {
+		domnode textContent!: key
+		astnode name!: key
+	}
+	event stopPropagation
+}
+
+funClick <- :domnode astnode event {
+	selectParent: domnode
+	selectQuery: ".selectParent > .funpart" in: (domnode parentNode)
+	symtable <- astnode symbols
+	syms <- filter: (symtable allSymbols) :sym {
+		isLambda: ((symtable find: sym) def)
+	}
+	popInscope: syms onClick: {}
+	event stopPropagation
+}
+
+lambdaClick <- :domnode astnode event {
+	symbolClick: domnode astnode event
+}
+
+main <- {
+	get: "/src/" :data {
+		fakeEl <- newEl: "div" #{
+			innerHTML <- data response
+		}
+		each: (qall: "a" fakeEl) :idx el {
+			if: ((el textContent) = "../") {} else: {
+				nel <- newEl: "a" #{
+					href <- "/edit/src/" + (el textContent)
+					textContent <- el textContent
+				}
+				nel onclick!: :event {
+					link <- foreign: this
+					path <- link href
+					path <- path substr: (path indexOf: "/edit/") + 5
+					editFile: path
+					foreign: false
+				}
+				li <- newEl: "li"
+				li appendChild: nel
+				(q: "#browser ul") appendChild: li
+			}
+		}
+	}
+	
+	//bind handlers for editor buttons
+	each: (qall: ".controls li") :idx el {
+		el onclick!: :event {
+			srcel <- (q: "#src")
+			srcel textContent!: (srcel textContent) + (el textContent)
+		}
+	}
+	(q: "#ops_button") onclick!: :event {
+		each: (qall: ".controls") :idx el {
+			addClass: el "showops"
+		}
+	}
+	
+	path <- (window location) pathname
+	if: (path indexOf: "/edit/") = 0 {
+		editFile: (path substr: 5)
+	} else: {}
+}
+
+}