Kalender-Script
von heinz- SNIPPET_TEXT:
-
- #!/bin/bash
- #
- # Script um einen Kalender fuer ein bestimmtes Jahr zu erstellen.
- #
- # heinz 29-01-2021
- #
- VERSIOn='0.15'
- DEBUg=false
- # Verzeichnis in dem das Script liegt
- scriptpfad="$(dirname `readlink -f $0`)"
- # Liste der Feiertage
- feiertag_liste="$scriptpfad/feiertagliste.txt"
- # Einstellungen fuer den Kalender
- einstellungen="$scriptpfad/einstellungen.txt"
- # Verzeichnis in dem die Bilder fuer die Monate gesucht werden. (1-12.typ, 01-12.typ, Januar-Dezember.typ, januar-dezember.typ)
- monatsbilder_verzeichnis="$scriptpfad/bilder"
- # Tempverzeichnis
- tempverzeichnis="/tmp/temp_kalender_temp"
- # Verwendete/Benoetigte Programme
- # Anzeigedauer fuer Infos und Fehler in vollen Sekunden
- infopause=5
- # Jahreszahl (ist hier nur, damit man sieht das es sie gibt...)
- jahr=
- # Voreinstellungen fuer dialog
- dialog="dialog --stdout --colors --backtitle ---==\ZbKalender\ZB==---\Z4__$VERSIOn"
- test -s "$scriptpfad/dialogrc" && export DIALOGRC="$scriptpfad/dialogrc"
- # Moegliche Text-Positionen
- textpositionen=( Center North NorthEast East SouthEast South SouthWest West NorthWest )
- # Sofortstart (-e JAHR)
- sofortstart=false
- # Font-Grafik erstellen (--fonts)
- fonts_zeigen=false
- # Funktionen ---------------------------------------------------------------------------------------
- # Feiertags-funktionen ---------------------------------------------------------
- function Feiertage_menue
- {
- local wahl knopf tage_anzeige
- while true
- do
- wahl=$($dialog --title "\Z6[\Z5 Feiertagmenue \Z6]" \
- --default-item "$wahl" \
- --cancel-label "Hauptmenue" \
- --menu '\Z2Bitte waehlen Sie:' 20 75 12 \
- "zeige" "Feiertage" \
- "neuer" "Feiertag" \
- "Feiertage" "bearbeiten" \
- "loesche" "Feiertage")
- knopf=$?
- test $knopf -eq 1 && return
- case "$wahl" in
- 'zeige') # Feiertage anzeigen
- Zeige_feiertage
- ;;
- 'neuer') # Neuen Feiertag erstellen
- Neuer_feiertag
- ;;
- 'Feiertage') # Feiertage bearbeiten
- Aendere_feiertag
- ;;
- 'loesche') # Feiertage loeschen
- Loesche_feiertag
- ;;
- esac
- done
- }
- function Zeige_feiertage
- {
- Gibt_es_eingetragene_Feiertage || return
- # Variablen
- local akt_jahr="`date +%Y`"
- local jahr=$akt_jahr
- local name formel datum z feier_farbe
- # Hauptschleife
- while true
- do
- # Jahr eingeben
- while true
- do
- jahr=`$dialog --title "\Z6[\Z5 Feiertage anzeigen \Z6]" \
- --cancel-label "Zurueck" \
- --inputbox '\Z2Bitte geben Sie das Jahr an: \Z5(4 Stellig)' 8 45 $jahr`
- test -z "$jahr" && return
- # Eingabe testen (4-Stellig und nur Zahlen)
- if test ${#jahr} -ne 4 -o -n "`tr -d '[:digit:]' <<<$jahr`"
- then
- Info "\Z3Die Eingabe \Z2$jahr\Z3 ist nicht korrekt!" Fehler
- else
- break
- fi
- done
- # Feiertage einlesen (In Namen und Formeln aufteilen)
- unset name
- unset formel
- unset datum
- z=0
- while read
- do
- name[$z]="${REPLY%%|*}"
- formel[$z]="${REPLY##*|}"
- let z++
- done <"$feiertag_liste"
- # Feiertage berechnen (in sek. seit...)
- z=0
- while test -n "${formel[$z]}"
- do
- if test "`tr -d '[:digit:]' <<<"${formel[$z]}"`" == '-'
- then
- # Datum ist ein festes Datum
- datum[$z]="$(date -d "$jahr-${formel[$z]}" '+%s')|$z"
- elif grep -qe '^ncal -e$' <<<"${formel[$z]}"
- then
- # Datum ist Ostern
- datum[$z]="$(date -d "$(ncal -e $jahr)" '+%s')|$z"
- elif test -z "`sed -r 's#[+-][[:digit:]]+day##' <<<"${formel[$z]##* }"`"
- then
- # Datum geht von Ostern aus
- datum[$z]="$(date -d "$(ncal -e $jahr) ${formel[$z]##* }" '+%s')|$z"
- else
- # Datum ist falsch
- datum[$z]="Fehler|$z"
- fi
- let z++
- done
- # Feiertage sortieren (nach Datum)
- # Feiertage anzeigen (Bereits vergangene in Rot, noch kommende in Gelb)
- clear
- echo -e "\e[32mFeiertage fuer das Jahr $jahr:\e[10C\e[35m(Heute `date '+%A, %d %B %Y'`)\e[32m\n------------------------------"
- z=0
- while test -n "${datum[$z]}"
- do
- echo -e "$feier_farbe${name[${datum[$z]##*|}]}\r\e[40C\e[36m`date -d "@${datum[$z]%%|*}" '+%A, %d %B'`\e[0m"
- let z++
- done
- read -sn1
- done
- }
- function Neuer_feiertag # ($1=wert1, $2=wert2 (Sind $1 und $2 "gefuellt", dann Feiertag aendern))
- {
- # Datei erzeugen, wenn noch nicht existent
- touch "$feiertag_liste"
- # Variablen
- local werte wert1 wert2
- local fehler=true
- local datumtest knopf
- local akt_jahr="`date +%Y`"
- local ueberschrift='Neuen Feiertag eintragen'
- local titel='Neuer Feiertag'
- local aendern=false
- # Feiertage aendern?
- if test -n "$1" -a -n "$2"
- then
- wert1="$1"
- wert2="$2"
- ueberschrift='Feiertag aendern'
- titel='Feiertag bearbeiten'
- aendern=true
- fi
- # Hauptschleife
- while $fehler
- do
- fehler=false
- werte=`$dialog --title "\Z6[\Z5 $titel \Z6]" \
- --extra-button --extra-label 'Hilfe' \
- --output-separator \~ \
- --form "\Z2$ueberschrift:" 9 75 2 \
- "Feiertag Name:" 1 2 "$wert1" 1 19 50 50 \
- "Datum (Formel):" 2 2 "$wert2" 2 19 50 50`
- knopf=$?
- # Abbruch-Knopf
- test $knopf -eq 1 && return
- # Werte ermitteln
- wert1="`cut -f1 -d~ <<<"$werte"`"
- wert2="`cut -f2 -d~ <<<"$werte"`"
- # OK-Knopf
- if test $knopf -eq 0
- then
- # Auf leere Eingaben testen
- if test -z "$wert1" -o -z "$wert2"
- then
- fehler=true
- Info '\Z3Bitte keine leeren Angaben!' Fehler
- fi
- # Auf verbotenes Zeichen >|< testen
- if grep -qe '|' <<<"$wert1$wert2"
- then
- fehler=true
- Info '\Z3Bitte keine >\Z2|\Z3< Zeichen verwenden!' Fehler
- fi
- # Existiert der Feiertag schon?
- if grep -qe "^$wert1|" "$feiertag_liste" && ! $aendern
- then
- fehler=true
- Info '\Z3Dieser Feiertag existiert schon!' Fehler
- fi
- # Datum testen
- datumtest=
- if test "`tr -d '[:digit:]' <<<"$wert2"`" == '-'
- then
- # Datum ist ein festes Datum
- elif grep -qe '^ncal -e$' <<<"$wert2"
- then
- # Datum ist Ostern
- elif test -z "`sed -r 's#[+-][[:digit:]]+day##' <<<"${wert2##* }"`"
- then
- # Datum geht von Ostern aus
- else
- # Datum ist falsch
- fehler=true
- Info '\Z3Das Datum ist falsch! \Z4(Siehe Hilfe...)' Fehler
- fi
- # Konnte das Datum ermittelt werden?
- if test -z "$datumtest"
- then
- fehler=true
- Info '\Z3Das Datum konnte nicht errechnet werden! \Z4(Siehe Hilfe...)' Fehler
- fi
- else
- # Hilfe-Knopf
- fehler=true
- $dialog --title "\Z6[\Z5 Hilfe \Z6]" --infobox \
- '\Z2Anleitung zur Datumseingabe:\n-----------------------------\n\Z6Methode 1: \Z3Monat-Tag\Z6 z.B. \Z31 Mai\Z6 = \Z35-1\Z6\n\nMethode 2: \Z3Ostern\Z6 = \Z3ncal -e\Z6\n\nMethode 3: \Z3Pfingstsonntag\Z6 = \Z3ncal -e +49day\Z6\n oder : \Z3Karfreitag\Z6 = \Z3ncal -e -2day' \
- 10 75
- read -sn1
- fi
- # Datum vom Menschen pruefen lassen
- if test -n "$datumtest" -a "$fehler" == 'false'
- then
- if ! $dialog --title "\Z6[\Z5 Feiertag pruefen \Z6]" \
- --yesno "\Z2Das errechnete Datum fuer den Feiertag\n\Z3$wert1\Z2\nim aktuellen Jahr \Z3$akt_jahr\Z2\nlautet: \Z3$datumtest\Z2\n\nIst das korrekt?" \
- 10 75
- then
- fehler=true
- fi
- fi
- done
- # Feiertag aendern?
- if $aendern
- then
- # Feiertag aus Liste entfernen
- grep -ve "^$1|" "$feiertag_liste" >"$feiertag_liste.tmp" && mv "$feiertag_liste.tmp" "$feiertag_liste"
- fi
- # Feiertag eintragen
- echo -e "$wert1|$wert2" >>"$feiertag_liste"
- }
- function Aendere_feiertag
- {
- Gibt_es_eingetragene_Feiertage || return
- # Variablen
- local menue name formel wahl z
- # Hauptschleife
- while true
- do
- # Liste erzeugen
- unset name
- unset formel
- menue=
- z=0
- while read
- do
- name[$z]="${REPLY%%|*}"
- formel[$z]="${REPLY##*|}"
- menue="$menue $z ${name[$z]// /_}"
- let z++
- done <"$feiertag_liste"
- # Feiertag auswaehlen
- wahl=$($dialog --title "\Z6[\Z5 Feiertage bearbeiten \Z6]" \
- --cancel-label "Zurueck" \
- --default-item "$wahl" \
- --menu '\Z2Waehlen Sie einen Feiertag:' 20 75 12 $menue)
- test $? -eq 1 && return
- # Feiertag aendern
- Neuer_feiertag "${name[$wahl]}" "${formel[$wahl]}"
- done
- }
- function Loesche_feiertag
- {
- Gibt_es_eingetragene_Feiertage || return
- # Variablen
- local menue name wahl z
- # Hauptschleife
- while true
- do
- # Liste erzeugen
- unset name
- menue=
- z=0
- while read
- do
- name[$z]="${REPLY%%|*}"
- menue="$menue $z ${name[$z]// /_}"
- let z++
- done <"$feiertag_liste"
- # Feiertag auswaehlen
- wahl=$($dialog --title "\Z6[\Z5 Feiertage loeschen \Z6]" \
- --cancel-label "Zurueck" \
- --default-item "$wahl" \
- --menu '\Z2Waehlen Sie einen Feiertag:' 20 75 12 $menue)
- test $? -eq 1 && return
- # Feiertag loeschen Abfrage
- if $dialog --title "\Z6[\Z5 Feiertage loeschen \Z6]" \
- --defaultno \
- --yesno "\Z3>${name[$wahl]}< \Z2loeschen.\n\Z1Sind Sie sicher?" 6 75
- then
- # Loeschen
- grep -ve "^${name[$wahl]}|" "$feiertag_liste" >"$feiertag_liste.tmp" && mv "$feiertag_liste.tmp" "$feiertag_liste"
- fi
- done
- }
- function Feiertagstermine_ermitteln
- {
- test -s "$feiertag_liste" || return
- # Variablen
- local name
- local formel
- local datum
- local z
- # Feiertage einlesen
- z=0
- while read
- do
- name[$z]="${REPLY%%|*}"
- formel[$z]="${REPLY##*|}"
- let z++
- done <"$feiertag_liste"
- # Feiertage berechnen (in sek. seit...)
- z=0
- while test -n "${formel[$z]}"
- do
- if test "`tr -d '[:digit:]' <<<"${formel[$z]}"`" == '-'
- then
- # Datum ist ein festes Datum
- datum[$z]="$(date -d "$jahr-${formel[$z]}" '+%s')|$z"
- elif grep -qe '^ncal -e$' <<<"${formel[$z]}"
- then
- # Datum ist Ostern
- datum[$z]="$(date -d "$(ncal -e $jahr)" '+%s')|$z"
- elif test -z "`sed -r 's#[+-][[:digit:]]+day##' <<<"${formel[$z]##* }"`"
- then
- # Datum geht von Ostern aus
- datum[$z]="$(date -d "$(ncal -e $jahr) ${formel[$z]##* }" '+%s')|$z"
- else
- # Datum ist falsch
- datum[$z]="Fehler|$z"
- fi
- let z++
- done
- # Feiertage sortieren
- # Name und Termin fuer alle Feiertage zurueckgeben.
- z=0
- while test -n "${datum[$z]}"
- do
- echo -e "${name[${datum[$z]##*|}]}|${datum[$z]%%|*}"
- let z++
- done
- }
- # Kalender-Funktionen ----------------------------------------------------------
- function Einstellungen_reset
- {
- tagesgroesse='100x100'
- tagesaufteilung='7x5'
- tagesabstand_h='10'
- tagesabstand_v='20'
- schriftgroesse_tage='30'
- schriftfarbe_tage='#000000'
- schriftfarbe_sonntage='#c00000'
- hintergrundfarbe_tage='#ffffff'
- schriftart="`convert -list font|tr -d ' '|grep Font:|cut -f2 -d:|head -n1`"
- textposition_tage="${textpositionen[1]}"
- rahmendicke_tage=1
- rahmenfarbe_tage='#000000'
- schriftgroesse_monat='50'
- schriftfarbe_monat='#000000'
- rand_h='100'
- rand_v='50'
- hintergrundfarbe_kalender='#ffffff'
- schriftgroesse_feiertag='8'
- textposition_feiertag="${textpositionen[0]}"
- schriftfarbe_feiertag='#0000c0'
- schriftgroesse_woche='10'
- textposition_woche="${textpositionen[5]}"
- schriftfarbe_woche='#000000'
- text_vor_woche='KW'
- Einstellungen_machen
- }
- function Einstellungen_machen
- {
- local wert werte wertmenge z
- local fehler=true
- # Werte in Bearbeitungs-Array ablegen und falls leer, mit "sinnvollen" Standardwerten versehen
- wert=(
- "$jahr"
- "${tagesgroesse:=100x100}"
- "${tagesaufteilung:=7x5}"
- "${tagesabstand_h:=10}"
- "${tagesabstand_v:=20}"
- "${schriftgroesse_tage:=20}"
- "${schriftfarbe_tage:=#000000}"
- "${schriftfarbe_sonntage:=#c00000}"
- "${hintergrundfarbe_tage:=#ffffff}"
- "${schriftart:=`convert -list font|tr -d ' '|grep Font:|cut -f2 -d:|head -n1`}"
- "${textposition_tage:=${textpositionen[1]}}"
- "${rahmendicke_tage:=1}"
- "${rahmenfarbe_tage:=#000000}"
- "${schriftgroesse_monat:=50}"
- "${schriftfarbe_monat:=#000000}"
- "${rand_h:=100}"
- "${rand_v:=50}"
- "${hintergrundfarbe_kalender:=#ffffff}"
- "${schriftgroesse_feiertag:=8}"
- "${textposition_feiertag:=${textpositionen[0]}}"
- "${schriftfarbe_feiertag:=#0000c0}"
- "${schriftgroesse_woche:=10}"
- "${textposition_woche:=${textpositionen[5]}}"
- "${schriftfarbe_woche:=#000000}"
- "${text_vor_woche}"
- )
- # Werte vom User eingeben/aendern lassen und auf korrektheit pruefen
- while $fehler
- do
- fehler=false
- werte=`$dialog --title "\Z6[\Z5 Einstellungen \Z6]" \
- --extra-button --extra-label 'Textpositionen' \
- --help-button --help-label 'Fonts' \
- --ok-label "Speichern" \
- --output-separator \~ \
- --form "\Z2Kalender-Einstellungen:" 19 75 12 \
- "Jahr:" 1 2 "${wert[0]}" 1 40 5 4 \
- "Groesse Tage: (BxH)" 2 2 "${wert[1]}" 2 40 10 9 \
- "Aufteilung Tage: (Horiz.xVert.)" 3 2 "${wert[2]}" 3 40 6 5 \
- "Abstand Tage Horizontal:" 4 2 "${wert[3]}" 4 40 4 3 \
- "Abstand Tage Vertikal:" 5 2 "${wert[4]}" 5 40 4 3 \
- "Schriftgroesse Tage:" 6 2 "${wert[5]}" 6 40 4 3 \
- "Schriftfarbe Tage:" 7 2 "${wert[6]}" 7 40 8 7 \
- "Schriftfarbe Sonntage:" 8 2 "${wert[7]}" 8 40 8 7 \
- "Hintergrundfarbe Tage:" 9 2 "${wert[8]}" 9 40 8 7 \
- "Schriftart:" 10 2 "${wert[9]}" 10 40 41 40 \
- "Textposition Tage:" 11 2 "${wert[10]}" 11 40 10 9 \
- "Rahmendicke Tage:" 12 2 "${wert[11]}" 12 40 3 2 \
- "Rahmenfarbe Tage:" 13 2 "${wert[12]}" 13 40 8 7 \
- "Schriftgroesse Monat:" 14 2 "${wert[13]}" 14 40 4 3 \
- "Schriftfarbe Monat:" 15 2 "${wert[14]}" 15 40 8 7 \
- "Rand Horizontal:" 16 2 "${wert[15]}" 16 40 4 3 \
- "Rand Vertikal:" 17 2 "${wert[16]}" 17 40 4 3 \
- "Hintergrundfarbe Kalender:" 18 2 "${wert[17]}" 18 40 8 7 \
- "Schriftgroesse Feiertag:" 19 2 "${wert[18]}" 19 40 4 3 \
- "Textposition Feiertage:" 20 2 "${wert[19]}" 20 40 10 9 \
- "Schriftfarbe Feiertage:" 21 2 "${wert[20]}" 21 40 8 7 \
- "Schriftgroesse Woche:" 22 2 "${wert[21]}" 22 40 4 3 \
- "Textposition Woche:" 23 2 "${wert[22]}" 23 40 10 9 \
- "Schriftfarbe Woche:" 24 2 "${wert[23]}" 24 40 8 7 \
- "Text vor Woche:" 25 2 "${wert[24]}" 25 40 21 20 \
- `
- # Tasten abfragen
- case "$?" in
- 1) # Abbruch
- return
- ;;
- 3) # Textpositionen anzeigen
- Info "\n\Z6`tr ' ' '\n' <<<"${textpositionen[*]}"`\n\n\Z3Taste:\n" '' 'Warten'
- fehler=true
- ;;
- 2) # Fonts anzeigen
- echo -e "Druecken~Sie~die~Taste~[q]~zum~schliessen.\n~\n`convert -list font`"|grep -e '~' -e 'Font:'|tr -d ' '|tr '~' ' '|cut -f2 -d:|less
- fehler=true
- ;;
- esac
- # Eingegebene Werte wieder in das Array legen
- let wertmenge=`tr '~' '\n' <<<"$werte"|wc -l`-1
- for z in `seq $wertmenge`
- do
- wert[$z-1]="`cut -f$z -d~ <<<"$werte"`"
- done
- # Alle Werte testen
- # Jahr
- if test ${#wert[0]} -ne 4 -o -n "`tr -d '[:digit:]' <<<${wert[0]}`"
- then
- Info "\Z1Die Jahreszahl \Z3${wert[0]:-leer}\Z1 ist nicht korrekt!" Fehler
- fehler=true
- fi
- # Tagesgroesse
- if test -z "${wert[1]}" -o "`tr -d '[:digit:]' <<<${wert[1]}`" != 'x' -o -z "${wert[1]%%x*}" -o -z "${wert[1]##*x}"
- then
- Info "\Z1Die Groesse der Tage \Z3${wert[1]:-leer}\Z1 ist nicht korrekt!" Fehler
- fehler=true
- fi
- # Tagesaufteilung
- if test -z "${wert[2]}" -o "`tr -d '[:digit:]' <<<${wert[2]}`" != 'x' -o -z "${wert[2]%%x*}" -o -z "${wert[2]##*x}" -o $((${wert[2]%%x*}*${wert[2]##*x})) -lt 31
- then
- Info "\Z1Die Aufteilung der Tage \Z3${wert[2]:-leer}\Z1 ist nicht korrekt!" Fehler
- fehler=true
- fi
- # Abstand Tage Horizontal
- Nur_zahlen_test "${wert[3]}" "Der horizontale Abstand der Tage" && fehler=true
- # Abstand Tage Vertikal
- Nur_zahlen_test "${wert[4]}" "Der vertikale Abstand der Tage" && fehler=true
- # Schriftgroesse Tage
- Nur_zahlen_test "${wert[5]}" "Die Schriftgroesse der Tage" && fehler=true
- # Schriftfarbe Tage
- Farbwert_test "${wert[6]}" "Die Schriftfarbe der Tage" && fehler=true
- # Schriftfarbe Sonntage
- Farbwert_test "${wert[7]}" "Die Schriftfarbe der Sonntage" && fehler=true
- # Hintergrundfarbe Tage
- if test "${wert[8]}" != 'none'
- then
- Farbwert_test "${wert[8]}" "Die Hintergrundfarbe der Tage" && fehler=true
- fi
- # Schriftart
- if test -z "${wert[9]}" -o -z "`convert -list font|tr -d ' '|grep Font:|cut -f2 -d:|grep -e "^${wert[9]}$"`"
- then
- Info "\Z1Die Schriftart \Z3${wert[9]:-leer}\Z1 kennt Ihr System nicht!" Fehler
- fehler=true
- fi
- # Textposition Tage
- Textposition_test "${wert[10]}" "Die Schriftposition der Tage" && fehler=true
- # Rahmenstaerke
- Nur_zahlen_test "${wert[11]}" "Die Rahmenstaerke der Tage" && fehler=true
- # Rahmenfarbe
- Farbwert_test "${wert[12]}" "Die Rahmenfarbe der Tage" && fehler=true
- # Schriftgroesse Monat
- Nur_zahlen_test "${wert[13]}" "Die Schriftgroesse der Monate" && fehler=true
- # Schriftfarbe Monat
- Farbwert_test "${wert[14]}" "Die Schriftfarbe der Monate" && fehler=true
- # Rand Horizontal
- Nur_zahlen_test "${wert[15]}" "Der horizontale Rand" && fehler=true
- # Rand Vertikal
- Nur_zahlen_test "${wert[16]}" "Der vertikale Rand" && fehler=true
- # Hintergrundfarbe Kalender
- Farbwert_test "${wert[17]}" "Die Hintergrundfarbe des Kalenders" && fehler=true
- # Schriftgroesse Feiertage
- Nur_zahlen_test "${wert[18]}" "Die Schriftgroesse der Feiertage" && fehler=true
- # Textposition Feiertag
- Textposition_test "${wert[19]}" "Die Schriftposition der Feiertage" && fehler=true
- # Schriftfarbe Feiertage
- Farbwert_test "${wert[20]}" "Die Schriftfarbe der Feiertage" && fehler=true
- # Schriftgroesse Woche
- Nur_zahlen_test "${wert[21]}" "Die Schriftgroesse der Wochen" && fehler=true
- # Textposition Woche
- Textposition_test "${wert[22]}" "Die Schriftposition der Wochen" && fehler=true
- # Schriftfarbe Woche
- Farbwert_test "${wert[23]}" "Die Schriftfarbe der Wochen" && fehler=true
- # Text vor Wochennummer
- # kein Test noetig
- done
- # Werte in Original-Variablen uebernehmen
- jahr="${wert[0]}"
- tagesgroesse="${wert[1]}"
- tagesaufteilung="${wert[2]}"
- tagesabstand_h="${wert[3]}"
- tagesabstand_v="${wert[4]}"
- schriftgroesse_tage="${wert[5]}"
- schriftfarbe_tage="${wert[6]}"
- schriftfarbe_sonntage="${wert[7]}"
- hintergrundfarbe_tage="${wert[8]}"
- schriftart="${wert[9]}"
- textposition_tage="${wert[10]}"
- rahmendicke_tage="${wert[11]}"
- rahmenfarbe_tage="${wert[12]}"
- schriftgroesse_monat="${wert[13]}"
- schriftfarbe_monat="${wert[14]}"
- rand_h="${wert[15]}"
- rand_v="${wert[16]}"
- hintergrundfarbe_kalender="${wert[17]}"
- schriftgroesse_feiertag="${wert[18]}"
- textposition_feiertag="${wert[19]}"
- schriftfarbe_feiertag="${wert[20]}"
- schriftgroesse_woche="${wert[21]}"
- textposition_woche="${wert[22]}"
- schriftfarbe_woche="${wert[23]}"
- text_vor_woche="${wert[24]:+${wert[24]} }"
- # Werte/Einstellungen speichern
- echo "# Einstellungen fuer den Kalender" >"$einstellungen"
- echo "tagesgroesse='$tagesgroesse'" >>"$einstellungen"
- echo "tagesaufteilung='$tagesaufteilung'" >>"$einstellungen"
- echo "tagesabstand_h='$tagesabstand_h'" >>"$einstellungen"
- echo "tagesabstand_v='$tagesabstand_v'" >>"$einstellungen"
- echo "schriftgroesse_tage='$schriftgroesse_tage'" >>"$einstellungen"
- echo "schriftfarbe_tage='$schriftfarbe_tage'" >>"$einstellungen"
- echo "schriftfarbe_sonntage='$schriftfarbe_sonntage'" >>"$einstellungen"
- echo "hintergrundfarbe_tage='$hintergrundfarbe_tage'" >>"$einstellungen"
- echo "schriftart='$schriftart'" >>"$einstellungen"
- echo "textposition_tage='$textposition_tage'" >>"$einstellungen"
- echo "rahmendicke_tage='$rahmendicke_tage'" >>"$einstellungen"
- echo "rahmenfarbe_tage='$rahmenfarbe_tage'" >>"$einstellungen"
- echo "schriftgroesse_monat='$schriftgroesse_monat'" >>"$einstellungen"
- echo "schriftfarbe_monat='$schriftfarbe_monat'" >>"$einstellungen"
- echo "rand_h='$rand_h'" >>"$einstellungen"
- echo "rand_v='$rand_v'" >>"$einstellungen"
- echo "hintergrundfarbe_kalender='$hintergrundfarbe_kalender'" >>"$einstellungen"
- echo "schriftgroesse_feiertag='$schriftgroesse_feiertag'" >>"$einstellungen"
- echo "textposition_feiertag='$textposition_feiertag'" >>"$einstellungen"
- echo "schriftfarbe_feiertag='$schriftfarbe_feiertag'" >>"$einstellungen"
- echo "schriftgroesse_woche='$schriftgroesse_woche'" >>"$einstellungen"
- echo "textposition_woche='$textposition_woche'" >>"$einstellungen"
- echo "schriftfarbe_woche='$schriftfarbe_woche'" >>"$einstellungen"
- echo "text_vor_woche='$text_vor_woche'" >>"$einstellungen"
- }
- function Kalender_erzeugen
- {
- # Testen, ob Einstellungen schon gespeichert wurden
- if ! test -s "$einstellungen"
- then
- Info "\Z3Dies ist der erste Start dieses scriptes!\nSie muessen zuerst die Einstellungen machen."
- return
- fi
- # Benutzte Variablen
- local monat monats_name tag tages_name \
- mon_bil_nam mon_bil_list bildgroesse \
- textfarbe \
- feierliste akt_feiertag tag_in_sek \
- woche woche_merker
- # Liste der Feiertage holen
- feierliste=`Feiertagstermine_ermitteln`
- # Alle Monate durchgehen
- for monat in `seq 1 12`
- do
- monats_name="`date '+%B' -d $jahr-$monat-1`"
- # Alle Tage des Monats durchgehen
- for tag in `cal -h $monat $jahr|tail -n6|tr -d '\n'`
- do
- tages_name="`date '+%a' -d $jahr-$monat-$tag`"
- # Lebenszeichen/Fortschrittsanzeige. (auf Fehlerkanal)
- echo -ne "\e[2K\r$monats_name $tag $tages_name" 1>&2
- # Monatsverzeichnis erstellen
- # Textfarbe an Sonntagen aendern
- test `date '+%u' -d $jahr-$monat-$tag` -ne 7 && textfarbe="$schriftfarbe_tage" || textfarbe="$schriftfarbe_sonntage"
- # Textfarbe an Feiertagen aendern
- akt_feiertag="`grep -e "|$tag_in_sek$" <<<"$feierliste"`"
- if test -n "$akt_feiertag"
- then
- akt_feiertag="${akt_feiertag%|*}"
- textfarbe="$schriftfarbe_feiertag"
- fi
- # Tagesgrafik erstellen
- convert -background "$hintergrundfarbe_tage" \
- -fill "$textfarbe" \
- -mattecolor "$rahmenfarbe_tage" \
- -frame "${rahmendicke_tage}x${rahmendicke_tage}" \
- -font "$schriftart" \
- -size "$tagesgroesse" \
- -pointsize "$schriftgroesse_tage" \
- -gravity "$textposition_tage" \
- label:"$tages_name $tag" "$tempverzeichnis/`printf '%02i' $monat`/`printf '%02i' $tag`.png"
- # Feiertagname auf das Bild schreiben
- if test -n "$akt_feiertag"
- then
- convert "$tempverzeichnis/`printf '%02i' $monat`/`printf '%02i' $tag`.png" \
- -fill "$textfarbe" \
- -font "$schriftart" \
- -pointsize "$schriftgroesse_feiertag" \
- -gravity "$textposition_feiertag" \
- -annotate 0 "$akt_feiertag" \
- "$tempverzeichnis/`printf '%02i' $monat`/`printf '%02i' $tag`.png"
- fi
- # Wochennummer auf das Bild schreiben, wenn Woche wechselt (Mo = erster Tag der Woche = %V)
- # Aktuelle Wochennummer
- woche="`date '+%-V' -d $jahr-$monat-$tag`"
- if test "$woche" != "$woche_merker"
- then
- convert "$tempverzeichnis/`printf '%02i' $monat`/`printf '%02i' $tag`.png" \
- -fill "$schriftfarbe_woche" \
- -font "$schriftart" \
- -pointsize "$schriftgroesse_woche" \
- -gravity "$textposition_woche" \
- -annotate 0 "$text_vor_woche$woche" \
- "$tempverzeichnis/`printf '%02i' $monat`/`printf '%02i' $tag`.png"
- woche_merker="$woche"
- fi
- done
- # Alle Tagesbilder zusammenfassen
- montage -label '' \
- "$tempverzeichnis/`printf '%02i' $monat`/"*.png \
- -tile "$tagesaufteilung" \
- -geometry "$tagesgroesse+$tagesabstand_h+$tagesabstand_v" \
- -background "$hintergrundfarbe_tage" "$tempverzeichnis/${monats_name}_tage.png"
- # Nach Monatsbild suchen (Nummer., 0Nummer., Name., name.)
- mon_bil_list=`ls $monatsbilder_verzeichnis 2>/dev/null`
- mon_bil_nam=
- # Zahlen ohne fuehrende 0
- if grep -qie "^$monat\." <<<"$mon_bil_list"
- then
- mon_bil_nam="$monatsbilder_verzeichnis/`grep -ie "^$monat\." <<<"$mon_bil_list"`"
- # Zahlen mit fuehrender 0
- elif grep -qie "^`printf '%02i' $monat`\." <<<"$mon_bil_list"
- then
- # Gross oder kleingeschriebene Namen
- elif grep -qie "^$monats_name\." <<<"$mon_bil_list"
- then
- mon_bil_nam="$monatsbilder_verzeichnis/`grep -ie "^$monats_name\." <<<"$mon_bil_list"`"
- fi
- # Monatsgrafik erstellen
- bildgroesse=`identify -format '%wx%h' "$tempverzeichnis/${monats_name}_tage.png"`
- if test -n "$mon_bil_nam"
- then
- # Mit Bild
- montage -background "$hintergrundfarbe_kalender" \
- -font "$schriftart" \
- -pointsize "$schriftgroesse_monat" \
- -fill "$schriftfarbe_monat" \
- -title "$monats_name $jahr" \
- "$mon_bil_nam" "$tempverzeichnis/${monats_name}_tage.png" \
- -tile 1x2 \
- -geometry "$bildgroesse+$rand_h+$rand_v" "./${jahr}_`printf '%02i' $monat`.png"
- else
- # Ohne Bild
- montage -background "$hintergrundfarbe_kalender" \
- -font "$schriftart" \
- -pointsize "$schriftgroesse_monat" \
- -fill "$schriftfarbe_monat" \
- -title "$monats_name $jahr" \
- "$tempverzeichnis/${monats_name}_tage.png" \
- -geometry "$bildgroesse+$rand_h+$rand_v" "./${jahr}_`printf '%02i' $monat`.png"
- fi
- done
- # Tempverzeichnis leeren wenn debug ausgeschaltet
- if ! $DEBUg && test -e "$tempverzeichnis"
- then
- rm -r "$tempverzeichnis"
- fi
- }
- # Sonstige Funktionen ----------------------------------------------------------
- function Optionen_test # (Optionen)
- {
- # Hilfe
- if test "$1" == "--help"
- then
- Hilfe $0
- exit 0
- fi
- # Fonts anzeigen
- if test "$1" == "--fonts"
- then
- fonts_zeigen=true
- return
- fi
- # Jahr
- if test -z "$1"
- then
- else
- if test "$1" == '-e'
- then
- sofortstart=true
- shift
- fi
- if test ${#1} -ne 4 -o -n "`tr -d '[:digit:]' <<<$1`"
- then
- Info "\Z1Die Jahreszahl \Z3$1\Z1 ist nicht korrekt!" Fehler
- exit 1
- fi
- jahr="$1"
- fi
- }
- function Farbwert_test # ($1=Wert, $2=Text) Gibt fehler (true/false) zurueck.
- {
- if test -z "$1" -o "${1:0:1}" != '#' -o ${#1} -ne 7 -o -n "`tr -d '#[:digit:][a-f]'<<<"$1"`"
- then
- Info "\Z1$2 \Z3${1:-leer}\Z1 ist nicht korrekt!" Fehler
- return 0
- fi
- return 1
- }
- function Nur_zahlen_test # ($1=Wert, $2=Text) Gibt fehler (true/false) zurueck.
- {
- if test -z "${1}" -o -n "`tr -d '[:digit:]' <<<$1`"
- then
- Info "\Z1$2 \Z3${1:-leer}\Z1 ist nicht korrekt!" Fehler
- return 0
- fi
- return 1
- }
- function Textposition_test # ($1=Wert, $2=Text) Gibt fehler (true/false) zurueck.
- {
- if test -z "${1}" -o -z "`tr ' ' '\n' <<<"${textpositionen[*]}"|grep -ie "$1"`"
- then
- Info "\Z1$2 \Z3${1:-leer}\Z1 ist nicht korrekt!" Fehler
- return 0
- fi
- return 1
- }
- function Gibt_es_eingetragene_Feiertage
- {
- if ! test -s "$feiertag_liste"
- then
- Info '\Z3Es wurden noch keine Feiertage eingetragen!'
- return 1
- fi
- return 0
- }
- function Zeige_alle_Schriftarten
- {
- $dialog --infobox "\Z2\ZbEinen moment bitte..." 3 25
- # Von jeder Schriftart ein Bild erstellen
- do
- convert -size 500x58 xc:white -frame 4x4+2+2 -fill white -stroke black -font "$REPLY" -pointsize 20 -gravity center -annotate 0 "abcdefghijklmnopqrstuvwxyz" "$tempverzeichnis/$REPLY.gif"
- done
- # Alle Bilder aneinander haengen
- montage -label '%t' "$tempverzeichnis/"*.gif -tile 1 -geometry 500x58+1+10 -background white ./fonts.png
- $dialog --infobox "\Z2\ZbFertig." 3 11
- }
- function Info # ($1=Nachricht (dialog-farben erlaubt), $2=leer=Info inhalt=Fehler, $3=leer=Pause inhalt=keine Pause
- {
- # Fenstergroesse ermitteln
- local zeilen
- let zeilen=$(echo -e "$1"|wc -l)+2
- local zeichen
- let zeichen=`echo -e "$1"|sed -r 's#\\\Z[0-9]##g'|wc -L`+4
- local art
- # Ueberschrift waehlen
- if test -z "$2"
- then
- art='\Z3 Info'
- else
- art='\Z1 Fehler'
- echo -ne '\a'
- fi
- # Pausezeit verwenden?
- local pause
- test -z "$3" && pause="-t$infopause"
- # Anzeigen
- $dialog --title "\Z6[$art \Z6]" --infobox "$1" $zeilen $zeichen
- # Auf Taste warten oder nach Ablauf der Pause weiter
- read -sn1 $pause
- }
- function Programm_existenz_test
- {
- local z fehler=false
- # Nach allen benoetigten Programmen suchen
- z=0
- while test -n "${verwendete_programme[$z]}"
- do
- if test -z "`which "${verwendete_programme[$z]}"`"
- then
- echo -e "\a\n\e[31mDas Programm: \e[33m${verwendete_programme[$z]}\e[31m wird benoetigt,\nwurde aber nicht gefunden!\e[0m"
- fehler=true
- fi
- let z++
- done
- echo
- # Wenn auch nur eines fehlt, keine Funktion!
- }
- function Hilfe
- {
- local name="$(basename $1)"
- echo -e "\n\e[36mStarten mit:\n$name [JAHR]"
- echo -e "JAHR = Jahreszahl (4-Stellig) z.B. 2021.\e[0m"
- echo -e "\nOptionen:\n----------"
- echo "$name = Startet das Menue."
- echo "$name JAHR = Startet das Menue und setzt das Jahr."
- echo "$name -e JAHR = Erstelle Kalender fuer das angegebene Jahr."
- echo "$name --fonts = Erzeugt im aktuellen Verzeichnis eine Datei in der"
- echo " alle Fonts aufgefistet sind. (fonts.png)"
- echo "$name --help = Diese Kurzhilfe."
- echo
- }
- function Ende
- {
- # Aufraeumen
- if test -e "$tempverzeichnis"
- then
- rm -r "$tempverzeichnis"
- fi
- exit 0
- }
- # Hauptprogramm ------------------------------------------------------------------------------------
- # Ein paar Beenden-Signale abfangen (Damit noch aufgeraeumt werden kann)
- trap 'Ende' 1 2 9
- # Sind alle zum Betrieb noetigen Programme vorhanden?
- Programm_existenz_test
- # Verarbeitung der uebergebenen Optionen
- Optionen_test "$@"
- # Einstellungen laden
- test -s "$einstellungen" -a -f "$einstellungen" && . "$einstellungen"
- # Tempverzeichnis erstellen und leeren falls noch vorhanden
- test -e "$tempverzeichnis" && rm -r "$tempverzeichnis"
- # Grafik aller Fonts erstellen falls gewuenscht
- if $fonts_zeigen
- then
- Zeige_alle_Schriftarten
- Ende
- fi
- # Direkt Kalender erstellen oder Hauptmenue?
- if $sofortstart
- then
- # Direkt Kalender erstellen
- Kalender_erzeugen
- echo
- else
- # Hauptmenue
- $DEBUg && debuG='\Z1\ZrDEBUG_MODUS\ZR '
- while true
- do
- wahl=$($dialog --title "\Z6[\Z5 Hauptmenue $debuG\Z6]" --cancel-label 'Ende' --default-item "$wahl" --no-collapse \
- --menu "\Z2Bitte waehlen Sie: \Z4[Eingestelltes Jahr $jahr]" 20 75 12 \
- "Einstellungen" "machen" \
- "Standard-Einstellungen" "wiederherstellen" \
- "Kalender" "erstellen" \
- "Feiertags" "menue" \
- "Anleitung" "lesen")
- test $? -eq 1 && break
- case "$wahl" in
- 'Einstellungen') Einstellungen_machen ;;
- 'Standard-Einstellungen') $dialog --title '\Z6[\Z5 Reset \Z6]' --defaultno --yesno '\Z3Sind Sie sicher?' 5 20 && Einstellungen_reset ;;
- 'Feiertags') Feiertage_menue ;;
- 'Kalender') $dialog --infobox '\Z2Bitte warten...' 3 19 ; Kalender_erzeugen ;;
- 'Anleitung') $dialog --title '\Z6[\Z5 Anleitung \Z6]' --exit-label 'Zurueck' --textbox "$scriptpfad/anleitung.txt" 22 80 ;;
- esac
- done
- fi
- #
- # Fuegen Sie hier die noetigen Befehle ein, um aus den Bildern z.B. ein .pdf oder "wasauchimmer" zu erstellen.
- #
- # Dateinamen der Bilder waehren z.B.
- #
- # "[0-9][0-9][0-9][0-9]_[0-1][0-9].png"
- #
- # Aufraeumen und Ende
- Ende
Quellcode
Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN