git.iko.soy/typeable/pandoc
on master help sign in
Add Text.Pandoc.GroffChar.

This will hold common escaping data for groff characters.

commitbbd94eae2b3f5273bb681ff6706f0cd375d8a1ef authorJohn MacFarlane <jgm@berkeley.edu> dateThu 18 Oct 2018, 09:39 (8 years ago) parent24f388e
3 files changed+421−20
pandoc.cabal+1 src/Text/Pandoc/GroffChar.hs+418 src/Text/Pandoc/Writers/Groff.hs+2−20
pandoc.cabal+1
@@ -545,6 +545,7 @@ library
545545 Text.Pandoc.Lua.Util,
546546 Text.Pandoc.CSS,
547547 Text.Pandoc.CSV,
548+ Text.Pandoc.GroffChar,
548549 Text.Pandoc.UUID,
549550 Text.Pandoc.Translations,
550551 Text.Pandoc.Slides,
src/Text/Pandoc/GroffChar.hsnew file+418
@@ -0,0 +1,418 @@
1+{-# LANGUAGE NoImplicitPrelude #-}
2+{-
3+Copyright (C) 2018 John MacFarlane <jgm@berkeley.edu>
4+
5+This program is free software; you can redistribute it and/or modify
6+it under the terms of the GNU General Public License as published by
7+the Free Software Foundation; either version 2 of the License, or
8+(at your option) any later version.
9+
10+This program is distributed in the hope that it will be useful,
11+but WITHOUT ANY WARRANTY; without even the implied warranty of
12+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+GNU General Public License for more details.
14+
15+You should have received a copy of the GNU General Public License
16+along with this program; if not, write to the Free Software
17+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18+-}
19+
20+{- |
21+ Module : Text.Pandoc.GroffChar
22+ Copyright : Copyright (C) 2007-2018 John MacFarlane
23+ License : GNU GPL, version 2 or above
24+
25+ Maintainer : John MacFarlane <jgm@berkeley.edu>
26+ Stability : alpha
27+ Portability : portable
28+
29+Groff character escaping/unescaping.
30+-}
31+
32+module Text.Pandoc.GroffChar (
33+ essentialEscapes
34+ , characterCodes
35+ , combiningAccents
36+ ) where
37+import Prelude
38+import qualified Data.Map as Map
39+
40+essentialEscapes :: Map.Map Char String
41+essentialEscapes = Map.fromList
42+ [ ('\160', "\\~")
43+ , ('\'', "\\[aq]")
44+ , ('`', "\\[ga]")
45+ , ('"', "\\[dq]")
46+ , ('~', "\\[ti]")
47+ , ('^', "\\[ha]")
48+ , ('@', "\\[at]")
49+ , ('\\', "\\[rs]")
50+ , ('\x2026', "\\&...") -- because u2026 doesn't render on tty
51+ , ('\x2212', "\\-") -- minus
52+ ]
53+
54+characterCodes :: [(Char, String)]
55+characterCodes =
56+ [ ('Ð', "-D")
57+ , ('ð', "Sd")
58+ , ('Þ', "TP")
59+ , ('þ', "Tp")
60+ , ('ß', "ss")
61+ , ('ff', "ff")
62+ , ('fi', "fi")
63+ , ('fl', "fl")
64+ , ('ffi', "Fi")
65+ , ('ffl', "Fl")
66+ , ('Ł', "/L")
67+ , ('ł', "/l")
68+ , ('Ø', "/O")
69+ , ('ø', "/o")
70+ , ('Æ', "AE")
71+ , ('æ', "ae")
72+ , ('Œ', "OE")
73+ , ('œ', "oe")
74+ , ('IJ', "IJ")
75+ , ('ij', "ij")
76+ , ('ı', ".i")
77+ , ('ȷ', ".j")
78+ , ('Á', "'A")
79+ , ('Ć', "'C")
80+ , ('É', "'E")
81+ , ('Í', "'I")
82+ , ('Ó', "'O")
83+ , ('Ú', "'U")
84+ , ('Ý', "'Y")
85+ , ('á', "'a")
86+ , ('ć', "'c")
87+ , ('é', "'e")
88+ , ('í', "'i")
89+ , ('ó', "'o")
90+ , ('ú', "'u")
91+ , ('ý', "'y")
92+ , ('Ä', ":A")
93+ , ('Ë', ":E")
94+ , ('Ï', ":I")
95+ , ('Ö', ":O")
96+ , ('Ü', ":U")
97+ , ('Ÿ', ":Y")
98+ , ('ä', ":a")
99+ , ('ë', ":e")
100+ , ('ï', ":i")
101+ , ('ö', ":o")
102+ , ('ü', ":u")
103+ , ('ÿ', ":y")
104+ , ('Â', "^A")
105+ , ('Ê', "^E")
106+ , ('Î', "^I")
107+ , ('Ô', "^O")
108+ , ('Û', "^U")
109+ , ('â', "^a")
110+ , ('ê', "^e")
111+ , ('î', "^i")
112+ , ('ô', "^o")
113+ , ('û', "^u")
114+ , ('À', "`A")
115+ , ('È', "`E")
116+ , ('Ì', "`I")
117+ , ('Ò', "`O")
118+ , ('Ù', "`U")
119+ , ('à', "`a")
120+ , ('è', "`e")
121+ , ('ì', "`i")
122+ , ('ò', "`o")
123+ , ('ù', "`u")
124+ , ('Ã', "~A")
125+ , ('Ñ', "~N")
126+ , ('Õ', "~O")
127+ , ('ã', "~a")
128+ , ('ñ', "~n")
129+ , ('õ', "~o")
130+ , ('Š', "vS")
131+ , ('š', "vs")
132+ , ('Ž', "vZ")
133+ , ('ž', "vz")
134+ , ('Ç', ",C")
135+ , ('ç', ",c")
136+ , ('Å', "oA")
137+ , ('å', "oa")
138+ , ('˝', "a\"")
139+ , ('¯', "a-")
140+ , ('˙', "a.")
141+ , ('^', "a^")
142+ , ('´', "aa")
143+ , ('`', "ga")
144+ , ('˘', "ab")
145+ , ('¸', "ac")
146+ , ('¨', "ad")
147+ , ('ˇ', "ah")
148+ , ('˚', "ao")
149+ , ('~', "a~")
150+ , ('˛', "ho")
151+ , ('^', "ha")
152+ , ('~', "ti")
153+ , ('„', "Bq")
154+ , ('‚', "bq")
155+ , ('“', "lq")
156+ , ('”', "rq")
157+ , ('‘', "oq")
158+ , ('’', "cq")
159+ , ('\'', "aq")
160+ , ('"', "dq")
161+ , ('«', "Fo")
162+ , ('»', "Fc")
163+ , ('‹', "fo")
164+ , ('›', "fc")
165+ , ('¡', "r!")
166+ , ('¿', "r?")
167+ , ('—', "em")
168+ , ('–', "en")
169+ , ('‐', "hy")
170+ , ('[', "lB")
171+ , (']', "rB")
172+ , ('{', "lC")
173+ , ('}', "rC")
174+ , ('⟨', "la")
175+ , ('⟩', "ra")
176+ , ('⎪', "bv")
177+ , ('⎪', "braceex")
178+ , ('⎡', "bracketlefttp")
179+ , ('⎣', "bracketleftbt")
180+ , ('⎢', "bracketleftex")
181+ , ('⎤', "bracketrighttp")
182+ , ('⎦', "bracketrightbt")
183+ , ('⎥', "bracketrightex")
184+ , ('╭', "lt")
185+ , ('⎧', "bracelefttp")
186+ , ('┥', "lk")
187+ , ('⎨', "braceleftmid")
188+ , ('╰', "lb")
189+ , ('⎩', "braceleftbt")
190+ , ('⎪', "braceleftex")
191+ , ('╮', "rt")
192+ , ('⎫', "bracerighttp")
193+ , ('┝', "rk")
194+ , ('⎬', "bracerightmid")
195+ , ('╯', "rb")
196+ , ('⎭', "bracerightbt")
197+ , ('⎪', "bracerightex")
198+ , ('⎛', "parenlefttp")
199+ , ('⎝', "parenleftbt")
200+ , ('⎜', "parenleftex")
201+ , ('⎞', "parenrighttp")
202+ , ('⎠', "parenrightbt")
203+ , ('⎟', "parenrightex")
204+ , ('←', "<-")
205+ , ('→', "->")
206+ , ('↔', "<>")
207+ , ('↓', "da")
208+ , ('↑', "ua")
209+ , ('↕', "va")
210+ , ('⇐', "lA")
211+ , ('⇒', "rA")
212+ , ('⇔', "hA")
213+ , ('⇓', "dA")
214+ , ('⇑', "uA")
215+ , ('⇕', "vA")
216+ , ('⎯', "an")
217+ , ('|', "ba")
218+ , ('│', "br")
219+ , ('_', "ul")
220+ , ('‾', "rn")
221+ , ('_', "ru")
222+ , ('¦', "bb")
223+ , ('/', "sl")
224+ , ('\\', "rs")
225+ , ('○', "ci")
226+ , ('·', "bu")
227+ , ('‡', "dd")
228+ , ('†', "dg")
229+ , ('◊', "lz")
230+ , ('□', "sq")
231+ , ('¶', "ps")
232+ , ('§', "sc")
233+ , ('☜', "lh")
234+ , ('☞', "rh")
235+ , ('@', "at")
236+ , ('#', "sh")
237+ , ('↵', "CR")
238+ , ('✓', "OK")
239+ , ('©', "co")
240+ , ('®', "rg")
241+ , ('™', "tm")
242+ , ('$', "Do")
243+ , ('¢', "ct")
244+ , ('€', "eu")
245+ , ('€', "Eu")
246+ , ('¥', "Ye")
247+ , ('£', "Po")
248+ , ('¤', "Cs")
249+ , ('ƒ', "Fn")
250+ , ('°', "de")
251+ , ('‰', "%0")
252+ , ('′', "fm")
253+ , ('″', "sd")
254+ , ('µ', "mc")
255+ , ('ª', "Of")
256+ , ('º', "Om")
257+ , ('∧', "AN")
258+ , ('∨', "OR")
259+ , ('¬', "no")
260+ , ('¬', "tno")
261+ , ('∃', "te")
262+ , ('∀', "fa")
263+ , ('∋', "st")
264+ , ('∴', "3d")
265+ , ('∴', "tf")
266+ , ('|', "or")
267+ , ('½', "12")
268+ , ('¼', "14")
269+ , ('¾', "34")
270+ , ('⅛', "18")
271+ , ('⅜', "38")
272+ , ('⅝', "58")
273+ , ('⅞', "78")
274+ , ('¹', "S1")
275+ , ('²', "S2")
276+ , ('³', "S3")
277+ , ('+', "pl")
278+ , ('−', "mi")
279+ , ('∓', "-+")
280+ , ('±', "+-")
281+ , ('±', "t+-")
282+ , ('·', "pc")
283+ , ('⋅', "md")
284+ , ('×', "mu")
285+ , ('×', "tmu")
286+ , ('⊗', "c*")
287+ , ('⊕', "c+")
288+ , ('÷', "di")
289+ , ('÷', "tdi")
290+ , ('⁄', "f/")
291+ , ('∗', "**")
292+ , ('≤', "<=")
293+ , ('≥', ">=")
294+ , ('≪', "<<")
295+ , ('≫', ">>")
296+ , ('=', "eq")
297+ , ('≠', "!=")
298+ , ('≡', "==")
299+ , ('≢', "ne")
300+ , ('≅', "=~")
301+ , ('≃', "|=")
302+ , ('∼', "ap")
303+ , ('≈', "~~")
304+ , ('≈', "~=")
305+ , ('∝', "pt")
306+ , ('∅', "es")
307+ , ('∈', "mo")
308+ , ('∉', "nm")
309+ , ('⊂', "sb")
310+ , ('⊄', "nb")
311+ , ('⊃', "sp")
312+ , ('⊅', "nc")
313+ , ('⊆', "ib")
314+ , ('⊇', "ip")
315+ , ('∩', "ca")
316+ , ('∪', "cu")
317+ , ('∠', "/_")
318+ , ('⊥', "pp")
319+ , ('∫', "is")
320+ , ('∫', "integral")
321+ , ('∑', "sum")
322+ , ('∏', "product")
323+ , ('∐', "coproduct")
324+ , ('∇', "gr")
325+ , ('√', "sr")
326+ , ('√', "sqrt")
327+ -- , "radicalex"
328+ -- "sqrtex"
329+ , ('⌈', "lc")
330+ , ('⌉', "rc")
331+ , ('⌊', "lf")
332+ , ('⌋', "rf")
333+ , ('∞', "if")
334+ , ('ℵ', "Ah")
335+ , ('ℑ', "Im")
336+ , ('ℜ', "Re")
337+ , ('℘', "wp")
338+ , ('∂', "pd")
339+ , ('ℏ', "-h")
340+ , ('ℏ', "hbar")
341+ , ('Α', "*A")
342+ , ('Β', "*B")
343+ , ('Γ', "*G")
344+ , ('Δ', "*D")
345+ , ('Ε', "*E")
346+ , ('Ζ', "*Z")
347+ , ('Η', "*Y")
348+ , ('Θ', "*H")
349+ , ('Ι', "*I")
350+ , ('Κ', "*K")
351+ , ('Λ', "*L")
352+ , ('Μ', "*M")
353+ , ('Ν', "*N")
354+ , ('Ξ', "*C")
355+ , ('Ο', "*O")
356+ , ('Π', "*P")
357+ , ('Ρ', "*R")
358+ , ('Σ', "*S")
359+ , ('Τ', "*T")
360+ , ('Υ', "*U")
361+ , ('Φ', "*F")
362+ , ('Χ', "*X")
363+ , ('Ψ', "*Q")
364+ , ('Ω', "*W")
365+ , ('α', "*a")
366+ , ('β', "*b")
367+ , ('γ', "*g")
368+ , ('δ', "*d")
369+ , ('ε', "*e")
370+ , ('ζ', "*z")
371+ , ('η', "*y")
372+ , ('θ', "*h")
373+ , ('ι', "*i")
374+ , ('κ', "*k")
375+ , ('λ', "*l")
376+ , ('μ', "*m")
377+ , ('ν', "*n")
378+ , ('ξ', "*c")
379+ , ('ο', "*o")
380+ , ('π', "*p")
381+ , ('ρ', "*r")
382+ , ('ς', "ts")
383+ , ('σ', "*s")
384+ , ('τ', "*t")
385+ , ('υ', "*u")
386+ , ('ϕ', "*f")
387+ , ('χ', "*x")
388+ , ('ψ', "*q")
389+ , ('ω', "*w")
390+ , ('ϑ', "+h")
391+ , ('φ', "+f")
392+ , ('ϖ', "+p")
393+ , ('ϵ', "+e")
394+ , ('♣', "CL")
395+ , ('♠', "SP")
396+ , ('♥', "HE")
397+ , ('♦', "DI")
398+ ]
399+
400+-- use like: \\[E a^ aa]
401+combiningAccents :: [(Char, String)]
402+combiningAccents =
403+ [ ('˝' , "\\[a\"]")
404+ , ('¯', "\\[a-]")
405+ , ('˙', "\\[a.]")
406+ , ('^', "\\[a^]")
407+ , ('´', "\\[aa]")
408+ , ('`', "\\[ga]")
409+ , ('˘', "\\[ab]")
410+ , ('¸', "\\[ac]")
411+ , ('¨', "\\[ad]")
412+ , ('ˇ', "\\[ah]")
413+ , ('˚', "\\[ao]")
414+ , ('~', "\\[a~]")
415+ , ('˛', "\\[ho]")
416+ , ('^', "\\[ha]")
417+ , ('~', "\\[ti]")
418+ ]
src/Text/Pandoc/Writers/Groff.hs+2−20
@@ -51,6 +51,7 @@ import Text.Pandoc.Class (PandocMonad)
5151import Text.Pandoc.Definition
5252import Text.Pandoc.Pretty
5353import Text.Printf (printf)
54+import Text.Pandoc.GroffChar (essentialEscapes)
5455
5556data WriterState = WriterState { stHasInlineMath :: Bool
5657 , stFirstPara :: Bool
@@ -81,28 +82,9 @@ type Note = [Block]
8182
8283type MS = StateT WriterState
8384
84−-- | Association list of characters to escape.
85−groffEscapes :: Map.Map Char String
86−groffEscapes = Map.fromList
87− [ ('\160', "\\~")
88− , ('\'', "\\[aq]")
89− , ('`', "\\`")
90− , ('"', "\\[dq]")
91− , ('\x201C', "\\[lq]")
92− , ('\x201D', "\\[rq]")
93− , ('\x2018', "\\[oq]")
94− , ('\x2019', "\\[cq]")
95− , ('\x2014', "\\[em]")
96− , ('\x2013', "\\[en]")
97− , ('\x2026', "\\&...")
98− , ('~', "\\[ti]")
99− , ('^', "\\[ha]")
100− , ('@', "\\[at]")
101− , ('\\', "\\\\")
102− ]
10385
10486escapeChar :: Char -> String
105−escapeChar c = fromMaybe [c] (Map.lookup c groffEscapes)
87+escapeChar c = fromMaybe [c] (Map.lookup c essentialEscapes)
10688
10789-- | Escape special characters for groff.
10890escapeString :: String -> String