git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: Support simple tables.
d891b2cJohn MacFarlane
src/Text/Pandoc/Readers/LaTeX.hs+58
@@ -160,6 +160,7 @@ block = choice [ hrule
160 , header
160 , header
161 , list
161 , list
162 , blockQuote
162 , blockQuote
163+ , simpleTable
163 , commentBlock
164 , commentBlock
164 , macro
165 , macro
165 , bibliographic
166 , bibliographic
@@ -215,6 +216,63 @@ hrule :: GenParser Char st Block
215hrule = oneOfStrings [ "\\begin{center}\\rule{3in}{0.4pt}\\end{center}\n\n",
216hrule = oneOfStrings [ "\\begin{center}\\rule{3in}{0.4pt}\\end{center}\n\n",
216 "\\newpage" ] >> spaces >> return HorizontalRule
217 "\\newpage" ] >> spaces >> return HorizontalRule
217
218
219+-- tables
220+
221+simpleTable :: GenParser Char ParserState Block
222+simpleTable = try $ do
223+ string "\\begin"
224+ spaces
225+ string "{tabular}"
226+ spaces
227+ aligns <- parseAligns
228+ let cols = length aligns
229+ optional hline
230+ header' <- option [] $ parseTableHeader cols
231+ rows <- many (parseTableRow cols >>~ optional hline)
232+ spaces
233+ end "tabular"
234+ spaces
235+ let header'' = if null header'
236+ then replicate cols []
237+ else header'
238+ return $ Table [] aligns (replicate cols 0) header'' rows
239+
240+hline :: GenParser Char st ()
241+hline = try $ spaces >> string "\\hline" >> return ()
242+
243+parseAligns :: GenParser Char ParserState [Alignment]
244+parseAligns = try $ do
245+ char '{'
246+ optional $ char '|'
247+ let cAlign = char 'c' >> return AlignCenter
248+ let lAlign = char 'l' >> return AlignLeft
249+ let rAlign = char 'r' >> return AlignRight
250+ let alignChar = cAlign <|> lAlign <|> rAlign
251+ aligns' <- sepEndBy alignChar (optional $ char '|')
252+ char '}'
253+ spaces
254+ return aligns'
255+
256+parseTableHeader :: Int -- ^ number of columns
257+ -> GenParser Char ParserState [TableCell]
258+parseTableHeader cols = try $ do
259+ cells' <- parseTableRow cols
260+ hline
261+ return cells'
262+
263+parseTableRow :: Int -- ^ number of columns
264+ -> GenParser Char ParserState [TableCell]
265+parseTableRow cols = try $ do
266+ let tableCellInline = notFollowedBy (char '&' <|>
267+ (try $ char '\\' >> char '\\')) >> inline
268+ cells' <- sepBy (spaces >> liftM ((:[]) . Plain . normalizeSpaces)
269+ (many tableCellInline)) (char '&')
270+ guard $ length cells' == cols
271+ spaces
272+ (try $ string "\\\\" >> spaces) <|>
273+ (lookAhead (end "tabular") >> return ())
274+ return cells'
275+
218--
276--
219-- code blocks
277-- code blocks
220--
278--
tests/latex-reader.native+7−1
@@ -287,7 +287,13 @@ Pandoc (Meta {docTitle = [Str "Pandoc",Space,Str "Test",Space,Str "Suite"], docA
287 , [ Para [Str "$",Str "22,000",Space,Str "is",Space,Str "a",Space,Emph [Str "lot"],Space,Str "of",Space,Str "money.",Space,Str "So",Space,Str "is",Space,Str "$",Str "34,000.",Space,Str "(It",Space,Str "worked",Space,Str "if",Space,Quoted DoubleQuote [Str "lot"],Space,Str "is",Space,Str "emphasized.)"] ]
287 , [ Para [Str "$",Str "22,000",Space,Str "is",Space,Str "a",Space,Emph [Str "lot"],Space,Str "of",Space,Str "money.",Space,Str "So",Space,Str "is",Space,Str "$",Str "34,000.",Space,Str "(It",Space,Str "worked",Space,Str "if",Space,Quoted DoubleQuote [Str "lot"],Space,Str "is",Space,Str "emphasized.)"] ]
288 , [ Para [Str "Escaped",Space,Code "$",Str ":",Space,Str "$",Str "73",Space,Emph [Str "this",Space,Str "should",Space,Str "be",Space,Str "emphasized"],Space,Str "23",Str "$",Str "."] ] ]
288 , [ Para [Str "Escaped",Space,Code "$",Str ":",Space,Str "$",Str "73",Space,Emph [Str "this",Space,Str "should",Space,Str "be",Space,Str "emphasized"],Space,Str "23",Str "$",Str "."] ] ]
289, Para [Str "Here",Apostrophe,Str "s",Space,Str "a",Space,Str "LaTeX",Space,Str "table:"]
289, Para [Str "Here",Apostrophe,Str "s",Space,Str "a",Space,Str "LaTeX",Space,Str "table:"]
290−, Para [TeX "\\begin{tabular}{|l|l|}\\hline\nAnimal & Number \\\\ \\hline\nDog & 2 \\\\\nCat & 1 \\\\ \\hline\n\\end{tabular}"]
290+, Table [] [AlignLeft,AlignLeft] [0.0,0.0]
291+ [ [ Plain [Str "Animal"] ]
292+ , [ Plain [Str "Number"] ] ] [
293+ [ [ Plain [Str "Dog"] ]
294+ , [ Plain [Str "2"] ] ],
295+ [ [ Plain [Str "Cat"] ]
296+ , [ Plain [Str "1"] ] ] ]
291, HorizontalRule
297, HorizontalRule
292, Header 1 [Str "Special",Space,Str "Characters"]
298, Header 1 [Str "Special",Space,Str "Characters"]
293, Para [Str "Here",Space,Str "is",Space,Str "some",Space,Str "unicode:"]
299, Para [Str "Here",Space,Str "is",Space,Str "some",Space,Str "unicode:"]