wisp
 
(Arne Babenhauserheide)
2013-01-30: basic wisp2lisp seems to work

basic wisp2lisp seems to work

diff --git a/example.w b/example.w
--- a/example.w
+++ b/example.w
@@ -5,7 +5,9 @@ defun a
       d e
       : 
         f
+        g
       : 
-        g
-  h i
-  . j
+        h
+        . i
+  j k
+  . l
diff --git a/wisp.py b/wisp.py
--- a/wisp.py
+++ b/wisp.py
@@ -1,8 +1,18 @@
 #!/usr/bin/env python3
 
 class Line:
-    def __init__(self, content, indent, continues=False):
-        self.content, self.indent, self.continues = content, indent, continues
+    def __init__(self, line):
+        self.continues = line.lstrip().startswith(". ")
+        if self.continues:
+            self.content = line.lstrip()[2:].lstrip()
+        else:
+            self.content = line.lstrip()
+        self.indent = len(line) - len(line.lstrip())
+        while self.content.startswith(": ") and self.content[2:].lstrip():
+            self.indent += len(self.content) - len(self.content[2:].lstrip())
+            self.content = self.content[2:].lstrip()
+        if self.content.strip() == ":":
+            self.content = ""
 
 def wisp2lisp(code):
     """Turn wisp code to lisp code."""
@@ -21,15 +31,15 @@ def wisp2lisp(code):
     # now read the indentation
     lines = []
     for line in code.splitlines():
-        lines.append(Line(content = line.lstrip(), 
-                          indent = len(line) - len(line.lstrip()),
-                          continues = line.lstrip().startswith(". ")))
+        lines.append(Line(line))
 
     # finally emit matching lisp code
     # write into the lisp lines with a delay of 1 line
     lisplines = []
     levels = []
     prev = lines[0]
+    if not prev.continues:
+        prev.content = "(" + prev.content
     for line in lines[1:]:
         # continuing lines do not get a leading bracket.
         if not line.continues:
@@ -43,13 +53,15 @@ def wisp2lisp(code):
             lisplines.append(prev.indent * " " + prev.content + ")")
         # lower indent: parent funtion or variable. Find the number of brackets to close
         if prev.indent > line.indent:
-            bracketstoclose = 1 + len([level for level in levels if level > line.indent])
-            levels = levels[:-bracketstoclose]
+            bracketstoclose = len([level for level in levels if level >= line.indent])
+            levels = levels[:-bracketstoclose + 1]
+            if prev.continues:
+                bracketstoclose -= 1
             lisplines.append(prev.indent * " " + prev.content + ")" * bracketstoclose)
         
         prev = line
     
-    lisplines.append(prev.indent * " " + prev.content + ")" * len(levels))
+    lisplines.append(prev.indent * " " + prev.content + ")" * (len(levels)))
     
     return "\n".join(lisplines)