xref: /webtrees/app/Report/ReportParserSetup.php (revision db3aeb3eb846bb233f34557aedb1559aadf9275a)
1<?php
2/**
3 * webtrees: online genealogy
4 * Copyright (C) 2019 webtrees development team
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16declare(strict_types=1);
17
18namespace Fisharebest\Webtrees\Report;
19
20use Carbon\Carbon;
21use Fisharebest\Webtrees\Auth;
22use Fisharebest\Webtrees\I18N;
23
24/**
25 * Class ReportParserSetup - parse a report.xml file and extract the setup options.
26 */
27class ReportParserSetup extends ReportParserBase
28{
29    /** @var array An array of report options/parameters */
30    private $data = [];
31
32    /** @var string[] An array of input attributes */
33    private $input;
34
35    /**
36     * Return the parsed data.
37     *
38     * @return array
39     */
40    public function reportProperties(): array
41    {
42        return $this->data;
43    }
44
45    /**
46     * Process <Report>
47     *
48     * @param string[] $attrs
49     *
50     * @return void
51     */
52    protected function reportStartHandler(array $attrs)
53    {
54        $this->data['access'] = $attrs['access'] ?? Auth::PRIV_PRIVATE;
55
56        $this->data['icon'] = $attrs['icon'] ?? '';
57    }
58
59    /**
60     * Process <var var="">
61     *
62     * @param string[] $attrs
63     *
64     * @return void
65     */
66    protected function varStartHandler(array $attrs)
67    {
68        if (preg_match('/^I18N::number\((.+)\)$/', $attrs['var'], $match)) {
69            $this->text .= I18N::number((int) $match[1]);
70        } elseif (preg_match('/^I18N::translate\(\'(.+)\'\)$/', $attrs['var'], $match)) {
71            $this->text .= I18N::translate($match[1]);
72        } elseif (preg_match('/^I18N::translateContext\(\'(.+)\', *\'(.+)\'\)$/', $attrs['var'], $match)) {
73            $this->text .= I18N::translateContext($match[1], $match[2]);
74        } else {
75            $this->text .= $attrs['var'];
76        }
77    }
78
79    /**
80     * Process <Title>
81     *
82     * @return void
83     */
84    protected function titleStartHandler()
85    {
86        $this->text = '';
87    }
88
89    /**
90     * Process </Title>
91     *
92     * @return void
93     */
94    protected function titleEndHandler()
95    {
96        $this->data['title'] = $this->text;
97
98        $this->text = '';
99    }
100
101    /**
102     * Process </Description>
103     *
104     * @return void
105     */
106    protected function descriptionEndHandler()
107    {
108        $this->data['description'] = $this->text;
109
110        $this->text = '';
111    }
112
113    /**
114     * Process <Input>
115     *
116     * @param string[] $attrs
117     *
118     * @return void
119     */
120    protected function inputStartHandler(array $attrs)
121    {
122        $this->text  = '';
123        $this->input = [
124            'name'    => $attrs['name'] ?? '',
125            'type'    => $attrs['type'] ?? '',
126            'lookup'  => $attrs['lookup'] ?? '',
127            'options' => $attrs['options'] ?? '',
128            'default' => '',
129            'value'   => '',
130        ];
131
132        if (isset($attrs['default'])) {
133            if ($attrs['default'] === 'NOW') {
134                $this->input['default'] = date('d M Y');
135            } else {
136                $match = [];
137                if (preg_match('/NOW([+\-]\d+)/', $attrs['default'], $match) > 0) {
138                    $timestamp = Carbon::now()->addDays((int) $match[1])->timestamp;
139                    $this->input['default'] = date('d M Y', $timestamp);
140                } else {
141                    $this->input['default'] = $attrs['default'];
142                }
143            }
144        }
145    }
146
147    /**
148     * Process </Input>
149     *
150     * @return void
151     */
152    protected function inputEndHandler()
153    {
154        $this->input['value'] = $this->text;
155        if (!isset($this->data['inputs'])) {
156            $this->data['inputs'] = [];
157        }
158        $this->data['inputs'][] = $this->input;
159        $this->text             = '';
160    }
161}
162