250 lines
17 KiB
HTML
250 lines
17 KiB
HTML
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||
|
|
<!-- Generated by perltidy on Mon Jul 1 13:37:55 2013 -->
|
||
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
|
|
<head>
|
||
|
|
<title>make_meeting</title>
|
||
|
|
<style type="text/css">
|
||
|
|
<!--
|
||
|
|
/* default style sheet generated by perltidy */
|
||
|
|
body {background: #FFFFFF; color: #000000}
|
||
|
|
pre { color: #000000;
|
||
|
|
background: #FFFFFF;
|
||
|
|
font-family: courier;
|
||
|
|
}
|
||
|
|
|
||
|
|
.c { color: #228B22;} /* comment */
|
||
|
|
.cm { color: #000000;} /* comma */
|
||
|
|
.co { color: #000000;} /* colon */
|
||
|
|
.h { color: #CD5555; font-weight:bold;} /* here-doc-target */
|
||
|
|
.hh { color: #CD5555; font-style:italic;} /* here-doc-text */
|
||
|
|
.i { color: #00688B;} /* identifier */
|
||
|
|
.j { color: #CD5555; font-weight:bold;} /* label */
|
||
|
|
.k { color: #8B008B; font-weight:bold;} /* keyword */
|
||
|
|
.m { color: #FF0000; font-weight:bold;} /* subroutine */
|
||
|
|
.n { color: #B452CD;} /* numeric */
|
||
|
|
.p { color: #000000;} /* paren */
|
||
|
|
.pd { color: #228B22; font-style:italic;} /* pod-text */
|
||
|
|
.pu { color: #000000;} /* punctuation */
|
||
|
|
.q { color: #CD5555;} /* quote */
|
||
|
|
.s { color: #000000;} /* structure */
|
||
|
|
.sc { color: #000000;} /* semicolon */
|
||
|
|
.v { color: #B452CD;} /* v-string */
|
||
|
|
.w { color: #000000;} /* bareword */
|
||
|
|
-->
|
||
|
|
</style>
|
||
|
|
</head>
|
||
|
|
<body>
|
||
|
|
<a name="-top-"></a>
|
||
|
|
<h1>make_meeting</h1>
|
||
|
|
<!-- BEGIN CODE INDEX --><a name="code-index"></a>
|
||
|
|
<ul>
|
||
|
|
<li><a href="#make_date-">package main</a>
|
||
|
|
<ul>
|
||
|
|
<li><a href="#make_date-">make_date</a></li>
|
||
|
|
</ul>
|
||
|
|
</li>
|
||
|
|
<li><a href="#EOF-">EOF</a></li>
|
||
|
|
</ul>
|
||
|
|
<!-- END CODE INDEX -->
|
||
|
|
<hr />
|
||
|
|
<!-- contents of filename: make_meeting -->
|
||
|
|
<pre>
|
||
|
|
#!/usr/bin/perl
|
||
|
|
<span class="c">#===============================================================================</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># FILE: make_meeting</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># USAGE: ./make_meeting</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># DESCRIPTION: Makes a recurrent iCalendar meeting to be loaded into</span>
|
||
|
|
<span class="c"># a calendar. This is apparently necessary when the 'RRULE'</span>
|
||
|
|
<span class="c"># recurrence description is not adequate.</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># OPTIONS: None</span>
|
||
|
|
<span class="c"># REQUIREMENTS: Needs modules Data::ICal and Date::Calc</span>
|
||
|
|
<span class="c"># BUGS: ---</span>
|
||
|
|
<span class="c"># NOTES: Distributed with the HPR episode "iCalendar Hacking"</span>
|
||
|
|
<span class="c"># AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com</span>
|
||
|
|
<span class="c"># LICENCE: Copyright (c) year 2012, Dave Morriss</span>
|
||
|
|
<span class="c"># VERSION: 1.0</span>
|
||
|
|
<span class="c"># CREATED: 13/10/2012 15:34:01</span>
|
||
|
|
<span class="c"># REVISION: 16/11/2012 16:04:37</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c">#===============================================================================</span>
|
||
|
|
<span class="c"># This program is free software: you can redistribute it and/or modify it</span>
|
||
|
|
<span class="c"># under the terms of the GNU General Public License as published by the Free</span>
|
||
|
|
<span class="c"># Software Foundation, either version 3 of the License, or (at your option)</span>
|
||
|
|
<span class="c"># any later version.</span>
|
||
|
|
<span class="c"># </span>
|
||
|
|
<span class="c"># This program is distributed in the hope that it will be useful, but WITHOUT</span>
|
||
|
|
<span class="c"># ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or</span>
|
||
|
|
<span class="c"># FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for</span>
|
||
|
|
<span class="c"># more details.</span>
|
||
|
|
<span class="c"># </span>
|
||
|
|
<span class="c"># You should have received a copy of the GNU General Public License along with</span>
|
||
|
|
<span class="c"># this program. If not, see <http://www.gnu.org/licenses/>.</span>
|
||
|
|
<span class="c">#===============================================================================</span>
|
||
|
|
|
||
|
|
<span class="k">use</span> <span class="n">5.010</span><span class="sc">;</span>
|
||
|
|
<span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
|
||
|
|
<span class="k">use</span> <span class="w">warnings</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="k">use</span> <span class="w">Data::ICal</span><span class="sc">;</span>
|
||
|
|
<span class="k">use</span> <span class="w">Data::ICal::Entry::Event</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="k">use</span> <span class="w">Date::Calc</span> <span class="q">qw{</span>
|
||
|
|
<span class="q">Today Day_of_Year Add_Delta_YMD Nth_Weekday_of_Month_Year</span>
|
||
|
|
<span class="q">}</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Date and time values</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="k">my</span> <span class="i">@today</span> = <span class="i">Today</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
|
||
|
|
<span class="k">my</span> <span class="i">@startdate</span><span class="sc">;</span>
|
||
|
|
<span class="k">my</span> <span class="i">@rdate</span><span class="sc">;</span>
|
||
|
|
<span class="k">my</span> <span class="i">$monday</span> = <span class="n">1</span><span class="sc">;</span> <span class="c"># Day of week number 1-7, Monday-Sunday</span>
|
||
|
|
|
||
|
|
<span class="k">my</span> <span class="i">@starttime</span> = <span class="s">(</span> <span class="n">19</span><span class="cm">,</span> <span class="n">00</span><span class="cm">,</span> <span class="n">00</span> <span class="s">)</span><span class="sc">;</span>
|
||
|
|
<span class="k">my</span> <span class="i">@endtime</span> = <span class="s">(</span> <span class="n">21</span><span class="cm">,</span> <span class="n">00</span><span class="cm">,</span> <span class="n">00</span> <span class="s">)</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Format of an ISO UTC datetime</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="k">my</span> <span class="i">$fmt</span> = <span class="q">"%02d%02d%02dT%02d%02d%02dZ"</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Constants for the event</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="k">my</span> <span class="i">$calname</span> = <span class="q">'Hacker Public Radio'</span><span class="sc">;</span>
|
||
|
|
<span class="k">my</span> <span class="i">$timezone</span> = <span class="q">'Europe/London'</span><span class="sc">;</span>
|
||
|
|
<span class="k">my</span> <span class="i">$location</span> = <span class="q">'mumble.openspeak.cc port: 64747'</span><span class="sc">;</span>
|
||
|
|
<span class="k">my</span> <span class="i">$summary</span> = <span class="q">'HPR Community News'</span><span class="sc">;</span>
|
||
|
|
<span class="k">my</span> <span class="i">$description</span> = <span class="h"><<ENDDESC</span><span class="sc">;</span>
|
||
|
|
<span class="hh">This is a test, building an iCalendar file and loading it into Thunderbird.</span>
|
||
|
|
<span class="hh">-----------------------------------------</span>
|
||
|
|
<span class="hh">Mumble settings</span>
|
||
|
|
<span class="hh">Server Name: Anything you like</span>
|
||
|
|
<span class="hh">Server Address: mumble.openspeak.cc </span>
|
||
|
|
<span class="hh">Port: 64747</span>
|
||
|
|
<span class="hh">Name: Your name or alias is fine</span>
|
||
|
|
|
||
|
|
<span class="hh">Don't have mumble, setup instructions can be found on our wiki -</span>
|
||
|
|
<span class="hh">http://linuxbasix.com/tiki-index.php?page=Linux+Basix+Mumble</span>
|
||
|
|
<span class="h">ENDDESC</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Compute the next meeting date from now</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="i">@startdate</span> = <span class="i">make_date</span><span class="s">(</span> \<span class="i">@today</span><span class="cm">,</span> <span class="i">$monday</span><span class="cm">,</span> <span class="n">1</span><span class="cm">,</span> <span class="n">-2</span> <span class="s">)</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Create the calendar object</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="k">my</span> <span class="i">$calendar</span> = <span class="w">Data::ICal</span><span class="w">->new</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Some calendar properties</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="i">$calendar</span><span class="i">->add_properties</span><span class="s">(</span>
|
||
|
|
<span class="q">'X-WR-CALNAME'</span> <span class="cm">=></span> <span class="i">$calname</span><span class="cm">,</span>
|
||
|
|
<span class="q">'X-WR-TIMEZONE'</span> <span class="cm">=></span> <span class="i">$timezone</span><span class="cm">,</span>
|
||
|
|
<span class="s">)</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Create the event object</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="k">my</span> <span class="i">$vevent</span> = <span class="w">Data::ICal::Entry::Event</span><span class="w">->new</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Add some event properties</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="i">$vevent</span><span class="i">->add_properties</span><span class="s">(</span>
|
||
|
|
<span class="w">summary</span> <span class="cm">=></span> <span class="i">$summary</span><span class="cm">,</span>
|
||
|
|
<span class="w">location</span> <span class="cm">=></span> <span class="i">$location</span><span class="cm">,</span>
|
||
|
|
<span class="w">description</span> <span class="cm">=></span> <span class="i">$description</span><span class="cm">,</span>
|
||
|
|
<span class="w">dtstart</span> <span class="cm">=></span> <span class="k">sprintf</span><span class="s">(</span> <span class="i">$fmt</span><span class="cm">,</span> <span class="i">@startdate</span><span class="cm">,</span> <span class="i">@starttime</span> <span class="s">)</span><span class="cm">,</span>
|
||
|
|
<span class="w">dtend</span> <span class="cm">=></span> <span class="k">sprintf</span><span class="s">(</span> <span class="i">$fmt</span><span class="cm">,</span> <span class="i">@startdate</span><span class="cm">,</span> <span class="i">@endtime</span> <span class="s">)</span><span class="cm">,</span>
|
||
|
|
<span class="s">)</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Add 12 recurring dates. (Note that this generates 12 RDATE entries rather</span>
|
||
|
|
<span class="c"># than 1 entry with multiple dates; this is because this module doesn't seem</span>
|
||
|
|
<span class="c"># to have the ability to generated the concatenated entry. The two modes of</span>
|
||
|
|
<span class="c"># expressing the repeated dates seem to be equivalent.)</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="k">for</span> <span class="k">my</span> <span class="i">$i</span> <span class="s">(</span> <span class="n">1</span> .. <span class="n">12</span> <span class="s">)</span> <span class="s">{</span>
|
||
|
|
<span class="i">@today</span> = <span class="i">Add_Delta_YMD</span><span class="s">(</span> <span class="i">@today</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">1</span><span class="cm">,</span> <span class="n">0</span> <span class="s">)</span><span class="sc">;</span>
|
||
|
|
<span class="i">@rdate</span> = <span class="i">make_date</span><span class="s">(</span> \<span class="i">@today</span><span class="cm">,</span> <span class="i">$monday</span><span class="cm">,</span> <span class="n">1</span><span class="cm">,</span> <span class="n">-2</span> <span class="s">)</span><span class="sc">;</span>
|
||
|
|
<span class="i">$vevent</span><span class="i">->add_property</span><span class="s">(</span> <span class="w">rdate</span> <span class="cm">=></span>
|
||
|
|
<span class="s">[</span> <span class="k">sprintf</span><span class="s">(</span> <span class="i">$fmt</span><span class="cm">,</span> <span class="i">@rdate</span><span class="cm">,</span> <span class="i">@starttime</span> <span class="s">)</span><span class="cm">,</span> <span class="s">{</span> <span class="w">value</span> <span class="cm">=></span> <span class="q">'DATE-TIME'</span> <span class="s">}</span> <span class="s">]</span><span class="cm">,</span>
|
||
|
|
<span class="s">)</span><span class="sc">;</span>
|
||
|
|
<span class="s">}</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Add the event into the calendar</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="i">$calendar</span><span class="i">->add_entry</span><span class="s">(</span><span class="i">$vevent</span><span class="s">)</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Print the result</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="k">print</span> <span class="i">$calendar</span><span class="i">->as_string</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="k">exit</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#=== FUNCTION ================================================================</span>
|
||
|
|
<span class="c"># NAME: make_date</span>
|
||
|
|
<span class="c"># PURPOSE: Make the event date for recurrence</span>
|
||
|
|
<span class="c"># PARAMETERS: $refdate</span>
|
||
|
|
<span class="c"># An arrayref to the reference date array (usually</span>
|
||
|
|
<span class="c"># today's date)</span>
|
||
|
|
<span class="c"># $dow Day of week for the event date (1-7, 1=Monday)</span>
|
||
|
|
<span class="c"># $n The nth day of the week in the given month required</span>
|
||
|
|
<span class="c"># for the event date</span>
|
||
|
|
<span class="c"># $offset Number of days to offset the computed date</span>
|
||
|
|
<span class="c"># RETURNS: The resulting date as a list for Date::Calc</span>
|
||
|
|
<span class="c"># DESCRIPTION: We want to compute a simple date with an offset, such as</span>
|
||
|
|
<span class="c"># "the Saturday before the first Monday of the month". We do</span>
|
||
|
|
<span class="c"># this my computing a pre-offset date (first Monday of month)</span>
|
||
|
|
<span class="c"># then apply the offset (Saturday before).</span>
|
||
|
|
<span class="c"># THROWS: No exceptions</span>
|
||
|
|
<span class="c"># COMMENTS: TODO Needs more testing to be considered truly universal</span>
|
||
|
|
<span class="c"># SEE ALSO:</span>
|
||
|
|
<span class="c">#===============================================================================</span>
|
||
|
|
<a name="make_date-"></a><span class="k">sub </span><span class="m">make_date</span> <span class="s">{</span>
|
||
|
|
<span class="k">my</span> <span class="s">(</span> <span class="i">$refdate</span><span class="cm">,</span> <span class="i">$dow</span><span class="cm">,</span> <span class="i">$n</span><span class="cm">,</span> <span class="i">$offset</span> <span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Compute the required date: the nth day of week in this year and month</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="k">my</span> <span class="i">@date</span> = <span class="i">Nth_Weekday_of_Month_Year</span><span class="s">(</span> <span class="i">@$refdate</span>[ <span class="n">0</span><span class="cm">,</span> <span class="n">1</span> ]<span class="cm">,</span> <span class="i">$dow</span><span class="cm">,</span> <span class="i">$n</span> <span class="s">)</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># If the computed date is before the base date advance a month</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="k">if</span> <span class="s">(</span> <span class="i">Day_of_Year</span><span class="s">(</span><span class="i">@date</span><span class="s">)</span> <= <span class="i">Day_of_Year</span><span class="s">(</span><span class="i">@$refdate</span><span class="s">)</span> <span class="s">)</span> <span class="s">{</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Add a month and recompute</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="i">@date</span> = <span class="i">Add_Delta_YMD</span><span class="s">(</span> <span class="i">@date</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">1</span><span class="cm">,</span> <span class="n">0</span> <span class="s">)</span><span class="sc">;</span>
|
||
|
|
<span class="i">@date</span> = <span class="i">Nth_Weekday_of_Month_Year</span><span class="s">(</span> <span class="i">@date</span>[ <span class="n">0</span><span class="cm">,</span> <span class="n">1</span> ]<span class="cm">,</span> <span class="i">$dow</span><span class="cm">,</span> <span class="i">$n</span> <span class="s">)</span><span class="sc">;</span>
|
||
|
|
<span class="s">}</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Apply the day offset</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="i">@date</span> = <span class="i">Add_Delta_YMD</span><span class="s">(</span> <span class="i">@date</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$offset</span> <span class="s">)</span><span class="sc">;</span>
|
||
|
|
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="c"># Return a list</span>
|
||
|
|
<span class="c">#</span>
|
||
|
|
<span class="k">return</span> <span class="s">(</span><span class="i">@date</span><span class="s">)</span><span class="sc">;</span>
|
||
|
|
<span class="s">}</span>
|
||
|
|
|
||
|
|
<span class="c"># vim: syntax=perl:ts=8:sw=4:et:ai:tw=78:fo=tcrqn21:fdm=marker</span>
|
||
|
|
|
||
|
|
<a name="EOF-"></a></pre>
|
||
|
|
</body>
|
||
|
|
</html>
|