]> gitweb @ CieloNegro.org - Rakka.git/commitdiff
implemented listing
authorpho <pho@cielonegro.org>
Sat, 13 Oct 2007 01:06:14 +0000 (10:06 +0900)
committerpho <pho@cielonegro.org>
Sat, 13 Oct 2007 01:06:14 +0000 (10:06 +0900)
darcs-hash:20071013010614-62b54-5a3b750262d290557e05b3d3cac9cac5314b24d3.gz

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

index ac736efb0e838a844013d1f5c85366c73aaa3856..d159d5afb1545fc94e0b92f36916bd112ee1358d 100644 (file)
@@ -40,7 +40,9 @@ Other-Modules:
     Rakka.Wiki.Formatter
     Rakka.Wiki.Parser
 Data-Files:
-    defaultPages/Main_Page
+    defaultPages/Help/Syntax
+    defaultPages/MainPage
+    defaultPages/StyleSheet/Default
     schemas/rakka-page-1.0.rng
 
 
index 9e80df45271fda486f47f2ee1fdb2dccb8d611aa..3b1802f0e4cc42928fc4341e03f2eb36116eb1a1 100644 (file)
@@ -2,6 +2,10 @@ module Rakka.Wiki
     ( WikiPage
     , BlockElement(..)
     , InlineElement(..)
+
+    , ListElement(..)
+    , ListType(..)
+    , ListItem
     )
     where
 
@@ -16,6 +20,9 @@ data BlockElement
         headingLevel :: !Int
       , headingText  :: !String
       }
+    | HorizontalLine
+    | List !ListElement
+    | LeadingSpaced ![InlineElement]
     | Paragraph ![InlineElement]
     deriving (Eq, Show)
 
@@ -28,3 +35,20 @@ data InlineElement
       , linkText     :: !(Maybe String)
       }
     deriving (Eq, Show)
+
+
+data ListElement
+    = ListElement {
+        listType  :: !ListType
+      , listItems :: ![ListItem]
+      }
+    deriving (Eq, Show)
+
+
+data ListType
+    = Bullet
+    | Numbered
+    deriving (Eq, Show)
+
+
+type ListItem = [Either ListElement InlineElement]
index 8d219d2a8e39b19b3a77893ce60ca99cb01db8a7..1246ab1e61b16dc42b368e5f419aa85af70c2da3 100644 (file)
@@ -28,6 +28,15 @@ formatBlock
     -> case block of
          Heading level text
              -> formatHeading -< (level, text)
+
+         HorizontalLine
+             -> eelem "hr" -< ()
+
+         List list
+             -> formatListElement -< (baseURI, list)
+
+         LeadingSpaced inlines
+             -> formatLeadingSpaced -< (baseURI, inlines)
                 
          Paragraph inlines
              -> formatParagraph -< (baseURI, inlines)
@@ -39,6 +48,46 @@ formatHeading
     -> selem ("h" ++ show level) [txt text] -<< ()
 
 
+formatListElement :: (ArrowXml a, ArrowChoice a) => a (URI, ListElement) XmlTree
+formatListElement 
+    = proc (baseURI, list)
+    -> let tag = case listType list of
+                   Bullet   -> "ul"
+                   Numbered -> "ol"
+       in
+         ( eelem tag
+           += ( (constA baseURI &&& constL (listItems list))
+                >>>
+                formatListItem
+              )
+         ) -<< ()
+      where
+        formatListItem :: (ArrowXml a, ArrowChoice a) => a (URI, ListItem) XmlTree
+        formatListItem 
+            = proc (baseURI, item)
+            -> eelem "li"
+               += ( (arr fst &&& arrL snd)
+                    >>>
+                    formatListItem'
+                  ) -< (baseURI, item)
+
+        formatListItem' :: (ArrowXml a, ArrowChoice a) => a (URI, Either ListElement InlineElement) XmlTree
+        formatListItem' 
+            = proc (baseURI, x)
+            -> case x of
+                 Left  nestedList -> formatListElement -< (baseURI, nestedList)
+                 Right inline     -> formatInline      -< (baseURI, inline    )
+
+
+formatLeadingSpaced :: (ArrowXml a, ArrowChoice a) => a (URI, [InlineElement]) XmlTree
+formatLeadingSpaced 
+    = eelem "pre"
+      += ( (arr fst &&& arrL snd)
+           >>>
+           formatInline
+         )
+
+
 formatParagraph :: (ArrowXml a, ArrowChoice a) => a (URI, [InlineElement]) XmlTree
 formatParagraph 
     = eelem "p"
index 0125419c45d6d3fda915dfb8785462ec3572b00e..83e3301fd62c8da175fcc1d38d0ca257879cb54c 100644 (file)
@@ -3,6 +3,7 @@ module Rakka.Wiki.Parser
     )
     where
 
+import           Data.Maybe
 import           Rakka.Wiki
 import           Text.ParserCombinators.Parsec
 
@@ -24,6 +25,12 @@ blockElement = skipMany ( comment
                         )
                >>
                ( heading
+                 <|>
+                 horizontalLine
+                 <|>
+                 listElement
+                 <|>
+                 leadingSpaced
                  <|>
                  paragraph
                )
@@ -49,6 +56,89 @@ heading = foldr (<|>) pzero (map heading' [1..5])
                       return (Heading n (x:xs))
 
 
+horizontalLine :: Parser BlockElement
+horizontalLine = try $ do count 4 (char '-')
+                          many (char '-')
+                          ws
+                          eol
+                          return HorizontalLine
+
+
+listElement :: Parser BlockElement
+listElement = listElement' [] >>= return . List
+    where
+      listElement' :: [Char] -> Parser ListElement
+      listElement' stack
+          = try $ do t  <- oneOf "*#"
+                     ws
+                     xs <- items (stack ++ [t])
+                     return (ListElement (toType t) xs)
+
+      -- ListItem の終了條件は、
+      items :: [Char] -> Parser [ListItem]
+      items stack = do xs     <- many1 inlineElement
+                       nested <- option Nothing
+                                 $ try $ do newline
+                                            string stack
+                                            listElement' stack >>= return . Just
+                       rest <- items stack
+                       return $ (map Right xs ++ map Left (catMaybes [nested])) : rest
+                    <|>
+                    (try $ do newline
+                              string stack
+                              ws
+                              items stack
+                    )
+                    <|>
+                    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
+
+
+leadingSpaced :: Parser BlockElement
+leadingSpaced = char ' ' >> leadingSpaced' >>= return . LeadingSpaced
+    where
+      leadingSpaced' :: Parser [InlineElement]
+      leadingSpaced' = do x  <- inlineElement
+                          xs <- leadingSpaced'
+                          return (x:xs)
+                       <|>
+                       try ( newline
+                             >>
+                             char ' '
+                             >>
+                             leadingSpaced'
+                             >>=
+                             return . (Text "\n" :)
+                           )
+                       <|>
+                       return []
+
+
+blockTag :: Parser BlockElement
+blockTag = pzero -- not implemented
+
+
 paragraph :: Parser BlockElement
 paragraph = paragraph' >>= return . Paragraph
     where
@@ -63,12 +153,13 @@ paragraph = paragraph' >>= return . Paragraph
                             <|>
                             try ( do newline
                                      ((oneOf ('\n':blockSymbols) >> pzero) <|> return ())
+                                     ((blockTag                  >> pzero) <|> return ())
                                      ys <- (paragraph' <|> return [])
                                      return (Text "\n" : ys)
-                                  -- \n があり、その次に \n または
-                                  -- blockSymbols があれば、fail して
-                                  -- 最初の newline を讀んだ所まで卷き
-                                  -- 戻す。
+                                  -- \n があり、その次に \n、ブロックタ
+                                  -- グまたは blockSymbols があれば、
+                                  -- fail して 最初の newline を讀んだ
+                                  -- æ\89\80ã\81¾ã\81§å\8d·ã\81\8dæ\88»ã\81\99ã\80\82
                                 )
                             <|>
                             try paragraph'
@@ -128,7 +219,7 @@ comment = (try (string "<!--") >> skipTillEnd 1)
 
 
 blockSymbols :: [Char]
-blockSymbols = "="
+blockSymbols = " =-*#"
 
 
 inlineSymbols :: [Char]
index 136a295f92de5b225c9df0791a775ab1f334771a..88f758c9700d8e1a6735c24f312ce6171f0fe379 100644 (file)
@@ -29,7 +29,7 @@ but the text is reformatted.
    is a
            preformatted
       text.
-    [[Foo|Wiki markup is interpretted in here.]]
+    [[Foo|Wiki markup is interpreted here.]]
 
 == Horizontal Line ==
 ----
index 7128d09f310f59058338fb960888ee9074aac3dc..471246b7943d13e2dded57a89325cea1a7540d74 100644 (file)
@@ -3,7 +3,7 @@
       type="text/x-rakka"
       isBoring="yes">
   <textData>= Main Page =
-This is the main page. 
+This  is  the    main  page. 
 Hello, world!
 
 Another paragraph...
@@ -18,6 +18,30 @@ Another paragraph...
 
 ===== Heading 5 =====
 
+== Leading spaces ==
+ This
+   is a
+           preformatted
+      text.
+    [[Foo|Wiki markup is interpreted here.]]
+
+== Horizontal Line ==
+----
+
+== Listing ==
+* foo
+* bar
+** baz
+
+# foo
+## bar
+### baz
+
+* foo
+*# bar
+*#* baz
+*# bar
+
 == Link ==
 [[Page]]
 [[page]]
index e7ab1ad10dfb64f03877d9834284f32353f2703b..e618b988c4481d75e944df69e7b99090f36ad7cf 100644 (file)
@@ -8,8 +8,6 @@
 * {
     padding: 0;
     margin: 0;
-
-    list-style-type: none;
 }
 
 /* layout */
     padding: 25px 30px;
 }
 
+.body ul, .body ol {
+    list-style-position: inside;
+    margin: 1em 0;
+}
+.body ul ul, .body ul ol, .body ol ul, .body ol ol {
+    margin: 0;
+}
+
+.body li {
+    margin: 3px 5px;
+}
+.body li li {
+    margin-left: 20px;
+}
+
 .side-bar .content {
     padding: 20px;
 }
@@ -74,6 +87,7 @@
 }
 
 .side-bar ul, .side-bar ol {
+    list-style-type: none;
     margin-top: 0.4em;
 }
 
index 8585019f288e8b7fd866d2e55f422963dd2fcb7f..7e18741b11761c01013f6fa0ba8687572889fd16 100644 (file)
@@ -148,4 +148,71 @@ testData = [ (parseWiki ""
                                  , PageLink (Just "Bar") Nothing Nothing
                                  ]
                      ]))
+
+           , (parseWiki " foo"
+              ~?=
+              (Right [ LeadingSpaced [ Text "foo" ] ]))
+
+           , (parseWiki " foo\n  bar\n"
+              ~?=
+              (Right [ LeadingSpaced [ Text "foo"
+                                     , Text "\n"
+                                     , Text " bar"
+                                     ]
+                     ]))
+
+           , (parseWiki "foo\n bar\nbaz"
+              ~?=
+              (Right [ Paragraph     [ Text "foo" ]
+                     , LeadingSpaced [ Text "bar" ]
+                     , Paragraph     [ Text "baz" ]
+                     ]))
+
+           , (parseWiki "----"
+              ~?=
+              (Right [ HorizontalLine ]))
+
+           , (parseWiki "\nfoo\nbar\n----\n"
+              ~?=
+              (Right [ Paragraph [ Text "foo"
+                                 , Text "\n"
+                                 , Text "bar"
+                                 ]
+                     , HorizontalLine
+                     ]))
+
+           , (parseWiki "a----b"
+              ~?=
+              (Right [ Paragraph [ Text "a----b" ] ]))
+
+           , (parseWiki "* a"
+              ~?=
+              (Right [ List (ListElement Bullet [[Right (Text "a")]]) ]))
+
+           , (parseWiki "* a*"
+              ~?=
+              (Right [ List (ListElement Bullet [[Right (Text "a*")]]) ]))
+
+           , (parseWiki "* a\n* b\n"
+              ~?=
+              (Right [ List (ListElement Bullet [ [Right (Text "a")]
+                                                , [Right (Text "b")]
+                                                ])
+                     ]))
+
+           , (parseWiki "*a\n*#b\n*#c\n"
+              ~?=
+              (Right [ List (ListElement Bullet [ [ Right (Text "a")
+                                                  , Left (ListElement Numbered [ [Right (Text "b")]
+                                                                               , [Right (Text "c")]
+                                                                               ])
+                                                  ]
+                                                ])
+                     ]))
+
+           , (parseWiki "*a\n#b"
+              ~?=
+              (Right [ List (ListElement Bullet   [ [Right (Text "a")] ])
+                     , List (ListElement Numbered [ [Right (Text "b")] ])
+                     ]))
            ]