[Fencommits] fenserve: code for keeping track of which parts of a rendered expression correspond to which subexpression (to enable editing)

Benja Fallenstein benja.fallenstein at gmail.com
Wed Jun 20 02:19:54 EEST 2007


Wed Jun 20 02:19:39 EEST 2007  Benja Fallenstein <benja.fallenstein at gmail.com>
  * code for keeping track of which parts of a rendered expression correspond to which subexpression (to enable editing)
diff -rN -u old-fenserve/fendata/Rendering.hs new-fenserve/fendata/Rendering.hs
--- old-fenserve/fendata/Rendering.hs	2007-06-20 02:19:53.000000000 +0300
+++ new-fenserve/fendata/Rendering.hs	2007-06-20 02:19:54.000000000 +0300
@@ -14,6 +14,7 @@
 
 import Data.Generics
 import Data.Int
+import Data.List (intersperse)
 import Data.Map (Map)
 import Data.Maybe (fromMaybe)
 import qualified Data.Map as Map
@@ -49,7 +50,7 @@
 
 
 varType :: (?db :: DB, ?time :: Int64) => Int -> RenderExp ()
-varType i = ask >>= tell . toHTML . renderType . snd . (!! i) . envVars 
+varType i = ask >>= renderOne . renderType . snd . (!! i) . envVars 
 
 varName :: (?db :: DB, ?time :: Int64) => Int -> RenderExp ()
 varName i = asks ((!! i) . envVars) >>= \(name,_) -> ren ("'", ital name, "'")
@@ -73,7 +74,8 @@
 instance RenderOne (RenderExp a) where renderOne m = m >> return ()
 instance RenderOne Type where renderOne = renderOne . renderType
 instance RenderOne Values where renderOne = renderOne . renderValues
-instance ToHTML a => RenderOne a where renderOne x = tell (toHTML x)
+instance ToHTML a => RenderOne a where
+    renderOne x = asks envPath >>= \p -> tell [(p, toHTML x)]
 
 instance Ren () where ren () = return ()
 instance (RenderOne x, Ren xs, Tuple x xs t) => Ren t where
@@ -81,7 +83,11 @@
 
 
 renderExp :: (?db :: DB, ?time :: Int64) => (String -> Potion) -> Exp -> HTML
-renderExp getPotion exp = execWriter $ flip runStateT 0 $ runReaderT (renderExp' getPotion exp) $ Env [] [] exp
+renderExp getPotion exp = f $ execWriter $ flip runStateT 0 $ runReaderT (renderExp' getPotion exp) $ Env [] [] exp where
+    f ((p,h):(q,i):xs) | p == q = f ((p,h&i):xs)
+    f ((p,h):xs) = link ("/path/" ++ (concat $ intersperse "." $ map show p)) h 
+                 & HTML "&nbsp;" & f xs
+    f [] = HTML ""
     
 renderExp' :: (?db :: DB, ?time :: Int64) => (String -> Potion) -> Exp -> RenderExp ()
 renderExp' getPotion exp@(Exp n arg) = f (getPotion n) where
diff -rN -u old-fenserve/fendata/Types.hs new-fenserve/fendata/Types.hs
--- old-fenserve/fendata/Types.hs	2007-06-20 02:19:53.000000000 +0300
+++ new-fenserve/fendata/Types.hs	2007-06-20 02:19:54.000000000 +0300
@@ -141,7 +141,7 @@
 
 data Env = Env { envVars :: [(String,Type)], envPath :: [Int], envWhole :: Exp }
 
-type RenderExp = ReaderT Env :$$: StateT Int :$$: Writer HTML
+type RenderExp = ReaderT Env :$$: StateT Int :$$: Writer [([Int], HTML)]
                                
 
 data SExp = SExp String [SExp]




More information about the Fencommits mailing list