Skip to content

Commit 4363de1

Browse files
authored
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.
1 parent 616b9de commit 4363de1

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

src/PhpSpreadsheet/Document/Properties.php

+16
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ class Properties
109109

110110
private string $hyperlinkBase = '';
111111

112+
private string $viewport = '';
113+
112114
/**
113115
* Create a new Document Properties instance.
114116
*/
@@ -548,4 +550,18 @@ public function setHyperlinkBase(string $hyperlinkBase): self
548550

549551
return $this;
550552
}
553+
554+
public function getViewport(): string
555+
{
556+
return $this->viewport;
557+
}
558+
559+
public const SUGGESTED_VIEWPORT = 'width=device-width, initial-scale=1';
560+
561+
public function setViewport(string $viewport): self
562+
{
563+
$this->viewport = $viewport;
564+
565+
return $this;
566+
}
551567
}

src/PhpSpreadsheet/Reader/Html.php

+4
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,10 @@ private static function loadProperties(DOMDocument $dom, Spreadsheet $spreadshee
748748
case 'title':
749749
$properties->setTitle($metaContent);
750750

751+
break;
752+
case 'viewport':
753+
$properties->setViewport($metaContent);
754+
751755
break;
752756
default:
753757
if (preg_match('/^custom[.](bool|date|float|int|string)[.](.+)$/', $metaName, $matches) === 1) {

src/PhpSpreadsheet/Writer/Html.php

+1
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ public function generateHTMLHeader($includeStyles = false)
385385
$html .= self::generateMeta($properties->getCompany(), 'company');
386386
$html .= self::generateMeta($properties->getManager(), 'manager');
387387
$html .= self::generateMeta($properties->getLastModifiedBy(), 'lastModifiedBy');
388+
$html .= self::generateMeta($properties->getViewport(), 'viewport');
388389
$date = Date::dateTimeFromTimestamp((string) $properties->getCreated());
389390
$date->setTimeZone(Date::getDefaultOrLocalTimeZone());
390391
$html .= self::generateMeta($date->format(DATE_W3C), 'created');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace PhpOffice\PhpSpreadsheetTests\Reader\Html;
4+
5+
use PhpOffice\PhpSpreadsheet\Document\Properties;
6+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
7+
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
8+
9+
class ViewportTest extends AbstractFunctional
10+
{
11+
public function testViewport(): void
12+
{
13+
$spreadsheetOld = new Spreadsheet();
14+
$spreadsheetOld->getProperties()->setViewport(Properties::SUGGESTED_VIEWPORT);
15+
$osheet = $spreadsheetOld->getActiveSheet();
16+
$osheet->getCell('A1')->setValue(1);
17+
18+
$spreadsheet = $this->writeAndReload($spreadsheetOld, 'Html');
19+
$spreadsheetOld->disconnectWorksheets();
20+
21+
$sheet = $spreadsheet->getActiveSheet();
22+
self::assertSame(1, $sheet->getCell('A1')->getValue());
23+
self::assertSame('width=device-width, initial-scale=1', $spreadsheet->getProperties()->getViewport());
24+
25+
$spreadsheet->disconnectWorksheets();
26+
}
27+
28+
public function testNoViewport(): void
29+
{
30+
$spreadsheetOld = new Spreadsheet();
31+
//$spreadsheetOld->getProperties()->setViewport(SUGGESTED_VIEWPORT);
32+
$osheet = $spreadsheetOld->getActiveSheet();
33+
$osheet->getCell('A1')->setValue(1);
34+
35+
$spreadsheet = $this->writeAndReload($spreadsheetOld, 'Html');
36+
$spreadsheetOld->disconnectWorksheets();
37+
38+
$sheet = $spreadsheet->getActiveSheet();
39+
self::assertSame(1, $sheet->getCell('A1')->getValue());
40+
self::assertSame('', $spreadsheet->getProperties()->getViewport());
41+
42+
$spreadsheet->disconnectWorksheets();
43+
}
44+
}

0 commit comments

Comments
 (0)