Hello community, here is the log from the commit of package ghc-pandoc-types for openSUSE:Factory checked in at 2017-03-03 17:51:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-pandoc-types (Old) and /work/SRC/openSUSE:Factory/.ghc-pandoc-types.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-pandoc-types" Fri Mar 3 17:51:29 2017 rev:12 rq:461669 version:1.17.0.5 Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-pandoc-types/ghc-pandoc-types.changes 2016-09-05 21:20:37.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.ghc-pandoc-types.new/ghc-pandoc-types.changes 2017-03-03 17:51:30.258058199 +0100 @@ -1,0 +2,5 @@ +Sun Feb 12 14:17:22 UTC 2017 - [email protected] + +- Update to version 1.17.0.5 with cabal2obs. + +------------------------------------------------------------------- Old: ---- pandoc-types-1.16.1.1.tar.gz New: ---- pandoc-types-1.17.0.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-pandoc-types.spec ++++++ --- /var/tmp/diff_new_pack.vLkiBD/_old 2017-03-03 17:51:30.961958782 +0100 +++ /var/tmp/diff_new_pack.vLkiBD/_new 2017-03-03 17:51:30.965958217 +0100 @@ -1,7 +1,7 @@ # # spec file for package ghc-pandoc-types # -# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,8 +17,9 @@ %global pkg_name pandoc-types +%bcond_with tests Name: ghc-%{pkg_name} -Version: 1.16.1.1 +Version: 1.17.0.5 Release: 0 Summary: Types for representing a structured document License: GPL-2.0 @@ -26,6 +27,7 @@ Url: https://hackage.haskell.org/package/%{pkg_name} Source0: https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz BuildRequires: ghc-Cabal-devel +BuildRequires: ghc-QuickCheck-devel BuildRequires: ghc-aeson-devel BuildRequires: ghc-bytestring-devel BuildRequires: ghc-containers-devel @@ -33,6 +35,13 @@ BuildRequires: ghc-rpm-macros BuildRequires: ghc-syb-devel BuildRoot: %{_tmppath}/%{name}-%{version}-build +%if %{with tests} +BuildRequires: ghc-HUnit-devel +BuildRequires: ghc-string-qq-devel +BuildRequires: ghc-test-framework-devel +BuildRequires: ghc-test-framework-hunit-devel +BuildRequires: ghc-test-framework-quickcheck2-devel +%endif %description 'Text.Pandoc.Definition' defines the 'Pandoc' data structure, which is used by @@ -73,6 +82,9 @@ %install %ghc_lib_install +%check +%cabal_test + %post devel %ghc_pkg_recache ++++++ pandoc-types-1.16.1.1.tar.gz -> pandoc-types-1.17.0.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-types-1.16.1.1/Text/Pandoc/Arbitrary.hs new/pandoc-types-1.17.0.5/Text/Pandoc/Arbitrary.hs --- old/pandoc-types-1.16.1.1/Text/Pandoc/Arbitrary.hs 1970-01-01 01:00:00.000000000 +0100 +++ new/pandoc-types-1.17.0.5/Text/Pandoc/Arbitrary.hs 2016-10-13 20:56:56.000000000 +0200 @@ -0,0 +1,195 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} +{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, ScopedTypeVariables #-} +-- provides Arbitrary instance for Pandoc types +module Text.Pandoc.Arbitrary () +where +import Test.QuickCheck +import Control.Monad (forM, liftM, liftM2) +import Text.Pandoc.Definition +import Text.Pandoc.Builder + +realString :: Gen String +realString = resize 8 $ listOf $ frequency [ (9, elements [' '..'\127']) + , (1, elements ['\128'..'\9999']) ] + +arbAttr :: Gen Attr +arbAttr = do + id' <- elements ["","loc"] + classes <- elements [[],["haskell"],["c","numberLines"]] + keyvals <- elements [[],[("start","22")],[("a","11"),("b_2","a b c")]] + return (id',classes,keyvals) + +instance Arbitrary Inlines where + arbitrary = liftM (fromList :: [Inline] -> Inlines) arbitrary + +instance Arbitrary Blocks where + arbitrary = liftM (fromList :: [Block] -> Blocks) arbitrary + +instance Arbitrary Inline where + arbitrary = resize 3 $ arbInline 2 + +arbInlines :: Int -> Gen [Inline] +arbInlines n = listOf1 (arbInline n) `suchThat` (not . startsWithSpace) + where startsWithSpace (Space:_) = True + startsWithSpace _ = False + +-- restrict to 3 levels of nesting max; otherwise we get +-- bogged down in indefinitely large structures +arbInline :: Int -> Gen Inline +arbInline n = frequency $ [ (60, liftM Str realString) + , (60, return Space) + , (10, liftM2 Code arbAttr realString) + , (5, elements [ RawInline (Format "html") "<a id=\"eek\">" + , RawInline (Format "latex") "\\my{command}" ]) + ] ++ [ x | x <- nesters, n > 1] + where nesters = [ (10, liftM Emph $ arbInlines (n-1)) + , (10, liftM Strong $ arbInlines (n-1)) + , (10, liftM Strikeout $ arbInlines (n-1)) + , (10, liftM Superscript $ arbInlines (n-1)) + , (10, liftM Subscript $ arbInlines (n-1)) + , (10, liftM SmallCaps $ arbInlines (n-1)) + , (10, do x1 <- arbitrary + x2 <- arbInlines (n-1) + return $ Quoted x1 x2) + , (10, do x1 <- arbitrary + x2 <- realString + return $ Math x1 x2) + , (10, do x0 <- arbAttr + x1 <- arbInlines (n-1) + x3 <- realString + x2 <- realString + return $ Link x0 x1 (x2,x3)) + , (10, do x0 <- arbAttr + x1 <- arbInlines (n-1) + x3 <- realString + x2 <- realString + return $ Image x0 x1 (x2,x3)) + , (2, liftM2 Cite arbitrary (arbInlines 1)) + , (2, liftM Note $ resize 3 $ listOf1 $ arbBlock (n-1)) + ] + +instance Arbitrary Block where + arbitrary = resize 3 $ arbBlock 2 + +arbBlock :: Int -> Gen Block +arbBlock n = frequency $ [ (10, liftM Plain $ arbInlines (n-1)) + , (15, liftM Para $ arbInlines (n-1)) + , (5, liftM2 CodeBlock arbAttr realString) + , (3, liftM LineBlock $ + liftM2 (:) + (arbInlines $ (n - 1) `mod` 3) + (forM [1..((n - 1) `div` 3)] + (const $ arbInlines 3))) + , (2, elements [ RawBlock (Format "html") + "<div>\n*&*\n</div>" + , RawBlock (Format "latex") + "\\begin[opt]{env}\nhi\n{\\end{env}" + ]) + , (5, do x1 <- choose (1 :: Int, 6) + x2 <- arbInlines (n-1) + return (Header x1 nullAttr x2)) + , (2, return HorizontalRule) + ] ++ [x | x <- nesters, n > 0] + where nesters = [ (5, liftM BlockQuote $ listOf1 $ arbBlock (n-1)) + , (5, do x2 <- arbitrary + x3 <- arbitrary + x1 <- arbitrary `suchThat` (> 0) + x4 <- listOf1 $ listOf1 $ arbBlock (n-1) + return $ OrderedList (x1,x2,x3) x4 ) + , (5, liftM BulletList $ (listOf1 $ listOf1 $ arbBlock (n-1))) + , (5, do items <- listOf1 $ do + x1 <- listOf1 $ listOf1 $ arbBlock (n-1) + x2 <- arbInlines (n-1) + return (x2,x1) + return $ DefinitionList items) + , (2, do rs <- choose (1 :: Int, 4) + cs <- choose (1 :: Int, 4) + x1 <- arbInlines (n-1) + x2 <- vector cs + x3 <- vectorOf cs $ elements [0, 0.25] + x4 <- vectorOf cs $ listOf $ arbBlock (n-1) + x5 <- vectorOf rs $ vectorOf cs + $ listOf $ arbBlock (n-1) + return (Table x1 x2 x3 x4 x5)) + ] + +instance Arbitrary Pandoc where + arbitrary = resize 8 $ liftM2 Pandoc arbitrary arbitrary + +instance Arbitrary CitationMode where + arbitrary + = do x <- choose (0 :: Int, 2) + case x of + 0 -> return AuthorInText + 1 -> return SuppressAuthor + 2 -> return NormalCitation + _ -> error "FATAL ERROR: Arbitrary instance, logic bug" + +instance Arbitrary Citation where + arbitrary + = do x1 <- listOf $ elements $ ['a'..'z'] ++ ['0'..'9'] ++ ['_'] + x2 <- arbInlines 1 + x3 <- arbInlines 1 + x4 <- arbitrary + x5 <- arbitrary + x6 <- arbitrary + return (Citation x1 x2 x3 x4 x5 x6) + +instance Arbitrary MathType where + arbitrary + = do x <- choose (0 :: Int, 1) + case x of + 0 -> return DisplayMath + 1 -> return InlineMath + _ -> error "FATAL ERROR: Arbitrary instance, logic bug" + +instance Arbitrary QuoteType where + arbitrary + = do x <- choose (0 :: Int, 1) + case x of + 0 -> return SingleQuote + 1 -> return DoubleQuote + _ -> error "FATAL ERROR: Arbitrary instance, logic bug" + +instance Arbitrary Meta where + arbitrary + = do (x1 :: Inlines) <- arbitrary + (x2 :: [Inlines]) <- liftM (filter (not . isNull)) arbitrary + (x3 :: Inlines) <- arbitrary + return $ setMeta "title" x1 + $ setMeta "author" x2 + $ setMeta "date" x3 + $ nullMeta + +instance Arbitrary Alignment where + arbitrary + = do x <- choose (0 :: Int, 3) + case x of + 0 -> return AlignLeft + 1 -> return AlignRight + 2 -> return AlignCenter + 3 -> return AlignDefault + _ -> error "FATAL ERROR: Arbitrary instance, logic bug" + +instance Arbitrary ListNumberStyle where + arbitrary + = do x <- choose (0 :: Int, 6) + case x of + 0 -> return DefaultStyle + 1 -> return Example + 2 -> return Decimal + 3 -> return LowerRoman + 4 -> return UpperRoman + 5 -> return LowerAlpha + 6 -> return UpperAlpha + _ -> error "FATAL ERROR: Arbitrary instance, logic bug" + +instance Arbitrary ListNumberDelim where + arbitrary + = do x <- choose (0 :: Int, 3) + case x of + 0 -> return DefaultDelim + 1 -> return Period + 2 -> return OneParen + 3 -> return TwoParens + _ -> error "FATAL ERROR: Arbitrary instance, logic bug" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-types-1.16.1.1/Text/Pandoc/Builder.hs new/pandoc-types-1.17.0.5/Text/Pandoc/Builder.hs --- old/pandoc-types-1.16.1.1/Text/Pandoc/Builder.hs 2016-08-20 22:37:38.000000000 +0200 +++ new/pandoc-types-1.17.0.5/Text/Pandoc/Builder.hs 2016-10-17 20:27:07.000000000 +0200 @@ -147,6 +147,7 @@ -- * Block list builders , para , plain + , lineBlock , codeBlockWith , codeBlock , rawBlock @@ -166,16 +167,14 @@ import Text.Pandoc.Definition import Data.String import Data.Monoid -import Data.Maybe (fromMaybe) import qualified Data.Map as M import Data.Sequence (Seq, (|>), viewr, viewl, ViewR(..), ViewL(..)) import qualified Data.Sequence as Seq +import Data.Traversable (Traversable) import Data.Foldable (Foldable) import qualified Data.Foldable as F -import Data.List (groupBy, intersperse) +import Data.List (groupBy) import Data.Data -import Data.Typeable -import Data.Traversable import Control.Arrow ((***)) import GHC.Generics (Generic) @@ -430,6 +429,9 @@ then mempty else singleton . Plain . toList $ ils +lineBlock :: [Inlines] -> Blocks +lineBlock = singleton . LineBlock . map toList + -- | A code block with attributes. codeBlockWith :: Attr -> String -> Blocks codeBlockWith attrs = singleton . CodeBlock attrs diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-types-1.16.1.1/Text/Pandoc/Definition.hs new/pandoc-types-1.17.0.5/Text/Pandoc/Definition.hs --- old/pandoc-types-1.16.1.1/Text/Pandoc/Definition.hs 2016-08-20 22:37:38.000000000 +0200 +++ new/pandoc-types-1.17.0.5/Text/Pandoc/Definition.hs 2016-12-21 02:48:37.000000000 +0100 @@ -1,4 +1,5 @@ -{-# LANGUAGE DeriveDataTypeable, DeriveGeneric, FlexibleContexts, CPP #-} +{-# LANGUAGE OverloadedStrings, DeriveDataTypeable, DeriveGeneric, +FlexibleContexts, GeneralizedNewtypeDeriving, PatternGuards, CPP #-} {- Copyright (c) 2006-2016, John MacFarlane @@ -74,21 +75,21 @@ import Data.Generics (Data, Typeable) import Data.Ord (comparing) -import Data.Aeson (FromJSON(..), ToJSON(..)) +import Data.Aeson hiding (Null) import qualified Data.Aeson.Types as Aeson -import Control.Monad (guard) import qualified Data.Map as M -import GHC.Generics (Generic, Rep (..)) +import GHC.Generics (Generic) import Data.String import Data.Char (toLower) -import Data.Monoid #if MIN_VERSION_base(4,8,0) import Control.DeepSeq #else +import Data.Monoid +import Control.Applicative ((<$>), (<*>)) import Control.DeepSeq.Generics #endif import Paths_pandoc_types (version) -import Data.Version (Version) +import Data.Version (Version, versionBranch) data Pandoc = Pandoc Meta [Block] deriving (Eq, Ord, Read, Show, Typeable, Data, Generic) @@ -196,7 +197,7 @@ -- | Formats for raw blocks newtype Format = Format String - deriving (Read, Show, Typeable, Data, Generic) + deriving (Read, Show, Typeable, Data, Generic, ToJSON, FromJSON) instance IsString Format where fromString f = Format $ map toLower f @@ -211,6 +212,7 @@ data Block = Plain [Inline] -- ^ Plain text, not a paragraph | Para [Inline] -- ^ Paragraph + | LineBlock [[Inline]] -- ^ Multiple non-breaking lines | CodeBlock Attr String -- ^ Code block (literal) with attributes | RawBlock Format String -- ^ Raw block | BlockQuote [Block] -- ^ Block quote (list of blocks) @@ -280,99 +282,296 @@ data CitationMode = AuthorInText | SuppressAuthor | NormalCitation deriving (Show, Eq, Ord, Read, Typeable, Data, Generic) --- derive generic instances of FromJSON, ToJSON: -jsonOpts :: Aeson.Options -jsonOpts = Aeson.defaultOptions{ - Aeson.fieldLabelModifier = id - , Aeson.constructorTagModifier = id - , Aeson.allNullaryToStringTag = False - , Aeson.omitNothingFields = False - , Aeson.sumEncoding = Aeson.TaggedObject "t" "c" - } - -#if MIN_VERSION_aeson(1,0,0) -toJSON' :: (Generic a, Aeson.GToJSON Aeson.Zero (Rep a)) - => a -> Aeson.Value -#else -toJSON' :: (Generic a, Aeson.GToJSON (Rep a)) - => a -> Aeson.Value -#endif -toJSON' = Aeson.genericToJSON jsonOpts +-- ToJSON/FromJSON instances. We do this by hand instead of deriving +-- from generics, so we can have more control over the format. -#if MIN_VERSION_aeson(1,0,0) -parseJSON' :: (Generic a, Aeson.GFromJSON Aeson.Zero (Rep a)) - => Aeson.Value -> Aeson.Parser a -#else -parseJSON' :: (Generic a, Aeson.GFromJSON (Rep a)) - => Aeson.Value -> Aeson.Parser a -#endif -parseJSON' = Aeson.genericParseJSON jsonOpts +taggedNoContent :: [Char] -> Value +taggedNoContent x = object [ "t" .= x ] + +tagged :: ToJSON a => [Char] -> a -> Value +tagged x y = object [ "t" .= x, "c" .= y ] -instance FromJSON MetaValue - where parseJSON = parseJSON' -instance ToJSON MetaValue - where toJSON = toJSON' - -instance FromJSON Meta - where parseJSON = parseJSON' -instance ToJSON Meta - where toJSON = toJSON' - -instance FromJSON CitationMode - where parseJSON = parseJSON' -instance ToJSON CitationMode - where toJSON = toJSON' - -instance FromJSON Citation - where parseJSON = parseJSON' -instance ToJSON Citation - where toJSON = toJSON' - -instance FromJSON QuoteType - where parseJSON = parseJSON' -instance ToJSON QuoteType - where toJSON = toJSON' - -instance FromJSON MathType - where parseJSON = parseJSON' -instance ToJSON MathType - where toJSON = toJSON' - -instance FromJSON ListNumberStyle - where parseJSON = parseJSON' -instance ToJSON ListNumberStyle - where toJSON = toJSON' - -instance FromJSON ListNumberDelim - where parseJSON = parseJSON' -instance ToJSON ListNumberDelim - where toJSON = toJSON' - -instance FromJSON Alignment - where parseJSON = parseJSON' -instance ToJSON Alignment - where toJSON = toJSON' - -instance FromJSON Format - where parseJSON = parseJSON' -instance ToJSON Format - where toJSON = toJSON' - -instance FromJSON Inline - where parseJSON = parseJSON' -instance ToJSON Inline - where toJSON = toJSON' - -instance FromJSON Block - where parseJSON = parseJSON' -instance ToJSON Block - where toJSON = toJSON' - -instance FromJSON Pandoc - where parseJSON = parseJSON' -instance ToJSON Pandoc - where toJSON = toJSON' +instance FromJSON MetaValue where + parseJSON (Object v) = do + t <- v .: "t" :: Aeson.Parser Value + case t of + "MetaMap" -> MetaMap <$> (v .: "c") + "MetaList" -> MetaList <$> (v .: "c") + "MetaBool" -> MetaBool <$> (v .: "c") + "MetaString" -> MetaString <$> (v .: "c") + "MetaInlines" -> MetaInlines <$> (v .: "c") + "MetaBlocks" -> MetaBlocks <$> (v .: "c") + _ -> mempty + parseJSON _ = mempty +instance ToJSON MetaValue where + toJSON (MetaMap mp) = tagged "MetaMap" mp + toJSON (MetaList lst) = tagged "MetaList" lst + toJSON (MetaBool bool) = tagged "MetaBool" bool + toJSON (MetaString s) = tagged "MetaString" s + toJSON (MetaInlines ils) = tagged "MetaInlines" ils + toJSON (MetaBlocks blks) = tagged "MetaBlocks" blks + +instance FromJSON Meta where + parseJSON j = Meta <$> parseJSON j +instance ToJSON Meta where + toJSON meta = toJSON $ unMeta meta + +instance FromJSON CitationMode where + parseJSON (Object v) = do + t <- v .: "t" :: Aeson.Parser Value + case t of + "AuthorInText" -> return AuthorInText + "SuppressAuthor" -> return SuppressAuthor + "NormalCitation" -> return NormalCitation + _ -> mempty + parseJSON _ = mempty +instance ToJSON CitationMode where + toJSON cmode = taggedNoContent s + where s = case cmode of + AuthorInText -> "AuthorInText" + SuppressAuthor -> "SuppressAuthor" + NormalCitation -> "NormalCitation" + + +instance FromJSON Citation where + parseJSON (Object v) = do + citationId' <- v .: "citationId" + citationPrefix' <- v .: "citationPrefix" + citationSuffix' <- v .: "citationSuffix" + citationMode' <- v .: "citationMode" + citationNoteNum' <- v .: "citationNoteNum" + citationHash' <- v .: "citationHash" + return Citation { citationId = citationId' + , citationPrefix = citationPrefix' + , citationSuffix = citationSuffix' + , citationMode = citationMode' + , citationNoteNum = citationNoteNum' + , citationHash = citationHash' + } + parseJSON _ = mempty +instance ToJSON Citation where + toJSON cit = + object [ "citationId" .= citationId cit + , "citationPrefix" .= citationPrefix cit + , "citationSuffix" .= citationSuffix cit + , "citationMode" .= citationMode cit + , "citationNoteNum" .= citationNoteNum cit + , "citationHash" .= citationHash cit + ] + +instance FromJSON QuoteType where + parseJSON (Object v) = do + t <- v .: "t" :: Aeson.Parser Value + case t of + "SingleQuote" -> return SingleQuote + "DoubleQuote" -> return DoubleQuote + _ -> mempty + parseJSON _ = mempty +instance ToJSON QuoteType where + toJSON qtype = taggedNoContent s + where s = case qtype of + SingleQuote -> "SingleQuote" + DoubleQuote -> "DoubleQuote" + + +instance FromJSON MathType where + parseJSON (Object v) = do + t <- v .: "t" :: Aeson.Parser Value + case t of + "DisplayMath" -> return DisplayMath + "InlineMath" -> return InlineMath + _ -> mempty + parseJSON _ = mempty +instance ToJSON MathType where + toJSON mtype = taggedNoContent s + where s = case mtype of + DisplayMath -> "DisplayMath" + InlineMath -> "InlineMath" + +instance FromJSON ListNumberStyle where + parseJSON (Object v) = do + t <- v .: "t" :: Aeson.Parser Value + case t of + "DefaultStyle" -> return DefaultStyle + "Example" -> return Example + "Decimal" -> return Decimal + "LowerRoman" -> return LowerRoman + "UpperRoman" -> return UpperRoman + "LowerAlpha" -> return LowerAlpha + "UpperAlpha" -> return UpperAlpha + _ -> mempty + parseJSON _ = mempty +instance ToJSON ListNumberStyle where + toJSON lsty = taggedNoContent s + where s = case lsty of + DefaultStyle -> "DefaultStyle" + Example -> "Example" + Decimal -> "Decimal" + LowerRoman -> "LowerRoman" + UpperRoman -> "UpperRoman" + LowerAlpha -> "LowerAlpha" + UpperAlpha -> "UpperAlpha" + +instance FromJSON ListNumberDelim where + parseJSON (Object v) = do + t <- v .: "t" :: Aeson.Parser Value + case t of + "DefaultDelim" -> return DefaultDelim + "Period" -> return Period + "OneParen" -> return OneParen + "TwoParens" -> return TwoParens + _ -> mempty + parseJSON _ = mempty +instance ToJSON ListNumberDelim where + toJSON delim = taggedNoContent s + where s = case delim of + DefaultDelim -> "DefaultDelim" + Period -> "Period" + OneParen -> "OneParen" + TwoParens -> "TwoParens" + +instance FromJSON Alignment where + parseJSON (Object v) = do + t <- v .: "t" :: Aeson.Parser Value + case t of + "AlignLeft" -> return AlignLeft + "AlignRight" -> return AlignRight + "AlignCenter" -> return AlignCenter + "AlignDefault" -> return AlignDefault + _ -> mempty + parseJSON _ = mempty +instance ToJSON Alignment where + toJSON delim = taggedNoContent s + where s = case delim of + AlignLeft -> "AlignLeft" + AlignRight -> "AlignRight" + AlignCenter -> "AlignCenter" + AlignDefault -> "AlignDefault" + + +instance FromJSON Inline where + parseJSON (Object v) = do + t <- v .: "t" :: Aeson.Parser Value + case t of + "Str" -> Str <$> v .: "c" + "Emph" -> Emph <$> v .: "c" + "Strong" -> Strong <$> v .: "c" + "Strikeout" -> Strikeout <$> v .: "c" + "Superscript" -> Superscript <$> v .: "c" + "Subscript" -> Subscript <$> v .: "c" + "SmallCaps" -> SmallCaps <$> v .: "c" + "Quoted" -> do (qt, ils) <- v .: "c" + return $ Quoted qt ils + "Cite" -> do (cits, ils) <- v .: "c" + return $ Cite cits ils + "Code" -> do (attr, s) <- v .: "c" + return $ Code attr s + "Space" -> return Space + "SoftBreak" -> return SoftBreak + "LineBreak" -> return LineBreak + "Math" -> do (mtype, s) <- v .: "c" + return $ Math mtype s + "RawInline" -> do (fmt, s) <- v .: "c" + return $ RawInline fmt s + "Link" -> do (attr, ils, tgt) <- v .: "c" + return $ Link attr ils tgt + "Image" -> do (attr, ils, tgt) <- v .: "c" + return $ Image attr ils tgt + "Note" -> Note <$> v .: "c" + "Span" -> do (attr, ils) <- v .: "c" + return $ Span attr ils + _ -> mempty + parseJSON _ = mempty + +instance ToJSON Inline where + toJSON (Str s) = tagged "Str" s + toJSON (Emph ils) = tagged "Emph" ils + toJSON (Strong ils) = tagged "Strong" ils + toJSON (Strikeout ils) = tagged "Strikeout" ils + toJSON (Superscript ils) = tagged "Superscript" ils + toJSON (Subscript ils) = tagged "Subscript" ils + toJSON (SmallCaps ils) = tagged "SmallCaps" ils + toJSON (Quoted qtype ils) = tagged "Quoted" (qtype, ils) + toJSON (Cite cits ils) = tagged "Cite" (cits, ils) + toJSON (Code attr s) = tagged "Code" (attr, s) + toJSON Space = taggedNoContent "Space" + toJSON SoftBreak = taggedNoContent "SoftBreak" + toJSON LineBreak = taggedNoContent "LineBreak" + toJSON (Math mtype s) = tagged "Math" (mtype, s) + toJSON (RawInline fmt s) = tagged "RawInline" (fmt, s) + toJSON (Link attr ils target) = tagged "Link" (attr, ils, target) + toJSON (Image attr ils target) = tagged "Image" (attr, ils, target) + toJSON (Note blks) = tagged "Note" blks + toJSON (Span attr ils) = tagged "Span" (attr, ils) + +instance FromJSON Block where + parseJSON (Object v) = do + t <- v .: "t" :: Aeson.Parser Value + case t of + "Plain" -> Plain <$> v .: "c" + "Para" -> Para <$> v .: "c" + "LineBlock" -> LineBlock <$> v .: "c" + "CodeBlock" -> do (attr, s) <- v .: "c" + return $ CodeBlock attr s + "RawBlock" -> do (fmt, s) <- v .: "c" + return $ RawBlock fmt s + "BlockQuote" -> BlockQuote <$> v .: "c" + "OrderedList" -> do (attr, items) <- v .: "c" + return $ OrderedList attr items + "BulletList" -> BulletList <$> v .: "c" + "DefinitionList" -> DefinitionList <$> v .: "c" + "Header" -> do (n, attr, ils) <- v .: "c" + return $ Header n attr ils + "HorizontalRule" -> return $ HorizontalRule + "Table" -> do (cpt, align, wdths, hdr, rows) <- v .: "c" + return $ Table cpt align wdths hdr rows + "Div" -> do (attr, blks) <- v .: "c" + return $ Div attr blks + "Null" -> return $ Null + _ -> mempty + parseJSON _ = mempty +instance ToJSON Block where + toJSON (Plain ils) = tagged "Plain" ils + toJSON (Para ils) = tagged "Para" ils + toJSON (LineBlock lns) = tagged "LineBlock" lns + toJSON (CodeBlock attr s) = tagged "CodeBlock" (attr, s) + toJSON (RawBlock fmt s) = tagged "RawBlock" (fmt, s) + toJSON (BlockQuote blks) = tagged "BlockQuote" blks + toJSON (OrderedList listAttrs blksList) = tagged "OrderedList" (listAttrs, blksList) + toJSON (BulletList blksList) = tagged "BulletList" blksList + toJSON (DefinitionList defs) = tagged "DefinitionList" defs + toJSON (Header n attr ils) = tagged "Header" (n, attr, ils) + toJSON HorizontalRule = taggedNoContent "HorizontalRule" + toJSON (Table caption aligns widths cells rows) = + tagged "Table" (caption, aligns, widths, cells, rows) + toJSON (Div attr blks) = tagged "Div" (attr, blks) + toJSON Null = taggedNoContent "Null" + +instance FromJSON Pandoc where + parseJSON (Object v) = do + mbJVersion <- v .:? "pandoc-api-version" :: Aeson.Parser (Maybe [Int]) + case mbJVersion of + Just jVersion | x : y : _ <- jVersion + , x' : y' : _ <- versionBranch pandocTypesVersion + , x == x' + , y == y' -> Pandoc <$> v .: "meta" <*> v .: "blocks" + | otherwise -> + fail $ mconcat [ "Incompatible API versions: " + , "encoded with " + , show jVersion + , " but attempted to decode with " + , show $ versionBranch pandocTypesVersion + , "." + ] + _ -> fail "JSON missing pandoc-api-version." + parseJSON _ = mempty +instance ToJSON Pandoc where + toJSON (Pandoc meta blks) = + object [ "pandoc-api-version" .= versionBranch pandocTypesVersion + , "meta" .= meta + , "blocks" .= blks + ] -- Instances for deepseq #if MIN_VERSION_base(4,8,0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-types-1.16.1.1/Text/Pandoc/Generic.hs new/pandoc-types-1.17.0.5/Text/Pandoc/Generic.hs --- old/pandoc-types-1.16.1.1/Text/Pandoc/Generic.hs 2016-08-20 22:37:38.000000000 +0200 +++ new/pandoc-types-1.17.0.5/Text/Pandoc/Generic.hs 2016-10-17 20:27:07.000000000 +0200 @@ -1,3 +1,4 @@ +{-# LANGUAGE CPP #-} {- Copyright (c) 2006-2016, John MacFarlane @@ -119,7 +120,10 @@ module Text.Pandoc.Generic where import Data.Generics +#if MIN_VERSION_base(4,8,0) +#else import Data.Monoid +#endif -- | Applies a transformation on @a@s to matching elements in a @b@, -- moving from the bottom of the structure up. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-types-1.16.1.1/Text/Pandoc/JSON.hs new/pandoc-types-1.17.0.5/Text/Pandoc/JSON.hs --- old/pandoc-types-1.16.1.1/Text/Pandoc/JSON.hs 2016-08-20 22:37:38.000000000 +0200 +++ new/pandoc-types-1.17.0.5/Text/Pandoc/JSON.hs 2016-10-01 23:07:37.000000000 +0200 @@ -77,7 +77,6 @@ import Text.Pandoc.Generic import Data.Maybe (listToMaybe) import Data.Data -import Data.ByteString.Lazy (ByteString) import qualified Data.ByteString.Lazy as BL import Data.Aeson import System.Environment (getArgs) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-types-1.16.1.1/Text/Pandoc/Walk.hs new/pandoc-types-1.17.0.5/Text/Pandoc/Walk.hs --- old/pandoc-types-1.16.1.1/Text/Pandoc/Walk.hs 2016-08-20 22:37:38.000000000 +0200 +++ new/pandoc-types-1.17.0.5/Text/Pandoc/Walk.hs 2016-10-26 22:08:11.000000000 +0200 @@ -1,4 +1,7 @@ {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, ScopedTypeVariables, CPP #-} +#if MIN_VERSION_base(4,9,0) +{-# OPTIONS_GHC -fno-warn-redundant-constraints #-} +#endif #if MIN_VERSION_base(4,8,0) #define OVERLAPS {-# OVERLAPPING #-} #else @@ -86,16 +89,17 @@ module Text.Pandoc.Walk (Walkable(..)) where -import Control.Applicative ((<$>), (<*>)) +import Control.Applicative ((<$>)) import Text.Pandoc.Definition import Text.Pandoc.Builder ((<>)) import qualified Data.Traversable as T -import Data.Traversable (Traversable, traverse) +import Data.Traversable (Traversable) import qualified Data.Foldable as F -import Data.Foldable (Foldable, foldMap) -import qualified Data.Map as M +import Data.Foldable (Foldable) +#if MIN_VERSION_base(4,8,0) +#else import Data.Monoid - +#endif class Walkable a b where -- | @walk f x@ walks the structure @x@ (bottom up) and replaces every @@ -186,53 +190,57 @@ instance Walkable Inline Block where walk f (Para xs) = Para $ walk f xs walk f (Plain xs) = Plain $ walk f xs - walk f (CodeBlock attr s) = CodeBlock attr s - walk f (RawBlock t s) = RawBlock t s + walk f (LineBlock xs) = LineBlock $ walk f xs + walk _ (CodeBlock attr s) = CodeBlock attr s + walk _ (RawBlock t s) = RawBlock t s walk f (BlockQuote bs) = BlockQuote $ walk f bs walk f (OrderedList a cs) = OrderedList a $ walk f cs walk f (BulletList cs) = BulletList $ walk f cs walk f (DefinitionList xs) = DefinitionList $ walk f xs walk f (Header lev attr xs) = Header lev attr $ walk f xs - walk f HorizontalRule = HorizontalRule + walk _ HorizontalRule = HorizontalRule walk f (Table capt as ws hs rs) = Table (walk f capt) as ws (walk f hs) (walk f rs) walk f (Div attr bs) = Div attr (walk f bs) - walk f Null = Null + walk _ Null = Null walkM f (Para xs) = Para <$> walkM f xs walkM f (Plain xs) = Plain <$> walkM f xs - walkM f (CodeBlock attr s) = return $ CodeBlock attr s - walkM f (RawBlock t s) = return $ RawBlock t s + walkM f (LineBlock xs) = LineBlock <$> walkM f xs + walkM _ (CodeBlock attr s) = return $ CodeBlock attr s + walkM _ (RawBlock t s) = return $ RawBlock t s walkM f (BlockQuote bs) = BlockQuote <$> walkM f bs walkM f (OrderedList a cs) = OrderedList a <$> walkM f cs walkM f (BulletList cs) = BulletList <$> walkM f cs walkM f (DefinitionList xs) = DefinitionList <$> walkM f xs walkM f (Header lev attr xs) = Header lev attr <$> walkM f xs - walkM f HorizontalRule = return HorizontalRule + walkM _ HorizontalRule = return HorizontalRule walkM f (Table capt as ws hs rs) = do capt' <- walkM f capt hs' <- walkM f hs rs' <- walkM f rs return $ Table capt' as ws hs' rs' walkM f (Div attr bs) = Div attr <$> (walkM f bs) - walkM f Null = return Null + walkM _ Null = return Null query f (Para xs) = query f xs query f (Plain xs) = query f xs - query f (CodeBlock attr s) = mempty - query f (RawBlock t s) = mempty + query f (LineBlock xs) = query f xs + query _ (CodeBlock _ _) = mempty + query _ (RawBlock _ _) = mempty query f (BlockQuote bs) = query f bs - query f (OrderedList a cs) = query f cs + query f (OrderedList _ cs) = query f cs query f (BulletList cs) = query f cs query f (DefinitionList xs) = query f xs - query f (Header lev attr xs) = query f xs - query f HorizontalRule = mempty - query f (Table capt as ws hs rs) = query f capt <> query f hs <> query f rs - query f (Div attr bs) = query f bs - query f Null = mempty + query f (Header _ _ xs) = query f xs + query _ HorizontalRule = mempty + query f (Table capt _ _ hs rs) = query f capt <> query f hs <> query f rs + query f (Div _ bs) = query f bs + query _ Null = mempty instance Walkable Block Block where walk f (Para xs) = f $ Para $ walk f xs walk f (Plain xs) = f $ Plain $ walk f xs + walk f (LineBlock xs) = f $ LineBlock $ walk f xs walk f (CodeBlock attr s) = f $ CodeBlock attr s walk f (RawBlock t s) = f $ RawBlock t s walk f (BlockQuote bs) = f $ BlockQuote $ walk f bs @@ -244,10 +252,11 @@ walk f (Table capt as ws hs rs) = f $ Table (walk f capt) as ws (walk f hs) (walk f rs) walk f (Div attr bs) = f $ Div attr (walk f bs) - walk f Null = Null + walk _ Null = Null walkM f (Para xs) = Para <$> walkM f xs >>= f walkM f (Plain xs) = Plain <$> walkM f xs >>= f + walkM f (LineBlock xs) = LineBlock <$> walkM f xs >>= f walkM f (CodeBlock attr s) = f $ CodeBlock attr s walkM f (RawBlock t s) = f $ RawBlock t s walkM f (BlockQuote bs) = BlockQuote <$> walkM f bs >>= f @@ -265,6 +274,7 @@ query f (Para xs) = f (Para xs) <> query f xs query f (Plain xs) = f (Plain xs) <> query f xs + query f (LineBlock xs) = f (LineBlock xs) <> query f xs query f (CodeBlock attr s) = f $ CodeBlock attr s query f (RawBlock t s) = f $ RawBlock t s query f (BlockQuote bs) = f (BlockQuote bs) <> query f bs @@ -279,7 +289,7 @@ query f Null = f Null instance Walkable Block Inline where - walk f (Str xs) = Str xs + walk _ (Str xs) = Str xs walk f (Emph xs) = Emph (walk f xs) walk f (Strong xs) = Strong (walk f xs) walk f (Strikeout xs) = Strikeout (walk f xs) @@ -288,18 +298,18 @@ walk f (SmallCaps xs) = SmallCaps (walk f xs) walk f (Quoted qt xs) = Quoted qt (walk f xs) walk f (Cite cs xs) = Cite (walk f cs) (walk f xs) - walk f (Code attr s) = Code attr s - walk f Space = Space - walk f SoftBreak = SoftBreak - walk f LineBreak = LineBreak - walk f (Math mt s) = Math mt s - walk f (RawInline t s) = RawInline t s + walk _ (Code attr s) = Code attr s + walk _ Space = Space + walk _ SoftBreak = SoftBreak + walk _ LineBreak = LineBreak + walk _ (Math mt s) = Math mt s + walk _ (RawInline t s) = RawInline t s walk f (Link atr xs t) = Link atr (walk f xs) t walk f (Image atr xs t)= Image atr (walk f xs) t walk f (Note bs) = Note (walk f bs) walk f (Span attr xs) = Span attr (walk f xs) - walkM f (Str xs) = return $ Str xs + walkM _ (Str xs) = return $ Str xs walkM f (Emph xs) = Emph <$> walkM f xs walkM f (Strong xs) = Strong <$> walkM f xs walkM f (Strikeout xs) = Strikeout <$> walkM f xs @@ -310,36 +320,36 @@ walkM f (Cite cs xs) = do cs' <- walkM f cs xs' <- walkM f xs return $ Cite cs' xs' - walkM f (Code attr s) = return $ Code attr s - walkM f Space = return $ Space - walkM f SoftBreak = return $ SoftBreak - walkM f LineBreak = return $ LineBreak - walkM f (Math mt s) = return $ Math mt s - walkM f (RawInline t s) = return $ RawInline t s + walkM _ (Code attr s) = return $ Code attr s + walkM _ Space = return $ Space + walkM _ SoftBreak = return $ SoftBreak + walkM _ LineBreak = return $ LineBreak + walkM _ (Math mt s) = return $ Math mt s + walkM _ (RawInline t s) = return $ RawInline t s walkM f (Link atr xs t) = (\lab -> Link atr lab t) <$> walkM f xs walkM f (Image atr xs t)= (\lab -> Image atr lab t) <$> walkM f xs walkM f (Note bs) = Note <$> walkM f bs walkM f (Span attr xs) = Span attr <$> walkM f xs - query f (Str xs) = mempty + query _ (Str _) = mempty query f (Emph xs) = query f xs query f (Strong xs) = query f xs query f (Strikeout xs) = query f xs query f (Subscript xs) = query f xs query f (Superscript xs)= query f xs query f (SmallCaps xs) = query f xs - query f (Quoted qt xs) = query f xs + query f (Quoted _ xs) = query f xs query f (Cite cs xs) = query f cs <> query f xs - query f (Code attr s) = mempty - query f Space = mempty - query f SoftBreak = mempty - query f LineBreak = mempty - query f (Math mt s) = mempty - query f (RawInline t s) = mempty - query f (Link atr xs t) = query f xs - query f (Image atr xs t)= query f xs + query _ (Code _ _) = mempty + query _ Space = mempty + query _ SoftBreak = mempty + query _ LineBreak = mempty + query _ (Math _ _) = mempty + query _ (RawInline _ _) = mempty + query f (Link _ xs _) = query f xs + query f (Image _ xs _) = query f xs query f (Note bs) = query f bs - query f (Span attr xs) = query f xs + query f (Span _ xs) = query f xs instance Walkable Block Pandoc where walk f (Pandoc m bs) = Pandoc (walk f m) (walk f bs) @@ -377,44 +387,44 @@ instance Walkable Inline MetaValue where walk f (MetaList xs) = MetaList $ walk f xs - walk f (MetaBool b) = MetaBool b - walk f (MetaString s) = MetaString s + walk _ (MetaBool b) = MetaBool b + walk _ (MetaString s) = MetaString s walk f (MetaInlines xs) = MetaInlines $ walk f xs walk f (MetaBlocks bs) = MetaBlocks $ walk f bs walk f (MetaMap m) = MetaMap $ walk f m walkM f (MetaList xs) = MetaList <$> walkM f xs - walkM f (MetaBool b) = return $ MetaBool b - walkM f (MetaString s) = return $ MetaString s + walkM _ (MetaBool b) = return $ MetaBool b + walkM _ (MetaString s) = return $ MetaString s walkM f (MetaInlines xs) = MetaInlines <$> walkM f xs walkM f (MetaBlocks bs) = MetaBlocks <$> walkM f bs walkM f (MetaMap m) = MetaMap <$> walkM f m query f (MetaList xs) = query f xs - query f (MetaBool b) = mempty - query f (MetaString s) = mempty + query _ (MetaBool _) = mempty + query _ (MetaString _) = mempty query f (MetaInlines xs) = query f xs query f (MetaBlocks bs) = query f bs query f (MetaMap m) = query f m instance Walkable Block MetaValue where walk f (MetaList xs) = MetaList $ walk f xs - walk f (MetaBool b) = MetaBool b - walk f (MetaString s) = MetaString s + walk _ (MetaBool b) = MetaBool b + walk _ (MetaString s) = MetaString s walk f (MetaInlines xs) = MetaInlines $ walk f xs walk f (MetaBlocks bs) = MetaBlocks $ walk f bs walk f (MetaMap m) = MetaMap $ walk f m walkM f (MetaList xs) = MetaList <$> walkM f xs - walkM f (MetaBool b) = return $ MetaBool b - walkM f (MetaString s) = return $ MetaString s + walkM _ (MetaBool b) = return $ MetaBool b + walkM _ (MetaString s) = return $ MetaString s walkM f (MetaInlines xs) = MetaInlines <$> walkM f xs walkM f (MetaBlocks bs) = MetaBlocks <$> walkM f bs walkM f (MetaMap m) = MetaMap <$> walkM f m query f (MetaList xs) = query f xs - query f (MetaBool b) = mempty - query f (MetaString s) = mempty + query _ (MetaBool _) = mempty + query _ (MetaString _) = mempty query f (MetaInlines xs) = query f xs query f (MetaBlocks bs) = query f bs query f (MetaMap m) = query f m @@ -426,7 +436,7 @@ do pref' <- walkM f pref suff' <- walkM f suff return $ Citation id' pref' suff' mode notenum hash - query f (Citation id' pref suff mode notenum hash) = + query f (Citation _ pref suff _ _ _) = query f pref <> query f suff instance Walkable Block Citation where @@ -436,5 +446,5 @@ do pref' <- walkM f pref suff' <- walkM f suff return $ Citation id' pref' suff' mode notenum hash - query f (Citation id' pref suff mode notenum hash) = + query f (Citation _ pref suff _ _ _) = query f pref <> query f suff diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-types-1.16.1.1/changelog new/pandoc-types-1.17.0.5/changelog --- old/pandoc-types-1.16.1.1/changelog 2016-08-20 22:37:38.000000000 +0200 +++ new/pandoc-types-1.17.0.5/changelog 2017-01-16 08:29:49.000000000 +0100 @@ -1,3 +1,60 @@ +[1.17.0.5] + + * Allow aeson 1.1. + * Added tests for Walk (originally from pandoc). + * Renamed README -> README.md, fix link (Kolen Cheung). + +[1.17.0.4] + + * Re-add Functor constraint to walkM, needed for ghc 7.8. + * Turn off redundant-constraints warning for Walk (for ghc 8.0.1+). + * Added necessary Data.Traversable import. + * Allow HUnit 1.5. + +[1.17.0.3] + + * More ghc 7.8 compatibility imports. + +[1.17.0.2] + + * Added a necessary import from Data.Monoid (for ghc 7.8). + +[1.17.0.1] + + * Fix compiler warnings around Data.Monoid import on some platforms. + +[1.17] + + * Remimplement json encoding of inlines manually (Jesse Rosenthal). + This is the first step to doing manual encoding and decoding of pandoc + JSON. This will replace the current generic deriving, which can be a + moving target. + * Move Arbitrary instances for types from pandoc (Jesse Rosenthal). + * Remove empty arrays for leaf elements (Jesse Rosenthal). + Elements with no children (Space, SoftBreak, LineBreak, HorizontalRule, + Null) previously had an empty array for their "c" value. We remove that + here. This is a breaking change for the JSON format. + * New toplevel JSON format with api-version (Jesse Rosenthal). The version + number is the pandoc-types version. The toplevel format was previously: + + [{"unMeta": META}, [BLOCKS]] + + It is now: + + { + "pandoc-api-version" : [MAJ, MIN, REV], + "meta" : META, + "blocks": BLOCKS + } + + Decoding fails if the major and minor version numbers don't match. + * Add simple quickcheck tests to verify that roundtrip works properly + (Jesse Rosenthal). + * Add a LineBlock block element (Albert Krewinkel). + * Add explicit unit tests for encoding and decoding (Jesse Rosenthal). + * Fixed warnings in Walk, Builder. + * Test with travis and appveyor. + [1.16.1.1] * Allow aeson 1.0.*. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-types-1.16.1.1/pandoc-types.cabal new/pandoc-types-1.17.0.5/pandoc-types.cabal --- old/pandoc-types-1.16.1.1/pandoc-types.cabal 2016-08-20 22:37:38.000000000 +0200 +++ new/pandoc-types-1.17.0.5/pandoc-types.cabal 2017-01-16 08:28:31.000000000 +0100 @@ -1,5 +1,5 @@ Name: pandoc-types -Version: 1.16.1.1 +Version: 1.17.0.5 Synopsis: Types for representing a structured document Description: @Text.Pandoc.Definition@ defines the 'Pandoc' data structure, which is used by pandoc to represent @@ -31,8 +31,8 @@ Copyright: (c) 2006-2015 John MacFarlane Category: Text Build-type: Simple -Cabal-version: >=1.6 -Tested-With: GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.2 +Cabal-version: >=1.8 +Tested-With: GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.1 Extra-Source-Files: changelog Source-repository head type: git @@ -44,14 +44,34 @@ Text.Pandoc.Walk Text.Pandoc.Builder Text.Pandoc.JSON + Text.Pandoc.Arbitrary Other-modules: Paths_pandoc_types Build-depends: base >= 4 && < 5, containers >= 0.3, syb >= 0.1 && < 0.7, ghc-prim >= 0.2, bytestring >= 0.9 && < 0.11, - aeson >= 0.6.2 && < 1.1 + aeson >= 0.6.2 && < 1.2, + QuickCheck >= 2 if impl(ghc < 7.10) Build-depends: deepseq-generics >= 0.1 && < 0.2 else Build-depends: deepseq >= 1.4.1 && < 1.5 + +test-suite test-pandoc-types + type: exitcode-stdio-1.0 + hs-source-dirs: test + main-is: test-pandoc-types.hs + build-depends: base, + pandoc-types, + syb, + aeson >= 0.6.2 && < 1.2, + containers >= 0.3, + bytestring >= 0.9 && < 0.11, + test-framework >= 0.3 && < 0.9, + test-framework-hunit >= 0.2 && < 0.4, + test-framework-quickcheck2 >= 0.2.9 && < 0.4, + QuickCheck >= 2.4 && < 2.10, + HUnit >= 1.2 && < 1.6, + string-qq == 0.0.2 + ghc-options: -threaded -rtsopts -with-rtsopts=-N diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-types-1.16.1.1/test/test-pandoc-types.hs new/pandoc-types-1.17.0.5/test/test-pandoc-types.hs --- old/pandoc-types-1.16.1.1/test/test-pandoc-types.hs 1970-01-01 01:00:00.000000000 +0100 +++ new/pandoc-types-1.17.0.5/test/test-pandoc-types.hs 2017-01-16 08:25:44.000000000 +0100 @@ -0,0 +1,404 @@ +{-# LANGUAGE OverloadedStrings, QuasiQuotes, FlexibleContexts #-} + +import Text.Pandoc.Definition +import Text.Pandoc.Walk +import Text.Pandoc.Arbitrary() +import Data.Generics +import Test.HUnit (Assertion, assertEqual, assertFailure) +import Text.Pandoc.Arbitrary () +import Data.Char (toUpper) +import Data.Aeson (FromJSON, ToJSON, encode, decode) +import Test.Framework +import Test.Framework.Providers.QuickCheck2 (testProperty) +import Test.Framework.Providers.HUnit (testCase) +import qualified Data.Map as M +import Data.String.QQ +import Data.ByteString.Lazy (ByteString) + +p_walk :: (Typeable a, Walkable a Pandoc) + => (a -> a) -> Pandoc -> Bool +p_walk f d = everywhere (mkT f) d == walk f d + +p_query :: (Eq a, Typeable a1, Monoid a, Walkable a1 Pandoc) + => (a1 -> a) -> Pandoc -> Bool +p_query f d = everything mappend (mempty `mkQ` f) d == query f d + +inlineTrans :: Inline -> Inline +inlineTrans (Str xs) = Str $ map toUpper xs +inlineTrans (Emph xs) = Strong xs +inlineTrans x = x + +blockTrans :: Block -> Block +blockTrans (Plain xs) = Para xs +blockTrans (BlockQuote xs) = Div ("",["special"],[]) xs +blockTrans x = x + +inlineQuery :: Inline -> String +inlineQuery (Str xs) = xs +inlineQuery _ = "" + +blockQuery :: Block -> [Int] +blockQuery (Header lev _ _) = [lev] +blockQuery _ = [] + + +prop_roundtrip :: Pandoc -> Bool +prop_roundtrip doc = case decode $ encode doc :: (Maybe Pandoc) of + Just doc' -> doc == doc' + _ -> False + +testEncode :: ToJSON a => (a, ByteString) -> Assertion +testEncode (doc, j) = assertEqual "Encoding error" (encode doc) j + +testDecode' :: FromJSON a => (a, ByteString) -> Maybe a +testDecode' (_, j) = decode j + +testDecode :: (Show a, Eq a, FromJSON a) => (a, ByteString) -> Assertion +testDecode (doc, j) = + case testDecode' (doc, j) of + Just doc' -> assertEqual "Decoding error" doc' doc + Nothing -> assertFailure "Decoding error" + +testEncodeDecode :: (Show a, Eq a, ToJSON a, FromJSON a) + => String + -> (a, ByteString) + -> Test +testEncodeDecode msg pair = testGroup msg [ testCase "Encoding" $ testEncode pair + , testCase "Decoding" $ testDecode pair + ] + +t_metamap :: (MetaValue, ByteString) +t_metamap = ( MetaMap $ + M.fromList [("foo", MetaBool True)] + , [s|{"t":"MetaMap","c":{"foo":{"t":"MetaBool","c":true}}}|] + ) + +t_metalist :: (MetaValue, ByteString) +t_metalist = ( MetaList [MetaBool True, MetaString "baz"] + , [s|{"t":"MetaList","c":[{"t":"MetaBool","c":true},{"t":"MetaString","c":"baz"}]}|] + ) + +t_metabool :: (MetaValue, ByteString) +t_metabool = ( MetaBool False, [s|{"t":"MetaBool","c":false}|] ) + +t_metastring :: (MetaValue, ByteString) +t_metastring = ( MetaString "Hello", [s|{"t":"MetaString","c":"Hello"}|] ) + +t_metainlines :: (MetaValue, ByteString) +t_metainlines = ( MetaInlines [Space, SoftBreak] + , [s|{"t":"MetaInlines","c":[{"t":"Space"},{"t":"SoftBreak"}]}|] + ) + +t_metablocks :: (MetaValue, ByteString) +t_metablocks = ( MetaBlocks [Null,Null], [s|{"t":"MetaBlocks","c":[{"t":"Null"},{"t":"Null"}]}|]) + +t_singlequote :: (QuoteType, ByteString) +t_singlequote = (SingleQuote, [s|{"t":"SingleQuote"}|]) + +t_doublequote :: (QuoteType, ByteString) +t_doublequote = (DoubleQuote, [s|{"t":"DoubleQuote"}|]) + +t_authorintext :: (CitationMode, ByteString) +t_authorintext = (AuthorInText, [s|{"t":"AuthorInText"}|]) + +t_suppressauthor :: (CitationMode, ByteString) +t_suppressauthor = (SuppressAuthor, [s|{"t":"SuppressAuthor"}|]) + +t_normalcitation :: (CitationMode, ByteString) +t_normalcitation = (NormalCitation, [s|{"t":"NormalCitation"}|]) + +t_citation :: (Citation, ByteString) +t_citation = ( Citation { citationId = "jameson:unconscious", + citationPrefix = [Str "cf"], + citationSuffix = [Space,Str "123"], + citationMode = NormalCitation, + citationNoteNum = 0, + citationHash = 0} + , [s|{"citationSuffix":[{"t":"Space"},{"t":"Str","c":"123"}],"citationNoteNum":0,"citationMode":{"t":"NormalCitation"},"citationPrefix":[{"t":"Str","c":"cf"}],"citationId":"jameson:unconscious","citationHash":0}|] + ) + +t_displaymath :: (MathType, ByteString) +t_displaymath = ( DisplayMath, [s|{"t":"DisplayMath"}|]) + +t_inlinemath :: (MathType, ByteString) +t_inlinemath = ( InlineMath, [s|{"t":"InlineMath"}|]) + + +t_str :: (Inline, ByteString) +t_str = ( Str "Hello" + , [s|{"t":"Str","c":"Hello"}|] + ) + +t_emph :: (Inline, ByteString) +t_emph = ( Emph [Str "Hello"] + , [s|{"t":"Emph","c":[{"t":"Str","c":"Hello"}]}|] + ) + +t_strong :: (Inline, ByteString) +t_strong = ( Strong [Str "Hello"] + , [s|{"t":"Strong","c":[{"t":"Str","c":"Hello"}]}|] + ) + +t_strikeout :: (Inline, ByteString) +t_strikeout = ( Strikeout [Str "Hello"] + , [s|{"t":"Strikeout","c":[{"t":"Str","c":"Hello"}]}|] + ) + +t_superscript :: (Inline, ByteString) +t_superscript = ( Superscript [Str "Hello"] + , [s|{"t":"Superscript","c":[{"t":"Str","c":"Hello"}]}|] + ) + +t_subscript :: (Inline, ByteString) +t_subscript = ( Subscript [Str "Hello"] + , [s|{"t":"Subscript","c":[{"t":"Str","c":"Hello"}]}|] + ) + +t_smallcaps :: (Inline, ByteString) +t_smallcaps = ( SmallCaps [Str "Hello"] + , [s|{"t":"SmallCaps","c":[{"t":"Str","c":"Hello"}]}|] + ) + +t_quoted :: (Inline, ByteString) +t_quoted = ( Quoted SingleQuote [Str "Hello"] + , [s|{"t":"Quoted","c":[{"t":"SingleQuote"},[{"t":"Str","c":"Hello"}]]}|] + ) + +t_cite :: (Inline, ByteString) +t_cite = ( Cite [Citation { citationId = "jameson:unconscious" + , citationPrefix = [Str "cf"] + , citationSuffix = [Space,Str "12"] + , citationMode = NormalCitation + , citationNoteNum = 0 + , citationHash = 0}] + [ Str "[cf" + , Space + , Str "@jameson:unconscious" + , Space + , Str "12]"] + ,[s|{"t":"Cite","c":[[{"citationSuffix":[{"t":"Space"},{"t":"Str","c":"12"}],"citationNoteNum":0,"citationMode":{"t":"NormalCitation"},"citationPrefix":[{"t":"Str","c":"cf"}],"citationId":"jameson:unconscious","citationHash":0}],[{"t":"Str","c":"[cf"},{"t":"Space"},{"t":"Str","c":"@jameson:unconscious"},{"t":"Space"},{"t":"Str","c":"12]"}]]}|] + ) + +t_code :: (Inline, ByteString) +t_code = ( Code ("", [], [("language", "haskell")]) "foo bar" + , [s|{"t":"Code","c":[["",[],[["language","haskell"]]],"foo bar"]}|] + ) + +t_space :: (Inline, ByteString) +t_space = ( Space, [s|{"t":"Space"}|] ) + +t_softbreak :: (Inline, ByteString) +t_softbreak = ( SoftBreak, [s|{"t":"SoftBreak"}|] ) + +t_linebreak :: (Inline, ByteString) +t_linebreak = ( LineBreak, [s|{"t":"LineBreak"}|] ) + +t_rawinline :: (Inline, ByteString) +t_rawinline = ( RawInline (Format "tex") "\\foo{bar}" + , [s|{"t":"RawInline","c":["tex","\\foo{bar}"]}|] + ) + +t_link :: (Inline, ByteString) +t_link = ( Link ("id",["kls"],[("k1", "v1"), ("k2", "v2")]) + [ Str "a", Space, Str "famous", Space, Str "site"] + ("https://www.google.com","google") + , [s|{"t":"Link","c":[["id",["kls"],[["k1","v1"],["k2","v2"]]],[{"t":"Str","c":"a"},{"t":"Space"},{"t":"Str","c":"famous"},{"t":"Space"},{"t":"Str","c":"site"}],["https://www.google.com","google"]]}|] + ) + +t_image :: (Inline, ByteString) +t_image = ( Image ("id",["kls"],[("k1", "v1"), ("k2", "v2")]) + [ Str "a", Space, Str "famous", Space, Str "image"] + ("my_img.png","image") + , [s|{"t":"Image","c":[["id",["kls"],[["k1","v1"],["k2","v2"]]],[{"t":"Str","c":"a"},{"t":"Space"},{"t":"Str","c":"famous"},{"t":"Space"},{"t":"Str","c":"image"}],["my_img.png","image"]]}|] + ) + +t_note :: (Inline, ByteString) +t_note = ( Note [Para [Str "Hello"]] + , [s|{"t":"Note","c":[{"t":"Para","c":[{"t":"Str","c":"Hello"}]}]}|] + ) + +t_span :: (Inline, ByteString) +t_span = ( Span ("id", ["kls"], [("k1", "v1"), ("k2", "v2")]) [Str "Hello"] + , [s|{"t":"Span","c":[["id",["kls"],[["k1","v1"],["k2","v2"]]],[{"t":"Str","c":"Hello"}]]}|] + ) + +t_plain :: (Block, ByteString) +t_plain = ( Plain [Str "Hello"] + , [s|{"t":"Plain","c":[{"t":"Str","c":"Hello"}]}|] + ) + +t_para :: (Block, ByteString) +t_para = ( Para [Str "Hello"] + , [s|{"t":"Para","c":[{"t":"Str","c":"Hello"}]}|] + ) + +t_lineblock :: (Block, ByteString) +t_lineblock = ( LineBlock [[Str "Hello"], [Str "Moin"]] + , [s|{"t":"LineBlock","c":[[{"t":"Str","c":"Hello"}],[{"t":"Str","c":"Moin"}]]}|] + ) + +t_codeblock :: (Block, ByteString) +t_codeblock = ( CodeBlock ("id", ["kls"], [("k1", "v1"), ("k2", "v2")]) "Foo Bar" + , [s|{"t":"CodeBlock","c":[["id",["kls"],[["k1","v1"],["k2","v2"]]],"Foo Bar"]}|] + ) + +t_rawblock :: (Block, ByteString) +t_rawblock = ( RawBlock (Format "tex") "\\foo{bar}" + , [s|{"t":"RawBlock","c":["tex","\\foo{bar}"]}|] + ) + +t_blockquote :: (Block, ByteString) +t_blockquote = ( BlockQuote [Para [Str "Hello"]] + , [s|{"t":"BlockQuote","c":[{"t":"Para","c":[{"t":"Str","c":"Hello"}]}]}|] + ) + +t_orderedlist :: (Block, ByteString) +t_orderedlist = (OrderedList (1,Decimal,Period) + [[Para [Str "foo"]] + ,[Para [Str "bar"]]] + , [s|{"t":"OrderedList","c":[[1,{"t":"Decimal"},{"t":"Period"}],[[{"t":"Para","c":[{"t":"Str","c":"foo"}]}],[{"t":"Para","c":[{"t":"Str","c":"bar"}]}]]]}|] + ) + +t_bulletlist :: (Block, ByteString) +t_bulletlist = (BulletList + [[Para [Str "foo"]] + ,[Para [Str "bar"]]] + , [s|{"t":"BulletList","c":[[{"t":"Para","c":[{"t":"Str","c":"foo"}]}],[{"t":"Para","c":[{"t":"Str","c":"bar"}]}]]}|] + ) + +t_definitionlist :: (Block, ByteString) +t_definitionlist = (DefinitionList + [([Str "foo"], + [[Para [Str "bar"]]]) + ,([Str "fizz"], + [[Para [Str "pop"]]])] + , [s|{"t":"DefinitionList","c":[[[{"t":"Str","c":"foo"}],[[{"t":"Para","c":[{"t":"Str","c":"bar"}]}]]],[[{"t":"Str","c":"fizz"}],[[{"t":"Para","c":[{"t":"Str","c":"pop"}]}]]]]}|] + ) + +t_header :: (Block, ByteString) +t_header = ( Header 2 ("id", ["kls"], [("k1", "v1"), ("k2", "v2")]) [Str "Head"] + , [s|{"t":"Header","c":[2,["id",["kls"],[["k1","v1"],["k2","v2"]]],[{"t":"Str","c":"Head"}]]}|] + ) + +t_table :: (Block, ByteString) +t_table = ( Table + [Str "Demonstration" + ,Space + ,Str "of" + ,Space + ,Str "simple" + ,Space + ,Str "table" + ,Space + ,Str "syntax."] + [AlignRight + ,AlignLeft + ,AlignCenter + ,AlignDefault] + [0.0,0.0,0.0,0.0] + [[Plain [Str "Right"]] + ,[Plain [Str "Left"]] + ,[Plain [Str "Center"]] + ,[Plain [Str "Default"]]] + [[[Plain [Str "12"]] + ,[Plain [Str "12"]] + ,[Plain [Str "12"]] + ,[Plain [Str "12"]]] + ,[[Plain [Str "123"]] + ,[Plain [Str "123"]] + ,[Plain [Str "123"]] + ,[Plain [Str "123"]]] + ,[[Plain [Str "1"]] + ,[Plain [Str "1"]] + ,[Plain [Str "1"]] + ,[Plain [Str "1"]]]] + , + [s|{"t":"Table","c":[[{"t":"Str","c":"Demonstration"},{"t":"Space"},{"t":"Str","c":"of"},{"t":"Space"},{"t":"Str","c":"simple"},{"t":"Space"},{"t":"Str","c":"table"},{"t":"Space"},{"t":"Str","c":"syntax."}],[{"t":"AlignRight"},{"t":"AlignLeft"},{"t":"AlignCenter"},{"t":"AlignDefault"}],[0,0,0,0],[[{"t":"Plain","c":[{"t":"Str","c":"Right"}]}],[{"t":"Plain","c":[{"t":"Str","c":"Left"}]}],[{"t":"Plain","c":[{"t":"Str","c":"Center"}]}],[{"t":"Plain","c":[{"t":"Str","c":"Default"}]}]],[[[{"t":"Plain","c":[{"t":"Str","c":"12"}]}],[{"t":"Plain","c":[{"t":"Str","c":"12"}]}],[{"t":"Plain","c":[{"t":"Str","c":"12"}]}],[{"t":"Plain","c":[{"t":"Str","c":"12"}]}]],[[{"t":"Plain","c":[{"t":"Str","c":"123"}]}],[{"t":"Plain","c":[{"t":"Str","c":"123"}]}],[{"t":"Plain","c":[{"t":"Str","c":"123"}]}],[{"t":"Plain","c":[{"t":"Str","c":"123"}]}]],[[{"t":"Plain","c":[{"t":"Str","c":"1"}]}],[{"t":"Plain","c":[{"t":"Str","c":"1"}]}],[{"t":"Plain","c":[{"t":"Str","c":"1"}]}],[{"t":"Plain","c":[{"t":"Str","c":"1"}]}]]]]}|] + ) + +t_div :: (Block, ByteString) +t_div = ( Div ("id", ["kls"], [("k1", "v1"), ("k2", "v2")]) [Para [Str "Hello"]] + , [s|{"t":"Div","c":[["id",["kls"],[["k1","v1"],["k2","v2"]]],[{"t":"Para","c":[{"t":"Str","c":"Hello"}]}]]}|] + ) + +t_null :: (Block, ByteString) +t_null = (Null, [s|{"t":"Null"}|]) + + +tests :: [Test] +tests = + [ testGroup "Walk" + [ testProperty "p_walk inlineTrans" (p_walk inlineTrans) + , testProperty "p_walk blockTrans" (p_walk blockTrans) + , testProperty "p_query inlineQuery" (p_query inlineQuery) + , testProperty "p_query blockQuery" (p_query blockQuery) + ] + , testGroup "JSON" + [ testGroup "encoding/decoding properties" + [ testProperty "round-trip" prop_roundtrip + ] + , testGroup "JSON encoding/decoding" + [ testGroup "Meta" + [ testEncodeDecode "MetaMap" t_metamap + , testEncodeDecode "MetaList" t_metalist + , testEncodeDecode "MetaBool" t_metabool + , testEncodeDecode "MetaString" t_metastring + , testEncodeDecode "MetaInlines" t_metainlines + , testEncodeDecode "MetaBlocks" t_metablocks + ] + , testGroup "QuoteType" + [ testEncodeDecode "SingleQuote" t_singlequote + , testEncodeDecode "DoubleQuote" t_doublequote + ] + , testGroup "CitationType" + [ testEncodeDecode "AuthorInText" t_authorintext + , testEncodeDecode "SuppressAuthor" t_suppressauthor + , testEncodeDecode "NormalCitation" t_normalcitation + ] + , testEncodeDecode "Citation" t_citation + , testGroup "MathType" + [ testEncodeDecode "DisplayMath" t_displaymath + , testEncodeDecode "InlineMath" t_inlinemath + ] + , testGroup "Inline" + [ testEncodeDecode "Str" t_str + , testEncodeDecode "Emph" t_emph + , testEncodeDecode "Strong" t_strong + , testEncodeDecode "Strikeout" t_strikeout + , testEncodeDecode "Superscript" t_superscript + , testEncodeDecode "Subscript" t_subscript + , testEncodeDecode "SmallCaps" t_smallcaps + , testEncodeDecode "Quoted" t_quoted + , testEncodeDecode "Cite" t_cite + , testEncodeDecode "Code" t_code + , testEncodeDecode "Space" t_space + , testEncodeDecode "SoftBreak" t_softbreak + , testEncodeDecode "LineBreak" t_linebreak + , testEncodeDecode "RawInline" t_rawinline + , testEncodeDecode "Link" t_link + , testEncodeDecode "Image" t_image + , testEncodeDecode "Note" t_note + , testEncodeDecode "Span" t_span + ] + , testGroup "Block" + [ testEncodeDecode "Plain" t_plain + , testEncodeDecode "Para" t_para + , testEncodeDecode "LineBlock" t_lineblock + , testEncodeDecode "CodeBlock" t_codeblock + , testEncodeDecode "RawBlock" t_rawblock + , testEncodeDecode "BlockQuote" t_blockquote + , testEncodeDecode "OrderedList" t_orderedlist + , testEncodeDecode "BulletList" t_bulletlist + , testEncodeDecode "DefinitionList" t_definitionlist + , testEncodeDecode "Header" t_header + , testEncodeDecode "Table" t_table + , testEncodeDecode "Div" t_div + , testEncodeDecode "Null" t_null + ] + ] + ] + ] + + +main :: IO () +main = defaultMain tests
