Moved Pandoc prettyprinting code from Shared to new Native writer.
+ Text.Pandoc.Writers.Native + The function prettyPandoc is now gone. Use writeNative instead.
This commit is contained in:
parent
998fd098d0
commit
3548bf6d9c
5 changed files with 90 additions and 58 deletions
|
@ -173,6 +173,7 @@ Library
|
||||||
Text.Pandoc.Readers.Markdown,
|
Text.Pandoc.Readers.Markdown,
|
||||||
Text.Pandoc.Readers.RST,
|
Text.Pandoc.Readers.RST,
|
||||||
Text.Pandoc.Readers.TeXMath,
|
Text.Pandoc.Readers.TeXMath,
|
||||||
|
Text.Pandoc.Writers.Native,
|
||||||
Text.Pandoc.Writers.Docbook,
|
Text.Pandoc.Writers.Docbook,
|
||||||
Text.Pandoc.Writers.HTML,
|
Text.Pandoc.Writers.HTML,
|
||||||
Text.Pandoc.Writers.LaTeX,
|
Text.Pandoc.Writers.LaTeX,
|
||||||
|
|
|
@ -71,6 +71,7 @@ module Text.Pandoc
|
||||||
, NoteTable
|
, NoteTable
|
||||||
, HeaderType (..)
|
, HeaderType (..)
|
||||||
-- * Writers: converting /from/ Pandoc format
|
-- * Writers: converting /from/ Pandoc format
|
||||||
|
, writeNative
|
||||||
, writeMarkdown
|
, writeMarkdown
|
||||||
, writePlain
|
, writePlain
|
||||||
, writeRST
|
, writeRST
|
||||||
|
@ -88,7 +89,6 @@ module Text.Pandoc
|
||||||
, writeRTF
|
, writeRTF
|
||||||
, writeODT
|
, writeODT
|
||||||
, writeEPUB
|
, writeEPUB
|
||||||
, prettyPandoc
|
|
||||||
-- * Writer options used in writers
|
-- * Writer options used in writers
|
||||||
, WriterOptions (..)
|
, WriterOptions (..)
|
||||||
, HTMLMathMethod (..)
|
, HTMLMathMethod (..)
|
||||||
|
@ -104,6 +104,7 @@ import Text.Pandoc.Readers.Markdown
|
||||||
import Text.Pandoc.Readers.RST
|
import Text.Pandoc.Readers.RST
|
||||||
import Text.Pandoc.Readers.LaTeX
|
import Text.Pandoc.Readers.LaTeX
|
||||||
import Text.Pandoc.Readers.HTML
|
import Text.Pandoc.Readers.HTML
|
||||||
|
import Text.Pandoc.Writers.Native
|
||||||
import Text.Pandoc.Writers.Markdown
|
import Text.Pandoc.Writers.Markdown
|
||||||
import Text.Pandoc.Writers.RST
|
import Text.Pandoc.Writers.RST
|
||||||
import Text.Pandoc.Writers.LaTeX
|
import Text.Pandoc.Writers.LaTeX
|
||||||
|
|
|
@ -54,7 +54,6 @@ module Text.Pandoc.Shared (
|
||||||
tabFilter,
|
tabFilter,
|
||||||
-- * Prettyprinting
|
-- * Prettyprinting
|
||||||
hang',
|
hang',
|
||||||
prettyPandoc,
|
|
||||||
-- * Pandoc block and inline list processing
|
-- * Pandoc block and inline list processing
|
||||||
orderedListMarkers,
|
orderedListMarkers,
|
||||||
normalizeSpaces,
|
normalizeSpaces,
|
||||||
|
@ -293,57 +292,6 @@ tabFilter tabStop =
|
||||||
hang' :: Doc -> Int -> Doc -> Doc
|
hang' :: Doc -> Int -> Doc -> Doc
|
||||||
hang' d1 n d2 = d1 $$ (nest n d2)
|
hang' d1 n d2 = d1 $$ (nest n d2)
|
||||||
|
|
||||||
-- | Indent string as a block.
|
|
||||||
indentBy :: Int -- ^ Number of spaces to indent the block
|
|
||||||
-> Int -- ^ Number of spaces (rel to block) to indent first line
|
|
||||||
-> String -- ^ Contents of block to indent
|
|
||||||
-> String
|
|
||||||
indentBy _ _ [] = ""
|
|
||||||
indentBy num first str =
|
|
||||||
let (firstLine:restLines) = lines str
|
|
||||||
firstLineIndent = num + first
|
|
||||||
in (replicate firstLineIndent ' ') ++ firstLine ++ "\n" ++
|
|
||||||
(intercalate "\n" $ map ((replicate num ' ') ++ ) restLines)
|
|
||||||
|
|
||||||
-- | Prettyprint list of Pandoc blocks elements.
|
|
||||||
prettyBlockList :: Int -- ^ Number of spaces to indent list of blocks
|
|
||||||
-> [Block] -- ^ List of blocks
|
|
||||||
-> String
|
|
||||||
prettyBlockList indent [] = indentBy indent 0 "[]"
|
|
||||||
prettyBlockList indent blocks = indentBy indent (-2) $ "[ " ++
|
|
||||||
(intercalate "\n, " (map prettyBlock blocks)) ++ " ]"
|
|
||||||
|
|
||||||
-- | Prettyprint Pandoc block element.
|
|
||||||
prettyBlock :: Block -> String
|
|
||||||
prettyBlock (BlockQuote blocks) = "BlockQuote\n " ++
|
|
||||||
(prettyBlockList 2 blocks)
|
|
||||||
prettyBlock (OrderedList attribs blockLists) =
|
|
||||||
"OrderedList " ++ show attribs ++ "\n" ++ indentBy 2 0 ("[ " ++
|
|
||||||
(intercalate ", " $ map (\blocks -> prettyBlockList 2 blocks)
|
|
||||||
blockLists)) ++ " ]"
|
|
||||||
prettyBlock (BulletList blockLists) = "BulletList\n" ++
|
|
||||||
indentBy 2 0 ("[ " ++ (intercalate ", "
|
|
||||||
(map (\blocks -> prettyBlockList 2 blocks) blockLists))) ++ " ]"
|
|
||||||
prettyBlock (DefinitionList items) = "DefinitionList\n" ++
|
|
||||||
indentBy 2 0 ("[ " ++ (intercalate "\n, "
|
|
||||||
(map (\(term, defs) -> "(" ++ show term ++ ",\n" ++
|
|
||||||
indentBy 3 0 ("[ " ++ (intercalate ", "
|
|
||||||
(map (\blocks -> prettyBlockList 2 blocks) defs)) ++ "]") ++
|
|
||||||
")") items))) ++ " ]"
|
|
||||||
prettyBlock (Table caption aligns widths header rows) =
|
|
||||||
"Table " ++ show caption ++ " " ++ show aligns ++ " " ++
|
|
||||||
show widths ++ "\n" ++ prettyRow header ++ " [\n" ++
|
|
||||||
(intercalate ",\n" (map prettyRow rows)) ++ " ]"
|
|
||||||
where prettyRow cols = indentBy 2 0 ("[ " ++ (intercalate ", "
|
|
||||||
(map (\blocks -> prettyBlockList 2 blocks)
|
|
||||||
cols))) ++ " ]"
|
|
||||||
prettyBlock block = show block
|
|
||||||
|
|
||||||
-- | Prettyprint Pandoc document.
|
|
||||||
prettyPandoc :: Pandoc -> String
|
|
||||||
prettyPandoc (Pandoc meta blocks) = "Pandoc " ++ "(" ++ show meta ++
|
|
||||||
")\n" ++ (prettyBlockList 0 blocks) ++ "\n"
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Pandoc block and inline list processing
|
-- Pandoc block and inline list processing
|
||||||
--
|
--
|
||||||
|
|
86
src/Text/Pandoc/Writers/Native.hs
Normal file
86
src/Text/Pandoc/Writers/Native.hs
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
{-
|
||||||
|
Copyright (C) 2006-2010 John MacFarlane <jgm@berkeley.edu>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
-}
|
||||||
|
|
||||||
|
{- |
|
||||||
|
Module : Text.Pandoc.Writers.Native
|
||||||
|
Copyright : Copyright (C) 2006-2010 John MacFarlane
|
||||||
|
License : GNU GPL, version 2 or above
|
||||||
|
|
||||||
|
Maintainer : John MacFarlane <jgm@berkeley.edu>
|
||||||
|
Stability : alpha
|
||||||
|
Portability : portable
|
||||||
|
|
||||||
|
Utility functions and definitions used by the various Pandoc modules.
|
||||||
|
-}
|
||||||
|
module Text.Pandoc.Writers.Native ( writeNative )
|
||||||
|
where
|
||||||
|
import Text.Pandoc.Shared ( WriterOptions )
|
||||||
|
import Data.List ( intercalate )
|
||||||
|
import Text.Pandoc.Definition
|
||||||
|
|
||||||
|
-- | Indent string as a block.
|
||||||
|
indentBy :: Int -- ^ Number of spaces to indent the block
|
||||||
|
-> Int -- ^ Number of spaces (rel to block) to indent first line
|
||||||
|
-> String -- ^ Contents of block to indent
|
||||||
|
-> String
|
||||||
|
indentBy _ _ [] = ""
|
||||||
|
indentBy num first str =
|
||||||
|
let (firstLine:restLines) = lines str
|
||||||
|
firstLineIndent = num + first
|
||||||
|
in (replicate firstLineIndent ' ') ++ firstLine ++ "\n" ++
|
||||||
|
(intercalate "\n" $ map ((replicate num ' ') ++ ) restLines)
|
||||||
|
|
||||||
|
-- | Prettyprint list of Pandoc blocks elements.
|
||||||
|
prettyBlockList :: Int -- ^ Number of spaces to indent list of blocks
|
||||||
|
-> [Block] -- ^ List of blocks
|
||||||
|
-> String
|
||||||
|
prettyBlockList indent [] = indentBy indent 0 "[]"
|
||||||
|
prettyBlockList indent blocks = indentBy indent (-2) $ "[ " ++
|
||||||
|
(intercalate "\n, " (map prettyBlock blocks)) ++ " ]"
|
||||||
|
|
||||||
|
-- | Prettyprint Pandoc block element.
|
||||||
|
prettyBlock :: Block -> String
|
||||||
|
prettyBlock (BlockQuote blocks) = "BlockQuote\n " ++
|
||||||
|
(prettyBlockList 2 blocks)
|
||||||
|
prettyBlock (OrderedList attribs blockLists) =
|
||||||
|
"OrderedList " ++ show attribs ++ "\n" ++ indentBy 2 0 ("[ " ++
|
||||||
|
(intercalate ", " $ map (\blocks -> prettyBlockList 2 blocks)
|
||||||
|
blockLists)) ++ " ]"
|
||||||
|
prettyBlock (BulletList blockLists) = "BulletList\n" ++
|
||||||
|
indentBy 2 0 ("[ " ++ (intercalate ", "
|
||||||
|
(map (\blocks -> prettyBlockList 2 blocks) blockLists))) ++ " ]"
|
||||||
|
prettyBlock (DefinitionList items) = "DefinitionList\n" ++
|
||||||
|
indentBy 2 0 ("[ " ++ (intercalate "\n, "
|
||||||
|
(map (\(term, defs) -> "(" ++ show term ++ ",\n" ++
|
||||||
|
indentBy 3 0 ("[ " ++ (intercalate ", "
|
||||||
|
(map (\blocks -> prettyBlockList 2 blocks) defs)) ++ "]") ++
|
||||||
|
")") items))) ++ " ]"
|
||||||
|
prettyBlock (Table caption aligns widths header rows) =
|
||||||
|
"Table " ++ show caption ++ " " ++ show aligns ++ " " ++
|
||||||
|
show widths ++ "\n" ++ prettyRow header ++ " [\n" ++
|
||||||
|
(intercalate ",\n" (map prettyRow rows)) ++ " ]"
|
||||||
|
where prettyRow cols = indentBy 2 0 ("[ " ++ (intercalate ", "
|
||||||
|
(map (\blocks -> prettyBlockList 2 blocks)
|
||||||
|
cols))) ++ " ]"
|
||||||
|
prettyBlock block = show block
|
||||||
|
|
||||||
|
-- | Prettyprint Pandoc document.
|
||||||
|
writeNative :: WriterOptions -> Pandoc -> String
|
||||||
|
writeNative _ (Pandoc meta blocks) = "Pandoc " ++ "(" ++ show meta ++
|
||||||
|
")\n" ++ (prettyBlockList 0 blocks) ++ "\n"
|
||||||
|
|
|
@ -102,7 +102,7 @@ readPandoc _ = read
|
||||||
|
|
||||||
-- | Association list of formats and writers.
|
-- | Association list of formats and writers.
|
||||||
writers :: [ ( String, WriterOptions -> Pandoc -> String ) ]
|
writers :: [ ( String, WriterOptions -> Pandoc -> String ) ]
|
||||||
writers = [("native" , writeDoc)
|
writers = [("native" , writeNative)
|
||||||
,("html" , writeHtmlString)
|
,("html" , writeHtmlString)
|
||||||
,("html+lhs" , writeHtmlString)
|
,("html+lhs" , writeHtmlString)
|
||||||
,("s5" , writeS5String)
|
,("s5" , writeS5String)
|
||||||
|
@ -127,10 +127,6 @@ writers = [("native" , writeDoc)
|
||||||
isNonTextOutput :: String -> Bool
|
isNonTextOutput :: String -> Bool
|
||||||
isNonTextOutput = (`elem` ["odt","epub"])
|
isNonTextOutput = (`elem` ["odt","epub"])
|
||||||
|
|
||||||
-- | Writer for Pandoc native format.
|
|
||||||
writeDoc :: WriterOptions -> Pandoc -> String
|
|
||||||
writeDoc _ = prettyPandoc
|
|
||||||
|
|
||||||
headerShift :: Int -> Pandoc -> Pandoc
|
headerShift :: Int -> Pandoc -> Pandoc
|
||||||
headerShift n = processWith shift
|
headerShift n = processWith shift
|
||||||
where shift :: Block -> Block
|
where shift :: Block -> Block
|
||||||
|
|
Loading…
Reference in a new issue