git.iko.soy/typeable/pandoc
on master help sign in
Add filtering to metaValueToReference, and check other-ids field too.
commit128991d4a43238cc92febd167b8babf38649f6e2 authorJohn MacFarlane <jgm@berkeley.edu> dateMon 5 Oct 2020, 16:35 (6 years ago) parent68454e0
3 files changed+26−15
src/Text/Pandoc/Citeproc.hs+5−4 src/Text/Pandoc/Citeproc/MetaValue.hs+19−10 src/Text/Pandoc/Writers/CslJson.hs+2−1
src/Text/Pandoc/Citeproc.hs+5−4
@@ -97,7 +97,8 @@ processCitations (Pandoc meta bs) = do
9797 c `Set.member` nocites)
9898 refs <- map (linkifyVariables . legacyDateRanges) <$>
9999 case lookupMeta "references" meta of
100− Just (MetaList rs) -> return $ mapMaybe metaValueToReference rs
100+ Just (MetaList rs) -> return $
101+ mapMaybe (metaValueToReference idpred) rs
101102 _ ->
102103 case lookupMeta "bibliography" meta of
103104 Just (MetaList xs) ->
@@ -111,7 +112,8 @@ processCitations (Pandoc meta bs) = do
111112 Nothing -> return []
112113 let otherIdsMap = foldr (\ref m ->
113114 case T.words . extractText <$>
114− M.lookup "other-ids" (referenceVariables ref) of
115+ M.lookup "other-ids"
116+ (referenceVariables ref) of
115117 Nothing -> m
116118 Just ids -> foldr
117119 (\id' ->
@@ -207,8 +209,7 @@ getRefs locale format idpred raw =
207209 (UTF8.toText raw)
208210 case lookupMeta "references" meta of
209211 Just (MetaList rs) ->
210− return $ filter (idpred . unItemId . referenceId)
211− $ mapMaybe metaValueToReference rs
212+ return $ mapMaybe (metaValueToReference idpred) rs
212213 _ -> throwError $ PandocAppError "No references field"
213214
214215-- localized quotes
src/Text/Pandoc/Citeproc/MetaValue.hs+19−10
@@ -102,18 +102,27 @@ dateToMetaValue date =
102102 | otherwise -> printf "%04d" y
103103 _ -> mempty
104104
105−metaValueToReference :: MetaValue -> Maybe (Reference Inlines)
106−metaValueToReference (MetaMap m) = do
105+metaValueToReference :: (Text -> Bool) -- ^ predicate on IDs to include
106+ -> MetaValue
107+ -> Maybe (Reference Inlines)
108+metaValueToReference idpred (MetaMap m) = do
107109 let m' = M.mapKeys normalizeKey m
108110 id' <- M.lookup "id" m' >>= metaValueToText
109− type' <- (M.lookup "type" m' >>= metaValueToText) <|> pure ""
110− let m'' = M.delete "id" $ M.delete "type" m'
111− let vars = M.mapKeys toVariable $ M.mapWithKey metaValueToVal m''
112− return $ Reference { referenceId = ItemId id'
113− , referenceType = type'
114− , referenceDisambiguation = Nothing
115− , referenceVariables = vars }
116−metaValueToReference _ = Nothing
111+ let mbotherids =
112+ case M.lookup "other-ids" m' of
113+ Just (MetaList xs) -> map metaValueToText xs
114+ _ -> []
115+ if idpred id' || any (maybe False idpred) mbotherids
116+ then do
117+ type' <- (M.lookup "type" m' >>= metaValueToText) <|> pure ""
118+ let m'' = M.delete "id" $ M.delete "type" m'
119+ let vars = M.mapKeys toVariable $ M.mapWithKey metaValueToVal m''
120+ return $ Reference { referenceId = ItemId id'
121+ , referenceType = type'
122+ , referenceDisambiguation = Nothing
123+ , referenceVariables = vars }
124+ else Nothing
125+metaValueToReference _ _ = Nothing
117126
118127metaValueToVal :: Text -> MetaValue -> Val Inlines
119128metaValueToVal k v
src/Text/Pandoc/Writers/CslJson.hs+2−1
@@ -48,7 +48,8 @@ writeCslJson _opts (Pandoc meta _) = do
4848 Right l -> return l
4949 case lookupMeta "references" meta of
5050 Just (MetaList rs) -> return $ (UTF8.toText $
51− toCslJson locale (mapMaybe metaValueToReference rs)) <> "\n"
51+ toCslJson locale (mapMaybe (metaValueToReference (const True)) rs))
52+ <> "\n"
5253 _ -> throwError $ PandocAppError "No references field"
5354
5455fromInlines :: [Inline] -> CslJson Text