2024-06-10 15:24:12 -05:00
param (
[ switch ] $Debug
)
2023-03-07 12:28:00 -08:00
$OFS = " `r`n "
$scriptname = "winutil.ps1"
2024-06-10 15:24:12 -05:00
2024-02-21 16:06:27 -06:00
# Variable to sync between runspaces
$sync = [ Hashtable ]:: Synchronized ( @ {})
$sync . PSScriptRoot = $PSScriptRoot
$sync . configs = @ {}
2023-03-07 12:28:00 -08:00
2024-06-10 15:24:12 -05:00
$header = @"
2023-03-07 12:28:00 -08:00
################################################################################################################
### ###
### WARNING: This file is automatically generated DO NOT modify this file directly as it will be overwritten ###
### ###
################################################################################################################
2024-06-10 15:24:12 -05:00
"@
2023-03-07 12:28:00 -08:00
2024-06-10 15:24:12 -05:00
# Create the script in memory.
$script_content = [ System.Collections.Generic.List[string] ]:: new ()
2023-03-07 12:28:00 -08:00
2024-06-10 15:24:12 -05:00
Write-Progress -Activity "Compiling" -Status "Adding: Header" -PercentComplete 5
$script_content . Add ( $header )
Write-Progress -Activity "Compiling" -Status "Adding: Version" -PercentComplete 10
$script_content . Add ( $ ( Get-Content .\ scripts \ start . ps1 ). replace ( '#{replaceme}' , " $( Get-Date -Format yy . MM . dd ) " ))
2023-03-07 12:28:00 -08:00
2024-06-10 15:24:12 -05:00
Write-Progress -Activity "Compiling" -Status "Adding: Functions" -PercentComplete 20
Get-ChildItem .\ functions -Recurse -File | ForEach-Object {
$script_content . Add ( $ ( Get-Content $psitem . FullName ))
}
Write-Progress -Activity "Compiling" -Status "Adding: Config *.json" -PercentComplete 40
2023-03-07 12:28:00 -08:00
Get-ChildItem .\ config | Where-Object { $psitem . extension -eq ".json" } | ForEach-Object {
2024-06-10 15:24:12 -05:00
2023-03-07 12:28:00 -08:00
$json = ( Get-Content $psitem . FullName ). replace ( "'" , "''" )
2024-04-20 16:38:43 -05:00
# Replace every XML Special Character so it'll render correctly in final build
# Only do so if json files has content to be displayed (for example the applications, tweaks, features json files)
2024-06-10 15:24:12 -05:00
# Some Type Convertion using Casting and Cleaning Up of the convertion result using 'Replace' Method
2024-04-20 16:38:43 -05:00
$jsonAsObject = $json | convertfrom-json
$firstLevelJsonList = ([ System.String ] $jsonAsObject ). split ( '=;' ) | ForEach-Object {
$_ . Replace ( '=}' , '' ). Replace ( '@{' , '' ). Replace ( ' ' , '' )
}
for ( $i = 0 ; $i -lt $firstLevelJsonList . Count ; $i += 1 ) {
$firstLevelName = $firstLevelJsonList [ $i ]
# Note: Avoid using HTML Entity Codes (for example '”' (stands for "Right Double Quotation Mark")), and use HTML decimal/hex codes instead.
2024-06-10 15:24:12 -05:00
# as using HTML Entity Codes will result in XML parse Error when running the compiled script.
2024-04-20 16:38:43 -05:00
if ( $jsonAsObject . $firstLevelName . content -ne $null ) {
$jsonAsObject . $firstLevelName . content = $jsonAsObject . $firstLevelName . content . replace ( '&' , '&' ). replace ( '“' , '“' ). replace ( '”' , '”' ). replace ( "'" , ''' ). replace ( '<' , '<' ). replace ( '>' , '>' )
$jsonAsObject . $firstLevelName . content = $jsonAsObject . $firstLevelName . content . replace ( '''' , "'" ) # resolves the Double Apostrophe caused by the first replace function in the main loop
}
if ( $jsonAsObject . $firstLevelName . description -ne $null ) {
$jsonAsObject . $firstLevelName . description = $jsonAsObject . $firstLevelName . description . replace ( '&' , '&' ). replace ( '“' , '“' ). replace ( '”' , '”' ). replace ( "'" , ''' ). replace ( '<' , '<' ). replace ( '>' , '>' )
$jsonAsObject . $firstLevelName . description = $jsonAsObject . $firstLevelName . description . replace ( '''' , "'" ) # resolves the Double Apostrophe caused by the first replace function in the main loop
}
}
# The replace at the end is required, as without it the output of converto-json will be somewhat weird for Multiline String
2024-06-10 15:24:12 -05:00
# Most Notably is the scripts in json files, making it harder for users who want to review these scripts that are found in the final compiled script
2024-04-20 16:38:43 -05:00
$json = ( $jsonAsObject | convertto-json -Depth 3 ). replace ( '\r\n' , " `r`n " )
2024-02-21 16:06:27 -06:00
$sync . configs . $ ( $psitem . BaseName ) = $json | convertfrom-json
2024-06-10 15:24:12 -05:00
$script_content . Add ( $ ( Write-output " `$ sync.configs. $( $psitem . BaseName ) = ' $json ' `| convertfrom-json" ))
2023-03-07 12:28:00 -08:00
}
2024-06-10 15:24:12 -05:00
Write-Progress -Activity "Compiling" -Status "Adding: Config *.cfg" -PercentComplete 45
2024-06-04 20:27:27 -07:00
Get-ChildItem .\ config | Where-Object { $PSItem . Extension -eq ".cfg" } | ForEach-Object {
2024-06-10 15:24:12 -05:00
$script_content . Add ( $ ( Write-output " `$ sync.configs. $( $psitem . BaseName ) = ' $( Get-Content $PSItem . FullName ) '" ))
}
Get-ChildItem .\ config | Where-Object { $PSItem . Extension -eq ".cfg" } | ForEach-Object {
$script_content . Add ( $ ( Write-output " `$ sync.configs. $( $psitem . BaseName ) = ' $( Get-Content $PSItem . FullName ) '" ))
2024-06-04 20:27:27 -07:00
}
2023-03-07 12:28:00 -08:00
2024-03-21 16:58:40 -07:00
$xaml = ( Get-Content .\ xaml \ inputXML . xaml ). replace ( "'" , "''" )
2024-02-21 16:06:27 -06:00
# Dot-source the Get-TabXaml function
. .\ functions \ private \ Get-TabXaml . ps1
2024-06-10 15:24:12 -05:00
Write-Progress -Activity "Compiling" -Status "Building: Xaml " -PercentComplete 75
$appXamlContent = Get-TabXaml "applications" 5
$tweaksXamlContent = Get-TabXaml "tweaks"
$featuresXamlContent = Get-TabXaml "feature"
2024-02-21 16:06:27 -06:00
2024-03-21 16:58:40 -07:00
2024-06-10 15:24:12 -05:00
Write-Progress -Activity "Compiling" -Status "Adding: Xaml " -PercentComplete 90
2024-03-21 16:58:40 -07:00
# Replace the placeholder in $inputXML with the content of inputApp.xaml
$xaml = $xaml -replace "{{InstallPanel_applications}}" , $appXamlContent
$xaml = $xaml -replace "{{InstallPanel_tweaks}}" , $tweaksXamlContent
$xaml = $xaml -replace "{{InstallPanel_features}}" , $featuresXamlContent
2024-06-10 15:24:12 -05:00
$script_content . Add ( $ ( Write-output " `$ inputXML = ' $xaml '" ))
$script_content . Add ( $ ( Get-Content .\ scripts \ main . ps1 ))
if ( $Debug ){
Write-Progress -Activity "Compiling" -Status "Writing debug files" -PercentComplete 95
$appXamlContent | Out-File -FilePath ".\xaml\inputApp.xaml" -Encoding ascii
$tweaksXamlContent | Out-File -FilePath ".\xaml\inputTweaks.xaml" -Encoding ascii
$featuresXamlContent | Out-File -FilePath ".\xaml\inputFeatures.xaml" -Encoding ascii
}
else {
Write-Progress -Activity "Compiling" -Status "Removing temporary files" -PercentComplete 99
Remove-Item ".\xaml\inputApp.xaml" -ErrorAction SilentlyContinue
Remove-Item ".\xaml\inputTweaks.xaml" -ErrorAction SilentlyContinue
Remove-Item ".\xaml\inputFeatures.xaml" -ErrorAction SilentlyContinue
}
2024-03-21 16:58:40 -07:00
2024-06-10 15:24:12 -05:00
Set-Content -Path $scriptname -Value ( $script_content -join " `r`n " ) -Encoding ascii
Write-Progress -Activity "Compiling" -Completed