Я пытаюсь написать что-то для анализа моего шаблона Django, однако мой парсер дает сбой, если что-то следует за {% endblock %}
Вот что у меня есть до сих пор
import Control.Monad
import Text.ParserCombinators.Parsec
data Piece = StaticPiece String
| BlockPiece String [Piece]
| VarPiece String
deriving (Show)
noWhitespace = many1 $ oneOf "_" <|> alphaNum
parseBlock = do
blockName <- between (string "{% block" >> spaces) (spaces >> string "%}") noWhitespace <?> "block tag"
blockContent <- many (parsePiece (void $ try $ (string "{% endblock %}")))
return $ BlockPiece blockName blockContent
parseVar = do
var <- between (string "{{" >> spaces) (spaces >> string "}}") noWhitespace <?> "variable"
return $ VarPiece var
parseStatic end = do
s <- manyTill (anyChar) $ end <|> (void $ lookAhead $ try $ parseNonStatic)
return $ StaticPiece s
parseNonStatic = try parseBlock <|> parseVar
parsePiece s = try parseNonStatic <|> (parseStatic s)
parsePieces = manyTill (parsePiece eof) eof
main :: IO ()
main = do
putStrLn "1"
print $ parse parsePieces "" "Blah blah blah"
putStrLn "2"
print $ parse parsePieces "" "{{ some_var }} string {{ other_var }} s"
putStrLn "3"
print $ parse parsePieces "" "{% block body %}{% endblock %}"
putStrLn "4"
print $ parse parsePieces "" "{% block body %}{{ hello }}{% endblock %}"
putStrLn "5"
print $ parse parsePieces "" "{% block body %}{% {% endblock %}"
putStrLn "6"
print $ parse parseBlock "" "{% block body %}{% endblock %} "
putStrLn "7"
print $ parse parsePieces "" "{% block body %} {} { {{ }{ {{{}} cool } {% block inner_body %} Hello: {{ hello }}{% endblock %} {% endblock %}"
putStrLn "8"
print $ parse parsePieces "" "{% block body %} {} {{ cool }} {% block inner_body %} Hello: {{ hello }}{% endblock %}{% endblock %} ldsakjf"
print ">>"
--
print $ parse parseBlock "" "{% block body %}{% endblock %} "
Я думаю, что как-то вместо того, чтобы смотреть на строку от начала до конца, он как-то смотрит на нее с конца. Если вы посмотрите на #7, StaticPiece " "
находится внутри самого внутреннего блока, хотя он должен быть в блоке body
. Любая помощь будет оценена по достоинству.
Отредактируйте приведенные выше выходные данные кода:
1
Right [StaticPiece "Blah blah blah"]
2
Right [VarPiece "some_var",StaticPiece " string ",VarPiece "other_var",StaticPiece " s"]
3
Right [BlockPiece "body" [StaticPiece ""]]
4
Right [BlockPiece "body" [VarPiece "hello",StaticPiece ""]]
5
Right [BlockPiece "body" [StaticPiece "{% "]]
6
Left (line 1, column 32):
unexpected end of input
expecting "{% endblock %}", block tag or variable
7
Right [BlockPiece "body" [StaticPiece " {} { {{ }{ {{{}} cool } ",BlockPiece "inner_body" [StaticPiece " Hello: ",VarPiece "hello",StaticPiece "",StaticPiece " "]]]
8
Right [StaticPiece "{% block body %} {} ",VarPiece "cool",StaticPiece " {% block inner_body %} Hello: ",VarPiece "hello",StaticPiece "{% endblock %}{% endblock %} ldsakjf"]
">>"
Left (line 1, column 32):
unexpected end of input
expecting "{% endblock %}", block tag or variable
manyTill (parsePiece eof) eof
? - person AndrewC   schedule 21.02.2014{% block body %}
и{% endblock %}
или{{enclosed in moustaches}}
, является статической частью? - person AndrewC   schedule 21.02.2014{% url "home:terms" %}
, но я могу сделать этот парсер позже. - person DantheMan   schedule 21.02.2014{%
без соответствия%}
и т. д.? - person AndrewC   schedule 21.02.2014