]> gitweb @ CieloNegro.org - Rakka.git/commitdiff
The parser of frightening definition list has now been written!
authorpho <pho@cielonegro.org>
Sat, 13 Oct 2007 02:33:19 +0000 (11:33 +0900)
committerpho <pho@cielonegro.org>
Sat, 13 Oct 2007 02:33:19 +0000 (11:33 +0900)
darcs-hash:20071013023319-62b54-d63ad5fbd6333bd353562894614efdd78b58d781.gz

Rakka/Wiki.hs
Rakka/Wiki/Formatter.hs
Rakka/Wiki/Parser.hs
defaultPages/MainPage
defaultPages/StyleSheet/Default
test/WikiParserTest.hs

index 3b1802f0e4cc42928fc4341e03f2eb36116eb1a1..9f8bcdce7d9d47268d557521f7e15e05e0a97efa 100644 (file)
@@ -6,6 +6,8 @@ module Rakka.Wiki
     , ListElement(..)
     , ListType(..)
     , ListItem
+
+    , Definition(..)
     )
     where
 
@@ -22,6 +24,7 @@ data BlockElement
       }
     | HorizontalLine
     | List !ListElement
+    | DefinitionList ![Definition]
     | LeadingSpaced ![InlineElement]
     | Paragraph ![InlineElement]
     deriving (Eq, Show)
@@ -52,3 +55,11 @@ data ListType
 
 
 type ListItem = [Either ListElement InlineElement]
+
+
+data Definition
+    = Definition {
+        defTerm :: ![InlineElement]
+      , defDesc :: ![InlineElement]
+      }
+    deriving (Eq, Show)
\ No newline at end of file
index 1246ab1e61b16dc42b368e5f419aa85af70c2da3..1792299d3c0a09a990ea817fee7078d7aabcdce1 100644 (file)
@@ -35,6 +35,9 @@ formatBlock
          List list
              -> formatListElement -< (baseURI, list)
 
+         DefinitionList list
+             -> formatDefinitionList -< (baseURI, list)
+
          LeadingSpaced inlines
              -> formatLeadingSpaced -< (baseURI, inlines)
                 
@@ -79,6 +82,33 @@ formatListElement
                  Right inline     -> formatInline      -< (baseURI, inline    )
 
 
+formatDefinitionList :: (ArrowXml a, ArrowChoice a) => a (URI, [Definition]) XmlTree
+formatDefinitionList 
+    = proc (baseURI, list)
+    -> ( eelem "dl"
+         += ( (arr fst &&& arrL snd)
+              >>>
+              formatDefinition
+            )
+       ) -< (baseURI, list)
+    where
+      formatDefinition :: (ArrowXml a, ArrowChoice a) => a (URI, Definition) XmlTree
+      formatDefinition 
+          = proc (baseURI, def)
+          -> ( eelem "dt"
+               += ( (arr fst &&& arrL (defTerm . snd))
+                    >>>
+                    formatInline
+                  )
+               <+>
+               eelem "dd"
+               += ( (arr fst &&& arrL (defDesc . snd))
+                    >>>
+                    formatInline
+                  )
+             ) -< (baseURI, def)
+
+
 formatLeadingSpaced :: (ArrowXml a, ArrowChoice a) => a (URI, [InlineElement]) XmlTree
 formatLeadingSpaced 
     = eelem "pre"
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]
index 471246b7943d13e2dded57a89325cea1a7540d74..5ae8b0060caa7d818587f35051a34c70ef5ece7b 100644 (file)
@@ -33,6 +33,8 @@ Another paragraph...
 * bar
 ** baz
 
+aaaaa
+
 # foo
 ## bar
 ### baz
@@ -42,14 +44,20 @@ Another paragraph...
 *#* baz
 *# bar
 
+== Definition ==
+; AAA : aaaaaaaaaaaaaaaaa
+; BBBBBBBBB
+: bbb
+: ccccccccccc
+
 == Link ==
-[[Page]]
-[[page]]
-[[space in a page name]]
-[[Page|Link to "Page"]]
-[[Page#Heading]]
-[[#Heading]]
-[[Page#Heading|Link to "Page#Heading"]]
-[[#example]]
+[[Page]]
+[[page]]
+[[space in a page name]]
+[[Page|Link to "Page"]]
+[[Page#Heading]]
+[[#Heading]]
+[[Page#Heading|Link to "Page#Heading"]]
+[[#example]]
 </textData>
 </page>
index e618b988c4481d75e944df69e7b99090f36ad7cf..bde37fb5e4ea1e30cdae7eee01cbc361a4cbd4d8 100644 (file)
     margin-left: 20px;
 }
 
+.body dl {
+    margin: 1em 2em;
+}
+.body dt {
+    font-weight: bold;
+}
+.body dd {
+    margin-left: 3em;
+    margin-top: 0.1em;
+}
+.body dd + dt {
+    margin-top: 0.9em;
+}
+
 .side-bar .content {
     padding: 20px;
 }
index 7e18741b11761c01013f6fa0ba8687572889fd16..543401597cbc5b85ce733d7db72b9a2f94369188 100644 (file)
@@ -215,4 +215,28 @@ testData = [ (parseWiki ""
               (Right [ List (ListElement Bullet   [ [Right (Text "a")] ])
                      , List (ListElement Numbered [ [Right (Text "b")] ])
                      ]))
+
+           , (parseWiki "foo:bar"
+              ~?=
+              (Right [ Paragraph [ Text "foo"
+                                 , Text ":bar"
+                                 ]
+                     ]))
+
+           , (parseWiki "; foo: bar"
+              ~?=
+              (Right [ DefinitionList [Definition [Text "foo"] [Text "bar"]] ]))
+
+           , (parseWiki "; foo: bar\n"
+              ~?=
+              (Right [ DefinitionList [Definition [Text "foo"] [Text "bar"]] ]))
+
+           , (parseWiki "; foo\n: bar\n; bar\n: baz\n: baz"
+              ~?=
+              (Right [ DefinitionList [ Definition [Text "foo"] [ Text "bar" ]
+                                      , Definition [Text "bar"] [ Text "baz"
+                                                                , Text "\n"
+                                                                , Text "baz" ]
+                                      ]
+                     ]))
            ]