summaryrefslogtreecommitdiff
path: root/app/Report/ReportParserBase.php
diff options
context:
space:
mode:
authorGreg Roach <fisharebest@gmail.com>2015-05-31 22:16:03 +0100
committerGreg Roach <fisharebest@gmail.com>2015-05-31 23:33:33 +0100
commitef0d468b3df316b4c63606fcd8d2cd5446aa80de (patch)
tree51ac725290a996079fc01ebc7859b2dc6f9b809a /app/Report/ReportParserBase.php
parentadc8b18ac5746a1eec1eeed9e4e3f8bf9b0de428 (diff)
downloadwebtrees-ef0d468b3df316b4c63606fcd8d2cd5446aa80de.tar.gz
webtrees-ef0d468b3df316b4c63606fcd8d2cd5446aa80de.tar.bz2
webtrees-ef0d468b3df316b4c63606fcd8d2cd5446aa80de.zip
Refactor report parsing
Diffstat (limited to 'app/Report/ReportParserBase.php')
-rw-r--r--app/Report/ReportParserBase.php93
1 files changed, 93 insertions, 0 deletions
diff --git a/app/Report/ReportParserBase.php b/app/Report/ReportParserBase.php
new file mode 100644
index 0000000000..36e4b16557
--- /dev/null
+++ b/app/Report/ReportParserBase.php
@@ -0,0 +1,93 @@
+<?php
+namespace Fisharebest\Webtrees\Report;
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2015 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+use Fisharebest\Webtrees\Auth;
+use Fisharebest\Webtrees\Date;
+use Fisharebest\Webtrees\I18N;
+
+/**
+ * Class ReportParserBase
+ */
+class ReportParserBase {
+ /** @var resource The XML parser */
+ private $xml_parser;
+
+ /** @var string Text contents of tags */
+ protected $text = '';
+
+ /**
+ * Create a parser for a report
+ *
+ * @param string $report The XML filename
+ */
+ public function __construct($report) {
+ $this->xml_parser = xml_parser_create();
+ xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, false);
+ xml_set_element_handler($this->xml_parser, array($this, 'startElement'), array($this, 'endElement'));
+ xml_set_character_data_handler($this->xml_parser, array($this, 'characterData'));
+
+ $fp = fopen($report, 'r');
+ while (($data = fread($fp, 4096))) {
+ if (!xml_parse($this->xml_parser, $data, feof($fp))) {
+ throw new \DomainException(sprintf(
+ 'XML error: %s at line %d',
+ xml_error_string(xml_get_error_code($this->xml_parser)),
+ xml_get_current_line_number($this->xml_parser)
+ ));
+ }
+ }
+
+ xml_parser_free($this->xml_parser);
+ }
+
+ /**
+ * XML handler for an opening (or self-closing) tag.
+ *
+ * @param resource $parser The resource handler for the xml parser
+ * @param string $name The name of the xml element parsed
+ * @param string[] $attrs An array of key value pairs for the attributes
+ */
+ private function startElement($parser, $name, $attrs) {
+ $method = strtolower($name) . 'StartHandler';
+ if (method_exists($this, $method)) {
+ $this->$method($attrs);
+ }
+ }
+
+ /**
+ * XML handler for a closing tag.
+ *
+ * @param resource $parser the resource handler for the xml parser
+ * @param string $name the name of the xml element parsed
+ */
+ private function endElement($parser, $name) {
+ $method = strtolower($name) . 'EndHandler';
+ if (method_exists($this, $method)) {
+ $this->$method();
+ }
+ }
+
+ /**
+ * XML handler for character data.
+ *
+ * @param resource $parser The resource handler for the xml parser
+ * @param string $data The name of the xml element parsed
+ */
+ private function characterData($parser, $data) {
+ $this->text .= $data;
+ }
+}