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
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()); |
|
?>
|
|
|