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