module Text.Ogmarkup
(
ogmarkup,
Conf.GenConf (..),
Conf.Template,
Typo.frenchTypo,
Typo.englishTypo,
Typo.Typography (..),
Ast.Mark (..),
Typo.Space (..),
) where
import Data.String
import Data.List hiding (uncons)
import Data.Monoid
import Text.Megaparsec
import qualified Text.Ogmarkup.Private.Config as Conf
import qualified Text.Ogmarkup.Private.Ast as Ast
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 :: (Stream a, Token a ~ Char, IsString (Tokens a), IsString a, Eq a, Monoid a, IsString b, Monoid b, Conf.GenConf c b)
=> a
-> c
-> b
ogmarkup input conf = case Parser.parse Parser.document "" input of
Right ast -> Gen.runGenerator (Gen.document $ merge ast) conf
Left _ -> error "failed to parse an ogmarkup document even with best effort"
where merge :: Ast.Document a -> Ast.Document a
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 a] -> [Ast.Paragraph a]
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