Webseite der LUG Frankfurt mit Hugo
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

126 lines
4.8 KiB

<?php
// Print error message and exit
function printStderr($msg) {
error_log($msg);
exit(-1);
}
class ShiftPres {
// For German date matching
const PREG = '/^(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[0-2])\.([1-9]\d{3})$/';
// Read "past.md" and "vor.md" into instance arrays and set up new vor.txt
public function __construct($vor='vor.md', $past='past.md') {
$this->CET = new DateTimeZone('Europe/Berlin');
$this->vor = $vor;
$this->vorMd = file($vor, FILE_IGNORE_NEW_LINES);
$vorBase = basename($vor, '.md');
$this->vorT = $vorBase . '.txt';
$this->vorTxt = [];
$this->pastT = $past;
$this->pastMd = file($this->pastT, FILE_IGNORE_NEW_LINES);
$this->exit = 0; // Default return value
}
// Save "vor.txt" and "past.md" before leaving
public function save() {
// Backup files first
copy($this->vorT, $this->vorT . '.bak');
copy($this->pastT, $this->pastT . '.bak');
file_put_contents($this->vorT, implode(PHP_EOL, $this->vorTxt) . PHP_EOL);
file_put_contents($this->pastT, implode(PHP_EOL, $this->pastMd) . PHP_EOL);
// Signal to calling bash script to put files into git
$this->exit = 1;
}
// Shift from "vor.md" to "past.md", creating "vor.txt" along the way
public function shift() {
$yester = (new DateTime('now', $this->CET))->modify('- 1 day');
$yester->setTime(0, 0);
// For correct insertion into past array
$past = $this->findPast();
if ($past < 0) {
printStderr("Can't locate insert position in $this->pastT, exiting");
}
// Loop through "vor.md" and check if yesterday is 4th Tuesday => shift to "past.md"
// Otherwise copy to "vor.txt", including custom date if found (as in: not 4th Tuesday)
foreach ($this->vorMd as $line) {
$fields = array_filter(explode('|', $line));
$ff = explode(', ', $fields[1]);
// Does 1st field contain date?
if (count($ff) > 1) {
$dat = trim($ff[1]);
// If so, in valid format
if (preg_match(self::PREG, $dat)) {
$dp = new DateTime($dat, $this->CET);
$dp->setTime(0, 0);
// if we are not invoked on the morning of the 4th Wednesday, copy to "vor.txt"
if ($dp != $yester) {
// If manually set date doesn't equal fourth Tuesday, copy
if ($dp != $this->get4Tuesday($dat)) {
$str0 = '|' . implode($fields, '|') . '|';
} else {
// Otherwise, only copy text
$str0 = '|' . implode(array_slice($fields, 1), '|') . '|';
}
$this->vorTxt[] = $str0;
} else {
// Shift to "past.md"
array_splice($this->pastMd, $past, 0, $line);
}
}
}
}
}
// Check if "vor.txt" and "past.md" need to be saved (length of "vor.md" and "vor.txt" differ => line shifted)
public function checkSave() {
// Take header of "vor.md" into account
return count($this->vorTxt) != count($this->vorMd)-2;
}
public function getExit() {
return $this->exit;
}
// Find first entry in PAST
private function findPast() {
for ($i = 0; $i < count($this->pastMd); $i++) {
$fields = array_filter(explode('|', $this->pastMd[$i]));
$ff = explode(', ', $fields[1]);
if (count($ff) > 1) {
$dat = trim($ff[1]);
if (preg_match(self::PREG, $dat)) {
return $i;
}
}
}
return -1;
}
private function get4Tuesday($dat) {
// This is for PHP >= 8.1 as the old strftime will be deprecated by then, so use datefmt_format_object if we are running on PHP beyond version 7
$date_time = new DateTime($dat, $this->CET);
$first_day = $date_time->modify('first day of this month');
$ts = $first_day->getTimeStamp();
if (intval(explode(".", phpversion())[0]) >= 7) {
$date_time->setTimestamp(strtotime('fourth tuesday of this month', $ts));
$tuesday = datefmt_format_object($date_time, 'd.M.yyyy ', 'de_DE.utf8');
} else {
$tuesday = strftime('%d.%m.%Y ', strtotime('fourth tuesday of this month', $ts));
}
return new DateTime($tuesday);
}
}
setlocale(LC_TIME, 'de_DE.utf8');
date_default_timezone_set('Europe/Berlin');
$shift = new ShiftPres();
$shift->shift();
if ($shift->checkSave()) {
$shift->save();
}
// Signal to calling bash script
exit($shift->getExit());
?>