packages feed

pandoc-crossref 0.3.10.0 → 0.3.11.0

raw patch · 42 files changed

+2092/−1848 lines, 42 filesdep +criteriondep ~pandocPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: criterion

Dependency ranges changed: pandoc

API changes (from Hackage documentation)

- Text.Pandoc.CrossRef: autoEqnLabels :: forall a_asO2. ToMetaValue a_asO2 => a_asO2 -> Meta
- Text.Pandoc.CrossRef: autoSectionLabels :: forall a_asNs. ToMetaValue a_asNs => a_asNs -> Meta
- Text.Pandoc.CrossRef: ccsDelim :: forall a_asNZ. ToMetaValue a_asNZ => a_asNZ -> Meta
- Text.Pandoc.CrossRef: ccsLabelSep :: forall a_asO0. ToMetaValue a_asO0 => a_asO0 -> Meta
- Text.Pandoc.CrossRef: ccsTemplate :: forall a_asNU. ToMetaValue a_asNU => a_asNU -> Meta
- Text.Pandoc.CrossRef: chapDelim :: forall a_asNI. ToMetaValue a_asNI => a_asNI -> Meta
- Text.Pandoc.CrossRef: chapters :: forall a_atg5. ToMetaValue a_atg5 => a_atg5 -> Meta
- Text.Pandoc.CrossRef: chaptersDepth :: forall a_asNp. ToMetaValue a_asNp => a_asNp -> Meta
- Text.Pandoc.CrossRef: codeBlockCaptions :: forall a_asNr. ToMetaValue a_asNr => a_asNr -> Meta
- Text.Pandoc.CrossRef: cref :: forall a_asNo. ToMetaValue a_asNo => a_asNo -> Meta
- Text.Pandoc.CrossRef: crossrefYaml :: forall a_atg3. ToMetaValue a_atg3 => a_atg3 -> Meta
- Text.Pandoc.CrossRef: customHeadingLabel :: forall a_asNY. ToMetaValue a_asNY => a_asNY -> Meta
- Text.Pandoc.CrossRef: customLabel :: forall a_asNX. ToMetaValue a_asNX => a_asNX -> Meta
- Text.Pandoc.CrossRef: eqLabels :: forall a_atg7. ToMetaValue a_atg7 => a_atg7 -> Meta
- Text.Pandoc.CrossRef: eqnPrefix :: forall a_asNw. ToMetaValue a_asNw => a_asNw -> Meta
- Text.Pandoc.CrossRef: eqnPrefixTemplate :: forall a_asNB. ToMetaValue a_asNB => a_asNB -> Meta
- Text.Pandoc.CrossRef: figLabels :: forall a_atg6. ToMetaValue a_atg6 => a_atg6 -> Meta
- Text.Pandoc.CrossRef: figPrefix :: forall a_asNv. ToMetaValue a_asNv => a_asNv -> Meta
- Text.Pandoc.CrossRef: figPrefixTemplate :: forall a_asNA. ToMetaValue a_asNA => a_asNA -> Meta
- Text.Pandoc.CrossRef: figureTemplate :: forall a_asNR. ToMetaValue a_asNR => a_asNR -> Meta
- Text.Pandoc.CrossRef: figureTitle :: forall a_atfZ. ToMetaValue a_atfZ => a_atfZ -> Meta
- Text.Pandoc.CrossRef: getOptions :: Meta -> Maybe Format -> Options
- Text.Pandoc.CrossRef: lastDelim :: forall a_asNL. ToMetaValue a_asNL => a_asNL -> Meta
- Text.Pandoc.CrossRef: linkReferences :: forall a_asO4. ToMetaValue a_asO4 => a_asO4 -> Meta
- Text.Pandoc.CrossRef: listingTemplate :: forall a_asNW. ToMetaValue a_asNW => a_asNW -> Meta
- Text.Pandoc.CrossRef: listingTitle :: forall a_atg1. ToMetaValue a_atg1 => a_atg1 -> Meta
- Text.Pandoc.CrossRef: listings :: forall a_asNq. ToMetaValue a_asNq => a_asNq -> Meta
- Text.Pandoc.CrossRef: lofTitle :: forall a_asNN. ToMetaValue a_asNN => a_asNN -> Meta
- Text.Pandoc.CrossRef: lolTitle :: forall a_asNP. ToMetaValue a_asNP => a_asNP -> Meta
- Text.Pandoc.CrossRef: lotTitle :: forall a_asNO. ToMetaValue a_asNO => a_asNO -> Meta
- Text.Pandoc.CrossRef: lstLabels :: forall a_atg9. ToMetaValue a_atg9 => a_atg9 -> Meta
- Text.Pandoc.CrossRef: lstPrefix :: forall a_asNy. ToMetaValue a_asNy => a_asNy -> Meta
- Text.Pandoc.CrossRef: lstPrefixTemplate :: forall a_asND. ToMetaValue a_asND => a_asND -> Meta
- Text.Pandoc.CrossRef: nameInLink :: forall a_asO5. ToMetaValue a_asO5 => a_asO5 -> Meta
- Text.Pandoc.CrossRef: numberSections :: forall a_asNt. ToMetaValue a_asNt => a_asNt -> Meta
- Text.Pandoc.CrossRef: outFormat :: forall a_asNQ. ToMetaValue a_asNQ => a_asNQ -> Meta
- Text.Pandoc.CrossRef: pairDelim :: forall a_asNK. ToMetaValue a_asNK => a_asNK -> Meta
- Text.Pandoc.CrossRef: rangeDelim :: forall a_asNJ. ToMetaValue a_asNJ => a_asNJ -> Meta
- Text.Pandoc.CrossRef: refDelim :: forall a_asNM. ToMetaValue a_asNM => a_asNM -> Meta
- Text.Pandoc.CrossRef: refIndexTemplate :: forall a_asNF. ToMetaValue a_asNF => a_asNF -> Meta
- Text.Pandoc.CrossRef: secHeaderDelim :: forall a_atgb. ToMetaValue a_atgb => a_atgb -> Meta
- Text.Pandoc.CrossRef: secHeaderTemplate :: forall a_asNH. ToMetaValue a_asNH => a_asNH -> Meta
- Text.Pandoc.CrossRef: secLabels :: forall a_atga. ToMetaValue a_atga => a_atga -> Meta
- Text.Pandoc.CrossRef: secPrefix :: forall a_asNz. ToMetaValue a_asNz => a_asNz -> Meta
- Text.Pandoc.CrossRef: secPrefixTemplate :: forall a_asNE. ToMetaValue a_asNE => a_asNE -> Meta
- Text.Pandoc.CrossRef: sectionsDepth :: forall a_asNu. ToMetaValue a_asNu => a_asNu -> Meta
- Text.Pandoc.CrossRef: setLabelAttribute :: forall a_asO6. ToMetaValue a_asO6 => a_asO6 -> Meta
- Text.Pandoc.CrossRef: subfigGrid :: forall a_asO3. ToMetaValue a_asO3 => a_asO3 -> Meta
- Text.Pandoc.CrossRef: subfigLabels :: forall a_atg4. ToMetaValue a_atg4 => a_atg4 -> Meta
- Text.Pandoc.CrossRef: subfigureChildTemplate :: forall a_asNT. ToMetaValue a_asNT => a_asNT -> Meta
- Text.Pandoc.CrossRef: subfigureRefIndexTemplate :: forall a_asNG. ToMetaValue a_asNG => a_asNG -> Meta
- Text.Pandoc.CrossRef: subfigureTemplate :: forall a_asNS. ToMetaValue a_asNS => a_asNS -> Meta
- Text.Pandoc.CrossRef: tableEqns :: forall a_asO1. ToMetaValue a_asO1 => a_asO1 -> Meta
- Text.Pandoc.CrossRef: tableTemplate :: forall a_asNV. ToMetaValue a_asNV => a_asNV -> Meta
- Text.Pandoc.CrossRef: tableTitle :: forall a_atg0. ToMetaValue a_atg0 => a_atg0 -> Meta
- Text.Pandoc.CrossRef: tblLabels :: forall a_atg8. ToMetaValue a_atg8 => a_atg8 -> Meta
- Text.Pandoc.CrossRef: tblPrefix :: forall a_asNx. ToMetaValue a_asNx => a_asNx -> Meta
- Text.Pandoc.CrossRef: tblPrefixTemplate :: forall a_asNC. ToMetaValue a_asNC => a_asNC -> Meta
- Text.Pandoc.CrossRef: titleDelim :: forall a_atg2. ToMetaValue a_atg2 => a_atg2 -> Meta

Files

CHANGELOG.md view
@@ -1,3 +1,10 @@+## 0.3.11.0++-   Add equationNumberTeX option+-   Add title variable to refIndexTemplate; make refIndexTemplate per-prefix+-   Update to pandoc 2.14+-   Docs updates for --citeproc+ ## 0.3.10.0  -   \[Fix\] Avoid expensive set difference, use filter
docs/index.md view
@@ -30,11 +30,15 @@  It's a good idea to specify `--top-level-division=chapter` for any output format actually, because pandoc-crossref can't signal pandoc you want to use chapters, and vice versa. -## pandoc-citeproc and pandoc-crossref+## citeproc and pandoc-crossref -Since pandoc-crossref uses the same citation syntax as pandoc-citeproc,+Since pandoc-crossref uses the same citation syntax as citeproc, you *have* to run former *before* latter. For example: +    pandoc -F pandoc-crossref --citeproc file.md -o file.html++or+     pandoc -F pandoc-crossref -F pandoc-citeproc file.md -o file.html  ## Note on leading/trailing spaces in metadata options@@ -209,6 +213,14 @@ : Caption {#tbl:label} ``` +Alternatively, for formats that support it, you can use arbitrary LaTeX command accepting a single argument (that is, label text) for typesetting. A common example is `\tag`. Use `equationNumberTeX` metadata variable for that (set to special value `qquad` by default). For instance, to use `\tag`, you would have the following in your metadata:++```yaml+equationNumberTeX: \\tag+```++This option doesn't affect LaTeX output (which offloads numbering to the LaTeX engine).+ To label a table, append `{#tbl:label}` at the end of table caption (with `label` being something unique to reference this table by). Caption and label *must* be separated by at least one space.@@ -496,6 +508,9 @@     Depending on output format, this might work better or worse. -   `setLabelAttribute`, default `false`: set `label` attribute on objects to     actual number used for referencing. This can be useful for post-processing.+-   `equationNumberTeX`, default `qquad`: use a LaTeX command for typesetting+    equation numbers. Bear in mind, `qquad` is a special value; generally, you'll want to write out a full command, backslash and all. Also remember that metadata is parsed as Markdown, so you may need to escape backslashes.+    This option doesn't affect LaTeX output (which offloads numbering to the LaTeX engine).  ### Item title format @@ -711,8 +726,24 @@ `xPrefixTemplate`, where `x` is `fig`, `eqn`, etc, are a special case. Those don't have `t` variable, since there is no caption in source markdown, but instead have `p` variable, that binds to relevant-`xPrefix`. This is done this way, since actual prefix vaule can depend-on `i`.+`xPrefix`. This is done this way, since actual prefix value can depend+on `i`. In `xPrefixTemplate`, `i` references formatted object numbers, i.e. if given a list of references like `[@fig:1; @fig:2; @fig:3]`, here `i` will contain something like `1-3`.++`refIndexTemplate` is the template for the individual reference index. It can be either a plain template, or can be a YAML object with keys corresponding to different prefixes, and a special key `default` used as a fallback, e.g.++```yaml+refIndexTemplate:+  sec: $$i$$$$suf$$ ($$t$$)+  default: $$i$$$$suf$$+```++`refIndexTemplate` has the following internal variables defined:++- `i` -- formatted object index (possibly with chapter number)+- `suf` -- literal suffix used in the reference, e.g. given `[@fig:1 some suffix]`, `suf` will contain literally ` some suffix` (complete with the leading space)+- `t` -- object title, if any, or empty if the object has no title++`subfigureRefIndexTemplate` is roughly the same as `refIndexTemplate` but is used specifically for subfigures. It additionally has `s` variable defined, which is described above.  Additionally, a special syntax is provided for indexed access to array metadata variables: `arrayVariable[indexVariable]`, where `arrayVariable` is an array-like metadata variable, and `indexVariable` is an integer-typed template variable. If `indexVariable` is larger than length of `arrayVariable`, then the last
+ lib-internal/Text/Pandoc/CrossRef/References.hs view
@@ -0,0 +1,26 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++module Text.Pandoc.CrossRef.References ( module X ) where++import Text.Pandoc.CrossRef.References.Types as X+import Text.Pandoc.CrossRef.References.Blocks as X (replaceAll)+import Text.Pandoc.CrossRef.References.Refs as X+import Text.Pandoc.CrossRef.References.List as X
+ lib-internal/Text/Pandoc/CrossRef/References/Blocks.hs view
@@ -0,0 +1,439 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE Rank2Types, OverloadedStrings #-}+module Text.Pandoc.CrossRef.References.Blocks+  ( replaceAll+  ) where++import Text.Pandoc.Definition+import qualified Text.Pandoc.Builder as B+import Text.Pandoc.Shared (stringify, blocksToInlines)+import Text.Pandoc.Walk (walk)+import Control.Monad.State hiding (get, modify)+import Data.List+import Data.Maybe+import qualified Data.Map as M+import qualified Data.Text as T+import qualified Data.Text.Read as T++import Data.Accessor+import Data.Accessor.Monad.Trans.State+import Text.Pandoc.CrossRef.References.Types+import Text.Pandoc.CrossRef.Util.Util+import Text.Pandoc.CrossRef.Util.Options+import Text.Pandoc.CrossRef.Util.Template+import Control.Applicative+import Prelude+import Data.Default++replaceAll :: (Data a) => Options -> a -> WS a+replaceAll opts =+    runReplace (mkRR (replaceBlock opts)+      `extRR` replaceInline opts+      `extRR` replaceInlineMany opts+      )+  . runSplitMath+  . everywhere (mkT divBlocks `extT` spanInlines opts)+  where+    runSplitMath | tableEqns opts+                 , not $ isLatexFormat (outFormat opts)+                 = everywhere (mkT splitMath)+                 | otherwise = id++simpleTable :: [Alignment] -> [ColWidth] -> [[[Block]]] -> Block+simpleTable align width bod = Table nullAttr noCaption (zip align width)+  noTableHead [mkBody bod] noTableFoot+  where+  mkBody xs = TableBody nullAttr (RowHeadColumns 0) [] (map mkRow xs)+  mkRow xs = Row nullAttr (map mkCell xs)+  mkCell xs = Cell nullAttr AlignDefault (RowSpan 0) (ColSpan 0) xs+  noCaption = Caption Nothing mempty+  noTableHead = TableHead nullAttr []+  noTableFoot = TableFoot nullAttr []++setLabel :: Options -> [Inline] -> [(T.Text, T.Text)] -> [(T.Text, T.Text)]+setLabel opts idx+  | setLabelAttribute opts+  = (("label", stringify idx) :)+  . filter ((/= "label") . fst)+  | otherwise = id++replaceBlock :: Options -> Block -> WS (ReplacedResult Block)+replaceBlock opts (Header n (label, cls, attrs) text')+  = do+    let label' = if autoSectionLabels opts && not ("sec:" `T.isPrefixOf` label)+                 then "sec:"<>label+                 else label+    unless ("unnumbered" `elem` cls) $ do+      modify curChap $ \cc ->+        let ln = length cc+            cl i = lookup "label" attrs <|> customHeadingLabel opts n i <|> customLabel opts "sec" i+            inc l = let i = fst (last l) + 1 in init l <> [(i, cl i)]+            cc' | ln > n = inc $ take n cc+                | ln == n = inc cc+                | otherwise = cc <> take (n-ln-1) (zip [1,1..] $ repeat Nothing) <> [(1,cl 1)]+        in cc'+      when ("sec:" `T.isPrefixOf` label') $ do+        index  <- get curChap+        modify secRefs $ M.insert label' RefRec {+          refIndex=index+        , refTitle= text'+        , refSubfigure = Nothing+        }+    cc <- get curChap+    let textCC | numberSections opts+               , sectionsDepth opts < 0+               || n <= if sectionsDepth opts == 0 then chaptersDepth opts else sectionsDepth opts+               , "unnumbered" `notElem` cls+               = applyTemplate' (M.fromDistinctAscList [+                    ("i", idxStr)+                  , ("n", [Str $ T.pack $ show $ n - 1])+                  , ("t", text')+                  ]) $ secHeaderTemplate opts+               | otherwise = text'+        idxStr = chapPrefix (chapDelim opts) cc+        attrs' | "unnumbered" `notElem` cls+               = setLabel opts idxStr attrs+               | otherwise = attrs+    replaceNoRecurse $ Header n (label', cls, attrs') textCC+-- subfigures+replaceBlock opts (Div (label,cls,attrs) images)+  | "fig:" `T.isPrefixOf` label+  , Para caption <- last images+  = do+    idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) caption imgRefs+    let (cont, st) = runState (runReplace (mkRR $ replaceSubfigs opts') $ init images) def+        collectedCaptions = B.toList $+            intercalate' (B.fromList $ ccsDelim opts)+          $ map (B.fromList . collectCaps . snd)+          $ sortOn (refIndex . snd)+          $ filter (not . null . refTitle . snd)+          $ M.toList+          $ imgRefs_ st+        collectCaps v =+              applyTemplate+                (chapPrefix (chapDelim opts) (refIndex v))+                (refTitle v)+                (ccsTemplate opts)+        vars = M.fromDistinctAscList+                  [ ("ccs", collectedCaptions)+                  , ("i", idxStr)+                  , ("t", caption)+                  ]+        capt = applyTemplate' vars $ subfigureTemplate opts+    lastRef <- fromJust . M.lookup label <$> get imgRefs+    modify imgRefs $ \old ->+        M.union+          old+          (M.map (\v -> v{refIndex = refIndex lastRef, refSubfigure = Just $ refIndex v})+          $ imgRefs_ st)+    case outFormat opts of+          f | isLatexFormat f ->+            replaceNoRecurse $ Div nullAttr $+              [ RawBlock (Format "latex") "\\begin{pandoccrossrefsubfigures}" ]+              <> cont <>+              [ Para [RawInline (Format "latex") "\\caption["+                       , Span nullAttr (removeFootnotes caption)+                       , RawInline (Format "latex") "]"+                       , Span nullAttr caption]+              , RawBlock (Format "latex") $ mkLaTeXLabel label+              , RawBlock (Format "latex") "\\end{pandoccrossrefsubfigures}"]+          _  -> replaceNoRecurse $ Div (label, "subfigures":cls, setLabel opts idxStr attrs) $ toTable cont capt+  where+    opts' = opts+              { figureTemplate = subfigureChildTemplate opts+              , customLabel = \r i -> customLabel opts ("sub"<>r) i+              }+    removeFootnotes = walk removeFootnote+    removeFootnote Note{} = Str ""+    removeFootnote x = x+    toTable :: [Block] -> [Inline] -> [Block]+    toTable blks capt+      | subfigGrid opts = [ simpleTable align (map ColWidth widths) (map blkToRow blks)+                          , mkCaption opts "Image Caption" capt]+      | otherwise = blks <> [mkCaption opts "Image Caption" capt]+      where+        align | Para ils:_ <- blks = replicate (length $ mapMaybe getWidth ils) AlignCenter+              | otherwise = error "Misformatted subfigures block"+        widths | Para ils:_ <- blks+               = fixZeros $ mapMaybe getWidth ils+               | otherwise = error "Misformatted subfigures block"+        getWidth (Image (_id, _class, as) _ _)+          = Just $ maybe 0 percToDouble $ lookup "width" as+        getWidth _ = Nothing+        fixZeros :: [Double] -> [Double]+        fixZeros ws+          = let nz = length $ filter (== 0) ws+                rzw = (0.99 - sum ws) / fromIntegral nz+            in if nz>0+               then map (\x -> if x == 0 then rzw else x) ws+               else ws+        percToDouble :: T.Text -> Double+        percToDouble percs+          | Right (perc, "%") <- T.double percs+          = perc/100.0+          | otherwise = error "Only percent allowed in subfigure width!"+        blkToRow :: Block -> [[Block]]+        blkToRow (Para inls) = mapMaybe inlToCell inls+        blkToRow x = [[x]]+        inlToCell :: Inline -> Maybe [Block]+        inlToCell (Image (id', cs, as) txt tgt)  = Just [Para [Image (id', cs, setW as) txt tgt]]+        inlToCell _ = Nothing+        setW as = ("width", "100%"):filter ((/="width") . fst) as+replaceBlock opts (Div (label,clss,attrs) [Table tattr (Caption short (btitle:rest)) colspec header cells foot])+  | not $ null title+  , "tbl:" `T.isPrefixOf` label+  = do+    idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) title tblRefs+    let title' =+          case outFormat opts of+              f | isLatexFormat f ->+                RawInline (Format "latex") (mkLaTeXLabel label) : title+              _  -> applyTemplate idxStr title $ tableTemplate opts+        caption' = Caption short (walkReplaceInlines title' title btitle:rest)+    replaceNoRecurse $ Div (label, clss, setLabel opts idxStr attrs) [Table tattr caption' colspec header cells foot]+  where title = blocksToInlines [btitle]+replaceBlock opts (Table (label,clss,attrs) (Caption short (btitle:rest)) colspec header cells foot)+  | not $ null title+  , "tbl:" `T.isPrefixOf` label+  = do+    idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) title tblRefs+    let title' =+          case outFormat opts of+              f | isLatexFormat f ->+                RawInline (Format "latex") (mkLaTeXLabel label) : title+              _  -> applyTemplate idxStr title $ tableTemplate opts+        caption' = Caption short (walkReplaceInlines title' title btitle:rest)+    replaceNoRecurse $ Table (label, clss, setLabel opts idxStr attrs) caption' colspec header cells foot+  where title = blocksToInlines [btitle]+replaceBlock opts cb@(CodeBlock (label, classes, attrs) code)+  | not $ T.null label+  , "lst:" `T.isPrefixOf` label+  , Just caption <- lookup "caption" attrs+  = case outFormat opts of+      f+        --if used with listings package,nothing shoud be done+        | isLatexFormat f, listings opts -> noReplaceNoRecurse+        --if not using listings, however, wrap it in a codelisting environment+        | isLatexFormat f ->+          replaceNoRecurse $ Div nullAttr [+              RawBlock (Format "latex") "\\begin{codelisting}"+            , Plain [+                RawInline (Format "latex") "\\caption{"+              , Str caption+              , RawInline (Format "latex") "}"+              ]+            , cb+            , RawBlock (Format "latex") "\\end{codelisting}"+            ]+      _ -> do+        let cap = B.toList $ B.text caption+        idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) cap lstRefs+        let caption' = applyTemplate idxStr cap $ listingTemplate opts+        replaceNoRecurse $ Div (label, "listing":classes, []) [+            mkCaption opts "Caption" caption'+          , CodeBlock ("", classes, filter ((/="caption") . fst) $ setLabel opts idxStr attrs) code+          ]+replaceBlock opts+  (Div (label,"listing":divClasses, divAttrs)+    [Para caption, CodeBlock ("",cbClasses,cbAttrs) code])+  | not $ T.null label+  , "lst:" `T.isPrefixOf` label+  = case outFormat opts of+      f+        --if used with listings package, return code block with caption+        | isLatexFormat f, listings opts ->+          replaceNoRecurse $ CodeBlock (label,classes,("caption",escapeLaTeX $ stringify caption):attrs) code+        --if not using listings, however, wrap it in a codelisting environment+        | isLatexFormat f ->+          replaceNoRecurse $ Div nullAttr [+              RawBlock (Format "latex") "\\begin{codelisting}"+            , Para [+                RawInline (Format "latex") "\\caption"+              , Span nullAttr caption+              ]+            , CodeBlock (label,classes,attrs) code+            , RawBlock (Format "latex") "\\end{codelisting}"+            ]+      _ -> do+        idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) caption lstRefs+        let caption' = applyTemplate idxStr caption $ listingTemplate opts+        replaceNoRecurse $ Div (label, "listing":classes, []) [+            mkCaption opts "Caption" caption'+          , CodeBlock ("", classes, setLabel opts idxStr attrs) code+          ]+  where attrs = divAttrs <> cbAttrs+        classes = nub $ divClasses <> cbClasses+replaceBlock opts (Para [Span sattrs@(label, cls, attrs) [Math DisplayMath eq]])+  | not $ isLatexFormat (outFormat opts)+  , tableEqns opts+  = do+    (eq', idxStr) <- replaceEqn opts sattrs eq+    replaceNoRecurse $ Div (label,cls,setLabel opts idxStr attrs) [+      simpleTable [AlignCenter, AlignRight] [ColWidth 0.9, ColWidth 0.09]+       [[[Plain [Math DisplayMath eq']], [eqnNumber $ stringify idxStr]]]]+  where+  eqnNumber idx+    | outFormat opts == Just (Format "docx")+    = Div nullAttr [+        RawBlock (Format "openxml") "<w:tcPr><w:vAlign w:val=\"center\"/></w:tcPr>"+      , mathIdx+      ]+    | otherwise = mathIdx+    where mathIdx = Plain [Math DisplayMath $ "(" <> idx <> ")"]+replaceBlock _ _ = noReplaceRecurse++replaceEqn :: Options -> Attr -> T.Text -> WS (T.Text, [Inline])+replaceEqn opts (label, _, attrs) eq = do+  let label' | T.null label = Left "eq"+             | otherwise = Right label+  idxStr <- replaceAttr opts label' (lookup "label" attrs) [] eqnRefs+  let eq' | tableEqns opts = eq+          | equationNumberTeX opts == "qquad" = eq<>"\\qquad("<>idxTxt<>")"+          | otherwise = eq<>equationNumberTeX opts<>"{"<>idxTxt<>"}"+      idxTxt = stringify idxStr+  return (eq', idxStr)++replaceInlineMany :: Options -> [Inline] -> WS (ReplacedResult [Inline])+replaceInlineMany opts (Span spanAttr@(label,clss,attrs) [Math DisplayMath eq]:xs)+  | "eq:" `T.isPrefixOf` label || T.null label && autoEqnLabels opts+  = replaceRecurse . (<>xs) =<< case outFormat opts of+      f | isLatexFormat f ->+        pure [RawInline (Format "latex") "\\begin{equation}"+        , Span spanAttr [RawInline (Format "latex") eq]+        , RawInline (Format "latex") $ mkLaTeXLabel label <> "\\end{equation}"]+      _ -> do+        (eq', idxStr) <- replaceEqn opts spanAttr eq+        pure [Span (label,clss,setLabel opts idxStr attrs) [Math DisplayMath eq']]+replaceInlineMany _ _ = noReplaceRecurse++replaceInline :: Options -> Inline -> WS (ReplacedResult Inline)+replaceInline opts (Image (label,cls,attrs) alt img@(_, tit))+  | "fig:" `T.isPrefixOf` label && "fig:" `T.isPrefixOf` tit+  = do+    idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) alt imgRefs+    let alt' = case outFormat opts of+          f | isLatexFormat f -> alt+          _  -> applyTemplate idxStr alt $ figureTemplate opts+    replaceNoRecurse $ Image (label,cls,setLabel opts idxStr attrs) alt' img+replaceInline _ _ = noReplaceRecurse++replaceSubfigs :: Options -> [Inline] -> WS (ReplacedResult [Inline])+replaceSubfigs opts = (replaceNoRecurse . concat) <=< mapM (replaceSubfig opts)++replaceSubfig :: Options -> Inline -> WS [Inline]+replaceSubfig opts x@(Image (label,cls,attrs) alt (src, tit))+  = do+      let label' | "fig:" `T.isPrefixOf` label = Right label+                 | T.null label = Left "fig"+                 | otherwise  = Right $ "fig:" <> label+      idxStr <- replaceAttr opts label' (lookup "label" attrs) alt imgRefs+      case outFormat opts of+        f | isLatexFormat f ->+          return $ latexSubFigure x label+        _  ->+          let alt' = applyTemplate idxStr alt $ figureTemplate opts+              tit' | "nocaption" `elem` cls = fromMaybe tit $ T.stripPrefix "fig:" tit+                   | "fig:" `T.isPrefixOf` tit = tit+                   | otherwise = "fig:" <> tit+          in return [Image (label, cls, setLabel opts idxStr attrs) alt' (src, tit')]+replaceSubfig _ x = return [x]++divBlocks :: Block -> Block+divBlocks (Table tattr (Caption short (btitle:rest)) colspec header cells foot)+  | not $ null title+  , Just label <- getRefLabel "tbl" [last title]+  = Div (label,[],[]) [+    Table tattr (Caption short $ walkReplaceInlines (dropWhileEnd isSpace (init title)) title btitle:rest) colspec header cells foot]+  where+    title = blocksToInlines [btitle]+divBlocks x = x++walkReplaceInlines :: [Inline] -> [Inline] -> Block -> Block+walkReplaceInlines newTitle title = walk replaceInlines+  where+  replaceInlines xs+    | xs == title = newTitle+    | otherwise = xs++splitMath :: [Block] -> [Block]+splitMath (Para ils:xs)+  | length ils > 1 = map Para (split [] [] ils) <> xs+  where+    split res acc [] = reverse (reverse acc : res)+    split res acc (x@(Span _ [Math DisplayMath _]):ys) =+      split ([x] : reverse (dropSpaces acc) : res)+            [] (dropSpaces ys)+    split res acc (y:ys) = split res (y:acc) ys+    dropSpaces = dropWhile isSpace+splitMath xs = xs++spanInlines :: Options -> [Inline] -> [Inline]+spanInlines opts (math@(Math DisplayMath _eq):ils)+  | c:ils' <- dropWhile isSpace ils+  , Just label <- getRefLabel "eq" [c]+  = Span (label,[],[]) [math]:ils'+  | autoEqnLabels opts+  = Span nullAttr [math]:ils+spanInlines _ x = x++replaceAttr :: Options -> Either T.Text T.Text -> Maybe T.Text -> [Inline] -> Accessor References RefMap -> WS [Inline]+replaceAttr o label refLabel title prop+  = do+    chap  <- take (chaptersDepth o) `fmap` get curChap+    prop' <- get prop+    let i = 1+ (M.size . M.filter (\x -> (chap == init (refIndex x)) && isNothing (refSubfigure x)) $ prop')+        index = chap <> [(i, refLabel <|> customLabel o ref i)]+        ref = either id (T.takeWhile (/=':')) label+        label' = either (<> T.pack (':' : show index)) id label+    when (M.member label' prop') $+      error . T.unpack $ "Duplicate label: " <> label'+    modify prop $ M.insert label' RefRec {+      refIndex= index+    , refTitle= title+    , refSubfigure = Nothing+    }+    return $ chapPrefix (chapDelim o) index++latexSubFigure :: Inline -> T.Text -> [Inline]+latexSubFigure (Image (_, cls, attrs) alt (src, title)) label =+  let+    title' = fromMaybe title $ T.stripPrefix "fig:" title+    texlabel | T.null label = []+             | otherwise = [RawInline (Format "latex") $ mkLaTeXLabel label]+    texalt | "nocaption" `elem` cls  = []+           | otherwise = concat+              [ [ RawInline (Format "latex") "["]+              , alt+              , [ RawInline (Format "latex") "]"]+              ]+    img = Image (label, cls, attrs) alt (src, title')+  in concat [+      [ RawInline (Format "latex") "\\subfloat" ]+      , texalt+      , [Span nullAttr $ img:texlabel]+      ]+latexSubFigure x _ = [x]++mkCaption :: Options -> T.Text -> [Inline] -> Block+mkCaption opts style+  | outFormat opts == Just (Format "docx") = Div ("", [], [("custom-style", style)]) . return . Para+  | otherwise = Para
+ lib-internal/Text/Pandoc/CrossRef/References/List.hs view
@@ -0,0 +1,62 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE OverloadedStrings #-}+module Text.Pandoc.CrossRef.References.List (listOf) where++import Text.Pandoc.Definition+import Data.Accessor.Monad.Trans.State+import Control.Arrow+import Data.List+import qualified Data.Map as M+import qualified Data.Text as T++import Text.Pandoc.CrossRef.References.Types+import Text.Pandoc.CrossRef.Util.Util+import Text.Pandoc.CrossRef.Util.Options++listOf :: Options -> [Block] -> WS [Block]+listOf Options{outFormat=f} x | isLatexFormat f = return x+listOf opts (RawBlock fmt "\\listoffigures":xs)+  | isLaTeXRawBlockFmt fmt+  = get imgRefs >>= makeList opts lofTitle xs+listOf opts (RawBlock fmt "\\listoftables":xs)+  | isLaTeXRawBlockFmt fmt+  = get tblRefs >>= makeList opts lotTitle xs+listOf opts (RawBlock fmt "\\listoflistings":xs)+  | isLaTeXRawBlockFmt fmt+  = get lstRefs >>= makeList opts lolTitle xs+listOf _ x = return x++makeList :: Options -> (Options -> [Block]) -> [Block] -> M.Map T.Text RefRec -> WS [Block]+makeList opts titlef xs refs+  = return $+      titlef opts +++      (if chaptersDepth opts > 0+        then Div ("", ["list"], []) (itemChap `map` refsSorted)+        else OrderedList style (item `map` refsSorted))+      : xs+  where+    refsSorted = sortBy compare' $ M.toList refs+    compare' (_,RefRec{refIndex=i}) (_,RefRec{refIndex=j}) = compare i j+    item = (:[]) . Plain . refTitle . snd+    itemChap = Para . uncurry ((. (Space :)) . (++)) . (numWithChap . refIndex &&& refTitle) . snd+    numWithChap = chapPrefix (chapDelim opts)+    style = (1,DefaultStyle,DefaultDelim)
+ lib-internal/Text/Pandoc/CrossRef/References/Refs.hs view
@@ -0,0 +1,262 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE OverloadedStrings #-}+module Text.Pandoc.CrossRef.References.Refs (replaceRefs) where++import Text.Pandoc.Definition+import Text.Pandoc.Builder+import Control.Monad.State hiding (get, modify)+import Data.List+import qualified Data.List.HT as HT+import qualified Data.Text as T+import Data.Maybe+import Data.Function+import qualified Data.Map as M+import Control.Arrow as A++import Data.Accessor+import Data.Accessor.Monad.Trans.State+import Text.Pandoc.CrossRef.References.Types+import Text.Pandoc.CrossRef.Util.Template+import Text.Pandoc.CrossRef.Util.Util+import Text.Pandoc.CrossRef.Util.Options+import Control.Applicative+import Debug.Trace+import Prelude++replaceRefs :: Options -> [Inline] -> WS [Inline]+replaceRefs opts (Cite cits _:xs)+  = toList . (<> fromList xs) . intercalate' (text ", ") . map fromList <$> mapM replaceRefs' (groupBy eqPrefix cits)+  where+    eqPrefix a b = uncurry (==) $+      (fmap uncapitalizeFirst . getLabelPrefix . citationId) <***> (a,b)+    (<***>) = join (***)+    replaceRefs' cits'+      | Just prefix <- allCitsPrefix cits'+      = replaceRefs'' prefix opts cits'+      | otherwise = return [Cite cits' il']+        where+          il' = toList $+              str "["+            <> intercalate' (text "; ") (map citationToInlines cits')+            <> str "]"+          citationToInlines c =+            fromList (citationPrefix c) <> text ("@" <> citationId c)+              <> fromList (citationSuffix c)+    replaceRefs'' = case outFormat opts of+                    f | isLatexFormat f -> replaceRefsLatex+                    _                      -> replaceRefsOther+replaceRefs _ x = return x++-- accessors to state variables+accMap :: M.Map T.Text (Accessor References RefMap)+accMap = M.fromList [("fig:",imgRefs)+                    ,("eq:" ,eqnRefs)+                    ,("tbl:",tblRefs)+                    ,("lst:",lstRefs)+                    ,("sec:",secRefs)+                    ]++-- accessors to options+prefMap :: M.Map T.Text (Options -> Bool -> Int -> [Inline], Options -> Template)+prefMap = M.fromList [("fig:",(figPrefix, figPrefixTemplate))+                     ,("eq:" ,(eqnPrefix, eqnPrefixTemplate))+                     ,("tbl:",(tblPrefix, tblPrefixTemplate))+                     ,("lst:",(lstPrefix, lstPrefixTemplate))+                     ,("sec:",(secPrefix, secPrefixTemplate))+                     ]++prefixes :: [T.Text]+prefixes = M.keys accMap++getRefPrefix :: Options -> T.Text -> Bool -> Int -> [Inline] -> [Inline]+getRefPrefix opts prefix capitalize num cit =+  applyTemplate' (M.fromDistinctAscList [("i", cit), ("p", refprefix)])+        $ reftempl opts+  where (refprefixf, reftempl) = lookupUnsafe prefix prefMap+        refprefix = refprefixf opts capitalize num+++lookupUnsafe :: Ord k => k -> M.Map k v -> v+lookupUnsafe = (fromJust .) . M.lookup++allCitsPrefix :: [Citation] -> Maybe T.Text+allCitsPrefix cits = find isCitationPrefix prefixes+  where+  isCitationPrefix p =+    all ((p `T.isPrefixOf`) . uncapitalizeFirst . citationId) cits++replaceRefsLatex :: T.Text -> Options -> [Citation] -> WS [Inline]+replaceRefsLatex prefix opts cits+  | cref opts+  = replaceRefsLatex' prefix opts cits+  | otherwise+  = toList . intercalate' (text ", ") . map fromList <$>+      mapM (replaceRefsLatex' prefix opts) (groupBy citationGroupPred cits)++replaceRefsLatex' :: T.Text -> Options -> [Citation] -> WS [Inline]+replaceRefsLatex' prefix opts cits =+  return $ p [texcit]+  where+    texcit =+      RawInline (Format "tex") $+      if cref opts then+        cref'<>"{"<>listLabels prefix "" "," "" cits<>"}"+        else+          listLabels prefix "\\ref{" ", " "}" cits+    suppressAuthor = all ((==SuppressAuthor) . citationMode) cits+    noPrefix = all (null . citationPrefix) cits+    p | cref opts = id+      | suppressAuthor+      = id+      | noPrefix+      = getRefPrefix opts prefix cap (length cits - 1)+      | otherwise = ((citationPrefix (head cits) <> [Space]) <>)+    cap = maybe False isFirstUpper $ getLabelPrefix . citationId . head $ cits+    cref' | suppressAuthor = "\\labelcref"+          | cap = "\\Cref"+          | otherwise = "\\cref"++listLabels :: T.Text -> T.Text -> T.Text -> T.Text -> [Citation] -> T.Text+listLabels prefix p sep s =+  T.intercalate sep . map ((p <>) . (<> s) . mkLaTeXLabel' . (prefix<>) . getLabelWithoutPrefix . citationId)++getLabelWithoutPrefix :: T.Text -> T.Text+getLabelWithoutPrefix = T.drop 1 . T.dropWhile (/=':')++getLabelPrefix :: T.Text -> Maybe T.Text+getLabelPrefix lab+  | uncapitalizeFirst p `elem` prefixes = Just p+  | otherwise = Nothing+  where p = flip T.snoc ':' . T.takeWhile (/=':') $ lab++replaceRefsOther :: T.Text -> Options -> [Citation] -> WS [Inline]+replaceRefsOther prefix opts cits = toList . intercalate' (text ", ") . map fromList <$>+    mapM (replaceRefsOther' prefix opts) (groupBy citationGroupPred cits)++citationGroupPred :: Citation -> Citation -> Bool+citationGroupPred = (==) `on` liftM2 (,) citationPrefix citationMode++replaceRefsOther' :: T.Text -> Options -> [Citation] -> WS [Inline]+replaceRefsOther' prefix opts cits = do+  indices <- mapM (getRefIndex prefix opts) cits+  let+    cap = maybe False isFirstUpper $ getLabelPrefix . citationId . head $ cits+    writePrefix | all ((==SuppressAuthor) . citationMode) cits+                = id+                | all (null . citationPrefix) cits+                = cmap $ getRefPrefix opts prefix cap (length cits - 1)+                | otherwise+                = cmap $ toList . ((fromList (citationPrefix (head cits)) <> space) <>) . fromList+    cmap f [Link attr t w]+      | nameInLink opts = [Link attr (f t) w]+    cmap f x = f x+  return $ writePrefix (makeIndices opts indices)++data RefData = RefData { rdLabel :: T.Text+                       , rdIdx :: Maybe Index+                       , rdSubfig :: Maybe Index+                       , rdSuffix :: [Inline]+                       , rdTitle :: Maybe [Inline]+                       , rdPfx :: T.Text+                       } deriving (Eq)++instance Ord RefData where+  (<=) = (<=) `on` rdIdx++getRefIndex :: T.Text -> Options -> Citation -> WS RefData+getRefIndex prefix _opts Citation{citationId=cid,citationSuffix=suf}+  = do+    ref <- M.lookup lab <$> get prop+    let sub = refSubfigure <$> ref+        idx = refIndex <$> ref+        tit = refTitle <$> ref+    return RefData+      { rdLabel = lab+      , rdIdx = idx+      , rdSubfig = join sub+      , rdSuffix = suf+      , rdTitle = tit+      , rdPfx = prefix+      }+  where+  prop = lookupUnsafe prefix accMap+  lab = prefix <> getLabelWithoutPrefix cid++data RefItem = RefRange RefData RefData | RefSingle RefData++makeIndices :: Options -> [RefData] -> [Inline]+makeIndices o s = format $ concatMap f $ HT.groupBy g $ sort $ nub s+  where+  g :: RefData -> RefData -> Bool+  g a b = all (null . rdSuffix) [a, b] && (+            all (isNothing . rdSubfig) [a, b] &&+            Just True == (liftM2 follows `on` rdIdx) b a ||+            rdIdx a == rdIdx b &&+            Just True == (liftM2 follows `on` rdSubfig) b a+          )+  follows :: Index -> Index -> Bool+  follows a b+    | Just (ai, al) <- HT.viewR a+    , Just (bi, bl) <- HT.viewR b+    = ai == bi && A.first (+1) bl == al+  follows _ _ = False+  f :: [RefData] -> [RefItem]+  f []  = []                          -- drop empty lists+  f [w] = [RefSingle w]                   -- single value+  f [w1,w2] = [RefSingle w1, RefSingle w2] -- two values+  f (x:xs) = [RefRange x (last xs)] -- shorten more than two values+  format :: [RefItem] -> [Inline]+  format [] = []+  format [x] = toList $ show'' x+  format [x, y] = toList $ show'' x <> fromList (pairDelim o) <> show'' y+  format xs = toList $ intercalate' (fromList $ refDelim o) init' <> fromList (lastDelim o) <> last'+    where initlast []     = error "emtpy list in initlast"+          initlast [y]    = ([], y)+          initlast (y:ys) = first (y:) $ initlast ys+          (init', last') = initlast $ map show'' xs+  show'' :: RefItem -> Inlines+  show'' (RefSingle x) = show' x+  show'' (RefRange x y) = show' x <> fromList (rangeDelim o) <> show' y+  show' :: RefData -> Inlines+  show' RefData{rdLabel=l, rdIdx=Just i, rdSubfig = sub, rdSuffix = suf, rdTitle=tit, rdPfx=pfx}+    | linkReferences o = link ('#' `T.cons` l) "" (fromList txt)+    | otherwise = fromList txt+    where+      txt+        | Just sub' <- sub+        = let vars = M.fromDistinctAscList+                      [ ("i", chapPrefix (chapDelim o) i)+                      , ("s", chapPrefix (chapDelim o) sub')+                      , ("suf", suf)+                      , ("t", fromMaybe mempty tit)+                      ]+          in applyTemplate' vars $ subfigureRefIndexTemplate o+        | otherwise+        = let vars = M.fromDistinctAscList+                      [ ("i", chapPrefix (chapDelim o) i)+                      , ("suf", suf)+                      , ("t", fromMaybe mempty tit)+                      ]+          in applyTemplate' vars $ refIndexTemplate o (T.dropEnd 1 pfx)+  show' RefData{rdLabel=l, rdIdx=Nothing, rdSuffix = suf} =+    trace (T.unpack $ "Undefined cross-reference: " <> l)+          (strong (text $ "¿" <> l <> "?") <> fromList suf)
+ lib-internal/Text/Pandoc/CrossRef/References/Types.hs view
@@ -0,0 +1,56 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE TemplateHaskell #-}+module Text.Pandoc.CrossRef.References.Types where++import qualified Data.Map as M+import Text.Pandoc.Definition+import Control.Monad.State+import Data.Default+import Data.Accessor.Template+import Data.Text (Text)++type Index = [(Int, Maybe Text)]++data RefRec = RefRec { refIndex :: Index+                     , refTitle :: [Inline]+                     , refSubfigure :: Maybe Index+                     } deriving (Show, Eq)++type RefMap = M.Map Text RefRec++-- state data type+data References = References { imgRefs_ :: RefMap+                             , eqnRefs_ :: RefMap+                             , tblRefs_ :: RefMap+                             , lstRefs_ :: RefMap+                             , secRefs_ :: RefMap+                             , curChap_ :: Index+                             } deriving (Show, Eq)++--state monad+type WS a = State References a++instance Default References where+  def = References n n n n n []+    where n = M.empty++deriveAccessors ''References
+ lib-internal/Text/Pandoc/CrossRef/Util/CodeBlockCaptions.hs view
@@ -0,0 +1,67 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE OverloadedStrings #-}+module Text.Pandoc.CrossRef.Util.CodeBlockCaptions+    (+    mkCodeBlockCaptions+    ) where++import Text.Pandoc.Definition+import Data.List (stripPrefix)+import Data.Maybe (fromMaybe)+import Text.Pandoc.CrossRef.References.Types+import Text.Pandoc.CrossRef.Util.Options+import Text.Pandoc.CrossRef.Util.Util+import qualified Data.Text as T++mkCodeBlockCaptions :: Options -> [Block] -> WS [Block]+mkCodeBlockCaptions opts x@(cb@(CodeBlock _ _):p@(Para _):xs)+  = return $ fromMaybe x $ orderAgnostic opts $ p:cb:xs+mkCodeBlockCaptions opts x@(p@(Para _):cb@(CodeBlock _ _):xs)+  = return $ fromMaybe x $ orderAgnostic opts $ p:cb:xs+mkCodeBlockCaptions _ x = return x++orderAgnostic :: Options -> [Block] -> Maybe [Block]+orderAgnostic opts (Para ils:CodeBlock (label,classes,attrs) code:xs)+  | codeBlockCaptions opts+  , Just caption <- getCodeBlockCaption ils+  , not $ T.null label+  , "lst" `T.isPrefixOf` label+  = return $ Div (label,["listing"], [])+      [Para caption, CodeBlock ("",classes,attrs) code] : xs+orderAgnostic opts (Para ils:CodeBlock (_,classes,attrs) code:xs)+  | codeBlockCaptions opts+  , Just (caption, labinl) <- splitLast <$> getCodeBlockCaption ils+  , Just label <- getRefLabel "lst" labinl+  = return $ Div (label,["listing"], [])+      [Para $ init caption, CodeBlock ("",classes,attrs) code] : xs+  where+    splitLast xs' = splitAt (length xs' - 1) xs'+orderAgnostic _ _ = Nothing++getCodeBlockCaption :: [Inline] -> Maybe [Inline]+getCodeBlockCaption ils+  | Just caption <- [Str "Listing:",Space] `stripPrefix` ils+  = Just caption+  | Just caption <- [Str ":",Space] `stripPrefix` ils+  = Just caption+  | otherwise+  = Nothing
+ lib-internal/Text/Pandoc/CrossRef/Util/CustomLabels.hs view
@@ -0,0 +1,55 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE OverloadedStrings #-}+module Text.Pandoc.CrossRef.Util.CustomLabels (customLabel, customHeadingLabel) where++import Text.Pandoc.Definition+import Text.Pandoc.CrossRef.Util.Meta+import Text.Numeral.Roman+import qualified Data.Text as T++customLabel :: Meta -> T.Text -> Int -> Maybe T.Text+customLabel meta ref i+  | refLabel <- T.takeWhile (/=':') ref+  , Just cl <- lookupMeta (refLabel <> "Labels") meta+  = mkLabel i (refLabel <> "Labels") cl+  | otherwise = Nothing++customHeadingLabel :: Meta -> Int -> Int -> Maybe T.Text+customHeadingLabel meta lvl i+  | Just cl <- getMetaList Just "secLevelLabels" meta (lvl-1)+  = mkLabel i "secLevelLabels" cl+  | otherwise = Nothing++mkLabel :: Int -> T.Text -> MetaValue -> Maybe T.Text+mkLabel i n lt+  | MetaList _ <- lt+  , Just val <- toString n <$> getList (i-1) lt+  = Just val+  | toString n lt == "arabic"+  = Nothing+  | toString n lt == "roman"+  = Just $ toRoman i+  | toString n lt == "lowercase roman"+  = Just $ T.toLower $ toRoman i+  | Just (startWith, _) <- T.uncons =<< T.stripPrefix "alpha " (toString n lt)+  = Just . T.singleton $ [startWith..] !! (i-1)+  | otherwise = error $ "Unknown numeration type: " ++ show lt
+ lib-internal/Text/Pandoc/CrossRef/Util/Meta.hs view
@@ -0,0 +1,123 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE FlexibleContexts, Rank2Types #-}+module Text.Pandoc.CrossRef.Util.Meta (+    getMetaList+  , getMetaBool+  , getMetaInlines+  , getMetaBlock+  , getMetaString+  , getList+  , toString+  , toInlines+  , tryCapitalizeM+  ) where++import Text.Pandoc.CrossRef.Util.Util+import Text.Pandoc.Definition+import Text.Pandoc.Builder+import Data.Default+import Text.Pandoc.Walk+import Text.Pandoc.Shared hiding (capitalize, toString)+import qualified Data.Text as T++getMetaList :: (Default a) => (MetaValue -> a) -> T.Text -> Meta -> Int -> a+getMetaList f name meta i = maybe def f $ lookupMeta name meta >>= getList i++getMetaBool :: T.Text -> Meta -> Bool+getMetaBool = getScalar toBool++getMetaInlines :: T.Text -> Meta -> [Inline]+getMetaInlines = getScalar toInlines++getMetaBlock :: T.Text -> Meta -> [Block]+getMetaBlock = getScalar toBlocks++getMetaString :: T.Text -> Meta -> T.Text+getMetaString = getScalar toString++getScalar :: Def b => (T.Text -> MetaValue -> b) -> T.Text -> Meta -> b+getScalar conv name meta = maybe def' (conv name) $ lookupMeta name meta++class Def a where+  def' :: a++instance Def Bool where+  def' = False++instance Def [a] where+  def' = []++instance Def T.Text where+  def' = T.empty++unexpectedError :: forall a. String -> T.Text -> MetaValue -> a+unexpectedError e n x = error $ "Expected " <> e <> " in metadata field " <> T.unpack n <> " but got " <> g x+  where+    g (MetaBlocks _) = "blocks"+    g (MetaString _) = "string"+    g (MetaInlines _) = "inlines"+    g (MetaBool _) = "bool"+    g (MetaMap _) = "map"+    g (MetaList _) = "list"++toInlines :: T.Text -> MetaValue -> [Inline]+toInlines _ (MetaBlocks s) = blocksToInlines s+toInlines _ (MetaInlines s) = s+toInlines _ (MetaString s) = toList $ text s+toInlines n x = unexpectedError "inlines" n x++toBool :: T.Text -> MetaValue -> Bool+toBool _ (MetaBool b) = b+toBool n x = unexpectedError "bool" n x++toBlocks :: T.Text -> MetaValue -> [Block]+toBlocks _ (MetaBlocks bs) = bs+toBlocks _ (MetaInlines ils) = [Plain ils]+toBlocks _ (MetaString s) = toList $ plain $ text s+toBlocks n x = unexpectedError "blocks" n x++toString :: T.Text -> MetaValue -> T.Text+toString _ (MetaString s) = s+toString _ (MetaBlocks b) = stringify b+toString _ (MetaInlines i) = stringify i+toString n x = unexpectedError "string" n x++getList :: Int -> MetaValue -> Maybe MetaValue+getList i (MetaList l) = l !!? i+  where+    list !!? index | index >= 0 && index < length list = Just $ list !! index+                   | not $ null list = Just $ last list+                   | otherwise = Nothing+getList _ x = Just x++tryCapitalizeM :: (Functor m, Monad m, Walkable Inline a, Default a, Eq a) =>+        (T.Text -> m a) -> T.Text -> Bool -> m a+tryCapitalizeM f varname capitalize+  | capitalize = do+    res <- f (capitalizeFirst varname)+    case res of+      xs | xs == def -> f varname >>= walkM capStrFst+         | otherwise -> return xs+  | otherwise  = f varname+  where+    capStrFst (Str s) = return $ Str $ capitalizeFirst s+    capStrFst x = return x
+ lib-internal/Text/Pandoc/CrossRef/Util/ModifyMeta.hs view
@@ -0,0 +1,134 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE OverloadedStrings #-}+module Text.Pandoc.CrossRef.Util.ModifyMeta+    (+    modifyMeta+    ) where++import Text.Pandoc+import Text.Pandoc.Builder hiding ((<>))+import Text.Pandoc.CrossRef.Util.Options+import Text.Pandoc.CrossRef.Util.Meta+import Text.Pandoc.CrossRef.Util.Util+import qualified Data.Text as T+import Control.Monad.Writer++modifyMeta :: Options -> Meta -> Meta+modifyMeta opts meta+  | isLatexFormat (outFormat opts)+  = setMeta "header-includes"+      (headerInc $ lookupMeta "header-includes" meta)+      meta+  | otherwise = meta+  where+    headerInc :: Maybe MetaValue -> MetaValue+    headerInc Nothing = incList+    headerInc (Just (MetaList x)) = MetaList $ x <> [incList]+    headerInc (Just x) = MetaList [x, incList]+    incList = MetaBlocks $ return $ RawBlock (Format "latex") $ T.unlines $ execWriter $ do+        tell [ "\\makeatletter" ]+        tell subfig+        tell floatnames+        tell listnames+        tell subfigures+        unless (listings opts) $+          tell codelisting+        tell lolcommand+        when (cref opts) $ do+          tell cleveref+          unless (listings opts) $+            tell cleverefCodelisting+        tell [ "\\makeatother" ]+      where+        subfig = [+            usepackage [] "subfig"+          , usepackage [] "caption"+          , "\\captionsetup[subfloat]{margin=0.5em}"+          ]+        floatnames = [+            "\\AtBeginDocument{%"+          , "\\renewcommand*\\figurename{" <> metaString "figureTitle" <> "}"+          , "\\renewcommand*\\tablename{" <> metaString "tableTitle" <> "}"+          , "}"+          ]+        listnames = [+            "\\AtBeginDocument{%"+          , "\\renewcommand*\\listfigurename{" <> metaString' "lofTitle" <> "}"+          , "\\renewcommand*\\listtablename{" <> metaString' "lotTitle" <> "}"+          , "}"+          ]+        subfigures = [+            "\\newcounter{pandoccrossref@subfigures@footnote@counter}"+          , "\\newenvironment{pandoccrossrefsubfigures}{%"+          , "\\setcounter{pandoccrossref@subfigures@footnote@counter}{0}"+          , "\\begin{figure}\\centering%"+          , "\\gdef\\global@pandoccrossref@subfigures@footnotes{}%"+          , "\\DeclareRobustCommand{\\footnote}[1]{\\footnotemark%"+          , "\\stepcounter{pandoccrossref@subfigures@footnote@counter}%"+          , "\\ifx\\global@pandoccrossref@subfigures@footnotes\\empty%"+          , "\\gdef\\global@pandoccrossref@subfigures@footnotes{{##1}}%"+          , "\\else%"+          , "\\g@addto@macro\\global@pandoccrossref@subfigures@footnotes{, {##1}}%"+          , "\\fi}}%"+          , "{\\end{figure}%"+          , "\\addtocounter{footnote}{-\\value{pandoccrossref@subfigures@footnote@counter}}"+          , "\\@for\\f:=\\global@pandoccrossref@subfigures@footnotes\\do{\\stepcounter{footnote}\\footnotetext{\\f}}%"+          , "\\gdef\\global@pandoccrossref@subfigures@footnotes{}}"+          ]+        codelisting = [+            usepackage [] "float"+          , "\\floatstyle{ruled}"+          , "\\@ifundefined{c@chapter}{\\newfloat{codelisting}{h}{lop}}{\\newfloat{codelisting}{h}{lop}[chapter]}"+          , "\\floatname{codelisting}{" <> metaString "listingTitle" <> "}"+          ]+        lolcommand+          | listings opts = [+              "\\newcommand*\\listoflistings\\lstlistoflistings"+            , "\\AtBeginDocument{%"+            , "\\renewcommand*{\\lstlistlistingname}{" <> metaString' "lolTitle" <> "}"+            , "}"+            ]+          | otherwise = ["\\newcommand*\\listoflistings{\\listof{codelisting}{" <> metaString' "lolTitle" <> "}}"]+        cleveref = [ usepackage cleverefOpts "cleveref" ]+          <> crefname "figure" figPrefix+          <> crefname "table" tblPrefix+          <> crefname "equation" eqnPrefix+          <> crefname "listing" lstPrefix+          <> crefname "section" secPrefix+        cleverefCodelisting = [+            "\\crefname{codelisting}{\\cref@listing@name}{\\cref@listing@name@plural}"+          , "\\Crefname{codelisting}{\\Cref@listing@name}{\\Cref@listing@name@plural}"+          ]+        cleverefOpts | nameInLink opts = [ "nameinlink" ]+                     | otherwise = []+        crefname n f = [+            "\\crefname{" <> n <> "}" <> prefix f False+          , "\\Crefname{" <> n <> "}" <> prefix f True+          ]+        usepackage [] p = "\\@ifpackageloaded{" <> p <> "}{}{\\usepackage{" <> p <> "}}"+        usepackage xs p = "\\@ifpackageloaded{" <> p <> "}{}{\\usepackage" <> o <> "{" <> p <> "}}"+          where o = "[" <> T.intercalate "," xs <> "]"+        toLatex = either (error . show) id . runPure . writeLaTeX def . Pandoc nullMeta . return . Plain+        metaString s = toLatex $ getMetaInlines s meta+        metaString' s = toLatex [Str $ getMetaString s meta]+        prefix f uc = "{" <> toLatex (f opts uc 0) <> "}"  <>+                      "{" <> toLatex (f opts uc 1) <> "}"
+ lib-internal/Text/Pandoc/CrossRef/Util/Options.hs view
@@ -0,0 +1,72 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++module Text.Pandoc.CrossRef.Util.Options (Options(..)) where+import Text.Pandoc.Definition+import Text.Pandoc.CrossRef.Util.Template+import Data.Text (Text)++data Options = Options { cref :: Bool+                       , chaptersDepth   :: Int+                       , listings :: Bool+                       , codeBlockCaptions  :: Bool+                       , autoSectionLabels  :: Bool+                       , numberSections  :: Bool+                       , sectionsDepth  :: Int+                       , figPrefix   :: Bool -> Int -> [Inline]+                       , eqnPrefix   :: Bool -> Int -> [Inline]+                       , tblPrefix   :: Bool -> Int -> [Inline]+                       , lstPrefix   :: Bool -> Int -> [Inline]+                       , secPrefix   :: Bool -> Int -> [Inline]+                       , figPrefixTemplate :: Template+                       , eqnPrefixTemplate :: Template+                       , tblPrefixTemplate :: Template+                       , lstPrefixTemplate :: Template+                       , secPrefixTemplate :: Template+                       , refIndexTemplate :: Text -> Template+                       , subfigureRefIndexTemplate :: Template+                       , secHeaderTemplate :: Template+                       , chapDelim   :: [Inline]+                       , rangeDelim  :: [Inline]+                       , pairDelim  :: [Inline]+                       , lastDelim  :: [Inline]+                       , refDelim  :: [Inline]+                       , lofTitle    :: [Block]+                       , lotTitle    :: [Block]+                       , lolTitle    :: [Block]+                       , outFormat   :: Maybe Format+                       , figureTemplate :: Template+                       , subfigureTemplate :: Template+                       , subfigureChildTemplate :: Template+                       , ccsTemplate :: Template+                       , tableTemplate  :: Template+                       , listingTemplate :: Template+                       , customLabel :: Text -> Int -> Maybe Text+                       , customHeadingLabel :: Int -> Int -> Maybe Text+                       , ccsDelim :: [Inline]+                       , ccsLabelSep :: [Inline]+                       , tableEqns :: Bool+                       , autoEqnLabels :: Bool+                       , subfigGrid :: Bool+                       , linkReferences :: Bool+                       , nameInLink :: Bool+                       , setLabelAttribute :: Bool+                       , equationNumberTeX :: Text+                       }
+ lib-internal/Text/Pandoc/CrossRef/Util/Settings.hs view
@@ -0,0 +1,115 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>+Copyright (C) 2017  Masamichi Hosoda <trueroad@trueroad.jp>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE OverloadedStrings #-}+module Text.Pandoc.CrossRef.Util.Settings (getSettings, defaultMeta) where++import Text.Pandoc+import Text.Pandoc.Builder+import Control.Exception (handle,IOException)++import Text.Pandoc.CrossRef.Util.Settings.Gen+import Text.Pandoc.CrossRef.Util.Meta+import System.Directory+import System.FilePath+import System.IO+import qualified Data.Text as T++getSettings :: Maybe Format -> Meta -> IO Meta+getSettings fmt meta = do+  dirConfig <- readConfig (T.unpack $ getMetaString "crossrefYaml" (defaultMeta <> meta))+  home <- getHomeDirectory+  globalConfig <- readConfig (home </> ".pandoc-crossref" </> "config.yaml")+  formatConfig <- maybe (return nullMeta) (readFmtConfig home) fmt+  return $ defaultMeta <> globalConfig <> formatConfig <> dirConfig <> meta+  where+    readConfig path =+      handle handler $ do+        h <- openFile path ReadMode+        hSetEncoding h utf8+        yaml <- hGetContents h+        Pandoc meta' _ <- readMd $ T.pack $ unlines ["---", yaml, "---"]+        return meta'+    readMd = handleError . runPure . readMarkdown def{readerExtensions=pandocExtensions}+    readFmtConfig home fmt' = readConfig (home </> ".pandoc-crossref" </> "config-" ++ fmtStr fmt' ++ ".yaml")+    handler :: IOException -> IO Meta+    handler _ = return nullMeta+    fmtStr (Format fmtstr) = T.unpack fmtstr+++defaultMeta :: Meta+defaultMeta =+     cref False+  <> chapters False+  <> chaptersDepth (MetaString "1")+  <> listings False+  <> codeBlockCaptions False+  <> autoSectionLabels False+  <> numberSections False+  <> sectionsDepth (MetaString "0")+  <> figLabels (MetaString "arabic")+  <> eqLabels (MetaString "arabic")+  <> tblLabels (MetaString "arabic")+  <> lstLabels (MetaString "arabic")+  <> secLabels (MetaString "arabic")+  <> figureTitle (str "Figure")+  <> tableTitle (str "Table")+  <> listingTitle (str "Listing")+  <> titleDelim (str ":")+  <> chapDelim (str ".")+  <> rangeDelim (str "-")+  <> pairDelim (str "," <> space)+  <> lastDelim (str "," <> space)+  <> refDelim (str "," <> space)+  <> figPrefix [str "fig.", str "figs."]+  <> eqnPrefix [str "eq." , str "eqns."]+  <> tblPrefix [str "tbl.", str "tbls."]+  <> lstPrefix [str "lst.", str "lsts."]+  <> secPrefix [str "sec.", str "secs."]+  <> figPrefixTemplate (var "p" <> str "\160" <> var "i")+  <> eqnPrefixTemplate (var "p" <> str "\160" <> var "i")+  <> tblPrefixTemplate (var "p" <> str "\160" <> var "i")+  <> lstPrefixTemplate (var "p" <> str "\160" <> var "i")+  <> secPrefixTemplate (var "p" <> str "\160" <> var "i")+  <> refIndexTemplate (var "i" <> var "suf")+  <> subfigureRefIndexTemplate (var "i" <> var "suf" <> space <> str "(" <> var "s" <> str ")")+  <> secHeaderTemplate (var "i" <> var "secHeaderDelim[n]" <> var "t")+  <> secHeaderDelim space+  <> lofTitle (header 1 $ text "List of Figures")+  <> lotTitle (header 1 $ text "List of Tables")+  <> lolTitle (header 1 $ text "List of Listings")+  <> figureTemplate (var "figureTitle" <> space <> var "i" <> var "titleDelim" <> space <> var "t")+  <> tableTemplate (var "tableTitle" <> space <> var "i" <> var "titleDelim" <> space <> var "t")+  <> listingTemplate (var "listingTitle" <> space <> var "i" <> var "titleDelim" <> space <> var "t")+  <> crossrefYaml (MetaString "pandoc-crossref.yaml")+  <> subfigureChildTemplate (var "i")+  <> subfigureTemplate (var "figureTitle" <> space <> var "i" <> var "titleDelim" <> space <> var "t" <> str "." <> space <> var "ccs")+  <> subfigLabels (MetaString "alpha a")+  <> ccsDelim (str "," <> space)+  <> ccsLabelSep (space <> str "—" <> space)+  <> ccsTemplate (var "i" <> var "ccsLabelSep" <> var "t")+  <> tableEqns False+  <> autoEqnLabels False+  <> subfigGrid False+  <> linkReferences False+  <> nameInLink False+  <> equationNumberTeX ("qquad" :: T.Text)+  where var = displayMath
+ lib-internal/Text/Pandoc/CrossRef/Util/Settings/Gen.hs view
@@ -0,0 +1,54 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE TemplateHaskell, OverloadedStrings #-}+-- {-# OPTIONS_GHC -ddump-splices #-}+module Text.Pandoc.CrossRef.Util.Settings.Gen where++import Text.Pandoc.CrossRef.Util.Settings.Template+import Text.Pandoc.CrossRef.Util.Meta+import Text.Pandoc.CrossRef.Util.Options as O (Options(..))+import Language.Haskell.TH (mkName)+import Text.Pandoc.Definition++nameDeriveSetters ''Options++concat <$> mapM (makeAcc . mkName)+  [ "figureTitle"+  , "tableTitle"+  , "listingTitle"+  , "titleDelim"+  , "crossrefYaml"+  , "subfigLabels"+  , "chapters"+  , "figLabels"+  , "eqLabels"+  , "tblLabels"+  , "lstLabels"+  , "secLabels"+  , "secHeaderDelim"+  ]++getOptions :: Meta -> Maybe Format -> Options+getOptions dtv fmt =+  let opts = $(makeCon ''Options 'Options)+  in if getMetaBool "chapters" dtv+     then opts+     else opts{O.chaptersDepth = 0}
+ lib-internal/Text/Pandoc/CrossRef/Util/Settings/Template.hs view
@@ -0,0 +1,102 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE TemplateHaskell, RankNTypes, ViewPatterns, MultiWayIf #-}+module Text.Pandoc.CrossRef.Util.Settings.Template where++import Text.Pandoc.Definition+import Text.Pandoc.Builder+import Text.Pandoc.CrossRef.Util.Meta+import qualified Data.Map as M+import Language.Haskell.TH hiding (Inline)+import Language.Haskell.TH.Syntax hiding (Inline)+import Data.List+import Text.Pandoc.CrossRef.Util.Template+import Text.Pandoc.CrossRef.Util.CustomLabels+import Data.Text (Text)+import qualified Data.Text as T++namedFields :: Con -> [VarStrictType]+namedFields (RecC _ fs) = fs+namedFields (ForallC _ _ c) = namedFields c+namedFields _ = []++fromRecDef :: forall t a r. Name -> t -> (Name -> Name -> Q [a]) -> (t -> [a] -> r) -> Q r+fromRecDef t cname f c = do+  info <- reify t+  reified <- case info of+                  TyConI dec -> return dec+                  _ -> fail "No cons"+  (_, cons) <- case reified of+               DataD _ _ params _ cons' _ -> return (params, cons')+               NewtypeD _ _ params _ con' _ -> return (params, [con'])+               _ -> fail "No cons"+  decs <- fmap concat . mapM (\ (name,_,_) -> f t name) . nub $ concatMap namedFields cons+  return $ c cname decs++nameDeriveSetters :: Name -> Q [Dec]+nameDeriveSetters t = fromRecDef t undefined (const makeAcc) (const id)++dropQualifiers :: Name -> Name+dropQualifiers (Name occ _) = mkName (occString occ)++makeAcc :: Name -> Q [Dec]+makeAcc (dropQualifiers -> accName) = do+    body <- [| Meta . M.singleton $(liftString $ show accName) . toMetaValue |]+    sig <- [t|forall a. ToMetaValue a => a -> Meta|]+    return+      [ SigD accName sig+      , ValD (VarP accName) (NormalB body) []+      ]++makeCon :: Name -> Name -> Q Exp+makeCon t cname = fromRecDef t cname makeCon' RecConE++makeCon' :: Name -> Name -> Q [(Name, Exp)]+makeCon' t accName = do+    VarI _ t' _ <- reify accName+    funT <- [t|$(conT t) -> Bool -> Int -> [Inline]|]+    inlT <- [t|$(conT t) -> [Inline]|]+    blkT <- [t|$(conT t) -> [Block]|]+    fmtT <- [t|$(conT t) -> Maybe Format|]+    boolT <- [t|$(conT t) -> Bool|]+    strT <- [t|$(conT t) -> Text|]+    intT <- [t|$(conT t) -> Int|]+    tmplT <- [t|$(conT t) -> Template|]+    idxTmplT <- [t|$(conT t) -> Text -> Template|]+    clT <- [t|$(conT t) -> Text -> Int -> Maybe Text|]+    chlT <- [t|$(conT t) -> Int -> Int -> Maybe Text|]+    let varName | Name (OccName n) _ <- accName = liftString n+    let dtv = return $ VarE $ mkName "dtv"+    body <-+      if+      | t' == boolT -> [|getMetaBool $(varName) $(dtv)|]+      | t' == intT -> [|read $ T.unpack $ getMetaString $(varName) $(dtv)|]+      | t' == funT -> [|tryCapitalizeM (flip (getMetaList (toInlines $(varName))) $(dtv)) $(varName)|]+      | t' == inlT -> [|getMetaInlines $(varName) $(dtv)|]+      | t' == blkT -> [|getMetaBlock $(varName) $(dtv)|]+      | t' == tmplT -> [|makeTemplate $(dtv) $ getMetaInlines $(varName) $(dtv)|]+      | t' == idxTmplT -> [|makeIndexedTemplate $(varName) $(dtv)|]+      | t' == clT -> [|customLabel $(dtv)|]+      | t' == chlT -> [|customHeadingLabel $(dtv)|]+      | t' == strT -> [|getMetaString $(varName) $(dtv)|]+      | t' == fmtT -> return $ VarE $ mkName "fmt"+      | otherwise -> fail $ show t'+    return [(accName, body)]
+ lib-internal/Text/Pandoc/CrossRef/Util/Template.hs view
@@ -0,0 +1,79 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE OverloadedStrings #-}+module Text.Pandoc.CrossRef.Util.Template+  ( Template+  , makeTemplate+  , makeIndexedTemplate+  , applyTemplate+  , applyTemplate'+  ) where++import Text.Pandoc.Definition+import Text.Pandoc.Builder+import Text.Pandoc.Generic+import qualified Data.Map as M hiding (toList, fromList, singleton)+import Text.Pandoc.CrossRef.Util.Meta+import Control.Applicative+import Text.Read+import qualified Data.Text as T++type VarFunc = T.Text -> Maybe MetaValue+newtype Template = Template (VarFunc -> [Inline])++makeTemplate :: Meta -> [Inline] -> Template+makeTemplate dtv xs' = Template $ \vf -> scan (\var -> vf var <|> lookupMeta var dtv) xs'+  where+  scan = bottomUp . go+  go vf (x@(Math DisplayMath var):xs)+    | (vn, idxBr) <- T.span (/='[') var+    , not (T.null idxBr)+    , T.last idxBr == ']'+    = let idxVar = T.drop 1 $ T.takeWhile (/=']') idxBr+          idx = readMaybe . T.unpack . toString ("index variable " <> idxVar) =<< vf idxVar+          arr = do+            i <- idx+            v <- lookupMeta vn dtv+            getList i v+      in toList $ fromList (replaceVar var arr [x]) <> fromList xs+    | otherwise = toList $ fromList (replaceVar var (vf var) [x]) <> fromList xs+  go _ (x:xs) = toList $ singleton x <> fromList xs+  go _ [] = []+  replaceVar var val def' = maybe def' (toInlines ("variable " <> var)) val++makeIndexedTemplate :: T.Text -> Meta -> T.Text -> Template+makeIndexedTemplate name meta subname =+  makeTemplate meta $ case lookupMeta name meta of+    Just (MetaMap m) -> case lookupMeta subname (Meta m) of+      Just x -> toInlines name x+      Nothing -> getMetaInlines "default" (Meta m)+    Just x -> toInlines name x+    Nothing -> []++applyTemplate' :: M.Map T.Text [Inline] -> Template -> [Inline]+applyTemplate' vars (Template g) = g internalVars+  where+  internalVars x | Just v <- M.lookup x vars = Just $ MetaInlines v+  internalVars _   = Nothing++applyTemplate :: [Inline] -> [Inline] -> Template -> [Inline]+applyTemplate i t =+  applyTemplate' (M.fromDistinctAscList [("i", i), ("t", t)])
+ lib-internal/Text/Pandoc/CrossRef/Util/Util.hs view
@@ -0,0 +1,151 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE RankNTypes, OverloadedStrings, CPP #-}+module Text.Pandoc.CrossRef.Util.Util+  ( module Text.Pandoc.CrossRef.Util.Util+  , module Data.Generics+  ) where++import Text.Pandoc.CrossRef.References.Types+import Text.Pandoc.Definition+import Text.Pandoc.Builder hiding ((<>))+import Text.Pandoc.Class+import Data.Char (toUpper, toLower, isUpper)+import Data.Maybe (fromMaybe)+import Data.Generics+import Text.Pandoc.Writers.LaTeX+import Data.Default+import Data.Version+import Data.List (find)+import Text.ParserCombinators.ReadP (readP_to_S)+import qualified Data.Text as T++intercalate' :: (Eq a, Monoid a, Foldable f) => a -> f a -> a+intercalate' s xs+  | null xs = mempty+  | otherwise = foldr1 (\x acc -> x <> s <> acc) xs++isFormat :: T.Text -> Maybe Format -> Bool+isFormat fmt (Just (Format f)) = T.takeWhile (`notElem` ("+-" :: String)) f == fmt+isFormat _ Nothing = False++isLatexFormat :: Maybe Format -> Bool+isLatexFormat = isFormat "latex" `or'` isFormat "beamer"+  where a `or'` b = (||) <$> a <*> b++capitalizeFirst :: T.Text -> T.Text+capitalizeFirst t+  | Just (x, xs) <- T.uncons t = toUpper x `T.cons` xs+  | otherwise = T.empty++uncapitalizeFirst :: T.Text -> T.Text+uncapitalizeFirst t+  | Just (x, xs) <- T.uncons t = toLower x `T.cons` xs+  | otherwise = T.empty++isFirstUpper :: T.Text -> Bool+isFirstUpper xs+  | Just (x, _) <- T.uncons xs  = isUpper x+  | otherwise = False++chapPrefix :: [Inline] -> Index -> [Inline]+chapPrefix delim = toList+  . intercalate' (fromList delim)+  . map str+  . filter (not . T.null)+  . map (uncurry (fromMaybe . T.pack . show))++data ReplacedResult a = Replaced Bool a | NotReplaced Bool+type GenRR m = forall a. Data a => (a -> m (ReplacedResult a))+newtype RR m a = RR {unRR :: a -> m (ReplacedResult a)}++runReplace :: (Monad m) => GenRR m -> GenericM m+runReplace f x = do+  res <- f x+  case res of+    Replaced True x' -> gmapM (runReplace f) x'+    Replaced False x' -> return x'+    NotReplaced True -> gmapM (runReplace f) x+    NotReplaced False -> return x++mkRR :: (Monad m, Typeable a, Typeable b)+     => (b -> m (ReplacedResult b))+     -> (a -> m (ReplacedResult a))+mkRR = extRR (const noReplaceRecurse)++extRR :: ( Monad m, Typeable a, Typeable b)+     => (a -> m (ReplacedResult a))+     -> (b -> m (ReplacedResult b))+     -> (a -> m (ReplacedResult a))+extRR def' ext = unRR (RR def' `ext0` RR ext)++replaceRecurse :: Monad m => a -> m (ReplacedResult a)+replaceRecurse = return . Replaced True++replaceNoRecurse :: Monad m => a -> m (ReplacedResult a)+replaceNoRecurse = return . Replaced False++noReplace :: Monad m => Bool -> m (ReplacedResult a)+noReplace recurse = return $ NotReplaced recurse++noReplaceRecurse :: Monad m => m (ReplacedResult a)+noReplaceRecurse = noReplace True++noReplaceNoRecurse :: Monad m => m (ReplacedResult a)+noReplaceNoRecurse = noReplace False++mkLaTeXLabel :: T.Text -> T.Text+mkLaTeXLabel l+ | T.null l = ""+ | otherwise = "\\label{" <> mkLaTeXLabel' l <> "}"++mkLaTeXLabel' :: T.Text -> T.Text+mkLaTeXLabel' l =+  let ll = either (error . show) id $+            runPure (writeLaTeX def $ Pandoc nullMeta [Div (l, [], []) []])+  in T.takeWhile (/='}') . T.drop 1 . T.dropWhile (/='{') $ ll++escapeLaTeX :: T.Text -> T.Text+escapeLaTeX l =+  let ll = either (error . show) id $+            runPure (writeLaTeX def $ Pandoc nullMeta [Plain [Str l]])+      pv = fmap fst . find (null . snd) . readP_to_S parseVersion $ VERSION_pandoc+      mv = makeVersion [2,11,0,1]+      cond = maybe False (mv >=) pv+  in if cond then ll else l++getRefLabel :: T.Text -> [Inline] -> Maybe T.Text+getRefLabel _ [] = Nothing+getRefLabel tag ils+  | Str attr <- last ils+  , all (==Space) (init ils)+  , "}" `T.isSuffixOf` attr+  , ("{#"<>tag<>":") `T.isPrefixOf` attr+  = T.init `fmap` T.stripPrefix "{#" attr+getRefLabel _ _ = Nothing++isSpace :: Inline -> Bool+isSpace = (||) <$> (==Space) <*> (==SoftBreak)++isLaTeXRawBlockFmt :: Format -> Bool+isLaTeXRawBlockFmt (Format "latex") = True+isLaTeXRawBlockFmt (Format "tex") = True+isLaTeXRawBlockFmt _ = False
− lib/Text/Pandoc/CrossRef/References.hs
@@ -1,26 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--module Text.Pandoc.CrossRef.References ( module X ) where--import Text.Pandoc.CrossRef.References.Types as X-import Text.Pandoc.CrossRef.References.Blocks as X (replaceAll)-import Text.Pandoc.CrossRef.References.Refs as X-import Text.Pandoc.CrossRef.References.List as X
− lib/Text/Pandoc/CrossRef/References/Blocks.hs
@@ -1,438 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE Rank2Types, OverloadedStrings #-}-module Text.Pandoc.CrossRef.References.Blocks-  ( replaceAll-  ) where--import Text.Pandoc.Definition-import qualified Text.Pandoc.Builder as B-import Text.Pandoc.Shared (stringify, blocksToInlines)-import Text.Pandoc.Walk (walk)-import Control.Monad.State hiding (get, modify)-import Data.List-import Data.Maybe-import qualified Data.Map as M-import qualified Data.Text as T-import qualified Data.Text.Read as T--import Data.Accessor-import Data.Accessor.Monad.Trans.State-import Text.Pandoc.CrossRef.References.Types-import Text.Pandoc.CrossRef.Util.Util-import Text.Pandoc.CrossRef.Util.Options-import Text.Pandoc.CrossRef.Util.Template-import Control.Applicative-import Prelude-import Data.Default--replaceAll :: (Data a) => Options -> a -> WS a-replaceAll opts =-    runReplace (mkRR (replaceBlock opts)-      `extRR` replaceInline opts-      `extRR` replaceInlineMany opts-      )-  . runSplitMath-  . everywhere (mkT divBlocks `extT` spanInlines opts)-  where-    runSplitMath | tableEqns opts-                 , not $ isLatexFormat (outFormat opts)-                 = everywhere (mkT splitMath)-                 | otherwise = id--simpleTable :: [Alignment] -> [ColWidth] -> [[[Block]]] -> Block-simpleTable align width bod = Table nullAttr noCaption (zip align width)-  noTableHead [mkBody bod] noTableFoot-  where-  mkBody xs = TableBody nullAttr (RowHeadColumns 0) [] (map mkRow xs)-  mkRow xs = Row nullAttr (map mkCell xs)-  mkCell xs = Cell nullAttr AlignDefault (RowSpan 0) (ColSpan 0) xs-  noCaption = Caption Nothing mempty-  noTableHead = TableHead nullAttr []-  noTableFoot = TableFoot nullAttr []--setLabel :: Options -> [Inline] -> [(T.Text, T.Text)] -> [(T.Text, T.Text)]-setLabel opts idx-  | setLabelAttribute opts-  = (("label", stringify idx) :)-  . filter ((/= "label") . fst)-  | otherwise = id--replaceBlock :: Options -> Block -> WS (ReplacedResult Block)-replaceBlock opts (Header n (label, cls, attrs) text')-  = do-    let label' = if autoSectionLabels opts && not ("sec:" `T.isPrefixOf` label)-                 then "sec:"<>label-                 else label-    unless ("unnumbered" `elem` cls) $ do-      modify curChap $ \cc ->-        let ln = length cc-            cl i = lookup "label" attrs <|> customHeadingLabel opts n i <|> customLabel opts "sec" i-            inc l = let i = fst (last l) + 1 in init l <> [(i, cl i)]-            cc' | ln > n = inc $ take n cc-                | ln == n = inc cc-                | otherwise = cc <> take (n-ln-1) (zip [1,1..] $ repeat Nothing) <> [(1,cl 1)]-        in cc'-      when ("sec:" `T.isPrefixOf` label') $ do-        index  <- get curChap-        modify secRefs $ M.insert label' RefRec {-          refIndex=index-        , refTitle= text'-        , refSubfigure = Nothing-        }-    cc <- get curChap-    let textCC | numberSections opts-               , sectionsDepth opts < 0-               || n <= if sectionsDepth opts == 0 then chaptersDepth opts else sectionsDepth opts-               , "unnumbered" `notElem` cls-               = applyTemplate' (M.fromDistinctAscList [-                    ("i", idxStr)-                  , ("n", [Str $ T.pack $ show $ n - 1])-                  , ("t", text')-                  ]) $ secHeaderTemplate opts-               | otherwise = text'-        idxStr = chapPrefix (chapDelim opts) cc-        attrs' | "unnumbered" `notElem` cls-               = setLabel opts idxStr attrs-               | otherwise = attrs-    replaceNoRecurse $ Header n (label', cls, attrs') textCC--- subfigures-replaceBlock opts (Div (label,cls,attrs) images)-  | "fig:" `T.isPrefixOf` label-  , Para caption <- last images-  = do-    idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) caption imgRefs-    let (cont, st) = runState (runReplace (mkRR $ replaceSubfigs opts') $ init images) def-        collectedCaptions = B.toList $-            intercalate' (B.fromList $ ccsDelim opts)-          $ map (B.fromList . collectCaps . snd)-          $ sortOn (refIndex . snd)-          $ filter (not . null . refTitle . snd)-          $ M.toList-          $ imgRefs_ st-        collectCaps v =-              applyTemplate-                (chapPrefix (chapDelim opts) (refIndex v))-                (refTitle v)-                (ccsTemplate opts)-        vars = M.fromDistinctAscList-                  [ ("ccs", collectedCaptions)-                  , ("i", idxStr)-                  , ("t", caption)-                  ]-        capt = applyTemplate' vars $ subfigureTemplate opts-    lastRef <- fromJust . M.lookup label <$> get imgRefs-    modify imgRefs $ \old ->-        M.union-          old-          (M.map (\v -> v{refIndex = refIndex lastRef, refSubfigure = Just $ refIndex v})-          $ imgRefs_ st)-    case outFormat opts of-          f | isLatexFormat f ->-            replaceNoRecurse $ Div nullAttr $-              [ RawBlock (Format "latex") "\\begin{pandoccrossrefsubfigures}" ]-              <> cont <>-              [ Para [RawInline (Format "latex") "\\caption["-                       , Span nullAttr (removeFootnotes caption)-                       , RawInline (Format "latex") "]"-                       , Span nullAttr caption]-              , RawBlock (Format "latex") $ mkLaTeXLabel label-              , RawBlock (Format "latex") "\\end{pandoccrossrefsubfigures}"]-          _  -> replaceNoRecurse $ Div (label, "subfigures":cls, setLabel opts idxStr attrs) $ toTable cont capt-  where-    opts' = opts-              { figureTemplate = subfigureChildTemplate opts-              , customLabel = \r i -> customLabel opts ("sub"<>r) i-              }-    removeFootnotes = walk removeFootnote-    removeFootnote Note{} = Str ""-    removeFootnote x = x-    toTable :: [Block] -> [Inline] -> [Block]-    toTable blks capt-      | subfigGrid opts = [ simpleTable align (map ColWidth widths) (map blkToRow blks)-                          , mkCaption opts "Image Caption" capt]-      | otherwise = blks <> [mkCaption opts "Image Caption" capt]-      where-        align | Para ils:_ <- blks = replicate (length $ mapMaybe getWidth ils) AlignCenter-              | otherwise = error "Misformatted subfigures block"-        widths | Para ils:_ <- blks-               = fixZeros $ mapMaybe getWidth ils-               | otherwise = error "Misformatted subfigures block"-        getWidth (Image (_id, _class, as) _ _)-          = Just $ maybe 0 percToDouble $ lookup "width" as-        getWidth _ = Nothing-        fixZeros :: [Double] -> [Double]-        fixZeros ws-          = let nz = length $ filter (== 0) ws-                rzw = (0.99 - sum ws) / fromIntegral nz-            in if nz>0-               then map (\x -> if x == 0 then rzw else x) ws-               else ws-        percToDouble :: T.Text -> Double-        percToDouble percs-          | Right (perc, "%") <- T.double percs-          = perc/100.0-          | otherwise = error "Only percent allowed in subfigure width!"-        blkToRow :: Block -> [[Block]]-        blkToRow (Para inls) = mapMaybe inlToCell inls-        blkToRow x = [[x]]-        inlToCell :: Inline -> Maybe [Block]-        inlToCell (Image (id', cs, as) txt tgt)  = Just [Para [Image (id', cs, setW as) txt tgt]]-        inlToCell _ = Nothing-        setW as = ("width", "100%"):filter ((/="width") . fst) as-replaceBlock opts (Div (label,clss,attrs) [Table tattr (Caption short (btitle:rest)) colspec header cells foot])-  | not $ null title-  , "tbl:" `T.isPrefixOf` label-  = do-    idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) title tblRefs-    let title' =-          case outFormat opts of-              f | isLatexFormat f ->-                RawInline (Format "latex") (mkLaTeXLabel label) : title-              _  -> applyTemplate idxStr title $ tableTemplate opts-        caption' = Caption short (walkReplaceInlines title' title btitle:rest)-    replaceNoRecurse $ Div (label, clss, setLabel opts idxStr attrs) [Table tattr caption' colspec header cells foot]-  where title = blocksToInlines [btitle]-replaceBlock opts (Table (label,clss,attrs) (Caption short (btitle:rest)) colspec header cells foot)-  | not $ null title-  , "tbl:" `T.isPrefixOf` label-  = do-    idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) title tblRefs-    let title' =-          case outFormat opts of-              f | isLatexFormat f ->-                RawInline (Format "latex") (mkLaTeXLabel label) : title-              _  -> applyTemplate idxStr title $ tableTemplate opts-        caption' = Caption short (walkReplaceInlines title' title btitle:rest)-    replaceNoRecurse $ Table (label, clss, setLabel opts idxStr attrs) caption' colspec header cells foot-  where title = blocksToInlines [btitle]-replaceBlock opts cb@(CodeBlock (label, classes, attrs) code)-  | not $ T.null label-  , "lst:" `T.isPrefixOf` label-  , Just caption <- lookup "caption" attrs-  = case outFormat opts of-      f-        --if used with listings package,nothing shoud be done-        | isLatexFormat f, listings opts -> noReplaceNoRecurse-        --if not using listings, however, wrap it in a codelisting environment-        | isLatexFormat f ->-          replaceNoRecurse $ Div nullAttr [-              RawBlock (Format "latex") "\\begin{codelisting}"-            , Plain [-                RawInline (Format "latex") "\\caption{"-              , Str caption-              , RawInline (Format "latex") "}"-              ]-            , cb-            , RawBlock (Format "latex") "\\end{codelisting}"-            ]-      _ -> do-        let cap = B.toList $ B.text caption-        idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) cap lstRefs-        let caption' = applyTemplate idxStr cap $ listingTemplate opts-        replaceNoRecurse $ Div (label, "listing":classes, []) [-            mkCaption opts "Caption" caption'-          , CodeBlock ("", classes, filter ((/="caption") . fst) $ setLabel opts idxStr attrs) code-          ]-replaceBlock opts-  (Div (label,"listing":divClasses, divAttrs)-    [Para caption, CodeBlock ("",cbClasses,cbAttrs) code])-  | not $ T.null label-  , "lst:" `T.isPrefixOf` label-  = case outFormat opts of-      f-        --if used with listings package, return code block with caption-        | isLatexFormat f, listings opts ->-          replaceNoRecurse $ CodeBlock (label,classes,("caption",escapeLaTeX $ stringify caption):attrs) code-        --if not using listings, however, wrap it in a codelisting environment-        | isLatexFormat f ->-          replaceNoRecurse $ Div nullAttr [-              RawBlock (Format "latex") "\\begin{codelisting}"-            , Para [-                RawInline (Format "latex") "\\caption"-              , Span nullAttr caption-              ]-            , CodeBlock (label,classes,attrs) code-            , RawBlock (Format "latex") "\\end{codelisting}"-            ]-      _ -> do-        idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) caption lstRefs-        let caption' = applyTemplate idxStr caption $ listingTemplate opts-        replaceNoRecurse $ Div (label, "listing":classes, []) [-            mkCaption opts "Caption" caption'-          , CodeBlock ("", classes, setLabel opts idxStr attrs) code-          ]-  where attrs = divAttrs <> cbAttrs-        classes = nub $ divClasses <> cbClasses-replaceBlock opts (Para [Span sattrs@(label, cls, attrs) [Math DisplayMath eq]])-  | not $ isLatexFormat (outFormat opts)-  , tableEqns opts-  = do-    (eq', idxStr) <- replaceEqn opts sattrs eq-    replaceNoRecurse $ Div (label,cls,setLabel opts idxStr attrs) [-      simpleTable [AlignCenter, AlignRight] [ColWidth 0.9, ColWidth 0.09]-       [[[Plain [Math DisplayMath eq']], [eqnNumber $ stringify idxStr]]]]-  where-  eqnNumber idx-    | outFormat opts == Just (Format "docx")-    = Div nullAttr [-        RawBlock (Format "openxml") "<w:tcPr><w:vAlign w:val=\"center\"/></w:tcPr>"-      , mathIdx-      ]-    | otherwise = mathIdx-    where mathIdx = Plain [Math DisplayMath $ "(" <> idx <> ")"]-replaceBlock _ _ = noReplaceRecurse--replaceEqn :: Options -> Attr -> T.Text -> WS (T.Text, [Inline])-replaceEqn opts (label, _, attrs) eq = do-  let label' | T.null label = Left "eq"-             | otherwise = Right label-  idxStr <- replaceAttr opts label' (lookup "label" attrs) [] eqnRefs-  let eq' | tableEqns opts = eq-          | otherwise = eq<>"\\qquad("<>idxTxt<>")"-      idxTxt = stringify idxStr-  return (eq', idxStr)--replaceInlineMany :: Options -> [Inline] -> WS (ReplacedResult [Inline])-replaceInlineMany opts (Span spanAttr@(label,clss,attrs) [Math DisplayMath eq]:xs)-  | "eq:" `T.isPrefixOf` label || T.null label && autoEqnLabels opts-  = replaceRecurse . (<>xs) =<< case outFormat opts of-      f | isLatexFormat f ->-        pure [RawInline (Format "latex") "\\begin{equation}"-        , Span spanAttr [RawInline (Format "latex") eq]-        , RawInline (Format "latex") $ mkLaTeXLabel label <> "\\end{equation}"]-      _ -> do-        (eq', idxStr) <- replaceEqn opts spanAttr eq-        pure [Span (label,clss,setLabel opts idxStr attrs) [Math DisplayMath eq']]-replaceInlineMany _ _ = noReplaceRecurse--replaceInline :: Options -> Inline -> WS (ReplacedResult Inline)-replaceInline opts (Image (label,cls,attrs) alt img@(_, tit))-  | "fig:" `T.isPrefixOf` label && "fig:" `T.isPrefixOf` tit-  = do-    idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) alt imgRefs-    let alt' = case outFormat opts of-          f | isLatexFormat f -> alt-          _  -> applyTemplate idxStr alt $ figureTemplate opts-    replaceNoRecurse $ Image (label,cls,setLabel opts idxStr attrs) alt' img-replaceInline _ _ = noReplaceRecurse--replaceSubfigs :: Options -> [Inline] -> WS (ReplacedResult [Inline])-replaceSubfigs opts = (replaceNoRecurse . concat) <=< mapM (replaceSubfig opts)--replaceSubfig :: Options -> Inline -> WS [Inline]-replaceSubfig opts x@(Image (label,cls,attrs) alt (src, tit))-  = do-      let label' | "fig:" `T.isPrefixOf` label = Right label-                 | T.null label = Left "fig"-                 | otherwise  = Right $ "fig:" <> label-      idxStr <- replaceAttr opts label' (lookup "label" attrs) alt imgRefs-      case outFormat opts of-        f | isLatexFormat f ->-          return $ latexSubFigure x label-        _  ->-          let alt' = applyTemplate idxStr alt $ figureTemplate opts-              tit' | "nocaption" `elem` cls = fromMaybe tit $ T.stripPrefix "fig:" tit-                   | "fig:" `T.isPrefixOf` tit = tit-                   | otherwise = "fig:" <> tit-          in return [Image (label, cls, setLabel opts idxStr attrs) alt' (src, tit')]-replaceSubfig _ x = return [x]--divBlocks :: Block -> Block-divBlocks (Table tattr (Caption short (btitle:rest)) colspec header cells foot)-  | not $ null title-  , Just label <- getRefLabel "tbl" [last title]-  = Div (label,[],[]) [-    Table tattr (Caption short $ walkReplaceInlines (dropWhileEnd isSpace (init title)) title btitle:rest) colspec header cells foot]-  where-    title = blocksToInlines [btitle]-divBlocks x = x--walkReplaceInlines :: [Inline] -> [Inline] -> Block -> Block-walkReplaceInlines newTitle title = walk replaceInlines-  where-  replaceInlines xs-    | xs == title = newTitle-    | otherwise = xs--splitMath :: [Block] -> [Block]-splitMath (Para ils:xs)-  | length ils > 1 = map Para (split [] [] ils) <> xs-  where-    split res acc [] = reverse (reverse acc : res)-    split res acc (x@(Span _ [Math DisplayMath _]):ys) =-      split ([x] : reverse (dropSpaces acc) : res)-            [] (dropSpaces ys)-    split res acc (y:ys) = split res (y:acc) ys-    dropSpaces = dropWhile isSpace-splitMath xs = xs--spanInlines :: Options -> [Inline] -> [Inline]-spanInlines opts (math@(Math DisplayMath _eq):ils)-  | c:ils' <- dropWhile isSpace ils-  , Just label <- getRefLabel "eq" [c]-  = Span (label,[],[]) [math]:ils'-  | autoEqnLabels opts-  = Span nullAttr [math]:ils-spanInlines _ x = x--replaceAttr :: Options -> Either T.Text T.Text -> Maybe T.Text -> [Inline] -> Accessor References RefMap -> WS [Inline]-replaceAttr o label refLabel title prop-  = do-    chap  <- take (chaptersDepth o) `fmap` get curChap-    prop' <- get prop-    let i = 1+ (M.size . M.filter (\x -> (chap == init (refIndex x)) && isNothing (refSubfigure x)) $ prop')-        index = chap <> [(i, refLabel <|> customLabel o ref i)]-        ref = either id (T.takeWhile (/=':')) label-        label' = either (<> T.pack (':' : show index)) id label-    when (M.member label' prop') $-      error . T.unpack $ "Duplicate label: " <> label'-    modify prop $ M.insert label' RefRec {-      refIndex= index-    , refTitle= title-    , refSubfigure = Nothing-    }-    return $ chapPrefix (chapDelim o) index--latexSubFigure :: Inline -> T.Text -> [Inline]-latexSubFigure (Image (_, cls, attrs) alt (src, title)) label =-  let-    title' = fromMaybe title $ T.stripPrefix "fig:" title-    texlabel | T.null label = []-             | otherwise = [RawInline (Format "latex") $ mkLaTeXLabel label]-    texalt | "nocaption" `elem` cls  = []-           | otherwise = concat-              [ [ RawInline (Format "latex") "["]-              , alt-              , [ RawInline (Format "latex") "]"]-              ]-    img = Image (label, cls, attrs) alt (src, title')-  in concat [-      [ RawInline (Format "latex") "\\subfloat" ]-      , texalt-      , [Span nullAttr $ img:texlabel]-      ]-latexSubFigure x _ = [x]--mkCaption :: Options -> T.Text -> [Inline] -> Block-mkCaption opts style-  | outFormat opts == Just (Format "docx") = Div ("", [], [("custom-style", style)]) . return . Para-  | otherwise = Para
− lib/Text/Pandoc/CrossRef/References/List.hs
@@ -1,62 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE OverloadedStrings #-}-module Text.Pandoc.CrossRef.References.List (listOf) where--import Text.Pandoc.Definition-import Data.Accessor.Monad.Trans.State-import Control.Arrow-import Data.List-import qualified Data.Map as M-import qualified Data.Text as T--import Text.Pandoc.CrossRef.References.Types-import Text.Pandoc.CrossRef.Util.Util-import Text.Pandoc.CrossRef.Util.Options--listOf :: Options -> [Block] -> WS [Block]-listOf Options{outFormat=f} x | isLatexFormat f = return x-listOf opts (RawBlock fmt "\\listoffigures":xs)-  | isLaTeXRawBlockFmt fmt-  = get imgRefs >>= makeList opts lofTitle xs-listOf opts (RawBlock fmt "\\listoftables":xs)-  | isLaTeXRawBlockFmt fmt-  = get tblRefs >>= makeList opts lotTitle xs-listOf opts (RawBlock fmt "\\listoflistings":xs)-  | isLaTeXRawBlockFmt fmt-  = get lstRefs >>= makeList opts lolTitle xs-listOf _ x = return x--makeList :: Options -> (Options -> [Block]) -> [Block] -> M.Map T.Text RefRec -> WS [Block]-makeList opts titlef xs refs-  = return $-      titlef opts ++-      (if chaptersDepth opts > 0-        then Div ("", ["list"], []) (itemChap `map` refsSorted)-        else OrderedList style (item `map` refsSorted))-      : xs-  where-    refsSorted = sortBy compare' $ M.toList refs-    compare' (_,RefRec{refIndex=i}) (_,RefRec{refIndex=j}) = compare i j-    item = (:[]) . Plain . refTitle . snd-    itemChap = Para . uncurry ((. (Space :)) . (++)) . (numWithChap . refIndex &&& refTitle) . snd-    numWithChap = chapPrefix (chapDelim opts)-    style = (1,DefaultStyle,DefaultDelim)
− lib/Text/Pandoc/CrossRef/References/Refs.hs
@@ -1,255 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE OverloadedStrings #-}-module Text.Pandoc.CrossRef.References.Refs (replaceRefs) where--import Text.Pandoc.Definition-import Text.Pandoc.Builder-import Control.Monad.State hiding (get, modify)-import Data.List-import qualified Data.List.HT as HT-import qualified Data.Text as T-import Data.Maybe-import Data.Function-import qualified Data.Map as M-import Control.Arrow as A--import Data.Accessor-import Data.Accessor.Monad.Trans.State-import Text.Pandoc.CrossRef.References.Types-import Text.Pandoc.CrossRef.Util.Template-import Text.Pandoc.CrossRef.Util.Util-import Text.Pandoc.CrossRef.Util.Options-import Control.Applicative-import Debug.Trace-import Prelude--replaceRefs :: Options -> [Inline] -> WS [Inline]-replaceRefs opts (Cite cits _:xs)-  = toList . (<> fromList xs) . intercalate' (text ", ") . map fromList <$> mapM replaceRefs' (groupBy eqPrefix cits)-  where-    eqPrefix a b = uncurry (==) $-      (fmap uncapitalizeFirst . getLabelPrefix . citationId) <***> (a,b)-    (<***>) = join (***)-    replaceRefs' cits'-      | Just prefix <- allCitsPrefix cits'-      = replaceRefs'' prefix opts cits'-      | otherwise = return [Cite cits' il']-        where-          il' = toList $-              str "["-            <> intercalate' (text "; ") (map citationToInlines cits')-            <> str "]"-          citationToInlines c =-            fromList (citationPrefix c) <> text ("@" <> citationId c)-              <> fromList (citationSuffix c)-    replaceRefs'' = case outFormat opts of-                    f | isLatexFormat f -> replaceRefsLatex-                    _                      -> replaceRefsOther-replaceRefs _ x = return x---- accessors to state variables-accMap :: M.Map T.Text (Accessor References RefMap)-accMap = M.fromList [("fig:",imgRefs)-                    ,("eq:" ,eqnRefs)-                    ,("tbl:",tblRefs)-                    ,("lst:",lstRefs)-                    ,("sec:",secRefs)-                    ]---- accessors to options-prefMap :: M.Map T.Text (Options -> Bool -> Int -> [Inline], Options -> Template)-prefMap = M.fromList [("fig:",(figPrefix, figPrefixTemplate))-                     ,("eq:" ,(eqnPrefix, eqnPrefixTemplate))-                     ,("tbl:",(tblPrefix, tblPrefixTemplate))-                     ,("lst:",(lstPrefix, lstPrefixTemplate))-                     ,("sec:",(secPrefix, secPrefixTemplate))-                     ]--prefixes :: [T.Text]-prefixes = M.keys accMap--getRefPrefix :: Options -> T.Text -> Bool -> Int -> [Inline] -> [Inline]-getRefPrefix opts prefix capitalize num cit =-  applyTemplate' (M.fromDistinctAscList [("i", cit), ("p", refprefix)])-        $ reftempl opts-  where (refprefixf, reftempl) = lookupUnsafe prefix prefMap-        refprefix = refprefixf opts capitalize num---lookupUnsafe :: Ord k => k -> M.Map k v -> v-lookupUnsafe = (fromJust .) . M.lookup--allCitsPrefix :: [Citation] -> Maybe T.Text-allCitsPrefix cits = find isCitationPrefix prefixes-  where-  isCitationPrefix p =-    all ((p `T.isPrefixOf`) . uncapitalizeFirst . citationId) cits--replaceRefsLatex :: T.Text -> Options -> [Citation] -> WS [Inline]-replaceRefsLatex prefix opts cits-  | cref opts-  = replaceRefsLatex' prefix opts cits-  | otherwise-  = toList . intercalate' (text ", ") . map fromList <$>-      mapM (replaceRefsLatex' prefix opts) (groupBy citationGroupPred cits)--replaceRefsLatex' :: T.Text -> Options -> [Citation] -> WS [Inline]-replaceRefsLatex' prefix opts cits =-  return $ p [texcit]-  where-    texcit =-      RawInline (Format "tex") $-      if cref opts then-        cref'<>"{"<>listLabels prefix "" "," "" cits<>"}"-        else-          listLabels prefix "\\ref{" ", " "}" cits-    suppressAuthor = all ((==SuppressAuthor) . citationMode) cits-    noPrefix = all (null . citationPrefix) cits-    p | cref opts = id-      | suppressAuthor-      = id-      | noPrefix-      = getRefPrefix opts prefix cap (length cits - 1)-      | otherwise = ((citationPrefix (head cits) <> [Space]) <>)-    cap = maybe False isFirstUpper $ getLabelPrefix . citationId . head $ cits-    cref' | suppressAuthor = "\\labelcref"-          | cap = "\\Cref"-          | otherwise = "\\cref"--listLabels :: T.Text -> T.Text -> T.Text -> T.Text -> [Citation] -> T.Text-listLabels prefix p sep s =-  T.intercalate sep . map ((p <>) . (<> s) . mkLaTeXLabel' . (prefix<>) . getLabelWithoutPrefix . citationId)--getLabelWithoutPrefix :: T.Text -> T.Text-getLabelWithoutPrefix = T.drop 1 . T.dropWhile (/=':')--getLabelPrefix :: T.Text -> Maybe T.Text-getLabelPrefix lab-  | uncapitalizeFirst p `elem` prefixes = Just p-  | otherwise = Nothing-  where p = flip T.snoc ':' . T.takeWhile (/=':') $ lab--replaceRefsOther :: T.Text -> Options -> [Citation] -> WS [Inline]-replaceRefsOther prefix opts cits = toList . intercalate' (text ", ") . map fromList <$>-    mapM (replaceRefsOther' prefix opts) (groupBy citationGroupPred cits)--citationGroupPred :: Citation -> Citation -> Bool-citationGroupPred = (==) `on` liftM2 (,) citationPrefix citationMode--replaceRefsOther' :: T.Text -> Options -> [Citation] -> WS [Inline]-replaceRefsOther' prefix opts cits = do-  indices <- mapM (getRefIndex prefix opts) cits-  let-    cap = maybe False isFirstUpper $ getLabelPrefix . citationId . head $ cits-    writePrefix | all ((==SuppressAuthor) . citationMode) cits-                = id-                | all (null . citationPrefix) cits-                = cmap $ getRefPrefix opts prefix cap (length cits - 1)-                | otherwise-                = cmap $ toList . ((fromList (citationPrefix (head cits)) <> space) <>) . fromList-    cmap f [Link attr t w]-      | nameInLink opts = [Link attr (f t) w]-    cmap f x = f x-  return $ writePrefix (makeIndices opts indices)--data RefData = RefData { rdLabel :: T.Text-                       , rdIdx :: Maybe Index-                       , rdSubfig :: Maybe Index-                       , rdSuffix :: [Inline]-                       } deriving (Eq)--instance Ord RefData where-  (<=) = (<=) `on` rdIdx--getRefIndex :: T.Text -> Options -> Citation -> WS RefData-getRefIndex prefix _opts Citation{citationId=cid,citationSuffix=suf}-  = do-    ref <- M.lookup lab <$> get prop-    let sub = refSubfigure <$> ref-        idx = refIndex <$> ref-    return RefData-      { rdLabel = lab-      , rdIdx = idx-      , rdSubfig = join sub-      , rdSuffix = suf-      }-  where-  prop = lookupUnsafe prefix accMap-  lab = prefix <> getLabelWithoutPrefix cid--data RefItem = RefRange RefData RefData | RefSingle RefData--makeIndices :: Options -> [RefData] -> [Inline]-makeIndices o s = format $ concatMap f $ HT.groupBy g $ sort $ nub s-  where-  g :: RefData -> RefData -> Bool-  g a b = all (null . rdSuffix) [a, b] && (-            all (isNothing . rdSubfig) [a, b] &&-            Just True == (liftM2 follows `on` rdIdx) b a ||-            rdIdx a == rdIdx b &&-            Just True == (liftM2 follows `on` rdSubfig) b a-          )-  follows :: Index -> Index -> Bool-  follows a b-    | Just (ai, al) <- HT.viewR a-    , Just (bi, bl) <- HT.viewR b-    = ai == bi && A.first (+1) bl == al-  follows _ _ = False-  f :: [RefData] -> [RefItem]-  f []  = []                          -- drop empty lists-  f [w] = [RefSingle w]                   -- single value-  f [w1,w2] = [RefSingle w1, RefSingle w2] -- two values-  f (x:xs) = [RefRange x (last xs)] -- shorten more than two values-  format :: [RefItem] -> [Inline]-  format [] = []-  format [x] = toList $ show'' x-  format [x, y] = toList $ show'' x <> fromList (pairDelim o) <> show'' y-  format xs = toList $ intercalate' (fromList $ refDelim o) init' <> fromList (lastDelim o) <> last'-    where initlast []     = error "emtpy list in initlast"-          initlast [y]    = ([], y)-          initlast (y:ys) = first (y:) $ initlast ys-          (init', last') = initlast $ map show'' xs-  show'' :: RefItem -> Inlines-  show'' (RefSingle x) = show' x-  show'' (RefRange x y) = show' x <> fromList (rangeDelim o) <> show' y-  show' :: RefData -> Inlines-  show' RefData{rdLabel=l, rdIdx=Just i, rdSubfig = sub, rdSuffix = suf}-    | linkReferences o = link ('#' `T.cons` l) "" (fromList txt)-    | otherwise = fromList txt-    where-      txt-        | Just sub' <- sub-        = let vars = M.fromDistinctAscList-                      [ ("i", chapPrefix (chapDelim o) i)-                      , ("s", chapPrefix (chapDelim o) sub')-                      , ("suf", suf)-                      ]-          in applyTemplate' vars $ subfigureRefIndexTemplate o-        | otherwise-        = let vars = M.fromDistinctAscList-                      [ ("i", chapPrefix (chapDelim o) i)-                      , ("suf", suf)-                      ]-          in applyTemplate' vars $ refIndexTemplate o-  show' RefData{rdLabel=l, rdIdx=Nothing, rdSuffix = suf} =-    trace (T.unpack $ "Undefined cross-reference: " <> l)-          (strong (text $ "¿" <> l <> "?") <> fromList suf)
− lib/Text/Pandoc/CrossRef/References/Types.hs
@@ -1,56 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE TemplateHaskell #-}-module Text.Pandoc.CrossRef.References.Types where--import qualified Data.Map as M-import Text.Pandoc.Definition-import Control.Monad.State-import Data.Default-import Data.Accessor.Template-import Data.Text (Text)--type Index = [(Int, Maybe Text)]--data RefRec = RefRec { refIndex :: Index-                     , refTitle :: [Inline]-                     , refSubfigure :: Maybe Index-                     } deriving (Show, Eq)--type RefMap = M.Map Text RefRec---- state data type-data References = References { imgRefs_ :: RefMap-                             , eqnRefs_ :: RefMap-                             , tblRefs_ :: RefMap-                             , lstRefs_ :: RefMap-                             , secRefs_ :: RefMap-                             , curChap_ :: Index-                             } deriving (Show, Eq)----state monad-type WS a = State References a--instance Default References where-  def = References n n n n n []-    where n = M.empty--deriveAccessors ''References
− lib/Text/Pandoc/CrossRef/Util/CodeBlockCaptions.hs
@@ -1,67 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE OverloadedStrings #-}-module Text.Pandoc.CrossRef.Util.CodeBlockCaptions-    (-    mkCodeBlockCaptions-    ) where--import Text.Pandoc.Definition-import Data.List (stripPrefix)-import Data.Maybe (fromMaybe)-import Text.Pandoc.CrossRef.References.Types-import Text.Pandoc.CrossRef.Util.Options-import Text.Pandoc.CrossRef.Util.Util-import qualified Data.Text as T--mkCodeBlockCaptions :: Options -> [Block] -> WS [Block]-mkCodeBlockCaptions opts x@(cb@(CodeBlock _ _):p@(Para _):xs)-  = return $ fromMaybe x $ orderAgnostic opts $ p:cb:xs-mkCodeBlockCaptions opts x@(p@(Para _):cb@(CodeBlock _ _):xs)-  = return $ fromMaybe x $ orderAgnostic opts $ p:cb:xs-mkCodeBlockCaptions _ x = return x--orderAgnostic :: Options -> [Block] -> Maybe [Block]-orderAgnostic opts (Para ils:CodeBlock (label,classes,attrs) code:xs)-  | codeBlockCaptions opts-  , Just caption <- getCodeBlockCaption ils-  , not $ T.null label-  , "lst" `T.isPrefixOf` label-  = return $ Div (label,["listing"], [])-      [Para caption, CodeBlock ("",classes,attrs) code] : xs-orderAgnostic opts (Para ils:CodeBlock (_,classes,attrs) code:xs)-  | codeBlockCaptions opts-  , Just (caption, labinl) <- splitLast <$> getCodeBlockCaption ils-  , Just label <- getRefLabel "lst" labinl-  = return $ Div (label,["listing"], [])-      [Para $ init caption, CodeBlock ("",classes,attrs) code] : xs-  where-    splitLast xs' = splitAt (length xs' - 1) xs'-orderAgnostic _ _ = Nothing--getCodeBlockCaption :: [Inline] -> Maybe [Inline]-getCodeBlockCaption ils-  | Just caption <- [Str "Listing:",Space] `stripPrefix` ils-  = Just caption-  | Just caption <- [Str ":",Space] `stripPrefix` ils-  = Just caption-  | otherwise-  = Nothing
− lib/Text/Pandoc/CrossRef/Util/CustomLabels.hs
@@ -1,55 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE OverloadedStrings #-}-module Text.Pandoc.CrossRef.Util.CustomLabels (customLabel, customHeadingLabel) where--import Text.Pandoc.Definition-import Text.Pandoc.CrossRef.Util.Meta-import Text.Numeral.Roman-import qualified Data.Text as T--customLabel :: Meta -> T.Text -> Int -> Maybe T.Text-customLabel meta ref i-  | refLabel <- T.takeWhile (/=':') ref-  , Just cl <- lookupMeta (refLabel <> "Labels") meta-  = mkLabel i (refLabel <> "Labels") cl-  | otherwise = Nothing--customHeadingLabel :: Meta -> Int -> Int -> Maybe T.Text-customHeadingLabel meta lvl i-  | Just cl <- getMetaList Just "secLevelLabels" meta (lvl-1)-  = mkLabel i "secLevelLabels" cl-  | otherwise = Nothing--mkLabel :: Int -> T.Text -> MetaValue -> Maybe T.Text-mkLabel i n lt-  | MetaList _ <- lt-  , Just val <- toString n <$> getList (i-1) lt-  = Just val-  | toString n lt == "arabic"-  = Nothing-  | toString n lt == "roman"-  = Just $ toRoman i-  | toString n lt == "lowercase roman"-  = Just $ T.toLower $ toRoman i-  | Just (startWith, _) <- T.uncons =<< T.stripPrefix "alpha " (toString n lt)-  = Just . T.singleton $ [startWith..] !! (i-1)-  | otherwise = error $ "Unknown numeration type: " ++ show lt
− lib/Text/Pandoc/CrossRef/Util/Meta.hs
@@ -1,123 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE FlexibleContexts, Rank2Types #-}-module Text.Pandoc.CrossRef.Util.Meta (-    getMetaList-  , getMetaBool-  , getMetaInlines-  , getMetaBlock-  , getMetaString-  , getList-  , toString-  , toInlines-  , tryCapitalizeM-  ) where--import Text.Pandoc.CrossRef.Util.Util-import Text.Pandoc.Definition-import Text.Pandoc.Builder-import Data.Default-import Text.Pandoc.Walk-import Text.Pandoc.Shared hiding (capitalize, toString)-import qualified Data.Text as T--getMetaList :: (Default a) => (MetaValue -> a) -> T.Text -> Meta -> Int -> a-getMetaList f name meta i = maybe def f $ lookupMeta name meta >>= getList i--getMetaBool :: T.Text -> Meta -> Bool-getMetaBool = getScalar toBool--getMetaInlines :: T.Text -> Meta -> [Inline]-getMetaInlines = getScalar toInlines--getMetaBlock :: T.Text -> Meta -> [Block]-getMetaBlock = getScalar toBlocks--getMetaString :: T.Text -> Meta -> T.Text-getMetaString = getScalar toString--getScalar :: Def b => (T.Text -> MetaValue -> b) -> T.Text -> Meta -> b-getScalar conv name meta = maybe def' (conv name) $ lookupMeta name meta--class Def a where-  def' :: a--instance Def Bool where-  def' = False--instance Def [a] where-  def' = []--instance Def T.Text where-  def' = T.empty--unexpectedError :: forall a. String -> T.Text -> MetaValue -> a-unexpectedError e n x = error $ "Expected " <> e <> " in metadata field " <> T.unpack n <> " but got " <> g x-  where-    g (MetaBlocks _) = "blocks"-    g (MetaString _) = "string"-    g (MetaInlines _) = "inlines"-    g (MetaBool _) = "bool"-    g (MetaMap _) = "map"-    g (MetaList _) = "list"--toInlines :: T.Text -> MetaValue -> [Inline]-toInlines _ (MetaBlocks s) = blocksToInlines s-toInlines _ (MetaInlines s) = s-toInlines _ (MetaString s) = toList $ text s-toInlines n x = unexpectedError "inlines" n x--toBool :: T.Text -> MetaValue -> Bool-toBool _ (MetaBool b) = b-toBool n x = unexpectedError "bool" n x--toBlocks :: T.Text -> MetaValue -> [Block]-toBlocks _ (MetaBlocks bs) = bs-toBlocks _ (MetaInlines ils) = [Plain ils]-toBlocks _ (MetaString s) = toList $ plain $ text s-toBlocks n x = unexpectedError "blocks" n x--toString :: T.Text -> MetaValue -> T.Text-toString _ (MetaString s) = s-toString _ (MetaBlocks b) = stringify b-toString _ (MetaInlines i) = stringify i-toString n x = unexpectedError "string" n x--getList :: Int -> MetaValue -> Maybe MetaValue-getList i (MetaList l) = l !!? i-  where-    list !!? index | index >= 0 && index < length list = Just $ list !! index-                   | not $ null list = Just $ last list-                   | otherwise = Nothing-getList _ x = Just x--tryCapitalizeM :: (Functor m, Monad m, Walkable Inline a, Default a, Eq a) =>-        (T.Text -> m a) -> T.Text -> Bool -> m a-tryCapitalizeM f varname capitalize-  | capitalize = do-    res <- f (capitalizeFirst varname)-    case res of-      xs | xs == def -> f varname >>= walkM capStrFst-         | otherwise -> return xs-  | otherwise  = f varname-  where-    capStrFst (Str s) = return $ Str $ capitalizeFirst s-    capStrFst x = return x
− lib/Text/Pandoc/CrossRef/Util/ModifyMeta.hs
@@ -1,134 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE OverloadedStrings #-}-module Text.Pandoc.CrossRef.Util.ModifyMeta-    (-    modifyMeta-    ) where--import Text.Pandoc-import Text.Pandoc.Builder hiding ((<>))-import Text.Pandoc.CrossRef.Util.Options-import Text.Pandoc.CrossRef.Util.Meta-import Text.Pandoc.CrossRef.Util.Util-import qualified Data.Text as T-import Control.Monad.Writer--modifyMeta :: Options -> Meta -> Meta-modifyMeta opts meta-  | isLatexFormat (outFormat opts)-  = setMeta "header-includes"-      (headerInc $ lookupMeta "header-includes" meta)-      meta-  | otherwise = meta-  where-    headerInc :: Maybe MetaValue -> MetaValue-    headerInc Nothing = incList-    headerInc (Just (MetaList x)) = MetaList $ x <> [incList]-    headerInc (Just x) = MetaList [x, incList]-    incList = MetaBlocks $ return $ RawBlock (Format "latex") $ T.unlines $ execWriter $ do-        tell [ "\\makeatletter" ]-        tell subfig-        tell floatnames-        tell listnames-        tell subfigures-        unless (listings opts) $-          tell codelisting-        tell lolcommand-        when (cref opts) $ do-          tell cleveref-          unless (listings opts) $-            tell cleverefCodelisting-        tell [ "\\makeatother" ]-      where-        subfig = [-            usepackage [] "subfig"-          , usepackage [] "caption"-          , "\\captionsetup[subfloat]{margin=0.5em}"-          ]-        floatnames = [-            "\\AtBeginDocument{%"-          , "\\renewcommand*\\figurename{" <> metaString "figureTitle" <> "}"-          , "\\renewcommand*\\tablename{" <> metaString "tableTitle" <> "}"-          , "}"-          ]-        listnames = [-            "\\AtBeginDocument{%"-          , "\\renewcommand*\\listfigurename{" <> metaString' "lofTitle" <> "}"-          , "\\renewcommand*\\listtablename{" <> metaString' "lotTitle" <> "}"-          , "}"-          ]-        subfigures = [-            "\\newcounter{pandoccrossref@subfigures@footnote@counter}"-          , "\\newenvironment{pandoccrossrefsubfigures}{%"-          , "\\setcounter{pandoccrossref@subfigures@footnote@counter}{0}"-          , "\\begin{figure}\\centering%"-          , "\\gdef\\global@pandoccrossref@subfigures@footnotes{}%"-          , "\\DeclareRobustCommand{\\footnote}[1]{\\footnotemark%"-          , "\\stepcounter{pandoccrossref@subfigures@footnote@counter}%"-          , "\\ifx\\global@pandoccrossref@subfigures@footnotes\\empty%"-          , "\\gdef\\global@pandoccrossref@subfigures@footnotes{{##1}}%"-          , "\\else%"-          , "\\g@addto@macro\\global@pandoccrossref@subfigures@footnotes{, {##1}}%"-          , "\\fi}}%"-          , "{\\end{figure}%"-          , "\\addtocounter{footnote}{-\\value{pandoccrossref@subfigures@footnote@counter}}"-          , "\\@for\\f:=\\global@pandoccrossref@subfigures@footnotes\\do{\\stepcounter{footnote}\\footnotetext{\\f}}%"-          , "\\gdef\\global@pandoccrossref@subfigures@footnotes{}}"-          ]-        codelisting = [-            usepackage [] "float"-          , "\\floatstyle{ruled}"-          , "\\@ifundefined{c@chapter}{\\newfloat{codelisting}{h}{lop}}{\\newfloat{codelisting}{h}{lop}[chapter]}"-          , "\\floatname{codelisting}{" <> metaString "listingTitle" <> "}"-          ]-        lolcommand-          | listings opts = [-              "\\newcommand*\\listoflistings\\lstlistoflistings"-            , "\\AtBeginDocument{%"-            , "\\renewcommand*{\\lstlistlistingname}{" <> metaString' "lolTitle" <> "}"-            , "}"-            ]-          | otherwise = ["\\newcommand*\\listoflistings{\\listof{codelisting}{" <> metaString' "lolTitle" <> "}}"]-        cleveref = [ usepackage cleverefOpts "cleveref" ]-          <> crefname "figure" figPrefix-          <> crefname "table" tblPrefix-          <> crefname "equation" eqnPrefix-          <> crefname "listing" lstPrefix-          <> crefname "section" secPrefix-        cleverefCodelisting = [-            "\\crefname{codelisting}{\\cref@listing@name}{\\cref@listing@name@plural}"-          , "\\Crefname{codelisting}{\\Cref@listing@name}{\\Cref@listing@name@plural}"-          ]-        cleverefOpts | nameInLink opts = [ "nameinlink" ]-                     | otherwise = []-        crefname n f = [-            "\\crefname{" <> n <> "}" <> prefix f False-          , "\\Crefname{" <> n <> "}" <> prefix f True-          ]-        usepackage [] p = "\\@ifpackageloaded{" <> p <> "}{}{\\usepackage{" <> p <> "}}"-        usepackage xs p = "\\@ifpackageloaded{" <> p <> "}{}{\\usepackage" <> o <> "{" <> p <> "}}"-          where o = "[" <> T.intercalate "," xs <> "]"-        toLatex = either (error . show) id . runPure . writeLaTeX def . Pandoc nullMeta . return . Plain-        metaString s = toLatex $ getMetaInlines s meta-        metaString' s = toLatex [Str $ getMetaString s meta]-        prefix f uc = "{" <> toLatex (f opts uc 0) <> "}"  <>-                      "{" <> toLatex (f opts uc 1) <> "}"
− lib/Text/Pandoc/CrossRef/Util/Options.hs
@@ -1,71 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--module Text.Pandoc.CrossRef.Util.Options (Options(..)) where-import Text.Pandoc.Definition-import Text.Pandoc.CrossRef.Util.Template-import Data.Text (Text)--data Options = Options { cref :: Bool-                       , chaptersDepth   :: Int-                       , listings :: Bool-                       , codeBlockCaptions  :: Bool-                       , autoSectionLabels  :: Bool-                       , numberSections  :: Bool-                       , sectionsDepth  :: Int-                       , figPrefix   :: Bool -> Int -> [Inline]-                       , eqnPrefix   :: Bool -> Int -> [Inline]-                       , tblPrefix   :: Bool -> Int -> [Inline]-                       , lstPrefix   :: Bool -> Int -> [Inline]-                       , secPrefix   :: Bool -> Int -> [Inline]-                       , figPrefixTemplate :: Template-                       , eqnPrefixTemplate :: Template-                       , tblPrefixTemplate :: Template-                       , lstPrefixTemplate :: Template-                       , secPrefixTemplate :: Template-                       , refIndexTemplate :: Template-                       , subfigureRefIndexTemplate :: Template-                       , secHeaderTemplate :: Template-                       , chapDelim   :: [Inline]-                       , rangeDelim  :: [Inline]-                       , pairDelim  :: [Inline]-                       , lastDelim  :: [Inline]-                       , refDelim  :: [Inline]-                       , lofTitle    :: [Block]-                       , lotTitle    :: [Block]-                       , lolTitle    :: [Block]-                       , outFormat   :: Maybe Format-                       , figureTemplate :: Template-                       , subfigureTemplate :: Template-                       , subfigureChildTemplate :: Template-                       , ccsTemplate :: Template-                       , tableTemplate  :: Template-                       , listingTemplate :: Template-                       , customLabel :: Text -> Int -> Maybe Text-                       , customHeadingLabel :: Int -> Int -> Maybe Text-                       , ccsDelim :: [Inline]-                       , ccsLabelSep :: [Inline]-                       , tableEqns :: Bool-                       , autoEqnLabels :: Bool-                       , subfigGrid :: Bool-                       , linkReferences :: Bool-                       , nameInLink :: Bool-                       , setLabelAttribute :: Bool-                       }
− lib/Text/Pandoc/CrossRef/Util/Settings.hs
@@ -1,114 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>-Copyright (C) 2017  Masamichi Hosoda <trueroad@trueroad.jp>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE OverloadedStrings #-}-module Text.Pandoc.CrossRef.Util.Settings (getSettings, defaultMeta) where--import Text.Pandoc-import Text.Pandoc.Builder-import Control.Exception (handle,IOException)--import Text.Pandoc.CrossRef.Util.Settings.Gen-import Text.Pandoc.CrossRef.Util.Meta-import System.Directory-import System.FilePath-import System.IO-import qualified Data.Text as T--getSettings :: Maybe Format -> Meta -> IO Meta-getSettings fmt meta = do-  dirConfig <- readConfig (T.unpack $ getMetaString "crossrefYaml" (defaultMeta <> meta))-  home <- getHomeDirectory-  globalConfig <- readConfig (home </> ".pandoc-crossref" </> "config.yaml")-  formatConfig <- maybe (return nullMeta) (readFmtConfig home) fmt-  return $ defaultMeta <> globalConfig <> formatConfig <> dirConfig <> meta-  where-    readConfig path =-      handle handler $ do-        h <- openFile path ReadMode-        hSetEncoding h utf8-        yaml <- hGetContents h-        Pandoc meta' _ <- readMd $ T.pack $ unlines ["---", yaml, "---"]-        return meta'-    readMd = handleError . runPure . readMarkdown def{readerExtensions=pandocExtensions}-    readFmtConfig home fmt' = readConfig (home </> ".pandoc-crossref" </> "config-" ++ fmtStr fmt' ++ ".yaml")-    handler :: IOException -> IO Meta-    handler _ = return nullMeta-    fmtStr (Format fmtstr) = T.unpack fmtstr---defaultMeta :: Meta-defaultMeta =-     cref False-  <> chapters False-  <> chaptersDepth (MetaString "1")-  <> listings False-  <> codeBlockCaptions False-  <> autoSectionLabels False-  <> numberSections False-  <> sectionsDepth (MetaString "0")-  <> figLabels (MetaString "arabic")-  <> eqLabels (MetaString "arabic")-  <> tblLabels (MetaString "arabic")-  <> lstLabels (MetaString "arabic")-  <> secLabels (MetaString "arabic")-  <> figureTitle (str "Figure")-  <> tableTitle (str "Table")-  <> listingTitle (str "Listing")-  <> titleDelim (str ":")-  <> chapDelim (str ".")-  <> rangeDelim (str "-")-  <> pairDelim (str "," <> space)-  <> lastDelim (str "," <> space)-  <> refDelim (str "," <> space)-  <> figPrefix [str "fig.", str "figs."]-  <> eqnPrefix [str "eq." , str "eqns."]-  <> tblPrefix [str "tbl.", str "tbls."]-  <> lstPrefix [str "lst.", str "lsts."]-  <> secPrefix [str "sec.", str "secs."]-  <> figPrefixTemplate (var "p" <> str "\160" <> var "i")-  <> eqnPrefixTemplate (var "p" <> str "\160" <> var "i")-  <> tblPrefixTemplate (var "p" <> str "\160" <> var "i")-  <> lstPrefixTemplate (var "p" <> str "\160" <> var "i")-  <> secPrefixTemplate (var "p" <> str "\160" <> var "i")-  <> refIndexTemplate (var "i" <> var "suf")-  <> subfigureRefIndexTemplate (var "i" <> var "suf" <> space <> str "(" <> var "s" <> str ")")-  <> secHeaderTemplate (var "i" <> var "secHeaderDelim[n]" <> var "t")-  <> secHeaderDelim space-  <> lofTitle (header 1 $ text "List of Figures")-  <> lotTitle (header 1 $ text "List of Tables")-  <> lolTitle (header 1 $ text "List of Listings")-  <> figureTemplate (var "figureTitle" <> space <> var "i" <> var "titleDelim" <> space <> var "t")-  <> tableTemplate (var "tableTitle" <> space <> var "i" <> var "titleDelim" <> space <> var "t")-  <> listingTemplate (var "listingTitle" <> space <> var "i" <> var "titleDelim" <> space <> var "t")-  <> crossrefYaml (MetaString "pandoc-crossref.yaml")-  <> subfigureChildTemplate (var "i")-  <> subfigureTemplate (var "figureTitle" <> space <> var "i" <> var "titleDelim" <> space <> var "t" <> str "." <> space <> var "ccs")-  <> subfigLabels (MetaString "alpha a")-  <> ccsDelim (str "," <> space)-  <> ccsLabelSep (space <> str "—" <> space)-  <> ccsTemplate (var "i" <> var "ccsLabelSep" <> var "t")-  <> tableEqns False-  <> autoEqnLabels False-  <> subfigGrid False-  <> linkReferences False-  <> nameInLink False-  where var = displayMath
− lib/Text/Pandoc/CrossRef/Util/Settings/Gen.hs
@@ -1,54 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE TemplateHaskell, OverloadedStrings #-}--- {-# OPTIONS_GHC -ddump-splices #-}-module Text.Pandoc.CrossRef.Util.Settings.Gen where--import Text.Pandoc.CrossRef.Util.Settings.Template-import Text.Pandoc.CrossRef.Util.Meta-import Text.Pandoc.CrossRef.Util.Options as O (Options(..))-import Language.Haskell.TH (mkName)-import Text.Pandoc.Definition--nameDeriveSetters ''Options--concat <$> mapM (makeAcc . mkName)-  [ "figureTitle"-  , "tableTitle"-  , "listingTitle"-  , "titleDelim"-  , "crossrefYaml"-  , "subfigLabels"-  , "chapters"-  , "figLabels"-  , "eqLabels"-  , "tblLabels"-  , "lstLabels"-  , "secLabels"-  , "secHeaderDelim"-  ]--getOptions :: Meta -> Maybe Format -> Options-getOptions dtv fmt =-  let opts = $(makeCon ''Options 'Options)-  in if getMetaBool "chapters" dtv-     then opts-     else opts{O.chaptersDepth = 0}
− lib/Text/Pandoc/CrossRef/Util/Settings/Template.hs
@@ -1,98 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE TemplateHaskell, RankNTypes, ViewPatterns, MultiWayIf #-}-module Text.Pandoc.CrossRef.Util.Settings.Template where--import Text.Pandoc.Definition-import Text.Pandoc.Builder-import Text.Pandoc.CrossRef.Util.Meta-import qualified Data.Map as M-import Language.Haskell.TH hiding (Inline)-import Language.Haskell.TH.Syntax hiding (Inline)-import Data.List-import Text.Pandoc.CrossRef.Util.Template-import Text.Pandoc.CrossRef.Util.CustomLabels-import Data.Text (Text)-import qualified Data.Text as T--namedFields :: Con -> [VarStrictType]-namedFields (RecC _ fs) = fs-namedFields (ForallC _ _ c) = namedFields c-namedFields _ = []--fromRecDef :: forall t a r. Name -> t -> (Name -> Name -> Q [a]) -> (t -> [a] -> r) -> Q r-fromRecDef t cname f c = do-  info <- reify t-  reified <- case info of-                  TyConI dec -> return dec-                  _ -> fail "No cons"-  (_, cons) <- case reified of-               DataD _ _ params _ cons' _ -> return (params, cons')-               NewtypeD _ _ params _ con' _ -> return (params, [con'])-               _ -> fail "No cons"-  decs <- fmap concat . mapM (\ (name,_,_) -> f t name) . nub $ concatMap namedFields cons-  return $ c cname decs--nameDeriveSetters :: Name -> Q [Dec]-nameDeriveSetters t = fromRecDef t undefined (const makeAcc) (const id)--dropQualifiers :: Name -> Name-dropQualifiers (Name occ _) = mkName (occString occ)--makeAcc :: Name -> Q [Dec]-makeAcc (dropQualifiers -> accName) = do-    body <- [| Meta . M.singleton $(liftString $ show accName) . toMetaValue |]-    sig <- [t|forall a. ToMetaValue a => a -> Meta|]-    return-      [ SigD accName sig-      , ValD (VarP accName) (NormalB body) []-      ]--makeCon :: Name -> Name -> Q Exp-makeCon t cname = fromRecDef t cname makeCon' RecConE--makeCon' :: Name -> Name -> Q [(Name, Exp)]-makeCon' t accName = do-    VarI _ t' _ <- reify accName-    funT <- [t|$(conT t) -> Bool -> Int -> [Inline]|]-    inlT <- [t|$(conT t) -> [Inline]|]-    blkT <- [t|$(conT t) -> [Block]|]-    fmtT <- [t|$(conT t) -> Maybe Format|]-    boolT <- [t|$(conT t) -> Bool|]-    intT <- [t|$(conT t) -> Int|]-    tmplT <- [t|$(conT t) -> Template|]-    clT <- [t|$(conT t) -> Text -> Int -> Maybe Text|]-    chlT <- [t|$(conT t) -> Int -> Int -> Maybe Text|]-    let varName | Name (OccName n) _ <- accName = liftString n-    let dtv = return $ VarE $ mkName "dtv"-    body <--      if-      | t' == boolT -> [|getMetaBool $(varName) $(dtv)|]-      | t' == intT -> [|read $ T.unpack $ getMetaString $(varName) $(dtv)|]-      | t' == funT -> [|tryCapitalizeM (flip (getMetaList (toInlines $(varName))) $(dtv)) $(varName)|]-      | t' == inlT -> [|getMetaInlines $(varName) $(dtv)|]-      | t' == blkT -> [|getMetaBlock $(varName) $(dtv)|]-      | t' == tmplT -> [|makeTemplate $(dtv) $ getMetaInlines $(varName) $(dtv)|]-      | t' == clT -> [|customLabel $(dtv)|]-      | t' == chlT -> [|customHeadingLabel $(dtv)|]-      | t' == fmtT -> return $ VarE $ mkName "fmt"-      | otherwise -> fail $ show t'-    return [(accName, body)]
− lib/Text/Pandoc/CrossRef/Util/Template.hs
@@ -1,69 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE OverloadedStrings #-}-module Text.Pandoc.CrossRef.Util.Template-  ( Template-  , makeTemplate-  , applyTemplate-  , applyTemplate'-  ) where--import Text.Pandoc.Definition-import Text.Pandoc.Builder-import Text.Pandoc.Generic-import qualified Data.Map as M hiding (toList, fromList, singleton)-import Text.Pandoc.CrossRef.Util.Meta-import Control.Applicative-import Text.Read-import qualified Data.Text as T--type VarFunc = T.Text -> Maybe MetaValue-newtype Template = Template (VarFunc -> [Inline])--makeTemplate :: Meta -> [Inline] -> Template-makeTemplate dtv xs' = Template $ \vf -> scan (\var -> vf var <|> lookupMeta var dtv) xs'-  where-  scan = bottomUp . go-  go vf (x@(Math DisplayMath var):xs)-    | (vn, idxBr) <- T.span (/='[') var-    , not (T.null idxBr)-    , T.last idxBr == ']'-    = let idxVar = T.drop 1 $ T.takeWhile (/=']') idxBr-          idx = readMaybe . T.unpack . toString ("index variable " <> idxVar) =<< vf idxVar-          arr = do-            i <- idx-            v <- lookupMeta vn dtv-            getList i v-      in toList $ fromList (replaceVar var arr [x]) <> fromList xs-    | otherwise = toList $ fromList (replaceVar var (vf var) [x]) <> fromList xs-  go _ (x:xs) = toList $ singleton x <> fromList xs-  go _ [] = []-  replaceVar var val def' = maybe def' (toInlines ("variable " <> var)) val--applyTemplate' :: M.Map T.Text [Inline] -> Template -> [Inline]-applyTemplate' vars (Template g) = g internalVars-  where-  internalVars x | Just v <- M.lookup x vars = Just $ MetaInlines v-  internalVars _   = Nothing--applyTemplate :: [Inline] -> [Inline] -> Template -> [Inline]-applyTemplate i t =-  applyTemplate' (M.fromDistinctAscList [("i", i), ("t", t)])
− lib/Text/Pandoc/CrossRef/Util/Util.hs
@@ -1,151 +0,0 @@-{--pandoc-crossref is a pandoc filter for numbering figures,-equations, tables and cross-references to them.-Copyright (C) 2015  Nikolay Yakimov <root@livid.pp.ru>--This program is free software; you can redistribute it and/or modify-it under the terms of the GNU General Public License as published by-the Free Software Foundation; either version 2 of the License, or-(at your option) any later version.--This program is distributed in the hope that it will be useful,-but WITHOUT ANY WARRANTY; without even the implied warranty of-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-GNU General Public License for more details.--You should have received a copy of the GNU General Public License along-with this program; if not, write to the Free Software Foundation, Inc.,-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--}--{-# LANGUAGE RankNTypes, OverloadedStrings, CPP #-}-module Text.Pandoc.CrossRef.Util.Util-  ( module Text.Pandoc.CrossRef.Util.Util-  , module Data.Generics-  ) where--import Text.Pandoc.CrossRef.References.Types-import Text.Pandoc.Definition-import Text.Pandoc.Builder hiding ((<>))-import Text.Pandoc.Class-import Data.Char (toUpper, toLower, isUpper)-import Data.Maybe (fromMaybe)-import Data.Generics-import Text.Pandoc.Writers.LaTeX-import Data.Default-import Data.Version-import Data.List (find)-import Text.ParserCombinators.ReadP (readP_to_S)-import qualified Data.Text as T--intercalate' :: (Eq a, Monoid a, Foldable f) => a -> f a -> a-intercalate' s xs-  | null xs = mempty-  | otherwise = foldr1 (\x acc -> x <> s <> acc) xs--isFormat :: T.Text -> Maybe Format -> Bool-isFormat fmt (Just (Format f)) = T.takeWhile (`notElem` ("+-" :: String)) f == fmt-isFormat _ Nothing = False--isLatexFormat :: Maybe Format -> Bool-isLatexFormat = isFormat "latex" `or'` isFormat "beamer"-  where a `or'` b = (||) <$> a <*> b--capitalizeFirst :: T.Text -> T.Text-capitalizeFirst t-  | Just (x, xs) <- T.uncons t = toUpper x `T.cons` xs-  | otherwise = T.empty--uncapitalizeFirst :: T.Text -> T.Text-uncapitalizeFirst t-  | Just (x, xs) <- T.uncons t = toLower x `T.cons` xs-  | otherwise = T.empty--isFirstUpper :: T.Text -> Bool-isFirstUpper xs-  | Just (x, _) <- T.uncons xs  = isUpper x-  | otherwise = False--chapPrefix :: [Inline] -> Index -> [Inline]-chapPrefix delim = toList-  . intercalate' (fromList delim)-  . map str-  . filter (not . T.null)-  . map (uncurry (fromMaybe . T.pack . show))--data ReplacedResult a = Replaced Bool a | NotReplaced Bool-type GenRR m = forall a. Data a => (a -> m (ReplacedResult a))-newtype RR m a = RR {unRR :: a -> m (ReplacedResult a)}--runReplace :: (Monad m) => GenRR m -> GenericM m-runReplace f x = do-  res <- f x-  case res of-    Replaced True x' -> gmapM (runReplace f) x'-    Replaced False x' -> return x'-    NotReplaced True -> gmapM (runReplace f) x-    NotReplaced False -> return x--mkRR :: (Monad m, Typeable a, Typeable b)-     => (b -> m (ReplacedResult b))-     -> (a -> m (ReplacedResult a))-mkRR = extRR (const noReplaceRecurse)--extRR :: ( Monad m, Typeable a, Typeable b)-     => (a -> m (ReplacedResult a))-     -> (b -> m (ReplacedResult b))-     -> (a -> m (ReplacedResult a))-extRR def' ext = unRR (RR def' `ext0` RR ext)--replaceRecurse :: Monad m => a -> m (ReplacedResult a)-replaceRecurse = return . Replaced True--replaceNoRecurse :: Monad m => a -> m (ReplacedResult a)-replaceNoRecurse = return . Replaced False--noReplace :: Monad m => Bool -> m (ReplacedResult a)-noReplace recurse = return $ NotReplaced recurse--noReplaceRecurse :: Monad m => m (ReplacedResult a)-noReplaceRecurse = noReplace True--noReplaceNoRecurse :: Monad m => m (ReplacedResult a)-noReplaceNoRecurse = noReplace False--mkLaTeXLabel :: T.Text -> T.Text-mkLaTeXLabel l- | T.null l = ""- | otherwise = "\\label{" <> mkLaTeXLabel' l <> "}"--mkLaTeXLabel' :: T.Text -> T.Text-mkLaTeXLabel' l =-  let ll = either (error . show) id $-            runPure (writeLaTeX def $ Pandoc nullMeta [Div (l, [], []) []])-  in T.takeWhile (/='}') . T.drop 1 . T.dropWhile (/='{') $ ll--escapeLaTeX :: T.Text -> T.Text-escapeLaTeX l =-  let ll = either (error . show) id $-            runPure (writeLaTeX def $ Pandoc nullMeta [Plain [Str l]])-      pv = fmap fst . find (null . snd) . readP_to_S parseVersion $ VERSION_pandoc-      mv = makeVersion [2,11,0,1]-      cond = maybe False (mv >=) pv-  in if cond then ll else l--getRefLabel :: T.Text -> [Inline] -> Maybe T.Text-getRefLabel _ [] = Nothing-getRefLabel tag ils-  | Str attr <- last ils-  , all (==Space) (init ils)-  , "}" `T.isSuffixOf` attr-  , ("{#"<>tag<>":") `T.isPrefixOf` attr-  = T.init `fmap` T.stripPrefix "{#" attr-getRefLabel _ _ = Nothing--isSpace :: Inline -> Bool-isSpace = (||) <$> (==Space) <*> (==SoftBreak)--isLaTeXRawBlockFmt :: Format -> Bool-isLaTeXRawBlockFmt (Format "latex") = True-isLaTeXRawBlockFmt (Format "tex") = True-isLaTeXRawBlockFmt _ = False
pandoc-crossref.cabal view
@@ -1,13 +1,13 @@-cabal-version: 1.12+cabal-version: 2.0  -- This file has been generated from package.yaml by hpack version 0.33.0. -- -- see: https://github.com/sol/hpack ----- hash: 5a129dfce5b068071f7222d4862b7159b9293232e08ec191d8446632b0fe6314+-- hash: e117c4fe3ce92561126a6cfd9a8f561d8f78d4bbc5411e58e04e0cdb1b568a3f  name:           pandoc-crossref-version:        0.3.10.0+version:        0.3.11.0 synopsis:       Pandoc filter for cross-references description:    pandoc-crossref is a pandoc filter for numbering figures, equations, tables and cross-references to them. category:       Text@@ -34,6 +34,9 @@     test/m2m/emptyChapterLabels/expect.md     test/m2m/emptyChapterLabels/expect.tex     test/m2m/emptyChapterLabels/input.md+    test/m2m/equationNumberLaTeX/expect.md+    test/m2m/equationNumberLaTeX/expect.tex+    test/m2m/equationNumberLaTeX/input.md     test/m2m/equations-auto/expect.md     test/m2m/equations-auto/expect.tex     test/m2m/equations-auto/input.md@@ -85,6 +88,9 @@     test/m2m/subfigures/expect.md     test/m2m/subfigures/expect.tex     test/m2m/subfigures/input.md+    test/m2m/titlesInRefs/expect.md+    test/m2m/titlesInRefs/expect.tex+    test/m2m/titlesInRefs/input.md  source-repository head   type: git@@ -98,7 +104,20 @@ library   exposed-modules:       Text.Pandoc.CrossRef-  other-modules:+  hs-source-dirs:+      lib+  ghc-options: -Wall+  build-depends:+      base >=4.11 && <5+    , mtl >=1.1 && <2.3+    , pandoc >=2.10 && <2.15+    , pandoc-crossref-internal+    , pandoc-types >=1.21 && <1.23+    , text >=1.2.2 && <1.3+  default-language: Haskell2010++library pandoc-crossref-internal+  exposed-modules:       Text.Pandoc.CrossRef.References       Text.Pandoc.CrossRef.References.Blocks       Text.Pandoc.CrossRef.References.List@@ -114,10 +133,8 @@       Text.Pandoc.CrossRef.Util.Settings.Template       Text.Pandoc.CrossRef.Util.Template       Text.Pandoc.CrossRef.Util.Util-      Paths_pandoc_crossref   hs-source-dirs:-      lib-  ghc-options: -Wall+      lib-internal   build-depends:       base >=4.11 && <5     , containers >=0.1 && <0.7@@ -128,7 +145,7 @@     , directory >=1 && <1.4     , filepath >=1.1 && <1.5     , mtl >=1.1 && <2.3-    , pandoc >=2.10 && <2.13+    , pandoc >=2.10 && <2.15     , pandoc-types >=1.21 && <1.23     , roman-numerals ==0.5.*     , syb >=0.4 && <0.8@@ -141,33 +158,21 @@   main-is: pandoc-crossref.hs   other-modules:       ManData-      Paths_pandoc_crossref   hs-source-dirs:       src   ghc-options: -Wall -threaded   build-depends:       base >=4.11 && <5-    , containers >=0.1 && <0.7-    , data-accessor >=0.2.2.6 && <0.3.0.0-    , data-accessor-template >=0.2.1.12 && <0.3.0.0-    , data-accessor-transformers >=0.2.1.6 && <0.3.0.0-    , data-default >=0.4 && <0.8     , deepseq >=1.4 && <1.5-    , directory >=1 && <1.4-    , filepath >=1.1 && <1.5     , gitrev >=1.3.1 && <1.4-    , mtl >=1.1 && <2.3     , open-browser >=0.2 && <0.3     , optparse-applicative >=0.13 && <0.17-    , pandoc >=2.10 && <2.13+    , pandoc >=2.10 && <2.15     , pandoc-crossref     , pandoc-types >=1.21 && <1.23-    , roman-numerals ==0.5.*-    , syb >=0.4 && <0.8     , template-haskell >=2.7.0.0 && <3.0.0.0     , temporary >=1.2 && <1.4     , text >=1.2.2 && <1.3-    , utility-ht >=0.0.11 && <0.1.0   default-language: Haskell2010  test-suite test-integrative@@ -178,23 +183,13 @@   ghc-options: -Wall -fno-warn-unused-do-bind -threaded   build-depends:       base >=4.11 && <5-    , containers >=0.1 && <0.7-    , data-accessor >=0.2.2.6 && <0.3.0.0-    , data-accessor-template >=0.2.1.12 && <0.3.0.0-    , data-accessor-transformers >=0.2.1.6 && <0.3.0.0-    , data-default >=0.4 && <0.8     , directory >=1 && <1.4     , filepath >=1.1 && <1.5     , hspec >=2.4.4 && <3-    , mtl >=1.1 && <2.3-    , pandoc >=2.10 && <2.13+    , pandoc >=2.10 && <2.15     , pandoc-crossref     , pandoc-types >=1.21 && <1.23-    , roman-numerals ==0.5.*-    , syb >=0.4 && <0.8-    , template-haskell >=2.7.0.0 && <3.0.0.0     , text >=1.2.2 && <1.3-    , utility-ht >=0.0.11 && <0.1.0   if flag(enable_flaky_tests)     cpp-options: -DFLAKY   default-language: Haskell2010@@ -204,45 +199,41 @@   main-is: test-pandoc-crossref.hs   other-modules:       Native-      Text.Pandoc.CrossRef-      Text.Pandoc.CrossRef.References-      Text.Pandoc.CrossRef.References.Blocks-      Text.Pandoc.CrossRef.References.List-      Text.Pandoc.CrossRef.References.Refs-      Text.Pandoc.CrossRef.References.Types-      Text.Pandoc.CrossRef.Util.CodeBlockCaptions-      Text.Pandoc.CrossRef.Util.CustomLabels-      Text.Pandoc.CrossRef.Util.Meta-      Text.Pandoc.CrossRef.Util.ModifyMeta-      Text.Pandoc.CrossRef.Util.Options-      Text.Pandoc.CrossRef.Util.Settings-      Text.Pandoc.CrossRef.Util.Settings.Gen-      Text.Pandoc.CrossRef.Util.Settings.Template-      Text.Pandoc.CrossRef.Util.Template-      Text.Pandoc.CrossRef.Util.Util       Paths_pandoc_crossref+  autogen-modules:+      Paths_pandoc_crossref   hs-source-dirs:       test-      lib   ghc-options: -Wall -fno-warn-unused-do-bind -threaded   build-depends:       base >=4.11 && <5     , containers >=0.1 && <0.7     , data-accessor >=0.2.2.6 && <0.3.0.0-    , data-accessor-template >=0.2.1.12 && <0.3.0.0-    , data-accessor-transformers >=0.2.1.6 && <0.3.0.0     , data-default >=0.4 && <0.8-    , directory >=1 && <1.4-    , filepath >=1.1 && <1.5     , hspec >=2.4.4 && <3     , mtl >=1.1 && <2.3-    , pandoc >=2.10 && <2.13+    , pandoc >=2.10 && <2.15+    , pandoc-crossref+    , pandoc-crossref-internal     , pandoc-types >=1.21 && <1.23-    , roman-numerals ==0.5.*-    , syb >=0.4 && <0.8-    , template-haskell >=2.7.0.0 && <3.0.0.0     , text >=1.2.2 && <1.3-    , utility-ht >=0.0.11 && <0.1.0   if flag(enable_flaky_tests)     cpp-options: -DFLAKY+  default-language: Haskell2010++benchmark simple+  type: exitcode-stdio-1.0+  main-is: bench-simple.hs+  other-modules:+      Native+  hs-source-dirs:+      test+  ghc-options: -Wall -fno-warn-unused-do-bind -threaded+  build-depends:+      base >=4.11 && <5+    , criterion >=1.5.9.0 && <1.6+    , pandoc >=2.10 && <2.15+    , pandoc-crossref+    , pandoc-types >=1.21 && <1.23+    , text >=1.2.2 && <1.3   default-language: Haskell2010
+ test/bench-simple.hs view
@@ -0,0 +1,15 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# LANGUAGE StandaloneDeriving, GeneralizedNewtypeDeriving #-}+import Criterion.Main+import Text.Pandoc.CrossRef+import Text.Pandoc+import Native++main :: IO ()+main = defaultMain [+    bench "demo" (nf go demo)+  , bench "demoChapters" (nf go demochapters)+  ]+  where+    go = runCrossRef nullMeta Nothing crossRefBlocks+  -- map (\l -> bench ("concat dlist " <> show l) . nf (uncurry append) $ dlists l) lengths
+ test/m2m/equationNumberLaTeX/expect.md view
@@ -0,0 +1,44 @@+This is a test file with some referenced equations, line $$ this $$++Some equations might be inside of text, $$ for example $$ this one.++Some equations might be on start of paragraphs:++$$ start $$ of paragraph.++Other might be on separate paragraphs of their own:++$$ separate $$++Some of those can be labelled:++This is a test file with some referenced equations, line+[$$ this \tag{1}$$]{#eq:0}++Some equations might be inside of text,+[$$ for example \tag{2}$$]{#eq:1} this one.++Some equations might be on start of paragraphs:++[$$ start \tag{3}$$]{#eq:2} of paragraph.++Other might be on separate paragraphs of their own:++[$$ separate \tag{4}$$]{#eq:3}++Then they can be referenced:++Individually eq. 1, eq. 2, eq. 3, eq. 4++Or in groups eqns. 1, 2, 4++Groups will be compacted eqns. 1-4++Unknown references will print labels eqns. **¿eq:none?**, 1, 3, 4++Reference prefix will override default prefix Equation 1, eqns. 3, 4++References with `-` prepended won't have prefix at all: 1, 2, eqns. 3, 4++References with suffix will have suffix printed after index+(configurable): eqns. 1, 2 suffix, 3
+ test/m2m/equationNumberLaTeX/expect.tex view
@@ -0,0 +1,51 @@+This is a test file with some referenced equations, line \[ this \]++Some equations might be inside of text, \[ for example \] this one.++Some equations might be on start of paragraphs:++\[ start \] of paragraph.++Other might be on separate paragraphs of their own:++\[ separate \]++Some of those can be labelled:++This is a test file with some referenced equations, line+\begin{equation}\protect\hypertarget{eq:0}{}{ this }\label{eq:0}\end{equation}++Some equations might be inside of text,+\begin{equation}\protect\hypertarget{eq:1}{}{ for example }\label{eq:1}\end{equation}+this one.++Some equations might be on start of paragraphs:++\begin{equation}\protect\hypertarget{eq:2}{}{ start }\label{eq:2}\end{equation}+of paragraph.++Other might be on separate paragraphs of their own:++\begin{equation}\protect\hypertarget{eq:3}{}{ separate }\label{eq:3}\end{equation}++Then they can be referenced:++Individually eq.~\ref{eq:0}, eq.~\ref{eq:1}, eq.~\ref{eq:2},+eq.~\ref{eq:3}++Or in groups eqns.~\ref{eq:0}, \ref{eq:1}, \ref{eq:3}++Groups will be compacted+eqns.~\ref{eq:0}, \ref{eq:1}, \ref{eq:3}, \ref{eq:2}++Unknown references will print labels+eqns.~\ref{eq:0}, \ref{eq:none}, \ref{eq:3}, \ref{eq:2}++Reference prefix will override default prefix Equation \ref{eq:0},+eqns.~\ref{eq:3}, \ref{eq:2}++References with \texttt{-} prepended won't have prefix at all:+\ref{eq:0}, \ref{eq:1}, eqns.~\ref{eq:2}, \ref{eq:3}++References with suffix will have suffix printed after index+(configurable): eqns.~\ref{eq:0}, \ref{eq:1}, \ref{eq:2}
+ test/m2m/equationNumberLaTeX/input.md view
@@ -0,0 +1,47 @@+---+equationNumberTeX: \\tag+---++This is a test file with some referenced equations, line $$ this $$++Some equations might be inside of text, $$ for example $$ this one.++Some equations might be on start of paragraphs:++$$ start $$ of paragraph.++Other might be on separate paragraphs of their own:++$$ separate $$++Some of those can be labelled:++This is a test file with some referenced equations, line $$ this $${#eq:0}++Some equations might be inside of text, $$ for example $${#eq:1} this one.++Some equations might be on start of paragraphs:++$$ start $${#eq:2} of paragraph.++Other might be on separate paragraphs of their own:++$$ separate $${#eq:3}++Then they can be referenced:++Individually @eq:0, @eq:1, @eq:2, @eq:3++Or in groups [@eq:0; @eq:1; @eq:3]++Groups will be compacted [@eq:0; @eq:1; @eq:3; @eq:2]++Unknown references will print labels [@eq:0; @eq:none; @eq:3; @eq:2]++Reference prefix will override default prefix [Equation @eq:0; @eq:3; @eq:2]++References with `-` prepended won't have prefix at all:+[-@eq:0; -@eq:1; @eq:2; @eq:3]++References with suffix will have suffix printed after index (configurable):+[@eq:0; @eq:1 suffix; @eq:2]
test/m2m/listing-captions-ids/expect.md view
@@ -3,7 +3,7 @@ ::: {#lst:code1 .listing .haskell} Listing 1: Listing caption 1 -``` {.haskell}+``` haskell main :: IO () main = putStrLn "Hello World!" ```@@ -12,7 +12,7 @@ ::: {#lst:code2 .listing .haskell} Listing 2: Listing caption 2 -``` {.haskell}+``` haskell main :: IO () main = putStrLn "Hello World!" ```@@ -21,7 +21,7 @@ ::: {#lst:code3 .listing .haskell} Listing 3: Listing caption 3 -``` {.haskell}+``` haskell main :: IO () main = putStrLn "Hello World!" ```@@ -30,20 +30,20 @@ ::: {#lst:code4 .listing .haskell} Listing 4: Listing caption 4 -``` {.haskell}+``` haskell main :: IO () main = putStrLn "Hello World!" ``` ::: -``` {.haskell}+``` haskell main :: IO () main = putStrLn "Hello World!" ```  : Listing caption 5 (invalid) -``` {.haskell}+``` haskell main :: IO () main = putStrLn "Hello World!" ```@@ -55,7 +55,7 @@ ::: {#lst:code11 .listing .haskell} Listing 5: Listing caption 11 -``` {.haskell}+``` haskell main :: IO () main = putStrLn "Hello World!" ```@@ -64,7 +64,7 @@ ::: {#lst:code12 .listing .haskell} Listing 6: Listing caption 12 -``` {.haskell}+``` haskell main :: IO () main = putStrLn "Hello World!" ```@@ -73,7 +73,7 @@ ::: {#lst:code13 .listing .haskell} Listing 7: Listing caption 13 -``` {.haskell}+``` haskell main :: IO () main = putStrLn "Hello World!" ```@@ -82,7 +82,7 @@ ::: {#lst:code14 .listing .haskell} Listing 8: Listing caption 14 -``` {.haskell}+``` haskell main :: IO () main = putStrLn "Hello World!" ```@@ -92,14 +92,14 @@  : Listing caption 15 (invalid) -``` {.haskell}+``` haskell main :: IO () main = putStrLn "Hello World!" ```  : Listing caption 16 (invalid) -``` {.haskell}+``` haskell main :: IO () main = putStrLn "Hello World!" ```
test/m2m/listings-code-block-caption-278/expect.md view
@@ -1,4 +1,4 @@-This is \#278 regression test+This is #278 regression test  ::: {#lst:some_listing .listing} Listing 1: some_listing
+ test/m2m/titlesInRefs/expect.md view
@@ -0,0 +1,7 @@+# Section {#sec:section}++![Figure 1: A Figure](figure.png){#fig:figure}++sec. 1 (Section)++fig. 1
+ test/m2m/titlesInRefs/expect.tex view
@@ -0,0 +1,14 @@+\hypertarget{sec:section}{%+\section{Section}\label{sec:section}}++\begin{figure}+\hypertarget{fig:figure}{%+\centering+\includegraphics{figure.png}+\caption{A Figure}\label{fig:figure}+}+\end{figure}++sec.~\ref{sec:section}++fig.~\ref{fig:figure}
+ test/m2m/titlesInRefs/input.md view
@@ -0,0 +1,13 @@+---+refIndexTemplate:+  sec: $$i$$$$suf$$ ($$t$$)+  default: $$i$$$$suf$$+---++# Section {#sec:section}++![A Figure](figure.png){#fig:figure}++[@sec:section]++[@fig:figure]