git.iko.soy/typeable/pandoc
on master help sign in
Writers.Shared.metaValueToJSON: use Number Values for integers.

Pandoc's MetaValue doesn't have a distinguished number type, so numbers are put in MetaStrings. If the MetaString consists entirely of digits, we convert it to a Number. We should probably consider adding a MetaNumber constructor to MetaValue, for better round-tripping with JSON etc. This change aids round-tripping in ipynb metadata fields, like `toc_depth`.

commit6157f7ec4f549f5db3406f86cb37d6047d2483fc authorJohn MacFarlane <jgm@berkeley.edu> dateWed 27 Mar 2019, 17:11 (8 years ago) parent2138ef8
1 file changed+9−4
src/Text/Pandoc/Writers/Shared.hs+9−4
src/Text/Pandoc/Writers/Shared.hs+9−4
@@ -36,9 +36,10 @@ module Text.Pandoc.Writers.Shared (
3636where
3737import Prelude
3838import Control.Monad (zipWithM)
39+import qualified Data.Aeson as Aeson
3940import Data.Aeson (FromJSON (..), Result (..), ToJSON (..), Value (Object),
4041 encode, fromJSON)
41−import Data.Char (chr, ord, isSpace)
42+import Data.Char (chr, ord, isSpace, isDigit)
4243import qualified Data.HashMap.Strict as H
4344import Data.List (groupBy, intersperse, transpose)
4445import qualified Data.Map as M
@@ -49,7 +50,8 @@ import qualified Text.Pandoc.Builder as Builder
4950import Text.Pandoc.Definition
5051import Text.Pandoc.Options
5152import Text.Pandoc.Pretty
52−import Text.Pandoc.Shared (stringify, hierarchicalize, Element(..), deNote)
53+import Text.Pandoc.Shared (stringify, hierarchicalize, Element(..), deNote,
54+ safeRead)
5355import Text.Pandoc.Walk (walk)
5456import Text.Pandoc.UTF8 (toStringLazy)
5557import Text.Pandoc.XML (escapeStringForXML)
@@ -105,8 +107,11 @@ metaValueToJSON blockWriter inlineWriter (MetaMap metamap) = toJSON <$>
105107metaValueToJSON blockWriter inlineWriter (MetaList xs) = toJSON <$>
106108 Traversable.mapM (metaValueToJSON blockWriter inlineWriter) xs
107109metaValueToJSON _ _ (MetaBool b) = return $ toJSON b
108−metaValueToJSON _ inlineWriter (MetaString s) = toJSON <$>
109− inlineWriter (Builder.toList (Builder.text s))
110+metaValueToJSON _ inlineWriter (MetaString s) =
111+ if all isDigit s
112+ then return $
113+ maybe (Aeson.String . T.pack $ s) Aeson.Number $ safeRead s
114+ else toJSON <$> inlineWriter (Builder.toList (Builder.text s))
110115metaValueToJSON blockWriter _ (MetaBlocks bs) = toJSON <$> blockWriter bs
111116metaValueToJSON _ inlineWriter (MetaInlines is) = toJSON <$> inlineWriter is
112117