. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Report; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Carbon; use Fisharebest\Webtrees\I18N; use function preg_match; use function strtoupper; /** * Class ReportParserSetup - parse a report.xml file and extract the setup options. */ class ReportParserSetup extends ReportParserBase { /** @var array An array of report options/parameters */ private $data = []; /** @var string[] An array of input attributes */ private $input; /** * Return the parsed data. * * @return array */ public function reportProperties(): array { return $this->data; } /** * Handle * * @param string[] $attrs * * @return void */ protected function reportStartHandler(array $attrs): void { $this->data['access'] = $attrs['access'] ?? Auth::PRIV_PRIVATE; $this->data['icon'] = $attrs['icon'] ?? ''; } /** * Handle * * @param string[] $attrs * * @return void */ protected function varStartHandler(array $attrs): void { if (preg_match('/^I18N::number\((.+)\)$/', $attrs['var'], $match)) { $this->text .= I18N::number((int) $match[1]); } elseif (preg_match('/^I18N::translate\(\'(.+)\'\)$/', $attrs['var'], $match)) { $this->text .= I18N::translate($match[1]); } elseif (preg_match('/^I18N::translateContext\(\'(.+)\', *\'(.+)\'\)$/', $attrs['var'], $match)) { $this->text .= I18N::translateContext($match[1], $match[2]); } else { $this->text .= $attrs['var']; } } /** * Handle * * @return void */ protected function titleStartHandler(): void { $this->text = ''; } /** * Handle * * @return void */ protected function titleEndHandler(): void { $this->data['title'] = $this->text; $this->text = ''; } /** * Handle * * @return void */ protected function descriptionEndHandler(): void { $this->data['description'] = $this->text; $this->text = ''; } /** * Handle * * @param string[] $attrs * * @return void */ protected function inputStartHandler(array $attrs): void { $this->text = ''; $this->input = [ 'name' => $attrs['name'] ?? '', 'type' => $attrs['type'] ?? '', 'lookup' => $attrs['lookup'] ?? '', 'options' => $attrs['options'] ?? '', 'default' => '', 'value' => '', ]; if (isset($attrs['default'])) { if ($attrs['default'] === 'NOW') { $date = Carbon::now(); $this->input['default'] = strtoupper($date->format('d M Y')); } else { $match = []; if (preg_match('/NOW([+\-]\d+)/', $attrs['default'], $match) > 0) { $date = Carbon::now()->addDays((int) $match[1]); $this->input['default'] = strtoupper($date->format('d M Y')); } else { $this->input['default'] = $attrs['default']; } } } elseif ($attrs['name'] === 'pageSize') { $this->input['default'] = I18N::locale()->territory()->paperSize(); } } /** * Handle * * @return void */ protected function inputEndHandler(): void { $this->input['value'] = $this->text; if (!isset($this->data['inputs'])) { $this->data['inputs'] = []; } $this->data['inputs'][] = $this->input; $this->text = ''; } }