module Hoodle.ModelAction.Text where
import Control.Applicative
import Data.Attoparsec.Text as A
import Data.Char (isAlphaNum)
import qualified Data.HashMap.Strict as M
import qualified Data.Text as T
import Debug.Trace
getLinesFromText :: (Int,Int) -> T.Text -> T.Text
getLinesFromText (i,e) = T.unlines . Prelude.drop (i1) . Prelude.take e . T.lines
getKeywordMap :: T.Text -> M.HashMap T.Text T.Text
getKeywordMap txt = case parseOnly (many keywordContents) txt of
Left err -> M.empty
Right lst -> M.fromList lst
keywordBegin :: A.Parser T.Text
keywordBegin =
skipWhile (notInClass "%") *> (try (string "%h%k " *> A.skipSpace
*> A.takeWhile1 isAlphaNum
<* A.skipWhile (not . isEndOfLine)
<* A.endOfLine)
<|> (oneline *> keywordBegin))
keywordEnd :: A.Parser ()
keywordEnd = string "%h%k%end" >> skipWhile (notInClass "\r\n") >> endOfLine
oneline :: A.Parser T.Text
oneline = A.takeWhile (not . isEndOfLine) <* endOfLine
keywordContents :: A.Parser (T.Text, T.Text)
keywordContents = do
k <- keywordBegin
txt <- T.unlines <$> manyTill oneline keywordEnd
return (k,txt)
extractKeyword :: T.Text -> Maybe T.Text
extractKeyword txt =
case T.unpack txt of
'e':'m':'b':'e':'d':'l':'a':'t':'e':'x':':':'k':'e':'y':'w':'o':'r':'d':':':xs -> Just (T.pack xs)
_ -> Nothing