Added Text.Pandoc.Writers.OPML.
TODO: * Document in README * Add tests * Add template (and add template to cabal file)
This commit is contained in:
parent
8aa6172380
commit
69acb47a34
5 changed files with 95 additions and 2 deletions
|
@ -18,7 +18,7 @@ Description: Pandoc is a Haskell library for converting from one markup
|
||||||
this library. It can read markdown and (subsets of) HTML,
|
this library. It can read markdown and (subsets of) HTML,
|
||||||
reStructuredText, LaTeX, DocBook, MediaWiki markup, OPML,
|
reStructuredText, LaTeX, DocBook, MediaWiki markup, OPML,
|
||||||
and Textile, and it can write markdown, reStructuredText,
|
and Textile, and it can write markdown, reStructuredText,
|
||||||
HTML, LaTeX, ConTeXt, Docbook, OpenDocument, ODT,
|
HTML, LaTeX, ConTeXt, Docbook, OPML, OpenDocument, ODT,
|
||||||
Word docx, RTF, MediaWiki, Textile, groff man pages,
|
Word docx, RTF, MediaWiki, Textile, groff man pages,
|
||||||
plain text, Emacs Org-Mode, AsciiDoc, EPUB (v2 and v3),
|
plain text, Emacs Org-Mode, AsciiDoc, EPUB (v2 and v3),
|
||||||
FictionBook2, and S5, Slidy and Slideous HTML slide shows.
|
FictionBook2, and S5, Slidy and Slideous HTML slide shows.
|
||||||
|
@ -286,6 +286,7 @@ Library
|
||||||
Text.Pandoc.Readers.Native,
|
Text.Pandoc.Readers.Native,
|
||||||
Text.Pandoc.Writers.Native,
|
Text.Pandoc.Writers.Native,
|
||||||
Text.Pandoc.Writers.Docbook,
|
Text.Pandoc.Writers.Docbook,
|
||||||
|
Text.Pandoc.Writers.OPML,
|
||||||
Text.Pandoc.Writers.HTML,
|
Text.Pandoc.Writers.HTML,
|
||||||
Text.Pandoc.Writers.LaTeX,
|
Text.Pandoc.Writers.LaTeX,
|
||||||
Text.Pandoc.Writers.ConTeXt,
|
Text.Pandoc.Writers.ConTeXt,
|
||||||
|
|
|
@ -802,6 +802,7 @@ defaultWriterName x =
|
||||||
".asciidoc" -> "asciidoc"
|
".asciidoc" -> "asciidoc"
|
||||||
".pdf" -> "latex"
|
".pdf" -> "latex"
|
||||||
".fb2" -> "fb2"
|
".fb2" -> "fb2"
|
||||||
|
".opml" -> "opml"
|
||||||
['.',y] | y `elem` ['1'..'9'] -> "man"
|
['.',y] | y `elem` ['1'..'9'] -> "man"
|
||||||
_ -> "html"
|
_ -> "html"
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,7 @@ module Text.Pandoc
|
||||||
, writeHtml
|
, writeHtml
|
||||||
, writeHtmlString
|
, writeHtmlString
|
||||||
, writeDocbook
|
, writeDocbook
|
||||||
|
, writeOPML
|
||||||
, writeOpenDocument
|
, writeOpenDocument
|
||||||
, writeMan
|
, writeMan
|
||||||
, writeMediaWiki
|
, writeMediaWiki
|
||||||
|
@ -131,6 +132,7 @@ import Text.Pandoc.Writers.Docx
|
||||||
import Text.Pandoc.Writers.EPUB
|
import Text.Pandoc.Writers.EPUB
|
||||||
import Text.Pandoc.Writers.FB2
|
import Text.Pandoc.Writers.FB2
|
||||||
import Text.Pandoc.Writers.Docbook
|
import Text.Pandoc.Writers.Docbook
|
||||||
|
import Text.Pandoc.Writers.OPML
|
||||||
import Text.Pandoc.Writers.OpenDocument
|
import Text.Pandoc.Writers.OpenDocument
|
||||||
import Text.Pandoc.Writers.Man
|
import Text.Pandoc.Writers.Man
|
||||||
import Text.Pandoc.Writers.RTF
|
import Text.Pandoc.Writers.RTF
|
||||||
|
@ -230,6 +232,7 @@ writers = [
|
||||||
writeHtmlString o{ writerSlideVariant = DZSlides
|
writeHtmlString o{ writerSlideVariant = DZSlides
|
||||||
, writerHtml5 = True })
|
, writerHtml5 = True })
|
||||||
,("docbook" , PureStringWriter writeDocbook)
|
,("docbook" , PureStringWriter writeDocbook)
|
||||||
|
,("opml" , PureStringWriter writeOPML)
|
||||||
,("opendocument" , PureStringWriter writeOpenDocument)
|
,("opendocument" , PureStringWriter writeOpenDocument)
|
||||||
,("latex" , PureStringWriter writeLaTeX)
|
,("latex" , PureStringWriter writeLaTeX)
|
||||||
,("beamer" , PureStringWriter $ \o ->
|
,("beamer" , PureStringWriter $ \o ->
|
||||||
|
|
81
src/Text/Pandoc/Writers/OPML.hs
Normal file
81
src/Text/Pandoc/Writers/OPML.hs
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
{-
|
||||||
|
Copyright (C) 2013 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.OPML
|
||||||
|
Copyright : Copyright (C) 2013 John MacFarlane
|
||||||
|
License : GNU GPL, version 2 or above
|
||||||
|
|
||||||
|
Maintainer : John MacFarlane <jgm@berkeley.edu>
|
||||||
|
Stability : alpha
|
||||||
|
Portability : portable
|
||||||
|
|
||||||
|
Conversion of 'Pandoc' documents to OPML XML.
|
||||||
|
-}
|
||||||
|
module Text.Pandoc.Writers.OPML ( writeOPML) where
|
||||||
|
import Text.Pandoc.Definition
|
||||||
|
import Text.Pandoc.XML
|
||||||
|
import Text.Pandoc.Shared
|
||||||
|
import Text.Pandoc.Options
|
||||||
|
import Text.Pandoc.Templates (renderTemplate)
|
||||||
|
import Text.Pandoc.Writers.HTML (writeHtmlString)
|
||||||
|
import Text.Pandoc.Writers.Markdown (writeMarkdown)
|
||||||
|
import Data.List ( intercalate )
|
||||||
|
import Text.Pandoc.Pretty
|
||||||
|
|
||||||
|
-- | Convert Pandoc document to string in OPML format.
|
||||||
|
writeOPML :: WriterOptions -> Pandoc -> String
|
||||||
|
writeOPML opts (Pandoc (Meta tit auths dat) blocks) =
|
||||||
|
let title = writeHtmlInlines tit
|
||||||
|
author = writeHtmlInlines $ intercalate [Space,Str ";",Space] auths
|
||||||
|
date = trim $ writeHtmlInlines dat
|
||||||
|
elements = hierarchicalize blocks
|
||||||
|
colwidth = if writerWrapText opts
|
||||||
|
then Just $ writerColumns opts
|
||||||
|
else Nothing
|
||||||
|
render' = render colwidth
|
||||||
|
main = render' $ vcat (map (elementToOPML opts) elements)
|
||||||
|
context = writerVariables opts ++
|
||||||
|
[ ("body", main)
|
||||||
|
, ("title", title)
|
||||||
|
, ("date", date)
|
||||||
|
, ("author", author) ]
|
||||||
|
in if writerStandalone opts
|
||||||
|
then renderTemplate context $ writerTemplate opts
|
||||||
|
else main
|
||||||
|
|
||||||
|
writeHtmlInlines :: [Inline] -> String
|
||||||
|
writeHtmlInlines ils = trim $ writeHtmlString def
|
||||||
|
$ Pandoc (Meta [] [] []) [Plain ils]
|
||||||
|
|
||||||
|
-- | Convert an Element to OPML.
|
||||||
|
elementToOPML :: WriterOptions -> Element -> Doc
|
||||||
|
elementToOPML _ (Blk _) = empty
|
||||||
|
elementToOPML opts (Sec _ _num _ title elements) =
|
||||||
|
let isBlk (Blk _) = True
|
||||||
|
isBlk _ = False
|
||||||
|
fromBlk (Blk x) = x
|
||||||
|
fromBlk _ = error "fromBlk called on non-block"
|
||||||
|
(blocks, rest) = span isBlk elements
|
||||||
|
attrs = [("text", writeHtmlInlines title)] ++
|
||||||
|
[("_note", writeMarkdown opts (Pandoc (Meta [] [] [])
|
||||||
|
(map fromBlk blocks)))
|
||||||
|
| not (null blocks)]
|
||||||
|
in inTags True "outline" attrs $
|
||||||
|
vcat (map (elementToOPML opts) rest)
|
||||||
|
|
|
@ -64,11 +64,18 @@ escapeCharForXML x = case x of
|
||||||
escapeStringForXML :: String -> String
|
escapeStringForXML :: String -> String
|
||||||
escapeStringForXML = concatMap escapeCharForXML
|
escapeStringForXML = concatMap escapeCharForXML
|
||||||
|
|
||||||
|
-- | Escape newline characters as
|
||||||
|
escapeNls :: String -> String
|
||||||
|
escapeNls (x:xs)
|
||||||
|
| x == '\n' = " " ++ escapeNls xs
|
||||||
|
| otherwise = x : escapeNls xs
|
||||||
|
escapeNls [] = []
|
||||||
|
|
||||||
-- | Return a text object with a string of formatted XML attributes.
|
-- | Return a text object with a string of formatted XML attributes.
|
||||||
attributeList :: [(String, String)] -> Doc
|
attributeList :: [(String, String)] -> Doc
|
||||||
attributeList = hcat . map
|
attributeList = hcat . map
|
||||||
(\(a, b) -> text (' ' : escapeStringForXML a ++ "=\"" ++
|
(\(a, b) -> text (' ' : escapeStringForXML a ++ "=\"" ++
|
||||||
escapeStringForXML b ++ "\""))
|
escapeNls (escapeStringForXML b) ++ "\""))
|
||||||
|
|
||||||
-- | Put the supplied contents between start and end tags of tagType,
|
-- | Put the supplied contents between start and end tags of tagType,
|
||||||
-- with specified attributes and (if specified) indentation.
|
-- with specified attributes and (if specified) indentation.
|
||||||
|
|
Loading…
Reference in a new issue