Browse Source

Ptolemy-bridge project for converting back and forth between Pandoc types and Ptolemy types

Getty Ritter 8 years ago
parent
commit
04be08c2e2
3 changed files with 217 additions and 1 deletions
  1. 2 1
      cabal.project
  2. 191 0
      ptolemy-bridge/Text/Ptolemy/Pandoc.hs
  3. 24 0
      ptolemy-bridge/ptolemy-bridge.cabal

+ 2 - 1
cabal.project

@@ -1,4 +1,5 @@
-projects: ptolemy-core/ptolemy-core.cabal,
+packages: ptolemy-core/ptolemy-core.cabal,
           ptolemy-reader-markdown/ptolemy-reader-markdown.cabal,
           ptolemy-writer-html/ptolemy-writer-html.cabal,
+          ptolemy-bridge/ptolemy-bridge.cabal
           ptolemy/ptolemy.cabal

+ 191 - 0
ptolemy-bridge/Text/Ptolemy/Pandoc.hs

@@ -0,0 +1,191 @@
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+{-# LANGUAGE FlexibleInstances #-}
+
+module Text.Ptolemy.Pandoc where
+
+import           Data.Vector (Vector)
+import qualified Data.Vector as V
+import           Data.Text (Text)
+import qualified Data.Text as T
+import           Text.Ptolemy.Core
+import qualified Text.Pandoc.Definition as P
+
+-- This module contains the entirely mechanical translation between the
+-- Pandoc types and their corresponding Ptolemy types.
+
+class Convert pan pto where
+  from :: pan -> pto
+  to   :: pto -> pan
+
+instance Convert x y => Convert [x] (Vector y) where
+  from xs = V.fromList (map from xs)
+  to ys   = map to (V.toList ys)
+
+instance Convert String Text where
+  from = T.pack
+  to   = T.unpack
+
+instance (Convert a b, Convert c d) => Convert (a, c) (b, d) where
+  from (a, b) = (from a, from b)
+  to   (a, b) = (to a, to b)
+
+instance Convert P.Block Block where
+  from (P.Plain is)          = Plain (from is)
+  from (P.Para is)           = Para (from is)
+  from (P.CodeBlock as str)  = CodeBlock (from as) (from str)
+  from (P.RawBlock fmt str)  = RawBlock (from fmt) (from str)
+  from (P.BlockQuote bs)     = BlockQuote (from bs)
+  from (P.OrderedList la bs) = OrderedList (from la) (from bs)
+  from (P.BulletList bs)     = BulletList (from bs)
+  from (P.DefinitionList ds) = DefinitionList (from ds)
+  from (P.Header n attr is)  = Header n (from attr) (from is)
+  from (P.HorizontalRule)    = HorizontalRule
+  from (P.Div attr bs)       = Div (from attr) (from bs)
+  from (P.Null)              = Null
+  to (Plain is)          = P.Plain (to is)
+  to (Para is)           = P.Para (to is)
+  to (CodeBlock as str)  = P.CodeBlock (to as) (to str)
+  to (RawBlock fmt str)  = P.RawBlock (to fmt) (to str)
+  to (BlockQuote bs)     = P.BlockQuote (to bs)
+  to (OrderedList la bs) = P.OrderedList (to la) (to bs)
+  to (BulletList bs)     = P.BulletList (to bs)
+  to (DefinitionList ds) = P.DefinitionList (to ds)
+  to (Header n attr is)  = P.Header n (to attr) (to is)
+  to (HorizontalRule)    = P.HorizontalRule
+  to (Div attr bs)       = P.Div (to attr) (to bs)
+  to (Null)              = P.Null
+
+instance Convert P.Inline Inline where
+  from (P.Str str)           = Str (from str)
+  from (P.Emph is)           = Emph (from is)
+  from (P.Strong is)         = Strong (from is)
+  from (P.Strikeout is)      = Strikeout (from is)
+  from (P.Superscript is)    = Superscript (from is)
+  from (P.Subscript is)      = Subscript (from is)
+  from (P.SmallCaps is)      = SmallCaps (from is)
+  from (P.Quoted qt is)      = Quoted (from qt) (from is)
+  from (P.Cite bs is)        = Cite (from bs) (from is)
+  from (P.Code attr str)     = Code (from attr) (from str)
+  from (P.Space)             = Space
+  from (P.SoftBreak)         = SoftBreak
+  from (P.LineBreak)         = LineBreak
+  from (P.Math mt str)       = Math (from mt) (from str)
+  from (P.RawInline fmt str) = RawInline (from fmt) (from str)
+  from (P.Link attr is tgt)  = Link (from attr) (from is) (from tgt)
+  from (P.Image attr is tgt) = Image (from attr) (from is) (from tgt)
+  from (P.Note bs)           = Note (from bs)
+  from (P.Span attr is)      = Span (from attr) (from is)
+  to (Str str)           = P.Str (to str)
+  to (Emph is)           = P.Emph (to is)
+  to (Strong is)         = P.Strong (to is)
+  to (Strikeout is)      = P.Strikeout (to is)
+  to (Superscript is)    = P.Superscript (to is)
+  to (Subscript is)      = P.Subscript (to is)
+  to (SmallCaps is)      = P.SmallCaps (to is)
+  to (Quoted qt is)      = P.Quoted (to qt) (to is)
+  to (Cite bs is)        = P.Cite (to bs) (to is)
+  to (Code attr str)     = P.Code (to attr) (to str)
+  to (Space)             = P.Space
+  to (SoftBreak)         = P.SoftBreak
+  to (LineBreak)         = P.LineBreak
+  to (Math mt str)       = P.Math (to mt) (to str)
+  to (RawInline fmt str) = P.RawInline (to fmt) (to str)
+  to (Link attr is tgt)  = P.Link (to attr) (to is) (to tgt)
+  to (Image attr is tgt) = P.Image (to attr) (to is) (to tgt)
+  to (Note bs)           = P.Note (to bs)
+  to (Span attr is)      = P.Span (to attr) (to is)
+
+instance Convert P.Citation Citation where
+  from cite = Citation
+    { ciId      = from (P.citationId cite)
+    , ciPrefix  = from (P.citationPrefix cite)
+    , ciSuffix  = from (P.citationSuffix cite)
+    , ciMode    = from (P.citationMode cite)
+    , ciNoteNum = P.citationNoteNum cite
+    , ciHash    = P.citationHash cite
+    }
+  to cite = P.Citation
+    { P.citationId      = to (ciId cite)
+    , P.citationPrefix  = to (ciPrefix cite)
+    , P.citationSuffix  = to (ciSuffix cite)
+    , P.citationMode    = to (ciMode cite)
+    , P.citationNoteNum = ciNoteNum cite
+    , P.citationHash    = ciHash cite
+    }
+
+instance Convert P.CitationMode CitationMode where
+  from P.AuthorInText   = AuthorInText
+  from P.SuppressAuthor = SuppressAuthor
+  from P.NormalCitation = NormalCitation
+  to AuthorInText   = P.AuthorInText
+  to SuppressAuthor = P.SuppressAuthor
+  to NormalCitation = P.NormalCitation
+
+instance Convert P.MathType MathType where
+  from P.DisplayMath = DisplayMath
+  from P.InlineMath = InlineMath
+  to DisplayMath = P.DisplayMath
+  to InlineMath = P.InlineMath
+
+instance Convert P.Format Format where
+  from (P.Format str) = Format (from str)
+  to (Format str) = P.Format (to str)
+
+instance Convert P.Attr Attr where
+  from (ident, classes, props) = Attr
+    { attrIdentifier = from ident
+    , attrClasses    = from classes
+    , attrProps      = from props
+    }
+  to attr = ( to (attrIdentifier attr)
+            , to (attrClasses attr)
+            , to (attrProps attr)
+            )
+
+instance Convert P.ListAttributes ListAttributes where
+  from (i, lsy, ldl) = ListAttributes
+    { laWhatever    = i
+    , laNumberStyle = from lsy
+    , laNumberDelim = from ldl
+    }
+  to lattrs = ( laWhatever lattrs
+              , to (laNumberStyle lattrs)
+              , to (laNumberDelim lattrs)
+              )
+
+instance Convert P.ListNumberStyle ListNumberStyle where
+  from P.DefaultStyle = DefaultStyle
+  from P.Example = Example
+  from P.Decimal = Decimal
+  from P.LowerRoman = LowerRoman
+  from P.UpperRoman = UpperRoman
+  from P.LowerAlpha = LowerAlpha
+  from P.UpperAlpha = UpperAlpha
+  to DefaultStyle = P.DefaultStyle
+  to Example = P.Example
+  to Decimal = P.Decimal
+  to LowerRoman = P.LowerRoman
+  to UpperRoman = P.UpperRoman
+  to LowerAlpha = P.LowerAlpha
+  to UpperAlpha = P.UpperAlpha
+
+instance Convert P.ListNumberDelim ListNumberDelim where
+  from P.DefaultDelim = DefaultDelim
+  from P.Period = Period
+  from P.OneParen = OneParen
+  from P.TwoParens = TwoParens
+  to DefaultDelim = P.DefaultDelim
+  to Period = P.Period
+  to OneParen = P.OneParen
+  to TwoParens = P.TwoParens
+
+instance Convert P.QuoteType QuoteType where
+  from P.SingleQuote = SingleQuote
+  from P.DoubleQuote = DoubleQuote
+  to SingleQuote = P.SingleQuote
+  to DoubleQuote = P.DoubleQuote
+
+instance Convert P.Target Target where
+  from (url, title) = Target { tgtURL = from url, tgtTitle = from title }
+  to tgt = (to (tgtURL tgt), to (tgtTitle tgt))

+ 24 - 0
ptolemy-bridge/ptolemy-bridge.cabal

@@ -0,0 +1,24 @@
+name:             ptolemy-bridge
+version:          0.1.0.0
+-- synopsis:
+-- description
+license:          BSD3
+license-file:     LICENSE
+author:           Getty Ritter
+maintainer:       gettyritter@gmail.com
+copyright:        ©2016 Getty Ritter
+category: Text
+build-type:       Simple
+cabal-version:    >= 1.2
+
+library
+  exposed-modules:     Text.Ptolemy.Pandoc
+  ghc-options:         -Wall
+  build-depends:       base >=4.7 && <4.9,
+                       ptolemy-core,
+                       text,
+                       vector,
+                       pandoc-types
+  default-language:    Haskell2010
+  default-extensions:  OverloadedStrings,
+                       ScopedTypeVariables