{-# LANGUAGE OverloadedStrings #-} -- wiki generator support module Wiki where import Control.Concurrent import Control.Concurrent.STM import qualified Control.Monad as M import Data.Text (Text) import Data.Time.Clock.POSIX import Graphics.Blank import System.Exit import System.IO.Unsafe import System.Posix.Process import System.Process import Text.Printf -- import Trace.Hpc.Reflect -- import Trace.Hpc.Tix snapShot :: DeviceContext -> FilePath -> IO () snapShot context fileName = do txt <- send context $ do tempCanvas <- newCanvas (round (width context + 20 :: Double), round (height context + 20 :: Double)) top' <- myCanvasContext with tempCanvas $ do -- print a border, because we can (looks better in wiki) save() beginPath() moveTo(1,1) lineTo(width context+1,1) lineTo(width context+1,height context+1) lineTo(1,height context+1) closePath() fillStyle "white" shadowOffsetX 10 shadowOffsetY 10; shadowBlur 15; shadowColor "#999"; fill() beginPath() moveTo(0.5,0.5) lineTo(width context+1.5,0.5) lineTo(width context+1.5,height context+1.5) lineTo(0.5,height context+1.5) closePath() shadowOffsetX 0 shadowOffsetY 0 shadowBlur 0 lineWidth 1 strokeStyle "black" stroke() restore() drawImage(top',[1,1]) toDataURL() -- of tempCanvas writeDataURL ("blank-canvas.wiki/" ++ fileName) txt wiki :: a -> a wiki = id close :: DeviceContext -> IO () close context = do -- n <- getPOSIXTime -- Tix tix <- examineTix -- let tix' = filter (\ t -> ("Graphics.Blank" `isPrefixOf` tixModuleName t)) -- $ tix -- writeFile ("tix/tix_" ++ printf "_%013d" (floor (fromRational (toRational n) * 1000) :: Integer) ++ ".tix") $ show $ Tix tix' send context $ eval "open(location, '_self').close()" threadDelay (1000 * 1000); putStrLn "dieing" p <- getProcessID callProcess "kill" [show p] quit quit :: IO a quit = exitSuccess whenM :: Monad m => Bool -> m () -> m () whenM = M.when anim_png :: String -> IO String anim_png nm = do n <- getPOSIXTime return $ "tmp/" ++ nm ++ printf "_%013d" (floor (fromRational (toRational n) * 1000 :: Double) :: Integer) ++ ".png" build_anim :: String -> Int -> IO () build_anim nm pz = do callCommand $ "convert -delay " ++ show pz ++ " -loop 0 -dispose background blank-canvas.wiki/tmp/" ++ nm ++ "_*.png blank-canvas.wiki/images/" ++ nm ++ ".gif" return () {-# NOINLINE count #-} count :: TVar Int count = unsafePerformIO $ newTVarIO 1 counter :: (Int -> Bool) -> (Int -> IO ()) -> IO () counter p k = do n <- atomically $ do v <- readTVar count writeTVar count $! v + 1 return v if p n then k n else return () ev :: DeviceContext -> Text -> Int -> IO () ev context t c = send context $ trigger $ Event { eMetaKey = False, ePageXY = Nothing, eType = t, eWhich = Just c }