git.iko.soy/typeable/pandoc
on master help sign in
Add cabal flag `derive_json_via_th`

Disabling the flag will cause derivation of ToJSON and FromJSON instances via GHC Generics instead of Template Haskell. The flag is enabled by default, as deriving via Generics can be slow (see #4083).

commitdc150df8e19f13e836fde05f5401b0f99288815b authorAlbert Krewinkel <albert@zeitkraut.de> dateSun 4 Nov 2018, 20:51 (8 years ago) parent41b8ad6
5 files changed+117−12
pandoc.cabal+7 src/Text/Pandoc/App/CommandLineOptions.hs+20−2 src/Text/Pandoc/Extensions.hs+22−4 src/Text/Pandoc/Filter.hs+18−3 src/Text/Pandoc/Options.hs+50−3
pandoc.cabal+7
@@ -337,6 +337,11 @@ flag embed_data_files
337337 Description: Embed data files in binary for relocatable executable.
338338 Default: False
339339
340+flag derive_json_via_th
341+ Description: Use Template Haskell instead of GHC Generics to derive ToJSON
342+ and FromJSON instances.
343+ Default: True
344+
340345flag trypandoc
341346 Description: Build trypandoc cgi executable.
342347 Default: False
@@ -413,6 +418,8 @@ library
413418 cpp-options: -DEMBED_DATA_FILES
414419 build-depends: file-embed >= 0.0 && < 0.1
415420 other-modules: Text.Pandoc.Data
421+ if flag(derive_json_via_th)
422+ cpp-options: -DDERIVE_JSON_VIA_TH
416423 if os(windows)
417424 cpp-options: -D_WINDOWS
418425 ghc-options: -Wall -fno-warn-unused-do-bind
src/Text/Pandoc/App/CommandLineOptions.hs+20−2
@@ -2,8 +2,10 @@
22{-# LANGUAGE CPP #-}
33{-# LANGUAGE DeriveGeneric #-}
44{-# LANGUAGE ScopedTypeVariables #-}
5−{-# LANGUAGE TemplateHaskell #-}
65{-# LANGUAGE TupleSections #-}
6+#ifdef DERIVE_JSON_VIA_TH
7+{-# LANGUAGE TemplateHaskell #-}
8+#endif
79{-
810Copyright (C) 2006-2018 John MacFarlane <jgm@berkeley.edu>
911
@@ -46,7 +48,6 @@ import Control.Monad
4648import Control.Monad.Trans
4749import Data.Aeson.Encode.Pretty (encodePretty', Config(..), keyOrder,
4850 defConfig, Indent(..), NumberFormat(..))
49−import Data.Aeson.TH (deriveJSON, defaultOptions)
5051import Data.Char (toLower, toUpper)
5152import Data.List (intercalate, sort)
5253import Data.Maybe (fromMaybe)
@@ -65,6 +66,13 @@ import Text.Pandoc.Writers.Math (defaultMathJaxURL, defaultKaTeXURL)
6566import Text.Pandoc.Shared (ordNub, safeRead)
6667import Text.Printf
6768
69+#ifdef DERIVE_JSON_VIA_TH
70+import Data.Aeson.TH (deriveJSON, defaultOptions)
71+#else
72+import Data.Aeson (FromJSON (..), ToJSON (..),
73+ defaultOptions, genericToEncoding)
74+#endif
75+
6876#ifdef EMBED_DATA_FILES
6977import Text.Pandoc.Data (dataFiles)
7078import System.Directory (getAppUserDataDirectory)
@@ -1086,5 +1094,15 @@ deprecatedOption o msg =
10861094
10871095-- see https://github.com/jgm/pandoc/pull/4083
10881096-- using generic deriving caused long compilation times
1097+#ifdef DERIVE_JSON_VIA_TH
10891098$(deriveJSON defaultOptions ''LineEnding)
10901099$(deriveJSON defaultOptions ''Opt)
1100+#else
1101+instance ToJSON LineEnding where
1102+ toEncoding = genericToEncoding defaultOptions
1103+instance FromJSON LineEnding
1104+
1105+instance ToJSON Opt where
1106+ toEncoding = genericToEncoding defaultOptions
1107+instance FromJSON Opt
1108+#endif
src/Text/Pandoc/Extensions.hs+22−4
@@ -1,9 +1,11 @@
1−{-# LANGUAGE NoImplicitPrelude #-}
21{-# LANGUAGE CPP #-}
2+{-# LANGUAGE NoImplicitPrelude #-}
33{-# LANGUAGE DeriveDataTypeable #-}
44{-# LANGUAGE DeriveGeneric #-}
5+#ifndef AVOID_TEMPLATE_HASKELL
56{-# LANGUAGE GeneralizedNewtypeDeriving #-}
67{-# LANGUAGE TemplateHaskell #-}
8+#endif
79{-
810Copyright (C) 2012-2018 John MacFarlane <jgm@berkeley.edu>
911
@@ -50,8 +52,6 @@ module Text.Pandoc.Extensions ( Extension(..)
5052 , multimarkdownExtensions )
5153where
5254import Prelude
53−import Data.Aeson (FromJSON (..), ToJSON (..), defaultOptions)
54−import Data.Aeson.TH (deriveJSON)
5555import Data.Bits (clearBit, setBit, testBit, (.|.))
5656import Data.Data (Data)
5757import Data.Typeable (Typeable)
@@ -59,8 +59,15 @@ import GHC.Generics (Generic)
5959import Text.Pandoc.Shared (safeRead)
6060import Text.Parsec
6161
62+#ifdef DERIVE_JSON_VIA_TH
63+import Data.Aeson.TH (deriveJSON, defaultOptions)
64+#else
65+import Data.Aeson (FromJSON (..), ToJSON (..),
66+ defaultOptions, genericToEncoding)
67+#endif
68+
6269newtype Extensions = Extensions Integer
63− deriving (Show, Read, Eq, Ord, Data, Typeable, Generic, ToJSON, FromJSON)
70+ deriving (Show, Read, Eq, Ord, Data, Typeable, Generic)
6471
6572instance Semigroup Extensions where
6673 (Extensions a) <> (Extensions b) = Extensions (a .|. b)
@@ -387,4 +394,15 @@ parseFormatSpec = parse formatSpec ""
387394 '-' -> disableExtension ext
388395 _ -> enableExtension ext
389396
397+#ifdef DERIVE_JSON_VIA_TH
390398$(deriveJSON defaultOptions ''Extension)
399+$(deriveJSON defaultOptions ''Extensions)
400+#else
401+instance ToJSON Extension where
402+ toEncoding = genericToEncoding defaultOptions
403+instance FromJSON Extension
404+
405+instance ToJSON Extensions where
406+ toEncoding = genericToEncoding defaultOptions
407+instance FromJSON Extensions
408+#endif
src/Text/Pandoc/Filter.hs+18−3
@@ -1,5 +1,9 @@
1+{-# LANGUAGE CPP #-}
2+{-# LANGUAGE DeriveGeneric #-}
13{-# LANGUAGE NoImplicitPrelude #-}
4+#ifndef AVOID_TEMPLATE_HASKELL
25{-# LANGUAGE TemplateHaskell #-}
6+#endif
37{-
48Copyright (C) 2006-2018 John MacFarlane <jgm@berkeley.edu>
59
@@ -34,9 +38,14 @@ module Text.Pandoc.Filter
3438 ) where
3539
3640import Prelude
37−import Data.Aeson (defaultOptions)
38−import Data.Aeson.TH (deriveJSON)
41+#ifdef AVOID_TEMPLATE_HASKELL
42+import Data.Aeson (FromJSON (..), ToJSON (..),
43+ defaultOptions, genericToEncoding)
44+#else
45+import Data.Aeson.TH (deriveJSON, defaultOptions)
46+#endif
3947import Data.Foldable (foldrM)
48+import GHC.Generics (Generic)
4049import Text.Pandoc.Class (PandocIO)
4150import Text.Pandoc.Definition (Pandoc)
4251import Text.Pandoc.Options (ReaderOptions)
@@ -47,7 +56,7 @@ import qualified Text.Pandoc.Filter.Path as Path
4756-- | Type of filter and path to filter file.
4857data Filter = LuaFilter FilePath
4958 | JSONFilter FilePath
50− deriving (Show)
59+ deriving (Show, Generic)
5160
5261-- | Modify the given document using a filter.
5362applyFilters :: ReaderOptions
@@ -67,4 +76,10 @@ expandFilterPath :: Filter -> PandocIO Filter
6776expandFilterPath (LuaFilter fp) = LuaFilter <$> Path.expandFilterPath fp
6877expandFilterPath (JSONFilter fp) = JSONFilter <$> Path.expandFilterPath fp
6978
79+#ifdef AVOID_TEMPLATE_HASKELL
80+instance ToJSON Filter where
81+ toEncoding = genericToEncoding defaultOptions
82+instance FromJSON Filter
83+#else
7084$(deriveJSON defaultOptions ''Filter)
85+#endif
src/Text/Pandoc/Options.hs+50−3
@@ -1,7 +1,11 @@
1−{-# LANGUAGE NoImplicitPrelude #-}
1+{-# LANGUAGE CPP #-}
22{-# LANGUAGE DeriveDataTypeable #-}
33{-# LANGUAGE DeriveGeneric #-}
4+{-# LANGUAGE NoImplicitPrelude #-}
5+#ifndef AVOID_TEMPLATE_HASKELL
46{-# LANGUAGE TemplateHaskell #-}
7+#endif
8+
59{-
610Copyright (C) 2012-2018 John MacFarlane <jgm@berkeley.edu>
711
@@ -48,8 +52,6 @@ module Text.Pandoc.Options ( module Text.Pandoc.Extensions
4852 , isEnabled
4953 ) where
5054import Prelude
51−import Data.Aeson (defaultOptions)
52−import Data.Aeson.TH (deriveJSON)
5355import Data.Data (Data)
5456import Data.Default
5557import qualified Data.Set as Set
@@ -59,6 +61,13 @@ import Skylighting (SyntaxMap, defaultSyntaxMap)
5961import Text.Pandoc.Extensions
6062import Text.Pandoc.Highlighting (Style, pygments)
6163
64+#ifdef DERIVE_JSON_VIA_TH
65+import Data.Aeson.TH (deriveJSON, defaultOptions)
66+#else
67+import Data.Aeson (FromJSON (..), ToJSON (..),
68+ defaultOptions, genericToEncoding)
69+#endif
70+
6271class HasSyntaxExtensions a where
6372 getExtensions :: a -> Extensions
6473
@@ -239,6 +248,7 @@ instance HasSyntaxExtensions WriterOptions where
239248isEnabled :: HasSyntaxExtensions a => Extension -> a -> Bool
240249isEnabled ext opts = ext `extensionEnabled` getExtensions opts
241250
251+#ifdef DERIVE_JSON_VIA_TH
242252$(deriveJSON defaultOptions ''ReaderOptions)
243253$(deriveJSON defaultOptions ''HTMLMathMethod)
244254$(deriveJSON defaultOptions ''CiteMethod)
@@ -248,3 +258,40 @@ $(deriveJSON defaultOptions ''TrackChanges)
248258$(deriveJSON defaultOptions ''WrapOption)
249259$(deriveJSON defaultOptions ''TopLevelDivision)
250260$(deriveJSON defaultOptions ''ReferenceLocation)
261+#else
262+instance ToJSON CiteMethod where
263+ toEncoding = genericToEncoding defaultOptions
264+instance FromJSON CiteMethod
265+
266+instance ToJSON ReaderOptions where
267+ toEncoding = genericToEncoding defaultOptions
268+instance FromJSON ReaderOptions
269+
270+instance ToJSON ObfuscationMethod where
271+ toEncoding = genericToEncoding defaultOptions
272+instance FromJSON ObfuscationMethod
273+
274+instance ToJSON WrapOption where
275+ toEncoding = genericToEncoding defaultOptions
276+instance FromJSON WrapOption
277+
278+instance ToJSON HTMLMathMethod where
279+ toEncoding = genericToEncoding defaultOptions
280+instance FromJSON HTMLMathMethod
281+
282+instance ToJSON HTMLSlideVariant where
283+ toEncoding = genericToEncoding defaultOptions
284+instance FromJSON HTMLSlideVariant
285+
286+instance ToJSON TopLevelDivision where
287+ toEncoding = genericToEncoding defaultOptions
288+instance FromJSON TopLevelDivision
289+
290+instance ToJSON ReferenceLocation where
291+ toEncoding = genericToEncoding defaultOptions
292+instance FromJSON ReferenceLocation
293+
294+instance ToJSON TrackChanges where
295+ toEncoding = genericToEncoding defaultOptions
296+instance FromJSON TrackChanges
297+#endif