diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8309f08c..762652ca 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,7 +7,8 @@ All Notable changes to `Csv` will be documented in this file
### Added
- `XMLConverter::import` see [#348](https://github.com/thephpleague/csv/pull/348) thanks [@kusabi](https://github.com/kusabi)
-- support for `thead`, `tfoot` and `tbody` in footer `HTMLConverter::convert` see [#348](https://github.com/thephpleague/csv/pull/348) thanks [@kusabi](https://github.com/kusabi)
+- Support for `thead`, `tfoot` and `tbody` in `HTMLConverter::convert` via the addition of
+protected methods `HTMLConverter::addHTMLAttributes` and `HTMLConverter::appendHeaderSection` [#348](https://github.com/thephpleague/csv/pull/348) thanks [@kusabi](https://github.com/kusabi)
### Deprecated
@@ -15,7 +16,9 @@ All Notable changes to `Csv` will be documented in this file
### Fixed
-- Internal improvement in `Reader` dockblock thanks [@ghobaty](https://github.com/ghobaty).
+- Internal improvement in `Reader` dockblock thanks [@ghobaty](https://github.com/ghobaty).
+- Improve strict comparison when using `preg_match`.
+- Improve CSV control in `Stream`.
### Removed
diff --git a/src/HTMLConverter.php b/src/HTMLConverter.php
index b0a4b4b7..8d841800 100644
--- a/src/HTMLConverter.php
+++ b/src/HTMLConverter.php
@@ -56,10 +56,10 @@ public function __construct()
}
/**
- * Convert an Record collection into a DOMDocument.
+ * Converts a tabular data collection into a HTML table string.
*
* @param array|Traversable $records The tabular data collection
- * @param string[] $header_record An optional array of headers to output to the table using `` and `` elements
+ * @param string[] $header_record An optional array of headers outputted using the`` section
* @param string[] $footer_record An optional array of footers to output to the table using ` |
` and `` elements
*/
public function convert($records, array $header_record = [], array $footer_record = []): string
@@ -67,22 +67,55 @@ public function convert($records, array $header_record = [], array $footer_recor
$doc = new DOMDocument('1.0');
if ([] === $header_record && [] === $footer_record) {
$table = $this->xml_converter->import($records, $doc);
- $this->styleTableElement($table);
+ $this->addHTMLAttributes($table);
$doc->appendChild($table);
return $doc->saveHTML();
}
$table = $doc->createElement('table');
- $this->styleTableElement($table);
- $this->appendTableHeaderSection('thead', $header_record, $table);
- $this->appendTableHeaderSection('tfoot', $footer_record, $table);
+ $this->addHTMLAttributes($table);
+ $this->appendHeaderSection('thead', $header_record, $table);
+ $this->appendHeaderSection('tfoot', $footer_record, $table);
$table->appendChild($this->xml_converter->rootElement('tbody')->import($records, $doc));
$doc->appendChild($table);
return $doc->saveHTML();
}
+ /**
+ * Creates a DOMElement representing a HTML table heading section.
+ */
+ protected function appendHeaderSection(string $node_name, array $record, DOMElement $table)
+ {
+ if ([] === $record) {
+ return;
+ }
+
+ $node = $this->xml_converter
+ ->rootElement($node_name)
+ ->recordElement('tr')
+ ->fieldElement('th')
+ ->import([$record], $table->ownerDocument)
+ ;
+
+ /** @var DOMElement $element */
+ foreach ($node->getElementsByTagName('th') as $element) {
+ $element->setAttribute('scope', 'col');
+ }
+
+ $table->appendChild($node);
+ }
+
+ /**
+ * Adds class and id attributes to an HTML tag.
+ */
+ protected function addHTMLAttributes(DOMElement $node)
+ {
+ $node->setAttribute('class', $this->class_name);
+ $node->setAttribute('id', $this->id_value);
+ }
+
/**
* HTML table class name setter.
*
@@ -121,37 +154,4 @@ public function td(string $fieldname_attribute_name): self
return $clone;
}
-
- /**
- * Create a DOMElement representing a single record of data.
- */
- private function appendTableHeaderSection(string $node_name, array $record, DOMElement $table)
- {
- if ([] === $record) {
- return;
- }
-
- $node = $this->xml_converter
- ->rootElement($node_name)
- ->recordElement('tr')
- ->fieldElement('th')
- ->import([$record], $table->ownerDocument)
- ;
-
- /** @var DOMElement $element */
- foreach ($node->getElementsByTagName('th') as $element) {
- $element->setAttribute('scope', 'col');
- }
-
- $table->appendChild($node);
- }
-
- /**
- * Style the table dom element.
- */
- private function styleTableElement(DOMElement $node)
- {
- $node->setAttribute('class', $this->class_name);
- $node->setAttribute('id', $this->id_value);
- }
}
diff --git a/src/Stream.php b/src/Stream.php
index cc5d2962..e3b5d8de 100644
--- a/src/Stream.php
+++ b/src/Stream.php
@@ -17,7 +17,6 @@
use SplFileObject;
use TypeError;
use function array_keys;
-use function array_values;
use function array_walk_recursive;
use function fclose;
use function feof;
@@ -264,18 +263,19 @@ public function setCsvControl(string $delimiter = ',', string $enclosure = '"',
*/
protected function filterControl(string $delimiter, string $enclosure, string $escape, string $caller): array
{
- $controls = ['delimiter' => $delimiter, 'enclosure' => $enclosure, 'escape' => $escape];
- foreach ($controls as $type => $control) {
- if ('escape' === $type && '' === $control && 70400 <= PHP_VERSION_ID) {
- continue;
- }
-
- if (1 !== strlen($control)) {
- throw new Exception(sprintf('%s() expects %s to be a single character', $caller, $type));
- }
+ if (1 !== strlen($delimiter)) {
+ throw new Exception(sprintf('%s() expects delimiter to be a single character', $caller));
}
- return array_values($controls);
+ if (1 !== strlen($enclosure)) {
+ throw new Exception(sprintf('%s() expects enclosure to be a single character', $caller));
+ }
+
+ if (1 === strlen($escape) || ('' === $escape && 70400 <= PHP_VERSION_ID)) {
+ return [$delimiter, $enclosure, $escape];
+ }
+
+ throw new Exception(sprintf('%s() expects escape to be a single character', $caller));
}
/**
@@ -423,11 +423,11 @@ public function seek($position)
$this->current();
$this->next();
}
-
+
if (0 !== $position) {
$this->offset--;
}
-
+
$this->current();
}
diff --git a/tests/HTMLConverterTest.php b/tests/HTMLConverterTest.php
index 9ec8038e..4ecbbf44 100644
--- a/tests/HTMLConverterTest.php
+++ b/tests/HTMLConverterTest.php
@@ -61,8 +61,8 @@ public function testToHTML()
/**
* @covers ::convert
- * @covers ::appendTableHeaderSection
- * @covers ::styleTableElement
+ * @covers ::appendHeaderSection
+ * @covers ::addHTMLAttributes
*/
public function testToHTMLWithTHeadTableSection()
{
@@ -97,8 +97,8 @@ public function testToHTMLWithTHeadTableSection()
/**
* @covers ::convert
- * @covers ::appendTableHeaderSection
- * @covers ::styleTableElement
+ * @covers ::appendHeaderSection
+ * @covers ::addHTMLAttributes
*/
public function testToHTMLWithTFootTableSection()
{
@@ -133,8 +133,8 @@ public function testToHTMLWithTFootTableSection()
/**
* @covers ::convert
- * @covers ::appendTableHeaderSection
- * @covers ::styleTableElement
+ * @covers ::appendHeaderSection
+ * @covers ::addHTMLAttributes
*/
public function testToHTMLWithBothTableHeaderSection()
{
|