Guest User

Untitled

a guest
Apr 23rd, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.11 KB | None | 0 0
  1. {-
  2. Zen coding shizzle:
  3.  
  4. *Main> process "html>(head>(title+meta)+body>p.intro)"
  5. <html>
  6. <head>
  7. <title>
  8. </title>
  9. <meta />
  10. </head>
  11. <body>
  12. <p class="intro">
  13. </p>
  14. </body>
  15. </html>
  16.  
  17. *Main> process "div#news.module>(div.header+div.body>ul>li#item-$*5)"
  18. <div id="news" class="module">
  19. <div class="header">
  20. </div>
  21. <div class="body">
  22. <ul>
  23. <li id="item-1">
  24. </li>
  25. <li id="item-2">
  26. </li>
  27. <li id="item-3">
  28. </li>
  29. <li id="item-4">
  30. </li>
  31. <li id="item-5">
  32. </li>
  33. </ul>
  34. </div>
  35. </div>
  36.  
  37. Use in emacs like this:
  38.  
  39. (defun zencode ()
  40. "Zen Coding utility."
  41. (interactive)
  42. (shell-command-on-region
  43. (line-beginning-position)
  44. (line-end-position)
  45. "/home/chris/Programs/bin/zencoding"
  46. t))
  47. (define-key sgml-mode-map (kbd "\C-c \C-v") 'zencode)
  48.  
  49. -}
  50. import System.Environment
  51. import Control.Arrow (second)
  52. import Text.ParserCombinators.Parsec
  53. import Control.Applicative ((<$>))
  54. import Text.XHtml (Html,(<<),(+++),(!))
  55. import qualified Text.XHtml as XHTML
  56. data Eye = TagName String
  57. | Tag String [(String,String)]
  58. | MultiTag Eye Int
  59. | Cons Eye Eye
  60. | List [Eye]
  61. deriving Show
  62. main = interact $ process . concat . map replace
  63. -- strip out spaces (no need for them)
  64. where replace ' ' = []
  65. replace c = [c]
  66. transform :: Maybe Int -> Eye -> (Html -> Html)
  67. transform _ (MultiTag tag n) =
  68. \x -> XHTML.concatHtml $ map (<<x) $
  69. zipWith transform (map Just [1..]) $ replicate n tag
  70. transform _ (TagName tagname) = XHTML.tag tagname
  71. transform (Just i) (Tag tagname attrs) =
  72. XHTML.tag tagname ! map (uncurry XHTML.strAttr . additer) attrs where
  73. additer = second $ foldr replace [] where replace '$' = (show i++)
  74. replace c = (c:)
  75. transform _ (Tag tagname attrs) =
  76. XHTML.tag tagname ! map (uncurry XHTML.strAttr) attrs
  77. transform i (Cons parent children) =
  78. (\x -> transform i parent << transform i children << x)
  79. transform i (List eyes) =
  80. (\x -> foldr join XHTML.noHtml eyes) where
  81. join a r = (transform i a << XHTML.noHtml) +++ r
  82. op :: Char -> Parser Char
  83. op e = spaces >> char e >>= \e -> spaces >> return e
  84. expr = try pexpr <|> try list <|> try consexpr <|> parens list
  85. pexpr = parens expr
  86. parens p = do op '('
  87. e <- p
  88. op ')'
  89. return e
  90. cons = do a <- tag
  91. op '>'
  92. b <- try pexpr <|> try cons <|> tag
  93. return $ Cons a b
  94. consexpr = try (parens cons) <|> try cons <|> tag
  95. list :: Parser Eye
  96. list = do t <- consexpr
  97. op '+'
  98. r <- try (parens list) <|> try list <|> consexpr
  99. return $ List $ t : (case r of List rs -> rs; otherwise -> [r])
  100.  
  101. tag :: Parser Eye
  102. tag = try tagMulti <|> tagMaybeProps
  103.  
  104. tagMulti :: Parser Eye
  105. tagMulti = do t <- tagMaybeProps
  106. char '*'
  107. count <- read <$> many digit
  108. return $ MultiTag t count
  109.  
  110. tagMaybeProps :: Parser Eye
  111. tagMaybeProps = try tagWithProps <|> tagName
  112.  
  113. tagWithProps :: Parser Eye
  114. tagWithProps = do (Tag t props) <- tagName
  115. op '['
  116. props' <- many1 prop
  117. op ']'
  118. return $ Tag t (props ++ props')
  119.  
  120. prop :: Parser (String,String)
  121. prop = do name <- name
  122. op '='
  123. value <- many1 $ satisfy $ not . flip any "]," . (==)
  124. many $ char ','
  125. return (name,value)
  126.  
  127. tagName :: Parser Eye
  128. tagName = do
  129. n <- name
  130. id <- identifier <|> return ""
  131. classes <- many classname
  132. let idprop | null id = []
  133. | otherwise = [("id",id)]
  134. classprops = map ((,) "class") classes
  135. return $ Tag n $ idprop ++ classprops
  136. where
  137. idorclass = identifier <|> classname
  138. classname = char '.' >> name'
  139. identifier = char '#' >> name'
  140. name' = many1 $ oneOf $ ['A'..'Z'] ++ ['a'..'z'] ++ "-$"
  141.  
  142. name = many1 $ oneOf $ ['A'..'Z'] ++ ['a'..'z'] ++ ":-"
  143. process s = init $ case fragment of Right x -> x; _ -> ""
  144. where fragment = XHTML.prettyHtmlFragment . (\x -> x XHTML.noHtml)
  145. . transform Nothing <$> flip parse "meye" expr s
Add Comment
Please, Sign In to add comment