Allow autotranslation of time spans before 1000 CE

This commit is contained in:
Joshua Ramon Enslin 2020-09-23 17:03:12 +02:00 committed by Stefan Rohde-Enslin
parent 0f6a6ebc84
commit a4a94a8f8a
2 changed files with 45 additions and 9 deletions

View File

@ -264,10 +264,10 @@ final class NodaTimeAutotranslater {
*/
public static function check_translatability(string $zeit_beginn, string $zeit_ende, string $zeit_zaehlzeit_monat):int {
if (intval($zeit_beginn) > 1000 and $zeit_ende === "?") {
if ($zeit_ende === "?") {
return self::TRANSLATABLE_SINCE_START;
}
if (intval($zeit_ende) > 1000 and $zeit_beginn === "?") {
if ($zeit_beginn === "?") {
return self::TRANSLATABLE_UNTIL_END;
}
@ -347,7 +347,7 @@ final class NodaTimeAutotranslater {
*
* @return array<string>
*/
public function translateYearsWithSuffix(array $timeInfo):array {
public static function translateYearsWithSuffix(array $timeInfo):array {
$start = intval($timeInfo['zeit_beginn']);
$end = intval($timeInfo['zeit_ende']);

View File

@ -227,11 +227,11 @@ final class NodaTimeSplitter {
public static function timePartsToCountingYear(array $moda):int {
if ($moda[0] === "?") {
return intval($moda[1]);
return abs(intval($moda[1]));
}
if ($moda[1] === "?") {
return intval($moda[0]);
return abs(intval($moda[0]));
}
return abs((int)ceil(intval($moda[1]) - ((intval($moda[1]) - intval($moda[0])) / 2)));
@ -307,27 +307,34 @@ final class NodaTimeSplitter {
$datum = self::clean_input($datum);
if (preg_match("/^[0-9][0-9][0-9][0-9](\-|\/)[0-9][0-9][0-9][0-9] v\. Chr\.$/", $datum)) {
if (preg_match("/^[0-9][0-9][0-9]\ v\. Chr\.$/", $datum)) {
$start = "-0" . substr($datum, 0, 3);
return [$start, $start, "00", "00", "-", ""];
}
if (preg_match("/^[0-9][0-9][0-9][0-9](\-|\/)[0-9][0-9][0-9][0-9]\ v\. Chr\.$/", $datum)) {
$start = "-" . substr($datum, 0, 4);
$end = "-" . substr($datum, 5, 4);
return [$start, $end, "00", "00", "-", ""];
}
if (preg_match("/^[0-9][0-9][0-9][0-9](\-|\/)[0-9][0-9][0-9] v\. Chr\.$/", $datum)) {
if (preg_match("/^[0-9][0-9][0-9][0-9](\-|\/)[0-9][0-9][0-9]\ v\. Chr\.$/", $datum)) {
$start = "-" . substr($datum, 0, 4);
$end = "-" . substr($datum, 5, 3);
return [$start, $end, "00", "00", "-", ""];
}
if (preg_match("/^[0-9][0-9][0-9](\-|\/)[0-9][0-9][0-9] v\. Chr\.$/", $datum)) {
if (preg_match("/^[0-9][0-9][0-9](\-|\/)[0-9][0-9][0-9]\ v\. Chr\.$/", $datum)) {
$start = "-" . substr($datum, 0, 3);
$end = "-" . substr($datum, 4, 3);
return [$start, $end, "00", "00", "-", ""];
}
if (preg_match("/^[0-9][0-9](\-|\/)[0-9][0-9] v\. Chr\.$/", $datum)) {
if (preg_match("/^[0-9][0-9](\-|\/)[0-9][0-9]\ v\. Chr\.$/", $datum)) {
$start = "-00" . substr($datum, 0, 2);
$end = "-00" . substr($datum, 3, 2);
return [$start, $end, "00", "00", "-", ""];
}
$datum = str_replace(". ", ".", $datum);
if (self::stri_occurs($datum, self::STOP_STRINGS_GERMAN)) {
return [];
}
@ -640,6 +647,34 @@ final class NodaTimeSplitter {
}
/**
* Checks if an input date is a decade.
*
* @param string $datum Input date.
*
* @return array<string>
*/
public static function is_decade(string $datum):array {
$datum = self::clean_input($datum);
$bcBceIndicator = '+';
if (preg_match("/^[0-9]0(er\ Jahre)$/", $datum)) {
$start = "19" . substr($datum, 0, 2);
$ende = (string)(intval($start) + 9);
return [$start, $ende, "00", "00", $bcBceIndicator, ""];
}
if (preg_match("/^[0-9][0-9][0-9]0(er\ Jahre)$/", $datum)) {
$start = substr($datum, 0, 4);
$ende = (string)(intval($start) + 9);
return [$start, $ende, "00", "00", $bcBceIndicator, ""];
}
return [];
}
/**
* Wrapper to check if any splitting command works.
*
@ -654,6 +689,7 @@ final class NodaTimeSplitter {
if (!$moda) $moda = NodaTimeSplitter::is_valid_date($datum);
if (!$moda) $moda = NodaTimeSplitter::is_valid_date_hungarian($datum);
if (!$moda) $moda = NodaTimeSplitter::is_century($datum);
if (!$moda) $moda = NodaTimeSplitter::is_decade($datum);
return $moda;