See Also: MMPIS (Part I), and MMPIS (Part III), and MMPIS (Part IV).
MMPIS is semi-related to reMMinderbot, in that it’s meant to actually provide helpful information. reMMinderbot lets us know (via email) when there is a meeting, or if we haven’t blogged in a while, or when the monthly cleanup day is coming. (It has to remind us of that twice! On Wednesday and Saturday before the actual Sunday we clean.) There’s lots of Perl and cron involved in reMMinderbot.
reMMinderbot is also supposed to send an email telling us what’s on the calendar each day. This occasionally works. I’ve been writing code to deal with calendars for way too long. It’s sort of a nightmare. The iCalendar format is best described as Wibbly Wobbly Timey Wimey.
There’s an old saying:
Some people, when confronted with a problem, think “I know, I’ll use regular expressions.”
Now they have two problems.
Parsing iCalendar files can be like that. Luckily, Perl has a module for everything! So iCal::Parser was pulled into service. Unluckily, it has bugs. iCalendar can be tricky. There are repeating events, but they can have exceptions, days they don’t actually happen. I’ve seen weird time zone issues, and differences between clients. Anyway, it’s all wibbly wobbly.
Our original Perl code grabbed the calendar file from Google, parsed the file, and then output the upcoming events to a file that is then included in the main page. As I said, though… it doesn’t always work. So I decided to scrap it.
In an ideal world, we would just clone the calendar page on the web site and display that. There’s just way too much Javascript on that page though, and it takes too long to render. I then remembered a web application I used years ago, so I turned to PHP iCalendar.
PHP iCalendar manages to display things properly! All events revealed! Though the monthly view is not what I want. Nor is the daily or weekly view, but… At the bottom is a “This Month’s Events” section. We can use that!
I took the files that showed the monthly view and started hacking. I stripped out the unneeded HTML, edited the CSS to get what I wanted, and it was pretty close, but… it was just displaying the current month’s event. This would mean that if there was an event on the first of the month, you’d never see it until the first of the month, which is silly. Digging through the PHP it was just a matter of changing things to look at the current month and the next month. Not 100% perfect, but an acceptable solution.
Right now it’s looking two weeks ahead, so you’ll get any event for the next 14 days. This is what you see below.
I may play around with setting the viewport to be 1920×1080 and then using overflow: hidden
to better use the space on the screen, but I’ve also got the issue that I’m doing development on a 1280×720 screen, so I may need to do some CSS stuff depending on the screen size, if that’s even possible. (Also, to pick a nit, the resolution of the TV I am using today says it is displaying 1360×768.)
Anyway, the PHP iCalendar solution has been working so good I’ll probably roll it into reMMinderbot’s calendar code. It’ll take a bit of Perl-fu to do the right thing there (multiple servers are involved) but it should be a major improvement. (Hopefully.)
What’s that? You can’t wait for Part III? It’s coming…
Stay Tuned!