module Text.Ogmarkup
(
ogmarkup,
ogmarkup',
Conf.GenConf (..),
Conf.Template,
Typo.frenchTypo,
Typo.unicodeFrenchTypo,
Typo.htmlFrenchTypo,
Typo.englishTypo,
Typo.unicodeEnglishTypo,
Typo.htmlEnglishTypo,
Typo.Typography (..),
Ast.Mark (..),
Typo.Space (..),
) where
import Data.List hiding (uncons)
import Data.Monoid
import Data.Proxy (Proxy)
import Data.String
import Text.Megaparsec
import qualified Text.Ogmarkup.Private.Ast as Ast
import qualified Text.Ogmarkup.Private.Config as Conf
import qualified Text.Ogmarkup.Private.Generator as Gen
import qualified Text.Ogmarkup.Private.Parser as Parser
import qualified Text.Ogmarkup.Private.Typography as Typo
ogmarkup :: forall c a b. (Stream a, Token a ~ Char, IsString (Tokens a), IsString b, Monoid b, Conf.GenConf c b)
=> a
-> b
ogmarkup input = case Parser.parse Parser.document "" input of
Right ast -> Gen.runGenerator (Gen.document @c @b $ merge ast)
Left _ -> error "failed to parse an ogmarkup document even with best effort"
where merge :: Ast.Document b -> Ast.Document b
merge (Ast.Story x:rest) = (Ast.Story $ mergep x):rest
merge (Ast.Aside cls x:rest) = Ast.Aside cls (mergep x):rest
merge (x:rest) = x:merge rest
merge [] = []
mergep :: [Ast.Paragraph b] -> [Ast.Paragraph b]
mergep (x@(_:_):y@(Ast.Dialogue _ _:_):rest) =
case last x of
Ast.Dialogue _ _ -> mergep $ (x `mappend` y):rest
_ -> x:mergep (y:rest)
mergep (x:y:rest) = x:mergep (y:rest)
mergep x = x
ogmarkup' :: forall c a b. (Stream a, Token a ~ Char, IsString (Tokens a), IsString b, Monoid b, Conf.GenConf c b)
=> Proxy c
-> a
-> b
ogmarkup' _ = ogmarkup @c