html-tokenizer 0.6 → 0.6.1
raw patch · 8 files changed
+146/−21 lines, 8 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- HTMLTokenizer.Data: instance GHC.Classes.Eq HTMLTokenizer.Data.Attribute
- HTMLTokenizer.Data: instance GHC.Classes.Eq HTMLTokenizer.Data.Name
- HTMLTokenizer.Data: instance GHC.Classes.Eq HTMLTokenizer.Data.Token
- HTMLTokenizer.Data: instance GHC.Show.Show HTMLTokenizer.Data.Attribute
- HTMLTokenizer.Data: instance GHC.Show.Show HTMLTokenizer.Data.Name
- HTMLTokenizer.Data: instance GHC.Show.Show HTMLTokenizer.Data.Token
+ HTMLTokenizer.Rendering.Text: attribute :: Attribute -> Text
+ HTMLTokenizer.Rendering.Text: name :: Name -> Text
+ HTMLTokenizer.Rendering.Text: token :: Token -> Text
+ HTMLTokenizer.Rendering.Text.Builder: attribute :: Attribute -> Builder
+ HTMLTokenizer.Rendering.Text.Builder: name :: Name -> Builder
+ HTMLTokenizer.Rendering.Text.Builder: token :: Token -> Builder
Files
- html-tokenizer.cabal +6/−1
- library/HTMLTokenizer/Data.hs +8/−20
- library/HTMLTokenizer/Data/Instances/Eq.hs +10/−0
- library/HTMLTokenizer/Data/Instances/Show.hs +16/−0
- library/HTMLTokenizer/Data/Types.hs +20/−0
- library/HTMLTokenizer/Prelude.hs +14/−0
- library/HTMLTokenizer/Rendering/Text.hs +17/−0
- library/HTMLTokenizer/Rendering/Text/Builder.hs +55/−0
html-tokenizer.cabal view
@@ -1,7 +1,7 @@ name: html-tokenizer version:- 0.6+ 0.6.1 synopsis: An "attoparsec"-based HTML tokenizer description:@@ -43,7 +43,12 @@ exposed-modules: HTMLTokenizer.Data HTMLTokenizer.Parsing+ HTMLTokenizer.Rendering.Text+ HTMLTokenizer.Rendering.Text.Builder other-modules:+ HTMLTokenizer.Data.Types+ HTMLTokenizer.Data.Instances.Show+ HTMLTokenizer.Data.Instances.Eq HTMLTokenizer.MonadPlus HTMLTokenizer.Prelude build-depends:
library/HTMLTokenizer/Data.hs view
@@ -1,23 +1,11 @@-{-# OPTIONS_GHC -funbox-strict-fields #-} module HTMLTokenizer.Data+(+ module HTMLTokenizer.Data.Types,+ module HTMLTokenizer.Data.Instances.Show,+ module HTMLTokenizer.Data.Instances.Eq,+) where -import HTMLTokenizer.Prelude---data Token =- OpeningTagToken !Name !(Vector Attribute) !Bool |- ClosingTagToken !Name |- TextToken !Text |- CommentToken !Text |- DoctypeToken !Text- deriving (Show, Eq)--data Name =- UnprefixedName !Text |- PrefixedName !Text !Text- deriving (Show, Eq)--data Attribute =- Attribute !Name !Text- deriving (Show, Eq)+import HTMLTokenizer.Data.Types+import HTMLTokenizer.Data.Instances.Show+import HTMLTokenizer.Data.Instances.Eq
+ library/HTMLTokenizer/Data/Instances/Eq.hs view
@@ -0,0 +1,10 @@+module HTMLTokenizer.Data.Instances.Eq+where++import HTMLTokenizer.Prelude+import HTMLTokenizer.Data.Types+++deriving instance Eq Token+deriving instance Eq Name+deriving instance Eq Attribute
+ library/HTMLTokenizer/Data/Instances/Show.hs view
@@ -0,0 +1,16 @@+module HTMLTokenizer.Data.Instances.Show+where++import HTMLTokenizer.Prelude+import HTMLTokenizer.Data.Types+import qualified HTMLTokenizer.Rendering.Text as A+++instance Show Token where+ show = textString . A.token++instance Show Name where+ show = textString . A.name++instance Show Attribute where+ show = textString . A.attribute
+ library/HTMLTokenizer/Data/Types.hs view
@@ -0,0 +1,20 @@+{-# OPTIONS_GHC -funbox-strict-fields #-}+module HTMLTokenizer.Data.Types+where++import HTMLTokenizer.Prelude+++data Token =+ OpeningTagToken !Name !(Vector Attribute) !Bool |+ ClosingTagToken !Name |+ TextToken !Text |+ CommentToken !Text |+ DoctypeToken !Text++data Name =+ UnprefixedName !Text |+ PrefixedName !Text !Text++data Attribute =+ Attribute !Name !Text
library/HTMLTokenizer/Prelude.hs view
@@ -1,6 +1,8 @@ module HTMLTokenizer.Prelude ( module Exports,+ textString,+ showText, ) where @@ -20,3 +22,15 @@ -- vector ------------------------- import Data.Vector as Exports (Vector)++--------------------------------------------------------------------------------++import qualified Data.Text as A++textString :: Text -> String+textString =+ A.unpack++showText :: Show a => a -> Text+showText =+ fromString . show
+ library/HTMLTokenizer/Rendering/Text.hs view
@@ -0,0 +1,17 @@+module HTMLTokenizer.Rendering.Text+where++import HTMLTokenizer.Prelude+import HTMLTokenizer.Data.Types+import qualified Text.Builder as A+import qualified HTMLTokenizer.Rendering.Text.Builder as B+++token :: Token -> Text+token = A.run . B.token++attribute :: Attribute -> Text+attribute = A.run . B.attribute++name :: Name -> Text+name = A.run . B.name
+ library/HTMLTokenizer/Rendering/Text/Builder.hs view
@@ -0,0 +1,55 @@+module HTMLTokenizer.Rendering.Text.Builder+(+ token,+ attribute,+ name,+)+where++import HTMLTokenizer.Prelude hiding (takeWhile)+import HTMLTokenizer.Data.Types+import Text.Builder+import qualified Data.Text as D+import qualified HTMLEntities.Text as B+++encodedText :: Text -> Builder+encodedText =+ text . B.text++name :: Name -> Builder+name =+ \ case+ UnprefixedName localName ->+ encodedText localName+ PrefixedName space localName ->+ encodedText space <> char ':' <> encodedText localName++attribute :: Attribute -> Builder+attribute (Attribute attributeName content) =+ if D.null content+ then name attributeName+ else name attributeName <> text "=\"" <> encodedText content <> char '"'++token :: Token -> Builder+token =+ \ case+ OpeningTagToken tagName attrVec closed ->+ char '<' <> name tagName <> attrs <> closing+ where+ attrs =+ foldMap (\ x -> char ' ' <> attribute x) attrVec+ closing =+ if closed+ then text "/>"+ else char '>'+ ClosingTagToken tagName ->+ text "</" <> name tagName <> char '>'+ TextToken theText ->+ encodedText theText+ CommentToken commentText ->+ text "<!--" <> encodedText commentText <> text "-->"+ DoctypeToken doctypeText ->+ text "<!doctype" <>+ (if D.null doctypeText then mempty else char ' ' <> encodedText doctypeText) <>+ char '>'