| Kamarád mě pořád otravuje, že prý mám něco konečně napsat, jinak ten můj blog přestane číst. A protože on tvrdí, že je jediným čtenářem, tak jsem mu musel jeho přání splnit. Bylo by mě tu smutno.
Otázka zůstává, jestli zrovna tohle využije. Udělal jsem si pro Janka školní kalendář v PowerShellu, aby se konečně naučil měsíce. Tak třeba se to někomu bude líbit. Výběr těch barev mě zabral tak tři hodiny. Hrůza.
Ve skriptu stačí hned na začátku změnit nadpis $title a seznam volných dnů v proměnné $specialDays2.
[string] $title = 'Školní kalendář pro mého Janíčka'
[string[]] $specialDays2 = @(
'7.10.',
'18.11.',
'22.12.',
'23.12.',
'27.12.',
'28.12.',
'29.12.',
'30.12.',
'13.4.'
)
[string[]] $specialDays = @(
'28.9.',
'28.10.',
'17.11.',
'24.12.',
'25.12.',
'26.12.',
'1.1.',
'14.4.',
'17.4.',
'1.5.',
'8.5.',
'5.7.',
'6.7.'
)
[string] $zeroSpring = '2016-03-20'
[string] $zeroSummer = '2016-06-21'
[string] $firstAutumn = '2016-09-22'
[string] $firstWinter = '2016-12-21'
[string] $firstSpring = '2017-03-20'
[string] $firstSummer = '2017-06-21'
[string] $zeroAutumn = '2017-09-22'
[string] $zeroWinter = '2017-12-21'
[int] $year = 2016
[int] $startMonth = 9
[string] $outFile = Join-Path $env:TEMP ('skolni-kalendar-{0}-{1}.htm' -f $year, ($year + 1))
[int[]] $monthSeparators = @(1, 6)
#
#
[hashtable] $monthNames = @{
1 = 'Leden'
2 = 'Únor'
3 = 'Březen'
4 = 'Duben'
5 = 'Květen'
6 = 'Červen'
7 = 'Červenec'
8 = 'Srpen'
9 = 'Září'
10 = 'Říjen'
11 = 'Listopad'
12 = 'Prosinec'
}
[hashtable] $dayNames = @{
1 = 'Pondělí'
2 = 'Úterý'
3 = 'Středa'
4 = 'Čtvrtek'
5 = 'Pátek'
6 = 'Sobota'
7 = 'Neděle'
}
[hashtable] $dayNamesShort = @{
1 = 'Po'
2 = 'Út'
3 = 'St'
4 = 'Čt'
5 = 'Pá'
6 = 'So'
7 = 'Ne'
}
[hashtable] $dayNumbers = @{
'Monday' = 1
'Tuesday' = 2
'Wednesday' = 3
'Thursday' = 4
'Friday' = 5
'Saturday' = 6
'Sunday' = 7
}
[hashtable] $seasons = @{
1 = 'zima'
2 = 'jaro'
3 = 'léto'
4 = 'podzim'
}
#
#
[DateTime] $start = [DateTime]::Parse(('{0}-{1:D2}-01' -f $year, $startMonth))
#
#
function NewDay ([int] $day, [int] $month, [int] $year, [bool] $weekend, [bool] $holiday, [int] $preDaysToMonday, [int] $postDaysToSunday, [int] $dayOfWeek, [int] $season)
{
[PSObject] $newDay = New-Object PSObject
Add-Member -Input $newDay -MemberType NoteProperty -Name day -Value $day
Add-Member -Input $newDay -MemberType NoteProperty -Name month -Value $month
Add-Member -Input $newDay -MemberType NoteProperty -Name year -Value $year
Add-Member -Input $newDay -MemberType NoteProperty -Name weekend -Value $weekend
Add-Member -Input $newDay -MemberType NoteProperty -Name holiday -Value $holiday
Add-Member -Input $newDay -MemberType NoteProperty -Name preDays -Value $preDaysToMonday
Add-Member -Input $newDay -MemberType NoteProperty -Name postDays -Value $postDaysToSunday
Add-Member -Input $newDay -MemberType NoteProperty -Name dayOfWeek -Value $dayOfWeek
Add-Member -Input $newDay -MemberType NoteProperty -Name season -Value $season
return $newDay
}
function Season ([DateTime] $dayDate) {
$date = $dayDate.Date
if ($date -lt $zeroSpring) {
return 1
}
if (($date -ge $zeroSpring) -and ($date -lt $zeroSummer)) {
return 2
}
if (($date -ge $zeroSummer) -and ($date -lt $firstAutumn)) {
return 3
}
if (($date -ge $firstAutumn) -and ($date -lt $firstWinter)) {
return 4
}
if (($date -ge $firstWinter) -and ($date -lt $firstSpring)) {
return 1
}
if (($date -ge $firstSpring) -and ($date -lt $firstSummer)) {
return 2
}
if (($date -ge $firstSummer) -and ($date -lt $zeroAutumn)) {
return 3
}
if (($date -ge $zeroAutumn) -and ($date -lt $zeroWinter)) {
return 4
}
if ($date -ge $zeroWinter) {
return 1
}
}
function PreDays ([DateTime] $start) {
[int] $preDays = 0
if ($start.DayOfWeek -eq [System.DayOfWeek]::Saturday) { $preDays = 5 }
if ($start.DayOfWeek -eq [System.DayOfWeek]::Sunday) { $preDays = 6 }
if ($start.DayOfWeek -eq [System.DayOfWeek]::Monday) { $preDays = 0 }
if ($start.DayOfWeek -eq [System.DayOfWeek]::Tuesday) { $preDays = 1 }
if ($start.DayOfWeek -eq [System.DayOfWeek]::Wednesday) { $preDays = 2 }
if ($start.DayOfWeek -eq [System.DayOfWeek]::Thursday) { $preDays = 3 }
if ($start.DayOfWeek -eq [System.DayOfWeek]::Friday) { $preDays = 4 }
return $preDays
}
function PostDays ([DateTime] $end) {
[int] $postDays = 0
if ($end.DayOfWeek -eq [System.DayOfWeek]::Monday) { $postDays = 6 }
if ($end.DayOfWeek -eq [System.DayOfWeek]::Tuesday) { $postDays = 5 }
if ($end.DayOfWeek -eq [System.DayOfWeek]::Wednesday) { $postDays = 4 }
if ($end.DayOfWeek -eq [System.DayOfWeek]::Thursday) { $postDays = 3 }
if ($end.DayOfWeek -eq [System.DayOfWeek]::Friday) { $postDays = 2 }
if ($end.DayOfWeek -eq [System.DayOfWeek]::Saturday) { $postDays = 1 }
if ($end.DayOfWeek -eq [System.DayOfWeek]::Sunday) { $postDays = 0 }
return $postDays
}
#
#
[hashtable] $calendar = @{}
[DateTime] $pointer = $start
[int] $monthPointed = 0
while ($pointer -ne $start.AddYears(1)) {
[int] $preDays = 0
if ($pointer.Month -ne $monthPointed) {
$monthPointed = $pointer.Month
[void] $calendar.Add($monthPointed, (New-Object System.Collections.ArrayList))
$preDays = PreDays $pointer
}
$nextDay = $pointer.AddDays(1)
[int] $postDays = 0
if ($nextDay.Day -eq 1) {
$postDays = PostDays $pointer
}
[bool] $isWeekend = ($pointer.DayOfWeek -eq [System.DayOfWeek]::Saturday) -or ($pointer.DayOfWeek -eq [System.DayOfWeek]::Sunday)
[bool] $isHoliday = ($specialDays -contains ('{0}.{1}.' -f $pointer.Day, $pointer.Month)) -or ($specialDays2 -contains ('{0}.{1}.' -f $pointer.Day, $pointer.Month))
[void] $calendar[$monthPointed].Add((NewDay -day $pointer.Day -month $pointer.Month -year $pointer.Year -weekend $isWeekend -holiday $isHoliday -preDaysToMonday $preDays -postDaysToSunday $postDays -dayOfWeek $dayNumbers[$pointer.DayOfWeek.ToString()] -season (Season $pointer)))
$pointer = $nextDay
}
#
#
#
#
[System.Text.StringBuilder] $outHtml = New-Object System.Text.StringBuilder
[void] $outHtml.AppendLine(('<html><head><meta http-equiv=Content-Type content="text/html; charset=UTF-8"><title>{0}</title>' -f $title))
[void] $outHtml.AppendLine('<style>')
[void] $outHtml.AppendLine('* { font-family: "Segoe UI",Arial,sans-serif; }')
[void] $outHtml.AppendLine('h1 { text-align: center; }')
[void] $outHtml.AppendLine('table { border-spacing: 0; margin: 0 auto; }')
[void] $outHtml.AppendLine('table.wrapper { table-layout: fixed; }')
[void] $outHtml.AppendLine('th { text-align: center; font-size: 120%; background-color: #E9E9E9; padding: 5px; }')
[void] $outHtml.AppendLine('td { padding: 5px; }')
[void] $outHtml.AppendLine('td.dayName { padding-left: 10px; }')
[void] $outHtml.AppendLine('td.dayDate { padding-right: 10px; }')
[void] $outHtml.AppendLine('td.day { text-align: center; }')
[void] $outHtml.AppendLine('td.dayWinter { background-color: #EAF4FF; }')
[void] $outHtml.AppendLine('td.daySpring { background-color: #EAFFD5; }')
[void] $outHtml.AppendLine('td.daySummer { background-color: #FFEAEA; }')
[void] $outHtml.AppendLine('td.dayAutumn { background-color: #FFFFD5; }')
[void] $outHtml.AppendLine('td.holidayWinter { font-weight: normal; background-color: #D5E9FF; }')
[void] $outHtml.AppendLine('td.holidaySpring { font-weight: normal; background-color: #DAFFB5; }')
[void] $outHtml.AppendLine('td.holidaySummer { font-weight: normal; background-color: #FFD5D5; }')
[void] $outHtml.AppendLine('td.holidayAutumn { font-weight: normal; background-color: #FFFFB5; }')
[void] $outHtml.AppendLine('td.weekendWinter { font-weight: bold; background-color: #D5E9FF; }')
[void] $outHtml.AppendLine('td.weekendSpring { font-weight: bold; background-color: #DAFFB5; }')
[void] $outHtml.AppendLine('td.weekendSummer { font-weight: bold; background-color: #FFD5D5; }')
[void] $outHtml.AppendLine('td.weekendAutumn { font-weight: bold; background-color: #FFFFB5; }')
[void] $outHtml.AppendLine('</style>')
[void] $outHtml.AppendLine('</head>')
[void] $outHtml.AppendLine(('<body><table class="wrapper"><tr><td colspan="{0}"><h1>{1}</h1></td></tr>' -f (12 + $monthSeparators.Length), $title))
#
#
function DayCell ([int] $i, [int] $row)
{
[Text.StringBuilder] $dayCell = New-Object Text.StringBuilder
#[void] $dayCell.Append('<td><table><tr>')
$oneDay = $calendar[$i][$row]
[string] $class = 'day'
if ($oneDay.holiday) {
$class = 'holiday'
}
if ($oneDay.weekend) {
$class = 'weekend'
}
switch ($oneDay.season) {
1 { $season = 'Winter' }
2 { $season = 'Spring' }
3 { $season = 'Summer' }
4 { $season = 'Autumn' }
}
if (-not ([object]::Equals($oneDay, $null))) {
[void] $dayCell.Append(('<td class="day dayName {0}{1}">{2}</td><td class="day dayDate {0}{1}">{3}.{4}.</td>' -f $class, $season, $dayNamesShort[$oneDay.dayOfWeek], $oneDay.day, $oneDay.month))
} else {
[void] $dayCell.Append(('<td class="day dayName {0}{1}"> </td><td class="day dayDate {0}{1}"> </td>' -f $class, $season))
}
#[void] $dayCell.Append('</tr></table><td>')
return $dayCell.ToString()
}
function MonthCells ([int] $i, [int] $maxDays)
{
[Text.StringBuilder] $cells = New-Object Text.StringBuilder
[int] $dayCounter = 1
for ($row = 0; $row -lt $maxDays; $row++) {
[void] $cells.Append('<tr>')
[void] $cells.Append((DayCell $i $row))
[void] $cells.AppendLine('</tr>')
if ($dayCounter -lt 7) {
$dayCounter ++
} else {
$dayCounter = 1
}
}
return $cells.ToString()
}
function MonthCell ([int] $i, [int] $maxDays, [int] $year)
{
[Text.StringBuilder] $month = New-Object Text.StringBuilder
[void] $month.Append('<td class="month">')
[void] $month.Append(('<table class="month" id="month{0:D2}">' -f $i))
[void] $month.Append('<tr>')
[void] $month.Append(('<th colspan="2">{0}<br/>{1}</th>' -f $monthNames[$i], $year))
[void] $month.AppendLine('</tr>')
[void] $month.AppendLine('<tr><td colspan="2"></td></tr>')
[void] $month.Append((MonthCells $i $maxDays))
[void] $month.Append('</table>')
[void] $month.AppendLine('</td>')
return $month.ToString()
}
#
#
[int] $maxDays = 0
foreach ($oneMonth in $calendar.Keys) {
$maxDays = [Math]::Max($maxDays, $calendar[$oneMonth].Count)
}
[void] $outHtml.Append('<tr>')
for ($i = $startMonth; $i -le 12; $i++) {
[void] $outHtml.Append((MonthCell $i $maxDays $year))
if ($monthSeparators -contains $i) {
[void] $outHtml.AppendLine(('<td class="monthSept"></td>'))
}
}
for ($i = 1; $i -lt $startMonth; $i ++) {
[void] $outHtml.Append((MonthCell $i $maxDays ($year + 1)))
if ($monthSeparators -contains $i) {
[void] $outHtml.AppendLine(('<td class="monthSept"></td>'))
}
}
[void] $outHtml.AppendLine('</tr>')
#
#
[void] $outHtml.AppendLine('<tr>')
[void] $outHtml.AppendLine('</table></body></html>')
$outHtml.ToString() | Set-Content -LiteralPath $outFile -Encoding UTF8
No a to je pro dnešek všechno, přátelé. |