git.iko.soy/typeable/pandoc
on master help sign in
Merge pull request #2039 from mpickering/7.10
ef07974John MacFarlane
src/Text/Pandoc/Writers/Docx.hs+19−2
@@ -1,4 +1,4 @@
1−{-# LANGUAGE ScopedTypeVariables, PatternGuards #-}
1+{-# LANGUAGE ScopedTypeVariables, PatternGuards, ViewPatterns #-}
2{-
2{-
3Copyright (C) 2012-2014 John MacFarlane <jgm@berkeley.edu>
3Copyright (C) 2012-2014 John MacFarlane <jgm@berkeley.edu>
4
4
@@ -66,6 +66,7 @@ import Text.Pandoc.MIME (MimeType, getMimeType, getMimeTypeDef,
66 extensionFromMimeType)
66 extensionFromMimeType)
67import Control.Applicative ((<$>), (<|>), (<*>))
67import Control.Applicative ((<$>), (<|>), (<*>))
68import Data.Maybe (fromMaybe, mapMaybe, maybeToList)
68import Data.Maybe (fromMaybe, mapMaybe, maybeToList)
69+import Data.Char (ord)
69
70
70data ListMarker = NoMarker
71data ListMarker = NoMarker
71 | BulletMarker
72 | BulletMarker
@@ -176,13 +177,29 @@ renumId f renumMap e
176renumIds :: (QName -> Bool) -> (M.Map String String) -> [Element] -> [Element]
177renumIds :: (QName -> Bool) -> (M.Map String String) -> [Element] -> [Element]
177renumIds f renumMap = map (renumId f renumMap)
178renumIds f renumMap = map (renumId f renumMap)
178
179
180+-- | Certain characters are invalid in XML even if escaped.
181+-- See #1992
182+stripInvalidChars :: Pandoc -> Pandoc
183+stripInvalidChars = bottomUp (filter isValidChar)
184+
185+-- | See XML reference
186+isValidChar :: Char -> Bool
187+isValidChar (ord -> c)
188+ | c == 0x9 = True
189+ | c == 0xA = True
190+ | c == 0xD = True
191+ | 0x20 <= c && c <= 0xD7FF = True
192+ | 0xE000 <= c && c <= 0xFFFD = True
193+ | 0x10000 <= c && c <= 0x10FFFF = True
194+ | otherwise = False
195+
179-- | Produce an Docx file from a Pandoc document.
196-- | Produce an Docx file from a Pandoc document.
180writeDocx :: WriterOptions -- ^ Writer options
197writeDocx :: WriterOptions -- ^ Writer options
181 -> Pandoc -- ^ Document to convert
198 -> Pandoc -- ^ Document to convert
182 -> IO BL.ByteString
199 -> IO BL.ByteString
183writeDocx opts doc@(Pandoc meta _) = do
200writeDocx opts doc@(Pandoc meta _) = do
184 let datadir = writerUserDataDir opts
201 let datadir = writerUserDataDir opts
185− let doc' = walk fixDisplayMath doc
202+ let doc' = stripInvalidChars . walk fixDisplayMath $ doc
186 username <- lookup "USERNAME" <$> getEnvironment
203 username <- lookup "USERNAME" <$> getEnvironment
187 utctime <- getCurrentTime
204 utctime <- getCurrentTime
188 refArchive <- liftM (toArchive . toLazy) $
205 refArchive <- liftM (toArchive . toLazy) $