{-# LANGUAGE RecordWildCards #-}
module Development.NSIS.Show(showNSIS) where
import Development.NSIS.Type
import Control.Arrow
import Data.Generics.Uniplate.Data
import Data.Char
import Data.Function
import Data.List.Extra
import Data.Maybe
showNSIS :: [NSIS] -> [String]
showNSIS :: [NSIS] -> [String]
showNSIS [NSIS]
xs =
[String
"!Include MUI2.nsh"] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"Var _" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
v | Int
v <- [Int] -> [Int]
forall a. Ord a => [a] -> [a]
nubSort [Int
i | Var Int
i <- [NSIS] -> [Var]
forall from to. Biplate from to => from -> [to]
universeBi [NSIS]
xs]] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[Fun] -> [NSIS] -> [String]
outs [Fun]
fs ((NSIS -> Bool) -> [NSIS] -> [NSIS]
forall a. (a -> Bool) -> [a] -> [a]
filter NSIS -> Bool
isGlobal [NSIS]
xs) [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!insertmacro MUI_LANGUAGE \"English\""] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
(if [String] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
plugins then [] else
[String
"Function NSIS_UnusedPluginPreload"
,String
" # Put all plugins are at the start of the archive, ensuring fast extraction (esp. LZMA solid)"] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
(String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
indent [String]
plugins [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"FunctionEnd"]) [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[Fun] -> [NSIS] -> [String]
outs [Fun]
fs ((NSIS -> Bool) -> [NSIS] -> [NSIS]
forall a. (a -> Bool) -> [a] -> [a]
filter NSIS -> Bool
isSection [NSIS]
xs) [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [(String
"Function " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Fun -> String
forall a. Show a => a -> String
show Fun
name) String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
indent ([Fun] -> [NSIS] -> [String]
outs [Fun]
fs [NSIS]
body) [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String
"FunctionEnd"] | (Fun
name,[NSIS]
body) <- [(Fun, [NSIS])]
funs] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
(if [(SectionId, Val)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(SectionId, Val)]
descs then [] else
[String
"!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN"] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String -> String
indent (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
"!insertmacro MUI_DESCRIPTION_TEXT " String -> String -> String
forall a. [a] -> [a] -> [a]
++ SectionId -> String
forall a. Show a => a -> String
show SectionId
i String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Val -> String
forall a. Show a => a -> String
show Val
d | (SectionId
i,Val
d) <- [(SectionId, Val)]
descs] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!insertmacro MUI_FUNCTION_DESCRIPTION_END"])
where descs :: [(SectionId, Val)]
descs = (NSIS -> [(SectionId, Val)]) -> [NSIS] -> [(SectionId, Val)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (((SectionId, Val) -> Bool)
-> [(SectionId, Val)] -> [(SectionId, Val)]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool)
-> ((SectionId, Val) -> Bool) -> (SectionId, Val) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Val -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Val -> Bool)
-> ((SectionId, Val) -> Val) -> (SectionId, Val) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SectionId, Val) -> Val
forall a b. (a, b) -> b
snd) ([(SectionId, Val)] -> [(SectionId, Val)])
-> (NSIS -> [(SectionId, Val)]) -> NSIS -> [(SectionId, Val)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NSIS -> [(SectionId, Val)]
secDescs) ([NSIS] -> [(SectionId, Val)]) -> [NSIS] -> [(SectionId, Val)]
forall a b. (a -> b) -> a -> b
$ [NSIS] -> [NSIS]
forall from to. Biplate from to => from -> [to]
universeBi [NSIS]
xs
inits :: [NSIS]
inits = (NSIS -> Bool) -> [NSIS] -> [NSIS]
forall a. (a -> Bool) -> [a] -> [a]
filter (\NSIS
x -> Bool -> Bool
not (NSIS -> Bool
isSection NSIS
x) Bool -> Bool -> Bool
&& Bool -> Bool
not (NSIS -> Bool
isGlobal NSIS
x)) [NSIS]
xs
fs :: [Fun]
fs = ((Fun, [NSIS]) -> Fun) -> [(Fun, [NSIS])] -> [Fun]
forall a b. (a -> b) -> [a] -> [b]
map (Fun, [NSIS]) -> Fun
forall a b. (a, b) -> a
fst [(Fun, [NSIS])]
funs
funs :: [(Fun, [NSIS])]
funs = ([(Fun, [NSIS])] -> (Fun, [NSIS]))
-> [[(Fun, [NSIS])]] -> [(Fun, [NSIS])]
forall a b. (a -> b) -> [a] -> [b]
map ((Fun, [NSIS]) -> Fun
forall a b. (a, b) -> a
fst ((Fun, [NSIS]) -> Fun)
-> ([(Fun, [NSIS])] -> (Fun, [NSIS])) -> [(Fun, [NSIS])] -> Fun
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Fun, [NSIS])] -> (Fun, [NSIS])
forall a. HasCallStack => [a] -> a
head ([(Fun, [NSIS])] -> Fun)
-> ([(Fun, [NSIS])] -> [NSIS]) -> [(Fun, [NSIS])] -> (Fun, [NSIS])
forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& ((Fun, [NSIS]) -> [NSIS]) -> [(Fun, [NSIS])] -> [NSIS]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (Fun, [NSIS]) -> [NSIS]
forall a b. (a, b) -> b
snd) ([[(Fun, [NSIS])]] -> [(Fun, [NSIS])])
-> [[(Fun, [NSIS])]] -> [(Fun, [NSIS])]
forall a b. (a -> b) -> a -> b
$ ((Fun, [NSIS]) -> (Fun, [NSIS]) -> Bool)
-> [(Fun, [NSIS])] -> [[(Fun, [NSIS])]]
forall a. (a -> a -> Bool) -> [a] -> [[a]]
groupBy (Fun -> Fun -> Bool
forall a. Eq a => a -> a -> Bool
(==) (Fun -> Fun -> Bool)
-> ((Fun, [NSIS]) -> Fun) -> (Fun, [NSIS]) -> (Fun, [NSIS]) -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (Fun, [NSIS]) -> Fun
forall a b. (a, b) -> a
fst) ([(Fun, [NSIS])] -> [[(Fun, [NSIS])]])
-> [(Fun, [NSIS])] -> [[(Fun, [NSIS])]]
forall a b. (a -> b) -> a -> b
$ ((Fun, [NSIS]) -> (Fun, [NSIS]) -> Ordering)
-> [(Fun, [NSIS])] -> [(Fun, [NSIS])]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy (Fun -> Fun -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Fun -> Fun -> Ordering)
-> ((Fun, [NSIS]) -> Fun)
-> (Fun, [NSIS])
-> (Fun, [NSIS])
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (Fun, [NSIS]) -> Fun
forall a b. (a, b) -> a
fst) ([(Fun, [NSIS])] -> [(Fun, [NSIS])])
-> [(Fun, [NSIS])] -> [(Fun, [NSIS])]
forall a b. (a -> b) -> a -> b
$
[(String -> Fun
Fun String
".onInit",[NSIS]
inits) | Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [NSIS] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [NSIS]
inits] [(Fun, [NSIS])] -> [(Fun, [NSIS])] -> [(Fun, [NSIS])]
forall a. [a] -> [a] -> [a]
++ [(Fun
name,[NSIS]
body) | Function Fun
name [NSIS]
body <- [NSIS] -> [NSIS]
forall from to. Biplate from to => from -> [to]
universeBi [NSIS]
xs]
plugins :: [String]
plugins = [String] -> [String]
forall a. Ord a => [a] -> [a]
nubSort [String
a String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"::" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
b | Plugin String
a String
b [Val]
_ <- [NSIS] -> [NSIS]
forall from to. Biplate from to => from -> [to]
universeBi [NSIS]
xs]
secDescs :: NSIS -> [(SectionId, Val)]
secDescs :: NSIS -> [(SectionId, Val)]
secDescs (Section ASection
x [NSIS]
_) = [(ASection -> SectionId
secId ASection
x, ASection -> Val
secDescription ASection
x)]
secDescs (SectionGroup ASectionGroup
x [NSIS]
_) = [(ASectionGroup -> SectionId
secgId ASectionGroup
x, ASectionGroup -> Val
secgDescription ASectionGroup
x)]
secDescs NSIS
_ = []
isGlobal :: NSIS -> Bool
isGlobal :: NSIS -> Bool
isGlobal NSIS
x = case NSIS
x of
Name{} -> Bool
True
OutFile{} -> Bool
True
InstallDir{} -> Bool
True
SetCompressor{} -> Bool
True
InstallIcon{} -> Bool
True
UninstallIcon{} -> Bool
True
HeaderImage{} -> Bool
True
Page{} -> Bool
True
Unpage{} -> Bool
True
RequestExecutionLevel{} -> Bool
True
Target{} -> Bool
True
AddPluginDir{} -> Bool
True
InstallDirRegKey{} -> Bool
True
AllowRootDirInstall{} -> Bool
True
ShowInstDetails{} -> Bool
True
ShowUninstDetails{} -> Bool
True
Caption{} -> Bool
True
Unicode{} -> Bool
True
UnsafeInjectGlobal{} -> Bool
True
NSIS
_ -> Bool
False
isSection :: NSIS -> Bool
isSection :: NSIS -> Bool
isSection NSIS
x = case NSIS
x of
Section{} -> Bool
True
SectionGroup{} -> Bool
True
NSIS
_ -> Bool
False
outs :: [Fun] -> [NSIS] -> [String]
outs :: [Fun] -> [NSIS] -> [String]
outs [Fun]
fs = (NSIS -> [String]) -> [NSIS] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ([Fun] -> NSIS -> [String]
out [Fun]
fs)
out :: [Fun] -> NSIS -> [String]
out :: [Fun] -> NSIS -> [String]
out [Fun]
fs (Assign Var
v Val
x) = [String
"StrCpy " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Var -> String
forall a. Show a => a -> String
show Var
v String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Val -> String
forall a. Show a => a -> String
show Val
x]
out [Fun]
fs (SetCompressor ACompressor{Bool
Compressor
compType :: Compressor
compSolid :: Bool
compFinal :: Bool
compFinal :: ACompressor -> Bool
compSolid :: ACompressor -> Bool
compType :: ACompressor -> Compressor
..}) = [[String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"SetCompressor" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String
"/solid"|Bool
compSolid] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String
"/final"|Bool
compFinal] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [(Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Compressor -> String
forall a. Show a => a -> String
show Compressor
compType]]
out [Fun]
fs (Section ASection{secId :: ASection -> SectionId
secId=SectionId Int
secId, Bool
Val
secDescription :: ASection -> Val
secName :: Val
secDescription :: Val
secBold :: Bool
secRequired :: Bool
secUnselected :: Bool
secUnselected :: ASection -> Bool
secRequired :: ASection -> Bool
secBold :: ASection -> Bool
secName :: ASection -> Val
..} [NSIS]
xs) =
[[String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"Section" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String
"/o"|Bool
secUnselected] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [Val -> String
forall a. Show a => a -> String
show (Val -> String) -> Val -> String
forall a b. (a -> b) -> a -> b
$ [String -> Val_
Literal String
"!"|Bool
secBold] Val -> Val -> Val
forall a. [a] -> [a] -> [a]
++ Val
secName, String
"_sec" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
secId]] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
(String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
indent ([String
"SectionIn RO" | Bool
secRequired] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [Fun] -> [NSIS] -> [String]
outs [Fun]
fs [NSIS]
xs) [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"SectionEnd"]
out [Fun]
fs (SectionGroup ASectionGroup{secgId :: ASectionGroup -> SectionId
secgId=SectionId Int
secgId, Bool
Val
secgDescription :: ASectionGroup -> Val
secgName :: Val
secgExpanded :: Bool
secgDescription :: Val
secgExpanded :: ASectionGroup -> Bool
secgName :: ASectionGroup -> Val
..} [NSIS]
xs) =
[[String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"SectionGroup" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String
"/e"|Bool
secgExpanded] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [Val -> String
forall a. Show a => a -> String
show Val
secgName, String
"_sec" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
secgId]] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
(String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
indent ([Fun] -> [NSIS] -> [String]
outs [Fun]
fs [NSIS]
xs) [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"SectionGroupEnd"]
out [Fun]
fs (File AFile{Bool
Val
Maybe Val
filePath :: Val
fileNonFatal :: Bool
fileRecursive :: Bool
fileOName :: Maybe Val
fileOName :: AFile -> Maybe Val
fileRecursive :: AFile -> Bool
fileNonFatal :: AFile -> Bool
filePath :: AFile -> Val
..}) = [[String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"File" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String
"/nonfatal"|Bool
fileNonFatal] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String
"/r"|Bool
fileRecursive] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [Val -> String
forall a. Show a => a -> String
show (Val -> String) -> Val -> String
forall a b. (a -> b) -> a -> b
$ String -> Val_
Literal String
"/oname=" Val_ -> Val -> Val
forall a. a -> [a] -> [a]
: Val
x | Just Val
x <- [Maybe Val
fileOName]] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [Val -> String
forall a. Show a => a -> String
show Val
filePath]]
out [Fun]
fs (Labeled Label
i) = [Label -> String
forall a. Show a => a -> String
show Label
i String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
":"]
out [Fun]
fs (CreateShortcut AShortcut{String
Val
scFile :: Val
scTarget :: Val
scParameters :: Val
scIconFile :: Val
scIconIndex :: Val
scStartOptions :: String
scKeyboardShortcut :: String
scDescription :: Val
scDescription :: AShortcut -> Val
scKeyboardShortcut :: AShortcut -> String
scStartOptions :: AShortcut -> String
scIconIndex :: AShortcut -> Val
scIconFile :: AShortcut -> Val
scParameters :: AShortcut -> Val
scTarget :: AShortcut -> Val
scFile :: AShortcut -> Val
..}) = String -> [String]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$
[String
"CreateShortcut", Val -> String
forall a. Show a => a -> String
show Val
scFile, Val -> String
forall a. Show a => a -> String
show Val
scTarget, Val -> String
forall a. Show a => a -> String
show Val
scParameters, Val -> String
forall a. Show a => a -> String
show Val
scIconFile
,Val -> String
forall a. Show a => a -> String
show Val
scIconIndex, String -> String
forall a. Show a => a -> String
show String
scStartOptions, String -> String
forall a. Show a => a -> String
show String
scKeyboardShortcut, Val -> String
forall a. Show a => a -> String
show Val
scDescription]
out [Fun]
fs (InstallIcon Val
x) = [String
"!define MUI_ICON " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Val -> String
forall a. Show a => a -> String
show Val
x]
out [Fun]
fs (UninstallIcon Val
x) = [String
"!define MUI_UNICON " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Val -> String
forall a. Show a => a -> String
show Val
x]
out [Fun]
fs (HeaderImage Maybe Val
x) = String
"!define MUI_HEADERIMAGE" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String
"!define MUI_HEADERIMAGE_BITMAP " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Val -> String
forall a. Show a => a -> String
show Val
x | Just Val
x <- [Maybe Val
x]]
out [Fun]
fs (Page Page
x) = let y :: String
y = Page -> String
showPageCtor Page
x in
[String
"!define MUI_PAGE_CUSTOMFUNCTION_PRE Pre" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
y | String
"Pre" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
y String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` (Fun -> String) -> [Fun] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Fun -> String
forall a. Show a => a -> String
show [Fun]
fs] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!define MUI_PAGE_CUSTOMFUNCTION_SHOW Show" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
y | String
"Show" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
y String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` (Fun -> String) -> [Fun] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Fun -> String
forall a. Show a => a -> String
show [Fun]
fs] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!define MUI_PAGE_CUSTOMFUNCTION_LEAVE Leave" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
y | String
"Leave" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
y String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` (Fun -> String) -> [Fun] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Fun -> String
forall a. Show a => a -> String
show [Fun]
fs] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [FinishOptions -> [String]
showFinish FinishOptions
x | Finish FinishOptions
x <- [Page
x]] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!insertmacro MUI_PAGE_" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Page -> String
showPage Page
x]
out [Fun]
fs (Unpage Page
x) = [String
"!insertmacro MUI_UNPAGE_" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Page -> String
showPage Page
x]
out [Fun]
fs Function{} = []
out [Fun]
fs (Delete ADelete{Bool
Val
delFile :: Val
delRebootOK :: Bool
delRebootOK :: ADelete -> Bool
delFile :: ADelete -> Val
..}) = [[String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"Delete" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String
"/rebootok"|Bool
delRebootOK] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [Val -> String
forall a. Show a => a -> String
show Val
delFile]]
out [Fun]
fs (RMDir ARMDir{Bool
Val
rmDir :: Val
rmRecursive :: Bool
rmRebootOK :: Bool
rmRebootOK :: ARMDir -> Bool
rmRecursive :: ARMDir -> Bool
rmDir :: ARMDir -> Val
..}) = [[String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"RMDir" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String
"/r"|Bool
rmRecursive] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String
"/rebootok"|Bool
rmRebootOK] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [Val -> String
forall a. Show a => a -> String
show Val
rmDir]]
out [Fun]
fs (CopyFiles ACopyFiles{Bool
Val
cpFrom :: Val
cpTo :: Val
cpSilent :: Bool
cpFilesOnly :: Bool
cpFilesOnly :: ACopyFiles -> Bool
cpSilent :: ACopyFiles -> Bool
cpTo :: ACopyFiles -> Val
cpFrom :: ACopyFiles -> Val
..}) = [[String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"CopyFiles" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String
"/silent"|Bool
cpSilent] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String
"/filesonly"|Bool
cpFilesOnly] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [Val -> String
forall a. Show a => a -> String
show Val
cpFrom, Val -> String
forall a. Show a => a -> String
show Val
cpTo]]
out [Fun]
fs (MessageBox [MessageBoxType]
flags Val
txt [(String, Label)]
lbls) = [[String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"MessageBox" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"|" ((MessageBoxType -> String) -> [MessageBoxType] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map MessageBoxType -> String
forall a. Show a => a -> String
show [MessageBoxType]
flags) String -> [String] -> [String]
forall a. a -> [a] -> [a]
: Val -> String
forall a. Show a => a -> String
show Val
txt String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
[String
"ID" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
a String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Label -> String
forall a. Show a => a -> String
show Label
b | (String
a,Label
b) <- [(String, Label)]
lbls]]
out [Fun]
fs (Goto Label
x) = [String
"Goto " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Label -> String
forall a. Show a => a -> String
show Label
x | Label
x Label -> Label -> Bool
forall a. Eq a => a -> a -> Bool
/= Int -> Label
Label Int
0]
out [Fun]
fs (IntOp Var
a Val
b String
"~" Val
_) = [[String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"IntOp" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [Var -> String
forall a. Show a => a -> String
show Var
a, Val -> String
forall a. Show a => a -> String
show Val
b, String
"~"]]
out [Fun]
fs (ExecShell AExecShell{Val
ShowWindow
esCommand :: Val
esShow :: ShowWindow
esShow :: AExecShell -> ShowWindow
esCommand :: AExecShell -> Val
..}) = [[String] -> String
unwords [String
"ExecShell",String
"\"\"",Val -> String
forall a. Show a => a -> String
show Val
esCommand,ShowWindow -> String
forall a. Show a => a -> String
show ShowWindow
esShow]]
out [Fun]
fs (ExecShellWait AExecShell{Val
ShowWindow
esShow :: AExecShell -> ShowWindow
esCommand :: AExecShell -> Val
esCommand :: Val
esShow :: ShowWindow
..}) = [[String] -> String
unwords [String
"ExecShellWait",String
"\"\"",Val -> String
forall a. Show a => a -> String
show Val
esCommand,ShowWindow -> String
forall a. Show a => a -> String
show ShowWindow
esShow]]
out [Fun]
fs (Plugin String
a String
b [Val]
cs) = [[String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ (String
a String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"::" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
b) String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (Val -> String) -> [Val] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Val -> String
forall a. Show a => a -> String
show [Val]
cs]
out [Fun]
fs (AddPluginDir Val
a) = [[String] -> String
unwords [String
"!addplugindir",Val -> String
forall a. Show a => a -> String
show Val
a]]
out [Fun]
fs (FindWindow Var
a Val
b Val
c Maybe Val
d Maybe Val
e) = [[String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"FindWindow" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: Var -> String
forall a. Show a => a -> String
show Var
a String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (Val -> String) -> [Val] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Val -> String
forall a. Show a => a -> String
show ([Val
b,Val
c] [Val] -> [Val] -> [Val]
forall a. [a] -> [a] -> [a]
++ Maybe Val -> [Val]
forall a. Maybe a -> [a]
maybeToList Maybe Val
d [Val] -> [Val] -> [Val]
forall a. [a] -> [a] -> [a]
++ Maybe Val -> [Val]
forall a. Maybe a -> [a]
maybeToList Maybe Val
e)]
out [Fun]
fs (SendMessage Val
a Val
b Val
c Val
d Var
e Maybe Int
f) = [[String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"SendMessage" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: Val -> String
forall a. Show a => a -> String
show Val
a String -> [String] -> [String]
forall a. a -> [a] -> [a]
: Val -> String
forall a. Show a => a -> String
show Val
b String -> [String] -> [String]
forall a. a -> [a] -> [a]
: Val -> String
forall a. Show a => a -> String
show Val
c String -> [String] -> [String]
forall a. a -> [a] -> [a]
: Val -> String
forall a. Show a => a -> String
show Val
d String -> [String] -> [String]
forall a. a -> [a] -> [a]
: Var -> String
forall a. Show a => a -> String
show Var
e String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String
"/TIMEOUT=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
x | Just Int
x <- [Maybe Int
f]]]
out [Fun]
fs (Unicode Bool
x) = [String
"Unicode " String -> String -> String
forall a. [a] -> [a] -> [a]
++ if Bool
x then String
"true" else String
"false"]
out [Fun]
fs (UnsafeInject String
x) = [String
x]
out [Fun]
fs (UnsafeInjectGlobal String
x) = [String
x]
out [Fun]
fs (WriteRegMultiStr HKEY
k Val
a Val
b Val
c) = [[String] -> String
unwords [String
"WriteRegMultiStr", String
"/REGEDIT5", HKEY -> String
forall a. Show a => a -> String
show HKEY
k, Val -> String
forall a. Show a => a -> String
show Val
a, Val -> String
forall a. Show a => a -> String
show Val
b, Val -> String
forall a. Show a => a -> String
show Val
c]]
out [Fun]
fs NSIS
x = [NSIS -> String
forall a. Show a => a -> String
show NSIS
x]
showPage :: Page -> String
showPage :: Page -> String
showPage (License String
x) = String
"LICENSE \"" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\""
showPage Page
x = (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toUpper (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Page -> String
showPageCtor Page
x
showFinish :: FinishOptions -> [String]
showFinish :: FinishOptions -> [String]
showFinish FinishOptions{Bool
String
finRun :: String
finRunText :: String
finRunParamters :: String
finRunChecked :: Bool
finReadme :: String
finReadmeText :: String
finReadmeChecked :: Bool
finLink :: String
finLinkText :: String
finLinkText :: FinishOptions -> String
finLink :: FinishOptions -> String
finReadmeChecked :: FinishOptions -> Bool
finReadmeText :: FinishOptions -> String
finReadme :: FinishOptions -> String
finRunChecked :: FinishOptions -> Bool
finRunParamters :: FinishOptions -> String
finRunText :: FinishOptions -> String
finRun :: FinishOptions -> String
..} =
[String
"!define MUI_FINISHPAGE_RUN " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
finRun | String
finRun String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
forall a. Default a => a
def] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!define MUI_FINISHPAGE_RUN_TEXT " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
finRunText | String
finRunText String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
forall a. Default a => a
def] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!define MUI_FINISHPAGE_RUN_PARAMETERS " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
finRunParamters | String
finRunParamters String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
forall a. Default a => a
def] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!define MUI_FINISHPAGE_RUN_NOTCHECKED" | Bool -> Bool
not Bool
finRunChecked Bool -> Bool -> Bool
&& String
finRun String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
forall a. Default a => a
def] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!define MUI_FINISHPAGE_SHOWREADME " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
finReadme | String
finReadme String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
forall a. Default a => a
def] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!define MUI_FINISHPAGE_SHOWREADME_TEXT " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
finReadmeText | String
finReadmeText String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
forall a. Default a => a
def] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED" | Bool -> Bool
not Bool
finReadmeChecked Bool -> Bool -> Bool
&& String
finReadme String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
forall a. Default a => a
def] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!define MUI_FINISHPAGE_LINK_LOCATION " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
finLink | String
finLink String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
forall a. Default a => a
def] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++
[String
"!define MUI_FINISHPAGE_LINK " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
finLinkText | String
finLinkText String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
forall a. Default a => a
def]
indent :: String -> String
indent String
x = String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
x