module Hakyll.Shortcode.Parser (
shortcodeParser
) where
import Text.ParserCombinators.Parsec
shortcodeParser :: String -> Parser [(String, String)]
shortcodeParser tag = do
string "<p>["
many $ char ' '
string tag
many $ char ' '
attributes <- sepBy (try keyvalParser) (many $ char ' ')
many $ char ' '
string "]</p>"
return attributes
keyvalParser :: Parser (String, String)
keyvalParser = do
key <- many1 $ oneOf $ ['a'..'z'] ++ ['A'..'Z'] ++ ['-']
char '='
value <- quotedString
return (key, value)
quotedString :: Parser String
quotedString = foldl1 (<|>)
[ delimitedString '\'' '\''
, delimitedString '"' '"'
, delimitedString '\x2018' '\x2019'
, delimitedString '\x201C' '\x201D'
]
where
delimitedString :: Char -> Char -> Parser String
delimitedString open close = do
_ <- char open
t <- many $ choice
[ try $ noneOf [ close, '\\', '\n', ']' ]
, try $ string ['\\',close] >> return close
, try $ string "\\\\" >> return '\\'
, try $ string "\\n" >> return '\n'
, try $ string "\\]" >> return ']'
]
_ <- char close
return t