{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LiberalTypeSynonyms #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}

---------------------------------------------------------------------
--
-- Module      : all the filetype used for daino
----------------------------------------------------------------------

{- | daino uses sequences of transformations between data structures (types)
 MD -> Docrep -> Panrep -> TexSnip -> Tex -> PDF
                 Pandrep -> HTML
 Each result is written as a typed file with a specific extension
-}
module Foundational.Filetypes4sites (
    module Foundational.Filetypes4sites,
) where

import Uniform.Json (FromJSON, ToJSON, Value)
import Uniform.Pandoc  
import UniformBase
import Foundational.MetaPage ( MetaPage, extPDF )
-- import Wave.Md2doc (pandoc2docrep)


--------------------------------------------typed file Docrep

{- | representation of a document
 the yam part contains the json formated yaml metadata
 which is extensible
 Attention the Pandoc is Pandoc (Meta (Map Text MetaValue) [Block]
 means that title etc is duplicated in the Meta part.
 I keep the pandoc structure (Pandoc Meta [Block] - Text.Pandoc.Definition
 because it is possible to convert the Meta from Pandoc to JSON
 with flattenMeta (in PandocImports)
 but I do not see an easy way to convert back
 - Where would this be required? 
 - probably for the index construction? 
-}
data Docrep = Docrep {Docrep -> MetaPage
meta1 :: MetaPage, Docrep -> Pandoc
pan1 :: Pandoc} -- a json value
    deriving (Int -> Docrep -> ShowS
[Docrep] -> ShowS
Docrep -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Docrep] -> ShowS
$cshowList :: [Docrep] -> ShowS
show :: Docrep -> String
$cshow :: Docrep -> String
showsPrec :: Int -> Docrep -> ShowS
$cshowsPrec :: Int -> Docrep -> ShowS
Show, ReadPrec [Docrep]
ReadPrec Docrep
Int -> ReadS Docrep
ReadS [Docrep]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Docrep]
$creadListPrec :: ReadPrec [Docrep]
readPrec :: ReadPrec Docrep
$creadPrec :: ReadPrec Docrep
readList :: ReadS [Docrep]
$creadList :: ReadS [Docrep]
readsPrec :: Int -> ReadS Docrep
$creadsPrec :: Int -> ReadS Docrep
Read, Docrep -> Docrep -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Docrep -> Docrep -> Bool
$c/= :: Docrep -> Docrep -> Bool
== :: Docrep -> Docrep -> Bool
$c== :: Docrep -> Docrep -> Bool
Eq, forall x. Rep Docrep x -> Docrep
forall x. Docrep -> Rep Docrep x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Docrep x -> Docrep
$cfrom :: forall x. Docrep -> Rep Docrep x
Generic, Docrep
Eq Docrep => Docrep -> Bool
forall z.
z -> (Eq z => z -> Bool) -> (Eq z => z -> Bool) -> Zeros z
notZero :: Eq Docrep => Docrep -> Bool
$cnotZero :: Eq Docrep => Docrep -> Bool
isZero :: Eq Docrep => Docrep -> Bool
$cisZero :: Eq Docrep => Docrep -> Bool
zero :: Docrep
$czero :: Docrep
Zeros)

instance FromJSON Docrep
instance ToJSON Docrep

extDocrep :: Extension
extDocrep :: Extension
extDocrep = String -> Extension
Extension String
"docrep"

-- instance NiceStrings Docrep where
--   shownice = showNice . unDocrep

docrepFileType :: TypedFile5 Text Docrep
docrepFileType :: TypedFile5 Text Docrep
docrepFileType =
    TypedFile5{tpext5 :: Extension
tpext5 = Extension
extDocrep} :: TypedFile5 Text Docrep

instance TypedFiles7 Text Docrep where
    wrap7 :: Text -> Docrep
wrap7 = forall a. (Partial, Read a) => String -> String -> a
readNote (String
"Docrep wrap7 sfasdwe") forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
t2s
    --    wrap7 a = readNote (show a) . t2s $ a

    unwrap7 :: Docrep -> Text
unwrap7 = forall {a}. Show a => a -> Text
showT

-------------------- fileType Panrep ----------

extPanrep :: Extension
extPanrep :: Extension
extPanrep = String -> Extension
Extension String
"panrep"

-- | a file containing what pandoc internally works on
-- plus the complete set of the metadata
panrepFileType :: TypedFile5 Text Panrep
panrepFileType :: TypedFile5 Text Panrep
panrepFileType =
    TypedFile5{tpext5 :: Extension
tpext5 = Extension
extPanrep} :: TypedFile5 Text Panrep

data Panrep = Panrep {Panrep -> MetaPage
panyam :: MetaPage, Panrep -> Pandoc
panpan :: Pandoc}
    deriving (Panrep -> Panrep -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Panrep -> Panrep -> Bool
$c/= :: Panrep -> Panrep -> Bool
== :: Panrep -> Panrep -> Bool
$c== :: Panrep -> Panrep -> Bool
Eq, Int -> Panrep -> ShowS
[Panrep] -> ShowS
Panrep -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Panrep] -> ShowS
$cshowList :: [Panrep] -> ShowS
show :: Panrep -> String
$cshow :: Panrep -> String
showsPrec :: Int -> Panrep -> ShowS
$cshowsPrec :: Int -> Panrep -> ShowS
Show, ReadPrec [Panrep]
ReadPrec Panrep
Int -> ReadS Panrep
ReadS [Panrep]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Panrep]
$creadListPrec :: ReadPrec [Panrep]
readPrec :: ReadPrec Panrep
$creadPrec :: ReadPrec Panrep
readList :: ReadS [Panrep]
$creadList :: ReadS [Panrep]
readsPrec :: Int -> ReadS Panrep
$creadsPrec :: Int -> ReadS Panrep
Read)

instance Zeros Panrep where zero :: Panrep
zero = MetaPage -> Pandoc -> Panrep
Panrep forall z. Zeros z => z
zero forall z. Zeros z => z
zero

instance TypedFiles7 Text Panrep where
    -- handling Pandoc and read them into PandocText
    wrap7 :: Text -> Panrep
wrap7 = forall a. (Partial, Read a) => String -> String -> a
readNote String
"wrap7 for pandoc 223d" forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
t2s
    unwrap7 :: Panrep -> Text
unwrap7 = forall {a}. Show a => a -> Text
showT

--- variant 1 panrep 
extPanrep1 :: Extension
extPanrep1 :: Extension
extPanrep1 = String -> Extension
Extension String
"panrep1"

panrep1FileType :: TypedFile5 Text Panrep1
panrep1FileType :: TypedFile5 Text Panrep1
panrep1FileType =
    TypedFile5{tpext5 :: Extension
tpext5 = Extension
extPanrep1} :: TypedFile5 Text Panrep1

newtype Panrep1 = Panrep1 {Panrep1 -> Panrep
unPanrep1 :: Panrep}
-- data Panrep = Panrep {panyam :: MetaPage, panpan :: Pandoc}
    deriving (Panrep1 -> Panrep1 -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Panrep1 -> Panrep1 -> Bool
$c/= :: Panrep1 -> Panrep1 -> Bool
== :: Panrep1 -> Panrep1 -> Bool
$c== :: Panrep1 -> Panrep1 -> Bool
Eq, Int -> Panrep1 -> ShowS
[Panrep1] -> ShowS
Panrep1 -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Panrep1] -> ShowS
$cshowList :: [Panrep1] -> ShowS
show :: Panrep1 -> String
$cshow :: Panrep1 -> String
showsPrec :: Int -> Panrep1 -> ShowS
$cshowsPrec :: Int -> Panrep1 -> ShowS
Show, ReadPrec [Panrep1]
ReadPrec Panrep1
Int -> ReadS Panrep1
ReadS [Panrep1]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Panrep1]
$creadListPrec :: ReadPrec [Panrep1]
readPrec :: ReadPrec Panrep1
$creadPrec :: ReadPrec Panrep1
readList :: ReadS [Panrep1]
$creadList :: ReadS [Panrep1]
readsPrec :: Int -> ReadS Panrep1
$creadsPrec :: Int -> ReadS Panrep1
Read)

-- instance Zeros Panrep where zero = Panrep zero zero

instance TypedFiles7 Text Panrep1 where
    wrap7 :: Text -> Panrep1
wrap7 = forall a. (Partial, Read a) => String -> String -> a
readNote String
"wrap7 for pandocrep1" forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
t2s
    unwrap7 :: Panrep1 -> Text
unwrap7 = forall {a}. Show a => a -> Text
showT
--------------------  TexSnip

extTexSnip :: UniformBase.Extension
extTexSnip :: Extension
extTexSnip = String -> Extension
Extension String
"texsnip"

{- | a wrapper around TexSnip
 snipyam is not used
a tex snip is a piece of latex code, but not a full compilable
latex which results in a pdf
-}
data TexSnip = TexSnip {TexSnip -> MetaPage
snipyam :: MetaPage, TexSnip -> Text
unTexSnip :: Text}
    deriving (Int -> TexSnip -> ShowS
[TexSnip] -> ShowS
TexSnip -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TexSnip] -> ShowS
$cshowList :: [TexSnip] -> ShowS
show :: TexSnip -> String
$cshow :: TexSnip -> String
showsPrec :: Int -> TexSnip -> ShowS
$cshowsPrec :: Int -> TexSnip -> ShowS
Show, ReadPrec [TexSnip]
ReadPrec TexSnip
Int -> ReadS TexSnip
ReadS [TexSnip]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [TexSnip]
$creadListPrec :: ReadPrec [TexSnip]
readPrec :: ReadPrec TexSnip
$creadPrec :: ReadPrec TexSnip
readList :: ReadS [TexSnip]
$creadList :: ReadS [TexSnip]
readsPrec :: Int -> ReadS TexSnip
$creadsPrec :: Int -> ReadS TexSnip
Read, TexSnip -> TexSnip -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TexSnip -> TexSnip -> Bool
$c/= :: TexSnip -> TexSnip -> Bool
== :: TexSnip -> TexSnip -> Bool
$c== :: TexSnip -> TexSnip -> Bool
Eq)

-- unTexSnip (TexSnip a) = a   --needed for other ops

instance Zeros TexSnip where
    zero :: TexSnip
zero = MetaPage -> Text -> TexSnip
TexSnip forall z. Zeros z => z
zero forall z. Zeros z => z
zero

texSnipFileType :: TypedFile5 Text TexSnip
texSnipFileType :: TypedFile5 Text TexSnip
texSnipFileType =
    TypedFile5{tpext5 :: Extension
tpext5 = Extension
extTexSnip} :: TypedFile5 Text TexSnip

instance TypedFiles7 Text TexSnip where
    -- handling TexSnip and read them into TexSnipText
    -- the file on disk is readable for texstudio

    wrap7 :: Text -> TexSnip
wrap7 = forall a. (Partial, Read a) => String -> String -> a
readNote String
"wrap7 for TexSnip dwe11d" forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
t2s
    unwrap7 :: TexSnip -> Text
unwrap7 = forall {a}. Show a => a -> Text
showT

----------------  Tex

extTex :: Extension
extTex :: Extension
extTex = String -> Extension
Extension String
"tex"

texFileType :: TypedFile5 Text Latex
texFileType :: TypedFile5 Text Latex
texFileType = TypedFile5{tpext5 :: Extension
tpext5 = Extension
extTex} :: TypedFile5 Text Latex

instance TypedFiles7 Text Latex where
    wrap7 :: Text -> Latex
wrap7 = Text -> Latex
Latex
    unwrap7 :: Latex -> Text
unwrap7 = Latex -> Text
unLatex

-- | this is a full file, not just a snippet
newtype Latex = Latex {Latex -> Text
unLatex :: Text}
    deriving (Latex -> Latex -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Latex -> Latex -> Bool
$c/= :: Latex -> Latex -> Bool
== :: Latex -> Latex -> Bool
$c== :: Latex -> Latex -> Bool
Eq, Eq Latex
Latex -> Latex -> Bool
Latex -> Latex -> Ordering
Latex -> Latex -> Latex
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Latex -> Latex -> Latex
$cmin :: Latex -> Latex -> Latex
max :: Latex -> Latex -> Latex
$cmax :: Latex -> Latex -> Latex
>= :: Latex -> Latex -> Bool
$c>= :: Latex -> Latex -> Bool
> :: Latex -> Latex -> Bool
$c> :: Latex -> Latex -> Bool
<= :: Latex -> Latex -> Bool
$c<= :: Latex -> Latex -> Bool
< :: Latex -> Latex -> Bool
$c< :: Latex -> Latex -> Bool
compare :: Latex -> Latex -> Ordering
$ccompare :: Latex -> Latex -> Ordering
Ord, ReadPrec [Latex]
ReadPrec Latex
Int -> ReadS Latex
ReadS [Latex]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Latex]
$creadListPrec :: ReadPrec [Latex]
readPrec :: ReadPrec Latex
$creadPrec :: ReadPrec Latex
readList :: ReadS [Latex]
$creadList :: ReadS [Latex]
readsPrec :: Int -> ReadS Latex
$creadsPrec :: Int -> ReadS Latex
Read, Int -> Latex -> ShowS
[Latex] -> ShowS
Latex -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Latex] -> ShowS
$cshowList :: [Latex] -> ShowS
show :: Latex -> String
$cshow :: Latex -> String
showsPrec :: Int -> Latex -> ShowS
$cshowsPrec :: Int -> Latex -> ShowS
Show)

instance Zeros Latex where
    zero :: Latex
zero = Text -> Latex
Latex forall z. Zeros z => z
zero

---------------------------------------------- PDF
-- extension in metapage

pdfFileType :: TypedFile5 Text PDFfile
pdfFileType :: TypedFile5 Text PDFfile
pdfFileType = TypedFile5{tpext5 :: Extension
tpext5 = Extension
extPDF} :: TypedFile5 Text PDFfile

-- | a file in PDF format
newtype PDFfile = PDFfile {PDFfile -> Text
unpdffile :: Text}
    deriving (PDFfile -> PDFfile -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PDFfile -> PDFfile -> Bool
$c/= :: PDFfile -> PDFfile -> Bool
== :: PDFfile -> PDFfile -> Bool
$c== :: PDFfile -> PDFfile -> Bool
Eq, Eq PDFfile
PDFfile -> PDFfile -> Bool
PDFfile -> PDFfile -> Ordering
PDFfile -> PDFfile -> PDFfile
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PDFfile -> PDFfile -> PDFfile
$cmin :: PDFfile -> PDFfile -> PDFfile
max :: PDFfile -> PDFfile -> PDFfile
$cmax :: PDFfile -> PDFfile -> PDFfile
>= :: PDFfile -> PDFfile -> Bool
$c>= :: PDFfile -> PDFfile -> Bool
> :: PDFfile -> PDFfile -> Bool
$c> :: PDFfile -> PDFfile -> Bool
<= :: PDFfile -> PDFfile -> Bool
$c<= :: PDFfile -> PDFfile -> Bool
< :: PDFfile -> PDFfile -> Bool
$c< :: PDFfile -> PDFfile -> Bool
compare :: PDFfile -> PDFfile -> Ordering
$ccompare :: PDFfile -> PDFfile -> Ordering
Ord, ReadPrec [PDFfile]
ReadPrec PDFfile
Int -> ReadS PDFfile
ReadS [PDFfile]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [PDFfile]
$creadListPrec :: ReadPrec [PDFfile]
readPrec :: ReadPrec PDFfile
$creadPrec :: ReadPrec PDFfile
readList :: ReadS [PDFfile]
$creadList :: ReadS [PDFfile]
readsPrec :: Int -> ReadS PDFfile
$creadsPrec :: Int -> ReadS PDFfile
Read, Int -> PDFfile -> ShowS
[PDFfile] -> ShowS
PDFfile -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PDFfile] -> ShowS
$cshowList :: [PDFfile] -> ShowS
show :: PDFfile -> String
$cshow :: PDFfile -> String
showsPrec :: Int -> PDFfile -> ShowS
$cshowsPrec :: Int -> PDFfile -> ShowS
Show)

instance Zeros PDFfile where
    zero :: PDFfile
zero = Text -> PDFfile
PDFfile forall z. Zeros z => z
zero

instance TypedFiles7 Text PDFfile where
    wrap7 :: Text -> PDFfile
wrap7 = Text -> PDFfile
PDFfile
    unwrap7 :: PDFfile -> Text
unwrap7 = PDFfile -> Text
unpdffile

-------------------- fileType ---------- CSL
-- extCSL = Extension "csl"
-- cslFileType = TypedFile5 {tpext5 = extCSL} :: TypedFile5 Text Style

-- instance TypedFiles7 Text Style where
--     wrap7 = id
--     unwrap7 = id
--------------------------------- Bib
-- extBib = Extension "bib"
-- bibFileType = TypedFile5 {tpext5 = extBib}

-- instance TypedFiles7 Text