summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2011-01-19 18:36:27 -0800
committerJohn MacFarlane <jgm@berkeley.edu>2011-01-19 18:36:27 -0800
commite1f3c6058e1c5e3211ed5d5ee317ab9432da11d8 (patch)
treeff81cad9df656c18324d57613229ff19a9307228
parente647f761eddaabd2c8f956b83bfee13f566a3344 (diff)
Added Text.Pandoc.Readers.Native (readNative).
readNative can now read full pandoc documents, block lists, blocks, inline lists, or inlines. It will interpret Str "hi" as if it were Pandoc (Meta [] [] []) [Plain [Str "hi"]] This should make testing easier.
-rw-r--r--pandoc.cabal1
-rw-r--r--src/Text/Pandoc.hs3
-rw-r--r--src/Text/Pandoc/Readers/Native.hs80
3 files changed, 83 insertions, 1 deletions
diff --git a/pandoc.cabal b/pandoc.cabal
index 2c0596318..29ad52a39 100644
--- a/pandoc.cabal
+++ b/pandoc.cabal
@@ -234,6 +234,7 @@ Library
Text.Pandoc.Readers.RST,
Text.Pandoc.Readers.TeXMath,
Text.Pandoc.Readers.Textile,
+ Text.Pandoc.Readers.Native,
Text.Pandoc.Writers.Native,
Text.Pandoc.Writers.Docbook,
Text.Pandoc.Writers.HTML,
diff --git a/src/Text/Pandoc.hs b/src/Text/Pandoc.hs
index dd1b3892d..de41bcbc8 100644
--- a/src/Text/Pandoc.hs
+++ b/src/Text/Pandoc.hs
@@ -114,6 +114,7 @@ import Text.Pandoc.Readers.RST
import Text.Pandoc.Readers.LaTeX
import Text.Pandoc.Readers.HTML
import Text.Pandoc.Readers.Textile
+import Text.Pandoc.Readers.Native
import Text.Pandoc.Writers.Native
import Text.Pandoc.Writers.Markdown
import Text.Pandoc.Writers.RST
@@ -143,7 +144,7 @@ pandocVersion = showVersion version
-- | Association list of formats and readers.
readers :: [(String, ParserState -> String -> Pandoc)]
-readers = [("native" , \_ -> read)
+readers = [("native" , \_ -> readNative)
,("json" , \_ -> decodeJSON)
,("markdown" , readMarkdown)
,("markdown+lhs" , \st ->
diff --git a/src/Text/Pandoc/Readers/Native.hs b/src/Text/Pandoc/Readers/Native.hs
new file mode 100644
index 000000000..123ac561d
--- /dev/null
+++ b/src/Text/Pandoc/Readers/Native.hs
@@ -0,0 +1,80 @@
+{-
+Copyright (C) 2011 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.Readers.Native
+ Copyright : Copyright (C) 2011 John MacFarlane
+ License : GNU GPL, version 2 or above
+
+ Maintainer : John MacFarlane <jgm@berkeley.edu>
+ Stability : alpha
+ Portability : portable
+
+Conversion of native 'Pandoc' formatted text to a 'Pandoc' document.
+-}
+module Text.Pandoc.Readers.Native ( readNative ) where
+
+import Text.Pandoc.Definition
+
+nullMeta :: Meta
+nullMeta = Meta{ docTitle = []
+ , docAuthors = []
+ , docDate = []
+ }
+
+-- | Read native formatted text and return a Pandoc document.
+-- The input may be a full pandoc document, a block list, a block,
+-- an inline list, or an inline. Thus, for example,
+--
+-- > Str "hi"
+--
+-- will be treated as if it were
+--
+-- > Pandoc (Meta [] [] []) [Plain [Str "hi"]]
+--
+readNative :: String -- ^ String to parse (assuming @'\n'@ line endings)
+ -> Pandoc
+readNative s =
+ case reads s of
+ (d,_):_ -> d
+ [] -> Pandoc nullMeta $ readBlocks s
+
+readBlocks :: String -> [Block]
+readBlocks s =
+ case reads s of
+ (d,_):_ -> d
+ [] -> [readBlock s]
+
+readBlock :: String -> Block
+readBlock s =
+ case reads s of
+ (d,_):_ -> d
+ [] -> Plain $ readInlines s
+
+readInlines :: String -> [Inline]
+readInlines s =
+ case reads s of
+ (d,_):_ -> d
+ [] -> [readInline s]
+
+readInline :: String -> Inline
+readInline s =
+ case reads s of
+ (d,_):_ -> d
+ [] -> error "Cannot parse document"
+