@@ -53,7 +53,9 @@ import Network.HTTP (simpleHTTP, mkRequest, getResponseBody, RequestMethod(..))
5353import Network.URI (parseURI, isURI, URI(..))
5454import qualified Data.ByteString.Lazy as B
5555import Data.ByteString.Lazy.UTF8 (toString )
56+import Text.HTML.TagSoup.Entity (lookupEntity)
5657import Codec.Binary.UTF8.String (decodeString, encodeString)
58+import Text.CSL.Reference (Reference(..))
5759
5860copyrightMessage :: String
5961copyrightMessage = "\nCopyright (C) 2006-2011 John MacFarlane\n" ++
@@ -617,6 +619,18 @@ options =
617619 "" -- "Show help"
618620 ]
619621
622+-- Unescapes XML entities
623+deEntity :: String -> String
624+deEntity ('&':xs) =
625+ case lookupEntity ent of
626+ Just c -> c : deEntity rest
627+ Nothing -> '&' : deEntity rest
628+ where (ent, rest) = case break (==';') xs of
629+ (zs,';':ys) -> (zs,ys)
630+ (zs,ys) -> (zs,ys)
631+deEntity (x:xs) = x : deEntity xs
632+deEntity [] = []
633+
620634-- Returns usage message
621635usageMessage :: String -> [OptDescr (Opt -> IO Opt)] -> String
622636usageMessage programName = usageInfo
@@ -821,10 +835,15 @@ main = do
821835 return $ ("dzslides-core", dzcore) : variables'
822836 _ -> return variables'
823837
838+ -- unescape reference ids, which may contain XML entities, so
839+ -- that we can do lookups with regular string equality
840+ let unescapeRefId ref = ref{ refId = deEntity (refId ref) }
841+
824842 refs <- mapM (\f -> catch (CSL.readBiblioFile f) $ \e -> do
825843 UTF8.hPutStrLn stderr $ "Error reading bibliography `" ++ f ++ "'"
826844 UTF8.hPutStrLn stderr $ show e
827− exitWith (ExitFailure 23)) reffiles >>= \rs -> return $ concat rs
845+ exitWith (ExitFailure 23)) reffiles >>=
846+ return . map unescapeRefId . concat
828847
829848 let sourceDir = if null sources
830849 then "."