]> gitweb @ CieloNegro.org - Rakka.git/commitdiff
implemented more markup stuffs
authorpho <pho@cielonegro.org>
Sat, 13 Oct 2007 05:18:22 +0000 (14:18 +0900)
committerpho <pho@cielonegro.org>
Sat, 13 Oct 2007 05:18:22 +0000 (14:18 +0900)
darcs-hash:20071013051822-62b54-f1342a9067c1eb376d74591fd70ee2bb691c9097.gz

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

index 9f8bcdce7d9d47268d557521f7e15e05e0a97efa..b8be3a3fabf8bc5d3a56ef77cdd9207da6c81baf 100644 (file)
@@ -25,13 +25,15 @@ data BlockElement
     | HorizontalLine
     | List !ListElement
     | DefinitionList ![Definition]
-    | LeadingSpaced ![InlineElement]
+    | Preformatted ![InlineElement]
     | Paragraph ![InlineElement]
     deriving (Eq, Show)
 
 
 data InlineElement
     = Text !String
+    | Italic ![InlineElement]
+    | Bold ![InlineElement]
     | PageLink {
         linkPage     :: !(Maybe PageName)
       , linkFragment :: !(Maybe String)
index 1792299d3c0a09a990ea817fee7078d7aabcdce1..95dd9ffb021a8f55e40653c0b5208336202dd465 100644 (file)
@@ -38,8 +38,8 @@ formatBlock
          DefinitionList list
              -> formatDefinitionList -< (baseURI, list)
 
-         LeadingSpaced inlines
-             -> formatLeadingSpaced -< (baseURI, inlines)
+         Preformatted inlines
+             -> formatPreformatted -< (baseURI, inlines)
                 
          Paragraph inlines
              -> formatParagraph -< (baseURI, inlines)
@@ -109,8 +109,8 @@ formatDefinitionList
              ) -< (baseURI, def)
 
 
-formatLeadingSpaced :: (ArrowXml a, ArrowChoice a) => a (URI, [InlineElement]) XmlTree
-formatLeadingSpaced 
+formatPreformatted :: (ArrowXml a, ArrowChoice a) => a (URI, [InlineElement]) XmlTree
+formatPreformatted
     = eelem "pre"
       += ( (arr fst &&& arrL snd)
            >>>
@@ -134,6 +134,22 @@ formatInline
          Text text
              -> mkText -< text
 
+         Italic inlines
+             -> ( eelem "i"
+                  += ( (arr fst &&& arrL snd)
+                       >>>
+                       formatInline
+                     )
+                ) -< (baseURI, inlines)
+
+         Bold inlines
+             -> ( eelem "b"
+                  += ( (arr fst &&& arrL snd)
+                       >>>
+                       formatInline
+                     )
+                ) -< (baseURI, inlines)
+
          link@(PageLink _ _ _)
              -> formatPageLink -< (baseURI, link)
 
index 017df8952fb09bfce930ca4c2ecd950f50ed8b3d..db26a497b7eb66e15107b12b8fcd023f4eddfaa5 100644 (file)
@@ -32,6 +32,8 @@ blockElement = skipMany ( comment
                  <|>
                  definitionList
                  <|>
+                 pdata
+                 <|>
                  leadingSpaced
                  <|>
                  paragraph
@@ -59,11 +61,14 @@ heading = foldr (<|>) pzero (map heading' [1..5])
 
 
 horizontalLine :: Parser BlockElement
-horizontalLine = try $ do count 4 (char '-')
+horizontalLine = try ( do count 4 (char '-')
                           many (char '-')
                           ws
                           eol
                           return HorizontalLine
+                     )
+                 <?>
+                 "horizontal line"
 
 
 listElement :: Parser BlockElement
@@ -142,8 +147,25 @@ definitionList = many1 definition >>= return . DefinitionList
                     "description of term"
 
 
+pdata :: Parser BlockElement
+pdata = do try (string "<![PDATA[")
+           many (oneOf " \t\n")
+           x <- pdata'
+           return (Preformatted [Text x])
+    where
+      pdata' :: Parser String
+      pdata' = do try (many (oneOf " \t\n") >> string "]]>")
+                  return []
+               <|>
+               do x  <- anyChar
+                  xs <- pdata'
+                  return (x:xs)
+
+
 leadingSpaced :: Parser BlockElement
-leadingSpaced = char ' ' >> leadingSpaced' >>= return . LeadingSpaced
+leadingSpaced = (char ' ' >> leadingSpaced' >>= return . Preformatted)
+                <?>
+                "leading space"
     where
       leadingSpaced' :: Parser [InlineElement]
       leadingSpaced' = do x  <- inlineElement
@@ -200,29 +222,73 @@ paragraph = paragraph' >>= return . Paragraph
 inlineElement :: Parser InlineElement
 inlineElement = skipMany comment
                 >>
-                ( try text
+                ( cdata
+                  <|>
+                  apostrophes
                   <|>
-                  try pageLink
+                  text
+                  <|>
+                  pageLink
                 )
 
 
+cdata :: Parser InlineElement
+cdata = try (string "<![CDATA[") >> cdata' >>= return . Text
+    where
+      cdata' :: Parser String
+      cdata' = do try (string "]]>")
+                  return []
+               <|>
+               do x  <- anyChar
+                  xs <- cdata'
+                  return (x:xs)
+
+
 text :: Parser InlineElement
 text = ( char ':'
          >>
-         many (noneOf ('\n':':':inlineSymbols))
+         many (noneOf ('\n':inlineSymbols))
          >>=
          return . Text . (':' :)
-         -- 定義リストとの關係上、コロンは先頭にしか存在できない。
+         -- 定義リストとの關係上、コロンは先頭にしか來れない。
        )
        <|>
-       ( many1 (noneOf ('\n':':':inlineSymbols))
+       ( many1 (noneOf ('\n':inlineSymbols))
          >>=
          return . Text
        )
+       <?>
+       "text"
+
+
+apostrophes :: Parser InlineElement
+apostrophes = foldr (<|>) pzero (map try [apos1, apos2, apos3, apos4, apos5])
+    where
+      apos1 = apos 1 >> return (Text "'")
+
+      apos2 = do apos 2
+                 xs <- many1 inlineElement
+                 apos 2
+                 return (Italic xs)
+
+      apos3 = do apos 3
+                 xs <- many1 inlineElement
+                 apos 3
+                 return (Bold xs)
+
+      apos4 = apos 4 >> return (Text "'")
+
+      apos5 = do apos 5
+                 xs <- many1 inlineElement
+                 apos 5
+                 return (Italic [Bold xs])
+
+      apos :: Int -> Parser ()
+      apos n = count n (char '\'') >> notFollowedBy (char '\'')
 
 
 pageLink :: Parser InlineElement
-pageLink = do string "[["
+pageLink = do try (string "[[")
               page     <- option Nothing 
                           (many1 (noneOf "#|]") >>= return . Just)
               fragment <- option Nothing
@@ -261,7 +327,7 @@ blockSymbols = " =-*#;"
 
 
 inlineSymbols :: [Char]
-inlineSymbols = "<["
+inlineSymbols = "<[:'"
 
 -- white space
 ws :: Parser ()
index 88f758c9700d8e1a6735c24f312ce6171f0fe379..c742612cc09fc49d18a756afe941beaf5679a3fd 100644 (file)
 
 ===== Heading 5 =====
 
-== &amp;lt;nowiki&amp;gt; tags ==
-&lt;nowiki&gt;
+== Italic and bold ==
+You can ''italicize text'' by putting 2 
+apostrophes on each side. 
+
+3 apostrophes will bold '''the text'''. 
+
+5 apostrophes will bold and italicize 
+'''''the text'''''.
+
+(Using 4 apostrophes doesn't do anything
+special -- there are just '''' left
+over ones'''' that are included as part of the text.)
+
+
+== CDATA section ==
+&lt;![CDATA[
 [[Wiki]] markup is ignored here
 but the text is reformatted.
-&lt;/nowiki&gt;
+]]&gt;
 
-== &amp;lt;pre&amp;gt; tags ==
-&lt;pre&gt;
+== PDATA section ==
+&lt;![PDATA[
 [[Wiki]] markup is ignored here
  and   reformatting is    also  disabled.
-&lt;/pre&gt;
+]]&gt;
 
 == Leading spaces ==
  This
@@ -34,6 +48,13 @@ but the text is reformatted.
 == Horizontal Line ==
 ----
 
+== Inline Object ==
+&lt;object data="Foo" float="right" framed="yes"&gt;
+  This is a caption containing [[Foo|markups]].
+&lt;/object&gt;
+
+blah blah blah...
+
 == Quotation ==
 &lt;blockquote&gt;
 blah blah blah...
index 5ae8b0060caa7d818587f35051a34c70ef5ece7b..69c5ecea383e8172233dc38540b2062856813ec8 100644 (file)
@@ -8,15 +8,30 @@ Hello, world!
 
 Another paragraph...
 
-= Syntax Help =
+== Italic and bold ==
+You can ''italicize text'' by putting 2 
+apostrophes on each side. 
 
-== Heading ==
+3 apostrophes will bold '''the text'''. 
 
-=== Heading 3 ===
+5 apostrophes will bold and italicize 
+'''''the text'''''.
 
-==== Heading 4 ====
+(Using 4 apostrophes doesn't do anything
+special -- there are just '''' left
+over ones'''' that are included as part of the text.)
 
-===== Heading 5 =====
+== CDATA section ==
+&lt;![CDATA[
+[[Wiki]] markup is ignored here
+but the text is reformatted.
+]]&gt;
+
+== PDATA section ==
+&lt;![PDATA[
+[[Wiki]] markup is ignored here
+ and   reformatting is    also  disabled.
+]]&gt;
 
 == Leading spaces ==
  This
@@ -24,40 +39,5 @@ Another paragraph...
            preformatted
       text.
     [[Foo|Wiki markup is interpreted here.]]
-
-== Horizontal Line ==
-----
-
-== Listing ==
-* foo
-* bar
-** baz
-
-aaaaa
-
-# foo
-## bar
-### baz
-
-* foo
-*# bar
-*#* 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]]
 </textData>
 </page>
index 543401597cbc5b85ce733d7db72b9a2f94369188..384cc5fde51f549d9310000a98ba9ef1469bb35a 100644 (file)
@@ -151,21 +151,21 @@ testData = [ (parseWiki ""
 
            , (parseWiki " foo"
               ~?=
-              (Right [ LeadingSpaced [ Text "foo" ] ]))
+              (Right [ Preformatted [ Text "foo" ] ]))
 
            , (parseWiki " foo\n  bar\n"
               ~?=
-              (Right [ LeadingSpaced [ Text "foo"
-                                     , Text "\n"
-                                     , Text " bar"
-                                     ]
+              (Right [ Preformatted [ Text "foo"
+                                    , Text "\n"
+                                    , Text " bar"
+                                    ]
                      ]))
 
            , (parseWiki "foo\n bar\nbaz"
               ~?=
-              (Right [ Paragraph     [ Text "foo" ]
-                     , LeadingSpaced [ Text "bar" ]
-                     , Paragraph     [ Text "baz" ]
+              (Right [ Paragraph    [ Text "foo" ]
+                     , Preformatted [ Text "bar" ]
+                     , Paragraph    [ Text "baz" ]
                      ]))
 
            , (parseWiki "----"
@@ -239,4 +239,42 @@ testData = [ (parseWiki ""
                                                                 , Text "baz" ]
                                       ]
                      ]))
+
+           , (parseWiki "<![CDATA[foo [[bar]] baz]]>"
+              ~?=
+              (Right [ Paragraph [ Text "foo [[bar]] baz" ] ]))
+
+           , (parseWiki "<![PDATA[foo [[bar]] baz]]>"
+              ~?=
+              (Right [ Preformatted [ Text "foo [[bar]] baz" ] ]))
+
+           , (parseWiki "<![PDATA[\nfoo [[bar]] baz\n]]>"
+              ~?=
+              (Right [ Preformatted [ Text "foo [[bar]] baz" ] ]))
+
+           , (parseWiki "foo' bar"
+              ~?=
+              (Right [ Paragraph [ Text "foo"
+                                 , Text "'"
+                                 , Text " bar" ]
+                     ]))
+
+           , (parseWiki "''foo''"
+              ~?=
+              (Right [ Paragraph [ Italic [Text "foo"] ] ]))
+
+           , (parseWiki "'''foo'''"
+              ~?=
+              (Right [ Paragraph [ Bold [Text "foo"] ] ]))
+
+           , (parseWiki "foo''''"
+              ~?=
+              (Right [ Paragraph [ Text "foo"
+                                 , Text "'"
+                                 ]
+                     ]))
+
+           , (parseWiki "'''''foo'''''"
+              ~?=
+              (Right [ Paragraph [ Italic [Bold [Text "foo"]] ] ]))
            ]