diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Text/Pandoc/Citeproc.hs | 9 | ||||
-rw-r--r-- | src/Text/Pandoc/Citeproc/MetaValue.hs | 29 | ||||
-rw-r--r-- | src/Text/Pandoc/Writers/CslJson.hs | 3 |
3 files changed, 26 insertions, 15 deletions
diff --git a/src/Text/Pandoc/Citeproc.hs b/src/Text/Pandoc/Citeproc.hs index 66b1cf74f..de7f3273f 100644 --- a/src/Text/Pandoc/Citeproc.hs +++ b/src/Text/Pandoc/Citeproc.hs @@ -97,7 +97,8 @@ processCitations (Pandoc meta bs) = do c `Set.member` nocites) refs <- map (linkifyVariables . legacyDateRanges) <$> case lookupMeta "references" meta of - Just (MetaList rs) -> return $ mapMaybe metaValueToReference rs + Just (MetaList rs) -> return $ + mapMaybe (metaValueToReference idpred) rs _ -> case lookupMeta "bibliography" meta of Just (MetaList xs) -> @@ -111,7 +112,8 @@ processCitations (Pandoc meta bs) = do Nothing -> return [] let otherIdsMap = foldr (\ref m -> case T.words . extractText <$> - M.lookup "other-ids" (referenceVariables ref) of + M.lookup "other-ids" + (referenceVariables ref) of Nothing -> m Just ids -> foldr (\id' -> @@ -207,8 +209,7 @@ getRefs locale format idpred raw = (UTF8.toText raw) case lookupMeta "references" meta of Just (MetaList rs) -> - return $ filter (idpred . unItemId . referenceId) - $ mapMaybe metaValueToReference rs + return $ mapMaybe (metaValueToReference idpred) rs _ -> throwError $ PandocAppError "No references field" -- localized quotes diff --git a/src/Text/Pandoc/Citeproc/MetaValue.hs b/src/Text/Pandoc/Citeproc/MetaValue.hs index 1b80c879a..13bba664d 100644 --- a/src/Text/Pandoc/Citeproc/MetaValue.hs +++ b/src/Text/Pandoc/Citeproc/MetaValue.hs @@ -102,18 +102,27 @@ dateToMetaValue date = | otherwise -> printf "%04d" y _ -> mempty -metaValueToReference :: MetaValue -> Maybe (Reference Inlines) -metaValueToReference (MetaMap m) = do +metaValueToReference :: (Text -> Bool) -- ^ predicate on IDs to include + -> MetaValue + -> Maybe (Reference Inlines) +metaValueToReference idpred (MetaMap m) = do let m' = M.mapKeys normalizeKey m id' <- M.lookup "id" m' >>= metaValueToText - type' <- (M.lookup "type" m' >>= metaValueToText) <|> pure "" - let m'' = M.delete "id" $ M.delete "type" m' - let vars = M.mapKeys toVariable $ M.mapWithKey metaValueToVal m'' - return $ Reference { referenceId = ItemId id' - , referenceType = type' - , referenceDisambiguation = Nothing - , referenceVariables = vars } -metaValueToReference _ = Nothing + let mbotherids = + case M.lookup "other-ids" m' of + Just (MetaList xs) -> map metaValueToText xs + _ -> [] + if idpred id' || any (maybe False idpred) mbotherids + then do + type' <- (M.lookup "type" m' >>= metaValueToText) <|> pure "" + let m'' = M.delete "id" $ M.delete "type" m' + let vars = M.mapKeys toVariable $ M.mapWithKey metaValueToVal m'' + return $ Reference { referenceId = ItemId id' + , referenceType = type' + , referenceDisambiguation = Nothing + , referenceVariables = vars } + else Nothing +metaValueToReference _ _ = Nothing metaValueToVal :: Text -> MetaValue -> Val Inlines metaValueToVal k v diff --git a/src/Text/Pandoc/Writers/CslJson.hs b/src/Text/Pandoc/Writers/CslJson.hs index 9f6f2f8ea..4f4fad212 100644 --- a/src/Text/Pandoc/Writers/CslJson.hs +++ b/src/Text/Pandoc/Writers/CslJson.hs @@ -48,7 +48,8 @@ writeCslJson _opts (Pandoc meta _) = do Right l -> return l case lookupMeta "references" meta of Just (MetaList rs) -> return $ (UTF8.toText $ - toCslJson locale (mapMaybe metaValueToReference rs)) <> "\n" + toCslJson locale (mapMaybe (metaValueToReference (const True)) rs)) + <> "\n" _ -> throwError $ PandocAppError "No references field" fromInlines :: [Inline] -> CslJson Text |