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; }
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; }
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; }