+{-# LANGUAGE
+ UnicodeSyntax
+ #-}
module Rakka.Wiki
( WikiPage
+
+ , Element(..)
+ , Attribute
+
, BlockElement(..)
, InlineElement(..)
- , ListElement(..)
+ , Definition(..)
+
, ListType(..)
, ListItem
+
+ , CommandType(..)
+ , BlockCommand(..)
+ , InlineCommand(..)
)
where
-
-import Rakka.Page
-
+import Data.CaseInsensitive (CI)
+import Data.Text (Text)
+import Network.URI
+import Rakka.Page
type WikiPage = [BlockElement]
+data Element
+ = Block !BlockElement
+ | Inline !InlineElement
+ deriving (Eq, Show)
+
+type Attribute = (CI Text, Text)
data BlockElement
= Heading {
- headingLevel :: !Int
- , headingText :: !String
+ headingLevel ∷ !Int
+ , headingText ∷ !Text
}
| HorizontalLine
- | List !ListElement
- | LeadingSpaced ![InlineElement]
- | Paragraph ![InlineElement]
+ | List {
+ listType ∷ !ListType
+ , listItems ∷ ![ListItem]
+ }
+ | DefinitionList ![Definition]
+ | Preformatted ![InlineElement]
+ | Paragraph ![InlineElement]
+ | Div ![Attribute] ![Element]
+ | EmptyBlock
+ | BlockCmd !BlockCommand
deriving (Eq, Show)
-
data InlineElement
- = Text !String
+ = Text !Text
+ | Italic ![InlineElement]
+ | Bold ![InlineElement]
+ | ObjectLink {
+ objLinkPage ∷ !PageName
+ , objLinkText ∷ !(Maybe Text)
+ }
| PageLink {
- linkPage :: !(Maybe PageName)
- , linkFragment :: !(Maybe String)
- , linkText :: !(Maybe String)
+ linkPage ∷ !(Maybe PageName)
+ , linkFragment ∷ !(Maybe Text)
+ , linkText ∷ !(Maybe Text)
}
- deriving (Eq, Show)
-
-
-data ListElement
- = ListElement {
- listType :: !ListType
- , listItems :: ![ListItem]
+ | ExternalLink {
+ extLinkURI ∷ !URI
+ , extLinkText ∷ !(Maybe Text)
+ }
+ | LineBreak ![Attribute]
+ | Span ![Attribute] ![InlineElement]
+ | Image {
+ imgSource ∷ !(Either URI PageName)
+ , imgAlt ∷ !(Maybe Text)
}
+ | Anchor ![Attribute] ![InlineElement]
+ | Input ![Attribute]
+ | EmptyInline
+ | InlineCmd !InlineCommand
deriving (Eq, Show)
-
data ListType
= Bullet
| Numbered
deriving (Eq, Show)
+type ListItem = [Element]
-type ListItem = [Either ListElement InlineElement]
+data Definition
+ = Definition {
+ defTerm ∷ ![InlineElement]
+ , defDesc ∷ ![InlineElement]
+ }
+ deriving (Eq, Show)
+
+data CommandType
+ = InlineCommandType
+ | BlockCommandType
+ deriving (Eq, Show)
+
+data BlockCommand
+ = BlockCommand {
+ bCmdName ∷ !Text
+ , bCmdAttributes ∷ ![Attribute]
+ , bCmdContents ∷ ![BlockElement]
+ }
+ deriving (Eq, Show)
+
+data InlineCommand
+ = InlineCommand {
+ iCmdName :: !Text
+ , iCmdAttributes :: ![Attribute]
+ , iCmdContents :: ![InlineElement]
+ }
+ deriving (Eq, Show)