diff --git a/samples/Basic/45_Quadratic_equation_solver.php b/samples/Basic/45_Quadratic_equation_solver.php index 84c126aa..83a2000f 100644 --- a/samples/Basic/45_Quadratic_equation_solver.php +++ b/samples/Basic/45_Quadratic_equation_solver.php @@ -1,20 +1,35 @@
Enter the coefficients for the Ax2 + Bx + C = 0 - - + + + - - + + + - - + + +
+ + + +
+ + + +
+ + +

diff --git a/src/PhpSpreadsheet/Settings.php b/src/PhpSpreadsheet/Settings.php index b51cd9d0..03d3b191 100644 --- a/src/PhpSpreadsheet/Settings.php +++ b/src/PhpSpreadsheet/Settings.php @@ -99,6 +99,11 @@ class Settings return self::$chartRenderer; } + public static function htmlEntityFlags(): int + { + return \ENT_COMPAT; + } + /** * Set default options for libxml loader. * diff --git a/src/PhpSpreadsheet/Shared/XMLWriter.php b/src/PhpSpreadsheet/Shared/XMLWriter.php index c35b7820..b11463cf 100644 --- a/src/PhpSpreadsheet/Shared/XMLWriter.php +++ b/src/PhpSpreadsheet/Shared/XMLWriter.php @@ -2,6 +2,8 @@ namespace PhpOffice\PhpSpreadsheet\Shared; +use PhpOffice\PhpSpreadsheet\Settings; + class XMLWriter extends \XMLWriter { public static $debugEnabled = false; @@ -87,6 +89,6 @@ class XMLWriter extends \XMLWriter $text = implode("\n", $text); } - return $this->writeRaw(htmlspecialchars($text ?? '')); + return $this->writeRaw(htmlspecialchars($text ?? '', Settings::htmlEntityFlags())); } } diff --git a/src/PhpSpreadsheet/Writer/Html.php b/src/PhpSpreadsheet/Writer/Html.php index 76c5e722..ded9a964 100644 --- a/src/PhpSpreadsheet/Writer/Html.php +++ b/src/PhpSpreadsheet/Writer/Html.php @@ -9,6 +9,7 @@ use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\Chart\Chart; use PhpOffice\PhpSpreadsheet\RichText\RichText; use PhpOffice\PhpSpreadsheet\RichText\Run; +use PhpOffice\PhpSpreadsheet\Settings; use PhpOffice\PhpSpreadsheet\Shared\Drawing as SharedDrawing; use PhpOffice\PhpSpreadsheet\Shared\File; use PhpOffice\PhpSpreadsheet\Shared\Font as SharedFont; @@ -350,7 +351,9 @@ class Html extends BaseWriter private static function generateMeta($val, $desc) { - return $val ? (' ' . PHP_EOL) : ''; + return $val + ? (' ' . PHP_EOL) + : ''; } /** @@ -369,7 +372,7 @@ class Html extends BaseWriter $html .= ' ' . PHP_EOL; $html .= ' ' . PHP_EOL; $html .= ' ' . PHP_EOL; - $html .= ' ' . htmlspecialchars($properties->getTitle()) . '' . PHP_EOL; + $html .= ' ' . htmlspecialchars($properties->getTitle(), Settings::htmlEntityFlags()) . '' . PHP_EOL; $html .= self::generateMeta($properties->getCreator(), 'author'); $html .= self::generateMeta($properties->getTitle(), 'title'); $html .= self::generateMeta($properties->getDescription(), 'description'); @@ -672,7 +675,7 @@ class Html extends BaseWriter $filename = preg_replace('@^[.]([^/])@', '$1', $filename); // Convert UTF8 data to PCDATA - $filename = htmlspecialchars($filename); + $filename = htmlspecialchars($filename, Settings::htmlEntityFlags()); $html .= PHP_EOL; $imageData = self::winFileToUrl($filename); @@ -1301,7 +1304,7 @@ class Html extends BaseWriter // Convert UTF8 data to PCDATA $cellText = $element->getText(); - $cellData .= htmlspecialchars($cellText); + $cellData .= htmlspecialchars($cellText, Settings::htmlEntityFlags()); $cellData .= $cellEnd; @@ -1309,7 +1312,7 @@ class Html extends BaseWriter } else { // Convert UTF8 data to PCDATA $cellText = $element->getText(); - $cellData .= htmlspecialchars($cellText); + $cellData .= htmlspecialchars($cellText, Settings::htmlEntityFlags()); } } } @@ -1326,7 +1329,7 @@ class Html extends BaseWriter [$this, 'formatColor'] ); if ($cellData === $origData) { - $cellData = htmlspecialchars($cellData ?? ''); + $cellData = htmlspecialchars($cellData ?? '', Settings::htmlEntityFlags()); } if ($pSheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont()->getSuperscript()) { $cellData = '' . $cellData . ''; @@ -1491,7 +1494,7 @@ class Html extends BaseWriter // Hyperlink? if ($pSheet->hyperlinkExists($coordinate) && !$pSheet->getHyperlink($coordinate)->isInternal()) { - $cellData = '' . $cellData . ''; + $cellData = '' . $cellData . ''; } // Should the cell be written or is it swallowed by a rowspan or colspan? @@ -1671,7 +1674,7 @@ class Html extends BaseWriter } // convert to PCDATA - $value = htmlspecialchars($pValue); + $value = htmlspecialchars($pValue, Settings::htmlEntityFlags()); // color span tag if ($color !== null) { diff --git a/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php b/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php index 99f3cfb0..70d0a414 100644 --- a/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php +++ b/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php @@ -5,6 +5,7 @@ namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Cell\Cell; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\RichText\RichText; +use PhpOffice\PhpSpreadsheet\Settings; use PhpOffice\PhpSpreadsheet\Shared\StringHelper; use PhpOffice\PhpSpreadsheet\Shared\XMLWriter; use PhpOffice\PhpSpreadsheet\Style\Conditional; @@ -1172,7 +1173,10 @@ class Worksheet extends WriterPart { $objWriter->writeAttribute('t', $mappedType); if (!$cellValue instanceof RichText) { - $objWriter->writeElement('t', StringHelper::controlCharacterPHP2OOXML(htmlspecialchars($cellValue))); + $objWriter->writeElement( + 't', + StringHelper::controlCharacterPHP2OOXML(htmlspecialchars($cellValue, Settings::htmlEntityFlags())) + ); } elseif ($cellValue instanceof RichText) { $objWriter->startElement('is'); $this->getParentWriter()->getWriterPartstringtable()->writeRichText($objWriter, $cellValue); diff --git a/tests/PhpSpreadsheetTests/Writer/Html/HtmlNumberFormatTest.php b/tests/PhpSpreadsheetTests/Writer/Html/HtmlNumberFormatTest.php index 199ab529..056ffc71 100644 --- a/tests/PhpSpreadsheetTests/Writer/Html/HtmlNumberFormatTest.php +++ b/tests/PhpSpreadsheetTests/Writer/Html/HtmlNumberFormatTest.php @@ -3,6 +3,7 @@ namespace PhpOffice\PhpSpreadsheetTests\Writer\Html; use DOMDocument; +use PhpOffice\PhpSpreadsheet\Settings; use PhpOffice\PhpSpreadsheet\Shared\StringHelper; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Html; @@ -175,7 +176,7 @@ class HtmlNumberFormatTest extends Functional\AbstractFunctional $rows = $tbod[0]->getElementsByTagName('tr'); $tds = $rows[0]->getElementsByTagName('td'); - $nbsp = html_entity_decode(' '); + $nbsp = html_entity_decode(' ', Settings::htmlEntityFlags()); self::assertEquals($expectedResult, str_replace($nbsp, ' ', $tds[0]->textContent)); $this->writeAndReload($spreadsheet, 'Html'); @@ -211,7 +212,7 @@ class HtmlNumberFormatTest extends Functional\AbstractFunctional $rows = $tbod[0]->getElementsByTagName('tr'); $tds = $rows[0]->getElementsByTagName('td'); - $nbsp = html_entity_decode(' '); + $nbsp = html_entity_decode(' ', Settings::htmlEntityFlags()); self::assertEquals($expectedResult, str_replace($nbsp, ' ', $tds[0]->textContent)); $this->writeAndReload($spreadsheet, 'Html');