packages feed

pdfname 0.2 → 0.3

raw patch · 4 files changed

+293/−154 lines, 4 files

Files

CHANGELOG.md view
@@ -1,6 +1,11 @@ Changelog for pdfname ===================== +0.3+---++Added Unicode and HTML escaped text substitutions.+ 0.2 --- 
pdfname.cabal view
@@ -1,5 +1,5 @@ name:          pdfname-version:       0.2+version:       0.3 license:       MIT license-file:  LICENSE author:        Andrés Sicard-Ramírez with contributions by Juan Pedro Villa-Isaza.@@ -15,7 +15,7 @@   The @pdfname@ command-line program names a PDF file using the   author, year of creation and title information extracted from the   @pdfinfo@ program.-tested-with:   GHC == 8.0.2+tested-with:   GHC == 8.2.1  extra-source-files: CHANGELOG.md                     README.md
src/CreateFile.hs view
@@ -28,10 +28,9 @@  import Substitutions   ( authorSubst-  , titleSubst+  , removeFromTitle   , replace-  , replaceHTMLEntities-  , replaceHTMLSymbols+  , replaceHTMLEscapedText   , unicodeSubst   , weirdSubst   )@@ -55,8 +54,7 @@       . T.intercalate (T.singleton '-')       . map (T.reverse . T.takeWhile (' ' /=) . T.reverse)       . T.split (',' ==)-      . replaceHTMLSymbols-      . replaceHTMLEntities+      . replaceHTMLEscapedText       . replace authorSubst       . replace weirdSubst     ) xs@@ -72,9 +70,8 @@     -- NB that the substitutions are not commutative.     ( T.toLower       . replace unicodeSubst-      . replaceHTMLSymbols-      . replaceHTMLEntities-      . replace titleSubst+      . replaceHTMLEscapedText+      . removeFromTitle       . replace weirdSubst     ) xs 
src/Substitutions.hs view
@@ -2,46 +2,49 @@  module Substitutions   ( authorSubst-  , titleSubst+  , removeFromTitle   , replace-  , replaceHTMLEntities-  , replaceHTMLSymbols+  , replaceHTMLEscapedText   , unicodeSubst   , weirdSubst   ) where +import Data.Char ( ord )+ import Data.Text ( Text ) import qualified Data.Text as T +import Text.Printf ( printf )+ --------------------------------------------------------------------------------- Replacements+-- Replacements and pre-processing -type HTMLEntityName = Text-type HTMLEntityDec  = Text-type HTMLEntityHex  = Text-type HTMLSymbolDec  = Text-type HTMLSymbolHex  = Text+-- | Remove text from the title.+removeFromTitle ∷ Text → Text+removeFromTitle = replace $ map (\ a → (a, T.empty)) titleErase -replaceHTMLEntities ∷ Text → Text-replaceHTMLEntities = replace nameSubst . replace decSubst . replace hexSubst+-- These substitutions should be done before the Unicode+-- substitutions.+replaceHTMLEscapedText ∷ Text → Text+replaceHTMLEscapedText = replace $ htmlNameSubst ++ numericSubst   where-   nameSubst ∷ [(HTMLEntityName, Text)]-   nameSubst = map (\ (a, _, _, d) → (a, d)) htmlEntitySubst+  htmlDecSubst ∷ [(Text, Text)]+  htmlDecSubst = substHelper "&#%d;" -   decSubst ∷ [(HTMLEntityDec, Text)]-   decSubst = map (\ (_, b, _, d) → (b, d)) htmlEntitySubst+  html4HexSubst ∷ [(Text, Text)]+  html4HexSubst = substHelper "&#x%04X;" -   hexSubst ∷ [(HTMLEntityHex, Text)]-   hexSubst = map (\ (_, _, c, d) → (c, d)) htmlEntitySubst+  html5HexSubst ∷ [(Text, Text)]+  html5HexSubst = substHelper "&#x%05X;" -replaceHTMLSymbols ∷ Text → Text-replaceHTMLSymbols = replace decSubst . replace hexSubst-  where-   decSubst ∷ [(HTMLSymbolDec, Text)]-   decSubst = map (\ (a, _, c) → (a, c)) htmlSymbolSubst+  numericSubst ∷ [(Text, Text)]+  numericSubst = htmlDecSubst ++ html4HexSubst ++ html5HexSubst -   hexSubst ∷ [(HTMLSymbolHex, Text)]-   hexSubst = map (\ (_, b, c) → (b, c)) htmlSymbolSubst+  substHelper ∷ String → [(Text, Text)]+  substHelper format = map (\ (_, b) → (printfHelper format b, b)) htmlNameSubst+    where+    printfHelper ∷ String → Text → Text+    printfHelper pFormat t = T.pack $ printf pFormat (ord $ T.head t)  replace ∷ [(Text,Text)] → Text → Text replace xs ys = foldl (flip (uncurry T.replace)) ys xs@@ -49,87 +52,183 @@ ------------------------------------------------------------------------------ -- HTML entities and symbols substitutions --- Used by example for the Journal of Functional Programmning.+noName ∷ Text+noName = "N/A" --- | Substitutions of HTML entities.-htmlEntitySubst ∷ [(HTMLEntityName, HTMLEntityDec, HTMLEntityHex, Text)]-htmlEntitySubst =-  [ ("&Acirc;",   "&#194;",  "&#x00C2;", "A")              -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX-  , ("&Auml;",    "&#196;",  "&#x00C4;", "A")              -- LATIN CAPITAL LETTER A WITH DIAERESIS-  , ("&Ccedil;",  "&#199;",  "&#x00C7;", "C")              -- LATIN CAPITAL LETTER C WITH CEDILLA-  , ("&Euml;",    "&#203;",  "&#x00CB;", "E")              -- LATIN CAPITAL LETTER E WITH DIAERESIS-  , ("&Iuml;",    "&#207;",  "&#x00CF;", "I")              -- LATIN CAPITAL LETTER I WITH DIAERESIS-  , ("&Ouml;",    "&#214;",  "&#x00D6;", "O")              -- LATIN CAPITAL LETTER U WITH DIAERESIS-  , ("&Oslash;",  "&#216;",  "&#x00D8;", "O")              -- LATIN CAPITAL LETTER O WITH STROKE-  , ("&Uuml;",    "&#220;",  "&#x00DC;", "U")              -- LATIN CAPITAL LETTER U WITH DIAERESIS-  , ("&aacute;",  "&#225;",  "&#x00E1;", "a")              -- LATIN SMALL LETTER A WITH ACUTE-  , ("&acirc;",   "&#226;",  "&#x00E2;", "a")              -- LATIN SMALL LETTER A WITH CIRCUMFLEX-  , ("&auml;",    "&#228;",  "&#x00E4;", "a")              -- LATIN SMALL LETTER A WITH DIAERESIS-  , ("&ccedil;",  "&#231;",  "&#x00E7;", "c")              -- LATIN SMALL LETTER C WITH CEDILLA-  , ("&eacute;",  "&#233;",  "&#x00E9;", "e")              -- LATIN SMALL LETTER E WITH ACUTE-  , ("&euml;",    "&#235;",  "&#x00EB;", "e")              -- LATIN SMALL LETTER E WITH DIAERESIS-  , ("&iacute;",  "&#237;",  "&#x00ED;", "i")              -- LATIN SMALL LETTER I WITH ACUTE-  , ("&iuml;",    "&#239;",  "&#x00EF;", "i")              -- LATIN SMALL LETTER I WITH DIAERESIS-  , ("&oacute;",  "&#243;",  "&#x00F3;", "o")              -- LATIN SMALL LETTER O WITH ACUTE-  , ("&ouml;",    "&#246;",  "&#x00F6;", "o")              -- LATIN SMALL LETTER O WITH DIAERESIS-  , ("&oslash;",  "&#248;",  "&#x00F8;", "o")              -- LATIN SMALL LETTER O WITH STROKE-  , ("&uacute;",  "&#250;",  "&#x00FA;", "u")              -- LATIN SMALL LETTER U WITH ACUTE-  , ("&uuml;",    "&#252;",  "&#x00FC;", "u")              -- LATIN SMALL LETTER U WITH DIAERESIS-  , ("&Imacr;",   "&#298;",  "&#x012A;", "I")              -- LATIN CAPITAL LETTER I WITH MACRON-  , ("&imacr;",   "&#299;",  "&#x012B;", "I")              -- LATIN SMALL LETTER I WITH MACRON-  , ("&Sacute;",  "&#346;",  "&#x015A;", "S")              -- LATIN CAPITAL LETTER S WITH ACUTE-  , ("&sacute;",  "&#347;",  "&#x015B;", "s")              -- LATIN SMALL LETTER S WITH ACUTE-  , ("&Scedil;",  "&#350;",  "&#x015E;", "s")              -- LATIN CAPITAL LETTER S WITH CEDILLA-  , ("&scedil;",  "&#351;",  "&#x015F;", "s")              -- LATIN SMALL LETTER S WITH CEDILLA-  , ("&Scaron;",  "&#352;",  "&#x0160",  "S")              -- LATIN CAPITAL LETTER S WITH CARON-  , ("&scaron;",  "&#353;",  "&#x0161",  "s")              -- LATIN SMALL LETTER S WITH CARON-  , ("&alpha;",   "&#945;",  "&#x03B1;", "alpha")          -- GREEK SMALL LETTER ALPHA-  , ("&beta;",    "&#946;",  "&#x03B2;", "beta")           -- GREEK SMALL LETTER BETA-  , ("&gamma;",   "&#947;",  "&#x03B3;", "gamma")          -- GREEK SMALL LETTER GAMMA-  , ("&delta;",   "&#948;",  "&#x03B4;", "delta")          -- GREEK SMALL LETTER DELTA-  , ("&epsilon;", "&#949;",  "&#x03B5;", "epsilon")        -- GREEK SMALL LETTER EPSILON-  , ("&zeta;",    "&#950;",  "&#x03B6;", "zeta")           -- GREEK SMALL LETTER ZETA-  , ("&eta;",     "&#951;",  "&#x03B7;", "eta")            -- GREEK SMALL LETTER ETA-  , ("&theta;",   "&#952;",  "&#x03B8;", "theta")          -- GREEK SMALL LETTER THETA-  , ("&iota;",    "&#953;",  "&#x03B9;", "iota")           -- GREEK SMALL LETTER IOTA-  , ("&kappa;",   "&#954;",  "&#x03BA;", "kappa")          -- GREEK SMALL LETTER KAPPA-  , ("&lambda;",  "&#955;",  "&#x03BB;", "lambda")         -- GREEK SMALL LETTER LAMDA-  , ("&mu;",      "&#956;",  "&#x03BC;", "mu")             -- GREEK SMALL LETTER MU-  , ("&nu;",      "&#957;",  "&#x03BD;", "nu")             -- GREEK SMALL LETTER NU-  , ("&xi;",      "&#958;",  "&#x03BE;", "xi")             -- GREEK SMALL LETTER ZI-  , ("&omicron;", "&#959;",  "&#x03BF;", "omicron")        -- GREEK SMALL LETTER OMICRON-  , ("&pi;",      "&#960;",  "&#x03C0;", "pi")             -- GREEK SMALL LETTER PI-  , ("&rho;",     "&#961;",  "&#x03C1;", "rho")            -- GREEK SMALL LETTER RHO-  , ("&sigmaf;",  "&#962;",  "&#x03C2;", "sigma")          -- GREEK SMALL LETTER FINAL SIGMA-  , ("&sigma;",   "&#963;",  "&#x03C3;", "sigma")          -- GREEK SMALL LETTER SIGMA-  , ("&tau;",     "&#964;",  "&#x03C4;", "tau")            -- GREEK SMALL LETTER TAU-  , ("&upsilon;", "&#965;",  "&#x03C5;", "upsilon")        -- GREEK SMALL LETTER UPSILON-  , ("&phi;",     "&#966;",  "&#x03C6;", "phi")            -- GREEK SMALL LETTER PHI-  , ("&chi;",     "&#967;",  "&#x03C7;", "chi")            -- GREEK SMALL LETTER CHI-  , ("&psi;",     "&#968;",  "&#x03C8;", "psi")            -- GREEK SMALL LETTER PSI-  , ("&omega;",   "&#969;",  "&#x03C9;", "omega")          -- GREEK SMALL LETTER OMEGA-  , ("&ndash;",   "&#8211;", "&#x2013;", "-")              -- EN DASH-  , ("&mdash;",   "&#8212;", "&#x2014;", ".")              -- EM DAS-  , ("&lsquo;",   "&#8216;", "&#x2018;", "")               -- LEFT SINGLE QUOTATION MARK-  , ("&rsquo;",   "&#8217;", "&#x2019;", "")               -- RIGHT SINGLE QUOTATION MARK-  , ("&sbquo;",   "&#8218;", "&#x201A;", "")               -- SINGLE LOW-9 QUOTATION MAR-  , ("&ldquo;",   "&#8220;", "&#x201C;", "")               -- LEFT DOUBLE QUOTATION MARK-  , ("&rdquo;",   "&#8221;", "&#x201D;", "")               -- RIGHT DOUBLE QUOTATION MARK-  , ("&bdquo;",   "&#8222;", "&#x201E;", "")               -- DOUBLE LOW-9 QUOTATION MARK-  , ("&dagger;",  "&#8224;", "&#x2020;", "dagger")         -- DAGGER-  , ("&Dagger;",  "&#8225;", "&#x2021;", "dagger-dagger")  -- DOUBLE DAGGER-  , ("&bull;",    "&#8226;", "&#x2022;", "")               -- BULLET-  , ("&hellip;",  "&#8230;", "&#x2026;", "")               -- HORIZONTAL ELLIPSIS-  , ("&sup;",     "&#8323;", "&#x2283;", "")               -- SUPERSET OF-  ]+-- | Substitutions of HTML-escaped text (entities and symbols). --- | Substitutions of HTML symbols.-htmlSymbolSubst ∷ [(HTMLSymbolDec, HTMLSymbolHex, Text)]-htmlSymbolSubst =-  [ ("&#8208;", "&#x2010;", "-")  -- HYPHEN-  , ("&#8219;", "&#x201B;", "")   -- SINGLE HIGH-REVERSED-9 QUOTATION MARK-  , ("&#8223;", "&#x201F;", "")   -- DOUBLE HIGH-REVERSED-9 QUOTATION MARK-  , ("&#8989;", "&#x231D;", "")   -- TOP RIGHT CORNER+-- We use @noName@ when the HTML symbol has not an entity name.+htmlNameSubst ∷ [(Text, Text)]+htmlNameSubst =+  [ (noName,      "!")   -- U+0021 EXCLAMATION MARK+  , ("&quot;",    "\"")  -- U+0022 QUOTATION MARK+  , (noName,      "#")   -- U+0023 NUMBER SIGN+  , (noName,      "$")   -- U+0024 DOLLAR SIGN+  , (noName,      "%")   -- U+0025 PERCENT SIGN+  , ("&amp;",     "&")   -- U+0026 AMPERSAND+  , (noName,      "'")   -- U+0027 APOSTROPHE+  , (noName,      "(")   -- U+0028 LEFT PARENTHESIS+  , (noName,      ")")   -- U+0029 RIGHT PARENTHESIS+  , (noName,      "*")   -- U+002A ASTERISK+  , (noName,      "+")   -- U+002B PLUS SIGN+  , (noName,      ",")   -- U+002C COMMA+  -- We do not substitute U+002D HYPHEN-MINUS+  , (noName,      ".")   -- U+002E FULL STOP+  , (noName,      "/")   -- U+002F SOLIDUS+  , (noName,      ":")   -- U+003A COLON+  , (noName,      ";")   -- U+003B SEMICOLON+  , ("&lt;",      "<")   -- U+003C LESS-THAN SIGN+  , (noName,      "=")   -- U+003D EQUALS SIGN+  , ("&gt;",      ">")   -- U+003E GREATER-THAN SIGN+  , (noName,      "?")   -- U+003F QUESTION MARK+  , (noName,      "@")   -- U+0040 COMMERCIAL AT+  , ("&sup2;",    "²")   -- U+00B2 SUPERSCRIPT TWO+  , ("&sup3;",    "³")   -- U+00B3 SUPERSCRIPT THREE+  , ("&sup1;",    "¹")   -- U+00B9 SUPERSCRIPT ONE+  , ("&Agrave;",  "À")   -- U+00C0+  , ("&Aacute;",  "Á")   -- U+00C1+  , ("&Acirc;",   "Â")   -- U+00C2+  , ("&Atilde;",  "Ã")   -- U+00C3+  , ("&Auml;",    "Ä")   -- U+00C4+  , ("&Aring;",   "Å")   -- U+00C5+  , ("&AElig;",   "Æ")   -- U+00C6+  , ("&Ccedil;",  "Ç")   -- U+00C7+  , ("&Egrave;",  "È")   -- U+00C8+  , ("&Eacute;",  "É")   -- U+00C9+  , ("&Ecirc;",   "Ê")   -- U+00CA+  , ("&Euml;",    "Ë")   -- U+00CB+  , ("&Igrave;",  "Ì")   -- U+00CC+  , ("&Iacute;",  "Í")   -- U+00CD+  , ("&Icirc;",   "Î")   -- U+00CE+  , ("&Iuml;",    "Ï")   -- U+00CF+  , ("&ETH;",     "Ð")   -- U+00D0+  , ("&Ntilde;",  "Ñ")   -- U+00D1+  , ("&Ograve;",  "Ò")   -- U+00D2+  , ("&Oacute;",  "Ó")   -- U+00D3+  , ("&Ocirc;",   "Ô")   -- U+00D4+  , ("&Otilde;",  "Õ")   -- U+00D5+  , ("&Ouml;",    "Ö")   -- U+00D6+  , ("&times;",   "×")   -- U+00D7+  , ("&Oslash;",  "Ø")   -- U+00D8+  , ("&Ugrave;",  "Ù")   -- U+00D9+  , ("&Uacute;",  "Ú")   -- U+00DA+  , ("&Ucirc;",   "Û")   -- U+00DB+  , ("&Uuml;",    "Ü")   -- U+00DC+  , ("&Yacute;",  "Ý")   -- U+00DD+  , ("&THORN;",   "Þ")   -- U+00DE+  , ("&szlig;",   "ß")   -- U+00DF+  , ("&agrave;",  "à")   -- U+00E0+  , ("&aacute;",  "á")   -- U+00E1+  , ("&acirc;",   "â")   -- U+00E2+  , ("&atilde;",  "ã")   -- U+00E3+  , ("&auml;",    "ä")   -- U+00E4+  , ("&aring;",   "å")   -- U+00E5+  , ("&aelig;",   "æ")   -- U+00E6+  , ("&ccedil;",  "ç")   -- U+00E7+  , ("&egrave;",  "è")   -- U+00E8+  , ("&eacute;",  "é")   -- U+00E9+  , ("&ecirc;",   "ê")   -- U+00EA+  , ("&euml;",    "ë")   -- U+00EB+  , ("&igrave;",  "ì")   -- U+00EC+  , ("&iacute;",  "í")   -- U+00ED+  , ("&icirc;",   "î")   -- U+00EE+  , ("&iuml;",    "ï")   -- U+00EF+  , ("&eth;",     "ð")   -- U+00F0+  , ("&ntilde;",  "ñ")   -- U+00F1+  , ("&ograve;",  "ò")   -- U+00F2+  , ("&oacute;",  "ó")   -- U+00F3+  , ("&ocirc;",   "ô")   -- U+00F4+  , ("&otilde;",  "õ")   -- U+00F5+  , ("&ouml;",    "ö")   -- U+00F6+  , ("&divide;",  "÷")   -- U+00F7+  , ("&oslash;",  "ø")   -- U+00F8+  , ("&ugrave;",  "ù")   -- U+00F9+  , ("&uacute;",  "ú")   -- U+00FA+  , ("&ucirc;",   "û")   -- U+00FB+  , ("&uuml;",    "ü")   -- U+00FC+  , ("&yacute;",  "ý")   -- U+00FD+  , ("&thorn;",   "þ")   -- U+00FE+  , ("&yuml;",    "ÿ")   -- U+00FF+  , (noName,      "ĕ")   -- U+0115+  , ("&Imacr;",   "Ī")   -- U+012A+  , ("&imacr;",   "ī")   -- U+012B+  , (noName,      "ĭ")   -- U+012D+  , ("&Sacute;",  "Ś")   -- U+015A+  , ("&sacute;",  "ś")   -- U+015B+  , ("&Scedil;",  "Ş")   -- U+015E+  , ("&scedil;",  "ş")   -- U+015F+  , ("&Scaron;",  "Š")   -- U+0160+  , ("&scaron;",  "š")   -- U+0161+  , ("&ubreve;",  "ŭ")   -- U+016D+  , ("&Alpha;",   "Α")   -- U+0391+  , ("&Beta;",    "Β")   -- U+0392+  , ("&Gamma;",   "Γ")   -- U+0393+  , ("&Delta;",   "Δ")   -- U+0394+  , ("&Epsilon;", "Ε")   -- U+0395+  , ("&Zeta;",    "Ζ")   -- U+0396+  , ("&Eta;",     "Η")   -- U+0397+  , ("&Theta;",   "θ")   -- U+0398+  , ("&Iota;",    "Ι")   -- U+0399+  , ("&Kappa;",   "Κ")   -- U+03AA+  , ("&Lambda;",  "Λ")   -- U+03AB+  , ("&Mu;",      "Μ")   -- U+03AC+  , ("&Nu;",      "Ν")   -- U+03AD+  , ("&Xi;",      "Ξ")   -- U+03AE+  , ("&Omicron;", "Ο")   -- U+03AF+  , ("&Pi;",      "Π")   -- U+03A0+  , ("&Rho;",     "Ρ")   -- U+03A1+  -- The code U+03A2 is reserved.+  , ("&Sigma;",   "Σ")   -- U+03A3+  , ("&Tau;",     "Τ")   -- U+03A4+  , ("&Upsilon;", "Υ")   -- U+03A5+  , ("&Phi;",     "Φ")   -- U+03A6+  , ("&Chi;",     "Χ")   -- U+03A7+  , ("&Psi;",     "Ψ")   -- U+03A8+  , ("&Omega;",   "Ω")   -- U+03A9+  , ("&alpha;",   "α")   -- U+03B1+  , ("&beta;",    "β")   -- U+03B2+  , ("&gamma;",   "γ")   -- U+03B3+  , ("&delta;",   "δ")   -- U+03B4+  , ("&epsilon;", "ε")   -- U+03B5+  , ("&zeta;",    "ζ")   -- U+03B6+  , ("&eta;",     "η")   -- U+03B7+  , ("&theta;",   "θ")   -- U+03B8+  , ("&iota;",    "ι")   -- U+03B9+  , ("&kappa;",   "κ")   -- U+03BA+  , ("&lambda;",  "λ")   -- U+03BB+  , ("&mu;",      "μ")   -- U+03BC+  , ("&nu;",      "ν")   -- U+03BD+  , ("&xi;",      "ξ")   -- U+03BE+  , ("&omicron;", "ο")   -- U+03BF+  , ("&pi;",      "π")   -- U+03C0+  , ("&rho;",     "ρ")   -- U+03C1+  , ("&sigmaf;",  "ς")   -- U+03C2+  , ("&sigma;",   "σ")   -- U+03C3+  , ("&tau;",     "τ")   -- U+03C4+  , ("&upsilon;", "υ")   -- U+03C5+  , ("&phi;",     "φ")   -- U+03C6+  , ("&chi;",     "χ")   -- U+03C7+  , ("&psi;",     "ψ")   -- U+03C8+  , ("&omega;",   "ω")   -- U+03C9+  , (noName,      "‐")   -- U+2010+  , ("&ndash;",   "–")   -- U+2013+  , ("&mdash;",   "—")   -- U+2014+  , ("&lsquo;",   "‘")   -- U+2018+  , ("&rsquo;",   "’")   -- U+2019+  , ("&sbquo;",   "‚")   -- U+201A+  , (noName,      "‛")   -- U+201B+  , ("&ldquo;",   "“")   -- U+201C+  , ("&rdquo;",   "”")   -- U+201D+  , ("&bdquo;",   "„")   -- U+201E+  , (noName,      "‟")   -- U+201F+  , ("&dagger;",  "†")   -- U+2020+  , ("&Dagger;",  "‡")   -- U+2021+  , ("&bull;",    "•")   -- U+2022+  , ("&hellip;",  "…")   -- U+2026+  , ("&forall;",  "∀")   -- U+2200+  , ("&exist;",   "∃")   -- U+2203+  , ("&sup;",     "⊃")   -- U+2283+  , (noName,      "⌝")   -- U+231D   ]  ------------------------------------------------------------------------------@@ -155,7 +254,8 @@   , ("*",           "")         -- U+002A ASTERISK   , ("+",           "")         -- U+002B PLUS SIGN   , (",",           "")         -- U+002C COMMA-  , (".",           "")         -- U+002D FULL STOP+  -- We do not substitute U+002D HYPHEN-MINUS+  , (".",           "")         -- U+002E FULL STOP   , ("/",           "")         -- U+002F SOLIDUS   , (":",           "")         -- U+003A COLON   , (";",           "")         -- U+003B SEMICOLON@@ -191,10 +291,13 @@   , ("É",           "E")        -- U+00C9 LATIN CAPITAL LETTER E WITH ACUTE   , ("Ê",           "E")        -- U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX   , ("Ë",           "E")        -- U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS+  , ("Ì",           "I")        -- U+00CC LATIN CAPITAL LETTER I WITH GRAVE   , ("Í",           "I")        -- U+00CD LATIN CAPITAL LETTER I WITH ACUTE   , ("Î",           "I")        -- U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX   , ("Ï",           "I")        -- U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS+  , ("Ð",           "ETH")      -- U+00D0 LATIN CAPITAL LETTER ETH   , ("Ñ",           "N")        -- U+00D1 LATIN CAPITAL LETTER N WITH TILDE+  , ("Ò",           "O")        -- U+00D2 LATIN CAPITAL LETTER O WITH GRAVE   , ("Ó",           "O")        -- U+00D3 LATIN CAPITAL LETTER O WITH ACUTE   , ("Ô",           "O")        -- U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX   , ("Õ",           "O")        -- U+00D5 LATIN CAPITAL LETTER O WITH TILDE@@ -206,6 +309,7 @@   , ("Û",           "U")        -- U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX   , ("Ü",           "U")        -- U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS   , ("Ý",           "Y")        -- U+00DD LATIN CAPITAL LETTER Y WITH ACUTE+  , ("Þ",           "THORN")    -- U+00DE LATIN CAPITAL LETTER THORN   , ("ß",           "ss")       -- U+00DF LATIN SMALL LETTER SHARP S   , ("à",           "a")        -- U+00E0 LATIN SMALL LETTER A WITH GRAVE   , ("á",           "a")        -- U+00E1 LATIN SMALL LETTER A WITH ACUTE@@ -219,22 +323,25 @@   , ("é",           "e")        -- U+00E9 LATIN SMALL LETTER E WITH ACUTE   , ("ê",           "e")        -- U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX   , ("ë",           "e")        -- U+00EB LATIN SMALL LETTER E WITH DIAERESIS+  , ("ì",           "i")        -- U+00EC LATIN SMALL LETTER I WITH GRAVE   , ("í",           "i")        -- U+00ED LATIN SMALL LETTER I WITH ACUTE   , ("î",           "i")        -- U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX   , ("ï",           "i")        -- U+00EF LATIN SMALL LETTER I WITH DIAERESIS+  , ("ð",           "eth")      -- U+00F0 LATIN SMALL LETTER ETH   , ("ñ",           "n")        -- U+00F1 LATIN SMALL LETTER N WITH TILDE   , ("ò",           "o")        -- U+00F2 LATIN SMALL LETTER O WITH GRAVE   , ("ó",           "o")        -- U+00F3 LATIN SMALL LETTER O WITH ACUTE   , ("ô",           "o")        -- U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX   , ("õ",           "o")        -- U+00F5 LATIN SMALL LETTER O WITH TILDE   , ("ö",           "o")        -- U+00F6 LATIN SMALL LETTER O WITH DIAERESIS+  , ("÷",           "")         -- U+00F7 DIVISION SIGN   , ("ø",           "o")        -- U+00F8 LATIN SMALL LETTER O WITH STROKE   , ("ù",           "u")        -- U+00F9 LATIN SMALL LETTER U WITH GRAVE   , ("ú",           "u")        -- U+00FA LATIN SMALL LETTER U WITH ACUTE   , ("û",           "u")        -- U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX   , ("ü",           "u")        -- U+00FC LATIN SMALL LETTER U WITH DIAERESIS   , ("ý",           "y")        -- U+00FD LATIN SMALL LETTER Y WITH ACUTE-  , ("þ",           "t")        -- U+00FE LATIN SMALL LETTER THORN+  , ("þ",           "thorn")    -- U+00FE LATIN SMALL LETTER THORN   , ("ÿ",           "y")        -- U+00FF LATIN SMALL LETTER Y WITH DIAERESIS   , ("Ā",           "A")        -- U+0100 LATIN CAPITAL LETTER A WITH MACRON   , ("ā",           "a")        -- U+0101 LATIN SMALL LETTER A WITH MACRON@@ -250,6 +357,7 @@   , ("ď",           "d")        -- U+010F LATIN SMALL LETTER D WITH CARON   , ("Ē",           "E")        -- U+0112 LATIN CAPITAL LETTER E WITH MACRON   , ("ē",           "e")        -- U+0113 LATIN SMALL LETTER E WITH MACRON+  , ("ĕ",           "e")        -- U+0115 LATIN SMALL LETTER E WITH BREVE   , ("Ę",           "e")        -- U+0118 LATIN CAPITAL LETTER E WITH OGONEK   , ("ę",           "e")        -- U+0119 LATIN SMALL LETTER E WITH OGONEK   , ("Ě",           "E")        -- U+011A LATIN CAPITAL LETTER E WITH CARON@@ -260,6 +368,7 @@   , ("ģ",           "g")        -- U+0123 LATIN SMALL LETTER G WITH CEDILLA   , ("Ī",           "I")        -- U+012A LATIN CAPITAL LETTER I WITH MACRON   , ("ī",           "I")        -- U+012B LATIN SMALL LETTER I WITH MACRON+  , ("ĭ",           "i")        -- U+012D LATIN SMALL LETTER I WITH BREVE   , ("İ",           "I")        -- U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE   , ("Ķ",           "K")        -- U+0136 LATIN CAPITAL LETTER K WITH CEDILLA   , ("ķ",           "k")        -- U+0137 LATIN SMALL LETTER K WITH CEDILLA@@ -288,6 +397,7 @@   , ("Ť",           "T")        -- U+0164 LATIN CAPITAL LETTER T WITH CARON   , ("ť",           "t")        -- U+0165 LATIN SMALL LETTER T WITH CARON   , ("Ū",           "U")        -- U+016A LATIN CAPITAL LETTER U WITH MACRON+  , ("ŭ",           "u")        -- U+016D LATIN SMALL LETTER U WITH BREVE   , ("ū",           "u")        -- U+016B LATIN SMALL LETTER U WITH MACRON   , ("Ů",           "U")        -- U+016E LATIN CAPITAL LETTER U WITH RING ABOVE   , ("ů",           "u")        -- U+016F LATIN SMALL LETTER U WITH RING ABOVE@@ -306,6 +416,30 @@   , ("Ț",           "T")        -- U+021A LATIN CAPITAL LETTER T WITH COMMA BELOW   , ("ț",           "t")        -- U+021B LATIN SMALL LETTER T WITH COMMA BELOW   , ("ə",           "a")        -- U+0259 LATIN SMALL LETTER SCHWA+  , ("Α",           "Alpha")    -- U+0391 GREEK CAPITAL LETTER ALPHA+  , ("Β",           "Beta")     -- U+0392 GREEK CAPITAL LETTER BETA+  , ("Γ",           "Gamma")    -- U+0393 GREEK CAPITAL LETTER GAMMA+  , ("Δ",           "Delta")    -- U+0394 GREEK CAPITAL LETTER DELTA+  , ("Ε",           "Epsilon")  -- U+0395 GREEK CAPITAL LETTER EPSILON+  , ("Ζ",           "Zeta")     -- U+0396 GREEK CAPITAL LETTER ZETA+  , ("Η",           "Eta")      -- U+0397 GREEK CAPITAL LETTER ETA+  , ("Θ",           "Theta")    -- U+0398 GREEK CAPITAL LETTER THETA+  , ("Ι",           "Iota")     -- U+0399 GREEK CAPITAL LETTER IOTA+  , ("Κ",           "Kappa")    -- U+039A GREEK CAPITAL LETTER KAPPA+  , ("Λ",           "Lambda")   -- U+039B GREEK CAPITAL LETTER LAMDA+  , ("Μ",           "Mu")       -- U+039C GREEK CAPITAL LETTER MU+  , ("Ν",           "Nu")       -- U+039D GREEK CAPITAL LETTER NU+  , ("Ξ",           "Xi")       -- U+039E GREEK CAPITAL LETTER ZI+  , ("Ο",           "Omicron")  -- U+039F GREEK CAPITAL LETTER OMICRON+  , ("Π",           "Pi")       -- U+03A0 GREEK CAPITAL LETTER PI+  , ("Ρ",           "Rho")      -- U+03A1 GREEK CAPITAL LETTER RHO+  -- The code U+03A2 is reserved.+  , ("Σ",           "Sigma")    -- U+03A3 GREEK CAPITAL LETTER SIGMA+  , ("Τ",           "Tau")      -- U+03A4 GREEK CAPITAL LETTER TAU+  , ("Υ",           "Upsilon")  -- U+03A5 GREEK CAPITAL LETTER UPSILON+  , ("Φ",           "Phi")      -- U+03A6 GREEK CAPITAL LETTER PHI+  , ("χ",           "Chi")      -- U+03A7 GREEK CAPITAL LETTER CHI+  , ("Ψ",           "Psi")      -- U+03A8 GREEK CAPITAL LETTER PSI   , ("Ω",           "Omega")    -- U+03A9 GREEK CAPITAL LETTER OMEGA   , ("α",           "alpha")    -- U+03B1 GREEK SMALL LETTER ALPHA   , ("β",           "beta")     -- U+03B2 GREEK SMALL LETTER BETA@@ -333,7 +467,8 @@   , ("ψ",           "psi")      -- U+03C8 GREEK SMALL LETTER PSI   , ("ω",           "omega")    -- U+03C9 GREEK SMALL LETTER OMEGA   , ("ẞ",           "SS")       -- U+1E9E LATIN CAPITAL LETTER SHARP S-  , ("‐",           "-")        -- U+2210 HYPHEN+  , (" ",           "-")        -- U+2009 THIN SPACE+  , ("‐",           "-")        -- U+2010 HYPHEN   , ("–",           "-")        -- U+2013 EN DASH   , ("—",           "-")        -- U+2014 EM DASH   , ("‘",           "")         -- U+2018 LEFT SINGLE QUOTATION MARK@@ -348,9 +483,30 @@   , ("‡",           "")         -- U+2021 DOUBLE DAGGER   , ("•",           "")         -- U+2022 BULLET   , ("…",           "")         -- U+2026 HORIZONTAL ELLIPSIS+  , ("⁰",           "0")        -- U+2070 SUPERSCRIPT ZERO+  , ("ⁱ",           "i")        -- U+2071 SUPERSCRIPT LATIN SMALL LETTER I+  -- The codes U+2072 and U+2073 are reserved.+  , ("⁴",           "4")        -- U+2074 SUPERSCRIPT FOUR+  , ("⁵",           "5")        -- U+2075 SUPERSCRIPT FIVE+  , ("⁶",           "6")        -- U+2076 SUPERSCRIPT SIX+  , ("⁷",           "7")        -- U+2077 SUPERSCRIPT SEVEN+  , ("⁸",           "8")        -- U+2078 SUPERSCRIPT EIGHT+  , ("⁹",           "9")        -- U+2079 SUPERSCRIPT NINE+  , ("₀",           "0")        -- U+2080 SUBSCRIPT ZERO+  , ("₁",           "1")        -- U+2081 SUBSCRIPT ONE+  , ("₂",           "2")        -- U+2082 SUBSCRIPT TWO+  , ("₃",           "3")        -- U+2083 SUBSCRIPT THREE+  , ("₄",           "4")        -- U+2074 SUBSCRIPT FOUR+  , ("₅",           "5")        -- U+2075 SUBSCRIPT FIVE+  , ("₆",           "6")        -- U+2076 SUBSCRIPT SIX+  , ("₇",           "7")        -- U+2077 SUBSCRIPT SEVEN+  , ("₈",           "8")        -- U+2078 SUBSCRIPT EIGHT+  , ("₉",           "9")        -- U+2079 SUBSCRIPT NINE   , ("™",           "")         -- U+2122 TRADE MARK SIGN   , ("ℵ",           "aleph")    -- U+2135 ALEF SYMBOL   , ("ℶ",           "beth")     -- U+2136 BET SYMBOL+  , ("∀",           "for-all")  -- U+2200 FOR ALL+  , ("∃",           "exists")   -- U+2203 THERE EXISTS   , ("⊃",           "")         -- U+2283 SUPERSET OF   , ("⌝",           "")         -- U+231D TOP RIGHT CORNER   , ("�",          "")         -- U+FFFD REPLACEMENT CHARACTER@@ -366,42 +522,6 @@   , (" and", ",")   ] --- | Title substitutions.---- These substitutions should be done before the substitutions of the--- HTML entities and converting to lower case.-titleSubst ∷ [(Text,Text)]-titleSubst =-  [ ("<Emphasis Type=\"BoldItalic\">P </Emphasis>",       "P")-  , ("<Emphasis Type=\"Italic\">0 </Emphasis>",           "0")-  , ("<Emphasis Type=\"Italic\">C</Emphasis>",            "C")-  , ("<Emphasis Type=\"Italic\">CC</Emphasis>",           "CC")-  , ("<Emphasis Type=\"Italic\">I </Emphasis>",           "I")-  , ("<Emphasis Type=\"Italic\">J</Emphasis>",            "J")-  , ("<Emphasis Type=\"Italic\">Modus ponens</Emphasis>", "Modus ponens")-  , ("<Emphasis Type=\"Italic\">P </Emphasis>",           "P")-  , ("<Emphasis Type=\"Italic\">really </Emphasis>",      "really")-  , ("<Emphasis Type=\"Italic\">S-P</Emphasis>",          "S-P")-  , ("<Subscript>3</Subscript>",                          "3")-  -- The whitespace around `+` is not the standard one.-  -- TODO (2017-07-04): Added test case.-  , ("<Superscript> + </Superscript>",                    "plus")-  , ("<Subscript>&#x03C9;</Subscript>",                   "omega")-  , ("<TEX>$\\alpha$</TEX>",                              "alpha")-  , ("<TEX>$\\beta$</TEX>",                               "beta")-  , ("<TEX>$\\gamma$</TEX>",                              "gamma")-  , ("<TEX>$\\epsilon$</TEX>",                            "epsilon")-  , ("<TEX>$\\eta$</TEX>",                                "eta")-  , ("<TEX>$\\lambda$</TEX>",                             "lambda")-  , ("<TEX>$\\pi$</TEX>",                                 "pi")-  , ("<TEX>$\\omega$</TEX>",                              "omega")-  , ("<TEX>{\\sc Coq}</TEX>",                             "Coq")-  , ("<TEX>{\\sf Haskell}</TEX>:",                        "Haskell")-  , ("<TEX>{\\sc QuickSpec}</TEX>:",                      "QuickSpec")-  , ("<TEX>{\\sc QuodLibet}</TEX>!",                      "QuodLibet")-  , ("<TEX>{\\sc Vampire}</TEX>",                         "Vampire")-  ]- ------------------------------------------------------------------------------ -- Weird substitutions. @@ -417,8 +537,25 @@   -- We erase `ö` because it follows an `o` in the examples we know.   , ("ö",      "")     -- U+00C3 and U+00B6 (LATIN SMALL LETTER O WITH DIAERESIS)   , ("Å›",      "s")    -- U+00C5 and U+203A (LATIN CAPITAL LETTER S WITH ACUTE)-  -- TODO (2017-07-20): Five hex numbers-  , ("&#x02010;", "-")  -- U+2010 HYPHEN   -- TODO (2017-07-17): Missing `;`.   , ("&#8217",  "")     -- U+2019 RIGHT SINGLE QUOTATION MARK+  ]++------------------------------------------------------------------------------+-- Title pre-processing++titleErase ∷ [Text]+titleErase =+  [ "<Emphasis Type=\"BoldItalic\">"  -- opening+  , "<Emphasis Type=\"Italic\">"      -- opening+  , "</Emphasis>"                     -- closing+  , "<Subscript>"                     -- opening+  , "</Subscript>"                    -- closing+  , "<Superscript>"                   -- opening+  , "</Superscript>"                  -- closing+  , "<TEX>$\\"                        -- opening+  , "$</TEX>"                         -- closing+  , "<TEX>{\\sc "                     -- opening+  , "<TEX>{\\sf "                     -- opening+  , "}</TEX>"                         -- closing   ]