aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pandoc.cabal1
-rw-r--r--src/Text/Pandoc/GroffChar.hs418
-rw-r--r--src/Text/Pandoc/Writers/Groff.hs22
3 files changed, 421 insertions, 20 deletions
diff --git a/pandoc.cabal b/pandoc.cabal
index ca2a7b275..96863f73d 100644
--- a/pandoc.cabal
+++ b/pandoc.cabal
@@ -545,6 +545,7 @@ library
Text.Pandoc.Lua.Util,
Text.Pandoc.CSS,
Text.Pandoc.CSV,
+ Text.Pandoc.GroffChar,
Text.Pandoc.UUID,
Text.Pandoc.Translations,
Text.Pandoc.Slides,
diff --git a/src/Text/Pandoc/GroffChar.hs b/src/Text/Pandoc/GroffChar.hs
new file mode 100644
index 000000000..669b2b4a0
--- /dev/null
+++ b/src/Text/Pandoc/GroffChar.hs
@@ -0,0 +1,418 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-
+Copyright (C) 2018 John MacFarlane <jgm@berkeley.edu>
+
+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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+-}
+
+{- |
+ Module : Text.Pandoc.GroffChar
+ Copyright : Copyright (C) 2007-2018 John MacFarlane
+ License : GNU GPL, version 2 or above
+
+ Maintainer : John MacFarlane <jgm@berkeley.edu>
+ Stability : alpha
+ Portability : portable
+
+Groff character escaping/unescaping.
+-}
+
+module Text.Pandoc.GroffChar (
+ essentialEscapes
+ , characterCodes
+ , combiningAccents
+ ) where
+import Prelude
+import qualified Data.Map as Map
+
+essentialEscapes :: Map.Map Char String
+essentialEscapes = Map.fromList
+ [ ('\160', "\\~")
+ , ('\'', "\\[aq]")
+ , ('`', "\\[ga]")
+ , ('"', "\\[dq]")
+ , ('~', "\\[ti]")
+ , ('^', "\\[ha]")
+ , ('@', "\\[at]")
+ , ('\\', "\\[rs]")
+ , ('\x2026', "\\&...") -- because u2026 doesn't render on tty
+ , ('\x2212', "\\-") -- minus
+ ]
+
+characterCodes :: [(Char, String)]
+characterCodes =
+ [ ('Ð', "-D")
+ , ('ð', "Sd")
+ , ('Þ', "TP")
+ , ('þ', "Tp")
+ , ('ß', "ss")
+ , ('ff', "ff")
+ , ('fi', "fi")
+ , ('fl', "fl")
+ , ('ffi', "Fi")
+ , ('ffl', "Fl")
+ , ('Ł', "/L")
+ , ('ł', "/l")
+ , ('Ø', "/O")
+ , ('ø', "/o")
+ , ('Æ', "AE")
+ , ('æ', "ae")
+ , ('Œ', "OE")
+ , ('œ', "oe")
+ , ('IJ', "IJ")
+ , ('ij', "ij")
+ , ('ı', ".i")
+ , ('ȷ', ".j")
+ , ('Á', "'A")
+ , ('Ć', "'C")
+ , ('É', "'E")
+ , ('Í', "'I")
+ , ('Ó', "'O")
+ , ('Ú', "'U")
+ , ('Ý', "'Y")
+ , ('á', "'a")
+ , ('ć', "'c")
+ , ('é', "'e")
+ , ('í', "'i")
+ , ('ó', "'o")
+ , ('ú', "'u")
+ , ('ý', "'y")
+ , ('Ä', ":A")
+ , ('Ë', ":E")
+ , ('Ï', ":I")
+ , ('Ö', ":O")
+ , ('Ü', ":U")
+ , ('Ÿ', ":Y")
+ , ('ä', ":a")
+ , ('ë', ":e")
+ , ('ï', ":i")
+ , ('ö', ":o")
+ , ('ü', ":u")
+ , ('ÿ', ":y")
+ , ('Â', "^A")
+ , ('Ê', "^E")
+ , ('Î', "^I")
+ , ('Ô', "^O")
+ , ('Û', "^U")
+ , ('â', "^a")
+ , ('ê', "^e")
+ , ('î', "^i")
+ , ('ô', "^o")
+ , ('û', "^u")
+ , ('À', "`A")
+ , ('È', "`E")
+ , ('Ì', "`I")
+ , ('Ò', "`O")
+ , ('Ù', "`U")
+ , ('à', "`a")
+ , ('è', "`e")
+ , ('ì', "`i")
+ , ('ò', "`o")
+ , ('ù', "`u")
+ , ('Ã', "~A")
+ , ('Ñ', "~N")
+ , ('Õ', "~O")
+ , ('ã', "~a")
+ , ('ñ', "~n")
+ , ('õ', "~o")
+ , ('Š', "vS")
+ , ('š', "vs")
+ , ('Ž', "vZ")
+ , ('ž', "vz")
+ , ('Ç', ",C")
+ , ('ç', ",c")
+ , ('Å', "oA")
+ , ('å', "oa")
+ , ('˝', "a\"")
+ , ('¯', "a-")
+ , ('˙', "a.")
+ , ('^', "a^")
+ , ('´', "aa")
+ , ('`', "ga")
+ , ('˘', "ab")
+ , ('¸', "ac")
+ , ('¨', "ad")
+ , ('ˇ', "ah")
+ , ('˚', "ao")
+ , ('~', "a~")
+ , ('˛', "ho")
+ , ('^', "ha")
+ , ('~', "ti")
+ , ('„', "Bq")
+ , ('‚', "bq")
+ , ('“', "lq")
+ , ('”', "rq")
+ , ('‘', "oq")
+ , ('’', "cq")
+ , ('\'', "aq")
+ , ('"', "dq")
+ , ('«', "Fo")
+ , ('»', "Fc")
+ , ('‹', "fo")
+ , ('›', "fc")
+ , ('¡', "r!")
+ , ('¿', "r?")
+ , ('—', "em")
+ , ('–', "en")
+ , ('‐', "hy")
+ , ('[', "lB")
+ , (']', "rB")
+ , ('{', "lC")
+ , ('}', "rC")
+ , ('⟨', "la")
+ , ('⟩', "ra")
+ , ('⎪', "bv")
+ , ('⎪', "braceex")
+ , ('⎡', "bracketlefttp")
+ , ('⎣', "bracketleftbt")
+ , ('⎢', "bracketleftex")
+ , ('⎤', "bracketrighttp")
+ , ('⎦', "bracketrightbt")
+ , ('⎥', "bracketrightex")
+ , ('╭', "lt")
+ , ('⎧', "bracelefttp")
+ , ('┥', "lk")
+ , ('⎨', "braceleftmid")
+ , ('╰', "lb")
+ , ('⎩', "braceleftbt")
+ , ('⎪', "braceleftex")
+ , ('╮', "rt")
+ , ('⎫', "bracerighttp")
+ , ('┝', "rk")
+ , ('⎬', "bracerightmid")
+ , ('╯', "rb")
+ , ('⎭', "bracerightbt")
+ , ('⎪', "bracerightex")
+ , ('⎛', "parenlefttp")
+ , ('⎝', "parenleftbt")
+ , ('⎜', "parenleftex")
+ , ('⎞', "parenrighttp")
+ , ('⎠', "parenrightbt")
+ , ('⎟', "parenrightex")
+ , ('←', "<-")
+ , ('→', "->")
+ , ('↔', "<>")
+ , ('↓', "da")
+ , ('↑', "ua")
+ , ('↕', "va")
+ , ('⇐', "lA")
+ , ('⇒', "rA")
+ , ('⇔', "hA")
+ , ('⇓', "dA")
+ , ('⇑', "uA")
+ , ('⇕', "vA")
+ , ('⎯', "an")
+ , ('|', "ba")
+ , ('│', "br")
+ , ('_', "ul")
+ , ('‾', "rn")
+ , ('_', "ru")
+ , ('¦', "bb")
+ , ('/', "sl")
+ , ('\\', "rs")
+ , ('○', "ci")
+ , ('·', "bu")
+ , ('‡', "dd")
+ , ('†', "dg")
+ , ('◊', "lz")
+ , ('□', "sq")
+ , ('¶', "ps")
+ , ('§', "sc")
+ , ('☜', "lh")
+ , ('☞', "rh")
+ , ('@', "at")
+ , ('#', "sh")
+ , ('↵', "CR")
+ , ('✓', "OK")
+ , ('©', "co")
+ , ('®', "rg")
+ , ('™', "tm")
+ , ('$', "Do")
+ , ('¢', "ct")
+ , ('€', "eu")
+ , ('€', "Eu")
+ , ('¥', "Ye")
+ , ('£', "Po")
+ , ('¤', "Cs")
+ , ('ƒ', "Fn")
+ , ('°', "de")
+ , ('‰', "%0")
+ , ('′', "fm")
+ , ('″', "sd")
+ , ('µ', "mc")
+ , ('ª', "Of")
+ , ('º', "Om")
+ , ('∧', "AN")
+ , ('∨', "OR")
+ , ('¬', "no")
+ , ('¬', "tno")
+ , ('∃', "te")
+ , ('∀', "fa")
+ , ('∋', "st")
+ , ('∴', "3d")
+ , ('∴', "tf")
+ , ('|', "or")
+ , ('½', "12")
+ , ('¼', "14")
+ , ('¾', "34")
+ , ('⅛', "18")
+ , ('⅜', "38")
+ , ('⅝', "58")
+ , ('⅞', "78")
+ , ('¹', "S1")
+ , ('²', "S2")
+ , ('³', "S3")
+ , ('+', "pl")
+ , ('−', "mi")
+ , ('∓', "-+")
+ , ('±', "+-")
+ , ('±', "t+-")
+ , ('·', "pc")
+ , ('⋅', "md")
+ , ('×', "mu")
+ , ('×', "tmu")
+ , ('⊗', "c*")
+ , ('⊕', "c+")
+ , ('÷', "di")
+ , ('÷', "tdi")
+ , ('⁄', "f/")
+ , ('∗', "**")
+ , ('≤', "<=")
+ , ('≥', ">=")
+ , ('≪', "<<")
+ , ('≫', ">>")
+ , ('=', "eq")
+ , ('≠', "!=")
+ , ('≡', "==")
+ , ('≢', "ne")
+ , ('≅', "=~")
+ , ('≃', "|=")
+ , ('∼', "ap")
+ , ('≈', "~~")
+ , ('≈', "~=")
+ , ('∝', "pt")
+ , ('∅', "es")
+ , ('∈', "mo")
+ , ('∉', "nm")
+ , ('⊂', "sb")
+ , ('⊄', "nb")
+ , ('⊃', "sp")
+ , ('⊅', "nc")
+ , ('⊆', "ib")
+ , ('⊇', "ip")
+ , ('∩', "ca")
+ , ('∪', "cu")
+ , ('∠', "/_")
+ , ('⊥', "pp")
+ , ('∫', "is")
+ , ('∫', "integral")
+ , ('∑', "sum")
+ , ('∏', "product")
+ , ('∐', "coproduct")
+ , ('∇', "gr")
+ , ('√', "sr")
+ , ('√', "sqrt")
+ -- , "radicalex"
+ -- "sqrtex"
+ , ('⌈', "lc")
+ , ('⌉', "rc")
+ , ('⌊', "lf")
+ , ('⌋', "rf")
+ , ('∞', "if")
+ , ('ℵ', "Ah")
+ , ('ℑ', "Im")
+ , ('ℜ', "Re")
+ , ('℘', "wp")
+ , ('∂', "pd")
+ , ('ℏ', "-h")
+ , ('ℏ', "hbar")
+ , ('Α', "*A")
+ , ('Β', "*B")
+ , ('Γ', "*G")
+ , ('Δ', "*D")
+ , ('Ε', "*E")
+ , ('Ζ', "*Z")
+ , ('Η', "*Y")
+ , ('Θ', "*H")
+ , ('Ι', "*I")
+ , ('Κ', "*K")
+ , ('Λ', "*L")
+ , ('Μ', "*M")
+ , ('Ν', "*N")
+ , ('Ξ', "*C")
+ , ('Ο', "*O")
+ , ('Π', "*P")
+ , ('Ρ', "*R")
+ , ('Σ', "*S")
+ , ('Τ', "*T")
+ , ('Υ', "*U")
+ , ('Φ', "*F")
+ , ('Χ', "*X")
+ , ('Ψ', "*Q")
+ , ('Ω', "*W")
+ , ('α', "*a")
+ , ('β', "*b")
+ , ('γ', "*g")
+ , ('δ', "*d")
+ , ('ε', "*e")
+ , ('ζ', "*z")
+ , ('η', "*y")
+ , ('θ', "*h")
+ , ('ι', "*i")
+ , ('κ', "*k")
+ , ('λ', "*l")
+ , ('μ', "*m")
+ , ('ν', "*n")
+ , ('ξ', "*c")
+ , ('ο', "*o")
+ , ('π', "*p")
+ , ('ρ', "*r")
+ , ('ς', "ts")
+ , ('σ', "*s")
+ , ('τ', "*t")
+ , ('υ', "*u")
+ , ('ϕ', "*f")
+ , ('χ', "*x")
+ , ('ψ', "*q")
+ , ('ω', "*w")
+ , ('ϑ', "+h")
+ , ('φ', "+f")
+ , ('ϖ', "+p")
+ , ('ϵ', "+e")
+ , ('♣', "CL")
+ , ('♠', "SP")
+ , ('♥', "HE")
+ , ('♦', "DI")
+ ]
+
+-- use like: \\[E a^ aa]
+combiningAccents :: [(Char, String)]
+combiningAccents =
+ [ ('˝' , "\\[a\"]")
+ , ('¯', "\\[a-]")
+ , ('˙', "\\[a.]")
+ , ('^', "\\[a^]")
+ , ('´', "\\[aa]")
+ , ('`', "\\[ga]")
+ , ('˘', "\\[ab]")
+ , ('¸', "\\[ac]")
+ , ('¨', "\\[ad]")
+ , ('ˇ', "\\[ah]")
+ , ('˚', "\\[ao]")
+ , ('~', "\\[a~]")
+ , ('˛', "\\[ho]")
+ , ('^', "\\[ha]")
+ , ('~', "\\[ti]")
+ ]
diff --git a/src/Text/Pandoc/Writers/Groff.hs b/src/Text/Pandoc/Writers/Groff.hs
index cb7252726..3f90a1490 100644
--- a/src/Text/Pandoc/Writers/Groff.hs
+++ b/src/Text/Pandoc/Writers/Groff.hs
@@ -51,6 +51,7 @@ import Text.Pandoc.Class (PandocMonad)
import Text.Pandoc.Definition
import Text.Pandoc.Pretty
import Text.Printf (printf)
+import Text.Pandoc.GroffChar (essentialEscapes)
data WriterState = WriterState { stHasInlineMath :: Bool
, stFirstPara :: Bool
@@ -81,28 +82,9 @@ type Note = [Block]
type MS = StateT WriterState
--- | Association list of characters to escape.
-groffEscapes :: Map.Map Char String
-groffEscapes = Map.fromList
- [ ('\160', "\\~")
- , ('\'', "\\[aq]")
- , ('`', "\\`")
- , ('"', "\\[dq]")
- , ('\x201C', "\\[lq]")
- , ('\x201D', "\\[rq]")
- , ('\x2018', "\\[oq]")
- , ('\x2019', "\\[cq]")
- , ('\x2014', "\\[em]")
- , ('\x2013', "\\[en]")
- , ('\x2026', "\\&...")
- , ('~', "\\[ti]")
- , ('^', "\\[ha]")
- , ('@', "\\[at]")
- , ('\\', "\\\\")
- ]
escapeChar :: Char -> String
-escapeChar c = fromMaybe [c] (Map.lookup c groffEscapes)
+escapeChar c = fromMaybe [c] (Map.lookup c essentialEscapes)
-- | Escape special characters for groff.
escapeString :: String -> String