コード例 #1
0
 public function parseValue($value)
 {
     preg_match_all('/%([^$]+)\\$/', $this->format_string, $matches, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
     $i = count($matches[1]);
     $values = [];
     foreach (array_reverse($matches[1]) as $match) {
         $fragmentType = strtolower(ltrim(strrchr(get_class($this->fragment), '\\'), '\\'));
         // era or unit
         $fragmentName = $this->fragment->internal_name;
         $partBegin = stripos($match[0], '{');
         if ($partBegin >= 0) {
             $partEnd = stripos($match[0], '}', $partBegin);
             $fragmentPart = trim(substr($match[0], $partBegin, $partEnd), '{}');
         } else {
             $fragmentPart = 'unknown';
         }
         $type = "{$fragmentType}.{$fragmentName}.{$fragmentPart}";
         if (with($txtObj = $this->texts()->where('fragment_text', $value))->count() > 0) {
             $value = $txtObj->first()->fragment_value;
         }
         $invert = preg_replace('/##(\\d+|\\{[^}]+\\})/', '*${1}+{epoch}%%${1}', str_replace(['\\*', '-%', '\\', '+', '-', ':', '/', '*', ':', '%%', '%', '__', '$$'], ['__', '$$', '##', ':', '+', '-', ':', '/', '*', '+{epoch}\\*', '+{epoch}-%', '+{epoch}%%', '+{epoch}%'], $match[0]));
         $output = BC::parse($invert, ['epoch' => $this->fragment->getEpochValue(), $fragmentPart => $value], 0);
         $values[$i] = [$type, $output];
         $i--;
     }
     return $values;
 }
コード例 #2
0
ファイル: Era.php プロジェクト: danhunsaker/calends
 public function unitValue(array $parsed)
 {
     $raw = Arr::get($parsed, 'value', 0);
     $code = Arr::get($parsed, 'code', $this->default_range);
     $range = $this->ranges()->where('range_code', $code)->where(function ($query) use($raw) {
         // @codeCoverageIgnoreStart
         $query->where(function ($query) use($raw) {
             $query->where('direction', 'asc')->where('start_value', '<=', "{$raw} - start_display")->where('end_value', '>=', "{$raw} - start_display");
         })->orWhere(function ($query) use($raw) {
             $query->where('direction', 'asc')->where('start_value', '<=', "{$raw} - start_display")->whereNull('end_value');
         })->orWhere(function ($query) use($raw) {
             $query->where('direction', 'desc')->where('start_value', '>=', "start_display - {$raw}")->where('end_value', '<=', "start_display - {$raw}");
         })->orWhere(function ($query) use($raw) {
             $query->where('direction', 'desc')->where('start_value', '>=', "start_display - {$raw}")->whereNull('end_value');
         })->orWhere(function ($query) use($raw) {
             $query->whereRaw('1=1');
         });
         // @codeCoverageIgnoreEnd
     })->first();
     $output = [$this->unit->internal_name, BC::parse("({$range->start_value}" . ($range->direction == 'asc' ? '-' : '+') . "{$range->start_display})" . ($range->direction == 'asc' ? '+' : '-') . $raw, null, 0)];
     return $output;
 }
コード例 #3
0
ファイル: Unit.php プロジェクト: danhunsaker/calends
 public function carryOver(array $unitArray)
 {
     $myVal = $this->is_auxiliary ? 0 : BC::sub(Arr::get($unitArray, $this->internal_name, $this->uses_zero ? 0 : 1), $this->uses_zero ? 0 : 1, 18);
     $exprInverse = '({myVal} * {scale}) %% {scale}';
     $exprNormal = '({myVal} - ({myVal} %% {scale})) / {scale}';
     foreach ($this->scalesToMe()->get() as $unit) {
         $unitVal = BC::sub(Arr::get($unitArray, $unit->internal_name, $unit->uses_zero ? 0 : 1), $unit->uses_zero ? 0 : 1, 18);
         $unitAdjustment = 0;
         $myAdjustment = 0;
         if ($unit->scale_inverse) {
             $adjComp = 1;
             $unitExpr = $exprInverse;
             $myExpr = '{adjust} / {scale}';
         } else {
             $adjComp = $myVal;
             $unitExpr = $exprNormal;
             $myExpr = '{adjust} * {scale}';
         }
         if (!is_null($unit->scale_amount)) {
             $unitAdjustment = BC::parse($unitExpr, ['myVal' => $myVal, 'scale' => $unit->scale_amount], 18);
             $myAdjustment = BC::parse($myExpr, ['adjust' => $unitAdjustment, 'scale' => $unit->scale_amount], 18);
         } else {
             $lengths = $unit->lengths()->get();
             $lCount = $lengths->count();
             $lSum = $lengths->sum('scale_amount');
             if ($lCount > 0) {
                 $unitAdjustment = BC::add($unitAdjustment, BC::parse("({$unitExpr}) * {$lCount}", ['myVal' => $myVal, 'scale' => $lSum], 18), 18);
                 $myAdjustment = BC::add($myAdjustment, BC::parse($myExpr, ['adjust' => BC::div($unitAdjustment, $lCount, 18), 'scale' => $lSum], 18), 18);
                 for ($lNum = 0; BC::comp($adjComp, $myAdjustment) > 0 && BC::comp($myVal, $lengths[$lNum]->scale_amount) >= 0; $lNum = BC::parse("({$lNum} + 1) % {$lCount}", null, 0)) {
                     $unitAdjustment = BC::add($unitAdjustment, 1, 18);
                     $myAdjustment = BC::add($myAdjustment, $lengths[$lNum]->scale_amount, 18);
                 }
                 if (BC::comp($adjComp, $myAdjustment) < 0) {
                     $unitAdjustment = BC::sub($unitAdjustment, 1, 18);
                     $myAdjustment = BC::sub($myAdjustment, $lengths[BC::parse("({$lNum} - 1 + {$lCount}) % {$lCount}", null, 0)]->scale_amount, 18);
                 }
             }
         }
         $unitArray[$unit->internal_name] = BC::add(BC::add($unitVal, $unitAdjustment, 18), $unit->uses_zero ? 0 : 1, 18);
         if (!$unit->is_auxiliary) {
             $unitArray[$this->internal_name] = $myVal = BC::add(BC::sub($myVal, $myAdjustment, 18), $this->uses_zero ? 0 : 1, 18);
         }
         $unitArray = $unit->carryOver($unitArray);
     }
     return $unitArray;
 }