. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Report; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\I18N; /** * 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; } /** * Process * * @param string[] $attrs * * @return void */ protected function reportStartHandler(array $attrs) { $access = Auth::PRIV_PRIVATE; if (isset($attrs['access'])) { if (isset($$attrs['access'])) { $access = $$attrs['access']; } } $this->data['access'] = $access; if (isset($attrs['icon'])) { $this->data['icon'] = $attrs['icon']; } else { $this->data['icon'] = ''; } } /** * Process * * @param string[] $attrs * * @return void */ protected function varStartHandler(array $attrs) { 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']; } } /** * Process * * @return void */ protected function titleStartHandler() { $this->text = ''; } /** * Process * * @return void */ protected function titleEndHandler() { $this->data['title'] = $this->text; $this->text = ''; } /** * Process * * @return void */ protected function descriptionEndHandler() { $this->data['description'] = $this->text; $this->text = ''; } /** * Process * * @param string[] $attrs * * @return void */ protected function inputStartHandler(array $attrs) { $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') { $this->input['default'] = date('d M Y'); } else { $match = []; if (preg_match('/NOW\s*([+\-])\s*(\d+)/', $attrs['default'], $match) > 0) { $plus = 1; if ($match[1] === '-') { $plus = -1; } $this->input['default'] = date('d M Y', WT_TIMESTAMP + $plus * 60 * 60 * 24 * $match[2]); } else { $this->input['default'] = $attrs['default']; } } } } /** * Process * * @return void */ protected function inputEndHandler() { $this->input['value'] = $this->text; if (!isset($this->data['inputs'])) { $this->data['inputs'] = []; } $this->data['inputs'][] = $this->input; $this->text = ''; } }