Kuukausikalenteri

Ztane 23.11.04 21:56

Funktio, joka palauttaa annetun vuoden annetun kuukauden kalenterin 2-ulotteisena taulukkona + esimerkki.

 Tekstiversio  Arvo: 6 (6 ääntä)  Äänestä: +  -
#!/usr/bin/perl -w
#
# Copyleft Antti Haapala, tehkää mitä haluatte.
#
# OK, samanlainen toiminto löytyy kyllä Calendar::Simple -moduulista jne, mutta
# oli kyllä pakko tehdä uusi versio, kun tällaista kyseltiin. Demoaa samalla hiukan
# mktimen tekemää normalisaatiota, listaoperaatioita ja TMTOWTDI:iä

use strict;
use POSIX qw(mktime);

# palauttaa kuukauden kalenterin kaksiulotteisessa taulukossa
#   1. argumentti: vuosi, 1900-alkuinen laskentatapa (1900 = 0, 2000 = 100...)
#   2. argumentti: kuukausi 0 - 11
#   3. argumentti: alkaako viikko sunnuntailla (oletus, false) vai maanantailla (true).
sub month_calendar($$;$)
{
    my ($year, $month, $mon_starts) = @_;
    $mon_starts = 0 unless defined $mon_starts;

    # kuun viimeisen päivän numero on seuraavan kuun päivä numero 0,
    # kiitos mktimen tekemän normalisoinnin tämä toimii
    my $lastday  = (localtime mktime(0, 0, 0, 0, $month + 1, $year))[3];

    # kuukauden ensimmäinen viikonpäivä 0..6, 0 = sunnuntai
    my $firstdow = (localtime mktime(0, 0, 0, 1, $month,     $year))[6];

    # ekaksi päddäys. Modulaariaritmetiikkaa... jos maanantai
    # aloittaa viikon, pitäisi vähentää 1 (mod 7). Valitettavasti
    # negatiivisilla luvuilla % ei toimi oikein, joten lisätään -1 (mod 7) = 6 (mod 7)
    my @contents = (undef) x ($mon_starts ? ($firstdow + 6) % 7 : $firstdow);

    # sitten päivämäärät
    push @contents, 1 .. $lastday;

    # palautetaan: jaetaan spliceillä palasiksi, []-operaattorilla palaset
    # listoiksi ja mapilla näistä kerätään listojen lista. - 0.1 siksi, että
    # halutaan pyöristää kaikki arvot edelliseen kokonaiseen. Splice
    # taulukon ulkopuolella palauttaa perlissä undefeja.
    map [ @contents[$_ * 7 .. $_ * 7 + 6] ], 0 .. (@contents - 0.1) / 7
}


# käyttöesimerkki: tulostaa vuoden 2004 kalenterin html-koodina

print '<table>';

my $year = 2004;
$year -= 1900;
for my $mon (0 .. 11) {
        my @cal = month_calendar $year, $mon, 1;

        print '<tr>', map("<td>$_</td>", qw(Ma Ti Ke To Pe La Su)), '</tr>';
        for (@cal) {
                print '<tr>';
                print '<td>', defined $_ ? $_ : '&nbsp;', '</td>' for @$_;
                print '</tr>';
        }

        print '<tr><td colspan="7">&nbsp;</td></tr>';
}

print '</table>';
 

Jaenis 11:20 24.11.04 
Wau
Hiano... Tähän kun vielä pulttaa kylkeen pyhäpäivä-tunnistuksen (vaput,joulut,pääsiäiset,yms kaverit) nii tästähä saa kivan kalenterisoftan.
editoitu: 14:47 24.11.04
stWasm1.0 14:46 24.11.04 
kun ajan ohjelman se tulostaa tällasta:

[root@cable-237-78 root]# perl kalenteri.pl
<table><tr><td>Ma</td><td>Ti</td><td>Ke</td><td>To</td><td>Pe</td><td>La</td><td>Su</td></tr><tr><td> </td><td> </td><td> </td><td>1</td><td>2</td><td>3</td><td>4</td></tr><tr><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td><td>11</td></tr><tr><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td></tr><tr><td>19</td><td>20</td><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td></tr><tr><td>26</td><td>27</td><td>28</td><td>29</td><td>30</td><td>31</td><td> </td></tr><tr><td colspan="7"> </td></tr><tr><td>Ma</td><td>Ti</td><td>Ke</td><td>To</td><td>Pe</td><td>La</td><td>Su</td></tr><tr><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>1</td></tr><tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td></tr><tr><td>9</td><td>10</td><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td></tr><tr><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td><td>21</td><td>22</td></tr><tr><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td></tr><tr><td colspan="7"> </td></tr><tr><td>Ma</td><td>Ti</td><td>Ke</td><td>To</td><td>Pe</td><td>La</td><td>Su</td></tr><tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr><tr><td>8</td><td>9</td><td>10</td><td>11</td><td>12</td><td>13</td><td>14</td></tr><tr><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td><td>21</td></tr><tr><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td></tr><tr><td>29</td><td>30</td><td>31</td><td> </td><td> </td><td> </td><td> </td></tr><tr><td colspan="7"> </td></tr><tr><td>Ma</td><td>Ti</td><td>Ke</td><td>To</td><td>Pe</td><td>La</td><td>Su</td></tr><tr><td> </td><td> </td><td> </td><td>1</td><td>2</td><td>3</td><td>4</td></tr><tr><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td><td>11</td></tr><tr><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td></tr><tr><td>19</td><td>20</td><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td></tr><tr><td>26</td><td>27</td><td>28</td><td>29</td><td>30</td><td> </td><td> </td></tr><tr><td colspan="7"> </td></tr><tr><td>Ma</td><td>Ti</td><td>Ke</td><td>To</td><td>Pe</td><td>La</td><td>Su</td></tr><tr><td> </td><td> </td><td> </td><td> </td><td> </td><td>1</td><td>2</td></tr><tr><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td></tr><tr><td>10</td><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td></tr><tr><td>17</td><td>18</td><td>19</td><td>20</td><td>21</td><td>22</td><td>23</td></tr><tr><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td><td>30</td></tr><tr><td>31</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr><td colspan="7"> </td></tr><tr><td>Ma</td><td>Ti</td><td>Ke</td><td>To</td><td>Pe</td><td>La</td><td>Su</td></tr><tr><td> </td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td></tr><tr><td>7</td><td>8</td><td>9</td><td>10</td><td>11</td><td>12</td><td>13</td></tr><tr><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td></tr><tr><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td></tr><tr><td>28</td><td>29</td><td>30</td><td> </td><td> </td><td> </td><td> </td></tr><tr><td colspan="7"> </td></tr><tr><td>Ma</td><td>Ti</td><td>Ke</td><td>To</td><td>Pe</td><td>La</td><td>Su</td></tr><tr><td> </td><td> </td><td> </td><td>1</td><td>2</td><td>3</td><td>4</td></tr><tr><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td><td>11</td></tr><tr><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td></tr><tr><td>19</td><td>20</td><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td></tr><tr><td>26</td><td>27</td><td>28</td><td>29</td><td>30</td><td>31</td><td> </td></tr><tr><td colspan="7"> </td></tr><tr><td>Ma</td><td>Ti</td><td>Ke</td><td>To</td><td>Pe</td><td>La</td><td>Su</td></tr><tr><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>1</td></tr><tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td></tr><tr><td>9</td><td>10</td><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td></tr><tr><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td><td>21</td><td>22</td></tr><tr><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td></tr><tr><td>30</td><td>31</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr><td colspan="7"> </td></tr><tr><td>Ma</td><td>Ti</td><td>Ke</td><td>To</td><td>Pe</td><td>La</td><td>Su</td></tr><tr><td> </td><td> </td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr><tr><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td><td>11</td><td>12</td></tr><tr><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td></tr><tr><td>20</td><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td></tr><tr><td>27</td><td>28</td><td>29</td><td>30</td><td> </td><td> </td><td> </td></tr><tr><td colspan="7"> </td></tr><tr><td>Ma</td><td>Ti</td><td>Ke</td><td>To</td><td>Pe</td><td>La</td><td>Su</td></tr><tr><td> </td><td> </td><td> </td><td> </td><td>1</td><td>2</td><td>3</td></tr><tr><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td></tr><tr><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td></tr><tr><td>18</td><td>19</td><td>20</td><td>21</td><td>22</td><td>23</td><td>24</td></tr><tr><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td><td>30</td><td>31</td></tr><tr><td colspan="7"> </td></tr><tr><td>Ma</td><td>Ti</td><td>Ke</td><td>To</td><td>Pe</td><td>La</td><td>Su</td></tr><tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr><tr><td>8</td><td>9</td><td>10</td><td>11</td><td>12</td><td>13</td><td>14</td></tr><tr><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td><td>21</td></tr><tr><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td></tr><tr><td>29</td><td>30</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr><tr><td colspan="7"> </td></tr><tr><td>Ma</td><td>Ti</td><td>Ke</td><td>To</td><td>Pe</td><td>La</td><td>Su</td></tr><tr><td> </td><td> </td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr><tr><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td><td>11</td><td>12</td></tr><tr><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td></tr><tr><td>20</td><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td></tr><tr><td>27</td><td>28</td><td>29</td><td>30</td><td>31</td><td> </td><td> </td></tr><tr><td colspan="7"> </td></tr></table>
[root@cable-237-78 root]#

editoitu: 14:53 24.11.04
Ztane 14:52 24.11.04 
stWasm1.0 kirjoitti:
kun ajan ohjelman se tulostaa tällasta:
Tiiäks mitä, sitä sanotaan HyP3RTT3kst m4rk-Up L4ngua63ks.
Entropia 15:09 24.11.04 
stWasm1.0: perl kalenteri.pl > kalenteri.html
Ja sitte laukaiset sen neppiselaimesi ja katsot sitä. Voilá.
stWasm1.0 15:54 24.11.04 
kiitti! Nyt se toimii
renni 00:11 25.11.04 
Tablen tyhjiin soluihin kannattaa laittaa välilyönnin tilalle &nbsp;
Viikkonumerot ois kiva saada näkyville...
d0ggie 01:52 25.11.04 
renni kirjoitti:
Tablen tyhjiin soluihin kannattaa laittaa välilyönnin tilalle &nbsp;
Viikkonumerot ois kiva saada näkyville...


Periaatteessa mikäli solun taustaväri ei ole tärkeä (tai se on läpinäkyvä), on viisainta jättää välilyönnyt yms. kokonaan pois ja jättää sisältö tyhjäksi ("<td></td>"). Näin selain tajuaa jättää solun kokonaan piirtämättä. (Luonnollisesti selain laskee solun viemän tilan jne., eli taulukko ei mene rikki.)
editoitu: 08:20 25.11.04
Ztane 08:16 25.11.04 
renni kirjoitti:
Tablen tyhjiin soluihin kannattaa laittaa välilyönnin tilalle &nbsp;

oon lisänny nuo ties kuinka monta kertaa... :d Ainaku menee muokkaan koodia, ne häviää :D:D
Viikkonumerot ois kiva saada näkyville...

Siitä vaan koodaamaan :D
renni 15:58 27.11.04 
Milläs lelulla oikeen muokkaat jos se tärvelee koodia ja mikset muokkaa suoraan koodia?-)

&nbsp; tyhjiin soluihin koska kaikki selaimet ei muuten osaa näyttää taulukkoa nätisti, ainakin kehykset voivat jäädä pois.

editoitu: 19:49 27.11.04
Ztane 19:48 27.11.04 
renni kirjoitti:
Milläs lelulla oikeen muokkaat jos se tärvelee koodia ja mikset muokkaa suoraan koodia?-)
Meeppä sinne irkkii ja kuuntele niitä keskusteluja... lelun nimi oli mureakuha -> jääny html-entitiessit vetämättä textareaan. Prkl otan kohta tuon html:n pois tuosta ku ihmiset jaksaa vaa ruikuttaa siitä.