Added --ascii option.

Currently supported only in HTML writer.
This commit is contained in:
John MacFarlane 2011-02-06 09:27:03 -08:00
parent 9b38b69c94
commit 8f408e4b7b
4 changed files with 38 additions and 19 deletions

5
README
View file

@ -292,6 +292,11 @@ Options
`--columns`=*NUMBER*
: Specify length of lines in characters (for text wrapping).
`--ascii`
: Use only ascii characters in output. Currently supported only
for HTML output (which uses numerical entities instead of
UTF-8 when this option is selected).
`--email-obfuscation=`*none|javascript|references*
: Specify a method for obfuscating `mailto:` links in HTML documents.
*none* leaves `mailto:` links as they are. *javascript* obfuscates

View file

@ -490,6 +490,7 @@ data WriterOptions = WriterOptions
, writerHtml5 :: Bool -- ^ Produce HTML5
, writerChapters :: Bool -- ^ Use "chapter" for top-level sects
, writerListings :: Bool -- ^ Use listings package for code
, writerAscii :: Bool -- ^ Avoid non-ascii characters
} deriving Show
-- | Default writer options.
@ -522,6 +523,7 @@ defaultWriterOptions =
, writerHtml5 = False
, writerChapters = False
, writerListings = False
, writerAscii = False
}
--

View file

@ -43,6 +43,7 @@ import Data.List ( isPrefixOf, intersperse )
import Data.Maybe ( catMaybes )
import Control.Monad.State
import Text.XHtml.Transitional hiding ( stringToHtml, unordList, ordList )
import qualified Text.XHtml.Transitional as XHtml
import Text.TeXMath
import Text.XML.Light.Output
@ -60,8 +61,10 @@ defaultWriterState = WriterState {stNotes= [], stMath = False, stHighlighting =
-- | Modified version of Text.XHtml's stringToHtml.
-- Use unicode characters wherever possible.
stringToHtml :: String -> Html
stringToHtml = primHtml . escapeStringForXML
stringToHtml :: WriterOptions -> String -> Html
stringToHtml opts = if writerAscii opts
then XHtml.stringToHtml
else primHtml . escapeStringForXML
-- | Hard linebreak.
nl :: WriterOptions -> Html
@ -219,7 +222,7 @@ elementToListItem _ (Blk _) = return Nothing
elementToListItem opts (Sec _ num id' headerText subsecs) = do
let sectnum = if writerNumberSections opts
then (thespan ! [theclass "toc-section-number"] << showSecNum num) +++
stringToHtml " "
stringToHtml opts" "
else noHtml
txt <- liftM (sectnum +++) $ inlineListToHtml opts headerText
subHeads <- mapM (elementToListItem opts) subsecs >>= return . catMaybes
@ -301,7 +304,7 @@ obfuscateLink opts txt s =
linkText ++ "+'<\\/'+'a'+'>');\n// -->\n")) +++
noscript (primHtml $ obfuscateString altText)
_ -> error $ "Unknown obfuscation method: " ++ show meth
_ -> anchor ! [href s] $ stringToHtml txt -- malformed email
_ -> anchor ! [href s] $ stringToHtml opts txt -- malformed email
-- | Obfuscate character as entity.
obfuscateChar :: Char -> String
@ -353,7 +356,7 @@ blockToHtml opts (CodeBlock (id',classes,keyvals) rawCode) = do
else unlines . lines
in return $ pre ! attrs $ thecode <<
(replicate (length leadingBreaks) br +++
[stringToHtml $ addBird rawCode'])
[stringToHtml opts $ addBird rawCode'])
Right h -> modify (\st -> st{ stHighlighting = True }) >>
return h
blockToHtml opts (BlockQuote blocks) =
@ -379,7 +382,7 @@ blockToHtml opts (Header level lst) = do
secnum <- liftM stSecNum get
let contents' = if writerNumberSections opts
then (thespan ! [theclass "header-section-number"] << showSecNum secnum) +++
stringToHtml " " +++ contents
stringToHtml opts " " +++ contents
else contents
let contents'' = if writerTableOfContents opts
then anchor ! [href $ "#" ++ writerIdentifierPrefix opts ++ "TOC"] $ contents'
@ -512,19 +515,19 @@ inlineListToHtml opts lst =
inlineToHtml :: WriterOptions -> Inline -> State WriterState Html
inlineToHtml opts inline =
case inline of
(Str str) -> return $ stringToHtml str
(Space) -> return $ stringToHtml " "
(Str str) -> return $ stringToHtml opts str
(Space) -> return $ stringToHtml opts " "
(LineBreak) -> return br
(EmDash) -> return $ stringToHtml ""
(EnDash) -> return $ stringToHtml ""
(Ellipses) -> return $ stringToHtml ""
(Apostrophe) -> return $ stringToHtml ""
(EmDash) -> return $ stringToHtml opts ""
(EnDash) -> return $ stringToHtml opts ""
(Ellipses) -> return $ stringToHtml opts ""
(Apostrophe) -> return $ stringToHtml opts ""
(Emph lst) -> inlineListToHtml opts lst >>= return . emphasize
(Strong lst) -> inlineListToHtml opts lst >>= return . strong
(Code attr str) -> case highlightHtml True attr str of
Left _ -> return
$ thecode ! (attrsToHtml opts attr)
$ stringToHtml str
$ stringToHtml opts str
Right h -> return h
(Strikeout lst) -> inlineListToHtml opts lst >>=
return . (thespan ! [thestyle "text-decoration: line-through;"])
@ -534,10 +537,10 @@ inlineToHtml opts inline =
(Subscript lst) -> inlineListToHtml opts lst >>= return . sub
(Quoted quoteType lst) ->
let (leftQuote, rightQuote) = case quoteType of
SingleQuote -> (stringToHtml "",
stringToHtml "")
DoubleQuote -> (stringToHtml "",
stringToHtml "")
SingleQuote -> (stringToHtml opts "",
stringToHtml opts "")
DoubleQuote -> (stringToHtml opts "",
stringToHtml opts "")
in do contents <- inlineListToHtml opts lst
return $ leftQuote +++ contents +++ rightQuote
(Math t str) -> modify (\st -> st {stMath = True}) >>

View file

@ -123,6 +123,7 @@ data Opt = Opt
, optBibliography :: [String]
, optCslFile :: FilePath
, optListings :: Bool -- ^ Use listings package for code blocks
, optAscii :: Bool -- ^ Avoid using nonascii characters
}
-- | Defaults for command-line options.
@ -166,6 +167,7 @@ defaultOpts = Opt
, optBibliography = []
, optCslFile = ""
, optListings = False
, optAscii = False
}
-- | A list of functions, each transforming the options data structure
@ -347,6 +349,11 @@ options =
"NUMBER")
"" -- "Length of line in characters"
, Option "" ["ascii"]
(NoArg
(\opt -> return opt { optAscii = True }))
"" -- "Avoid using non-ascii characters in output"
, Option "" ["email-obfuscation"]
(ReqArg
(\arg opt -> do
@ -681,7 +688,8 @@ main = do
, optBibliography = reffiles
, optCslFile = cslfile
, optCiteMethod = citeMethod
, optListings = listings
, optListings = listings
, optAscii = ascii
} = opts
when dumpArgs $
@ -803,7 +811,8 @@ main = do
writerHtml5 = html5 &&
"html" `isPrefixOf` writerName',
writerChapters = chapters,
writerListings = listings }
writerListings = listings,
writerAscii = ascii }
when (isNonTextOutput writerName' && outputFile == "-") $
do UTF8.hPutStrLn stderr ("Error: Cannot write " ++ writerName ++ " output to stdout.\n" ++