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.RST,
|
||||
Text.Pandoc.Readers.TeXMath,
|
||||
Text.Pandoc.Writers.Native,
|
||||
Text.Pandoc.Writers.Docbook,
|
||||
Text.Pandoc.Writers.HTML,
|
||||
Text.Pandoc.Writers.LaTeX,
|
||||
|
|
|
@ -71,6 +71,7 @@ module Text.Pandoc
|
|||
, NoteTable
|
||||
, HeaderType (..)
|
||||
-- * Writers: converting /from/ Pandoc format
|
||||
, writeNative
|
||||
, writeMarkdown
|
||||
, writePlain
|
||||
, writeRST
|
||||
|
@ -88,7 +89,6 @@ module Text.Pandoc
|
|||
, writeRTF
|
||||
, writeODT
|
||||
, writeEPUB
|
||||
, prettyPandoc
|
||||
-- * Writer options used in writers
|
||||
, WriterOptions (..)
|
||||
, HTMLMathMethod (..)
|
||||
|
@ -104,6 +104,7 @@ import Text.Pandoc.Readers.Markdown
|
|||
import Text.Pandoc.Readers.RST
|
||||
import Text.Pandoc.Readers.LaTeX
|
||||
import Text.Pandoc.Readers.HTML
|
||||
import Text.Pandoc.Writers.Native
|
||||
import Text.Pandoc.Writers.Markdown
|
||||
import Text.Pandoc.Writers.RST
|
||||
import Text.Pandoc.Writers.LaTeX
|
||||
|
|
|
@ -54,7 +54,6 @@ module Text.Pandoc.Shared (
|
|||
tabFilter,
|
||||
-- * Prettyprinting
|
||||
hang',
|
||||
prettyPandoc,
|
||||
-- * Pandoc block and inline list processing
|
||||
orderedListMarkers,
|
||||
normalizeSpaces,
|
||||
|
@ -293,57 +292,6 @@ tabFilter tabStop =
|
|||
hang' :: Doc -> Int -> Doc -> Doc
|
||||
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
|
||||
--
|
||||
|
|
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.
|
||||
writers :: [ ( String, WriterOptions -> Pandoc -> String ) ]
|
||||
writers = [("native" , writeDoc)
|
||||
writers = [("native" , writeNative)
|
||||
,("html" , writeHtmlString)
|
||||
,("html+lhs" , writeHtmlString)
|
||||
,("s5" , writeS5String)
|
||||
|
@ -127,10 +127,6 @@ writers = [("native" , writeDoc)
|
|||
isNonTextOutput :: String -> Bool
|
||||
isNonTextOutput = (`elem` ["odt","epub"])
|
||||
|
||||
-- | Writer for Pandoc native format.
|
||||
writeDoc :: WriterOptions -> Pandoc -> String
|
||||
writeDoc _ = prettyPandoc
|
||||
|
||||
headerShift :: Int -> Pandoc -> Pandoc
|
||||
headerShift n = processWith shift
|
||||
where shift :: Block -> Block
|
||||
|
|
Loading…
Reference in a new issue