packages feed

hamlet-0.7.0: hamlet6to7.hs

import qualified Old.Julius as J
import qualified Old.Cassius as C
import qualified Old.Hamlet as H
import System.Environment (getArgs)

import Text.ParserCombinators.Parsec
import qualified Text.Julius as JN
import qualified Text.Cassius as CN
import qualified Text.Hamlet.Parse as HN

import Data.Char (toUpper)

main = getArgs >>= mapM_ go

go fp = do
    putStrLn $ "Checking " ++ fp
    case reverse $ takeWhile (/= '.') $ reverse fp of
        "julius" -> readFile fp >>= jelper >>= writeFile fp7
        "cassius" -> readFile fp >>= celper >>= writeFile fp7
        "hamlet" -> readFile fp >>= helper HN.defaultHamletSettings >>= writeFile fp7
        "hs" -> readFile fp >>= hsHelper fp7
        _ -> return ()
  where
    fp7 = fp -- ++ ".7"
    write = writeFile fp7
    check checker = do
        x <- checker `fmap` readFile fp7
        if x then return () else putStrLn $ "### Error parsing: " ++ fp7

hsHelper fp s = do
    let contents = either (error . show) id $ parse parseHs s s
    contents' <- concat `fmap` mapM renderContent contents
    writeFile fp contents'

renderContent (ContentRaw s) = return s
renderContent (ContentHamlet False s) = helper HN.defaultHamletSettings s
renderContent (ContentHamlet True s) = helper HN.xhtmlHamletSettings s
renderContent (ContentCassius s) = celper s
renderContent (ContentJulius s) = jelper s

data Content = ContentRaw String
             | ContentHamlet Bool String
             | ContentCassius String
             | ContentJulius String
parseHs =
    concat `fmap` many1 parseContent
  where
    parseContent = parseHamlet
                   <|> parseXhamlet
                   <|> parseCassius
                   <|> parseJulius
                   <|> (return . ContentRaw . return) `fmap` anyChar
    parseHamlet = do
        start <- startP "hamlet"
        inside <- manyTill anyChar $ try $ string "|]"
        return [ContentRaw start, ContentHamlet False inside, ContentRaw "|]"]
    parseXhamlet = do
        start <- try $ string "[$xhamlet|" <|> string "[xhamlet|"
        inside <- manyTill anyChar $ try $ string "|]"
        return [ContentRaw start, ContentHamlet True inside, ContentRaw "|]"]
    parseCassius = do
        start <- try $ string "[$cassius|" <|> string "[cassius|"
        inside <- manyTill anyChar $ try $ string "|]"
        return [ContentRaw start, ContentCassius inside, ContentRaw "|]"]
    parseJulius = do
        start <- try $ string "[$julius|" <|> string "[julius|"
        inside <- manyTill anyChar $ try $ string "|]"
        return [ContentRaw start, ContentJulius inside, ContentRaw "|]"]
    startP n = try (string $ concat ["[$", n, "|"])
               <|> try (string $ concat ["[", n, "|"])
               <|> try (string $ concat ["[", map toUpper n, "|"])
               <|> try (do
                            a <- string "\n#if "
                            b <- many1 $ noneOf "\r\n"
                            c <- string "\r\n" <|> string "\n"
                            d <- many $ char ' '
                            e <- string $ concat ["[", n, "|"]
                            f <- string "\r\n" <|> string "\n"
                            g <- string "#else"
                            h <- string "\r\n" <|> string "\n"
                            i <- many $ char ' '
                            j <- string $ concat ["[$", n, "|"]
                            k <- string "\r\n" <|> string "\n"
                            l <- string "#endif"
                            m <- string "\r\n" <|> string "\n"
                            return $ concat [a, b, c, d, e, f, g, h, i, j, k, l, m]
               )

jelper s = do
    let x = J.parse s
    let y = J.render x
    case parse JN.parseContents y y of
        Right z
            | JN.compressContents x == JN.compressContents z -> return ()
            | otherwise -> putStrLn "### Mismatch in Julius"
        _ -> putStrLn "Could not parse Julius"
    return y

celper s = do
    let x = C.parse s
    let y = C.render' x
    case parse CN.parseBlocks y y of
        Right z
            | x == z -> return ()
            | otherwise -> putStrLn "### Mismatch in Cassius"
        _ -> putStrLn "Could not parse Cassius"
    return y

helper set s = do
    let x = H.parse' set s
    let y = H.render' x
    case HN.parseLines set y of
        HN.Ok z
            | x == z -> return ()
            | otherwise -> putStrLn "### Mismatch in Hamlet"
        _ -> putStrLn "Could not parse Hamlet"
    return y