<?
/* $ DVCS ID: $jer|,523/lhos,KYTP!41023161\b"?" <<= DO NOT DELETE! */
/* ddate.c .. converts boring normal dates to fun Discordian Date -><-
original incarnation written the 65th day of The Aftermath in the
Year of Our Lady of Discord 3157 by Druel the Chaotic aka Jeremy Johnson
aka mpython@gnu.ai.mit.edu.
Majorly hacked, extended and bogotified/debogotified on
Sweetmorn, Bureaucracy 42, 3161 YOLD, by Lee H:. O:. Smith, KYTP,
aka Andrew Bulhak, aka acb@zikzak.net
PHP class-version hack by vesel aka Jurgen Schwietering
aka jurgen@schwietering.com on
Boomtime, Discord 14, 3168 YOLD
usage:
class constructor
ddate($moe=0, $larry=0, $curly=0, $format=defFormat);
(note: m d y format)
getDDate(); // returns the datestring
todayDdate(); // get the old immediate format
echo "<BR>";
*/
/*
* @author: original c-code Jeremy Johnson, rewritten Jurgen Schwietering
* @description-en: Create Discordian Date
* @class: Date
* @title: Create Discordian Date String
*/
class ddate{
/* configuration options VVVVV READ THIS!!! */
/* these are original formats, replace in ddate() if you would like to use them as default
*/
var $default_fmt = "%{%A, %B %d%}, %Y YOLD";
var $default_immediate_fmt="Today is %{%A, the %e day of %B%} in the YOLD %Y%N%nCelebrate %H";
/* PRAISE_BOB has been removed: JS */
var $day_long = array("Sweetmorn", "Boomtime", "Pungenday", "Prickle-Prickle", "Setting Orange");
var $day_short = array("SM","BT","PD","PP","SO");
var $season_long = array("Chaos", "Discord", "Confusion", "Bureaucracy", "The Aftermath");
var $season_short = array("Chs", "Dsc", "Cfn", "Bcy", "Afm");
var $holyday= array(
array("Mungday", "Chaoflux"),
array("Mojoday", "Discoflux"),
array("Syaday", "Confuflux"),
array("Zaraday", "Bureflux"),
array("Maladay", "Afflux")
);
var $excl =array(
"Hail Eris!", "All Hail Discordia!", "Kallisti!", "Fnord.", "Or not.",
"Wibble.", "Pzat!", "P'tang!", "Frink!",
/* randomness, from the Net and other places. Feel free to add (after
* checking with the relevant authorities, of course).
*/
"Hail Eris, Hack PHP!",
"Grudnuk demand sustenance!",
"Keep the Lasagna flying!",
"Umlaut Zebra über alles!"
);
var $schwa; // where to store the calculated date
// private functions:
function DY($y) {
return $y+1166;
}
function ending($i) {
return ($i%10==1)?"st":($i%10==2?"nd":($i%10==3?"rd":"th"));
}
function leapp($i) {
return (!(DY($i)%4))&&((DY($i)%100)||(!(DY($i)%400)));
}
function format($fmt, $dt) {
$wibble="";
$tib_start=-1;
$tib_end=0;
$fmtlen=strlen($fmt);
// first, find extents of St. Tib's Day area, if defined
for($i=0; $i<$fmtlen; $i++) {
if($fmt{$i}=='%') {
switch($fmt{$i+1}) {
case 'A':
case 'a':
case 'd':
case 'e':
if($tib_start>0)
$tib_end=$i+1;
else
$tib_start=$i;
break;
case '{':
$tib_start=$i;
break;
case '}':
$tib_end=$i+1;
break;
}
}
}
// now do the formatting
$buf="";
for($i=0; $i<$fmtlen; $i++) {
if(($i==$tib_start) && ($dt["day"]==-1)) {
/* handle St. Tib's Day */
$buf.="St. Tib's Day";
$i=$tib_end;
} else {
if($fmt[$i]=='%') {
$i++;
switch($fmt[$i]) {
case 'A': $wibble=$this->day_long[$dt["yday"]%5]; break;
case 'a': $wibble=$this->day_short[$dt["yday"]%5]; break;
case 'B': $wibble=$this->season_long[$dt["season"]]; break;
case 'b': $wibble=$this->season_short[$dt["season"]]; break;
case 'd': $snarf=sprintf("%d", $dt["day"]+1); $wibble=$snarf; break;
case 'e': $snarf=sprintf("%d%s", $dt["day"]+1, $this->ending($dt["day"]+1));
$wibble=$snarf;
break;
case 'H': if ($dt["day"]==4||$dt["day"]==49)
$wibble = $this->holyday[$dt["season"]][$dt["day"]==49];
break;
case 'N': if($dt["day"]!=4&&$dt["day"]!=49)
return $buf;
case 'n': $buf.='\n'; break;
case 't': $buf.='\t'; break;
case 'Y': $snarf=sprintf("%d", $dt["year"]); $wibble=$snarf; break;
case '.': $wibble=$this->excl[rand(0,count($excl)-1)];
break;
case '%': $wibble='%'; break;
default:
$wibble=""; // ignore
break;
}
if($wibble) {
$buf.=$wibble;
}
} else {
$buf.=$fmt[$i];
}
}
}
return $buf;
}
// I guess that in PHP we could make this much more short. JS
function makeday($imonth,$iday,$iyear) /*i for input */
{
$cal = array(31,28,31,30,31,30,31,31,30,31,30,31);
$dayspast=0;
$imonth--;
$funkyChickens["year"]= $iyear+1166;
while($imonth>0) {
$dayspast+=$cal[--$imonth];
}
$funkyChickens["day"]=$dayspast+$iday-1;
$funkyChickens["season"]=0;
if(($funkyChickens["year"]%4)==2) {
if ($funkyChickens["day"]==59)
$funkyChickens["day"]=-1;
}
$funkyChickens["yday"]=$funkyChickens["day"];
while($funkyChickens["day"]>=73) {
$funkyChickens["season"]++;
$funkyChickens["day"]-=73;
}
return $funkyChickens;
}
function convert($nday, $nyear) // returns assoc array [year,day,season,yday]
{
$funkyChickens["year"] = $nyear+3066;
$funkyChickens["day"]=$nday;
$funkyChickens["season"]=0;
if (($funkyChickens["year"]%4)==2)
{if ($funkyChickens["day"]==59)
$funkyChickens["day"]=-1;
else if ($funkyChickens["day"] >59)
$funkyChickens["day"]-=1;
}
$funkyChickens["yday"]=$funkyChickens["day"];
while ($funkyChickens["day"]>=73){
$funkyChickens["season"]++;
$funkyChickens["day"]-=73;
}
return $funkyChickens;
}
function ddate($moe=0, $larry=0, $curly=0, $format="%{%A, %B %d%}, %Y YOLD") {
if ($moe==0) {
$bob=date("z");
$raw=date("Y")-1900;
$hastur=$this->convert($bob,$raw);
}
else
$hastur=$this->makeday($larry, $moe, $curly);
$this->schwa=$this->format($format, $hastur);
return $this->schwa;
}
// public functions:
function getDDate() {
return $this->schwa;
}
// get the old ddate string for today
function todayDdate($format="Today is %{%A, the %e day of %B%} in the YOLD %Y%N%nCelebrate %H") {
$bob=date("z"); // eris->tm_yday; // days since Jan 1.
$raw=date("Y")-1900; // eris->tm_year; // years since 1900
$hastur=$this->convert($bob,$raw);
$this->schwa=$this->format($format, $hastur);
return $this->schwa;
}
}
// some short test
$dd=new ddate();
echo $dd->getDDate();
echo "<BR>";
echo $dd->ddate(6,4,1964); // already created an object, so use it again.
echo "<BR>";
echo $dd->todayDdate(); // the old immidiate format
echo "<BR>";
?> |