* Bound ODS text space expansion before allocation
* Bound ODS number-format expansion and matrix spans
* Refactor ODS reader limits and update documentation for text and number-format constraints
* Refactor ODS class to consolidate max space and integer digit handling
* Update CHANGELOG.md
* Ods Reader Close Zip After Successful or Unsuccessful Read
---------
Co-authored-by: oleibman <10341515+oleibman@users.noreply.github.com>
In Excel a backslash in a number format displays the next character
literally, so the format @\X shows the text Test as TestX. For a
single-section format containing @, toFormattedString() substituted
the text and returned before the code that converts escaped characters
to quoted strings ran, so the backslash was kept: Test\X, and
Prefix\ Test for "Prefix"\ @.
Send formats containing a backslash through the quoted-literal path,
after converting each escaped character outside quotes to a quoted
string as the numeric path does. Also escape backslashes in the text
before it is used as the preg_replace() replacement; only $ was
escaped, so a backslash followed by a digit or another backslash in
the text was taken as a reference (\\server\share\1 lost characters).
Fixes#5069
A follow-on activity to PR #5061. That PR added scrollbars to the dropdown lists when samples were run in a browser. Earlier changes had broken up a number of categories into multiple entries because the dropdown lists were too long and wound up truncated. With the scrollbars, it makes sense to re-consolidate many of those lists, such as ComplexNumbers, which are all essentially the same test as each other. Some break-ups are retained (e.g. Basic/1/2/3/4/5) because they differ substantially from sample to sample; that's kind of an arbitrary decision, but it will have to do for now. I also renamed some of the members so that like members sort together when listing the directory (e.g. all pivot table samples now start with `pvt`). The sample code is mostly unchanged; only the directory and/or member names are changed.
The download samples were moved to their own new directory, and now represent a complete set of all the write formats that we permit. Studying their code, an improvement for `Helper\Downloader` became evident. It had been used merely to copy an existing file to be downloaded. However, by changing the first parameter of `download` to be either the name of the file directory (the existing usage) *or* a `Writer` object poised to issue `save`, you can use it to download your spreadsheet without having to worry about the headers which the browser requires. It then becomes generally useful beyond being used in samples:
```php
$writer = new WriterType($spreadsheet);
$downloader = new Downloader($writer, 'suggestedFileName.xlsx');
$downloader->download();
```
A color matching a built-in palette entry above the custom range (e.g.
333333 at index 63) was cached with that index, and max() then made the
palette look full, so the next custom color was written as black.
Fixes#5065