From 9ef8650612dc6e9f375c5ab5203faf68fa4bb27a Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Thu, 3 Feb 2022 16:04:15 -0800 Subject: [PATCH] Docx reader: Parse CSL JSON in Zotero addin. This gives us what we ned for #7840, except adding to the references in metadata. --- src/Text/Pandoc/Readers/Docx.hs | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Text/Pandoc/Readers/Docx.hs b/src/Text/Pandoc/Readers/Docx.hs index 10a5aee8d..169f52b31 100644 --- a/src/Text/Pandoc/Readers/Docx.hs +++ b/src/Text/Pandoc/Readers/Docx.hs @@ -72,7 +72,8 @@ import Data.Maybe (catMaybes, isJust, fromMaybe) import Data.Sequence (ViewL (..), viewl) import qualified Data.Sequence as Seq import qualified Data.Set as Set -import Citeproc (ItemId(..), Reference(..)) +import Citeproc (ItemId(..), Reference(..), CitationItem(..), + Citation(citationItems)) import Text.Pandoc.Builder as Pandoc import Text.Pandoc.MediaBag (MediaBag) import Text.Pandoc.Options @@ -88,6 +89,9 @@ import qualified Text.Pandoc.Class.PandocMonad as P import Text.Pandoc.Error import Text.Pandoc.Logging import Data.List.NonEmpty (nonEmpty) +import Data.Aeson (eitherDecode) +import qualified Data.Text.Lazy as TL +import Text.Pandoc.UTF8 (fromTextLazy) readDocx :: PandocMonad m => ReaderOptions @@ -452,10 +456,27 @@ parPartToInlines' (Field info children) = case info of HyperlinkField url -> parPartToInlines' $ ExternalHyperLink url children PagerefField fieldAnchor True -> parPartToInlines' $ InternalHyperLink fieldAnchor children - ZoteroItem _t -> do + ZoteroItem t -> do formattedCite <- smushInlines <$> mapM parPartToInlines' children - let citations = [] -- TODO parse Citation from t - return $ cite citations formattedCite + let bs = fromTextLazy $ TL.fromStrict t + case eitherDecode bs of + Left _err -> return formattedCite + Right citation -> do + let toPandocCitation item = + Citation{ citationId = unItemId (citationItemId item) + , citationPrefix = maybe [] (toList . text) $ + citationItemPrefix item + , citationSuffix = (toList . text) $ + maybe mempty (<> " ") + (citationItemLabel item) <> + maybe mempty (<> " ") + (citationItemLocator item) <> + maybe mempty id (citationItemSuffix item) + , citationMode = NormalCitation -- TODO for now + , citationNoteNum = 0 + , citationHash = 0 } + let cs = map toPandocCitation $ citationItems citation + return $ cite cs formattedCite _ -> smushInlines <$> mapM parPartToInlines' children isAnchorSpan :: Inline -> Bool