Permit Meta Viewport in Html (#3623)

Fix #3565. Requester suggested adding viewport as a property of Html Writer. I think it would fit better as a Document Property, so that it can be both read and written, just like other meta properties, making it easier to load an Html spreadsheet and save it as a new one preserving this property. It is an open question whether we should try to preserve this property when writing to other spreadsheet types, e.g. as a custom property for Xlsx. For now, I am not attempting that. Requester also suggested this as a boolean property, but there are other parameters and different values that might be used for viewport. So I am defining it as a string property, with a constant SUGGESTED_VIEWPORT that can be used for requester's use case.
This commit is contained in:
oleibman
2023-06-30 15:38:35 -07:00
committed by GitHub
parent 616b9de3f0
commit 4363de1b14
4 changed files with 65 additions and 0 deletions
@@ -109,6 +109,8 @@ class Properties
private string $hyperlinkBase = '';
private string $viewport = '';
/**
* Create a new Document Properties instance.
*/
@@ -548,4 +550,18 @@ class Properties
return $this;
}
public function getViewport(): string
{
return $this->viewport;
}
public const SUGGESTED_VIEWPORT = 'width=device-width, initial-scale=1';
public function setViewport(string $viewport): self
{
$this->viewport = $viewport;
return $this;
}
}
+4
View File
@@ -748,6 +748,10 @@ class Html extends BaseReader
case 'title':
$properties->setTitle($metaContent);
break;
case 'viewport':
$properties->setViewport($metaContent);
break;
default:
if (preg_match('/^custom[.](bool|date|float|int|string)[.](.+)$/', $metaName, $matches) === 1) {
+1
View File
@@ -385,6 +385,7 @@ class Html extends BaseWriter
$html .= self::generateMeta($properties->getCompany(), 'company');
$html .= self::generateMeta($properties->getManager(), 'manager');
$html .= self::generateMeta($properties->getLastModifiedBy(), 'lastModifiedBy');
$html .= self::generateMeta($properties->getViewport(), 'viewport');
$date = Date::dateTimeFromTimestamp((string) $properties->getCreated());
$date->setTimeZone(Date::getDefaultOrLocalTimeZone());
$html .= self::generateMeta($date->format(DATE_W3C), 'created');
@@ -0,0 +1,44 @@
<?php
namespace PhpOffice\PhpSpreadsheetTests\Reader\Html;
use PhpOffice\PhpSpreadsheet\Document\Properties;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
class ViewportTest extends AbstractFunctional
{
public function testViewport(): void
{
$spreadsheetOld = new Spreadsheet();
$spreadsheetOld->getProperties()->setViewport(Properties::SUGGESTED_VIEWPORT);
$osheet = $spreadsheetOld->getActiveSheet();
$osheet->getCell('A1')->setValue(1);
$spreadsheet = $this->writeAndReload($spreadsheetOld, 'Html');
$spreadsheetOld->disconnectWorksheets();
$sheet = $spreadsheet->getActiveSheet();
self::assertSame(1, $sheet->getCell('A1')->getValue());
self::assertSame('width=device-width, initial-scale=1', $spreadsheet->getProperties()->getViewport());
$spreadsheet->disconnectWorksheets();
}
public function testNoViewport(): void
{
$spreadsheetOld = new Spreadsheet();
//$spreadsheetOld->getProperties()->setViewport(SUGGESTED_VIEWPORT);
$osheet = $spreadsheetOld->getActiveSheet();
$osheet->getCell('A1')->setValue(1);
$spreadsheet = $this->writeAndReload($spreadsheetOld, 'Html');
$spreadsheetOld->disconnectWorksheets();
$sheet = $spreadsheet->getActiveSheet();
self::assertSame(1, $sheet->getCell('A1')->getValue());
self::assertSame('', $spreadsheet->getProperties()->getViewport());
$spreadsheet->disconnectWorksheets();
}
}