diff --git a/fluffy-parser/fluffy-parser.cabal b/fluffy-parser/fluffy-parser.cabal index 15519d8..c601a27 100644 --- a/fluffy-parser/fluffy-parser.cabal +++ b/fluffy-parser/fluffy-parser.cabal @@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: fluffy-parser -version: 0.1.0.0 +version: 0.1.0.50 -- synopsis: -- description: license: GPL-3 diff --git a/fluffy-parser/src/Fluffy/Parser.hs b/fluffy-parser/src/Fluffy/Parser.hs index c626d85..f25fc2b 100644 --- a/fluffy-parser/src/Fluffy/Parser.hs +++ b/fluffy-parser/src/Fluffy/Parser.hs @@ -330,7 +330,7 @@ parserMCQuestBody = do str <- many anyChar return (ans, reverse str) -parserMCQuestHead :: Stream s m Char => ParsecT s u m MultipleChoiceContext +parserMCQuestHead :: Stream s m Char => ParsecT s u m [MultipleChoiceContext] parserMCQuestHead = do spaces string "Question" @@ -338,34 +338,42 @@ parserMCQuestHead = do many digit spaces char ':' - MCCQuestHead <$> many1 anyChar - -parserMCQuestRest :: Stream s m Char => ParsecT s u m MultipleChoiceContext -parserMCQuestRest = MCCQuestBody <$> many1 anyChar - -parserMCQuestItem :: Stream s m Char => ParsecT s u m MultipleChoiceContext -parserMCQuestItem = do - item <- (\x -> x - ord 'A') . ord <$> oneOf ['A'..'Z'] - char ':' - spaces - str <- many1 anyChar - return $ MCCQuestItem item str + pure . MCCQuestHead <$> many1 anyChar + +parserMCQuestRest :: Stream s m Char => ParsecT s u m [MultipleChoiceContext] +parserMCQuestRest = pure . MCCQuestBody <$> many1 anyChar + +parserMCQuestItem :: Stream s m Char => ParsecT s u m [MultipleChoiceContext] +parserMCQuestItem = step [] + where step xs = do + item <- (\x -> x - ord 'A') . ord <$> oneOf ['A'..'Z'] + char ':' + spaces + str <- many $ noneOf ['A'..'Z'] + let xs' = MCCQuestItem item str:xs + try (end xs') <|> try (step xs') <|> (more xs item str) + more xs item str = do + str' <- many (oneOf $ ':':['A'..'Z']) + str'' <- many $ noneOf ['A'..'Z'] + let xs' = MCCQuestItem item (str++str'++str''):xs + try (end xs') <|> try (step xs') <|> (more xs item (str++str'++str'')) + end xs = eof >> return xs -parserMC :: Stream s m Char => ParsecT s uP m MultipleChoiceContext -parserMC = try parserMCQuestHead <|> try parserMCQuestItem <|> parserMCQuestRest +parserMC :: Stream s m Char => ParsecT s uP m [MultipleChoiceContext] +parserMC = try parserMCQuestHead <|> try parserMCQuestItem <|> parserMCQuestRest parseMCBody :: [(Int,String)] -> String -> MultipleChoiceProb parseMCBody c b = let (Right (ans,body)) = parse parserMCQuestBody "function parseMCBody" $ replace160 $ reverse b in MultipleChoiceProb body ans c -parseMCfBlock :: Block -> MultipleChoiceContext +parseMCfBlock :: Block -> [MultipleChoiceContext] parseMCfBlock (Para il) = let body = renderText il rt = parse parserMC "function parseMCBlock" $ replace160 body in case rt of Right i -> i - Left _ -> MCCNull + Left e -> error $ show e-- [MCCNull] data MultipleChoiceProb = MultipleChoiceProb { mcbBody :: String diff --git a/fluffy/fluffy.cabal b/fluffy/fluffy.cabal index 5b1bc8a..57b6d04 100644 --- a/fluffy/fluffy.cabal +++ b/fluffy/fluffy.cabal @@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: fluffy -version: 0.1.0.0 +version: 0.1.0.70 -- synopsis: -- description: license: GPL-3 diff --git a/scripts/update.hs b/scripts/update.hs index 5d38fc5..9d0dd81 100755 --- a/scripts/update.hs +++ b/scripts/update.hs @@ -35,7 +35,7 @@ readUpdateMC :: MonadIO m => Connection -> FilePath -> m () readUpdateMC c fp = do Right (Pandoc _ bs) <- liftIO $ loadFileWithDocx fp let mccs = map parseMCfBlock bs - mcps = toMCPfMCC mccs + mcps = toMCPfMCC $ concat mccs mcs = map toMCfMCP mcps mapM_ (liftIO.updateMC c) mcs