Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > Školní kalendář v PowerShellu
říjen 12
Školní kalendář v PowerShellu

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}">&nbsp;</td><td class="day dayDate {0}{1}">&nbsp;</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é.

Comments

Re: Školní kalendář v PowerShellu

Chybí ti tam to nejdůležitější! Prázdniny a vysvědčení :)
Borek on 13.10.2016 9:29

Re: Školní kalendář v PowerShellu

ACH! Toto je skvělý a užitečný článek. Opravdu, opravdu to miluji. Je to velmi dobré a úžasné. Jen mě to překvapilo. Doufám, že i v budoucnu budete ve své práci pokračovat. https://geometry-dash.io/
nice on 18.10.2023 5:26

Add Comment

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Type number two as digit *


Semhle vyplňte číslici dvě. Předchozí antispemové pole nefunguje úplně dokonale, zdá se, že jsou i spamery, které pochopily, že je občas potřeba vyplnit autora :-)

Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments