pandoc-citeproc 0.16.3.1 → 0.16.4
raw patch · 23 files changed
+278/−273 lines, 23 filesdep ~pandocdep ~pandoc-typesdep ~rfc5051
Dependency ranges changed: pandoc, pandoc-types, rfc5051
Files
- README.md +4/−0
- changelog +16/−0
- compat/Text/CSL/Compat/Pandoc.hs +2/−50
- man/man1/pandoc-citeproc.1 +26/−21
- pandoc-citeproc.cabal +10/−10
- pandoc-citeproc.hs +2/−1
- src/Text/CSL/Eval.hs +18/−16
- src/Text/CSL/Eval/Common.hs +2/−1
- src/Text/CSL/Eval/Date.hs +3/−1
- src/Text/CSL/Eval/Names.hs +9/−6
- src/Text/CSL/Eval/Output.hs +11/−10
- src/Text/CSL/Input/Bibtex.hs +25/−22
- src/Text/CSL/Input/Bibutils.hs +2/−1
- src/Text/CSL/Output/Pandoc.hs +13/−9
- src/Text/CSL/Pandoc.hs +34/−33
- src/Text/CSL/Parser.hs +1/−1
- src/Text/CSL/Proc.hs +3/−1
- src/Text/CSL/Proc/Collapse.hs +7/−4
- src/Text/CSL/Reference.hs +10/−10
- src/Text/CSL/Style.hs +4/−3
- src/Text/CSL/Util.hs +70/−67
- stack.yaml +5/−5
- tests/test-citeproc.hs +1/−1
README.md view
@@ -1,6 +1,10 @@ pandoc-citeproc =============== +[](https://github.com/jgm/pandoc-citeproc/actions)++ This package provides a library and executable to facilitate the use of citeproc with pandoc 1.12 and greater. (Earlier versions of pandoc have integrated citeproc support.)
changelog view
@@ -1,3 +1,19 @@+pandoc-citeproc (0.16.4)++ * Simplify compat since we now require pandoc >= 2.8.+ * Update man page. Clarify that `reference-section-title` doesn't have any+ effect when an explicit Div is used (#424).+ * Qualify fail with Prelude to fix compiler warnings.+ * Disable `raw_attribute` extension when writing Markdown.+ This way we avoid e.g. `<i>{=html}` in the CSL export.+ * Use pandoc-types 1.20. Note that this change removes+ the ability to compile pandoc-citeproc with+ older versions of pandoc (< 2.8).+ * Incorporate the switch to Text in the dependencies (Christian+ Despres). The changes to the structure of the code are fairly minimal.+ None of the types have changed, requiring a reasonable amount of+ packing, unpacking, and view patterns.+ pandoc-citeproc (0.16.3.1) * Fix how LANG is set for bibtex conversion.
compat/Text/CSL/Compat/Pandoc.hs view
@@ -20,12 +20,9 @@ import Data.ByteString as B import Text.Pandoc (Pandoc, ReaderOptions(..), def, WrapOption(..), WriterOptions(..))-#if MIN_VERSION_pandoc(1,19,0) import Text.Pandoc (Extension(..), pandocExtensions)-#endif import qualified Text.Pandoc as Pandoc import qualified Text.Pandoc.Process-#if MIN_VERSION_pandoc(2,0,0) import qualified Data.Text as T import Text.Pandoc.MIME (MimeType) import Text.Pandoc.Error (PandocError)@@ -33,18 +30,10 @@ import qualified Text.Pandoc.Class (fetchItem) import Control.Monad.Except (runExceptT, lift) import Text.Pandoc.Extensions (extensionsFromList, disableExtension)-#else-import Data.Set as Set-import System.IO (stderr)-import qualified Text.Pandoc.Shared (fetchItem) -type MimeType = String-#endif- readHtml, readLaTeX, readMarkdown, readNative :: String -> Pandoc writeMarkdown, writePlain, writeNative, writeHtmlString :: Pandoc -> String -#if MIN_VERSION_pandoc(2,0,0) readHtml = either mempty id . runPure . Pandoc.readHtml def{ readerExtensions = extensionsFromList [Ext_native_divs, Ext_native_spans, Ext_raw_html, Ext_smart] } .@@ -63,6 +52,7 @@ writeMarkdown = either mempty T.unpack . runPure . Pandoc.writeMarkdown def{ writerExtensions = disableExtension Ext_smart $ disableExtension Ext_bracketed_spans $+ disableExtension Ext_raw_attribute $ pandocExtensions, writerWrapText = WrapNone } @@ -75,53 +65,15 @@ [Ext_native_divs, Ext_native_spans, Ext_raw_html], writerWrapText = WrapPreserve } -#else-readHtml = either mempty id . Pandoc.readHtml- def{ readerSmart = True, readerParseRaw = True }--readMarkdown = either mempty id . Pandoc.readMarkdown- def{ readerSmart = True, readerStandalone = True}--readLaTeX = either mempty id . Pandoc.readLaTeX- def{ readerSmart = True, readerParseRaw = True }--readNative = either mempty id . Pandoc.readNative--writeMarkdown = Pandoc.writeMarkdown def{- writerWrapText = WrapNone- , writerColumns = 72-#if MIN_VERSION_pandoc(1,19,0)- , writerExtensions = Set.delete Ext_bracketed_spans pandocExtensions-#endif- }--writePlain = Pandoc.writePlain def--writeNative = Pandoc.writeNative def{ writerTemplate = Just mempty }--writeHtmlString = Pandoc.writeHtmlString def-#endif- pipeProcess :: Maybe [(String, String)] -> FilePath -> [String] -> BL.ByteString -> IO (ExitCode,BL.ByteString)-#if MIN_VERSION_pandoc(2,0,0) pipeProcess = Text.Pandoc.Process.pipeProcess-#else-pipeProcess e f a b = do- (ec, out, err) <- Text.Pandoc.Process.pipeProcess e f a b- BL.hPutStr stderr err- return (ec, out)-#endif fetchItem :: String -> IO (Either E.SomeException (B.ByteString, Maybe MimeType))-#if MIN_VERSION_pandoc(2,0,0) fetchItem s = do- res <- runIO $ runExceptT $ lift $ Text.Pandoc.Class.fetchItem s+ res <- runIO $ runExceptT $ lift $ Text.Pandoc.Class.fetchItem $ T.pack s return $ case res of Left e -> Left (E.toException e) Right (Left (e :: PandocError)) -> Left (E.toException e) Right (Right r) -> Right r-#else-fetchItem = Text.Pandoc.Shared.fetchItem Nothing-#endif
man/man1/pandoc-citeproc.1 view
@@ -1,7 +1,7 @@ .\"t-.\" Automatically generated by Pandoc 2.7.1+.\" Automatically generated by Pandoc 2.8 .\"-.TH "pandoc-citeproc" "1" "2019-03-26" "pandoc-citeproc 0.16.1.3" ""+.TH "pandoc-citeproc" "1" "2019-11-19" "pandoc-citeproc 0.16.3.1" "" .hy .SH NAME .PP@@ -24,8 +24,11 @@ If no such Div exists, one will be created and appended to the end of the document (unless the \f[C]suppress-bibliography\f[R] metadata field is set to a true value).+If the CSL style species hanging indent, the class+\f[C]hanging-indent\f[R] will be added to this Div. If you wish the bibliography to have a section header, put the section-header at the end of your document.+header at the end of your document (or at the beginning of the Div with+id \f[C]refs\f[R], if there is one). (See the \f[C]pandoc\f[R] (1) man page under \[lq]Citations\[rq] for details on how to encode citations in pandoc\[cq]s markdown.) .PP@@ -44,7 +47,7 @@ \f[C]--metadata-file\f[R], and \f[C]Extension: yaml_metadata_block\f[R].) .TP-.B \f[C]bibliography\f[R]+\f[B]\f[CB]bibliography\f[B]\f[R] A path, or YAML list of paths, of bibliography files to use. These may be in any of the formats supported by bibutils. .RS@@ -124,7 +127,7 @@ BibLaTeX files, but you can use \f[C].bibtex\f[R] to force BibTeX. .RE .TP-.B \f[C]references\f[R]+\f[B]\f[CB]references\f[B]\f[R] A YAML list of references. Each reference is a YAML object. The format is essentially CSL JSON format.@@ -153,7 +156,7 @@ Simple tex math will also be parsed and rendered appropriately. .RE .TP-.B \f[C]csl\f[R] or \f[C]citation-style\f[R]+\f[B]\f[CB]csl\f[B]\f[R] or \f[B]\f[CB]citation-style\f[B]\f[R] Path or URL of a CSL style file. If the file is not found relative to the working directory, pandoc-citeproc will look in the \f[C]$HOME/.csl\f[R] directory (or@@ -164,12 +167,12 @@ use \f[C]chicago-author-date.csl\f[R], looking first in \f[C]$HOME/.csl\f[R] and then in its own data files. .TP-.B \f[C]link-citations\f[R]+\f[B]\f[CB]link-citations\f[B]\f[R] If this has a true value, citations in author-date and numerical styles will be hyperlinked to their corresponding bibliography entries. The default is not to add hyperlinks. .TP-.B \f[C]citation-abbreviations\f[R]+\f[B]\f[CB]citation-abbreviations\f[B]\f[R] Path to a CSL abbreviations JSON file. If the file is not found relative to the working directory, pandoc-citeproc will look in the \f[C]$HOME/.csl\f[R] directory (or@@ -198,7 +201,7 @@ .fi .RE .TP-.B \f[C]lang\f[R]+\f[B]\f[CB]lang\f[B]\f[R] Locale to use in formatting citations. If this is not set, the locale is taken from the \f[C]default-locale\f[R] attribute of the CSL file.@@ -208,20 +211,22 @@ instead of \f[C]lang\f[R], but this \f[C]lang\f[R] should be used going forward.) .TP-.B \f[C]suppress-bibliography\f[R]+\f[B]\f[CB]suppress-bibliography\f[B]\f[R] If this has a true value, the bibliography will be left off. Otherwise a bibliography will be inserted into each Div element with id \f[C]refs\f[R]. If there is no such Div, one will be created at the end of the document. .TP-.B \f[C]reference-section-title\f[R]+\f[B]\f[CB]reference-section-title\f[B]\f[R] If this has a value, a section header with this title will be added before the bibliography. If \f[C]reference-section-title\f[R] is not specified and the document ends with a section header, this final header will be treated as the bibliography header.+Note: \f[C]reference-section-title\f[R] has no effect when the+bibliography is placed explicitly using a Div with id \f[C]refs\f[R]. .TP-.B \f[C]notes-after-punctuation\f[R]+\f[B]\f[CB]notes-after-punctuation\f[B]\f[R] If true (the default), pandoc will put footnote citations after following punctuation. For example, if the source contains \f[C]blah blah [\[at]jones99].\f[R],@@ -270,42 +275,42 @@ CSL implementations. .SH OPTIONS .TP-.B \f[C]-y, --bib2yaml\f[R]+\f[B]\f[CB]-y, --bib2yaml\f[B]\f[R] Convert bibliography to YAML suitable for inclusion in pandoc metadata. .TP-.B \f[C]-j, --bib2json\f[R]+\f[B]\f[CB]-j, --bib2json\f[B]\f[R] Convert bibliography to CSL JSON suitable for import into Zotero. .TP-.B \f[C]-f\f[R] \f[I]FORMAT\f[R], \f[C]--format=\f[R]\f[I]FORMAT\f[R]+\f[B]\f[CB]-f\f[B]\f[R] \f[I]FORMAT\f[R], \f[B]\f[CB]--format=\f[B]\f[R]\f[I]FORMAT\f[R] Specify format of bibliography to be converted. Legal values are \f[C]biblatex\f[R], \f[C]bibtex\f[R], \f[C]ris\f[R], \f[C]endnote\f[R], \f[C]endnotexml\f[R], \f[C]isi\f[R], \f[C]medline\f[R], \f[C]copac\f[R], \f[C]mods\f[R], \f[C]nbib\f[R], and \f[C]json\f[R]. .TP-.B \f[C]-c\f[R] \f[I]NUMBER\f[R], \f[C]--columns=\f[R]\f[I]NUMBER\f[R]+\f[B]\f[CB]-c\f[B]\f[R] \f[I]NUMBER\f[R], \f[B]\f[CB]--columns=\f[B]\f[R]\f[I]NUMBER\f[R] Specify column to which to wrap YAML output produced using \f[C]--bib2yaml\f[R]. Default is 80. To disable wrapping, set 0. .TP-.B \f[C]-h, --help\f[R]+\f[B]\f[CB]-h, --help\f[B]\f[R] Print usage information. .TP-.B \f[C]--man\f[R]+\f[B]\f[CB]--man\f[B]\f[R] Print the man page in groff man format. To get a plain text version, \f[C]pandoc-citeproc --man | groff -mman -Tutf8\f[R]. To get an HTML version, \f[C]pandoc-citeproc --man | groff -mman -Thtml\f[R]. .TP-.B \f[C]--license\f[R]+\f[B]\f[CB]--license\f[B]\f[R] Print the license. .TP-.B \f[C]-q, --quiet\f[R]+\f[B]\f[CB]-q, --quiet\f[B]\f[R] Silence all warnings. .TP-.B \f[C]-V, --version\f[R]+\f[B]\f[CB]-V, --version\f[B]\f[R] Print version. .SH NOTES .SS General
pandoc-citeproc.cabal view
@@ -1,5 +1,5 @@ name: pandoc-citeproc-version: 0.16.3.1+version: 0.16.4 cabal-version: 1.12 synopsis: Supports using pandoc with citeproc @@ -19,7 +19,7 @@ homepage: https://github.com/jgm/pandoc-citeproc category: Text-tested-with: GHC == 8.0.1, GHC == 8.2.2, GHC == 8.4.3+tested-with: GHC == 8.0.1, GHC == 8.2.2, GHC == 8.4.3, GHC == 8.6.3 license: BSD3 license-file: LICENSE author: John MacFarlane, Andrea Rossato@@ -110,8 +110,8 @@ mtl, bytestring, filepath, network < 3.2,- pandoc-types >= 1.17.3 && < 1.18,- pandoc >= 1.16 && < 2.9,+ pandoc-types >= 1.20 && < 1.21,+ pandoc >= 2.8 && < 2.9, tagsoup, aeson >= 0.7 && < 1.5, text,@@ -160,8 +160,8 @@ ghc-prof-options: -fprof-auto-exported -rtsopts build-depends: base >= 4 && < 5, pandoc-citeproc,- pandoc-types >= 1.17.3 && < 1.18,- pandoc >= 1.16 && < 2.9,+ pandoc-types >= 1.20 && < 1.21,+ pandoc >= 2.8 && < 2.9, aeson, aeson-pretty >= 0.8, yaml >= 0.11,@@ -201,8 +201,8 @@ directory, text, mtl,- pandoc-types >= 1.17.3 && < 1.18,- pandoc >= 1.16 && < 2.9,+ pandoc-types >= 1.20 && < 1.21,+ pandoc >= 2.8 && < 2.9, filepath, bytestring, process,@@ -231,9 +231,9 @@ aeson, directory, text,- pandoc-types >= 1.17.3 && < 1.18,+ pandoc-types >= 1.20 && < 1.21, mtl,- pandoc >= 1.16 && < 2.9,+ pandoc >= 2.8 && < 2.9, filepath, containers, bytestring,
pandoc-citeproc.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} module Main where import Prelude@@ -135,7 +136,7 @@ findWarnings :: Inline -> [String] findWarnings (Span (_,["citeproc-not-found"],[("data-reference-id",ref)]) _) =- ["pandoc-citeproc: reference " ++ ref ++ " not found" | ref /= "*"]+ ["pandoc-citeproc: reference " ++ T.unpack ref ++ " not found" | ref /= "*"] findWarnings (Span (_,["citeproc-no-output"],_) _) = ["pandoc-citeproc: reference with no printed form"] findWarnings _ = []
src/Text/CSL/Eval.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE PatternGuards #-} {-# LANGUAGE LambdaCase #-}@@ -98,6 +99,7 @@ | Ascending {} <- c = Ascending s | otherwise = Descending s + unsetOpts :: (String, String) -> (String, String) unsetOpts ("et-al-min" ,_) = ("et-al-min" ,"") unsetOpts ("et-al-use-first" ,_) = ("et-al-use-first" ,"") unsetOpts ("et-al-subsequent-min" ,_) = ("et-al-subsequent-min","")@@ -226,7 +228,7 @@ case map toLower s of "first-reference-note-number" -> do refid <- getStringVar "ref-id"- return [Output [OPan [Span ("",["first-reference-note-number"],[("refid",refid)]) [Str "0"]]] fm]+ return [Output [OPan [Span ("",["first-reference-note-number"],[("refid",T.pack refid)]) [Str "0"]]] fm] "year-suffix" -> getStringVar "ref-id" >>= \k -> return . return $ OYearSuf [] k [] fm@@ -239,7 +241,7 @@ "page" -> getStringVar "page" >>= formatRange fm "locator" -> getLocVar >>= formatRange fm . snd "url" -> getStringVar "url" >>= \k ->- if null k then return [] else return [Output [OPan [Link nullAttr [Str k] (escapeURI k,"")]] fm]+ if null k then return [] else return [Output [OPan [Link nullAttr [Str $ T.pack k] (escapeURI $ T.pack k,"")]] fm] "doi" -> do d <- getStringVar "doi" let (prefixPart, linkPart) = T.breakOn (T.pack "http") (T.pack (prefix fm)) let u = if T.null linkPart@@ -247,20 +249,20 @@ else T.unpack linkPart ++ d if null d then return []- else return [Output [OPan [Link nullAttr [Str (T.unpack linkPart ++ d)] (escapeURI u, "")]]+ else return [Output [OPan [Link nullAttr [Str (linkPart <> T.pack d)] (escapeURI $ T.pack u, "")]] fm{ prefix = T.unpack prefixPart, suffix = suffix fm }] "isbn" -> getStringVar "isbn" >>= \d -> if null d then return []- else return [Output [OPan [Link nullAttr [Str d] ("https://worldcat.org/isbn/" ++ escapeURI d, "")]] fm]+ else return [Output [OPan [Link nullAttr [Str $ T.pack d] ("https://worldcat.org/isbn/" <> escapeURI (T.pack d), "")]] fm] "pmid" -> getStringVar "pmid" >>= \d -> if null d then return []- else return [Output [OPan [Link nullAttr [Str d] ("https://www.ncbi.nlm.nih.gov/pubmed/" ++ escapeURI d, "")]] fm]+ else return [Output [OPan [Link nullAttr [Str $ T.pack d] ("https://www.ncbi.nlm.nih.gov/pubmed/" <> escapeURI (T.pack d), "")]] fm] "pmcid" -> getStringVar "pmcid" >>= \d -> if null d then return []- else return [Output [OPan [Link nullAttr [Str d] ("https://www.ncbi.nlm.nih.gov/pmc/articles/" ++ escapeURI d, "")]] fm]+ else return [Output [OPan [Link nullAttr [Str $ T.pack d] ("https://www.ncbi.nlm.nih.gov/pmc/articles/" <> escapeURI (T.pack d), "")]] fm] _ -> do (opts, as) <- gets (env >>> options &&& abbrevs) r <- getVar [] (getFormattedValue opts as f fm s) s@@ -315,7 +317,7 @@ | Just (Formatted v) <- fromValue val :: Maybe Formatted = case v of [] -> []- _ -> case maybe v (unFormatted . fromString) $ getAbbr (stringify v) of+ _ -> case maybe v (unFormatted . fromString) $ getAbbr (T.unpack $ stringify v) of [] -> [] ys -> [Output [(if s == "status" then OStatus@@ -341,7 +343,7 @@ | otherwise = [] where value = if stripPeriods fm then filter (/= '.') else id- value' (Str x) = Str (value x)+ value' (Str x) = Str $ T.pack $ value $ T.unpack x value' x = x getAbbr v = if f == Short then case getAbbreviation as s v of@@ -379,7 +381,7 @@ checkRange' ts = if v == "page" then checkRange ts else id process ts = checkRange' ts . printNumStr . map (renderNumber ts) . breakNumericString . words- renderNumber ts x = if isTransNumber x then format ts x else x+ renderNumber ts x = if isTransNumber x then format ts (T.pack x) else x format tm = case f of Ordinal -> maybe "" (ordinal tm v) . safeRead@@ -387,7 +389,7 @@ Roman -> maybe "" (\x -> if x < 6000 then roman x else show x) . safeRead- _ -> maybe "" show . (safeRead :: String -> Maybe Int)+ _ -> maybe "" show . (safeRead :: T.Text -> Maybe Int) roman :: Int -> String roman = concat . reverse . zipWith (!!) romanList .@@ -424,10 +426,10 @@ isTransNumber, isSpecialChar,isNumber :: String -> Bool isTransNumber = all isDigit-isSpecialChar = all (`elem` "&-,.\x2013")+isSpecialChar = all (`elem` ("&-,.\x2013" :: String)) isNumber cs = case [c | c <- cs , not (isLetter c)- , c `notElem` "&-.,\x2013"] of+ , c `notElem` ("&-.,\x2013" :: String)] of [] -> False xs -> all isDigit xs @@ -435,10 +437,10 @@ breakNumericString [] = [] breakNumericString (x:xs) | isTransNumber x = x : breakNumericString xs- | otherwise = let (a,b) = break (`elem` "&-\x2013,") x+ | otherwise = let (a,b) = break (`elem` ("&-\x2013," :: String)) x (c,d) = if null b then ("","")- else span (`elem` "&-\x2013,") b+ else span (`elem` ("&-\x2013," :: String)) b in filter (/= []) $ a : c : breakNumericString (d : xs) formatRange :: Formatting -> String -> State EvalState [Output]@@ -473,7 +475,7 @@ expandedRange (sa, []) = (sa,[]) expandedRange (sa, sb) | length sb < length sa =- case (safeRead sa, safeRead sb) of+ case (safeRead (T.pack sa), safeRead (T.pack sb)) of -- check to make sure we have regular numbers (Just (_ :: Int), Just (_ :: Int)) -> (sa, take (length sa - length sb) sa ++ sb)@@ -503,7 +505,7 @@ -- 1496-1504 chicagoRange :: (String, String) -> (String, String) chicagoRange (sa, sb)- = case (safeRead sa :: Maybe Int) of+ = case (safeRead (T.pack sa) :: Maybe Int) of Just n | n < 100 -> expandedRange (sa, sb) | n `mod` 100 == 0 -> expandedRange (sa, sb) | n >= 1000 -> let (sa', sb') = minimalRange 1 (sa, sb)
src/Text/CSL/Eval/Common.hs view
@@ -26,6 +26,7 @@ import Data.List (elemIndex) import qualified Data.Map as M import Data.Maybe+import qualified Data.Text as T import Text.CSL.Reference import Text.CSL.Style@@ -125,7 +126,7 @@ -- but need a String. This is currently needed for "page". It's a bit -- hackish; we should probably change the type in Reference for -- page to String.- case fromValue val `mplus` ((stringify . unFormatted) `fmap` fromValue val)+ case fromValue val `mplus` ((T.unpack . stringify . unFormatted) `fmap` fromValue val) `mplus` (unLiteral `fmap` fromValue val) of Just v -> v Nothing -> Debug.Trace.trace ("Expecting string value, got " ++
src/Text/CSL/Eval/Date.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PatternGuards #-} ----------------------------------------------------------------------------- -- |@@ -23,6 +24,7 @@ import Data.List import Data.List.Split import Data.Maybe (fromMaybe, isNothing)+import qualified Data.Text as T import Text.CSL.Exception import Text.CSL.Eval.Common@@ -144,7 +146,7 @@ | null (concat o1 ++ concat o2) = [] | otherwise = o1 ++ (case dpRangeDelim <$> last' xs of ["-"] -> [[OPan [Str "\x2013"]]]- [s] -> [[OPan [Str s]]]+ [s] -> [[OPan [Str $ T.pack s]]] _ -> []) ++ o2 formatYear f y
src/Text/CSL/Eval/Names.hs view
@@ -1,4 +1,6 @@ {-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ViewPatterns #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE PatternGuards #-} -----------------------------------------------------------------------------@@ -23,6 +25,7 @@ import Data.List (intersperse, nub) import Data.List.Split (wordsBy) import Data.Maybe (isJust)+import qualified Data.Text as T import Text.CSL.Eval.Common import Text.CSL.Eval.Output@@ -261,25 +264,25 @@ if getOptionVal "initialize-with-hyphen" ops == "false" then new ++ accum else trimsp new ++ [Str "-"] ++ accum- isInit [Str [c]] = isUpper c+ isInit [Str (T.unpack -> [c])] = isUpper c isInit _ = False initial (Formatted x) = case lookup "initialize-with" ops of Just iw | getOptionVal "initialize" ops == "false"- , isInit x -> addIn x $ B.toList $ B.text iw+ , isInit x -> addIn x $ B.toList $ B.text $ T.pack iw | getOptionVal "initialize" ops /= "false"- , not (all isLower $ query (:[]) x) -> addIn x $ B.toList $ B.text iw+ , not (all isLower $ query (:[]) x) -> addIn x $ B.toList $ B.text $ T.pack iw Nothing | isInit x -> addIn x [Space] -- default _ -> Space : x ++ [Space]- addIn x i = foldr (hyphenate . (\z -> Str (headInline z) : i)) []+ addIn x i = foldr (hyphenate . (\z -> Str (T.pack $ headInline z) : i)) [] $ wordsBy (== Str "-") $ splitStrWhen (=='-') x sortSep g s = when_ g $ separator ++ addAffixes (g <+> s) "given" mempty separator = if isByzantineFamily- then [OPan (B.toList (B.text+ then [OPan (B.toList (B.text $ T.pack (getOptionValWithDefault "sort-separator" ", " ops)))] else [] suff = if commaSuffix n && nameSuffix n /= mempty@@ -320,7 +323,7 @@ (c >= '\x021a' && c <= '\x021b') || (c >= '\x202a' && c <= '\x202e') - isByzantineFamily = any isByzantine (stringify family)+ isByzantineFamily = T.any isByzantine (stringify family) shortName = oPan' (unFormatted $ nondropping <+> family) (form "family") longName g
src/Text/CSL/Eval/Output.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PatternGuards #-} ----------------------------------------------------------------------------- -- |@@ -17,9 +18,9 @@ module Text.CSL.Eval.Output where import Prelude-import Data.Char (toLower, toUpper) import Data.Maybe (mapMaybe) import Data.String (fromString)+import qualified Data.Text as T import Text.CSL.Output.Pandoc (lastInline) import Text.CSL.Style import Text.CSL.Util (capitalize, isPunct, titlecase,@@ -45,10 +46,10 @@ format <- many1 letter _ <- string "}}" contents <- manyTill anyChar (try (string ("{{/" ++ format ++ "}}")))- return $ RawInline (Format format) contents+ return $ RawInline (Format $ T.pack format) $ T.pack contents pString :: Parsec String () Inline-pString = Str <$> (many1 (noneOf " \t\n\r{}") <|> count 1 (oneOf "{}"))+pString = Str . T.pack <$> (many1 (noneOf " \t\n\r{}") <|> count 1 (oneOf "{}")) pSpace :: Parsec String () Inline pSpace = Space <$ many1 (oneOf " \t\n\r")@@ -143,7 +144,7 @@ [Strong [Str "???"]]] OErr (ReferenceNotFound r) -> Formatted [Span ("",["citeproc-not-found"],- [("data-reference-id",r)])+ [("data-reference-id",T.pack r)]) [Strong [Str "???"]]] OLabel [] _ -> Formatted [] OLabel s f -> addFormatting f $ formatString s@@ -169,7 +170,7 @@ addDisplay . addLink . addSuffix . pref . quote . font . text_case . strip_periods where addLink i = case hyperlink f of "" -> i- url -> Formatted [Link nullAttr (unFormatted i) (url, "")]+ url -> Formatted [Link nullAttr (unFormatted i) (T.pack url, "")] pref i = case prefix f of "" -> i x -> formatString x <> i@@ -181,7 +182,7 @@ | otherwise = i <> formatString (suffix f) strip_periods (Formatted ils) = Formatted (walk removePeriod ils)- removePeriod (Str xs) | stripPeriods f = Str (filter (/='.') xs)+ removePeriod (Str xs) | stripPeriods f = Str (T.filter (/='.') xs) removePeriod x = x quote (Formatted []) = Formatted []@@ -227,16 +228,16 @@ "title" -> titlecase ils "capitalize-first" -> case i of- Str cs -> Str (capitalize cs) : is'+ Str cs -> Str (T.pack $ capitalize $ T.unpack cs) : is' _ -> unTitlecase [i] ++ is' "sentence" -> unTitlecase ils _ -> ils - lowercaseStr (Str xs) = Str $ map toLower xs+ lowercaseStr (Str xs) = Str $ T.toLower xs lowercaseStr x = x- uppercaseStr (Str xs) = Str $ map toUpper xs+ uppercaseStr (Str xs) = Str $ T.toUpper xs uppercaseStr x = x- capitalizeStr (Str xs) = Str $ capitalize xs+ capitalizeStr (Str xs) = Str $ T.pack $ capitalize $ T.unpack xs capitalizeStr x = x valign [] = []
src/Text/CSL/Input/Bibtex.hs view
@@ -1,4 +1,6 @@ {-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE FlexibleContexts #-} {-# OPTIONS_GHC -fno-warn-unused-do-bind #-}@@ -33,6 +35,7 @@ import Data.List.Split (splitOn, splitWhen, wordsBy) import qualified Data.Map as Map import Data.Maybe+import qualified Data.Text as T import System.Environment (getEnvironment) import Text.CSL.Compat.Pandoc (readLaTeX) import Text.CSL.Exception (CiteprocException (ErrorReadingBib, ErrorReadingBibFile))@@ -60,7 +63,7 @@ adjustSpans lang (RawInline (Format "latex") s) | s == "\\hyphen" || s == "\\hyphen " = [Str "-"] | otherwise = Walk.walk (concatMap (adjustSpans lang))- $ parseRawLaTeX lang s+ $ parseRawLaTeX lang (T.unpack s) adjustSpans _ x = [x] parseRawLaTeX :: Lang -> String -> [Inline]@@ -81,7 +84,7 @@ -- ... both should be nestable & should work in year fields f "autocap" ils = ils -- TODO: should work in year fields f "textnormal" ils = [Span ("",["nodecor"],[]) ils]- f "bibstring" [Str s] = [Str $ resolveKey' lang s]+ f "bibstring" [Str s] = [Str $ T.pack $ resolveKey' lang $ T.unpack s] f _ ils = [Span nullAttr ils] parseRawLaTeX _ _ = [] @@ -199,7 +202,7 @@ resolveAlias . map toLower <$> many1 (letter <|> digit <|> oneOf "-_:+") isBibtexKeyChar :: Char -> Bool-isBibtexKeyChar c = isAlphaNum c || c `elem` ".:;?!`'()/*@_+=-[]*&"+isBibtexKeyChar c = isAlphaNum c || c `elem` (".:;?!`'()/*@_+=-[]*&" :: String) bibItem :: BibParser Item bibItem = do@@ -377,7 +380,7 @@ resolveKey :: Lang -> Formatted -> Formatted resolveKey lang (Formatted ils) = Formatted (Walk.walk go ils)- where go (Str s) = Str $ resolveKey' lang s+ where go (Str s) = Str $ T.pack $ resolveKey' lang $ T.unpack s go x = x -- biblatex localization keys, from files at@@ -877,7 +880,7 @@ "oct" -> Just 10 "nov" -> Just 11 "dec" -> Just 12- _ -> safeRead s+ _ -> safeRead $ T.pack s data BibState = BibState{ untitlecase :: Bool@@ -887,7 +890,7 @@ type Bib = RWST Item () BibState Maybe notFound :: String -> Bib a-notFound f = fail $ f ++ " not found"+notFound f = Prelude.fail $ f ++ " not found" getField :: String -> Bib Formatted getField f = do@@ -951,20 +954,20 @@ year' <- fixLeadingDash <$> getRawField (prefix ++ "year") <|> return "" month' <- (parseMonth <$> getRawField (prefix ++ "month")) <|> return Nothing- day' <- (safeRead <$> getRawField (prefix ++ "day")) <|> return Nothing+ day' <- (safeRead . T.pack <$> getRawField (prefix ++ "day")) <|> return Nothing endyear' <- (fixLeadingDash <$> getRawField (prefix ++ "endyear")) <|> return "" endmonth' <- (parseMonth <$> getRawField (prefix ++ "endmonth")) <|> return Nothing- endday' <- (safeRead <$> getRawField (prefix ++ "endday")) <|> return Nothing- let start' = RefDate { year = safeRead year'+ endday' <- (safeRead . T.pack <$> getRawField (prefix ++ "endday")) <|> return Nothing+ let start' = RefDate { year = safeRead $ T.pack year' , month = month' , season = Nothing , day = day' , other = Literal $ if isNumber year' then "" else year' , circa = False }- let end' = RefDate { year = safeRead endyear'+ let end' = RefDate { year = safeRead $ T.pack endyear' , month = endmonth' , day = endday' , season = Nothing@@ -1040,7 +1043,7 @@ , parseNames = False } -- extended BibLaTeX name format - see #266-toAuthor _ ils@(Str ys:_) | '=' `elem` ys = do+toAuthor _ ils@(Str ys:_) | T.any (== '=') ys = do let commaParts = splitWhen (== Str ",") $ splitStrWhen (\c -> c == ',' || c == '=' || c == '\160') $ ils@@ -1114,7 +1117,7 @@ } isCapitalized :: [Inline] -> Bool-isCapitalized (Str (c:cs) : rest)+isCapitalized (Str (T.uncons -> Just (c,cs)) : rest) | isUpper c = True | isDigit c = isCapitalized (Str cs : rest) | otherwise = False@@ -1220,9 +1223,9 @@ go accum s = case reverse accum of [] -> s (Str x:_)- | not (null x) && last x `elem` "!?.,:;"+ | not (T.null x) && T.last x `elem` ("!?.,:;" :: String) -> accum ++ (Space : s)- _ -> accum ++ (Str [sep] : Space : s)+ _ -> accum ++ (Str (T.singleton sep) : Space : s) type Options = [(String, String)] @@ -1278,7 +1281,7 @@ "inproceedings" -> (PaperConference,mempty) "manual" -> (Book,mempty) "mastersthesis" -> (Thesis, if reftype' == mempty- then Formatted [Str $ resolveKey' lang "mathesis"]+ then Formatted [Str $ T.pack $ resolveKey' lang "mathesis"] else reftype') "misc" -> (NoType,mempty) "mvbook" -> (Book,mempty)@@ -1292,7 +1295,7 @@ | st == "newspaper" -> (ArticleNewspaper,mempty) | otherwise -> (ArticleJournal,mempty) "phdthesis" -> (Thesis, if reftype' == mempty- then Formatted [Str $ resolveKey' lang "phdthesis"]+ then Formatted [Str $ T.pack $ resolveKey' lang "phdthesis"] else reftype') "proceedings" -> (Book,mempty) "reference" -> (Book,mempty)@@ -1415,9 +1418,9 @@ <|> getPeriodicalTitle "shortjournal" <|> return mempty -- change numerical series title to e.g. 'series 3'- let fixSeriesTitle (Formatted [Str xs]) | all isDigit xs =- Formatted [Str (ordinalize locale xs),- Space, Str (resolveKey' lang "ser.")]+ let fixSeriesTitle (Formatted [Str xs]) | T.all isDigit xs =+ Formatted [Str (T.pack $ ordinalize locale $ T.unpack xs),+ Space, Str (T.pack $ resolveKey' lang "ser.")] fixSeriesTitle x = x seriesTitle' <- (fixSeriesTitle . resolveKey lang) <$> getTitle "series" <|> return mempty@@ -1535,12 +1538,12 @@ _ -> return mempty ) - let convertEnDash (Str s) = Str (map (\c -> if c == '–' then '-' else c) s)+ let convertEnDash (Str s) = Str (T.map (\c -> if c == '–' then '-' else c) s) convertEnDash x = x let takeDigits (Str xs : _) =- case takeWhile isDigit xs of- [] -> []+ case T.takeWhile isDigit xs of+ "" -> [] ds -> [Str ds] takeDigits x = x
src/Text/CSL/Input/Bibutils.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE CPP #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE PatternGuards #-}@@ -221,7 +222,7 @@ -- references: -- ... case fromJSON (metaValueToJSON v) of- Success "" -> Right []+ Success ("" :: String) -> Right [] _ -> Left s Success x -> Right x
src/Text/CSL/Output/Pandoc.hs view
@@ -1,4 +1,6 @@ {-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ViewPatterns #-} {-# LANGUAGE PatternGuards #-} -----------------------------------------------------------------------------@@ -28,6 +30,7 @@ import Prelude import Data.Maybe (fromMaybe)+import qualified Data.Text as T import Text.CSL.Style import Text.CSL.Util (headInline, initInline, lastInline, proc, proc', tailFirstInlineStr,@@ -46,26 +49,27 @@ dropWhile (== LineBreak) . reverse . dropWhile (== LineBreak) . reverse renderPandoc' :: Style -> (Formatted, String) -> Block-renderPandoc' sty (form, citId) = Div ("ref-" ++ citId, [], []) [Para $ renderPandoc sty form]+renderPandoc' sty (form, citId) = Div (T.pack $ "ref-" <> citId, [], []) [Para $ renderPandoc sty form] clean' :: Style -> [Inline] -> [Inline] clean' _ [] = [] clean' sty (i:is) = case i:is of (Str "" : rest) -> clean' sty rest- (Str xs : Str ys : rest) -> clean' sty $ Str (xs ++ ys) : rest- (Link a1 lab1 ('#':r1, "") : Str "\8211" : Link a2 lab2 ('#':r2, "") : rest)+ (Str xs : Str ys : rest) -> clean' sty $ Str (xs <> ys) : rest+ (Link a1 lab1 (T.uncons -> Just ('#',r1), "")+ : Str "\8211" : Link a2 lab2 (T.uncons -> Just ('#',r2), "") : rest) | r1 == r2, a1 == a2 ->- Link a1 (lab1 ++ [Str "\8211"] ++ lab2) ('#':r1, "") : clean' sty rest+ Link a1 (lab1 ++ [Str "\8211"] ++ lab2) (T.cons '#' r1, "") : clean' sty rest (Span ("",[],[]) inls : _) -> inls ++ clean' sty is (Span ("",["csl-inquote"],kvs) inls : _) -> let isOuter = lookup "position" kvs == Just "outer" in case headInline is of- [x] -> if x `elem` ".," && isPunctuationInQuote sty+ [x] -> if x `elem` (".," :: String) && isPunctuationInQuote sty then if lastInline inls `elem` [".",",",";",":","!","?"] then quoted isOuter inls ++ clean' sty (tailInline is)- else quoted isOuter (inls ++ [Str [x]]) +++ else quoted isOuter (inls ++ [Str (T.singleton x)]) ++ clean' sty (tailInline is) else quoted isOuter inls ++ clean' sty is _ -> quoted isOuter inls ++ clean' sty is@@ -74,12 +78,12 @@ then i : clean' sty (tailInline is) else i : clean' sty is where- isPunct = all (`elem` ".,;:!? ") $ headInline is+ isPunct = all (`elem` (".,;:!? " :: String)) $ headInline is locale = case styleLocale sty of (x:_) -> x [] -> Locale [] [] [] [] [] -- should not happen getQuote s d = case [term | term <- localeTerms locale, cslTerm term == s] of- (x:_) -> Str (termSingular x)+ (x:_) -> Str $ T.pack $ termSingular x _ -> Str d openQuoteOuter = getQuote "open-quote" "“" openQuoteInner = getQuote "open-inner-quote" "‘"@@ -92,7 +96,7 @@ convertQuoted s = convertQuoted' where locale = let l = styleLocale s in case l of [x] -> x; _ -> Locale [] [] [] [] []- getQuote x y = fromEntities . termSingular . fromMaybe newTerm {termSingular = x} .+ getQuote x y = fromEntities . T.pack . termSingular . fromMaybe newTerm {termSingular = x} . findTerm y Long . localeTerms $ locale doubleQuotesO = getQuote "\"" "open-quote" doubleQuotesC = getQuote "\"" "close-quote"
src/Text/CSL/Pandoc.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE ViewPatterns #-} {-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE OverloadedStrings #-}@@ -15,10 +16,10 @@ import Control.Monad.State import Data.Aeson import qualified Data.ByteString.Lazy as L-import Data.Char (isDigit, isPunctuation, isSpace,- toLower)+import Data.Char (isDigit, isPunctuation, isSpace) import qualified Data.Map as M import qualified Data.Set as Set+import qualified Data.Text as T import Data.Maybe (fromMaybe) import System.Directory (getAppUserDataDirectory) import System.Environment (getEnv)@@ -78,9 +79,9 @@ addFirstNoteNumber :: M.Map String Int -> Inline -> Inline addFirstNoteNumber notemap s@(Span ("",["first-reference-note-number"],[("refid",refid)]) _)- = case M.lookup refid notemap of+ = case M.lookup (T.unpack refid) notemap of Nothing -> s- Just n -> Str (show n)+ Just n -> Str $ T.pack (show n) addFirstNoteNumber _ -- see below, these spans added by deNote (Note [Para (Span ("",["reference-id-list"],_) [] : ils)]) = Note [Para ils]@@ -147,9 +148,9 @@ truish :: MetaValue -> Bool truish (MetaBool t) = t-truish (MetaString s) = isYesValue (map toLower s)-truish (MetaInlines ils) = isYesValue (map toLower (stringify ils))-truish (MetaBlocks [Plain ils]) = isYesValue (map toLower (stringify ils))+truish (MetaString s) = isYesValue (T.unpack $ T.toLower s)+truish (MetaInlines ils) = isYesValue (T.unpack $ T.toLower (stringify ils))+truish (MetaBlocks [Plain ils]) = isYesValue (T.unpack $ T.toLower (stringify ils)) truish _ = False isYesValue :: String -> Bool@@ -169,7 +170,7 @@ [] -> cs _ -> allcites allcites = map (\ref -> Citation{- citationId = unLiteral (refId ref),+ citationId = T.pack $ unLiteral (refId ref), citationPrefix = [], citationSuffix = [], citationMode = NormalCitation,@@ -245,19 +246,19 @@ return $ processCites (tr' "CSL" csl') refs $ Pandoc meta blocks toPath :: MetaValue -> Maybe String-toPath (MetaString s) = Just s+toPath (MetaString s) = Just $ T.unpack s -- take last in a list toPath (MetaList xs) = case reverse xs of [] -> Nothing (x:_) -> toPath x-toPath (MetaInlines ils) = Just $ stringify ils+toPath (MetaInlines ils) = Just $ T.unpack $ stringify ils toPath _ = Nothing getBibRefs :: (String -> Bool) -> MetaValue -> IO [Reference] getBibRefs idpred (MetaList xs) = concat `fmap` mapM (getBibRefs idpred) xs getBibRefs idpred (MetaInlines xs) = getBibRefs idpred (MetaString $ stringify xs) getBibRefs idpred (MetaString s) = do- path <- findFile ["."] s >>= maybe (E.throwIO $ CouldNotFindBibFile s) return+ path <- findFile ["."] (T.unpack s) >>= maybe (E.throwIO $ CouldNotFindBibFile $ T.unpack s) return map unescapeRefId `fmap` readBiblioFile idpred path getBibRefs _ _ = return [] @@ -296,7 +297,7 @@ getNoteCitationIds (Note [Para (Span ("",["reference-id-list"] ,[("refids",refids)]) [] : _)]) -- see deNote below which inserts this special Span- = [words refids]+ = [words $ T.unpack refids] getNoteCitationIds (Note _) = [[]] getNoteCitationIds _ = [] @@ -330,7 +331,7 @@ then mvPunct moveNotes sty $ case headInline ys of "" -> q : x : tailInline ys- w -> q : Str w : x : tailInline ys+ w -> q : Str (T.pack w) : x : tailInline ys else q : x : mvPunct moveNotes sty ys mvPunct moveNotes sty (Cite cs ils : ys) | length ils > 1@@ -341,7 +342,7 @@ (init ils ++ (case headInline ys of "" -> []- s' | not (endWithPunct False (init ils)) -> [Str s']+ s' | not (endWithPunct False (init ils)) -> [Str $ T.pack s'] | otherwise -> []) ++ [last ils]) : mvPunct moveNotes sty (tailInline ys) mvPunct moveNotes sty (q@(Quoted _ _) : w@(Str _) : x : ys)@@ -362,7 +363,7 @@ endWithPunct :: Bool -> [Inline] -> Bool endWithPunct _ [] = True endWithPunct onlyFinal xs@(_:_) =- case reverse (stringify xs) of+ case reverse (T.unpack $ stringify xs) of [] -> True -- covers .), .", etc.: (d:c:_) | isPunctuation d@@ -384,7 +385,7 @@ -- we insert this to help getNoteCitationIds: specialSpan cs = Span ("",["reference-id-list"],- [("refids", unwords (map citationId cs))]) []+ [("refids", T.unwords (map citationId cs))]) [] go' (Str "(" : Cite cs [Note [Para xs]] : Str ")" : ys) = Str "(" : Cite cs xs : Str ")" : ys go' (x : Cite cs [Note [Para xs]] : ys) | not (isSpacy x) =@@ -402,7 +403,7 @@ let xs' = if startWithPunct ys && endWithPunct True xs then initInline $ removeLeadingPunct xs else removeLeadingPunct xs- removeLeadingPunct (Str [c] : s : zs)+ removeLeadingPunct (Str (T.unpack -> [c]) : s : zs) | isSpacy s && (c == ',' || c == '.' || c == ':') = zs removeLeadingPunct zs = zs in f xs' ++ ys@@ -414,7 +415,7 @@ | otherwise = [] getCitationIds :: Inline -> Set.Set String-getCitationIds (Cite cs _) = Set.fromList (map citationId cs)+getCitationIds (Cite cs _) = Set.map T.unpack $ Set.fromList (map citationId cs) getCitationIds _ = mempty setHashes :: Inline -> State Int Inline@@ -437,9 +438,9 @@ ("","",x:_) | not (isPunct x) -> Space : s _ -> s- isPunct (Str (x:_)) = isPunctuation x+ isPunct (Str (T.uncons -> Just (x,_))) = isPunctuation x isPunct _ = False- in emptyCite { CSL.citeId = citationId c+ in emptyCite { CSL.citeId = T.unpack $ citationId c , CSL.citePrefix = Formatted $ citationPrefix c , CSL.citeSuffix = Formatted s' , CSL.citeLabel = la@@ -511,7 +512,7 @@ (la, _) <- pLocatorLabelDelimited locMap -- we only care about balancing {} and [] (because of the outer [] scope); -- the rest can be anything- let inner = do { t <- anyToken; return (True, stringify t) }+ let inner = do { t <- anyToken; return (True, T.unpack $ stringify t) } gs <- many (pBalancedBraces [('{','}'), ('[',']')] inner) _ <- pMatchChar "}" (== '}') let lo = concatMap snd gs@@ -521,7 +522,7 @@ pLocatorLabelDelimited locMap = pLocatorLabel' locMap lim <|> return ("page", True) where- lim = stringify <$> anyToken+ lim = T.unpack . stringify <$> anyToken pLocatorIntegrated :: LocatorMap -> Parsec [Inline] st (String, String) pLocatorIntegrated locMap = try $ do@@ -554,7 +555,7 @@ -- the pathological case is "p.3" t <- anyToken ts <- manyTill anyToken (try $ lookAhead lim)- let s = acc ++ stringify (t:ts)+ let s = acc ++ T.unpack (stringify (t:ts)) case M.lookup (trim s) locMap of -- try to find a longer one, or return this one Just l -> go s <|> return (l, False)@@ -563,7 +564,7 @@ -- hard requirement for a locator to have some real digits in it requireDigits :: (Bool, String) -> Parsec [Inline] st String requireDigits (_, s) = if not (any isDigit s)- then fail "requireDigits"+ then Prelude.fail "requireDigits" else return s -- soft requirement for a sequence with some roman or arabic parts@@ -572,7 +573,7 @@ -- NOT: a, (a)-(b), hello, (some text in brackets) requireRomansOrDigits :: (Bool, String) -> Parsec [Inline] st String requireRomansOrDigits (d, s) = if not d- then fail "requireRomansOrDigits"+ then Prelude.fail "requireRomansOrDigits" else return s pLocatorWordIntegrated :: Bool -> Parsec [Inline] st (Bool, String)@@ -582,7 +583,7 @@ else (stringify <$> pLocatorSep) <|> return "" sp <- option "" (pSpace >> return " ") (dig, s) <- pBalancedBraces [('(',')'), ('[',']'), ('{','}')] pPageSeq- return (dig, punct ++ sp ++ s)+ return (dig, T.unpack punct ++ sp ++ s) -- we want to capture: 123, 123A, C22, XVII, 33-44, 22-33; 22-11 -- 34(1), 34A(A), 34(1)(i)(i), (1)(a)@@ -621,7 +622,7 @@ -- .2 p <- pMatchChar "." (== '.') u <- try pPageUnit- return (fst u, stringify p ++ snd u)+ return (fst u, T.unpack (stringify p) ++ snd u) anyWereDigitLike :: [(Bool, String)] -> (Bool, String) anyWereDigitLike as = (any fst as, concatMap snd as)@@ -635,7 +636,7 @@ ts <- many1 (notFollowedBy pSpace >> notFollowedBy pLocatorPunct >> anyToken)- let s = stringify ts+ let s = T.unpack $ stringify ts -- otherwise look for actual digits or -s return (any isDigit s, s) @@ -643,9 +644,9 @@ pRoman = try $ do t <- anyToken case t of- Str xs -> case parseRomanNumeral xs of+ Str xs -> case parseRomanNumeral (T.unpack xs) of Nothing -> mzero- Just _ -> return xs+ Just _ -> return $ T.unpack xs _ -> mzero isLocatorPunct :: Char -> Bool@@ -668,7 +669,7 @@ pMatchChar :: String -> (Char -> Bool) -> Parsec [Inline] st Inline pMatchChar msg f = pMatch msg mc where- mc (Str [c]) = f c+ mc (Str (T.unpack -> [c])) = f c mc _ = False pSpace :: Parsec [Inline] st Inline@@ -678,7 +679,7 @@ pMatch msg condition = try $ do t <- anyToken if not (condition t)- then fail msg+ then Prelude.fail msg else return t type LocatorMap = M.Map String String
src/Text/CSL/Parser.hs view
@@ -131,7 +131,7 @@ attrWithDefault :: Read a => Text -> a -> Cursor -> a attrWithDefault t d cur =- fromMaybe d $ safeRead (toRead $ stringAttr t cur)+ fromMaybe d $ safeRead (T.pack $ toRead $ stringAttr t cur) stringAttr :: Text -> Cursor -> String stringAttr t cur =
src/Text/CSL/Proc.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE PatternGuards #-}+{-# LANGUAGE ViewPatterns #-} ----------------------------------------------------------------------------- -- | -- Module : Text.CSL.Proc@@ -28,6 +29,7 @@ import Data.List import Data.Maybe (mapMaybe) import Data.Ord (comparing)+import qualified Data.Text as T import Text.CSL.Eval import Text.CSL.Proc.Collapse import Text.CSL.Proc.Disamb@@ -340,7 +342,7 @@ case ys of Formatted [] -> xs Formatted (Note _ : _) -> xs <> ys- Formatted (Str [c]:_) | c `elem` (", ;:" :: String) -> xs <> ys+ Formatted (Str (T.unpack -> [c]):_) | c `elem` (", ;:" :: String) -> xs <> ys _ -> xs <> Formatted [Space] <> ys formatAuth = formatOutput . localMod formatCits = (if isNote then toNote else id) .
src/Text/CSL/Proc/Collapse.hs view
@@ -1,5 +1,7 @@ {-# LANGUAGE NoImplicitPrelude #-}-{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PatternGuards #-} ----------------------------------------------------------------------------- -- | -- Module : Text.CSL.Proc.Collapse@@ -23,6 +25,7 @@ import Data.List (groupBy, sortBy) import Data.Monoid (Any (..)) import Data.Ord (comparing)+import qualified Data.Text as T import Text.CSL.Eval import Text.CSL.Proc.Disamb import Text.CSL.Style hiding (Any)@@ -208,11 +211,11 @@ Formatted [] -> [] Formatted ils | isprefix -> case reverse ils of- (Str zs@(_:_):_) |- last zs == '\160' -> [OPan ils]+ (Str zs@(T.uncons -> Just (_,_)):_) |+ T.last zs == '\160' -> [OPan ils] _ -> [OPan ils, OSpace] | otherwise -> case ils of- (Str (z:_):_)+ (Str (T.uncons -> Just (z,_)):_) | isAlphaNum z || z == '(' -> [OSpace, OPan ils] _ -> [OPan ils]
src/Text/CSL/Reference.hs view
@@ -303,8 +303,8 @@ = case splitWhen (=='_') xs of [x,y] | all isDigit x && all isDigit y && not (null x) ->- [RefDate (safeRead x) Nothing Nothing Nothing mempty b,- RefDate (safeRead y) Nothing Nothing Nothing mempty b]+ [RefDate (safeRead $ T.pack x) Nothing Nothing Nothing mempty b,+ RefDate (safeRead $ T.pack y) Nothing Nothing Nothing mempty b] _ -> [d] handleLiteral d = [d] @@ -360,11 +360,11 @@ -- found in one of the test cases: parseJSON (String "film") = return MotionPicture parseJSON (String t) =- safeRead (capitalize . camelize . T.unpack $ t) <|>+ safeRead (T.pack . capitalize . camelize . T.unpack $ t) <|> fail ("'" ++ T.unpack t ++ "' is not a valid reference type") parseJSON v@(Array _) = fmap (capitalize . camelize . inlinesToString) (parseJSON v) >>= \t ->- safeRead t <|>+ safeRead (T.pack t) <|> fail ("'" ++ t ++ "' is not a valid reference type") parseJSON _ = fail "Could not parse RefType" @@ -1017,18 +1017,18 @@ extended <- if extyear then P.many P.digit else return []- return $ case safeRead (sign ++ rest ++ extended) of+ return $ case safeRead (T.pack $ sign ++ rest ++ extended) of Just x | x <= 0 -> Just (x - 1) -- 0 = -1 AD x -> x m' <- P.option Nothing $ Just <$> P.try (P.char '-' >> P.many1 P.digit)- (m,s) <- case m' >>= safeRead of+ (m,s) <- case m' >>= safeRead . T.pack of Just (n::Int) | n >= 1 && n <= 12 -> return (Just n, Nothing) | n >= 13 && n <= 16 -> return (Nothing, pseudoMonthToSeason n) | n >= 21 && n <= 24 -> return (Nothing, pseudoMonthToSeason n) Nothing | isNothing m' -> return (Nothing, Nothing) _ -> fail "Improper month"- d <- P.option Nothing $ safeRead <$> P.try (P.char '-' >> P.many1 P.digit)+ d <- P.option Nothing $ safeRead . T.pack <$> P.try (P.char '-' >> P.many1 P.digit) guard $ case d of Nothing -> True Just (n::Int) | n >= 1 && n <= 31 -> True@@ -1052,7 +1052,7 @@ let pmonth = P.try $ do xs <- P.many1 P.letter <|> P.many1 P.digit if all isDigit xs- then case safeRead xs of+ then case safeRead (T.pack xs) of Just (n::Int) | n >= 1 && n <= 12 -> return (Just n) _ -> fail "Improper month" else case elemIndex (map toLower $ take 3 xs) months of@@ -1068,10 +1068,10 @@ _ -> fail "Improper season" let pday = P.try $ do xs <- P.many1 P.digit- case safeRead xs of+ case safeRead (T.pack xs) of Just (n::Int) | n >= 1 && n <= 31 -> return (Just n) _ -> fail "Improper day"- let pyear = safeRead <$> P.many1 P.digit+ let pyear = safeRead . T.pack <$> P.many1 P.digit let sep = P.oneOf [' ','/',','] >> P.spaces let rangesep = P.try $ P.spaces >> P.char '-' >> P.spaces let refDate = RefDate Nothing Nothing Nothing Nothing mempty False
src/Text/CSL/Style.hs view
@@ -3,6 +3,7 @@ {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ViewPatterns #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-}@@ -147,7 +148,7 @@ -- this is needed for versions of pandoc that don't turn -- a span with font-variant:small-caps into a SmallCaps element: where handleSmallCapsSpans (Span ("",[],[("style",sty)]) ils)- | filter (`notElem` (" \t;" :: String)) sty == "font-variant:small-caps" =+ | T.filter (`notElem` (" \t;" :: String)) sty == "font-variant:small-caps" = SmallCaps ils handleSmallCapsSpans x = x @@ -245,7 +246,7 @@ toStr :: String -> [Inline] toStr = intercalate [Str "\n"] .- map (B.toList . B.text . tweak . fromEntities) .+ map (B.toList . B.text . T.pack . tweak . T.unpack . fromEntities . T.pack) . splitWhen (=='\n') where tweak ('«':' ':xs) = "«\8239" ++ tweak xs@@ -898,7 +899,7 @@ | otherwise = ag startWithCapital' :: Inline -> Bool-startWithCapital' (Str (c:_)) = isUpper c && isLetter c+startWithCapital' (Str (T.uncons -> Just (c,_))) = isUpper c && isLetter c startWithCapital' _ = False startWithCapital :: Formatted -> Bool
src/Text/CSL/Util.hs view
@@ -1,9 +1,12 @@-{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ViewPatterns #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE PatternGuards #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE ScopedTypeVariables #-} module Text.CSL.Util ( safeRead , readNum@@ -52,7 +55,7 @@ , isRange , addSpaceAfterPeriod ) where-import Prelude+import Prelude import Control.Monad.State import Data.Aeson import Data.Aeson.Types (Parser)@@ -98,7 +101,7 @@ sa <^> [] = sa sa <^> (s:xs) | s `elem` puncts && last sa `elem` puncts = sa ++ xs- where puncts = ";:,. "+ where puncts = ";:,. " :: String sa <^> sb = sa ++ sb capitalize :: String -> String@@ -106,7 +109,7 @@ capitalize (c:cs) = toUpper c : cs isPunct :: Char -> Bool-isPunct c = c `elem` ".;?!"+isPunct c = c `elem` (".;?!" :: String) camelize :: String -> String camelize ('-':y:ys) = toUpper y : camelize ys@@ -137,7 +140,7 @@ trim = triml . trimr triml :: String -> String-triml = dropWhile (`elem` " \r\n\t")+triml = dropWhile (`elem` (" \r\n\t" :: String)) trimr :: String -> String trimr = reverse . triml . reverse@@ -148,8 +151,8 @@ parseBool (Number n) = case fromJSON (Number n) of Success (0 :: Int) -> return False Success _ -> return True- Error e -> fail $ "Could not read boolean: " ++ e-parseBool _ = fail "Could not read boolean"+ Error e -> Prelude.fail $ "Could not read boolean: " ++ e+parseBool _ = Prelude.fail "Could not read boolean" -- | Parse JSON value as String. parseString :: Value -> Parser String@@ -158,34 +161,34 @@ Success (x :: Int) -> return $ show x Error _ -> case fromJSON (Number n) of Success (x :: Double) -> return $ show x- Error e -> fail $ "Could not read string: " ++ e+ Error e -> Prelude.fail $ "Could not read string: " ++ e parseString (Bool b) = return $ map toLower $ show b parseString v@(Array _)= inlinesToString `fmap` parseJSON v-parseString v = fail $ "Could not read as string: " ++ show v+parseString v = Prelude.fail $ "Could not read as string: " ++ show v -- | Parse JSON value as Int. parseInt :: Value -> Parser Int parseInt (Number n) = case fromJSON (Number n) of Success (x :: Int) -> return x- Error e -> fail $ "Could not read Int: " ++ e+ Error e -> Prelude.fail $ "Could not read Int: " ++ e parseInt x = parseString x >>= \s ->- case safeRead s of+ case safeRead (T.pack s) of Just n -> return n- Nothing -> fail "Could not read Int"+ Nothing -> Prelude.fail "Could not read Int" -- | Parse JSON value as Maybe Int. parseMaybeInt :: Maybe Value -> Parser (Maybe Int) parseMaybeInt Nothing = return Nothing parseMaybeInt (Just (Number n)) = case fromJSON (Number n) of Success (x :: Int) -> return (Just x)- Error e -> fail $ "Could not read Int: " ++ e+ Error e -> Prelude.fail $ "Could not read Int: " ++ e parseMaybeInt (Just x) = parseString x >>= \s -> if null s then return Nothing- else case safeRead s of+ else case safeRead (T.pack s) of Just n -> return (Just n)- Nothing -> fail $ "Could not read as Int: " ++ show s+ Nothing -> Prelude.fail $ "Could not read as Int: " ++ show s mb :: Monad m => (b -> m a) -> (Maybe b -> m (Maybe a)) mb = Data.Traversable.mapM@@ -205,7 +208,7 @@ hasLowercaseWord :: [Inline] -> Bool hasLowercaseWord = any startsWithLowercase . splitStrWhen isPunctuation- where startsWithLowercase (Str (x:_)) = isLower x+ where startsWithLowercase (Str (T.uncons -> Just (x,_))) = isLower x startsWithLowercase _ = False splitUpStr :: [Inline] -> [Inline]@@ -220,7 +223,7 @@ combineInternalPeriods :: [Inline] -> [Inline] combineInternalPeriods [] = [] combineInternalPeriods (Str xs:Str ".":Str ys:zs) =- combineInternalPeriods $ Str (xs ++ "." ++ ys) : zs+ combineInternalPeriods $ Str (xs <> "." <> ys) : zs combineInternalPeriods (x:xs) = x : combineInternalPeriods xs unTitlecase :: [Inline] -> [Inline]@@ -229,12 +232,12 @@ st <- get case (w, st) of (y, NoBoundary) -> return y- (Str (x:xs), LastWordBoundary) | isUpper x ->- return $ Str (map toLower (x:xs))- (Str (x:xs), WordBoundary) | isUpper x ->- return $ Str (map toLower (x:xs))- (Str (x:xs), SentenceBoundary) | isLower x ->- return $ Str (toUpper x : xs)+ (Str (T.uncons -> Just (x,xs)), LastWordBoundary) | isUpper x ->+ return $ Str (T.toLower (T.cons x xs))+ (Str (T.uncons -> Just (x,xs)), WordBoundary) | isUpper x ->+ return $ Str (T.toLower (T.cons x xs))+ (Str (T.uncons -> Just (x,xs)), SentenceBoundary) | isLower x ->+ return $ Str (T.cons (toUpper x) xs) (Span ("",[],[]) xs, _) | hasLowercaseWord xs -> return $ Span ("",["nocase"],[]) xs _ -> return w@@ -264,28 +267,28 @@ -- and “yet”. titlecase :: [Inline] -> [Inline] titlecase zs = evalState (caseTransform tc zs) SentenceBoundary- where tc (Str (x:xs)) = do+ where tc (Str (T.unpack -> (x:xs))) = do st <- get return $ case st of LastWordBoundary -> case (x:xs) of- s | not (isAscii x) -> Str s- | isShortWord s -> Str s- | all isUpperOrPunct s -> Str s- | isMixedCase s -> Str s- | otherwise -> Str (toUpper x:xs)+ s | not (isAscii x) -> Str $ T.pack s+ | isShortWord s -> Str $ T.pack s+ | all isUpperOrPunct s -> Str $ T.pack s+ | isMixedCase s -> Str $ T.pack s+ | otherwise -> Str $ T.pack (toUpper x:xs) WordBoundary -> case (x:xs) of- s | not (isAscii x) -> Str s- | all isUpperOrPunct s -> Str s- | isShortWord s -> Str (map toLower s)- | isMixedCase s -> Str s- | otherwise -> Str (toUpper x:xs)+ s | not (isAscii x) -> Str $ T.pack s+ | all isUpperOrPunct s -> Str $ T.pack s+ | isShortWord s -> Str $ T.pack (map toLower s)+ | isMixedCase s -> Str $ T.pack s+ | otherwise -> Str $ T.pack (toUpper x:xs) SentenceBoundary -> if isMixedCase (x:xs) || all isUpperOrPunct (x:xs)- then Str (x:xs)- else Str (toUpper x : xs)- _ -> Str (x:xs)+ then Str $ T.pack (x:xs)+ else Str $ T.pack (toUpper x : xs)+ _ -> Str $ T.pack (x:xs) tc (Span ("",["nocase"],[]) xs) = return $ Span ("",["nocase"],[]) xs tc x = return x isShortWord s = map toLower s `Set.member` shortWords@@ -320,15 +323,15 @@ go acc LineBreak = do put WordBoundary return $ Space : acc- go acc (Str [c])- | c `elem` ".?!:" = do+ go acc (Str (T.unpack -> [c]))+ | c `elem` (".?!:" :: String) = do put SentenceBoundary- return $ Str [c] : acc- | c `elem` "-/\x2013\x2014\160" = do+ return $ Str (T.singleton c) : acc+ | c `elem` ("-/\x2013\x2014\160" :: String) = do put WordBoundary- return $ Str [c] : acc- | isPunctuation c = return $ Str [c] : acc -- leave state unchanged- go acc (Str []) = return acc+ return $ Str (T.singleton c) : acc+ | isPunctuation c = return $ Str (T.singleton c) : acc -- leave state unchanged+ go acc (Str "") = return acc go acc (Str xs) = do res <- xform (Str xs) put NoBoundary@@ -354,13 +357,13 @@ splitStrWhen :: (Char -> Bool) -> [Inline] -> [Inline] splitStrWhen _ [] = []-splitStrWhen p (Str xs : ys) = go xs ++ splitStrWhen p ys+splitStrWhen p (Str xs : ys) = go (T.unpack xs) ++ splitStrWhen p ys where go [] = [] go s = case break p s of ([],[]) -> []- (zs,[]) -> [Str zs]- ([],(w:ws)) -> Str [w] : go ws- (zs,(w:ws)) -> Str zs : Str [w] : go ws+ (zs,[]) -> [Str $ T.pack zs]+ ([],(w:ws)) -> Str (T.singleton w) : go ws+ (zs,(w:ws)) -> Str (T.pack zs) : Str (T.singleton w) : go ws splitStrWhen p (x : ys) = x : splitStrWhen p ys -- | A generic processing function.@@ -395,13 +398,13 @@ | otherwise = [] inlinesToString :: [Inline] -> String-inlinesToString = stringify+inlinesToString = T.unpack . stringify headInline :: [Inline] -> String-headInline = take 1 . stringify+headInline = take 1 . T.unpack . stringify lastInline :: [Inline] -> String-lastInline xs = case stringify xs of+lastInline xs = case T.unpack $ stringify xs of [] -> [] ys -> [last ys] @@ -409,7 +412,7 @@ initInline [] = [] initInline [i] | Str s <- i- , not (null s) = return $ Str (init s)+ , not (T.null s) = return $ Str (T.init s) | Emph is <- i = return $ Emph (initInline is) | Strong is <- i = return $ Strong (initInline is) | Superscript is <- i = return $ Superscript (initInline is)@@ -437,19 +440,19 @@ mapHeadInline :: (String -> String) -> [Inline] -> [Inline] mapHeadInline _ [] = [] mapHeadInline f (i:xs)- | Str [] <- i = mapHeadInline f xs- | Str s <- i = case f s of+ | Str "" <- i = mapHeadInline f xs+ | Str s <- i = case f (T.unpack s) of "" -> xs- _ -> Str (f s) : xs- | Emph is <- i = Emph (mapHeadInline f is) : xs- | Strong is <- i = Strong (mapHeadInline f is) : xs- | Superscript is <- i = Superscript (mapHeadInline f is) : xs- | Subscript is <- i = Subscript (mapHeadInline f is) : xs- | Quoted q is <- i = Quoted q (mapHeadInline f is) : xs- | SmallCaps is <- i = SmallCaps (mapHeadInline f is) : xs- | Strikeout is <- i = Strikeout (mapHeadInline f is) : xs- | Link at is t <- i = Link at (mapHeadInline f is) t : xs- | Span at is <- i = Span at (mapHeadInline f is) : xs+ _ -> Str (T.pack $ f $ T.unpack s) : xs+ | Emph is <- i = Emph (mapHeadInline f is) : xs+ | Strong is <- i = Strong (mapHeadInline f is) : xs+ | Superscript is <- i = Superscript (mapHeadInline f is) : xs+ | Subscript is <- i = Subscript (mapHeadInline f is) : xs+ | Quoted q is <- i = Quoted q (mapHeadInline f is) : xs+ | SmallCaps is <- i = SmallCaps (mapHeadInline f is) : xs+ | Strikeout is <- i = Strikeout (mapHeadInline f is) : xs+ | Link at is t <- i = Link at (mapHeadInline f is) t : xs+ | Span at is <- i = Span at (mapHeadInline f is) : xs | otherwise = i : xs findFile :: [FilePath] -> FilePath -> IO (Maybe FilePath)@@ -528,7 +531,7 @@ hundreds + nineties + fifties + forties + tens + nines + fives + fours + ones if total == 0- then fail "not a roman numeral"+ then Prelude.fail "not a roman numeral" else return total isRange :: String -> Bool@@ -540,9 +543,9 @@ addSpaceAfterPeriod = go . splitStrWhen (=='.') where go [] = []- go (Str [c]:Str ".":Str [d]:xs)+ go (Str (T.unpack -> [c]):Str ".":Str (T.unpack -> [d]):xs) | isLetter d , isLetter c , isUpper c- , isUpper d = Str [c]:Str ".":Space:go (Str [d]:xs)+ , isUpper d = Str (T.singleton c):Str ".":Space:go (Str (T.singleton d):xs) go (x:xs) = x:go xs
stack.yaml view
@@ -9,18 +9,18 @@ packages: - '.' extra-deps:-- pandoc-types-1.17.6.1 - HsYAML-0.2.0.0 - HsYAML-aeson-0.2.0.0-- texmath-0.11.3 - haddock-library-1.8.0 - skylighting-0.8.2.3 - skylighting-core-0.8.2.3 - regex-pcre-builtin-0.95.0.8.8.35-- doctemplates-0.7+- doctemplates-0.7.1 - doclayout-0.2.0.1-- git: https://github.com/jgm/pandoc.git- commit: 8f3b3afc70d163afe5e103abec77a4ffafb995bd+- texmath-0.12+- pandoc-types-1.20+- git: 'https://github.com/jgm/pandoc'+ commit: cac01f45bb2247d152f649eb1ef30f21fbc28867 ghc-options: "$locals": -fhide-source-paths
tests/test-citeproc.hs view
@@ -182,7 +182,7 @@ adjustSpans (Span (id',classes,kvs) ils) = [Span (id',classes',kvs') ils] where classes' = filter (`notElem` ["csl-no-emph","csl-no-strong","csl-no-smallcaps"]) classes- kvs' = if null styles then kvs else (("style", concat styles) : kvs)+ kvs' = if null styles then kvs else (("style", mconcat styles) : kvs) styles = ["font-style:normal;" | "csl-no-emph" `elem` classes] ++ ["font-weight:normal;" | "csl-no-strong" `elem` classes] ++ ["font-variant:normal;" | "csl-no-smallcaps" `elem` classes]