module Text.Ogmarkup
(
Strategy (..),
ogmarkup,
Conf.GenConf (..),
Conf.Template,
Typo.frenchTypo,
Typo.englishTypo,
Typo.Typography (..),
Ast.Mark (..),
Typo.Space (..),
) where
import Data.String
import Data.List
import Data.Monoid
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
data Strategy =
ByLine
| ByChar
ogmarkup :: (IsString a, Monoid a, Conf.GenConf c a)
=> Strategy
-> String
-> c
-> a
ogmarkup be input conf = Gen.runGenerator (Gen.document (_ogmarkup be "" input [])) conf
where
_ogmarkup :: (IsString a, Monoid a)
=> Strategy
-> String
-> String
-> Ast.Document a
-> Ast.Document a
_ogmarkup _ "" "" ast = ast
_ogmarkup _ acc "" ast = ast `mappend` [Ast.Failing . fromString $ acc]
_ogmarkup be acc input ast =
case Parser.parse Parser.document "" input of
Right (ast', input') ->
if input == input'
then let (c, rst) = applyStrat be input
in _ogmarkup be (acc `mappend` c) rst ast
else if acc == ""
then _ogmarkup be [] input' (ast `mappend` ast')
else let f = Ast.Failing . fromString $ acc
in _ogmarkup be [] input' (ast `mappend` (f:ast'))
Left err -> error $ show err
applyStrat :: Strategy
-> String
-> (String, String)
applyStrat _ [] = ([], [])
applyStrat ByLine input = break (== '\n') input
applyStrat ByChar (c:rst) = ([c], rst)