[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 " " & 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