~alcinnz/amphiarao

70de37cee9613aaeceedea91f0ac89cfd83bd8aa — Adrian Cochrane 3 years ago 7b26fe8
Show syntax-highlighted start tags for elements in HTML UI.
5 files changed, 94 insertions(+), 11 deletions(-)

M src/Internal.hs
M src/Main.hs
M src/Messages.hs
M src/UI/Search.hs
M src/UI/Templates.hs
M src/Internal.hs => src/Internal.hs +4 -1
@@ 1,7 1,7 @@
{-# LANGUAGE OverloadedStrings, ScopedTypeVariables, DeriveGeneric #-}
module Internal(Session(..), Session'(..), Sessions(..),
        initSessions, createSession, delSession, getSession, withSession,
        Timeouts(..), registerEl, serializeEl) where
        Timeouts(..), registerEl, serializeEl, getEl) where

import qualified Data.HashMap.Strict as M
import Data.UUID as ID


@@ 100,3 100,6 @@ serializeEl session el = do
    return $ M.fromList [
        ("element-6066-11e4-a52e-4f735466cecf", String $ pack $ ID.toString uuid)
      ]

getEl :: Session' -> UUID -> Maybe XML.Cursor
getEl session uuid = M.lookup uuid $ knownEls session

M src/Main.hs => src/Main.hs +33 -5
@@ 14,6 14,9 @@ import qualified Data.Text as Txt
import Webdriver
import Data.UUID as ID

import qualified Text.XML.Cursor as XC
import qualified Text.XML as XML

import Messages
import Happstack.Server.I18N



@@ 70,6 73,8 @@ servePreviewPrompt = do
    method GET
    Tpl.page ok ["?", "Amphiarao"] $ \langs -> H.p $ l langs PromptPreview

---

serveSession :: Sessions -> String -> ServerPart Response
serveSession = withSession session404 $ \uuid session -> msum [
        sessionHome session,


@@ 80,7 85,8 @@ serveSession = withSession session404 $ \uuid session -> msum [
            dir "reload" $ reloadPage uuid session,
            dir "back" $ sessionAction' uuid session Load.back,
            dir "next" $ sessionAction' uuid session Load.next
        ]
        ],
        dir "el" $ path $ serveEl uuid session
    ]

sessionHome session = do


@@ 88,10 94,8 @@ sessionHome session = do
    method GET

    session' <- liftIO $ readMVar session
    title <- liftIO $ El.getTitle session
    Tpl.inspector ok "title" session' $ \langs -> do
        H.h1 $ text title
        H.p $ string $ show $ currentURL session'
    Tpl.inspector ok "title" session' $ \langs ->
        Tpl.xmlNode $ XML.NodeElement $ XML.documentRoot $ document session'

session404 uuid = do
    Tpl.page notFound ["404", "Amphiarao"] $ \langs -> do


@@ 154,3 158,27 @@ sessionAction' uuid session cb = do
    method POST
    liftIO $ cb session
    seeOther ('/':ID.toString uuid) $ toResponse ()

---

serveEl :: UUID -> Session -> String -> ServerPart Response
serveEl uuid session el = do
    session' <- liftIO $ readMVar session
    case getEl session' =<< ID.fromString el of
        Just el' -> msum [
            dir "preview" $ serveElPreview uuid el',
            serveEl' uuid session' el'
          ]
        Nothing -> Tpl.inspector notFound "404" session' $ \langs ->
            H.h1 $ l langs ElementNotFound

serveEl' uuid session' el = do
    nullDir
    method GET
    Tpl.inspector ok "Element" session' $ \langs -> Tpl.xmlNode $ XC.node el

serveElPreview uuid el = do
    nullDir
    method GET
    Tpl.page ok ["Element", Txt.pack $ ID.toString uuid, "Amphiarao"] $ \langs ->
        Tpl.xmlNode $ XC.node el

M src/Messages.hs => src/Messages.hs +2 -0
@@ 12,6 12,7 @@ data Message =
    CloseSession |
    LoadTimeout |
    SessionNotFound |
    ElementNotFound |
    NoResults |
    PromptPreview |
    ErrURL deriving Show


@@ 33,6 34,7 @@ l ("en":_) CreateSession = "Open new test session"
l ("en":_) LoadTimeout = "Load Timeout"
l ("en":_) CloseSession = "Close Session"
l ("en":_) SessionNotFound = "Session Not Found"
l ("en":_) ElementNotFound = "Element Not Found"
l ("en":_) NoResults = em "No Results"
l ("en":_) PromptPreview = em "Click a search result to preview it here"
l ("en":_) ErrURL = do

M src/UI/Search.hs => src/UI/Search.hs +4 -3
@@ 16,6 16,7 @@ import qualified Internal.Elements as Els
import qualified Text.XML.Cursor as XC

import Control.Monad (mapM)
import qualified UI.Templates as Tpl

engines :: [(
    [Text] -> Html,


@@ 26,13 27,13 @@ engines = [
    (const "CSS", queryEls "css selector")
  ]

result href' label = a ! href (stringValue href') ! target "preview" $ string label
result href' = a ! href (stringValue href') ! target "preview"
disclosure = "⤷"

---

offerToLoad q _ _ | Just _ <- parseAbsoluteURI q = return [\langs -> do
        result q q
        result q $ string q
        H.form ! action "nav/load" ! method "POST" $ do
            input ! type_ "hidden" ! name "url" ! value (stringValue q)
            button ! type_ "submit" ! class_ "disclosure" ! A.title (l' langs DebugLink') $ disclosure


@@ 44,4 45,4 @@ queryEls method q session session'
        Prelude.map formatEl <$> mapM (\el -> (,) el <$> registerEl session el) ret
    | otherwise = return []

formatEl (el, uuid) langs = result ("el/" ++ ID.toString uuid ++ "/preview") $ show $ XC.node el
formatEl (el, uuid) langs = result ("el/" ++ ID.toString uuid ++ "/preview") $ Tpl.xmlNode $ XC.node el

M src/UI/Templates.hs => src/UI/Templates.hs +51 -2
@@ 1,5 1,5 @@
{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}
module UI.Templates(page, inspector, sessionForm) where
module UI.Templates(page, inspector, sessionForm, xmlNode) where

import Happstack.Lite
import Text.Blaze.Html5 as H


@@ 9,10 9,13 @@ import Data.Text as Txt

import Internal
import Control.Monad.IO.Class (liftIO)
import Control.Monad (unless)
import Control.Monad (unless, when, forM)
import Control.Concurrent.MVar
import Data.UUID as ID

import Text.XML (Element(..), Node(..), Instruction(..), Name(..))
import qualified Data.Map as M

import Messages
import Happstack.Server.I18N



@@ 55,3 58,49 @@ inspector return' title session' body' = do
sessionForm langs = H.form ! A.method "POST" ! action "/" ! alt (l' langs CreateSession') $ do
    input ! type_ "url" ! name "target" ! placeholder "URL to debug"
    button ! type_ "submit" $ l langs CreateSession

--- XML formatting

xmlNode (NodeElement (Element name attrs childs)) = do
    symbolTok False "<"
    ident'Tok name
    forM (M.toList attrs) $ \(name, value) -> do
        text " "
        ident'Tok name
        symbolTok True "="
        stringTok $ show value -- quote it!
    when (Prelude.null childs) $ symbolTok True "/"
    symbolTok False ">"
  where
    ident'Tok (Name tag _ ns) = do
        case ns of
            Just ns' -> do
                qualifyTok ns'
                symbolTok False ":"
            Nothing -> return ()
        identTok tag
xmlNode (NodeInstruction (Instruction name value)) = do
    symbolTok False "<"
    symbolTok True "?"
    identTok name
    text " "
    stringTok $ unpack value
    symbolTok True "?"
    symbolTok False ">"

xmlNode (NodeContent text) = stringTok $ show text
xmlNode (NodeComment text) = do
    symbolTok False "<!--"
    commentTok text
    symbolTok False "-->"



symbolTok False = token "symbol silent"
symbolTok True = token "symbol"
qualifyTok = token "qualify"
identTok = token "ident"
stringTok = token "string" . pack
commentTok = token "comment"

token type_ txt = H.span ! class_ (stringValue ("tok-" ++ type_)) $ text txt