module Language.Drasil.Printing.Import.Helpers where
import Control.Lens ((^.))
import Data.Char (toUpper)
import Language.Drasil (Stage(..), codeSymb, eqSymb, NounPhrase(..), Sentence(S),
Symbol, TermCapitalization(..), titleizeNP, titleizeNP',
atStartNP, atStartNP', NP, DefinedQuantityDict)
import Language.Drasil.Development (toSent)
import Drasil.Database (UID, ChunkDB, findOrErr)
import Drasil.Database.SearchTools (termResolve', TermAbbr(..))
import qualified Language.Drasil.Printing.AST as P
import Language.Drasil.Printing.PrintingInformation (PrintingInformation, stg, sysdb)
parens :: P.Expr -> P.Expr
parens :: Expr -> Expr
parens = Fence -> Fence -> Expr -> Expr
P.Fenced Fence
P.Paren Fence
P.Paren
digitsProcess :: [Integer] -> Int -> Int -> Integer -> [P.Expr]
digitsProcess :: [Integer] -> Int -> Int -> Integer -> [Expr]
digitsProcess [Integer
0] Int
_ Int
_ Integer
_ = [Integer -> Expr
P.Int Integer
0, Ops -> Expr
P.MO Ops
P.Point, Integer -> Expr
P.Int Integer
0]
digitsProcess [Integer]
ds Int
pos Int
_ (-3) = [Integer -> Expr
P.Int Integer
0, Ops -> Expr
P.MO Ops
P.Point] [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ Int -> Expr -> [Expr]
forall a. Int -> a -> [a]
replicate (Int
3 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
pos) (Integer -> Expr
P.Int Integer
0) [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ (Integer -> Expr) -> [Integer] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
map Integer -> Expr
P.Int [Integer]
ds
digitsProcess (Integer
hd:[Integer]
tl) Int
pos Int
coun Integer
ex
| Int
pos Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
coun = Integer -> Expr
P.Int Integer
hd Expr -> [Expr] -> [Expr]
forall a. a -> [a] -> [a]
: [Integer] -> Int -> Int -> Integer -> [Expr]
digitsProcess [Integer]
tl Int
pos (Int
coun Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Integer
ex
| Integer
ex Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
/= Integer
0 = [Ops -> Expr
P.MO Ops
P.Point, Integer -> Expr
P.Int Integer
hd] [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ (Integer -> Expr) -> [Integer] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
map Integer -> Expr
P.Int [Integer]
tl [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ [Ops -> Expr
P.MO Ops
P.Dot, Integer -> Expr
P.Int Integer
10, Expr -> Expr
P.Sup (Expr -> Expr) -> Expr -> Expr
forall a b. (a -> b) -> a -> b
$ Integer -> Expr
P.Int Integer
ex]
| Bool
otherwise = [Ops -> Expr
P.MO Ops
P.Point, Integer -> Expr
P.Int Integer
hd] [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ (Integer -> Expr) -> [Integer] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
map Integer -> Expr
P.Int [Integer]
tl
digitsProcess [] Int
pos Int
coun Integer
ex
| Int
pos Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
coun = Integer -> Expr
P.Int Integer
0 Expr -> [Expr] -> [Expr]
forall a. a -> [a] -> [a]
: [Integer] -> Int -> Int -> Integer -> [Expr]
digitsProcess [] Int
pos (Int
counInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Integer
ex
| Integer
ex Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
/= Integer
0 = [Ops -> Expr
P.MO Ops
P.Point, Integer -> Expr
P.Int Integer
0, Ops -> Expr
P.MO Ops
P.Dot, Integer -> Expr
P.Int Integer
10, Expr -> Expr
P.Sup (Expr -> Expr) -> Expr -> Expr
forall a b. (a -> b) -> a -> b
$ Integer -> Expr
P.Int Integer
ex]
| Bool
otherwise = [Ops -> Expr
P.MO Ops
P.Point, Integer -> Expr
P.Int Integer
0]
processExpo :: Int -> (Int, Int)
processExpo :: Int -> (Int, Int)
processExpo Int
a = (Int
r, Int
a Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
r)
where r :: Int
r = Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int -> Int
forall a. Integral a => a -> a -> a
mod (Int
a Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) Int
3
lookupC :: Stage -> ChunkDB -> UID -> Symbol
lookupC :: Stage -> ChunkDB -> UID -> Symbol
lookupC Stage
Equational ChunkDB
sm UID
c = DefinedQuantityDict -> Symbol
forall q. HasSymbol q => q -> Symbol
eqSymb (UID -> ChunkDB -> DefinedQuantityDict
forall a. Typeable a => UID -> ChunkDB -> a
findOrErr UID
c ChunkDB
sm :: DefinedQuantityDict)
lookupC Stage
Implementation ChunkDB
sm UID
c = DefinedQuantityDict -> Symbol
forall q. HasSymbol q => q -> Symbol
codeSymb (UID -> ChunkDB -> DefinedQuantityDict
forall a. Typeable a => UID -> ChunkDB -> a
findOrErr UID
c ChunkDB
sm :: DefinedQuantityDict)
lookupC' :: PrintingInformation -> UID -> Symbol
lookupC' :: PrintingInformation -> UID -> Symbol
lookupC' PrintingInformation
pinfo = Stage -> ChunkDB -> UID -> Symbol
lookupC (PrintingInformation
pinfo PrintingInformation
-> Getting Stage PrintingInformation Stage -> Stage
forall s a. s -> Getting a s a -> a
^. Getting Stage PrintingInformation Stage
Lens' PrintingInformation Stage
stg) (PrintingInformation
pinfo PrintingInformation
-> Getting ChunkDB PrintingInformation ChunkDB -> ChunkDB
forall s a. s -> Getting a s a -> a
^. Getting ChunkDB PrintingInformation ChunkDB
Lens' PrintingInformation ChunkDB
sysdb)
lookupT :: PrintingInformation -> UID -> TermCapitalization -> Sentence
lookupT :: PrintingInformation -> UID -> TermCapitalization -> Sentence
lookupT PrintingInformation
sm UID
c TermCapitalization
tCap = TermCapitalization -> NP -> Sentence
resolveCapT TermCapitalization
tCap (NP -> Sentence) -> NP -> Sentence
forall a b. (a -> b) -> a -> b
$ TermAbbr -> NP
longForm (TermAbbr -> NP) -> TermAbbr -> NP
forall a b. (a -> b) -> a -> b
$ ChunkDB -> UID -> TermAbbr
termResolve' (PrintingInformation
sm PrintingInformation
-> Getting ChunkDB PrintingInformation ChunkDB -> ChunkDB
forall s a. s -> Getting a s a -> a
^. Getting ChunkDB PrintingInformation ChunkDB
Lens' PrintingInformation ChunkDB
sysdb) UID
c
lookupS :: PrintingInformation -> UID -> TermCapitalization -> Sentence
lookupS :: PrintingInformation -> UID -> TermCapitalization -> Sentence
lookupS PrintingInformation
sm UID
c TermCapitalization
sCap = Sentence -> (String -> Sentence) -> Maybe String -> Sentence
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (TermCapitalization -> NP -> Sentence
resolveCapT TermCapitalization
sCap (NP -> Sentence) -> NP -> Sentence
forall a b. (a -> b) -> a -> b
$ TermAbbr -> NP
longForm TermAbbr
l) String -> Sentence
S (Maybe String -> Sentence) -> Maybe String -> Sentence
forall a b. (a -> b) -> a -> b
$ TermAbbr -> Maybe String
shortForm TermAbbr
l Maybe String -> (String -> Maybe String) -> Maybe String
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= TermCapitalization -> String -> Maybe String
capHelper TermCapitalization
sCap
where l :: TermAbbr
l = ChunkDB -> UID -> TermAbbr
termResolve' (PrintingInformation
sm PrintingInformation
-> Getting ChunkDB PrintingInformation ChunkDB -> ChunkDB
forall s a. s -> Getting a s a -> a
^. Getting ChunkDB PrintingInformation ChunkDB
Lens' PrintingInformation ChunkDB
sysdb) UID
c
lookupP :: PrintingInformation -> UID -> TermCapitalization -> Sentence
lookupP :: PrintingInformation -> UID -> TermCapitalization -> Sentence
lookupP PrintingInformation
sm UID
c TermCapitalization
pCap = TermCapitalization -> NP -> Sentence
resolveCapP TermCapitalization
pCap (NP -> Sentence) -> NP -> Sentence
forall a b. (a -> b) -> a -> b
$ TermAbbr -> NP
longForm (TermAbbr -> NP) -> TermAbbr -> NP
forall a b. (a -> b) -> a -> b
$ ChunkDB -> UID -> TermAbbr
termResolve' (PrintingInformation
sm PrintingInformation
-> Getting ChunkDB PrintingInformation ChunkDB -> ChunkDB
forall s a. s -> Getting a s a -> a
^. Getting ChunkDB PrintingInformation ChunkDB
Lens' PrintingInformation ChunkDB
sysdb) UID
c
resolveCapT :: TermCapitalization -> (NP -> Sentence)
resolveCapT :: TermCapitalization -> NP -> Sentence
resolveCapT TermCapitalization
NoCap = NPStruct -> Sentence
toSent (NPStruct -> Sentence) -> (NP -> NPStruct) -> NP -> Sentence
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NP -> NPStruct
forall n. NounPhrase n => n -> NPStruct
phraseNP
resolveCapT TermCapitalization
CapF = NPStruct -> Sentence
toSent (NPStruct -> Sentence) -> (NP -> NPStruct) -> NP -> Sentence
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NP -> NPStruct
forall n. NounPhrase n => n -> NPStruct
atStartNP
resolveCapT TermCapitalization
CapW = NPStruct -> Sentence
toSent (NPStruct -> Sentence) -> (NP -> NPStruct) -> NP -> Sentence
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NP -> NPStruct
forall n. NounPhrase n => n -> NPStruct
titleizeNP
resolveCapP :: TermCapitalization -> (NP -> Sentence)
resolveCapP :: TermCapitalization -> NP -> Sentence
resolveCapP TermCapitalization
NoCap = NPStruct -> Sentence
toSent (NPStruct -> Sentence) -> (NP -> NPStruct) -> NP -> Sentence
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NP -> NPStruct
forall n. NounPhrase n => n -> NPStruct
pluralNP
resolveCapP TermCapitalization
CapF = NPStruct -> Sentence
toSent (NPStruct -> Sentence) -> (NP -> NPStruct) -> NP -> Sentence
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NP -> NPStruct
forall n. NounPhrase n => n -> NPStruct
atStartNP'
resolveCapP TermCapitalization
CapW = NPStruct -> Sentence
toSent (NPStruct -> Sentence) -> (NP -> NPStruct) -> NP -> Sentence
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NP -> NPStruct
forall n. NounPhrase n => n -> NPStruct
titleizeNP'
capHelper :: TermCapitalization -> String -> Maybe String
capHelper :: TermCapitalization -> String -> Maybe String
capHelper TermCapitalization
NoCap String
s = String -> Maybe String
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return String
s
capHelper TermCapitalization
_ [] = Maybe String
forall a. Maybe a
Nothing
capHelper TermCapitalization
_ (Char
x:String
xs) = String -> Maybe String
forall a. a -> Maybe a
Just (Char -> Char
toUpper Char
xChar -> String -> String
forall a. a -> [a] -> [a]
: String
xs)