git.iko.soy/typeable/pandoc
on master help sign in
Checkpoint.
commitd23489ab6342c47a6d48f38a1003769ed50b4ee4 authorJohn MacFarlane <jgm@berkeley.edu> dateSun 2 Jul 2017, 16:44 (9 years ago) parent8841dd4
1 file changed+1−642
src/Text/Pandoc/Readers/LaTeX.hs+1−642
src/Text/Pandoc/Readers/LaTeX.hs+1−642
@@ -1066,8 +1066,6 @@ inline = (mempty <$ comment)
10661066inlines :: PandocMonad m => LP m Inlines
10671067inlines = mconcat <$> many inline
10681068
1069−-- PREVIOUSLY HAD (notFollowedBy (char '}') *> inline)
1070−
10711069-- block elements:
10721070
10731071paragraph :: PandocMonad m => LP m Blocks
@@ -1200,7 +1198,7 @@ blockCommands = M.fromList $
12001198 , ("rule", skipopts *> tok *> tok *> pure horizontalRule)
12011199-- , ("item", skipopts *> looseItem)
12021200-- , ("documentclass", skipopts *> braced *> preamble)
1203−-- , ("centerline", (para . trimInlines) <$> (skipopts *> tok))
1201+ , ("centerline", (para . trimInlines) <$> (skipopts *> tok))
12041202-- , ("caption", skipopts *> setCaption)
12051203-- , ("bibliography", mempty <$ (skipopts *> braced >>=
12061204-- addMeta "bibliography" . splitBibs))
@@ -1245,331 +1243,6 @@ blocks :: PandocMonad m => LP m Blocks
12451243blocks = mconcat <$> many block
12461244
12471245{-
1248−-- -- | Parse LaTeX from string and return 'Pandoc' document.
1249−-- readLaTeX :: PandocMonad m
1250−-- => ReaderOptions -- ^ Reader options
1251−-- -> Text -- ^ String to parse (assumes @'\n'@ line endings)
1252−-- -> m Pandoc
1253−-- readLaTeX opts ltx = do
1254−-- parsed <- readWithM parseLaTeX def{ stateOptions = opts }
1255−-- (unpack (crFilter ltx))
1256−-- case parsed of
1257−-- Right result -> return result
1258−-- Left e -> throwError e
1259−--
1260−--
1261−-- parseLaTeX :: PandocMonad m => LP m Pandoc
1262−-- parseLaTeX = do
1263−-- bs <- blocks
1264−-- eof
1265−-- st <- getState
1266−-- let meta = stateMeta st
1267−-- let doc' = doc bs
1268−-- let headerLevel (Header n _ _) = [n]
1269−-- headerLevel _ = []
1270−-- let bottomLevel = minimumDef 1 $ query headerLevel doc'
1271−-- let adjustHeaders m (Header n attr ils) = Header (n+m) attr ils
1272−-- adjustHeaders _ x = x
1273−-- let (Pandoc _ bs') =
1274−-- -- handle the case where you have \part or \chapter
1275−-- (if bottomLevel < 1
1276−-- then walk (adjustHeaders (1 - bottomLevel))
1277−-- else id) doc'
1278−-- return $ Pandoc meta bs'
1279−--
1280−-- anyControlSeq :: PandocMonad m => LP m String
1281−-- anyControlSeq = do
1282−-- char '\\'
1283−-- next <- option '\n' anyChar
1284−-- case next of
1285−-- '\n' -> return ""
1286−-- c | isLetter c -> (c:) <$> (many letter <* optional sp)
1287−-- | otherwise -> return [c]
1288−--
1289−-- controlSeq :: PandocMonad m => String -> LP m String
1290−-- controlSeq name = try $ do
1291−-- char '\\'
1292−-- case name of
1293−-- "" -> mzero
1294−-- [c] | not (isLetter c) -> string [c]
1295−-- cs -> string cs <* notFollowedBy letter <* optional sp
1296−-- return name
1297−--
1298−-- dimenarg :: PandocMonad m => LP m String
1299−-- dimenarg = try $ do
1300−-- ch <- option "" $ string "="
1301−-- num <- many1 digit
1302−-- dim <- oneOfStrings ["pt","pc","in","bp","cm","mm","dd","cc","sp"]
1303−-- return $ ch ++ num ++ dim
1304−--
1305−-- sp :: PandocMonad m => LP m ()
1306−-- sp = whitespace <|> endline
1307−--
1308−-- whitespace :: PandocMonad m => LP m ()
1309−-- whitespace = skipMany1 $ satisfy (\c -> c == ' ' || c == '\t')
1310−--
1311−-- endline :: PandocMonad m => LP m ()
1312−-- endline = try (newline >> lookAhead anyChar >> notFollowedBy blankline)
1313−--
1314−-- isLowerHex :: Char -> Bool
1315−-- isLowerHex x = x >= '0' && x <= '9' || x >= 'a' && x <= 'f'
1316−--
1317−-- primEscape :: PandocMonad m => LP m Char
1318−-- primEscape = try $ do
1319−-- string "^^"
1320−-- c <- satisfy (\x -> x >= '\0' && x <= '\128')
1321−-- d <- if isLowerHex c
1322−-- then option "" $ count 1 (satisfy isLowerHex)
1323−-- else return ""
1324−-- if null d
1325−-- then case ord c of
1326−-- x | x >= 64 && x <= 127 -> return $ chr (x - 64)
1327−-- | otherwise -> return $ chr (x + 64)
1328−-- else return $ chr $ read ('0':'x':c:d)
1329−--
1330−-- comment :: PandocMonad m => LP m ()
1331−-- comment = do
1332−-- char '%'
1333−-- skipMany (satisfy (/='\n'))
1334−-- optional newline
1335−-- return ()
1336−--
1337−-- bgroup :: PandocMonad m => LP m ()
1338−-- bgroup = try $ do
1339−-- skipMany (spaceChar <|> try (newline <* notFollowedBy blankline))
1340−-- () <$ char '{'
1341−-- <|> () <$ controlSeq "bgroup"
1342−-- <|> () <$ controlSeq "begingroup"
1343−--
1344−-- egroup :: PandocMonad m => LP m ()
1345−-- egroup = () <$ char '}'
1346−-- <|> () <$ controlSeq "egroup"
1347−-- <|> () <$ controlSeq "endgroup"
1348−--
1349−-- grouped :: PandocMonad m => Monoid a => LP m a -> LP m a
1350−-- grouped parser = try $ do
1351−-- bgroup
1352−-- -- first we check for an inner 'grouped', because
1353−-- -- {{a,b}} should be parsed the same as {a,b}
1354−-- try (grouped parser <* egroup)
1355−-- <|> (mconcat <$> manyTill parser egroup)
1356−--
1357−-- braced :: PandocMonad m => LP m String
1358−-- braced = grouped chunk
1359−-- where chunk =
1360−-- many1 (satisfy (\c -> c /= '\\' && c /= '}' && c /= '{'))
1361−-- <|> try (string "\\}")
1362−-- <|> try (string "\\{")
1363−-- <|> try (string "\\\\")
1364−-- <|> ((\x -> "{" ++ x ++ "}") <$> braced)
1365−-- <|> count 1 anyChar
1366−--
1367−-- bracketed :: PandocMonad m => Monoid a => LP m a -> LP m a
1368−-- bracketed parser = try $ char '[' *> (mconcat <$> manyTill parser (char ']'))
1369−--
1370−-- mathDisplay :: PandocMonad m => LP m String -> LP m Inlines
1371−-- mathDisplay p = displayMath <$> (try p >>= applyMacros' . trim)
1372−--
1373−-- mathInline :: PandocMonad m => LP m String -> LP m Inlines
1374−-- mathInline p = math <$> (try p >>= applyMacros')
1375−--
1376−-- mathChars :: PandocMonad m => LP m String
1377−-- mathChars =
1378−-- concat <$> many (escapedChar
1379−-- <|> (snd <$> withRaw braced)
1380−-- <|> many1 (satisfy isOrdChar))
1381−-- where escapedChar = try $ do char '\\'
1382−-- c <- anyChar
1383−-- return ['\\',c]
1384−-- isOrdChar '$' = False
1385−-- isOrdChar '{' = False
1386−-- isOrdChar '}' = False
1387−-- isOrdChar '\\' = False
1388−-- isOrdChar _ = True
1389−--
1390−-- inline :: PandocMonad m => LP m Inlines
1391−-- inline = (mempty <$ comment)
1392−-- <|> (space <$ whitespace)
1393−-- <|> (softbreak <$ endline)
1394−-- <|> inlineText
1395−-- <|> inlineCommand
1396−-- <|> inlineEnvironment
1397−-- <|> inlineGroup
1398−-- <|> (char '-' *> option (str "-")
1399−-- (char '-' *> option (str "–") (str "—" <$ char '-')))
1400−-- <|> doubleQuote
1401−-- <|> singleQuote
1402−-- <|> (str "”" <$ try (string "''"))
1403−-- <|> (str "”" <$ char '”')
1404−-- <|> (str "’" <$ char '\'')
1405−-- <|> (str "’" <$ char '’')
1406−-- <|> (str "\160" <$ char '~')
1407−-- <|> mathDisplay (string "$$" *> mathChars <* string "$$")
1408−-- <|> mathInline (char '$' *> mathChars <* char '$')
1409−-- <|> (guardEnabled Ext_literate_haskell *> char '|' *> doLHSverb)
1410−-- <|> (str . (:[]) <$> primEscape)
1411−-- <|> (do res <- oneOf "#&~^'`\"[]"
1412−-- pos <- getPosition
1413−-- report $ ParsingUnescaped [res] pos
1414−-- return $ str [res])
1415−--
1416−-- inlines :: PandocMonad m => LP m Inlines
1417−-- inlines = mconcat <$> many (notFollowedBy (char '}') *> inline)
1418−--
1419−-- inlineGroup :: PandocMonad m => LP m Inlines
1420−-- inlineGroup = do
1421−-- ils <- grouped inline
1422−-- if isNull ils
1423−-- then return mempty
1424−-- else return $ spanWith nullAttr ils
1425−-- -- we need the span so we can detitlecase bibtex entries;
1426−-- -- we need to know when something is {C}apitalized
1427−--
1428−-- block :: PandocMonad m => LP m Blocks
1429−-- block = (mempty <$ comment)
1430−-- <|> (mempty <$ ((spaceChar <|> newline) *> spaces))
1431−-- <|> environment
1432−-- <|> include
1433−-- <|> macro
1434−-- <|> blockCommand
1435−-- <|> paragraph
1436−-- <|> grouped block
1437−--
1438−-- blocks :: PandocMonad m => LP m Blocks
1439−-- blocks = mconcat <$> many block
1440−--
1441−-- getRawCommand :: PandocMonad m => String -> LP m String
1442−-- getRawCommand name' = do
1443−-- rawargs <- withRaw (many (try (optional sp *> opt)) *>
1444−-- option "" (try (optional sp *> dimenarg)) *>
1445−-- many braced)
1446−-- return $ '\\' : name' ++ snd rawargs
1447−--
1448−-- lookupListDefault :: (Ord k) => v -> [k] -> M.Map k v -> v
1449−-- lookupListDefault d = (fromMaybe d .) . lookupList
1450−-- where
1451−-- lookupList l m = msum $ map (`M.lookup` m) l
1452−--
1453−-- blockCommand :: PandocMonad m => LP m Blocks
1454−-- blockCommand = try $ do
1455−-- name <- anyControlSeq
1456−-- guard $ name /= "begin" && name /= "end"
1457−-- star <- option "" (string "*" <* optional sp)
1458−-- let name' = name ++ star
1459−-- let raw = do
1460−-- rawcommand <- getRawCommand name'
1461−-- transformed <- applyMacros' rawcommand
1462−-- guard $ transformed /= rawcommand
1463−-- notFollowedBy $ parseFromString' inlines transformed
1464−-- parseFromString' blocks transformed
1465−-- lookupListDefault raw [name',name] blockCommands
1466−--
1467−-- inBrackets :: Inlines -> Inlines
1468−-- inBrackets x = str "[" <> x <> str "]"
1469−--
1470−-- -- eat an optional argument and one or more arguments in braces
1471−-- ignoreInlines :: PandocMonad m => Text -> (Text, LP m Inlines)
1472−-- ignoreInlines name = (name, p)
1473−-- where
1474−-- p = do oa <- optargs
1475−-- let rawCommand = '\\':name ++ oa
1476−-- let doraw = guardRaw >> return (rawInline "latex" rawCommand)
1477−-- doraw <|> ignore rawCommand
1478−--
1479−-- guardRaw :: PandocMonad m => LP m ()
1480−-- guardRaw = getOption readerExtensions >>= guard . extensionEnabled Ext_raw_tex
1481−--
1482−-- optargs :: PandocMonad m => LP m String
1483−-- optargs = snd <$> withRaw (skipopts *> skipMany (try $ optional sp *> braced))
1484−--
1485−-- ignore :: (Monoid a, PandocMonad m) => String -> ParserT s u m a
1486−-- ignore raw = do
1487−-- pos <- getPosition
1488−-- report $ SkippedContent raw pos
1489−-- return mempty
1490−--
1491−-- ignoreBlocks :: PandocMonad m => String -> (String, LP m Blocks)
1492−-- ignoreBlocks name = (name, p)
1493−-- where
1494−-- p = do oa <- optargs
1495−-- let rawCommand = '\\':name ++ oa
1496−-- let doraw = guardRaw >> return (rawBlock "latex" rawCommand)
1497−-- doraw <|> ignore rawCommand
1498−--
1499−-- blockCommands :: PandocMonad m => M.Map String (LP m Blocks)
1500−-- blockCommands = M.fromList $
1501−-- [ ("par", mempty <$ skipopts)
1502−-- , ("parbox", braced >> grouped blocks)
1503−-- , ("title", mempty <$ (skipopts *>
1504−-- (grouped inline >>= addMeta "title")
1505−-- <|> (grouped block >>= addMeta "title")))
1506−-- , ("subtitle", mempty <$ (skipopts *> tok >>= addMeta "subtitle"))
1507−-- , ("author", mempty <$ (skipopts *> authors))
1508−-- -- -- in letter class, temp. store address & sig as title, author
1509−-- , ("address", mempty <$ (skipopts *> tok >>= addMeta "address"))
1510−-- , ("signature", mempty <$ (skipopts *> authors))
1511−-- , ("date", mempty <$ (skipopts *> tok >>= addMeta "date"))
1512−-- -- Koma-script metadata commands
1513−-- , ("dedication", mempty <$ (skipopts *> tok >>= addMeta "dedication"))
1514−-- -- sectioning
1515−-- , ("part", section nullAttr (-1))
1516−-- , ("part*", section nullAttr (-1))
1517−-- , ("chapter", section nullAttr 0)
1518−-- , ("chapter*", section ("",["unnumbered"],[]) 0)
1519−-- , ("section", section nullAttr 1)
1520−-- , ("section*", section ("",["unnumbered"],[]) 1)
1521−-- , ("subsection", section nullAttr 2)
1522−-- , ("subsection*", section ("",["unnumbered"],[]) 2)
1523−-- , ("subsubsection", section nullAttr 3)
1524−-- , ("subsubsection*", section ("",["unnumbered"],[]) 3)
1525−-- , ("paragraph", section nullAttr 4)
1526−-- , ("paragraph*", section ("",["unnumbered"],[]) 4)
1527−-- , ("subparagraph", section nullAttr 5)
1528−-- , ("subparagraph*", section ("",["unnumbered"],[]) 5)
1529−-- -- beamer slides
1530−-- , ("frametitle", section nullAttr 3)
1531−-- , ("framesubtitle", section nullAttr 4)
1532−-- -- letters
1533−-- , ("opening", (para . trimInlines) <$> (skipopts *> tok))
1534−-- , ("closing", skipopts *> closing)
1535−-- --
1536−-- , ("hrule", pure horizontalRule)
1537−-- , ("strut", pure mempty)
1538−-- , ("rule", skipopts *> tok *> tok *> pure horizontalRule)
1539−-- , ("item", skipopts *> looseItem)
1540−-- , ("documentclass", skipopts *> braced *> preamble)
1541−-- , ("centerline", (para . trimInlines) <$> (skipopts *> tok))
1542−-- , ("caption", skipopts *> setCaption)
1543−-- , ("bibliography", mempty <$ (skipopts *> braced >>=
1544−-- addMeta "bibliography" . splitBibs))
1545−-- , ("addbibresource", mempty <$ (skipopts *> braced >>=
1546−-- addMeta "bibliography" . splitBibs))
1547−-- -- includes
1548−-- , ("lstinputlisting", inputListing)
1549−-- , ("graphicspath", graphicsPath)
1550−-- -- hyperlink
1551−-- , ("hypertarget", braced >> grouped block)
1552−-- ] ++ map ignoreBlocks
1553−-- -- these commands will be ignored unless --parse-raw is specified,
1554−-- -- in which case they will appear as raw latex blocks
1555−-- [ "newcommand", "renewcommand", "newenvironment", "renewenvironment"
1556−-- -- newcommand, etc. should be parsed by macro, but we need this
1557−-- -- here so these aren't parsed as inline commands to ignore
1558−-- , "special", "pdfannot", "pdfstringdef"
1559−-- , "bibliographystyle"
1560−-- , "maketitle", "makeindex", "makeglossary"
1561−-- , "addcontentsline", "addtocontents", "addtocounter"
1562−-- -- \ignore{} is used conventionally in literate haskell for definitions
1563−-- -- that are to be processed by the compiler but not printed.
1564−-- , "ignore"
1565−-- , "hyperdef"
1566−-- , "markboth", "markright", "markleft"
1567−-- , "hspace", "vspace"
1568−-- , "newpage"
1569−-- , "clearpage"
1570−-- , "pagebreak"
1571−-- ]
1572−--
15731246-- graphicsPath :: PandocMonad m => LP m Blocks
15741247-- graphicsPath = do
15751248-- ps <- bgroup *> (manyTill braced egroup)
@@ -1598,75 +1271,6 @@ blocks = mconcat <$> many block
15981271-- resetCaption :: PandocMonad m => LP m ()
15991272-- resetCaption = updateState $ \st -> st{ stateCaption = Nothing }
16001273--
1601−-- authors :: PandocMonad m => LP m ()
1602−-- authors = try $ do
1603−-- bgroup
1604−-- let oneAuthor = mconcat <$>
1605−-- many1 (notFollowedBy' (controlSeq "and") >>
1606−-- (inline <|> mempty <$ blockCommand))
1607−-- -- skip e.g. \vspace{10pt}
1608−-- auths <- sepBy oneAuthor (controlSeq "and")
1609−-- egroup
1610−-- addMeta "author" (map trimInlines auths)
1611−--
1612−-- section :: PandocMonad m => Attr -> Int -> LP m Blocks
1613−-- section (ident, classes, kvs) lvl = do
1614−-- skipopts
1615−-- contents <- grouped inline
1616−-- lab <- option ident $ try (spaces' >> controlSeq "label" >> spaces' >> braced)
1617−-- attr' <- registerHeader (lab, classes, kvs) contents
1618−-- return $ headerWith attr' lvl contents
1619−--
1620−-- inlineCommand :: PandocMonad m => LP m Inlines
1621−-- inlineCommand = try $ do
1622−-- (name, raw') <- withRaw anyControlSeq
1623−-- guard $ name /= "begin" && name /= "end"
1624−-- star <- option "" (string "*")
1625−-- let name' = name ++ star
1626−-- let raw = do
1627−-- guard $ not (isBlockCommand name)
1628−-- rawargs <- withRaw
1629−-- (skipangles *> skipopts *> option "" dimenarg *> many braced)
1630−-- let rawcommand = raw' ++ star ++ snd rawargs
1631−-- transformed <- applyMacros' rawcommand
1632−-- exts <- getOption readerExtensions
1633−-- if transformed /= rawcommand
1634−-- then parseFromString' inlines transformed
1635−-- else if extensionEnabled Ext_raw_tex exts
1636−-- then return $ rawInline "latex" rawcommand
1637−-- else ignore rawcommand
1638−-- (lookupListDefault raw [name',name] inlineCommands <*
1639−-- optional (try (string "{}")))
1640−--
1641−-- rawInlineOr :: PandocMonad m => String -> LP m Inlines -> LP m Inlines
1642−-- rawInlineOr name' fallback = do
1643−-- parseRaw <- extensionEnabled Ext_raw_tex <$> getOption readerExtensions
1644−-- if parseRaw
1645−-- then rawInline "latex" <$> getRawCommand name'
1646−-- else fallback
1647−--
1648−-- isBlockCommand :: String -> Bool
1649−-- isBlockCommand s = s `M.member` (blockCommands :: M.Map String (LP PandocPure Blocks))
1650−--
1651−--
1652−-- inlineEnvironments :: PandocMonad m => M.Map String (LP m Inlines)
1653−-- inlineEnvironments = M.fromList
1654−-- [ ("displaymath", mathEnvWith id Nothing "displaymath")
1655−-- , ("math", math <$> mathEnv "math")
1656−-- , ("equation", mathEnvWith id Nothing "equation")
1657−-- , ("equation*", mathEnvWith id Nothing "equation*")
1658−-- , ("gather", mathEnvWith id (Just "gathered") "gather")
1659−-- , ("gather*", mathEnvWith id (Just "gathered") "gather*")
1660−-- , ("multline", mathEnvWith id (Just "gathered") "multline")
1661−-- , ("multline*", mathEnvWith id (Just "gathered") "multline*")
1662−-- , ("eqnarray", mathEnvWith id (Just "aligned") "eqnarray")
1663−-- , ("eqnarray*", mathEnvWith id (Just "aligned") "eqnarray*")
1664−-- , ("align", mathEnvWith id (Just "aligned") "align")
1665−-- , ("align*", mathEnvWith id (Just "aligned") "align*")
1666−-- , ("alignat", mathEnvWith id (Just "aligned") "alignat")
1667−-- , ("alignat*", mathEnvWith id (Just "aligned") "alignat*")
1668−-- ]
1669−--
16701274-- mkImage :: PandocMonad m => [(String, String)] -> String -> LP m Inlines
16711275-- mkImage options src = do
16721276-- let replaceTextwidth (k,v) = case numUnit v of
@@ -1701,236 +1305,6 @@ blocks = mconcat <$> many block
17011305-- emptyOr160 unit,
17021306-- unit]
17031307--
1704−-- accent :: (Char -> String) -> Inlines -> LP m Inlines
1705−-- accent f ils =
1706−-- case toList ils of
1707−-- (Str (x:xs) : ys) -> return $ fromList (Str (f x ++ xs) : ys)
1708−-- [] -> mzero
1709−-- _ -> return ils
1710−--
1711−-- grave :: Char -> String
1712−-- grave 'A' = "À"
1713−-- grave 'E' = "È"
1714−-- grave 'I' = "Ì"
1715−-- grave 'O' = "Ò"
1716−-- grave 'U' = "Ù"
1717−-- grave 'a' = "à"
1718−-- grave 'e' = "è"
1719−-- grave 'i' = "ì"
1720−-- grave 'o' = "ò"
1721−-- grave 'u' = "ù"
1722−-- grave c = [c]
1723−--
1724−-- acute :: Char -> String
1725−-- acute 'A' = "Á"
1726−-- acute 'E' = "É"
1727−-- acute 'I' = "Í"
1728−-- acute 'O' = "Ó"
1729−-- acute 'U' = "Ú"
1730−-- acute 'Y' = "Ý"
1731−-- acute 'a' = "á"
1732−-- acute 'e' = "é"
1733−-- acute 'i' = "í"
1734−-- acute 'o' = "ó"
1735−-- acute 'u' = "ú"
1736−-- acute 'y' = "ý"
1737−-- acute 'C' = "Ć"
1738−-- acute 'c' = "ć"
1739−-- acute 'L' = "Ĺ"
1740−-- acute 'l' = "ĺ"
1741−-- acute 'N' = "Ń"
1742−-- acute 'n' = "ń"
1743−-- acute 'R' = "Ŕ"
1744−-- acute 'r' = "ŕ"
1745−-- acute 'S' = "Ś"
1746−-- acute 's' = "ś"
1747−-- acute 'Z' = "Ź"
1748−-- acute 'z' = "ź"
1749−-- acute c = [c]
1750−--
1751−-- circ :: Char -> String
1752−-- circ 'A' = "Â"
1753−-- circ 'E' = "Ê"
1754−-- circ 'I' = "Î"
1755−-- circ 'O' = "Ô"
1756−-- circ 'U' = "Û"
1757−-- circ 'a' = "â"
1758−-- circ 'e' = "ê"
1759−-- circ 'i' = "î"
1760−-- circ 'o' = "ô"
1761−-- circ 'u' = "û"
1762−-- circ 'C' = "Ĉ"
1763−-- circ 'c' = "ĉ"
1764−-- circ 'G' = "Ĝ"
1765−-- circ 'g' = "ĝ"
1766−-- circ 'H' = "Ĥ"
1767−-- circ 'h' = "ĥ"
1768−-- circ 'J' = "Ĵ"
1769−-- circ 'j' = "ĵ"
1770−-- circ 'S' = "Ŝ"
1771−-- circ 's' = "ŝ"
1772−-- circ 'W' = "Ŵ"
1773−-- circ 'w' = "ŵ"
1774−-- circ 'Y' = "Ŷ"
1775−-- circ 'y' = "ŷ"
1776−-- circ c = [c]
1777−--
1778−-- tilde :: Char -> String
1779−-- tilde 'A' = "Ã"
1780−-- tilde 'a' = "ã"
1781−-- tilde 'O' = "Õ"
1782−-- tilde 'o' = "õ"
1783−-- tilde 'I' = "Ĩ"
1784−-- tilde 'i' = "ĩ"
1785−-- tilde 'U' = "Ũ"
1786−-- tilde 'u' = "ũ"
1787−-- tilde 'N' = "Ñ"
1788−-- tilde 'n' = "ñ"
1789−-- tilde c = [c]
1790−--
1791−-- umlaut :: Char -> String
1792−-- umlaut 'A' = "Ä"
1793−-- umlaut 'E' = "Ë"
1794−-- umlaut 'I' = "Ï"
1795−-- umlaut 'O' = "Ö"
1796−-- umlaut 'U' = "Ü"
1797−-- umlaut 'a' = "ä"
1798−-- umlaut 'e' = "ë"
1799−-- umlaut 'i' = "ï"
1800−-- umlaut 'o' = "ö"
1801−-- umlaut 'u' = "ü"
1802−-- umlaut c = [c]
1803−--
1804−-- hungarumlaut :: Char -> String
1805−-- hungarumlaut 'A' = "A̋"
1806−-- hungarumlaut 'E' = "E̋"
1807−-- hungarumlaut 'I' = "I̋"
1808−-- hungarumlaut 'O' = "Ő"
1809−-- hungarumlaut 'U' = "Ű"
1810−-- hungarumlaut 'Y' = "ӳ"
1811−-- hungarumlaut 'a' = "a̋"
1812−-- hungarumlaut 'e' = "e̋"
1813−-- hungarumlaut 'i' = "i̋"
1814−-- hungarumlaut 'o' = "ő"
1815−-- hungarumlaut 'u' = "ű"
1816−-- hungarumlaut 'y' = "ӳ"
1817−-- hungarumlaut c = [c]
1818−--
1819−-- dot :: Char -> String
1820−-- dot 'C' = "Ċ"
1821−-- dot 'c' = "ċ"
1822−-- dot 'E' = "Ė"
1823−-- dot 'e' = "ė"
1824−-- dot 'G' = "Ġ"
1825−-- dot 'g' = "ġ"
1826−-- dot 'I' = "İ"
1827−-- dot 'Z' = "Ż"
1828−-- dot 'z' = "ż"
1829−-- dot c = [c]
1830−--
1831−-- macron :: Char -> String
1832−-- macron 'A' = "Ā"
1833−-- macron 'E' = "Ē"
1834−-- macron 'I' = "Ī"
1835−-- macron 'O' = "Ō"
1836−-- macron 'U' = "Ū"
1837−-- macron 'a' = "ā"
1838−-- macron 'e' = "ē"
1839−-- macron 'i' = "ī"
1840−-- macron 'o' = "ō"
1841−-- macron 'u' = "ū"
1842−-- macron c = [c]
1843−--
1844−-- cedilla :: Char -> String
1845−-- cedilla 'c' = "ç"
1846−-- cedilla 'C' = "Ç"
1847−-- cedilla 's' = "ş"
1848−-- cedilla 'S' = "Ş"
1849−-- cedilla 't' = "ţ"
1850−-- cedilla 'T' = "Ţ"
1851−-- cedilla 'e' = "ȩ"
1852−-- cedilla 'E' = "Ȩ"
1853−-- cedilla 'h' = "ḩ"
1854−-- cedilla 'H' = "Ḩ"
1855−-- cedilla 'o' = "o̧"
1856−-- cedilla 'O' = "O̧"
1857−-- cedilla c = [c]
1858−--
1859−-- hacek :: Char -> String
1860−-- hacek 'A' = "Ǎ"
1861−-- hacek 'a' = "ǎ"
1862−-- hacek 'C' = "Č"
1863−-- hacek 'c' = "č"
1864−-- hacek 'D' = "Ď"
1865−-- hacek 'd' = "ď"
1866−-- hacek 'E' = "Ě"
1867−-- hacek 'e' = "ě"
1868−-- hacek 'G' = "Ǧ"
1869−-- hacek 'g' = "ǧ"
1870−-- hacek 'H' = "Ȟ"
1871−-- hacek 'h' = "ȟ"
1872−-- hacek 'I' = "Ǐ"
1873−-- hacek 'i' = "ǐ"
1874−-- hacek 'j' = "ǰ"
1875−-- hacek 'K' = "Ǩ"
1876−-- hacek 'k' = "ǩ"
1877−-- hacek 'L' = "Ľ"
1878−-- hacek 'l' = "ľ"
1879−-- hacek 'N' = "Ň"
1880−-- hacek 'n' = "ň"
1881−-- hacek 'O' = "Ǒ"
1882−-- hacek 'o' = "ǒ"
1883−-- hacek 'R' = "Ř"
1884−-- hacek 'r' = "ř"
1885−-- hacek 'S' = "Š"
1886−-- hacek 's' = "š"
1887−-- hacek 'T' = "Ť"
1888−-- hacek 't' = "ť"
1889−-- hacek 'U' = "Ǔ"
1890−-- hacek 'u' = "ǔ"
1891−-- hacek 'Z' = "Ž"
1892−-- hacek 'z' = "ž"
1893−-- hacek c = [c]
1894−--
1895−-- breve :: Char -> String
1896−-- breve 'A' = "Ă"
1897−-- breve 'a' = "ă"
1898−-- breve 'E' = "Ĕ"
1899−-- breve 'e' = "ĕ"
1900−-- breve 'G' = "Ğ"
1901−-- breve 'g' = "ğ"
1902−-- breve 'I' = "Ĭ"
1903−-- breve 'i' = "ĭ"
1904−-- breve 'O' = "Ŏ"
1905−-- breve 'o' = "ŏ"
1906−-- breve 'U' = "Ŭ"
1907−-- breve 'u' = "ŭ"
1908−-- breve c = [c]
1909−--
1910−-- tok :: PandocMonad m => LP m Inlines
1911−-- tok = try $ grouped inline <|> inlineCommand <|> str <$> count 1 inlineChar
1912−--
1913−-- opt :: PandocMonad m => LP m Inlines
1914−-- opt = bracketed inline
1915−--
1916−-- rawopt :: PandocMonad m => LP m String
1917−-- rawopt = do
1918−-- contents <- bracketed (many1 (noneOf "[]") <|> try (string "\\]") <|>
1919−-- try (string "\\[") <|> rawopt)
1920−-- optional sp
1921−-- return $ "[" ++ contents ++ "]"
1922−--
1923−-- skipopts :: PandocMonad m => LP m ()
1924−-- skipopts = skipMany rawopt
1925−--
1926−-- -- opts in angle brackets are used in beamer
1927−-- rawangle :: PandocMonad m => LP m ()
1928−-- rawangle = try $ do
1929−-- char '<'
1930−-- skipMany (noneOf ">")
1931−-- char '>'
1932−-- return ()
1933−--
19341308-- skipangles :: PandocMonad m => LP m ()
19351309-- skipangles = skipMany rawangle
19361310--
@@ -1988,21 +1362,6 @@ blocks = mconcat <$> many block
19881362--
19891363-- ----
19901364--
1991−-- ----
1992−--
1993−-- keyval :: PandocMonad m => LP m (String, String)
1994−-- keyval = try $ do
1995−-- key <- many1 alphaNum
1996−-- val <- option "" $ char '=' >> braced <|> (many1 (alphaNum <|> oneOf ".:-|\\"))
1997−-- skipMany spaceChar
1998−-- optional (char ',')
1999−-- skipMany spaceChar
2000−-- return (key, val)
2001−--
2002−--
2003−-- keyvals :: PandocMonad m => LP m [(String, String)]
2004−-- keyvals = try $ char '[' *> manyTill keyval (char ']')
2005−--
20061365-- alltt :: PandocMonad m => String -> LP m Blocks
20071366-- alltt t = walk strToCode <$> parseFromString' blocks
20081367-- (substitute " " "\\ " $ substitute "%" "\\%" $