@@ -43,6 +43,7 @@ import Data.List ( isPrefixOf, intersperse )
4343import Data.Maybe ( catMaybes )
4444import Control.Monad.State
4545import Text.XHtml.Transitional hiding ( stringToHtml, unordList, ordList )
46+import qualified Text.XHtml.Transitional as XHtml
4647import Text.TeXMath
4748import Text.XML.Light.Output
4849
@@ -60,8 +61,10 @@ defaultWriterState = WriterState {stNotes= [], stMath = False, stHighlighting =
6061
6162-- | Modified version of Text.XHtml's stringToHtml.
6263-- Use unicode characters wherever possible.
63−stringToHtml :: String -> Html
64−stringToHtml = primHtml . escapeStringForXML
64+stringToHtml :: WriterOptions -> String -> Html
65+stringToHtml opts = if writerAscii opts
66+ then XHtml.stringToHtml
67+ else primHtml . escapeStringForXML
6568
6669-- | Hard linebreak.
6770nl :: WriterOptions -> Html
@@ -219,7 +222,7 @@ elementToListItem _ (Blk _) = return Nothing
219222elementToListItem opts (Sec _ num id' headerText subsecs) = do
220223 let sectnum = if writerNumberSections opts
221224 then (thespan ! [theclass "toc-section-number"] << showSecNum num) +++
222− stringToHtml " "
225+ stringToHtml opts" "
223226 else noHtml
224227 txt <- liftM (sectnum +++) $ inlineListToHtml opts headerText
225228 subHeads <- mapM (elementToListItem opts) subsecs >>= return . catMaybes
@@ -301,7 +304,7 @@ obfuscateLink opts txt s =
301304 linkText ++ "+'<\\/'+'a'+'>');\n// -->\n")) +++
302305 noscript (primHtml $ obfuscateString altText)
303306 _ -> error $ "Unknown obfuscation method: " ++ show meth
304− _ -> anchor ! [href s] $ stringToHtml txt -- malformed email
307+ _ -> anchor ! [href s] $ stringToHtml opts txt -- malformed email
305308
306309-- | Obfuscate character as entity.
307310obfuscateChar :: Char -> String
@@ -353,7 +356,7 @@ blockToHtml opts (CodeBlock (id',classes,keyvals) rawCode) = do
353356 else unlines . lines
354357 in return $ pre ! attrs $ thecode <<
355358 (replicate (length leadingBreaks) br +++
356− [stringToHtml $ addBird rawCode'])
359+ [stringToHtml opts $ addBird rawCode'])
357360 Right h -> modify (\st -> st{ stHighlighting = True }) >>
358361 return h
359362blockToHtml opts (BlockQuote blocks) =
@@ -379,7 +382,7 @@ blockToHtml opts (Header level lst) = do
379382 secnum <- liftM stSecNum get
380383 let contents' = if writerNumberSections opts
381384 then (thespan ! [theclass "header-section-number"] << showSecNum secnum) +++
382− stringToHtml " " +++ contents
385+ stringToHtml opts " " +++ contents
383386 else contents
384387 let contents'' = if writerTableOfContents opts
385388 then anchor ! [href $ "#" ++ writerIdentifierPrefix opts ++ "TOC"] $ contents'
@@ -512,19 +515,19 @@ inlineListToHtml opts lst =
512515inlineToHtml :: WriterOptions -> Inline -> State WriterState Html
513516inlineToHtml opts inline =
514517 case inline of
515− (Str str) -> return $ stringToHtml str
516− (Space) -> return $ stringToHtml " "
518+ (Str str) -> return $ stringToHtml opts str
519+ (Space) -> return $ stringToHtml opts " "
517520 (LineBreak) -> return br
518− (EmDash) -> return $ stringToHtml "—"
519− (EnDash) -> return $ stringToHtml "–"
520− (Ellipses) -> return $ stringToHtml "…"
521− (Apostrophe) -> return $ stringToHtml "’"
521+ (EmDash) -> return $ stringToHtml opts "—"
522+ (EnDash) -> return $ stringToHtml opts "–"
523+ (Ellipses) -> return $ stringToHtml opts "…"
524+ (Apostrophe) -> return $ stringToHtml opts "’"
522525 (Emph lst) -> inlineListToHtml opts lst >>= return . emphasize
523526 (Strong lst) -> inlineListToHtml opts lst >>= return . strong
524527 (Code attr str) -> case highlightHtml True attr str of
525528 Left _ -> return
526529 $ thecode ! (attrsToHtml opts attr)
527− $ stringToHtml str
530+ $ stringToHtml opts str
528531 Right h -> return h
529532 (Strikeout lst) -> inlineListToHtml opts lst >>=
530533 return . (thespan ! [thestyle "text-decoration: line-through;"])
@@ -534,10 +537,10 @@ inlineToHtml opts inline =
534537 (Subscript lst) -> inlineListToHtml opts lst >>= return . sub
535538 (Quoted quoteType lst) ->
536539 let (leftQuote, rightQuote) = case quoteType of
537− SingleQuote -> (stringToHtml "‘",
538− stringToHtml "’")
539− DoubleQuote -> (stringToHtml "“",
540− stringToHtml "”")
540+ SingleQuote -> (stringToHtml opts "‘",
541+ stringToHtml opts "’")
542+ DoubleQuote -> (stringToHtml opts "“",
543+ stringToHtml opts "”")
541544 in do contents <- inlineListToHtml opts lst
542545 return $ leftQuote +++ contents +++ rightQuote
543546 (Math t str) -> modify (\st -> st {stMath = True}) >>