Polyfill
10 months ago
AbstractCsv.php
10 months ago
ByteSequence.php
10 months ago
CannotInsertRecord.php
10 months ago
CharsetConverter.php
10 months ago
ColumnConsistency.php
10 months ago
EncloseField.php
10 months ago
EscapeFormula.php
10 months ago
Exception.php
10 months ago
HTMLConverter.php
10 months ago
Info.php
10 months ago
InvalidArgument.php
10 months ago
MapIterator.php
10 months ago
RFC4180Field.php
10 months ago
Reader.php
10 months ago
ResultSet.php
10 months ago
Statement.php
10 months ago
Stream.php
10 months ago
SyntaxError.php
10 months ago
TabularDataReader.php
10 months ago
UnableToProcessCsv.php
10 months ago
UnavailableFeature.php
10 months ago
UnavailableStream.php
10 months ago
Writer.php
10 months ago
XMLConverter.php
10 months ago
functions.php
10 months ago
functions_include.php
10 months ago
HTMLConverter.php
138 lines
| 1 | <?php |
| 2 | |
| 3 | /** |
| 4 | * League.Csv (https://csv.thephpleague.com) |
| 5 | * |
| 6 | * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> |
| 7 | * |
| 8 | * For the full copyright and license information, please view the LICENSE |
| 9 | * file that was distributed with this source code. |
| 10 | */ |
| 11 | declare (strict_types=1); |
| 12 | namespace IAWPSCOPED\League\Csv; |
| 13 | |
| 14 | use DOMDocument; |
| 15 | use DOMElement; |
| 16 | use DOMException; |
| 17 | use function preg_match; |
| 18 | /** |
| 19 | * Converts tabular data into an HTML Table string. |
| 20 | * @internal |
| 21 | */ |
| 22 | class HTMLConverter |
| 23 | { |
| 24 | /** |
| 25 | * table class attribute value. |
| 26 | * |
| 27 | * @var string |
| 28 | */ |
| 29 | protected $class_name = 'table-csv-data'; |
| 30 | /** |
| 31 | * table id attribute value. |
| 32 | * |
| 33 | * @var string |
| 34 | */ |
| 35 | protected $id_value = ''; |
| 36 | /** @var XMLConverter */ |
| 37 | protected $xml_converter; |
| 38 | public static function create() : self |
| 39 | { |
| 40 | return new self(); |
| 41 | } |
| 42 | /** |
| 43 | * DEPRECATION WARNING! This method will be removed in the next major point release. |
| 44 | * |
| 45 | * @deprecated since version 9.7.0 |
| 46 | * @see HTMLConverterTest::create() |
| 47 | */ |
| 48 | public function __construct() |
| 49 | { |
| 50 | $this->xml_converter = XMLConverter::create()->rootElement('table')->recordElement('tr')->fieldElement('td'); |
| 51 | } |
| 52 | /** |
| 53 | * Converts a tabular data collection into a HTML table string. |
| 54 | * |
| 55 | * @param string[] $header_record An optional array of headers outputted using the`<thead>` section |
| 56 | * @param string[] $footer_record An optional array of footers to output to the table using `<tfoot>` and `<th>` elements |
| 57 | */ |
| 58 | public function convert(iterable $records, array $header_record = [], array $footer_record = []) : string |
| 59 | { |
| 60 | $doc = new DOMDocument('1.0'); |
| 61 | if ([] === $header_record && [] === $footer_record) { |
| 62 | $table = $this->xml_converter->import($records, $doc); |
| 63 | $this->addHTMLAttributes($table); |
| 64 | $doc->appendChild($table); |
| 65 | /** @var string $content */ |
| 66 | $content = $doc->saveHTML(); |
| 67 | return $content; |
| 68 | } |
| 69 | $table = $doc->createElement('table'); |
| 70 | $this->addHTMLAttributes($table); |
| 71 | $this->appendHeaderSection('thead', $header_record, $table); |
| 72 | $this->appendHeaderSection('tfoot', $footer_record, $table); |
| 73 | $table->appendChild($this->xml_converter->rootElement('tbody')->import($records, $doc)); |
| 74 | $doc->appendChild($table); |
| 75 | /** @var string $content */ |
| 76 | $content = $doc->saveHTML(); |
| 77 | return $content; |
| 78 | } |
| 79 | /** |
| 80 | * Creates a DOMElement representing a HTML table heading section. |
| 81 | */ |
| 82 | protected function appendHeaderSection(string $node_name, array $record, DOMElement $table) : void |
| 83 | { |
| 84 | if ([] === $record) { |
| 85 | return; |
| 86 | } |
| 87 | /** @var DOMDocument $ownerDocument */ |
| 88 | $ownerDocument = $table->ownerDocument; |
| 89 | $node = $this->xml_converter->rootElement($node_name)->recordElement('tr')->fieldElement('th')->import([$record], $ownerDocument); |
| 90 | /** @var DOMElement $element */ |
| 91 | foreach ($node->getElementsByTagName('th') as $element) { |
| 92 | $element->setAttribute('scope', 'col'); |
| 93 | } |
| 94 | $table->appendChild($node); |
| 95 | } |
| 96 | /** |
| 97 | * Adds class and id attributes to an HTML tag. |
| 98 | */ |
| 99 | protected function addHTMLAttributes(DOMElement $node) : void |
| 100 | { |
| 101 | $node->setAttribute('class', $this->class_name); |
| 102 | $node->setAttribute('id', $this->id_value); |
| 103 | } |
| 104 | /** |
| 105 | * HTML table class name setter. |
| 106 | * |
| 107 | * @throws DOMException if the id_value contains any type of whitespace |
| 108 | */ |
| 109 | public function table(string $class_name, string $id_value = '') : self |
| 110 | { |
| 111 | if (1 === preg_match(",\\s,", $id_value)) { |
| 112 | throw new DOMException("the id attribute's value must not contain whitespace (spaces, tabs etc.)"); |
| 113 | } |
| 114 | $clone = clone $this; |
| 115 | $clone->class_name = $class_name; |
| 116 | $clone->id_value = $id_value; |
| 117 | return $clone; |
| 118 | } |
| 119 | /** |
| 120 | * HTML tr record offset attribute setter. |
| 121 | */ |
| 122 | public function tr(string $record_offset_attribute_name) : self |
| 123 | { |
| 124 | $clone = clone $this; |
| 125 | $clone->xml_converter = $this->xml_converter->recordElement('tr', $record_offset_attribute_name); |
| 126 | return $clone; |
| 127 | } |
| 128 | /** |
| 129 | * HTML td field name attribute setter. |
| 130 | */ |
| 131 | public function td(string $fieldname_attribute_name) : self |
| 132 | { |
| 133 | $clone = clone $this; |
| 134 | $clone->xml_converter = $this->xml_converter->fieldElement('td', $fieldname_attribute_name); |
| 135 | return $clone; |
| 136 | } |
| 137 | } |
| 138 |