1+ $defaultStyleText = " (default style)"
2+ $headerMarkdown = " ##"
3+ $listMarkdown = " -"
4+ $themesDirectory = " ..\MaterialDesignThemes.Wpf\Themes\"
5+ $outputFileName = " ControlStyleList.md"
6+ $themesFullDir = Join-Path $PSScriptRoot $themesDirectory
7+ $outputFullDir = Join-Path $PSScriptRoot $outputFileName
8+ $DebugPreference = ' Continue' # Log debug messages to terminal.
9+
10+ $discoverdStyles = New-Object System.Collections.ArrayList
11+ $defaults = New-Object System.Collections.ArrayList
12+
13+ Function Main {
14+ # Get xaml files and loop through.
15+ Get-ChildItem $themesFullDir - Filter * .xaml |
16+ Foreach-Object {
17+ $xamlString = Get-Content - Path $_.FullName
18+ $file = Select-ControlNameFromFile ($_.Name )
19+ Read-XamlStyles - xamlString $xamlString - file $file
20+ }
21+ Set-Defaults
22+ Format-Output
23+ }
24+
25+ Function Format-Output {
26+
27+ foreach ($style in $discoverdStyles | Sort-Object - Property Control, @ {Expression = {$_.IsDefault }; Ascending = $false }) {
28+ if ($previousFile -ne $style.File ) {
29+ Write-OutputFile " `n $headerMarkdown $ ( $style.File ) "
30+ }
31+ $previousFile = $style.File ;
32+
33+ if ($style.IsDefault ) {
34+ Write-OutputFile (" $listMarkdown $ ( $style.Style ) $defaultStyleText " -replace ' \s+' , ' ' )
35+ }
36+ else {
37+ Write-OutputFile " $listMarkdown $ ( $style.Style ) "
38+ }
39+ }
40+ }
41+
42+ Function Write-OutputFile {
43+ Param ($output )
44+ Add-content $outputFullDir - value $output
45+ Write-Debug $output # debug
46+ }
47+
48+ Function Set-Defaults {
49+ $remainingDefaults = New-Object System.Collections.ArrayList
50+ ForEach ($default in $defaults ) {
51+ $style = $discoverdStyles.Where ({$_.style -match $default.style })
52+ if ($null -ne $style [0 ]) {
53+ $style [0 ].IsDefault = $true
54+ }
55+ else {
56+ $remainingDefaults.Add ($default )
57+ }
58+ }
59+ $discoverdStyles | Format-Table # debug
60+ $remainingDefaults | Format-Table # debug
61+ }
62+
63+ Function Select-ControlNameFromFile {
64+ Param ($fileName )
65+ return $fileName -replace " .xaml" -replace " MaterialDesignTheme."
66+ }
67+
68+ Function Read-XamlStyles {
69+ Param ($xamlString , $file )
70+ [xml ]$xaml = $xamlString
71+ $xaml.selectNodes (" //*" ) | Where-Object {$_.LocalName -eq " Style" } |
72+ Foreach-Object {
73+ if ($file -eq " Defaults" ) {
74+ # Special handeling of Defaults
75+ New-Default - style $_ - file $file
76+ }
77+ elseif ($file -eq " Generic" ) {
78+ # Special handeling of Generic
79+ New-GenericDefault - style $_ - file $file
80+ }
81+ else {
82+ New-Style - style $_ - file $file
83+ }
84+ }
85+ }
86+
87+ Function New-GenericDefault {
88+ Param ($style , $file )
89+ $targetType = Read-TargetType ($style | Select-Object TargetType)
90+ $basedOn = Read-BasedOn ($style | Select-Object BasedOn)
91+ $styleNameValue = ($style | Select-Object Key).Key
92+ $defaultStyleName = if ($null -eq $styleNameValue ) { $basedOn } else { $styleNameValue }
93+ Write-Debug " [$file ] [Type: $targetType ] [StyleNameValue: $styleNameValue ] [BasedOn: $basedOn ] [DefaultStyleName: $defaultStyleName ]"
94+ Add-DefaultStyle - file $file - targetType $targetType - styleName $defaultStyleName
95+ }
96+
97+
98+ Function New-Default {
99+ Param ($style , $file )
100+ $targetType = Read-TargetType ($style | Select-Object TargetType)
101+ $basedOn = Read-BasedOn ($style | Select-Object BasedOn)
102+ $styleNameValue = ($style | Select-Object Key).Key
103+ $defaultStyleName = if ($null -eq $styleNameValue ) { $basedOn } else { $styleNameValue }
104+ Write-Debug " [$file ] [Type: $targetType ] [StyleNameValue: $styleNameValue ] [BasedOn: $basedOn ] [DefaultStyleName: $defaultStyleName ]"
105+ Add-DefaultStyle - file $file - targetType $targetType - styleName $defaultStyleName
106+ }
107+
108+ Function New-Style {
109+ Param ($style , $file )
110+ $targetType = Read-TargetType ($style | Select-Object TargetType)
111+ $styleName = ($style | Select-Object Key).Key
112+ $splittedFile = $file.split (' .' ) # Suport for "nested" file names like DataGrid.ComboBox
113+
114+ if ($targetType -eq $splittedFile [-1 ]) {
115+ Write-Debug " [Match ] [File: $file ] [Type: $targetType ] [Style: $styleName ]"
116+ Add-Style - targetType $targetType - styleName $styleName - fileName $file
117+ }
118+ else {
119+ Write-Debug " [Skipped] [File: $file ] [Type: $targetType ] [Style: $styleName ] "
120+ }
121+ }
122+
123+ Function Add-Style {
124+ Param ($targetType , $styleName , $fileName )
125+ $temp = " " | Select-Object " Control" , " Style" , " IsDefault" , " File"
126+ $temp.Control = $targetType
127+ $temp.Style = $styleName
128+ $temp.IsDefault = ! $styleName
129+ $temp.File = $fileName
130+ $discoverdStyles.Add ($temp ) | Out-Null
131+ }
132+
133+ Function Add-DefaultStyle {
134+ Param ($file , $targetType , $styleName )
135+ $temp = " " | Select-Object " File" , " Type" , " Style"
136+ $temp.File = $file
137+ $temp.Type = $targetType
138+ $temp.Style = $styleName
139+ $defaults.Add ($temp ) | Out-Null
140+ }
141+
142+ Function Read-TargetType {
143+ Param ($targetTypeText )
144+ return ($targetTypeText.TargetType -replace " {x:Type" -replace " {x:Type" -replace " .*:" -replace " }*" -replace " Base" ).Trim()
145+ }
146+
147+ Function Read-BasedOn {
148+ Param ($targetTypeText )
149+ return ($targetTypeText.BasedOn -replace " {StaticResource" -replace " .*:" -replace " }*" ).Trim()
150+ }
151+
152+ Main
0 commit comments