From 4492778a77e58e8c155241ce0235c6e2744c9f3f Mon Sep 17 00:00:00 2001 From: "Schoenberger, Philipp" Date: Wed, 20 Nov 2019 23:38:44 +0100 Subject: [PATCH] add 2 weeks calender with special date markers --- run_2weeks.py | 233 +++++++++++++++++++++++++++++++++ vorlagen/week_2pages.tex | 8 ++ vorlagen/week_2pages_start.tex | 176 +++++++++++++++++++++++++ 3 files changed, 417 insertions(+) create mode 100755 run_2weeks.py create mode 100644 vorlagen/week_2pages.tex create mode 100644 vorlagen/week_2pages_start.tex diff --git a/run_2weeks.py b/run_2weeks.py new file mode 100755 index 0000000..a931643 --- /dev/null +++ b/run_2weeks.py @@ -0,0 +1,233 @@ +#!/usr/bin/python3 + +import math +import json + +from datetime import timedelta +from datetime import date +import locale +import os + +start_year = 2020 +start_date = date(start_year, 1, 1) +end_date = date(start_year, 12, 31) + +main_filename = "calender" +main_tex = main_filename + ".tex" +main_aux = main_filename + ".aux" +main_log = main_filename + ".log" +main_pdf = main_filename + ".pdf" + +dates_color = { + "birthdays": "orange!50!green", + "specialdays": "red!20!green", + "freedays": "blue!30!green", + "holidays": "blue!40!green", +} + +dates = { + "birthdays": [ + { "date": "18.10", "title": "Theresa Voigt" }, + { "date": "13.11", "title": "Winfried Voigt"}, + { "date": "13.11", "title": "Monika Voigt"}, + { "date": "13.11", "title": "Ursula Donn"}, + { "date": "14.11", "title": "Philipp Schönberer" }, + { "date": "13.01", "title": "Astrid Schönberger" }, + { "date": "26.01", "title": "David Geiser" }, + ], + "birthdays": [ + { "date": "05.10", "title": "Obermegaknutztag" }, + { "date": "10.05", "title": "Hochzeitstag" }, + ], + "holidays": [ + { "date-start": "23.12.2019", "date-end": "04.01.2020", "title": "Weihnachtsferien" }, + #Faschingsferien + { "date-start": "06.04.2020", "date-end": "18.04.2020", "title": "Osterferien" }, + { "date-start": "02.06.2020", "date-end": "13.06.2020", "title": "Pfingstferien"}, + { "date-start": "30.07.2020", "date-end": "12.09.2020", "title": "Sommerferien"}, + { "date-start": "26.10.2020", "date-end": "30.10.2020", "title": "Herbstferien"}, + { "date-start": "23.12.2020", "date-end": "09.01.2021", "title": "Weihnachtsferien"}, + ], + "freedays": [ + { "date": "01.01", "title": "Neujahr" }, + { "date": "06.01", "title": "Heilige Drei Könige" }, + { "date": "10.04", "title": "Karfreitag" }, + { "date": "13.04", "title": "Ostermontag" }, + { "date": "01.05", "title": "Tag der Arbeit" }, + { "date": "21.05", "title": "Christi Himmelfahrt" }, + { "date": "01.06", "title": "Pfingstmontag" }, + { "date": "11.06", "title": "Fronleichnam" }, + { "date": "03.10", "title": "Tag der Deutschen Einheit"}, + { "date": "01.11", "title": "Allerheiligen" }, + { "date": "24.12", "title": "Weihnachtten" }, + { "date": "25.12", "title": "1. Weihnachtsfeiertag" }, + { "date": "26.12", "title": "2. Weihnachtsfeiertag" }, + { "date": "31.12", "title": "Silvester" }, + ], + } + + + +def get_special_text(date_to_check, divider): + return_str ="" + for b in dates: + print(b) + for d in dates[b]: + if "date" in d: + start_day = d["date"].split(".") + if len(start_day)<3: + s_year = date_to_check.year + else: + s_year = int(start_day[2]) + s_month = int(start_day[1]) + s_day = int(start_day[0]) + start_day = date(s_year, s_month, s_day) + if (start_day == date_to_check): + if return_str != "": + return_str += divider + return_str += "\\textcolor{"+dates_color[b]+"}{" + d["title"] + "}" + + + if "date-start" in d and "date-end" in d: + start_day = d["date-start"].split(".") + if len(start_day)<3: + s_year = date_to_check.year + else: + s_year = int(start_day[2]) + s_month = int(start_day[1]) + s_day = int(start_day[0]) + start_day = date(s_year, s_month, s_day) + + end_day = d["date-end"].split(".") + if len(end_day)<3: + e_year = date_to_check.year + else: + e_year = int(end_day[2]) + e_month = int(end_day[1]) + e_day = int(end_day[0]) + end_day = date(e_year, e_month, e_day) + + if date_to_check >= start_day and date_to_check <= end_day: + if return_str != "": + return_str += divider + return_str += "\\textcolor{"+dates_color[b]+"}{" + d["title"] + "}" + + return return_str + +def main(): + # german + locale.setlocale(locale.LC_TIME, "de_DE") + + fd = open(main_tex, "w") + tex_write_header(fd) + + #tex_write_calender_overview(fd) + + tex_write_weekly(fd) + + tex_write_footer(fd) + + fd.close() + + cmd = 'pdflatex ' + main_tex + + os.system(cmd) + os.remove(main_aux) + os.remove(main_log) + + +def tex_write_header(fd): + start_fd = open("./vorlagen/week_2pages_start.tex", "r") + for line in start_fd: + fd.write(line) + fd.write("\\begin{document}\n"); + return + + +def tex_write_footer(fd): + fd.write("\\end{document}\n"); + return + +def tex_write_calender_overview(fd): + return + + +def tex_write_weekly(fd): + print_start_date = start_date - timedelta(days=start_date.weekday()) + print_end_date = end_date + timedelta(days=6 - end_date.weekday()) + + print(print_start_date.isoformat()) + print(print_end_date.isoformat()) + + fd.write("%%%%%%%%%%%%%%%%%%%%%%%%%%%\n"); + fd.write("% begin real calender \n"); + + curr_date = print_start_date; + + print("year : " + str(curr_date.year)) + + last_year= "" + last_month= "" + + while True: + if curr_date.weekday() == 0 or curr_date.weekday() == 3: + # new year to setup + if str(curr_date.year) != str(last_year): + last_year= curr_date.year + fd.write("\n\\renewcommand{\year}{"+ str(curr_date.year) +"}\n") + + # new month to setup + if str(curr_date.month) != str(last_month): + last_month= curr_date.month + fd.write("\n\\renewcommand{\month}{" + curr_date.strftime('%B') + "}\n") + + # should give + # \printweek{KW10}{1}{}{2}{}{3}{} + + weeknumber = curr_date.strftime("%V") + daynumber = curr_date.strftime("%d") + devider = "\\newline \n" + special_text = get_special_text(curr_date, devider) + + # check for new week + if curr_date.weekday() == 0: # monday + fd.write("\\printweek") + fd.write("{KW" + weeknumber + "}") + + if curr_date.weekday() == 3: # thursday is on second page + fd.write("\n") + fd.write("\\newpage\n") + fd.write("\\printweekend") + fd.write("{KW" + weeknumber + "}") + + + # done for every day + fd.write("{" + daynumber + "}") + fd.write("{" + special_text + "}") + + if curr_date.weekday() == 6: # sunday is end of week so close it + fd.write("\n") + + # end of calender + if (print_end_date == curr_date): + break + + #go to next day + next_date = curr_date + timedelta(days=1) + + + # use the new curr date and contiue + curr_date = next_date + + # end of for each day + + fd.write(''' +% end real calender +%%%%%%%%%%%%%%%%%%%%%%%%%%% + ''') + return + + + +if __name__ == "__main__": + main() diff --git a/vorlagen/week_2pages.tex b/vorlagen/week_2pages.tex new file mode 100644 index 0000000..cba26c3 --- /dev/null +++ b/vorlagen/week_2pages.tex @@ -0,0 +1,8 @@ +\include{week_2pages_start} +\begin{document} +\renewcommand{\year}{2019} +\renewcommand{\month}{Dezember} +\printweek{KW10}{1}{}{2}{}{3}{} +\newpage +\printweekend{KW10}{4}{Knutzis duzis megapuspsi}{5}{}{6}{}{7}{} +\end{document} diff --git a/vorlagen/week_2pages_start.tex b/vorlagen/week_2pages_start.tex new file mode 100644 index 0000000..389de37 --- /dev/null +++ b/vorlagen/week_2pages_start.tex @@ -0,0 +1,176 @@ +\documentclass[tikz]{standalone}% Does not support leap years. + +%% Load needed packages +\usepackage{lmodern} +\usepackage{tikz} + \usetikzlibrary{positioning} +\usepackage{ifthen} +\usepackage{xifthen}% provides \isempty test + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\tikzset{year/.style={minimum height = 2em}} +\tikzset{dayname/.style={node font=\large}} +\tikzset{daynumber/.style={node font=\large\bfseries}} +\tikzset{dayspecialname/.style={node font=\small\bfseries,anchor=west, align=left, text width=5.5cm }} +\tikzset{dayspecial/.style={color=blue!50!green}} +\tikzset{month/.style={node font=\large}} +\tikzset{kw/.style={node font=\large}} + +\newcommand{\monday}[0]{Montag} +\newcommand{\tuesday}[0]{Dienstag} +\newcommand{\wednesday}[0]{Mittwoch} +\newcommand{\thursday}[0]{Donnerstag} +\newcommand{\friday}[0]{Freitag} +\newcommand{\saturday}[0]{Samstag} +\newcommand{\sunday}[0]{Sonntag} + + +\newcommand{\daylines}[5]{ + \foreach \i in {#1, #2, ..., #3}{% + \draw [black!30!white, thin] (#4,\i) -- (#5,\i); + } + +} + +\newcommand{\taskbox}[5]{ + \foreach \i in {#1, #2, ..., #3}{% + \draw [black!30!white, thin,dotted] (#4,\i) -- (#5,\i); + } + + \draw [gray, thin,dotted] (#5, #1) -- (#5,#3); + \foreach \i in {0, 0.3, ..., 1}{% + + \draw [black!30!white, thin,dotted] (#4+\i, #1) -- (#4+\i,#3); + } + +} + +\newcommand{\printweek}[7]{ + % KW + %monday date of month + %monday special text + %tuesday date of month + %tuesday special text + %Wednesday date of month + %Wednesday special text + + \begin{tikzpicture}[inner sep=3 pt, + xscale = 3, + yscale=-1.5,% CAUTION: axis direction reversed! + ] + + \node at (0,0) [year] {\year}; %prints year number + \node at (0.5,0) [month] {\month}; %prints month name + \node at (1.25,0) [kw] {#1}; %prints month name + + + \ifthenelse{\isempty{#3}} { + \node at (0, 0.3) [daynumber] {#2}; + \node at (0.5,0.3) [dayname] {\monday}; + } { + \node at (0, 0.3) [dayspecial,daynumber] {#2}; + \node at (0, 0.7) [dayspecial,dayspecialname] {#3}; + \node at (0.5,0.3) [dayspecial,dayname] {\monday}; + } + \daylines{1}{1.5}{6.5}{0}{1.9} + + \ifthenelse{\isempty{#5}} { + \node at (2, 0.3) [daynumber] {#4}; + \node at (2.5,0.3) [dayname] {\tuesday}; + } { + \node at (2, 0.3) [dayspecial,daynumber] {#4}; + \node at (2, 0.7) [dayspecial,dayspecialname] {#5}; + \node at (2.5,0.3) [dayspecial,dayname] {\tuesday}; + } + \daylines{1}{1.5}{6.5}{2}{3.9} + + \ifthenelse{\isempty{#7}} { + \node at (4, 0.3) [daynumber] {#6}; + \node at (4.5,0.3) [dayname] {\wednesday}; + } { + \node at (4, 0.3) [dayspecial,daynumber] {#6}; + \node at (4, 0.7) [dayspecial,dayspecialname] {#7}; + \node at (4.5,0.3) [dayspecial,dayname] {\wednesday}; + } + \daylines{1}{1.5}{6.5}{4}{5.9} + + \taskbox{7}{7.4}{15}{0}{5.9} + + + \node at (6, 15.25) [daynumber] {}; + + \end{tikzpicture}% +} + + +\newcommand{\printweekend}[9]{ + % KW + %thursday date of month + %thursday special text + %Friday date of month + %Friday special text + %Saturday date of month + %Saturday special text + %Sunday date of month + %Sunday special text + % + + \begin{tikzpicture}[inner sep=3 pt, + xscale = 3, + yscale=-1.5,% CAUTION: axis direction reversed! + ] + + \node at (5.0,0) [year] {\year}; %prints year number + \node at (5.5,0) [month] {\month}; %prints month name + \node at (4.5,0) [month] {#1}; %prints month name + + \ifthenelse{\isempty{#3}} { + \node at (0, 0.3) [daynumber] {#2}; + \node at (0.5,0.3) [dayname] {\thursday}; + } { + \node at (0, 0.3) [dayspecial,daynumber] {#2}; + \node at (0, 0.7) [dayspecial,dayspecialname] {#3}; + \node at (0.5,0.3) [dayspecial,dayname] {\thursday}; + } + \daylines{1}{1.5}{6.5}{0}{1.9} + + + \ifthenelse{\isempty{#5}} { + \node at (2, 0.3) [daynumber] {#4}; + \node at (2.5,0.3) [dayname] {\friday}; + } {% + \node at (2, 0.3) [dayspecial,daynumber] {#4}; + \node at (2, 0.7) [dayspecial,dayspecialname] {#5}; + \node at (2.5,0.3) [dayspecial,dayname] {\friday}; + }% + \daylines{1}{1.5}{6.5}{2}{3.9} + + \ifthenelse{\isempty{#7}} { + \node at (4, 0.3) [daynumber,color=orange] {#6}; + \node at (4.5,0.3) [dayname,color=orange] {\saturday}; + } {% + \node at (4, 0.3) [dayspecial,daynumber] {#6}; + \node at (4, 0.7) [dayspecial,dayspecialname] {#7}; + \node at (4.5,0.3) [dayspecial,dayname] {\saturday}; + }% + \daylines{1}{1.5}{6.5}{4}{5.9} + + \ifthenelse{\isempty{#9}} { + \node at (4, 6.8) [daynumber,color=red] {#8}; + \node at (4.5,6.8) [dayname,color=red] {\sunday}; + } {% + \node at (4, 6.8) [dayspecial,daynumber] {#8}; + \node at (4, 7.2) [dayspecial,dayspecialname] {#9}; + \node at (4.5,6.8) [dayspecial,dayname] {\sunday}; + }% + \daylines{7.5}{8}{15}{4}{5.9} + + \taskbox{7}{7.4}{15}{0}{3.9} + + + \node at (6, 15.25) [daynumber] {}; + \end{tikzpicture}% +} +