]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Wiki/Parser.hs
The parser of frightening definition list has now been written!
[Rakka.git] / Rakka / Wiki / Parser.hs
index 83e3301fd62c8da175fcc1d38d0ca257879cb54c..017df8952fb09bfce930ca4c2ecd950f50ed8b3d 100644 (file)
@@ -30,6 +30,8 @@ blockElement = skipMany ( comment
                  <|>
                  listElement
                  <|>
+                 definitionList
+                 <|>
                  leadingSpaced
                  <|>
                  paragraph
@@ -91,30 +93,55 @@ listElement = listElement' [] >>= return . List
                     )
                     <|>
                     return []
-{-
-      items stack = do nested <- listElement' stack
-                       rest   <- items stack
-                       return (Left nested : rest)
-                    <|>
-                    do xs   <- many1 inlineElement
-                       rest <- items stack
-                       return (Right xs : rest)
-                    <|>
-                    try ( newline
-                          >>
-                          string stack
-                          >>
-                          items stack
-                        )
-                    <|>
-                    return []
--}
 
       toType :: Char -> ListType
       toType '*' = Bullet
       toType '#' = Numbered
 
 
+definitionList :: Parser BlockElement
+definitionList = many1 definition >>= return . DefinitionList
+    where
+      definition :: Parser Definition
+      definition = do char ';'
+                      ws
+                      tHead <- inlineElement
+                      tRest <- term
+                      d     <- description
+                      return (Definition (tHead:tRest) d)
+                   <?>
+                   "definition list"
+
+      term :: Parser [InlineElement]
+      term = (char ':' >> ws >> return [])
+             <|>
+             (newline >> char ':' >> ws >> return [])
+             <|>
+             do x  <- inlineElement
+                xs <- term
+                return (x:xs)
+             <?>
+             "term to be defined"
+
+      description :: Parser [InlineElement]
+      description = do x  <- inlineElement
+                       xs <- description
+                       return (x:xs)
+                    <|>
+                    try ( do newline
+                             char ':'
+                             ws
+                             xs <- description
+                             return (Text "\n" : xs)
+                        )
+                    <|>
+                    (newline >> return [])
+                    <|>
+                    (eof >> return [])
+                    <?>
+                    "description of term"
+
+
 leadingSpaced :: Parser BlockElement
 leadingSpaced = char ' ' >> leadingSpaced' >>= return . LeadingSpaced
     where
@@ -180,7 +207,18 @@ inlineElement = skipMany comment
 
 
 text :: Parser InlineElement
-text = many1 (noneOf ('\n':inlineSymbols)) >>= return . Text
+text = ( char ':'
+         >>
+         many (noneOf ('\n':':':inlineSymbols))
+         >>=
+         return . Text . (':' :)
+         -- 定義リストとの關係上、コロンは先頭にしか存在できない。
+       )
+       <|>
+       ( many1 (noneOf ('\n':':':inlineSymbols))
+         >>=
+         return . Text
+       )
 
 
 pageLink :: Parser InlineElement
@@ -219,7 +257,7 @@ comment = (try (string "<!--") >> skipTillEnd 1)
 
 
 blockSymbols :: [Char]
-blockSymbols = " =-*#"
+blockSymbols = " =-*#;"
 
 
 inlineSymbols :: [Char]