diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..736a035 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,187 @@ +# Changelog — protocolsmanager + +All notable changes to this project will be documented in this file. +Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). + +--- + +## [1.7.0.0] — 2026-04-19 + +### Added +- **Date format option** in template configuration: choose between numeric + (`16.03.2026`) or written date (`16 de marzo de 2026`). Localization is + handled by PHP's native `IntlDateFormatter` — no plugin-owned month strings. + Falls back to numeric if the `intl` extension is not loaded. +- DB migration: `date_format TINYINT UNSIGNED DEFAULT 0` added to + `glpi_plugin_protocolsmanager_config` for existing installs. +- `getTypeName()` added to `PluginProtocolsmanagerConfig` — page title now + shows "Protocols Manager" instead of the raw PHP class name. +- Logo auto-fill dimensions on file select (JS FileReader). Height set to + `width / 10` enforcing the required 10:1 aspect ratio. +- `recipients` column extended from `VARCHAR(255)` to `TEXT` in + `glpi_plugin_protocolsmanager_emailconfig`. Migration included for existing + installs. +- **`Folio:` prefix** in PDF header before the document number, translated in + all 5 locales (es_MX: *Folio*, fr_FR: *Référence*, sk_SK: *Číslo*). +- **`PLUGIN_PROTOCOLSMANAGER_VERSION` constant** defined in `setup.php` as the + single source of truth for the plugin version. `plugin_version_protocolsmanager()` + and `pdfbuilder.class.php` both read from this constant — bumping a release + now requires editing only `setup.php` and `plugin.xml`. + - **PDF compression**: `setCompression(true)` enabled in TCPDF constructor. + File size reduced approximately 40–60%. +- **try/catch around PDF generation**: if `generate()` or `file_put_contents()` + fails, the reserved protocol row is deleted, a translated error message is + shown, and the method returns cleanly. No more phantom "pending" rows. +- **Logo auto-fill dimensions**: selecting a logo file in the template form + automatically fills the width and height fields via `FileReader`. Height is + set to `width / 10` to enforce the required 10:1 aspect ratio. +- **`recipients` column extended to TEXT**: `glpi_plugin_protocolsmanager_emailconfig` + `recipients` changed from `VARCHAR(255)` to `TEXT`. Migration added for + existing installs. +- **Uninstall cleanup**: logo files are deleted from `GLPI_PICTURE_DIR` and + generated PDFs from `GLPI_UPLOAD_DIR` before tables are dropped. +- **deleteConfigs() logo cleanup**: physical logo file is deleted from + `GLPI_PICTURE_DIR` when a template is deleted. +- **Profile label i18n**: `'Plugin configuration'` and `'Protocols manager tab + access'` added to all 5 locales. +- **`saveConfigs()` refactored**: three near-identical `DB->update()` blocks + collapsed into one `$updateData` array. Logo field only included when a new + file was uploaded. + - `inc/pdfbuilder.class.php`: new TCPDF subclass replacing the bundled dompdf + pipeline. Auto-sizing table, two-pass cell rendering, signature layout. +- States dropdown for manually-added equipment rows (queries `glpi_states` + server-side, emitted as JSON for the JS `addNewRow` helper). +- Hard-delete implementation: `deleteDocs()` removes physical file, + `glpi_documents_items` links, and the GLPI Document record. +- Complete i18n system: `.pot` template + `.po`/`.mo` files for es_MX, en_US, + en_GB, fr_FR, sk_SK. +- `glpi_assets_assets` support (GLPI 11 dynamic asset table). +- GLPI card/nav-tab/btn UI replacing raw HTML tables and inline CSS. +- Em-dash placeholder in UI table for empty optional fields. +- Help button (`btn btn-info`) in template and email card headers. +- "Select all" checkbox label in Generated documents card header. +- Logo width/height fields with preview in template config. + +### Fixed +- **`$pm_total` undefined warning** on Generated Documents table: the pagination + clamp ran before `countDocsForUser()` was called. Reordered to calculate total + first, then clamp the offset. +- **"Written date" label showing in English** despite correct Spanish locale: + the old orphan msgid `"Text (localized)"` remained in the `.pot`, causing + GLPI's gettext loader to miss the new translation. Orphan removed and all + `.mo` files recompiled. +- **PDF Creator metadata** was showing `GLPI_VERSION` (the GLPI version) instead + of the plugin version. Now reads `PLUGIN_PROTOCOLSMANAGER_VERSION` — properties + panel shows `protocolsmanager v1.7.1.0`. +- **Footer** label in template config was not using the plugin i18n domain; + now translated in all 5 locales. +- **`$date_format` undefined** when editing an existing template: variable was + only assigned in the create-mode branch, not loaded from the DB row on edit. +- **`generate.form.php` missing access control**: `Session::checkRight()` was + absent, allowing any authenticated GLPI user to POST directly to + `makeProtocol()`, `deleteDocs()`, or `sendOneMail()` regardless of plugin + profile permissions. +- **`checkRights()` unguarded SESSION access**: `$_SESSION['glpiactiveprofile']['id']` + accessed without null-check. Now uses `?? 0` with early return if not set. +- **Old logo not deleted when replaced**: uploading a new logo left the + previous file orphaned in `GLPI_PICTURE_DIR`. The old file is now removed + before the new one is written. +- **`$pm_start` pagination offset unbound**: a crafted GET parameter could + produce an offset beyond the total row count. Now clamped to + `max(0, min($pm_start, $pm_total - 1))`. +- **`email_template` selector always showed first option as selected**: the + comparison used `$uid` (iterator index 0, 1, 2…) instead of `$list['id']` + (DB row id). The correct template is now pre-selected on edit. +- **`sendOneMail()` proceeded with `doc_id = 0`**: now validates `$doc_id > 0` + before querying `glpi_documents` and returns with a user-visible warning if + no document is selected. +- **`getDocNumber()` dead method removed**: the race-condition-prone + `MAX(id)+1` helper was already unreachable after the AUTO_INCREMENT + reservation fix; its definition has been deleted. +- **Critical — `$owner` empty in generated PDFs**: `$id` was read from POST + *after* `getFriendlyName()` was called, so owner/author always resolved as + empty. Reordered POST declarations so `$id` is assigned first. +- **PDF metadata missing**: Title, Author, Subject, and Creator were all "Not + available" in PDF properties. Now set via TCPDF before `AddPage()`. +- **Comments column in PDF**: always rendered regardless of whether any comment + contains text. Empty cells show a blank bordered field for handwriting. +- **Em-dash placeholder**: empty optional fields (manufacturer, model, state, + serial, inventory) now show `—` in both the UI table and the PDF, matching + behaviour that was already implemented for the UI but missing from the PDF + builder row assembly. +- **PDF filename collisions**: filenames are now sanitized with `preg_replace` + and include the folio number plus full timestamp (`dmYHis`) to prevent + overwrite when the same template is used twice in one day. +- **Manufacturer and state name truncation**: `explode(' ')[0]` that cut names + like "Hewlett Packard" → "Hewlett" and "En uso" → "En" has been removed. + Full names are now passed to both the UI and the PDF. +- **`glpi_assets_assets` wrong itemtype**: hardcoded `'Tablet'` replaced with + an empty string, skipping the invalid `glpi_documents_items` entry for + dynamic asset types. +- **Auto-send email not HTML**: `sendMail()` now calls `IsHtml(true)` and + `nl2br()`, matching the behaviour of the manual send modal. `stripcslashes()` + removed from `sendOneMail()`. +- **No recipient guard in `sendMail()`**: method now validates that at least one + address was added before calling `Send()`. +- **Profile rights form CSRF**: `Html::hidden('_glpi_csrf_token', ...)` was + missing from the profile rights form, causing silent POST rejection in + GLPI 11. +- **`__(htmlescape($label))`** in `profile.class.php`: corrected to + `htmlescape(__($label, 'protocolsmanager'))` — translate first, then escape. +- 5 critical GLPI 11 API incompatibilities: `$DB->doQuery()` second arg, + `Session::addMessageAfterRedirect()` type constant, CSRF token in all forms, + `Html::footer()` in front controllers, User object loop O(n) → O(1). +- Tab registered on User only (was: 7 item types — crashed all asset forms). +- Manual row array indices: explicit `name[N]` notation replacing implicit `[]`. +- Missing State column in JavaScript `addNewRow` handler (caused column shift). +- `classes[]/ids[]` lookup: `!empty()` replaces `!== null` to exclude empty + strings from `glpi_documents_items` inserts. +- Comments column always present in PDF (was: conditionally omitted when empty). +- `getDocNumber()` MAX(id) race condition: now uses AUTO_INCREMENT + update. +- SQL `ORDER BY ['name' => 'ASC']` → `'name ASC'` string form. +- "Powered by TCPDF" footer: `setPrintFooter(true)` ensures plugin Footer() + override is always called instead of the TCPDF default. +- Two-pass table rendering fixes row-number column (#) and column drift on + wrapped text. + +### Changed +- Updated Wiki links. +- i18n full audit: modal title "Send email", `'Asset'` fallback, default email + subject, and `'Select all'` now use the plugin domain. Total: **77 msgids** + across 5 locales. +- Date format label "Text (localized)" replaced with a descriptive label + showing a concrete example in each locale: + - es_MX: *Fecha escrita — ej. 16 de marzo de 2026* + - fr_FR: *Date écrite — ex. 16 mars 2026* + - en_US: *Written date — e.g. March 16, 2026* + - en_GB: *Written date — e.g. 16 March 2026* + - sk_SK: *Zapísaný dátum — napr. 16. marca 2026* +- i18n: 79 total msgids across 5 locales (up from 77). + +### Security +- **Logo upload MIME validation**: `$_FILES['type']` (client-supplied) replaced + with `finfo_file()` on the actual `tmp_name`. Extension is derived from the + verified MIME type, not the original filename. Filename uses `uniqid()`. +- **owner/author from POST removed**: display names now resolved server-side in + `makeProtocol()` and `sendOneMail()` using `$_POST['user_id']` and + `Session::getLoginUserID()`. All per-row hidden `owner`/`author` fields + removed from the equipment table. +- **Delete ID validation**: `deleteConfigs()` and `deleteEmailConfigs()` now + cast the id to `int`, validate `> 0`, and confirm the record exists before + executing DELETE. + +### Removed +- `SoftwareLicense` removed from `$alwaysInclude` item types — software + licenses do not carry the physical asset fields expected by the delivery + certificate. +- Dead commented ` tags. - * - * ==== IMPORTANT ==== - * Enabling this for documents you do not trust (e.g. arbitrary remote html - * pages) is a security risk. Embedded scripts are run with the same level of - * system access available to dompdf. Set this option to false (recommended) - * if you wish to process untrusted documents. - * - * This setting may increase the risk of system exploit. Do not change - * this settings without understanding the consequences. Additional - * documentation is available on the dompdf wiki at: - * https://github.com/dompdf/dompdf/wiki - * - * @var bool - */ - private $isPhpEnabled = false; - - /** - * Enable remote file access - * - * If this setting is set to true, DOMPDF will access remote sites for - * images and CSS files as required. - * - * ==== IMPORTANT ==== - * This can be a security risk, in particular in combination with isPhpEnabled and - * allowing remote html code to be passed to $dompdf = new DOMPDF(); $dompdf->load_html(...); - * This allows anonymous users to download legally doubtful internet content which on - * tracing back appears to being downloaded by your server, or allows malicious php code - * in remote html pages to be executed by your server with your account privileges. - * - * This setting may increase the risk of system exploit. Do not change - * this settings without understanding the consequences. Additional - * documentation is available on the dompdf wiki at: - * https://github.com/dompdf/dompdf/wiki - * - * @var bool - */ - private $isRemoteEnabled = false; - - /** - * List of allowed remote hosts - * - * Each value of the array must be a valid hostname. - * - * This will be used to filter which resources can be loaded in combination with - * isRemoteEnabled. If isRemoteEnabled is FALSE, then this will have no effect. - * - * Leave to NULL to allow any remote host. - * - * @var array|null - */ - private $allowedRemoteHosts = null; - - /** - * Enable PDF/A-3 compliance mode - * - * ==== EXPERIMENTAL ==== - * This feature is currently only supported with the CPDF backend and will - * have no effect if used with any other. - * - * Currently this mode only takes care of adding the necessary metadata, output intents, etc. - * It does not enforce font embedding, it's up to you to embed the fonts you plan on using. - * - * @var bool - */ - private $isPdfAEnabled = false; - - /** - * Enable inline JavaScript - * - * If this setting is set to true then DOMPDF will automatically insert - * JavaScript code contained within - * tags as written into the PDF. - * - * NOTE: This is PDF-based JavaScript to be executed by the PDF viewer, - * not browser-based JavaScript executed by Dompdf. - * - * @var bool - */ - private $isJavascriptEnabled = true; - - /** - * Use the HTML5 Lib parser - * - * @deprecated - * @var bool - */ - private $isHtml5ParserEnabled = true; - - /** - * Whether to enable font subsetting or not. - * - * @var bool - */ - private $isFontSubsettingEnabled = true; - - /** - * @var bool - */ - private $debugPng = false; - - /** - * @var bool - */ - private $debugKeepTemp = false; - - /** - * @var bool - */ - private $debugCss = false; - - /** - * @var bool - */ - private $debugLayout = false; - - /** - * @var bool - */ - private $debugLayoutLines = true; - - /** - * @var bool - */ - private $debugLayoutBlocks = true; - - /** - * @var bool - */ - private $debugLayoutInline = true; - - /** - * @var bool - */ - private $debugLayoutPaddingBox = true; - - /** - * The PDF rendering backend to use - * - * Valid settings are 'PDFLib', 'CPDF', 'GD', and 'auto'. 'auto' will - * look for PDFLib and use it if found, or if not it will fall back on - * CPDF. 'GD' renders PDFs to graphic files. {@link Dompdf\CanvasFactory} - * ultimately determines which rendering class to instantiate - * based on this setting. - * - * @var string - */ - private $pdfBackend = "CPDF"; - - /** - * PDFlib license key - * - * If you are using a licensed, commercial version of PDFlib, specify - * your license key here. If you are using PDFlib-Lite or are evaluating - * the commercial version of PDFlib, comment out this setting. - * - * @link http://www.pdflib.com - * - * If pdflib present in web server and auto or selected explicitly above, - * a real license code must exist! - * - * @var string - */ - private $pdflibLicense = ""; - - /** - * HTTP context created with stream_context_create() - * Will be used for file_get_contents - * - * @link https://www.php.net/manual/context.php - * - * @var resource - */ - private $httpContext; - - /** - * @param array $attributes - */ - public function __construct(?array $attributes = null) - { - $rootDir = realpath(__DIR__ . "/../"); - $this->setChroot(array($rootDir)); - $this->setRootDir($rootDir); - $this->setTempDir(sys_get_temp_dir()); - $this->setFontDir($rootDir . "/lib/fonts"); - $this->setFontCache($this->getFontDir()); - - $ver = ""; - $versionFile = realpath(__DIR__ . '/../VERSION'); - if (($version = file_get_contents($versionFile)) !== false) { - $version = trim($version); - if ($version !== '$Format:<%h>$') { - $ver = "/$version"; - } - } - $this->setHttpContext([ - "http" => [ - "follow_location" => false, - "user_agent" => "Dompdf$ver https://github.com/dompdf/dompdf" - ] - ]); - - $this->setAllowedProtocols(["data://", "file://", "http://", "https://"]); - - $this->setArtifactPathValidation([$this, "validateArtifactPath"]); - - if (null !== $attributes) { - $this->set($attributes); - } - } - - /** - * @param array|string $attributes - * @param null|mixed $value - * @return $this - */ - public function set($attributes, $value = null) - { - if (!is_array($attributes)) { - $attributes = [$attributes => $value]; - } - foreach ($attributes as $key => $value) { - if ($key === 'tempDir' || $key === 'temp_dir') { - $this->setTempDir($value); - } elseif ($key === 'fontDir' || $key === 'font_dir') { - $this->setFontDir($value); - } elseif ($key === 'fontCache' || $key === 'font_cache') { - $this->setFontCache($value); - } elseif ($key === 'chroot') { - $this->setChroot($value); - } elseif ($key === 'allowedProtocols' || $key === 'allowed_protocols') { - $this->setAllowedProtocols($value); - } elseif ($key === 'artifactPathValidation') { - $this->setArtifactPathValidation($value); - } elseif ($key === 'logOutputFile' || $key === 'log_output_file') { - $this->setLogOutputFile($value); - } elseif ($key === 'defaultMediaType' || $key === 'default_media_type') { - $this->setDefaultMediaType($value); - } elseif ($key === 'defaultPaperSize' || $key === 'default_paper_size') { - $this->setDefaultPaperSize($value); - } elseif ($key === 'defaultPaperOrientation' || $key === 'default_paper_orientation') { - $this->setDefaultPaperOrientation($value); - } elseif ($key === 'defaultFont' || $key === 'default_font') { - $this->setDefaultFont($value); - } elseif ($key === 'dpi') { - $this->setDpi($value); - } elseif ($key === 'fontHeightRatio' || $key === 'font_height_ratio') { - $this->setFontHeightRatio($value); - } elseif ($key === 'isPhpEnabled' || $key === 'is_php_enabled' || $key === 'enable_php') { - $this->setIsPhpEnabled($value); - } elseif ($key === 'isRemoteEnabled' || $key === 'is_remote_enabled' || $key === 'enable_remote') { - $this->setIsRemoteEnabled($value); - } elseif ($key === 'allowedRemoteHosts' || $key === 'allowed_remote_hosts') { - $this->setAllowedRemoteHosts($value); - } elseif ($key === 'isPdfAEnabled' || $key === 'is_pdf_a_enabled' || $key === 'enable_pdf_a') { - $this->setIsPdfAEnabled($value); - } elseif ($key === 'isJavascriptEnabled' || $key === 'is_javascript_enabled' || $key === 'enable_javascript') { - $this->setIsJavascriptEnabled($value); - } elseif ($key === 'isHtml5ParserEnabled' || $key === 'is_html5_parser_enabled' || $key === 'enable_html5_parser') { - $this->setIsHtml5ParserEnabled($value); - } elseif ($key === 'isFontSubsettingEnabled' || $key === 'is_font_subsetting_enabled' || $key === 'enable_font_subsetting') { - $this->setIsFontSubsettingEnabled($value); - } elseif ($key === 'debugPng' || $key === 'debug_png') { - $this->setDebugPng($value); - } elseif ($key === 'debugKeepTemp' || $key === 'debug_keep_temp') { - $this->setDebugKeepTemp($value); - } elseif ($key === 'debugCss' || $key === 'debug_css') { - $this->setDebugCss($value); - } elseif ($key === 'debugLayout' || $key === 'debug_layout') { - $this->setDebugLayout($value); - } elseif ($key === 'debugLayoutLines' || $key === 'debug_layout_lines') { - $this->setDebugLayoutLines($value); - } elseif ($key === 'debugLayoutBlocks' || $key === 'debug_layout_blocks') { - $this->setDebugLayoutBlocks($value); - } elseif ($key === 'debugLayoutInline' || $key === 'debug_layout_inline') { - $this->setDebugLayoutInline($value); - } elseif ($key === 'debugLayoutPaddingBox' || $key === 'debug_layout_padding_box') { - $this->setDebugLayoutPaddingBox($value); - } elseif ($key === 'pdfBackend' || $key === 'pdf_backend') { - $this->setPdfBackend($value); - } elseif ($key === 'pdflibLicense' || $key === 'pdflib_license') { - $this->setPdflibLicense($value); - } elseif ($key === 'httpContext' || $key === 'http_context') { - $this->setHttpContext($value); - } - } - return $this; - } - - /** - * @param string $key - * @return mixed - */ - public function get($key) - { - if ($key === 'tempDir' || $key === 'temp_dir') { - return $this->getTempDir(); - } elseif ($key === 'fontDir' || $key === 'font_dir') { - return $this->getFontDir(); - } elseif ($key === 'fontCache' || $key === 'font_cache') { - return $this->getFontCache(); - } elseif ($key === 'chroot') { - return $this->getChroot(); - } elseif ($key === 'allowedProtocols' || $key === 'allowed_protocols') { - return $this->getAllowedProtocols(); - } elseif ($key === 'artifactPathValidation') { - return $this->getArtifactPathValidation(); - } elseif ($key === 'logOutputFile' || $key === 'log_output_file') { - return $this->getLogOutputFile(); - } elseif ($key === 'defaultMediaType' || $key === 'default_media_type') { - return $this->getDefaultMediaType(); - } elseif ($key === 'defaultPaperSize' || $key === 'default_paper_size') { - return $this->getDefaultPaperSize(); - } elseif ($key === 'defaultPaperOrientation' || $key === 'default_paper_orientation') { - return $this->getDefaultPaperOrientation(); - } elseif ($key === 'defaultFont' || $key === 'default_font') { - return $this->getDefaultFont(); - } elseif ($key === 'dpi') { - return $this->getDpi(); - } elseif ($key === 'fontHeightRatio' || $key === 'font_height_ratio') { - return $this->getFontHeightRatio(); - } elseif ($key === 'isPhpEnabled' || $key === 'is_php_enabled' || $key === 'enable_php') { - return $this->getIsPhpEnabled(); - } elseif ($key === 'isRemoteEnabled' || $key === 'is_remote_enabled' || $key === 'enable_remote') { - return $this->getIsRemoteEnabled(); - } elseif ($key === 'allowedRemoteHosts' || $key === 'allowed_remote_hosts') { - return $this->getAllowedProtocols(); - } elseif ($key === 'isPdfAEnabled' || $key === 'is_pdf_a_enabled' || $key === 'enable_pdf_a') { - $this->getIsPdfAEnabled(); - } elseif ($key === 'isJavascriptEnabled' || $key === 'is_javascript_enabled' || $key === 'enable_javascript') { - return $this->getIsJavascriptEnabled(); - } elseif ($key === 'isHtml5ParserEnabled' || $key === 'is_html5_parser_enabled' || $key === 'enable_html5_parser') { - return $this->getIsHtml5ParserEnabled(); - } elseif ($key === 'isFontSubsettingEnabled' || $key === 'is_font_subsetting_enabled' || $key === 'enable_font_subsetting') { - return $this->getIsFontSubsettingEnabled(); - } elseif ($key === 'debugPng' || $key === 'debug_png') { - return $this->getDebugPng(); - } elseif ($key === 'debugKeepTemp' || $key === 'debug_keep_temp') { - return $this->getDebugKeepTemp(); - } elseif ($key === 'debugCss' || $key === 'debug_css') { - return $this->getDebugCss(); - } elseif ($key === 'debugLayout' || $key === 'debug_layout') { - return $this->getDebugLayout(); - } elseif ($key === 'debugLayoutLines' || $key === 'debug_layout_lines') { - return $this->getDebugLayoutLines(); - } elseif ($key === 'debugLayoutBlocks' || $key === 'debug_layout_blocks') { - return $this->getDebugLayoutBlocks(); - } elseif ($key === 'debugLayoutInline' || $key === 'debug_layout_inline') { - return $this->getDebugLayoutInline(); - } elseif ($key === 'debugLayoutPaddingBox' || $key === 'debug_layout_padding_box') { - return $this->getDebugLayoutPaddingBox(); - } elseif ($key === 'pdfBackend' || $key === 'pdf_backend') { - return $this->getPdfBackend(); - } elseif ($key === 'pdflibLicense' || $key === 'pdflib_license') { - return $this->getPdflibLicense(); - } elseif ($key === 'httpContext' || $key === 'http_context') { - return $this->getHttpContext(); - } - return null; - } - - /** - * @param string $pdfBackend - * @return $this - */ - public function setPdfBackend($pdfBackend) - { - $this->pdfBackend = $pdfBackend; - return $this; - } - - /** - * @return string - */ - public function getPdfBackend() - { - return $this->pdfBackend; - } - - /** - * @param string $pdflibLicense - * @return $this - */ - public function setPdflibLicense($pdflibLicense) - { - $this->pdflibLicense = $pdflibLicense; - return $this; - } - - /** - * @return string - */ - public function getPdflibLicense() - { - return $this->pdflibLicense; - } - - /** - * @param array|string $chroot - * @return $this - */ - public function setChroot($chroot, $delimiter = ',') - { - if (is_string($chroot)) { - $this->chroot = explode($delimiter, $chroot); - } elseif (is_array($chroot)) { - $this->chroot = $chroot; - } - return $this; - } - - /** - * @return array - */ - public function getAllowedProtocols() - { - return $this->allowedProtocols; - } - - /** - * @param array $allowedProtocols The protocols to allow, as an array - * formatted as ["protocol://" => ["rules" => [callable]], ...] - * or ["protocol://", ...] - * - * @return $this - */ - public function setAllowedProtocols(array $allowedProtocols) - { - $protocols = []; - foreach ($allowedProtocols as $protocol => $config) { - if (is_string($protocol)) { - $protocols[$protocol] = []; - if (is_array($config)) { - $protocols[$protocol] = $config; - } - } elseif (is_string($config)) { - $protocols[$config] = []; - } - } - $this->allowedProtocols = []; - foreach ($protocols as $protocol => $config) { - $this->addAllowedProtocol($protocol, ...($config["rules"] ?? [])); - } - return $this; - } - - /** - * Adds a new protocol to the allowed protocols collection - * - * @param string $protocol The scheme to add (e.g. "http://") - * @param callable $rule A callable that validates the protocol - * @return $this - */ - public function addAllowedProtocol(string $protocol, callable ...$rules) - { - $protocol = strtolower($protocol); - if (empty($rules)) { - $rules = []; - switch ($protocol) { - case "data://": - break; - case "file://": - $rules[] = [$this, "validateLocalUri"]; - break; - case "http://": - case "https://": - $rules[] = [$this, "validateRemoteUri"]; - break; - case "phar://": - $rules[] = [$this, "validatePharUri"]; - break; - } - } - $this->allowedProtocols[$protocol] = ["rules" => $rules]; - return $this; - } - - /** - * @return array - */ - public function getArtifactPathValidation() - { - return $this->artifactPathValidation; - } - - /** - * @param callable $validator - * @return $this - */ - public function setArtifactPathValidation($validator) - { - $this->artifactPathValidation = $validator; - return $this; - } - - /** - * @return array - */ - public function getChroot() - { - $chroot = []; - if (is_array($this->chroot)) { - $chroot = $this->chroot; - } - return $chroot; - } - - /** - * @param boolean $debugCss - * @return $this - */ - public function setDebugCss($debugCss) - { - $this->debugCss = $debugCss; - return $this; - } - - /** - * @return boolean - */ - public function getDebugCss() - { - return $this->debugCss; - } - - /** - * @param boolean $debugKeepTemp - * @return $this - */ - public function setDebugKeepTemp($debugKeepTemp) - { - $this->debugKeepTemp = $debugKeepTemp; - return $this; - } - - /** - * @return boolean - */ - public function getDebugKeepTemp() - { - return $this->debugKeepTemp; - } - - /** - * @param boolean $debugLayout - * @return $this - */ - public function setDebugLayout($debugLayout) - { - $this->debugLayout = $debugLayout; - return $this; - } - - /** - * @return boolean - */ - public function getDebugLayout() - { - return $this->debugLayout; - } - - /** - * @param boolean $debugLayoutBlocks - * @return $this - */ - public function setDebugLayoutBlocks($debugLayoutBlocks) - { - $this->debugLayoutBlocks = $debugLayoutBlocks; - return $this; - } - - /** - * @return boolean - */ - public function getDebugLayoutBlocks() - { - return $this->debugLayoutBlocks; - } - - /** - * @param boolean $debugLayoutInline - * @return $this - */ - public function setDebugLayoutInline($debugLayoutInline) - { - $this->debugLayoutInline = $debugLayoutInline; - return $this; - } - - /** - * @return boolean - */ - public function getDebugLayoutInline() - { - return $this->debugLayoutInline; - } - - /** - * @param boolean $debugLayoutLines - * @return $this - */ - public function setDebugLayoutLines($debugLayoutLines) - { - $this->debugLayoutLines = $debugLayoutLines; - return $this; - } - - /** - * @return boolean - */ - public function getDebugLayoutLines() - { - return $this->debugLayoutLines; - } - - /** - * @param boolean $debugLayoutPaddingBox - * @return $this - */ - public function setDebugLayoutPaddingBox($debugLayoutPaddingBox) - { - $this->debugLayoutPaddingBox = $debugLayoutPaddingBox; - return $this; - } - - /** - * @return boolean - */ - public function getDebugLayoutPaddingBox() - { - return $this->debugLayoutPaddingBox; - } - - /** - * @param boolean $debugPng - * @return $this - */ - public function setDebugPng($debugPng) - { - $this->debugPng = $debugPng; - return $this; - } - - /** - * @return boolean - */ - public function getDebugPng() - { - return $this->debugPng; - } - - /** - * @param string $defaultFont - * @return $this - */ - public function setDefaultFont($defaultFont) - { - if (!($defaultFont === null || trim($defaultFont) === "")) { - $this->defaultFont = $defaultFont; - } else { - $this->defaultFont = "serif"; - } - return $this; - } - - /** - * @return string - */ - public function getDefaultFont() - { - return $this->defaultFont; - } - - /** - * @param string $defaultMediaType - * @return $this - */ - public function setDefaultMediaType($defaultMediaType) - { - $this->defaultMediaType = $defaultMediaType; - return $this; - } - - /** - * @return string - */ - public function getDefaultMediaType() - { - return $this->defaultMediaType; - } - - /** - * @param string|float[] $defaultPaperSize - * @return $this - */ - public function setDefaultPaperSize($defaultPaperSize): self - { - $this->defaultPaperSize = $defaultPaperSize; - return $this; - } - - /** - * @param string $defaultPaperOrientation - * @return $this - */ - public function setDefaultPaperOrientation(string $defaultPaperOrientation): self - { - $this->defaultPaperOrientation = $defaultPaperOrientation; - return $this; - } - - /** - * @return string|float[] - */ - public function getDefaultPaperSize() - { - return $this->defaultPaperSize; - } - - /** - * @return string - */ - public function getDefaultPaperOrientation(): string - { - return $this->defaultPaperOrientation; - } - - /** - * @param int $dpi - * @return $this - */ - public function setDpi($dpi) - { - $this->dpi = $dpi; - return $this; - } - - /** - * @return int - */ - public function getDpi() - { - return $this->dpi; - } - - /** - * @param string $fontCache - * @return $this - */ - public function setFontCache($fontCache) - { - if (!is_callable($this->artifactPathValidation) || ($this->artifactPathValidation)($fontCache, "fontCache") === true) { - $this->fontCache = $fontCache; - } - return $this; - } - - /** - * @return string - */ - public function getFontCache() - { - return $this->fontCache; - } - - /** - * @param string $fontDir - * @return $this - */ - public function setFontDir($fontDir) - { - if (!is_callable($this->artifactPathValidation) || ($this->artifactPathValidation)($fontDir, "fontDir") === true) { - $this->fontDir = $fontDir; - } - return $this; - } - - /** - * @return string - */ - public function getFontDir() - { - return $this->fontDir; - } - - /** - * @param float $fontHeightRatio - * @return $this - */ - public function setFontHeightRatio($fontHeightRatio) - { - $this->fontHeightRatio = $fontHeightRatio; - return $this; - } - - /** - * @return float - */ - public function getFontHeightRatio() - { - return $this->fontHeightRatio; - } - - /** - * @param boolean $isFontSubsettingEnabled - * @return $this - */ - public function setIsFontSubsettingEnabled($isFontSubsettingEnabled) - { - $this->isFontSubsettingEnabled = $isFontSubsettingEnabled; - return $this; - } - - /** - * @return boolean - */ - public function getIsFontSubsettingEnabled() - { - return $this->isFontSubsettingEnabled; - } - - /** - * @return boolean - */ - public function isFontSubsettingEnabled() - { - return $this->getIsFontSubsettingEnabled(); - } - - /** - * @deprecated - * @param boolean $isHtml5ParserEnabled - * @return $this - */ - public function setIsHtml5ParserEnabled($isHtml5ParserEnabled) - { - $this->isHtml5ParserEnabled = $isHtml5ParserEnabled; - return $this; - } - - /** - * @deprecated - * @return boolean - */ - public function getIsHtml5ParserEnabled() - { - return $this->isHtml5ParserEnabled; - } - - /** - * @deprecated - * @return boolean - */ - public function isHtml5ParserEnabled() - { - return $this->getIsHtml5ParserEnabled(); - } - - /** - * @param boolean $isJavascriptEnabled - * @return $this - */ - public function setIsJavascriptEnabled($isJavascriptEnabled) - { - $this->isJavascriptEnabled = $isJavascriptEnabled; - return $this; - } - - /** - * @return boolean - */ - public function getIsJavascriptEnabled() - { - return $this->isJavascriptEnabled; - } - - /** - * @return boolean - */ - public function isJavascriptEnabled() - { - return $this->getIsJavascriptEnabled(); - } - - /** - * @param boolean $isPhpEnabled - * @return $this - */ - public function setIsPhpEnabled($isPhpEnabled) - { - $this->isPhpEnabled = $isPhpEnabled; - return $this; - } - - /** - * @return boolean - */ - public function getIsPhpEnabled() - { - return $this->isPhpEnabled; - } - - /** - * @return boolean - */ - public function isPhpEnabled() - { - return $this->getIsPhpEnabled(); - } - - /** - * @param boolean $isRemoteEnabled - * @return $this - */ - public function setIsRemoteEnabled($isRemoteEnabled) - { - $this->isRemoteEnabled = $isRemoteEnabled; - return $this; - } - - /** - * @return boolean - */ - public function getIsRemoteEnabled() - { - return $this->isRemoteEnabled; - } - - /** - * @return boolean - */ - public function isRemoteEnabled() - { - return $this->getIsRemoteEnabled(); - } - - /** - * @param array|null $allowedRemoteHosts - * @return $this - */ - public function setAllowedRemoteHosts($allowedRemoteHosts) - { - if (is_array($allowedRemoteHosts)) { - // Set hosts to lowercase - foreach ($allowedRemoteHosts as &$host) { - $host = mb_strtolower($host); - } - - unset($host); - } - - $this->allowedRemoteHosts = $allowedRemoteHosts; - return $this; - } - - /** - * @return array|null - */ - public function getAllowedRemoteHosts() - { - return $this->allowedRemoteHosts; - } - - /** - * @param boolean $isRemoteEnabled - * @return $this - */ - public function setIsPdfAEnabled($isPdfAEnabled) - { - $this->isPdfAEnabled = $isPdfAEnabled; - return $this; - } - - /** - * @return boolean - */ - public function getIsPdfAEnabled() - { - return $this->isPdfAEnabled; - } - - /** - * @return boolean - */ - public function isPdfAEnabled() - { - return $this->getIsPdfAEnabled(); - } - - /** - * @param string $logOutputFile - * @return $this - */ - public function setLogOutputFile($logOutputFile) - { - if (!is_callable($this->artifactPathValidation) || ($this->artifactPathValidation)($logOutputFile, "logOutputFile") === true) { - $this->logOutputFile = $logOutputFile; - } - return $this; - } - - /** - * @return string - */ - public function getLogOutputFile() - { - return $this->logOutputFile; - } - - /** - * @param string $tempDir - * @return $this - */ - public function setTempDir($tempDir) - { - if (!is_callable($this->artifactPathValidation) || ($this->artifactPathValidation)($tempDir, "tempDir") === true) { - $this->tempDir = $tempDir; - } - return $this; - } - - /** - * @return string - */ - public function getTempDir() - { - return $this->tempDir; - } - - /** - * @param string $rootDir - * @return $this - */ - public function setRootDir($rootDir) - { - if (!is_callable($this->artifactPathValidation) || ($this->artifactPathValidation)($rootDir, "rootDir") === true) { - $this->rootDir = $rootDir; - } - return $this; - } - - /** - * @return string - */ - public function getRootDir() - { - return $this->rootDir; - } - - /** - * Sets the HTTP context - * - * @param resource|array $httpContext - * @return $this - */ - public function setHttpContext($httpContext) - { - $this->httpContext = is_array($httpContext) ? stream_context_create($httpContext) : $httpContext; - return $this; - } - - /** - * Returns the HTTP context - * - * @return resource - */ - public function getHttpContext() - { - return $this->httpContext; - } - - - public function validateArtifactPath(?string $path, string $option) - { - if ($path === null) { - return true; - } - $parsed_uri = parse_url($path); - if ($parsed_uri === false || (array_key_exists("scheme", $parsed_uri) && strtolower($parsed_uri["scheme"]) === "phar")) { - return false; - } - return true; - } - - public function validateLocalUri(string $uri) - { - if ($uri === null || strlen($uri) === 0) { - return [false, "The URI must not be empty."]; - } - - $realfile = realpath(str_replace("file://", "", $uri)); - - $dirs = $this->chroot; - $dirs[] = $this->rootDir; - $chrootValid = false; - foreach ($dirs as $chrootPath) { - $chrootPath = realpath($chrootPath); - if ($chrootPath !== false && strpos($realfile, $chrootPath) === 0) { - $chrootValid = true; - break; - } - } - if ($chrootValid !== true) { - return [false, "Permission denied. The file could not be found under the paths specified by Options::chroot."]; - } - - if (!$realfile) { - return [false, "File not found."]; - } - - return [true, null]; - } - - public function validatePharUri(string $uri) - { - if ($uri === null || strlen($uri) === 0) { - return [false, "The URI must not be empty."]; - } - - $file = substr(substr($uri, 0, strpos($uri, ".phar") + 5), 7); - return $this->validateLocalUri($file); - } - - public function validateRemoteUri(string $uri) - { - if ($uri === null || strlen($uri) === 0) { - return [false, "The URI must not be empty."]; - } - - if (!$this->isRemoteEnabled) { - return [false, "Remote file requested, but remote file download is disabled."]; - } - - if (is_array($this->allowedRemoteHosts) && count($this->allowedRemoteHosts) > 0) { - $host = parse_url($uri, PHP_URL_HOST); - $host = mb_strtolower($host); - - if (!in_array($host, $this->allowedRemoteHosts, true)) { - return [false, "Remote host is not in allowed list: " . $host]; - } - } - - return [true, null]; - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/PhpEvaluator.php b/dompdf/vendor/dompdf/dompdf/src/PhpEvaluator.php deleted file mode 100644 index 4a46555..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/PhpEvaluator.php +++ /dev/null @@ -1,62 +0,0 @@ -_canvas = $canvas; - } - - /** - * @param $code - * @param array $vars - */ - public function evaluate($code, $vars = []) - { - if (!$this->_canvas->get_dompdf()->getOptions()->getIsPhpEnabled()) { - return; - } - - // Set up some variables for the inline code - $pdf = $this->_canvas; - $fontMetrics = $pdf->get_dompdf()->getFontMetrics(); - $PAGE_NUM = $pdf->get_page_number(); - $PAGE_COUNT = $pdf->get_page_count(); - - // Override those variables if passed in - foreach ($vars as $k => $v) { - $$k = $v; - } - - eval($code); - } - - /** - * @param Frame $frame - */ - public function render(Frame $frame) - { - $this->evaluate($frame->get_node()->nodeValue); - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/Absolute.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/Absolute.php deleted file mode 100644 index 2df9a74..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Positioner/Absolute.php +++ /dev/null @@ -1,128 +0,0 @@ -get_reflower() instanceof Block) { - $style = $frame->get_style(); - [$cbx, $cby, $cbw, $cbh] = $frame->get_containing_block(); - - // If the `top` value is `auto`, the frame will be repositioned - // after its height has been resolved - $left = (float) $style->length_in_pt($style->left, $cbw); - $top = (float) $style->length_in_pt($style->top, $cbh); - - $frame->set_position($cbx + $left, $cby + $top); - } else { - // Legacy positioning logic for image and table frames - // TODO: Resolve dimensions, margins, and offsets similar to the - // block case in the reflowers and use the simplified logic above - $style = $frame->get_style(); - $block_parent = $frame->find_block_parent(); - $current_line = $block_parent->get_current_line_box(); - - list($x, $y, $w, $h) = $frame->get_containing_block(); - $inflow_x = $block_parent->get_content_box()["x"] + $current_line->left + $current_line->w; - $inflow_y = $current_line->y; - - $top = $style->length_in_pt($style->top, $h); - $right = $style->length_in_pt($style->right, $w); - $bottom = $style->length_in_pt($style->bottom, $h); - $left = $style->length_in_pt($style->left, $w); - - list($width, $height) = [$frame->get_margin_width(), $frame->get_margin_height()]; - - $orig_width = $style->get_specified("width"); - $orig_height = $style->get_specified("height"); - - /**************************** - * - * Width auto: - * ____________| left=auto | left=fixed | - * right=auto | A | B | - * right=fixed | C | D | - * - * Width fixed: - * ____________| left=auto | left=fixed | - * right=auto | E | F | - * right=fixed | G | H | - *****************************/ - - if ($left === "auto") { - if ($right === "auto") { - // A or E - Keep the frame at the same position - $x = $inflow_x; - } else { - if ($orig_width === "auto") { - // C - $x += $w - $width - $right; - } else { - // G - $x += $w - $width - $right; - } - } - } else { - if ($right === "auto") { - // B or F - $x += (float)$left; - } else { - if ($orig_width === "auto") { - // D - TODO change width - $x += (float)$left; - } else { - // H - Everything is fixed: left + width win - $x += (float)$left; - } - } - } - - // The same vertically - if ($top === "auto") { - if ($bottom === "auto") { - // A or E - Keep the frame at the same position - $y = $inflow_y; - } else { - if ($orig_height === "auto") { - // C - $y += (float)$h - $height - (float)$bottom; - } else { - // G - $y += (float)$h - $height - (float)$bottom; - } - } - } else { - if ($bottom === "auto") { - // B or F - $y += (float)$top; - } else { - if ($orig_height === "auto") { - // D - TODO change height - $y += (float)$top; - } else { - // H - Everything is fixed: top + height win - $y += (float)$top; - } - } - } - - $frame->set_position($x, $y); - } - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/AbstractPositioner.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/AbstractPositioner.php deleted file mode 100644 index a75c09f..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Positioner/AbstractPositioner.php +++ /dev/null @@ -1,48 +0,0 @@ -get_position(); - - if (!$ignore_self) { - $frame->set_position($x + $offset_x, $y + $offset_y); - } - - foreach ($frame->get_children() as $child) { - $child->move($offset_x, $offset_y); - } - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/Block.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/Block.php deleted file mode 100644 index e6f65ea..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Positioner/Block.php +++ /dev/null @@ -1,40 +0,0 @@ -get_style(); - $cb = $frame->get_containing_block(); - $p = $frame->find_block_parent(); - - if ($p) { - $float = $style->float; - - if (!$float || $float === "none") { - $p->add_line(true); - } - $y = $p->get_current_line_box()->y; - } else { - $y = $cb["y"]; - } - - $x = $cb["x"]; - - $frame->set_position($x, $y); - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/Fixed.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/Fixed.php deleted file mode 100644 index 13eb9e9..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Positioner/Fixed.php +++ /dev/null @@ -1,92 +0,0 @@ -get_reflower() instanceof Block) { - parent::position($frame); - } else { - // Legacy positioning logic for image and table frames - // TODO: Resolve dimensions, margins, and offsets similar to the - // block case in the reflowers and use the simplified logic above - $style = $frame->get_style(); - $root = $frame->get_root(); - $initialcb = $root->get_containing_block(); - $initialcb_style = $root->get_style(); - - $p = $frame->find_block_parent(); - if ($p) { - $p->add_line(); - } - // Compute the margins of the @page style - $margin_top = (float)$initialcb_style->length_in_pt($initialcb_style->margin_top, $initialcb["h"]); - $margin_right = (float)$initialcb_style->length_in_pt($initialcb_style->margin_right, $initialcb["w"]); - $margin_bottom = (float)$initialcb_style->length_in_pt($initialcb_style->margin_bottom, $initialcb["h"]); - $margin_left = (float)$initialcb_style->length_in_pt($initialcb_style->margin_left, $initialcb["w"]); - - // The needed computed style of the element - $height = (float)$style->length_in_pt($style->get_specified("height"), $initialcb["h"]); - $width = (float)$style->length_in_pt($style->get_specified("width"), $initialcb["w"]); - - $top = $style->length_in_pt($style->get_specified("top"), $initialcb["h"]); - $right = $style->length_in_pt($style->get_specified("right"), $initialcb["w"]); - $bottom = $style->length_in_pt($style->get_specified("bottom"), $initialcb["h"]); - $left = $style->length_in_pt($style->get_specified("left"), $initialcb["w"]); - - $y = $margin_top; - if (isset($top)) { - $y = (float)$top + $margin_top; - if ($top === "auto") { - $y = $margin_top; - if (isset($bottom) && $bottom !== "auto") { - $y = $initialcb["h"] - $bottom - $margin_bottom; - if ($frame->is_auto_height()) { - $y -= $height; - } else { - $y -= $frame->get_margin_height(); - } - } - } - } - - $x = $margin_left; - if (isset($left)) { - $x = (float)$left + $margin_left; - if ($left === "auto") { - $x = $margin_left; - if (isset($right) && $right !== "auto") { - $x = $initialcb["w"] - $right - $margin_right; - if ($frame->is_auto_width()) { - $x -= $width; - } else { - $x -= $frame->get_margin_width(); - } - } - } - } - - $frame->set_position($x, $y); - - foreach ($frame->get_children() as $child) { - $child->set_position($x, $y); - } - } - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/Inline.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/Inline.php deleted file mode 100644 index f1036e9..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Positioner/Inline.php +++ /dev/null @@ -1,56 +0,0 @@ -find_block_parent(); - $cb = $frame->get_containing_block(); - - if (!$block) { - // FIXME: An inline frame without block parent should not be - // possible, but this can occur currently when the body is styled - // with `display: inline !important;` or `display: inline-block !important;` - $frame->set_position($cb["x"], $cb["y"]); - return; - } - - $line = $block->get_current_line_box(); - - if (!$frame->is_text_node() && !($frame instanceof InlineFrameDecorator)) { - // Atomic inline boxes and replaced inline elements - // (inline-block, inline-table, img etc.) - $width = $frame->get_margin_width(); - $available_width = $cb["w"] - $line->left - $line->w - $line->right; - - if (Helpers::lengthGreater($width, $available_width)) { - $block->add_line(); - $line = $block->get_current_line_box(); - } - } - - $frame->set_position($cb["x"] + $line->w, $line->y); - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/ListBullet.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/ListBullet.php deleted file mode 100644 index 081d594..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Positioner/ListBullet.php +++ /dev/null @@ -1,42 +0,0 @@ -get_parent(); - $style = $parent->get_style(); - $cbw = $parent->get_containing_block("w"); - $margin_left = (float) $style->length_in_pt($style->margin_left, $cbw); - $border_edge = $parent->get_position("x") + $margin_left; - - // This includes the marker indentation - $x = $border_edge - $frame->get_margin_width(); - - // The marker is later vertically aligned with the corresponding line - // box and its vertical position is fine-tuned in the renderer - $p = $frame->find_block_parent(); - $y = $p->get_current_line_box()->y; - - $frame->set_position($x, $y); - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/NullPositioner.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/NullPositioner.php deleted file mode 100644 index 6ad425c..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Positioner/NullPositioner.php +++ /dev/null @@ -1,26 +0,0 @@ -get_cellmap(); - $frame->set_position($cellmap->get_frame_position($frame)); - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/TableRow.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/TableRow.php deleted file mode 100644 index 79c0fcf..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Positioner/TableRow.php +++ /dev/null @@ -1,34 +0,0 @@ -get_containing_block(); - $p = $frame->get_prev_sibling(); - - if ($p) { - $y = $p->get_position("y") + $p->get_margin_height(); - } else { - $y = $cb["y"]; - } - $frame->set_position($cb["x"], $y); - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer.php b/dompdf/vendor/dompdf/dompdf/src/Renderer.php deleted file mode 100644 index 15391fb..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Renderer.php +++ /dev/null @@ -1,307 +0,0 @@ -_canvas->new_page(); - } - - /** - * Render frames recursively - * - * @param Frame $frame the frame to render - */ - public function render(Frame $frame) - { - global $_dompdf_debug; - - $this->_check_callbacks("begin_frame", $frame); - - if ($_dompdf_debug) { - echo $frame; - flush(); - } - - $style = $frame->get_style(); - - if (in_array($style->visibility, ["hidden", "collapse"], true)) { - return; - } - - $display = $style->display; - $transformList = $style->transform; - $hasTransform = $transformList !== []; - - // Starts the CSS transformation - if ($hasTransform) { - $this->_canvas->save(); - - [$x, $y] = $frame->get_padding_box(); - [$originX, $originY] = $style->transform_origin; - $w = (float) $style->length_in_pt($style->width); - $h = (float) $style->length_in_pt($style->height); - - foreach ($transformList as $transform) { - [$function, $values] = $transform; - - if ($function === "matrix") { - $function = "transform"; - } elseif ($function === "translate") { - $values[0] = $style->length_in_pt($values[0], $w); - $values[1] = $style->length_in_pt($values[1], $h); - } - - $values[] = $x + $style->length_in_pt($originX, $w); - $values[] = $y + $style->length_in_pt($originY, $h); - - call_user_func_array([$this->_canvas, $function], $values); - } - } - - switch ($display) { - - case "block": - case "list-item": - case "inline-block": - case "table": - case "inline-table": - $this->_render_frame("block", $frame); - break; - - case "inline": - if ($frame->is_text_node()) { - $this->_render_frame("text", $frame); - } else { - $this->_render_frame("inline", $frame); - } - break; - - case "table-cell": - $this->_render_frame("table-cell", $frame); - break; - - case "table-row": - $this->_render_frame("table-row", $frame); - break; - - case "table-row-group": - case "table-header-group": - case "table-footer-group": - $this->_render_frame("table-row-group", $frame); - break; - - case "-dompdf-list-bullet": - $this->_render_frame("list-bullet", $frame); - break; - - case "-dompdf-image": - $this->_render_frame("image", $frame); - break; - - case "none": - $node = $frame->get_node(); - - if ($node->nodeName === "script") { - if ($node->getAttribute("type") === "text/php" || - $node->getAttribute("language") === "php" - ) { - // Evaluate embedded php scripts - $this->_render_frame("php", $frame); - } elseif ($node->getAttribute("type") === "text/javascript" || - $node->getAttribute("language") === "javascript" - ) { - // Insert JavaScript - $this->_render_frame("javascript", $frame); - } - } - - // Don't render children, so skip to next iter - return; - - default: - break; - - } - - // Starts the overflow: hidden box - if ($style->overflow === "hidden") { - $padding_box = $frame->get_padding_box(); - [$x, $y, $w, $h] = $padding_box; - $style = $frame->get_style(); - - if ($style->has_border_radius()) { - $border_box = $frame->get_border_box(); - [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box, $padding_box); - $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl); - } else { - $this->_canvas->clipping_rectangle($x, $y, $w, $h); - } - } - - $stack = []; - - foreach ($frame->get_children() as $child) { - // < 0 : negative z-index - // = 0 : no z-index, no stacking context - // = 1 : stacking context without z-index - // > 1 : z-index - $child_style = $child->get_style(); - $child_z_index = $child_style->z_index; - $z_index = 0; - - if ($child_z_index !== "auto") { - $z_index = $child_z_index + 1; - } elseif ($child_style->float !== "none" || $child->is_positioned()) { - $z_index = 1; - } - - $stack[$z_index][] = $child; - } - - ksort($stack); - - foreach ($stack as $by_index) { - foreach ($by_index as $child) { - $this->render($child); - } - } - - // Ends the overflow: hidden box - if ($style->overflow === "hidden") { - $this->_canvas->clipping_end(); - } - - if ($hasTransform) { - $this->_canvas->restore(); - } - - // Check for end frame callback - $this->_check_callbacks("end_frame", $frame); - } - - /** - * Check for callbacks that need to be performed when a given event - * gets triggered on a frame - * - * @param string $event The type of event - * @param Frame $frame The frame that event is triggered on - */ - protected function _check_callbacks(string $event, Frame $frame): void - { - if (!isset($this->_callbacks)) { - $this->_callbacks = $this->_dompdf->getCallbacks(); - } - - if (isset($this->_callbacks[$event])) { - $fs = $this->_callbacks[$event]; - $canvas = $this->_canvas; - $fontMetrics = $this->_dompdf->getFontMetrics(); - - foreach ($fs as $f) { - $f($frame, $canvas, $fontMetrics); - } - } - } - - /** - * Render a single frame - * - * Creates Renderer objects on demand - * - * @param string $type type of renderer to use - * @param Frame $frame the frame to render - */ - protected function _render_frame($type, $frame) - { - - if (!isset($this->_renderers[$type])) { - - switch ($type) { - case "block": - $this->_renderers[$type] = new Block($this->_dompdf); - break; - - case "inline": - $this->_renderers[$type] = new Inline($this->_dompdf); - break; - - case "text": - $this->_renderers[$type] = new Text($this->_dompdf); - break; - - case "image": - $this->_renderers[$type] = new Image($this->_dompdf); - break; - - case "table-cell": - $this->_renderers[$type] = new TableCell($this->_dompdf); - break; - - case "table-row": - $this->_renderers[$type] = new TableRow($this->_dompdf); - break; - - case "table-row-group": - $this->_renderers[$type] = new TableRowGroup($this->_dompdf); - break; - - case "list-bullet": - $this->_renderers[$type] = new ListBullet($this->_dompdf); - break; - - case "php": - $this->_renderers[$type] = new PhpEvaluator($this->_canvas); - break; - - case "javascript": - $this->_renderers[$type] = new JavascriptEmbedder($this->_dompdf); - break; - - } - } - - $this->_renderers[$type]->render($frame); - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/AbstractRenderer.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/AbstractRenderer.php deleted file mode 100644 index 38fef21..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Renderer/AbstractRenderer.php +++ /dev/null @@ -1,1289 +0,0 @@ -_dompdf = $dompdf; - $this->_canvas = $dompdf->getCanvas(); - } - - /** - * Render a frame. - * - * Specialized in child classes - * - * @param Frame $frame The frame to render - */ - abstract function render(Frame $frame); - - /** - * @param Frame $frame - * @param float[] $border_box - */ - protected function _render_background(Frame $frame, array $border_box): void - { - $style = $frame->get_style(); - $color = $style->background_color; - $image = $style->background_image; - [$x, $y, $w, $h] = $border_box; - - if ($color === "transparent" && $image === "none") { - return; - } - - if ($style->has_border_radius()) { - [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box); - $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl); - } - - if ($color !== "transparent") { - $this->_canvas->filled_rectangle($x, $y, $w, $h, $color); - } - - if ($image !== "none") { - $this->_background_image($image, $x, $y, $w, $h, $style); - } - - if ($style->has_border_radius()) { - $this->_canvas->clipping_end(); - } - } - - /** - * @param Frame $frame - * @param float[] $border_box - * @param string $corner_style - */ - protected function _render_border(Frame $frame, array $border_box, string $corner_style = "bevel"): void - { - $style = $frame->get_style(); - $bp = $style->get_border_properties(); - [$x, $y, $w, $h] = $border_box; - [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box); - - // Short-cut: If all the borders are "solid" with the same color and - // style, and no radius, we'd better draw a rectangle - if ($bp["top"]["style"] === "solid" && - $bp["top"] === $bp["right"] && - $bp["right"] === $bp["bottom"] && - $bp["bottom"] === $bp["left"] && - !$style->has_border_radius() - ) { - $props = $bp["top"]; - if ($props["color"] === "transparent" || $props["width"] <= 0) { - return; - } - - $width = (float)$style->length_in_pt($props["width"]); - $this->_canvas->rectangle($x + $width / 2, $y + $width / 2, $w - $width, $h - $width, $props["color"], $width); - return; - } - - // Do it the long way - $widths = [ - (float)$style->length_in_pt($bp["top"]["width"]), - (float)$style->length_in_pt($bp["right"]["width"]), - (float)$style->length_in_pt($bp["bottom"]["width"]), - (float)$style->length_in_pt($bp["left"]["width"]) - ]; - - foreach ($bp as $side => $props) { - if ($props["style"] === "none" || - $props["style"] === "hidden" || - $props["color"] === "transparent" || - $props["width"] <= 0 - ) { - continue; - } - - [$x, $y, $w, $h] = $border_box; - $method = "_border_" . $props["style"]; - - switch ($side) { - case "top": - $length = $w; - $r1 = $tl; - $r2 = $tr; - break; - - case "bottom": - $length = $w; - $y += $h; - $r1 = $bl; - $r2 = $br; - break; - - case "left": - $length = $h; - $r1 = $tl; - $r2 = $bl; - break; - - case "right": - $length = $h; - $x += $w; - $r1 = $tr; - $r2 = $br; - break; - - default: - break; - } - - // draw rounded corners - $this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style, $r1, $r2); - } - } - - /** - * @param Frame $frame - * @param float[] $border_box - * @param string $corner_style - */ - protected function _render_outline(Frame $frame, array $border_box, string $corner_style = "bevel"): void - { - $style = $frame->get_style(); - - $width = $style->outline_width; - $outline_style = $style->outline_style; - $color = $style->outline_color; - - if ($outline_style === "none" || $color === "transparent" || $width <= 0) { - return; - } - - $offset = $style->outline_offset; - - [$x, $y, $w, $h] = $border_box; - $d = $width + $offset; - $outline_box = [$x - $d, $y - $d, $w + $d * 2, $h + $d * 2]; - [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box, $outline_box); - - $x -= $offset; - $y -= $offset; - $w += $offset * 2; - $h += $offset * 2; - - // For a simple outline, we can draw a rectangle - if ($outline_style === "solid" && !$style->has_border_radius()) { - $x -= $width / 2; - $y -= $width / 2; - $w += $width; - $h += $width; - - $this->_canvas->rectangle($x, $y, $w, $h, $color, $width); - return; - } - - $x -= $width; - $y -= $width; - $w += $width * 2; - $h += $width * 2; - - $method = "_border_" . $outline_style; - $widths = array_fill(0, 4, $width); - $sides = ["top", "right", "left", "bottom"]; - - foreach ($sides as $side) { - switch ($side) { - case "top": - $length = $w; - $side_x = $x; - $side_y = $y; - $r1 = $tl; - $r2 = $tr; - break; - - case "bottom": - $length = $w; - $side_x = $x; - $side_y = $y + $h; - $r1 = $bl; - $r2 = $br; - break; - - case "left": - $length = $h; - $side_x = $x; - $side_y = $y; - $r1 = $tl; - $r2 = $bl; - break; - - case "right": - $length = $h; - $side_x = $x + $w; - $side_y = $y; - $r1 = $tr; - $r2 = $br; - break; - - default: - break; - } - - $this->$method($side_x, $side_y, $length, $color, $widths, $side, $corner_style, $r1, $r2); - } - } - - /** - * Render a background image over a rectangular area - * - * @param string $url The background image to load - * @param float $x The left edge of the rectangular area - * @param float $y The top edge of the rectangular area - * @param float $width The width of the rectangular area - * @param float $height The height of the rectangular area - * @param Style $style The associated Style object - * - * @throws \Exception - */ - protected function _background_image(string $url, float $x, float $y, float $width, float $height, Style $style): void - { - if (!function_exists("imagecreatetruecolor")) { - throw new \Exception("The PHP GD extension is required, but is not installed."); - } - - $sheet = $style->get_stylesheet(); - - // Skip degenerate cases - if ($width == 0 || $height == 0) { - return; - } - - $box_width = $width; - $box_height = $height; - - //debugpng - if ($this->_dompdf->getOptions()->getDebugPng()) { - print '[_background_image ' . $url . ']'; - } - - list($img, $type, /*$msg*/) = Cache::resolve_url( - $url, - $sheet->get_protocol(), - $sheet->get_host(), - $sheet->get_base_path(), - $this->_dompdf->getOptions() - ); - - // Bail if the image is no good - if (Cache::is_broken($img)) { - return; - } - - //Try to optimize away reading and composing of same background multiple times - //Postponing read with imagecreatefrom ...() - //final composition parameters and name not known yet - //Therefore read dimension directly from file, instead of creating gd object first. - //$img_w = imagesx($src); $img_h = imagesy($src); - - list($img_w, $img_h) = Helpers::dompdf_getimagesize($img, $this->_dompdf->getHttpContext()); - if ($img_w == 0 || $img_h == 0) { - return; - } - - // save for later check if file needs to be resized. - $org_img_w = $img_w; - $org_img_h = $img_h; - - $repeat = $style->background_repeat; - $dpi = $this->_dompdf->getOptions()->getDpi(); - - //Increase background resolution and dependent box size according to image resolution to be placed in - //Then image can be copied in without resize - $bg_width = round((float)($width * $dpi) / 72); - $bg_height = round((float)($height * $dpi) / 72); - - list($img_w, $img_h) = $this->_resize_background_image( - $img_w, - $img_h, - $bg_width, - $bg_height, - $style->background_size, - $dpi - ); - //Need %bg_x, $bg_y as background pos, where img starts, converted to pixel - - list($bg_x, $bg_y) = $style->background_position; - - if (Helpers::is_percent($bg_x)) { - // The point $bg_x % from the left edge of the image is placed - // $bg_x % from the left edge of the background rectangle - $p = ((float)$bg_x) / 100.0; - $x1 = $p * $img_w; - $x2 = $p * $bg_width; - - $bg_x = $x2 - $x1; - } else { - $bg_x = (float)($style->length_in_pt($bg_x) * $dpi) / 72; - } - - $bg_x = round($bg_x + (float)$style->length_in_pt($style->border_left_width) * $dpi / 72); - - if (Helpers::is_percent($bg_y)) { - // The point $bg_y % from the left edge of the image is placed - // $bg_y % from the left edge of the background rectangle - $p = ((float)$bg_y) / 100.0; - $y1 = $p * $img_h; - $y2 = $p * $bg_height; - - $bg_y = $y2 - $y1; - } else { - $bg_y = (float)($style->length_in_pt($bg_y) * $dpi) / 72; - } - - $bg_y = round($bg_y + (float)$style->length_in_pt($style->border_top_width) * $dpi / 72); - - //clip background to the image area on partial repeat. Nothing to do if img off area - //On repeat, normalize start position to the tile at immediate left/top or 0/0 of area - //On no repeat with positive offset: move size/start to have offset==0 - //Handle x/y Dimensions separately - - if ($repeat !== "repeat" && $repeat !== "repeat-x") { - //No repeat x - if ($bg_x < 0) { - $bg_width = $img_w + $bg_x; - } else { - $x += ($bg_x * 72) / $dpi; - $bg_width = $bg_width - $bg_x; - if ($bg_width > $img_w) { - $bg_width = $img_w; - } - $bg_x = 0; - } - - if ($bg_width <= 0) { - return; - } - - $width = (float)($bg_width * 72) / $dpi; - } else { - //repeat x - if ($bg_x < 0) { - $bg_x = -((-$bg_x) % $img_w); - } else { - $bg_x = $bg_x % $img_w; - if ($bg_x > 0) { - $bg_x -= $img_w; - } - } - } - - if ($repeat !== "repeat" && $repeat !== "repeat-y") { - //no repeat y - if ($bg_y < 0) { - $bg_height = $img_h + $bg_y; - } else { - $y += ($bg_y * 72) / $dpi; - $bg_height = $bg_height - $bg_y; - if ($bg_height > $img_h) { - $bg_height = $img_h; - } - $bg_y = 0; - } - if ($bg_height <= 0) { - return; - } - $height = (float)($bg_height * 72) / $dpi; - } else { - //repeat y - if ($bg_y < 0) { - $bg_y = -((-$bg_y) % $img_h); - } else { - $bg_y = $bg_y % $img_h; - if ($bg_y > 0) { - $bg_y -= $img_h; - } - } - } - - //Optimization, if repeat has no effect - if ($repeat === "repeat" && $bg_y <= 0 && $img_h + $bg_y >= $bg_height) { - $repeat = "repeat-x"; - } - - if ($repeat === "repeat" && $bg_x <= 0 && $img_w + $bg_x >= $bg_width) { - $repeat = "repeat-y"; - } - - if (($repeat === "repeat-x" && $bg_x <= 0 && $img_w + $bg_x >= $bg_width) || - ($repeat === "repeat-y" && $bg_y <= 0 && $img_h + $bg_y >= $bg_height) - ) { - $repeat = "no-repeat"; - } - - // Avoid rendering identical background-image variants multiple times - // This is not dependent of background color of box! .'_'.(is_array($bg_color) ? $bg_color["hex"] : $bg_color) - // Note: Here, bg_* are the start values, not end values after going through the tile loops! - - $key = implode("_", [$bg_width, $bg_height, $img_w, $img_h, $bg_x, $bg_y, $repeat]); - // FIXME: This will fail when a file with that exact name exists in the - // same directory, included in the document as regular image - $cpdfKey = $img . "_" . $key; - $tmpFile = Cache::getTempImage($img, $key); - $cached = ($this->_canvas instanceof CPDF && $this->_canvas->get_cpdf()->image_iscached($cpdfKey)) - || ($tmpFile !== null && file_exists($tmpFile)); - - if (!$cached) { - // img: image url string - // img_w, img_h: original image size in px - // width, height: box size in pt - // bg_width, bg_height: box size in px - // x, y: left/top edge of box on page in pt - // start_x, start_y: placement of image relative to pattern - // $repeat: repeat mode - // $bg: GD object of result image - // $src: GD object of original image - - // Create a new image to fit over the background rectangle - $bg = imagecreatetruecolor($bg_width, $bg_height); - $cpdfFromGd = true; - - switch (strtolower($type)) { - case "png": - $cpdfFromGd = false; - imagesavealpha($bg, true); - imagealphablending($bg, false); - $src = @imagecreatefrompng($img); - break; - - case "jpeg": - $src = @imagecreatefromjpeg($img); - break; - - case "webp": - $src = @imagecreatefromwebp($img); - break; - - case "gif": - $src = @imagecreatefromgif($img); - break; - - case "bmp": - $src = @Helpers::imagecreatefrombmp($img); - break; - - default: - return; // Unsupported image type - } - - if ($src == null) { - return; - } - - if ($img_w != $org_img_w || $img_h != $org_img_h) { - $newSrc = imagescale($src, $img_w, $img_h); - imagedestroy($src); - $src = $newSrc; - } - - if ($src == null) { - return; - } - - //Background color if box is not relevant here - //Non transparent image: box clipped to real size. Background non relevant. - //Transparent image: The image controls the transparency and lets shine through whatever background. - //However on transparent image preset the composed image with the transparency color, - //to keep the transparency when copying over the non transparent parts of the tiles. - $ti = imagecolortransparent($src); - $palletsize = imagecolorstotal($src); - - if ($ti >= 0 && $ti < $palletsize) { - $tc = imagecolorsforindex($src, $ti); - $ti = imagecolorallocate($bg, $tc['red'], $tc['green'], $tc['blue']); - imagefill($bg, 0, 0, $ti); - imagecolortransparent($bg, $ti); - } - - //This has only an effect for the non repeatable dimension. - //compute start of src and dest coordinates of the single copy - if ($bg_x < 0) { - $dst_x = 0; - $src_x = -$bg_x; - } else { - $src_x = 0; - $dst_x = $bg_x; - } - - if ($bg_y < 0) { - $dst_y = 0; - $src_y = -$bg_y; - } else { - $src_y = 0; - $dst_y = $bg_y; - } - - //For historical reasons exchange meanings of variables: - //start_* will be the start values, while bg_* will be the temporary start values in the loops - $start_x = $bg_x; - $start_y = $bg_y; - - // Copy regions from the source image to the background - if ($repeat === "no-repeat") { - // Simply place the image on the background - imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $img_h); - - } elseif ($repeat === "repeat-x") { - for ($bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w) { - if ($bg_x < 0) { - $dst_x = 0; - $src_x = -$bg_x; - $w = $img_w + $bg_x; - } else { - $dst_x = $bg_x; - $src_x = 0; - $w = $img_w; - } - imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $img_h); - } - } elseif ($repeat === "repeat-y") { - - for ($bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h) { - if ($bg_y < 0) { - $dst_y = 0; - $src_y = -$bg_y; - $h = $img_h + $bg_y; - } else { - $dst_y = $bg_y; - $src_y = 0; - $h = $img_h; - } - imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $h); - } - } elseif ($repeat === "repeat") { - for ($bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h) { - for ($bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w) { - if ($bg_x < 0) { - $dst_x = 0; - $src_x = -$bg_x; - $w = $img_w + $bg_x; - } else { - $dst_x = $bg_x; - $src_x = 0; - $w = $img_w; - } - - if ($bg_y < 0) { - $dst_y = 0; - $src_y = -$bg_y; - $h = $img_h + $bg_y; - } else { - $dst_y = $bg_y; - $src_y = 0; - $h = $img_h; - } - imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $h); - } - } - } else { - print 'Unknown repeat!'; - } - - imagedestroy($src); - - if ($cpdfFromGd && $this->_canvas instanceof CPDF) { - // Skip writing temp file as the GD object is added directly - } else { - $tmpDir = $this->_dompdf->getOptions()->getTempDir(); - $tmpName = @tempnam($tmpDir, "bg_dompdf_img_"); - @unlink($tmpName); - $tmpFile = "$tmpName.png"; - - imagepng($bg, $tmpFile); - imagedestroy($bg); - - Cache::addTempImage($img, $tmpFile, $key); - } - } else { - $bg = null; - $cpdfFromGd = $tmpFile === null; - } - - if ($this->_dompdf->getOptions()->getDebugPng()) { - print '[_background_image ' . $tmpFile . ']'; - } - - $this->_canvas->clipping_rectangle($x, $y, $box_width, $box_height); - - // When using cpdf and optimization to direct png creation from gd object is available, - // don't create temp file, but place gd object directly into the pdf - if ($cpdfFromGd && $this->_canvas instanceof CPDF) { - // Note: CPDF_Adapter image converts y position - $this->_canvas->get_cpdf()->addImagePng($bg, $cpdfKey, $x, $this->_canvas->get_height() - $y - $height, $width, $height); - - if (isset($bg)) { - imagedestroy($bg); - } - } else { - $this->_canvas->image($tmpFile, $x, $y, $width, $height); - } - - $this->_canvas->clipping_end(); - } - - /** - * @param float $img_width - * @param float $img_height - * @param float $container_width - * @param float $container_height - * @param array|string $bg_resize - * @param int $dpi - * - * @return float[] - */ - protected function _resize_background_image( - float $img_width, - float $img_height, - float $container_width, - float $container_height, - $bg_resize, - int $dpi - ): array { - // We got two some specific numbers and/or auto definitions - if (is_array($bg_resize)) { - $is_auto_width = $bg_resize[0] === 'auto'; - if ($is_auto_width) { - $new_img_width = $img_width; - } else { - $new_img_width = $bg_resize[0]; - if (Helpers::is_percent($new_img_width)) { - $new_img_width = round(($container_width / 100) * (float)$new_img_width); - } else { - $new_img_width = round($new_img_width * $dpi / 72); - } - } - - $is_auto_height = $bg_resize[1] === 'auto'; - if ($is_auto_height) { - $new_img_height = $img_height; - } else { - $new_img_height = $bg_resize[1]; - if (Helpers::is_percent($new_img_height)) { - $new_img_height = round(($container_height / 100) * (float)$new_img_height); - } else { - $new_img_height = round($new_img_height * $dpi / 72); - } - } - - // if one of both was set to auto the other one needs to scale proportionally - if ($is_auto_width !== $is_auto_height) { - if ($is_auto_height) { - $new_img_height = round($new_img_width * ($img_height / $img_width)); - } else { - $new_img_width = round($new_img_height * ($img_width / $img_height)); - } - } - } else { - $container_ratio = $container_height / $container_width; - - if ($bg_resize === 'cover' || $bg_resize === 'contain') { - $img_ratio = $img_height / $img_width; - - if ( - ($bg_resize === 'cover' && $container_ratio > $img_ratio) || - ($bg_resize === 'contain' && $container_ratio < $img_ratio) - ) { - $new_img_height = $container_height; - $new_img_width = round($container_height / $img_ratio); - } else { - $new_img_width = $container_width; - $new_img_height = round($container_width * $img_ratio); - } - } else { - $new_img_width = $img_width; - $new_img_height = $img_height; - } - } - - return [$new_img_width, $new_img_height]; - } - - // Border rendering functions - - /** - * @param float $x - * @param float $y - * @param float $length - * @param array $color - * @param float[] $widths - * @param string $side - * @param string $corner_style - * @param float $r1 - * @param float $r2 - */ - protected function _border_dotted($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "dotted", $r1, $r2); - } - - /** - * @param float $x - * @param float $y - * @param float $length - * @param array $color - * @param float[] $widths - * @param string $side - * @param string $corner_style - * @param float $r1 - * @param float $r2 - */ - protected function _border_dashed($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "dashed", $r1, $r2); - } - - /** - * @param float $x - * @param float $y - * @param float $length - * @param array $color - * @param float[] $widths - * @param string $side - * @param string $corner_style - * @param float $r1 - * @param float $r2 - */ - protected function _border_solid($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "solid", $r1, $r2); - } - - /** - * @param string $side - * @param float $ratio - * @param float $top - * @param float $right - * @param float $bottom - * @param float $left - * @param float $x - * @param float $y - * @param float $length - * @param float $r1 - * @param float $r2 - */ - protected function _apply_ratio($side, $ratio, $top, $right, $bottom, $left, &$x, &$y, &$length, &$r1, &$r2) - { - switch ($side) { - case "top": - $r1 -= $left * $ratio; - $r2 -= $right * $ratio; - $x += $left * $ratio; - $y += $top * $ratio; - $length -= $left * $ratio + $right * $ratio; - break; - - case "bottom": - $r1 -= $right * $ratio; - $r2 -= $left * $ratio; - $x += $left * $ratio; - $y -= $bottom * $ratio; - $length -= $left * $ratio + $right * $ratio; - break; - - case "left": - $r1 -= $top * $ratio; - $r2 -= $bottom * $ratio; - $x += $left * $ratio; - $y += $top * $ratio; - $length -= $top * $ratio + $bottom * $ratio; - break; - - case "right": - $r1 -= $bottom * $ratio; - $r2 -= $top * $ratio; - $x -= $right * $ratio; - $y += $top * $ratio; - $length -= $top * $ratio + $bottom * $ratio; - break; - - default: - return; - } - } - - /** - * @param float $x - * @param float $y - * @param float $length - * @param array $color - * @param float[] $widths - * @param string $side - * @param string $corner_style - * @param float $r1 - * @param float $r2 - */ - protected function _border_double($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - list($top, $right, $bottom, $left) = $widths; - - $third_widths = [$top / 3, $right / 3, $bottom / 3, $left / 3]; - - // draw the outer border - $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2); - - $this->_apply_ratio($side, 2 / 3, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); - - $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2); - } - - /** - * @param float $x - * @param float $y - * @param float $length - * @param array $color - * @param float[] $widths - * @param string $side - * @param string $corner_style - * @param float $r1 - * @param float $r2 - */ - protected function _border_groove($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - list($top, $right, $bottom, $left) = $widths; - - $half_widths = [$top / 2, $right / 2, $bottom / 2, $left / 2]; - - $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); - - $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); - - $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); - } - - /** - * @param float $x - * @param float $y - * @param float $length - * @param array $color - * @param float[] $widths - * @param string $side - * @param string $corner_style - * @param float $r1 - * @param float $r2 - */ - protected function _border_ridge($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - list($top, $right, $bottom, $left) = $widths; - - $half_widths = [$top / 2, $right / 2, $bottom / 2, $left / 2]; - - $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); - - $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); - - $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); - } - - /** - * @param $c - * @return mixed - */ - protected function _tint($c) - { - if (!is_numeric($c)) { - return $c; - } - - return min(1, $c + 0.16); - } - - /** - * @param $c - * @return mixed - */ - protected function _shade($c) - { - if (!is_numeric($c)) { - return $c; - } - - return max(0, $c - 0.33); - } - - /** - * @param float $x - * @param float $y - * @param float $length - * @param array $color - * @param float[] $widths - * @param string $side - * @param string $corner_style - * @param float $r1 - * @param float $r2 - */ - protected function _border_inset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - switch ($side) { - case "top": - case "left": - $shade = array_map([$this, "_shade"], $color); - $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2); - break; - - case "bottom": - case "right": - $tint = array_map([$this, "_tint"], $color); - $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2); - break; - - default: - return; - } - } - - /** - * @param float $x - * @param float $y - * @param float $length - * @param array $color - * @param float[] $widths - * @param string $side - * @param string $corner_style - * @param float $r1 - * @param float $r2 - */ - protected function _border_outset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - switch ($side) { - case "top": - case "left": - $tint = array_map([$this, "_tint"], $color); - $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2); - break; - - case "bottom": - case "right": - $shade = array_map([$this, "_shade"], $color); - $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2); - break; - - default: - return; - } - } - - /** - * Get the dash pattern and cap style for the given border style, width, and - * line length. - * - * The base pattern is adjusted so that it fits the given line length - * symmetrically. - * - * @param string $style - * @param float $width - * @param float $length - * - * @return array - */ - protected function dashPattern(string $style, float $width, float $length): array - { - if ($style === "dashed") { - $w = 3 * $width; - - if ($length < $w) { - $s = $w; - } else { - // Scale dashes and gaps - $r = round($length / $w); - $r = $r % 2 === 0 ? $r + 1 : $r; - $s = $length / $r; - } - - return [[$s], "butt"]; - } - - if ($style === "dotted") { - // Draw circles along the line - // Round caps extend outwards by half line width, so a zero dash - // width results in a circle - $gap = $width <= 1 ? 2 : 1; - $w = ($gap + 1) * $width; - - if ($length < $w) { - $s = $w; - } else { - // Only scale gaps - $l = $length - $width; - $r = max(round($l / $w), 1); - $s = $l / $r; - } - - return [[0, $s], "round"]; - } - - return [[], "butt"]; - } - - /** - * Draws a solid, dotted, or dashed line, observing the border radius - * - * @param float $x - * @param float $y - * @param float $length - * @param array $color - * @param float[] $widths - * @param string $side - * @param string $corner_style - * @param string $pattern_name - * @param float $r1 - * @param float $r2 - */ - protected function _border_line($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $pattern_name = "none", $r1 = 0, $r2 = 0) - { - /** used by $$side */ - [$top, $right, $bottom, $left] = $widths; - $width = $$side; - - // No need to clip corners if border radius is large enough - $cornerClip = $corner_style === "bevel" && ($r1 < $width || $r2 < $width); - $lineLength = $length - $r1 - $r2; - [$pattern, $cap] = $this->dashPattern($pattern_name, $width, $lineLength); - - // Determine arc border radius for corner arcs - $halfWidth = $width / 2; - $ar1 = max($r1 - $halfWidth, 0); - $ar2 = max($r2 - $halfWidth, 0); - - // Small angle adjustments to prevent the background from shining through - $adj1 = $ar1 / 80; - $adj2 = $ar2 / 80; - - // Adjust line width and corner angles to account for the fact that - // round caps extend outwards. The line is actually only shifted below, - // not shortened, as otherwise the end dash (circle) will vanish - // occasionally - $dl = $cap === "round" ? $halfWidth : 0; - - if ($cap === "round" && $ar1 > 0) { - $adj1 -= rad2deg(asin($halfWidth / $ar1)); - } - if ($cap === "round" && $ar2 > 0) { - $adj2 -= rad2deg(asin($halfWidth / $ar2)); - } - - switch ($side) { - case "top": - if ($cornerClip) { - $points = [ - $x, $y, - $x, $y - 1, // Extend outwards to avoid gaps - $x + $length, $y - 1, // Extend outwards to avoid gaps - $x + $length, $y, - $x + $length - max($right, $r2), $y + max($width, $r2), - $x + max($left, $r1), $y + max($width, $r1) - ]; - $this->_canvas->clipping_polygon($points); - } - - $y += $halfWidth; - - if ($ar1 > 0 && $adj1 > -22.5) { - $this->_canvas->arc($x + $r1, $y + $ar1, $ar1, $ar1, 90 - $adj1, 135 + $adj1, $color, $width, $pattern, $cap); - } - - if ($lineLength > 0) { - $this->_canvas->line($x + $dl + $r1, $y, $x + $dl + $length - $r2, $y, $color, $width, $pattern, $cap); - } - - if ($ar2 > 0 && $adj2 > -22.5) { - $this->_canvas->arc($x + $length - $r2, $y + $ar2, $ar2, $ar2, 45 - $adj2, 90 + $adj2, $color, $width, $pattern, $cap); - } - break; - - case "bottom": - if ($cornerClip) { - $points = [ - $x, $y, - $x, $y + 1, // Extend outwards to avoid gaps - $x + $length, $y + 1, // Extend outwards to avoid gaps - $x + $length, $y, - $x + $length - max($right, $r2), $y - max($width, $r2), - $x + max($left, $r1), $y - max($width, $r1) - ]; - $this->_canvas->clipping_polygon($points); - } - - $y -= $halfWidth; - - if ($ar1 > 0 && $adj1 > -22.5) { - $this->_canvas->arc($x + $r1, $y - $ar1, $ar1, $ar1, 225 - $adj1, 270 + $adj1, $color, $width, $pattern, $cap); - } - - if ($lineLength > 0) { - $this->_canvas->line($x + $dl + $r1, $y, $x + $dl + $length - $r2, $y, $color, $width, $pattern, $cap); - } - - if ($ar2 > 0 && $adj2 > -22.5) { - $this->_canvas->arc($x + $length - $r2, $y - $ar2, $ar2, $ar2, 270 - $adj2, 315 + $adj2, $color, $width, $pattern, $cap); - } - break; - - case "left": - if ($cornerClip) { - $points = [ - $x, $y, - $x - 1, $y, // Extend outwards to avoid gaps - $x - 1, $y + $length, // Extend outwards to avoid gaps - $x, $y + $length, - $x + max($width, $r2), $y + $length - max($bottom, $r2), - $x + max($width, $r1), $y + max($top, $r1) - ]; - $this->_canvas->clipping_polygon($points); - } - - $x += $halfWidth; - - if ($ar1 > 0 && $adj1 > -22.5) { - $this->_canvas->arc($x + $ar1, $y + $r1, $ar1, $ar1, 135 - $adj1, 180 + $adj1, $color, $width, $pattern, $cap); - } - - if ($lineLength > 0) { - $this->_canvas->line($x, $y + $dl + $r1, $x, $y + $dl + $length - $r2, $color, $width, $pattern, $cap); - } - - if ($ar2 > 0 && $adj2 > -22.5) { - $this->_canvas->arc($x + $ar2, $y + $length - $r2, $ar2, $ar2, 180 - $adj2, 225 + $adj2, $color, $width, $pattern, $cap); - } - break; - - case "right": - if ($cornerClip) { - $points = [ - $x, $y, - $x + 1, $y, // Extend outwards to avoid gaps - $x + 1, $y + $length, // Extend outwards to avoid gaps - $x, $y + $length, - $x - max($width, $r2), $y + $length - max($bottom, $r2), - $x - max($width, $r1), $y + max($top, $r1) - ]; - $this->_canvas->clipping_polygon($points); - } - - $x -= $halfWidth; - - if ($ar1 > 0 && $adj1 > -22.5) { - $this->_canvas->arc($x - $ar1, $y + $r1, $ar1, $ar1, 0 - $adj1, 45 + $adj1, $color, $width, $pattern, $cap); - } - - if ($lineLength > 0) { - $this->_canvas->line($x, $y + $dl + $r1, $x, $y + $dl + $length - $r2, $color, $width, $pattern, $cap); - } - - if ($ar2 > 0 && $adj2 > -22.5) { - $this->_canvas->arc($x - $ar2, $y + $length - $r2, $ar2, $ar2, 315 - $adj2, 360 + $adj2, $color, $width, $pattern, $cap); - } - break; - } - - if ($cornerClip) { - $this->_canvas->clipping_end(); - } - } - - /** - * @param float $opacity - */ - protected function _set_opacity(float $opacity): void - { - if ($opacity >= 0.0 && $opacity <= 1.0) { - $this->_canvas->set_opacity($opacity); - } - } - - /** - * Add a named destination if the element has an ID or is an anchor element - * with `name` attribute. - * - * @param DOMElement $node - */ - protected function addNamedDest(DOMElement $node): void - { - $id = $node->getAttribute("id"); - if ($id !== "") { - $this->_canvas->add_named_dest($id); - } - - if ($node->nodeName === "a") { - $name = $node->getAttribute("name"); - if ($name !== "") { - $this->_canvas->add_named_dest($name); - } - } - } - - /** - * Add a hyperlink if the element is an anchor element with `href` - * attribute. - * - * @param DOMElement $node - * @param float[] $borderBox - */ - protected function addHyperlink(DOMElement $node, array $borderBox): void - { - if ($node->nodeName === "a" && ($href = $node->getAttribute("href")) !== "") { - [$x, $y, $w, $h] = $borderBox; - $dompdf = $this->_dompdf; - $href = Helpers::build_url( - $dompdf->getProtocol(), - $dompdf->getBaseHost(), - $dompdf->getBasePath(), - $href, - $dompdf->getOptions()->getChroot() - ) ?? $href; - $this->_canvas->add_link($href, $x, $y, $w, $h); - } - } - - /** - * @param float[] $box - * @param array|string $color - * @param array $style - */ - protected function debugLayout(array $box, $color = "red", array $style = []): void - { - $this->_canvas->rectangle($box[0], $box[1], $box[2], $box[3], Color::parse($color), 0.1, $style); - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/Block.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/Block.php deleted file mode 100644 index ab2768d..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Renderer/Block.php +++ /dev/null @@ -1,81 +0,0 @@ -get_style(); - $node = $frame->get_node(); - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - [$x, $y, $w, $h] = $frame->get_border_box(); - - if ($node->nodeName === "body") { - // Margins should be fully resolved at this point - $mt = $style->margin_top; - $mb = $style->margin_bottom; - $h = $frame->get_containing_block("h") - $mt - $mb; - } - - $border_box = [$x, $y, $w, $h]; - - // Draw our background, border and content - $this->_render_background($frame, $border_box); - $this->_render_border($frame, $border_box); - $this->_render_outline($frame, $border_box); - - $this->addNamedDest($node); - $this->addHyperlink($node, $border_box); - $this->debugBlockLayout($frame, "red", false); - } - - /** - * @param Frame $frame - * @param array|string $color - * @param bool $lines - */ - protected function debugBlockLayout(Frame $frame, $color, bool $lines = false): void - { - $options = $this->_dompdf->getOptions(); - $debugLayout = $options->getDebugLayout(); - - if (!$debugLayout) { - return; - } - - if ($options->getDebugLayoutBlocks()) { - $this->debugLayout($frame->get_border_box(), $color); - - if ($options->getDebugLayoutPaddingBox()) { - $this->debugLayout($frame->get_padding_box(), $color, [0.5, 0.5]); - } - } - - if ($lines && $options->getDebugLayoutLines() && $frame instanceof BlockFrameDecorator) { - [$cx, , $cw] = $frame->get_content_box(); - - foreach ($frame->get_line_boxes() as $line) { - $lw = $cw - $line->left - $line->right; - $this->debugLayout([$cx + $line->left, $line->y, $lw, $line->h], "orange"); - } - } - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/Image.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/Image.php deleted file mode 100644 index 1373bb0..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Renderer/Image.php +++ /dev/null @@ -1,73 +0,0 @@ -get_style(); - $node = $frame->get_node(); - $border_box = $frame->get_border_box(); - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - // Render background & borders - $this->_render_background($frame, $border_box); - $this->_render_border($frame, $border_box); - $this->_render_outline($frame, $border_box); - - $content_box = $frame->get_content_box(); - [$x, $y, $w, $h] = $content_box; - - $src = $frame->get_image_url(); - - if (Cache::is_broken($src) && ($alt = $node->getAttribute("alt")) !== "") { - $font = $style->font_family; - $size = $style->font_size; - $word_spacing = $style->word_spacing; - $letter_spacing = $style->letter_spacing; - - $this->_canvas->text( - $x, - $y, - $alt, - $font, - $size, - $style->color, - $word_spacing, - $letter_spacing - ); - } elseif ($w > 0 && $h > 0) { - if ($style->has_border_radius()) { - [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box, $content_box); - $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl); - } - - $this->_canvas->image($src, $x, $y, $w, $h, $style->image_resolution); - - if ($style->has_border_radius()) { - $this->_canvas->clipping_end(); - } - } - - $this->addNamedDest($node); - $this->debugBlockLayout($frame, "blue"); - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/Inline.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/Inline.php deleted file mode 100644 index 5d9e284..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Renderer/Inline.php +++ /dev/null @@ -1,121 +0,0 @@ -get_first_child(); - while ($child && !$child->is_in_flow()) { - $child = $child->get_next_sibling(); - } - - if (!$child) { - return; // No children, no service - } - - $style = $frame->get_style(); - $node = $frame->get_node(); - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - // Draw background & border behind each child. To do this, we need to - // to figure out just how much space each child takes. Retrieve the - // position of the first child again, to account for text and vertical - // alignment - [$x, $y] = $child->get_position(); - [$w, $h] = $this->get_child_size($frame); - - [, , $cbw] = $frame->get_containing_block(); - $margin_left = $style->length_in_pt($style->margin_left, $cbw); - $pt = $style->length_in_pt($style->padding_top, $cbw); - $pb = $style->length_in_pt($style->padding_bottom, $cbw); - - // Make sure that border and background start inside the left margin - // Extend the drawn box by border and padding in vertical direction, as - // these do not affect layout - // FIXME: Using a small vertical offset of a fraction of the height here - // to work around the vertical position being slightly off in general - $x += $margin_left; - $y -= $style->border_top_width + $pt - ($h * 0.1); - $h += $style->border_top_width + $pt + $style->border_bottom_width + $pb; - - $border_box = [$x, $y, $w, $h]; - $this->_render_background($frame, $border_box); - $this->_render_border($frame, $border_box); - $this->_render_outline($frame, $border_box); - - $this->addNamedDest($node); - $this->addHyperlink($node, $border_box); - - $options = $this->_dompdf->getOptions(); - - if ($options->getDebugLayout() && $options->getDebugLayoutInline()) { - $this->debugLayout($border_box, "blue"); - - if ($options->getDebugLayoutPaddingBox()) { - $padding_box = [ - $x + $style->border_left_width, - $y + $style->border_top_width, - $w - $style->border_left_width - $style->border_right_width, - $h - $style->border_top_width - $style->border_bottom_width - ]; - $this->debugLayout($padding_box, "blue", [0.5, 0.5]); - } - } - } - - protected function get_child_size(Frame $frame): array - { - $w = 0.0; - $h = 0.0; - - foreach ($frame->get_children() as $child) { - if (!$child->is_in_flow()) { - continue; - } - - // Exclude trailing white space - if ($child->get_node()->nodeValue === " " - && $child->get_prev_sibling() && !$child->get_next_sibling() - ) { - break; - } - - $style = $child->get_style(); - $auto_width = $style->width === "auto"; - $auto_height = $style->height === "auto"; - [, , $child_w, $child_h] = $child->get_border_box(); - - if ($auto_width || $auto_height) { - [$child_w2, $child_h2] = $this->get_child_size($child); - - if ($auto_width) { - $child_w = $child_w2; - } - - if ($auto_height) { - $child_h = $child_h2; - } - } - - $w += $child_w; - $h = max($h, $child_h); - } - - return [$w, $h]; - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/ListBullet.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/ListBullet.php deleted file mode 100644 index 78051a8..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Renderer/ListBullet.php +++ /dev/null @@ -1,213 +0,0 @@ -get_parent(); - $style = $frame->get_style(); - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - // Don't render bullets twice if the list item was split - if ($li->is_split_off) { - return; - } - - $font_family = $style->font_family; - $font_size = $style->font_size; - $baseline = $this->_canvas->get_font_baseline($font_family, $font_size); - - // Handle list-style-image - // If list style image is requested but missing, fall back to predefined types - if ($frame instanceof ListBulletImage && !Cache::is_broken($img = $frame->get_image_url())) { - [$x, $y] = $frame->get_position(); - $w = $frame->get_width(); - $h = $frame->get_height(); - $y += $baseline - $h; - - $this->_canvas->image($img, $x, $y, $w, $h); - } else { - $bullet_style = $style->list_style_type; - - switch ($bullet_style) { - case "disc": - case "circle": - [$x, $y] = $frame->get_position(); - $offset = $font_size * ListBulletFrameDecorator::BULLET_OFFSET; - $r = ($font_size * ListBulletFrameDecorator::BULLET_SIZE) / 2; - $x += $r; - $y += $baseline - $r - $offset; - $o = $font_size * ListBulletFrameDecorator::BULLET_THICKNESS; - $this->_canvas->circle($x, $y, $r, $style->color, $o, null, $bullet_style !== "circle"); - break; - - case "square": - [$x, $y] = $frame->get_position(); - $offset = $font_size * ListBulletFrameDecorator::BULLET_OFFSET; - $w = $font_size * ListBulletFrameDecorator::BULLET_SIZE; - $y += $baseline - $w - $offset; - $this->_canvas->filled_rectangle($x, $y, $w, $w, $style->color); - break; - - default: - case "decimal": - case "decimal-leading-zero": - case "lower-alpha": - case "lower-latin": - case "lower-roman": - case "lower-greek": - case "upper-alpha": - case "upper-latin": - case "upper-roman": - $pad = null; - if ($bullet_style === "decimal-leading-zero") { - $pad = strlen($li->get_parent()->get_node()->getAttribute("dompdf-children-count")); - } - - $node = $frame->get_node(); - - if (!$node->hasAttribute("dompdf-counter")) { - return; - } - - $index = (int) $node->getAttribute("dompdf-counter"); - $text = $this->make_counter($index, $bullet_style, $pad); - - $word_spacing = $style->word_spacing; - $letter_spacing = $style->letter_spacing; - $text_width = $this->_dompdf->getFontMetrics()->getTextWidth($text, $font_family, $font_size, $word_spacing, $letter_spacing); - - [$x, $y] = $frame->get_position(); - // Correct for static frame width applied by positioner - $x += $frame->get_width() - $text_width; - - $this->_canvas->text($x, $y, $text, - $font_family, $font_size, - $style->color, $word_spacing, $letter_spacing); - break; - - case "none": - break; - } - } - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/TableCell.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/TableCell.php deleted file mode 100644 index fbf9178..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Renderer/TableCell.php +++ /dev/null @@ -1,189 +0,0 @@ -get_style(); - $node = $frame->get_node(); - - if (trim($node->nodeValue) === "" && $style->empty_cells === "hide") { - return; - } - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - $border_box = $frame->get_border_box(); - $table = Table::find_parent_table($frame); - if ($table === null) { - throw new Exception("Parent table not found for table cell"); - } - - if ($table->get_style()->border_collapse !== "collapse") { - $this->_render_background($frame, $border_box); - $this->_render_border($frame, $border_box); - $this->_render_outline($frame, $border_box); - } else { - // The collapsed case is slightly complicated... - - $cells = $table->get_cellmap()->get_spanned_cells($frame); - - if (is_null($cells)) { - return; - } - - // Render the background to the padding box, as the cells are - // rendered individually one after another, and we don't want the - // background to overlap an adjacent border - $padding_box = $frame->get_padding_box(); - - $this->_render_background($frame, $padding_box); - $this->_render_collapsed_border($frame, $table); - - // FIXME: Outline should be drawn over other cells - $this->_render_outline($frame, $border_box); - } - - $this->addNamedDest($node); - $this->addHyperlink($node, $border_box); - $this->debugBlockLayout($frame, "red", false); - } - - /** - * @param Frame $frame - * @param Table $table - */ - protected function _render_collapsed_border(Frame $frame, Table $table): void - { - $cellmap = $table->get_cellmap(); - $cells = $cellmap->get_spanned_cells($frame); - $num_rows = $cellmap->get_num_rows(); - $num_cols = $cellmap->get_num_cols(); - - [$table_x, $table_y] = $table->get_position(); - - // Determine the top row spanned by this cell - $i = $cells["rows"][0]; - $top_row = $cellmap->get_row($i); - - // Determine if this cell borders on the bottom of the table. If so, - // then we draw its bottom border. Otherwise the next row down will - // draw its top border instead. - if (in_array($num_rows - 1, $cells["rows"])) { - $draw_bottom = true; - $bottom_row = $cellmap->get_row($num_rows - 1); - } else { - $draw_bottom = false; - } - - // Draw the horizontal borders - foreach ($cells["columns"] as $j) { - $bp = $cellmap->get_border_properties($i, $j); - $col = $cellmap->get_column($j); - - $x = $table_x + $col["x"] - $bp["left"]["width"] / 2; - $y = $table_y + $top_row["y"] - $bp["top"]["width"] / 2; - $w = $col["used-width"] + ($bp["left"]["width"] + $bp["right"]["width"]) / 2; - - if ($bp["top"]["width"] > 0) { - $widths = [ - (float)$bp["top"]["width"], - (float)$bp["right"]["width"], - (float)$bp["bottom"]["width"], - (float)$bp["left"]["width"] - ]; - - $method = "_border_" . $bp["top"]["style"]; - $this->$method($x, $y, $w, $bp["top"]["color"], $widths, "top", "square"); - } - - if ($draw_bottom) { - $bp = $cellmap->get_border_properties($num_rows - 1, $j); - if ($bp["bottom"]["width"] <= 0) { - continue; - } - - $widths = [ - (float)$bp["top"]["width"], - (float)$bp["right"]["width"], - (float)$bp["bottom"]["width"], - (float)$bp["left"]["width"] - ]; - - $y = $table_y + $bottom_row["y"] + $bottom_row["height"] + $bp["bottom"]["width"] / 2; - - $method = "_border_" . $bp["bottom"]["style"]; - $this->$method($x, $y, $w, $bp["bottom"]["color"], $widths, "bottom", "square"); - } - } - - $j = $cells["columns"][0]; - $left_col = $cellmap->get_column($j); - - if (in_array($num_cols - 1, $cells["columns"])) { - $draw_right = true; - $right_col = $cellmap->get_column($num_cols - 1); - } else { - $draw_right = false; - } - - // Draw the vertical borders - foreach ($cells["rows"] as $i) { - $bp = $cellmap->get_border_properties($i, $j); - $row = $cellmap->get_row($i); - - $x = $table_x + $left_col["x"] - $bp["left"]["width"] / 2; - $y = $table_y + $row["y"] - $bp["top"]["width"] / 2; - $h = $row["height"] + ($bp["top"]["width"] + $bp["bottom"]["width"]) / 2; - - if ($bp["left"]["width"] > 0) { - $widths = [ - (float)$bp["top"]["width"], - (float)$bp["right"]["width"], - (float)$bp["bottom"]["width"], - (float)$bp["left"]["width"] - ]; - - $method = "_border_" . $bp["left"]["style"]; - $this->$method($x, $y, $h, $bp["left"]["color"], $widths, "left", "square"); - } - - if ($draw_right) { - $bp = $cellmap->get_border_properties($i, $num_cols - 1); - if ($bp["right"]["width"] <= 0) { - continue; - } - - $widths = [ - (float)$bp["top"]["width"], - (float)$bp["right"]["width"], - (float)$bp["bottom"]["width"], - (float)$bp["left"]["width"] - ]; - - $x = $table_x + $right_col["x"] + $right_col["used-width"] + $bp["right"]["width"] / 2; - - $method = "_border_" . $bp["right"]["style"]; - $this->$method($x, $y, $h, $bp["right"]["color"], $widths, "right", "square"); - } - } - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/TableRow.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/TableRow.php deleted file mode 100644 index b1608e8..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Renderer/TableRow.php +++ /dev/null @@ -1,40 +0,0 @@ -get_style(); - $node = $frame->get_node(); - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - $border_box = $frame->get_border_box(); - - // FIXME: Render background onto the area consisting of all spanned - // cells. In the separated border model, the border-spacing area should - // be left out. Currently, the background is inherited by the table - // cells instead, which does not handle transparent backgrounds and - // background images correctly. - // See https://www.w3.org/TR/CSS21/tables.html#table-layers - - $this->_render_outline($frame, $border_box); - - $this->addNamedDest($node); - $this->addHyperlink($node, $border_box); - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/TableRowGroup.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/TableRowGroup.php deleted file mode 100644 index eb5d23b..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Renderer/TableRowGroup.php +++ /dev/null @@ -1,40 +0,0 @@ -get_style(); - $node = $frame->get_node(); - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - $border_box = $frame->get_border_box(); - - // FIXME: Render background onto the area consisting of all spanned - // cells. In the separated border model, the border-spacing area should - // be left out. Currently, the background is inherited by the table - // cells instead, which does not handle transparent backgrounds and - // background images correctly. - // See https://www.w3.org/TR/CSS21/tables.html#table-layers - - $this->_render_outline($frame, $border_box); - - $this->addNamedDest($node); - $this->addHyperlink($node, $border_box); - } -} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/Text.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/Text.php deleted file mode 100644 index 656f3c9..0000000 --- a/dompdf/vendor/dompdf/dompdf/src/Renderer/Text.php +++ /dev/null @@ -1,161 +0,0 @@ -_canvas, "get_cpdf" ) - //- For cpdf these can and must stay 0, because font metrics are used directly. - //- For other renderers, if different values are wanted, separate the parameter sets. - // But $size and $size-$height seem to be accurate enough - - /** Relative to bottom of text, as fraction of height */ - const UNDERLINE_OFFSET = 0.0; - - /** Relative to top of text */ - const OVERLINE_OFFSET = 0.0; - - /** Relative to centre of text. */ - const LINETHROUGH_OFFSET = 0.0; - - /** How far to extend lines past either end, in pt */ - const DECO_EXTENSION = 0.0; - - /** - * @param \Dompdf\FrameDecorator\Text $frame - */ - function render(Frame $frame) - { - $style = $frame->get_style(); - $text = $frame->get_text(); - - if ($text === "") { - return; - } - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - [$x, $y] = $frame->get_position(); - $cb = $frame->get_containing_block(); - - $ml = $style->margin_left; - $pl = $style->padding_left; - $bl = $style->border_left_width; - $x += (float) $style->length_in_pt([$ml, $pl, $bl], $cb["w"]); - - $font = $style->font_family; - $size = $style->font_size; - $frame_font_size = $frame->get_dompdf()->getFontMetrics()->getFontHeight($font, $size); - $word_spacing = $frame->get_text_spacing() + $style->word_spacing; - $letter_spacing = $style->letter_spacing; - $width = (float) $style->width; - - /*$text = str_replace( - array("{PAGE_NUM}"), - array($this->_canvas->get_page_number()), - $text - );*/ - - $this->_canvas->text($x, $y, $text, - $font, $size, - $style->color, $word_spacing, $letter_spacing); - - $line = $frame->get_containing_line(); - - // FIXME Instead of using the tallest frame to position, - // the decoration, the text should be well placed - if (false && $line->tallest_frame) { - $base_frame = $line->tallest_frame; - $style = $base_frame->get_style(); - $size = $style->font_size; - } - - $line_thickness = $size * self::DECO_THICKNESS; - $underline_offset = $size * self::UNDERLINE_OFFSET; - $overline_offset = $size * self::OVERLINE_OFFSET; - $linethrough_offset = $size * self::LINETHROUGH_OFFSET; - $underline_position = -0.08; - - if ($this->_canvas instanceof CPDF) { - $cpdf_font = $this->_canvas->get_cpdf()->fonts[$style->font_family]; - - if (isset($cpdf_font["UnderlinePosition"])) { - $underline_position = $cpdf_font["UnderlinePosition"] / 1000; - } - - if (isset($cpdf_font["UnderlineThickness"])) { - $line_thickness = $size * ($cpdf_font["UnderlineThickness"] / 1000); - } - } - - $descent = $size * $underline_position; - $base = $frame_font_size; - - // Handle text decoration: - // http://www.w3.org/TR/CSS21/text.html#propdef-text-decoration - - // Draw all applicable text-decorations. Start with the root and work our way down. - $p = $frame; - $stack = []; - while ($p = $p->get_parent()) { - $stack[] = $p; - } - - while (isset($stack[0])) { - $f = array_pop($stack); - - if (($text_deco = $f->get_style()->text_decoration) === "none") { - continue; - } - - $deco_y = $y; //$line->y; - $color = $f->get_style()->color; - - switch ($text_deco) { - default: - continue 2; - - case "underline": - $deco_y += $base - $descent + $underline_offset + $line_thickness / 2; - break; - - case "overline": - $deco_y += $overline_offset + $line_thickness / 2; - break; - - case "line-through": - $deco_y += $base * 0.7 + $linethrough_offset; - break; - } - - $dx = 0; - $x1 = $x - self::DECO_EXTENSION; - $x2 = $x + $width + $dx + self::DECO_EXTENSION; - $this->_canvas->line($x1, $deco_y, $x2, $deco_y, $color, $line_thickness); - } - - $options = $this->_dompdf->getOptions(); - - if ($options->getDebugLayout() && $options->getDebugLayoutLines()) { - $fontMetrics = $this->_dompdf->getFontMetrics(); - $textWidth = $fontMetrics->getTextWidth($text, $font, $size, $word_spacing, $letter_spacing); - $this->debugLayout([$x, $y, $textWidth, $frame_font_size], "orange", [0.5, 0.5]); - } - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/AUTHORS.md b/dompdf/vendor/dompdf/php-font-lib/AUTHORS.md deleted file mode 100644 index 69b8f0b..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/AUTHORS.md +++ /dev/null @@ -1,17 +0,0 @@ -FontLib was designed and developed by Fabien Ménager. - -### Current Team - -* **Brian Sweeney** (maintainer) - -### Alumni - -* **Fabien Ménager** (creator) - -### Contributors -* **mondrake** -* [and many more...](https://github.com/dompdf/php-font-lib/graphs/contributors) - -### Thanks - -FontLib would not have been possible without strong community support. diff --git a/dompdf/vendor/dompdf/php-font-lib/LICENSE b/dompdf/vendor/dompdf/php-font-lib/LICENSE deleted file mode 100644 index bca992d..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/LICENSE +++ /dev/null @@ -1,456 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/README.md b/dompdf/vendor/dompdf/php-font-lib/README.md deleted file mode 100644 index df8edfe..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/README.md +++ /dev/null @@ -1,50 +0,0 @@ -[![PHPUnit tests](https://github.com/dompdf/php-font-lib/actions/workflows/phpunit.yml/badge.svg)](https://github.com/dompdf/php-font-lib/actions/workflows/phpunit.yml) - -# PHP Font Lib - -This library can be used to: - * Read TrueType, OpenType (with TrueType glyphs), WOFF font files - * Extract basic info (name, style, etc) - * Extract advanced info (horizontal metrics, glyph names, glyph shapes, etc) - * Make an Adobe Font Metrics (AFM) file from a font - -This project was initiated by the need to read font files in the [DOMPDF project](https://github.com/dompdf/dompdf). - -Usage Example -------------- - -### Base font information - -```php -$font = \FontLib\Font::load('fontfile.ttf'); -$font->parse(); // for getFontWeight() to work this call must be done first! -echo $font->getFontName() .'
'; -echo $font->getFontSubfamily() .'
'; -echo $font->getFontSubfamilyID() .'
'; -echo $font->getFontFullName() .'
'; -echo $font->getFontVersion() .'
'; -echo $font->getFontWeight() .'
'; -echo $font->getFontPostscriptName() .'
'; -$font->close(); -``` - -### Font Metrics Generation - -```php -$font = FontLib\Font::load('fontfile.ttf'); -$font->parse(); -$font->saveAdobeFontMetrics('fontfile.ufm'); -``` - -### Create a font subset - -```php -$font = FontLib\Font::load('fontfile.ttf'); -$font->parse(); -$font->setSubset("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ.:,;' (!?)+-*/== 1234567890"); // characters to include -$font->reduce(); -touch('fontfile.subset.ttf'); -$font->open('fontfile.subset.ttf', FontLib\BinaryStream::modeReadWrite); -$font->encode(array("OS/2")); -$font->close(); -``` diff --git a/dompdf/vendor/dompdf/php-font-lib/composer.json b/dompdf/vendor/dompdf/php-font-lib/composer.json deleted file mode 100644 index 934bb00..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/composer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "dompdf/php-font-lib", - "type": "library", - "description": "A library to read, parse, export and make subsets of different types of font files.", - "homepage": "https://github.com/dompdf/php-font-lib", - "license": "LGPL-2.1-or-later", - "authors": [ - { - "name": "The FontLib Community", - "homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md" - } - ], - "autoload": { - "psr-4": { - "FontLib\\": "src/FontLib" - } - }, - "autoload-dev": { - "psr-4": { - "FontLib\\Tests\\": "tests/FontLib" - } - }, - "config": { - "bin-dir": "bin" - }, - "require": { - "php": "^7.1 || ^8.0", - "ext-mbstring": "*" - }, - "require-dev": { - "symfony/phpunit-bridge" : "^3 || ^4 || ^5 || ^6" - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/adobe-standard-encoding.map b/dompdf/vendor/dompdf/php-font-lib/maps/adobe-standard-encoding.map deleted file mode 100644 index 230d4a1..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/adobe-standard-encoding.map +++ /dev/null @@ -1,231 +0,0 @@ -// Adobe Standard Encoding table for ttf2pt1 -// Thomas Henlich - -=20 U+0020 SPACE -=21 U+0021 EXCLAMATION MARK -=22 U+0022 QUOTATION MARK -=23 U+0023 NUMBER SIGN -=24 U+0024 DOLLAR SIGN -=25 U+0025 PERCENT SIGN -=26 U+0026 AMPERSAND -=27 U+2019 RIGHT SINGLE QUOTATION MARK -=28 U+0028 LEFT PARENTHESIS -=29 U+0029 RIGHT PARENTHESIS -=2A U+002A ASTERISK -=2B U+002B PLUS SIGN -=2C U+002C COMMA -=2D U+002D HYPHEN-MINUS -=2E U+002E FULL STOP -=2F U+002F SOLIDUS -=30 U+0030 DIGIT ZERO -=31 U+0031 DIGIT ONE -=32 U+0032 DIGIT TWO -=33 U+0033 DIGIT THREE -=34 U+0034 DIGIT FOUR -=35 U+0035 DIGIT FIVE -=36 U+0036 DIGIT SIX -=37 U+0037 DIGIT SEVEN -=38 U+0038 DIGIT EIGHT -=39 U+0039 DIGIT NINE -=3A U+003A COLON -=3B U+003B SEMICOLON -=3C U+003C LESS-THAN SIGN -=3D U+003D EQUALS SIGN -=3E U+003E GREATER-THAN SIGN -=3F U+003F QUESTION MARK -=40 U+0040 COMMERCIAL AT -=41 U+0041 LATIN CAPITAL LETTER A -=42 U+0042 LATIN CAPITAL LETTER B -=43 U+0043 LATIN CAPITAL LETTER C -=44 U+0044 LATIN CAPITAL LETTER D -=45 U+0045 LATIN CAPITAL LETTER E -=46 U+0046 LATIN CAPITAL LETTER F -=47 U+0047 LATIN CAPITAL LETTER G -=48 U+0048 LATIN CAPITAL LETTER H -=49 U+0049 LATIN CAPITAL LETTER I -=4A U+004A LATIN CAPITAL LETTER J -=4B U+004B LATIN CAPITAL LETTER K -=4C U+004C LATIN CAPITAL LETTER L -=4D U+004D LATIN CAPITAL LETTER M -=4E U+004E LATIN CAPITAL LETTER N -=4F U+004F LATIN CAPITAL LETTER O -=50 U+0050 LATIN CAPITAL LETTER P -=51 U+0051 LATIN CAPITAL LETTER Q -=52 U+0052 LATIN CAPITAL LETTER R -=53 U+0053 LATIN CAPITAL LETTER S -=54 U+0054 LATIN CAPITAL LETTER T -=55 U+0055 LATIN CAPITAL LETTER U -=56 U+0056 LATIN CAPITAL LETTER V -=57 U+0057 LATIN CAPITAL LETTER W -=58 U+0058 LATIN CAPITAL LETTER X -=59 U+0059 LATIN CAPITAL LETTER Y -=5A U+005A LATIN CAPITAL LETTER Z -=5B U+005B LEFT SQUARE BRACKET -=5C U+005C REVERSE SOLIDUS -=5D U+005D RIGHT SQUARE BRACKET -=5E U+005E CIRCUMFLEX ACCENT -=5F U+005F LOW LINE -=60 U+2018 LEFT SINGLE QUOTATION MARK -=61 U+0061 LATIN SMALL LETTER A -=62 U+0062 LATIN SMALL LETTER B -=63 U+0063 LATIN SMALL LETTER C -=64 U+0064 LATIN SMALL LETTER D -=65 U+0065 LATIN SMALL LETTER E -=66 U+0066 LATIN SMALL LETTER F -=67 U+0067 LATIN SMALL LETTER G -=68 U+0068 LATIN SMALL LETTER H -=69 U+0069 LATIN SMALL LETTER I -=6A U+006A LATIN SMALL LETTER J -=6B U+006B LATIN SMALL LETTER K -=6C U+006C LATIN SMALL LETTER L -=6D U+006D LATIN SMALL LETTER M -=6E U+006E LATIN SMALL LETTER N -=6F U+006F LATIN SMALL LETTER O -=70 U+0070 LATIN SMALL LETTER P -=71 U+0071 LATIN SMALL LETTER Q -=72 U+0072 LATIN SMALL LETTER R -=73 U+0073 LATIN SMALL LETTER S -=74 U+0074 LATIN SMALL LETTER T -=75 U+0075 LATIN SMALL LETTER U -=76 U+0076 LATIN SMALL LETTER V -=77 U+0077 LATIN SMALL LETTER W -=78 U+0078 LATIN SMALL LETTER X -=79 U+0079 LATIN SMALL LETTER Y -=7A U+007A LATIN SMALL LETTER Z -=7B U+007B LEFT CURLY BRACKET -=7C U+007C VERTICAL LINE -=7D U+007D RIGHT CURLY BRACKET -=7E U+007E TILDE -=A1 U+00A1 INVERTED EXCLAMATION MARK -=A2 U+00A2 CENT SIGN -=A3 U+00A3 POUND SIGN -=A4 U+2044 FRACTION SLASH -=A5 U+00A5 YEN SIGN -=A6 U+0192 LATIN SMALL LETTER F WITH HOOK -=A7 U+00A7 SECTION SIGN -=A8 U+00A4 CURRENCY SIGN -=A9 U+0027 APOSTROPHE -=AA U+201C LEFT DOUBLE QUOTATION MARK -=AB U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -=AC U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK -=AD U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -=AE U+FB01 LATIN SMALL LIGATURE FI -=AF U+FB02 LATIN SMALL LIGATURE FL -=B1 U+2013 EN DASH -=B2 U+2020 DAGGER -=B3 U+2021 DOUBLE DAGGER -=B4 U+00B7 MIDDLE DOT -=B6 U+00B6 PILCROW SIGN -=B7 U+2022 BULLET -=B8 U+201A SINGLE LOW-9 QUOTATION MARK -=B9 U+201E DOUBLE LOW-9 QUOTATION MARK -=BA U+201D RIGHT DOUBLE QUOTATION MARK -=BB U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -=BC U+2026 HORIZONTAL ELLIPSIS -=BD U+2030 PER MILLE SIGN -=BF U+00BF INVERTED QUESTION MARK -=C1 U+0060 GRAVE ACCENT -=C2 U+00B4 ACUTE ACCENT -=C3 U+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT -=C4 U+02DC SMALL TILDE -=C5 U+00AF MACRON -=C6 U+02D8 BREVE -=C7 U+02D9 DOT ABOVE -=C8 U+00A8 DIAERESIS -=CA U+02DA RING ABOVE -=CB U+00B8 CEDILLA -=CD U+02DD DOUBLE ACUTE ACCENT -=CE U+02DB OGONEK -=CF U+02C7 CARON -=D0 U+2014 EM DASH -=E1 U+00C6 LATIN CAPITAL LETTER AE -=E3 U+00AA FEMININE ORDINAL INDICATOR -=E8 U+0141 LATIN CAPITAL LETTER L WITH STROKE -=E9 U+00D8 LATIN CAPITAL LETTER O WITH STROKE -=EA U+0152 LATIN CAPITAL LIGATURE OE -=EB U+00BA MASCULINE ORDINAL INDICATOR -=F1 U+00E6 LATIN SMALL LETTER AE -=F5 U+0131 LATIN SMALL LETTER DOTLESS I -=F8 U+0142 LATIN SMALL LETTER L WITH STROKE -=F9 U+00F8 LATIN SMALL LETTER O WITH STROKE -=FA U+0153 LATIN SMALL LIGATURE OE -=FB U+00DF LATIN SMALL LETTER SHARP S - -// unencoded characters: -=100 U+00E7 LATIN SMALL LETTER C WITH CEDILLA -=101 U+00FF LATIN SMALL LETTER Y WITH DIAERESIS -=102 U+00E3 LATIN SMALL LETTER A WITH TILDE -=103 U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX -=104 U+00B3 SUPERSCRIPT THREE -=105 U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX -=106 U+00FE LATIN SMALL LETTER THORN -=107 U+00E8 LATIN SMALL LETTER E WITH GRAVE -=108 U+00B2 SUPERSCRIPT TWO -=109 U+00E9 LATIN SMALL LETTER E WITH ACUTE -=10A U+00F5 LATIN SMALL LETTER O WITH TILDE -=10B U+00C1 LATIN CAPITAL LETTER A WITH ACUTE -=10C U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX -=10D U+00FD LATIN SMALL LETTER Y WITH ACUTE -=10E U+00FC LATIN SMALL LETTER U WITH DIAERESIS -=10F U+00BE VULGAR FRACTION THREE QUARTERS -=110 U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX -=111 U+00D0 LATIN CAPITAL LETTER ETH -=112 U+00EB LATIN SMALL LETTER E WITH DIAERESIS -=113 U+00F9 LATIN SMALL LETTER U WITH GRAVE -=114 U+2122 TRADE MARK SIGN -=115 U+00F2 LATIN SMALL LETTER O WITH GRAVE -=116 U+0161 LATIN SMALL LETTER S WITH CARON -=117 U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS -=118 U+00FA LATIN SMALL LETTER U WITH ACUTE -=119 U+00E0 LATIN SMALL LETTER A WITH GRAVE -=11A U+00F1 LATIN SMALL LETTER N WITH TILDE -=11B U+00E5 LATIN SMALL LETTER A WITH RING ABOVE -=11C U+017E LATIN SMALL LETTER Z WITH CARON -=11D U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX -=11E U+00D1 LATIN CAPITAL LETTER N WITH TILDE -=11F U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX -=120 U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX -=121 U+00CD LATIN CAPITAL LETTER I WITH ACUTE -=122 U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA -=123 U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS -=124 U+0160 LATIN CAPITAL LETTER S WITH CARON -=125 U+00CC LATIN CAPITAL LETTER I WITH GRAVE -=126 U+00E4 LATIN SMALL LETTER A WITH DIAERESIS -=127 U+00D2 LATIN CAPITAL LETTER O WITH GRAVE -=128 U+00C8 LATIN CAPITAL LETTER E WITH GRAVE -=129 U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS -=12A U+00AE REGISTERED SIGN -=12B U+00D5 LATIN CAPITAL LETTER O WITH TILDE -=12C U+00BC VULGAR FRACTION ONE QUARTER -=12D U+00D9 LATIN CAPITAL LETTER U WITH GRAVE -=12E U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX -=12F U+00DE LATIN CAPITAL LETTER THORN -=130 U+00F7 DIVISION SIGN -=131 U+00C3 LATIN CAPITAL LETTER A WITH TILDE -=132 U+00DA LATIN CAPITAL LETTER U WITH ACUTE -=133 U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX -=134 U+00AC NOT SIGN -=135 U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE -=136 U+00EF LATIN SMALL LETTER I WITH DIAERESIS -=137 U+00ED LATIN SMALL LETTER I WITH ACUTE -=138 U+00E1 LATIN SMALL LETTER A WITH ACUTE -=139 U+00B1 PLUS-MINUS SIGN -=13A U+00D7 MULTIPLICATION SIGN -=13B U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS -=13C U+2212 MINUS SIGN -=13D U+00B9 SUPERSCRIPT ONE -=13E U+00C9 LATIN CAPITAL LETTER E WITH ACUTE -=13F U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX -=140 U+00A9 COPYRIGHT SIGN -=141 U+00C0 LATIN CAPITAL LETTER A WITH GRAVE -=142 U+00F6 LATIN SMALL LETTER O WITH DIAERESIS -=143 U+00F3 LATIN SMALL LETTER O WITH ACUTE -=144 U+00B0 DEGREE SIGN -=145 U+00EC LATIN SMALL LETTER I WITH GRAVE -=146 U+00B5 MICRO SIGN -=147 U+00D3 LATIN CAPITAL LETTER O WITH ACUTE -=148 U+00F0 LATIN SMALL LETTER ETH -=149 U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS -=14A U+00DD LATIN CAPITAL LETTER Y WITH ACUTE -=14B U+00A6 BROKEN BAR -=14C U+00BD VULGAR FRACTION ONE HALF diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1250.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1250.map deleted file mode 100644 index ec110af..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/cp1250.map +++ /dev/null @@ -1,251 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!89 U+2030 perthousand -!8A U+0160 Scaron -!8B U+2039 guilsinglleft -!8C U+015A Sacute -!8D U+0164 Tcaron -!8E U+017D Zcaron -!8F U+0179 Zacute -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!99 U+2122 trademark -!9A U+0161 scaron -!9B U+203A guilsinglright -!9C U+015B sacute -!9D U+0165 tcaron -!9E U+017E zcaron -!9F U+017A zacute -!A0 U+00A0 space -!A1 U+02C7 caron -!A2 U+02D8 breve -!A3 U+0141 Lslash -!A4 U+00A4 currency -!A5 U+0104 Aogonek -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+015E Scedilla -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+017B Zdotaccent -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+02DB ogonek -!B3 U+0142 lslash -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+0105 aogonek -!BA U+015F scedilla -!BB U+00BB guillemotright -!BC U+013D Lcaron -!BD U+02DD hungarumlaut -!BE U+013E lcaron -!BF U+017C zdotaccent -!C0 U+0154 Racute -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+0102 Abreve -!C4 U+00C4 Adieresis -!C5 U+0139 Lacute -!C6 U+0106 Cacute -!C7 U+00C7 Ccedilla -!C8 U+010C Ccaron -!C9 U+00C9 Eacute -!CA U+0118 Eogonek -!CB U+00CB Edieresis -!CC U+011A Ecaron -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+010E Dcaron -!D0 U+0110 Dcroat -!D1 U+0143 Nacute -!D2 U+0147 Ncaron -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+0150 Ohungarumlaut -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+0158 Rcaron -!D9 U+016E Uring -!DA U+00DA Uacute -!DB U+0170 Uhungarumlaut -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+0162 Tcommaaccent -!DF U+00DF germandbls -!E0 U+0155 racute -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+0103 abreve -!E4 U+00E4 adieresis -!E5 U+013A lacute -!E6 U+0107 cacute -!E7 U+00E7 ccedilla -!E8 U+010D ccaron -!E9 U+00E9 eacute -!EA U+0119 eogonek -!EB U+00EB edieresis -!EC U+011B ecaron -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+010F dcaron -!F0 U+0111 dcroat -!F1 U+0144 nacute -!F2 U+0148 ncaron -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+0151 ohungarumlaut -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+0159 rcaron -!F9 U+016F uring -!FA U+00FA uacute -!FB U+0171 uhungarumlaut -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+0163 tcommaaccent -!FF U+02D9 dotaccent diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1251.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1251.map deleted file mode 100644 index de6a198..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/cp1251.map +++ /dev/null @@ -1,255 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0402 afii10051 -!81 U+0403 afii10052 -!82 U+201A quotesinglbase -!83 U+0453 afii10100 -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+20AC Euro -!89 U+2030 perthousand -!8A U+0409 afii10058 -!8B U+2039 guilsinglleft -!8C U+040A afii10059 -!8D U+040C afii10061 -!8E U+040B afii10060 -!8F U+040F afii10145 -!90 U+0452 afii10099 -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!99 U+2122 trademark -!9A U+0459 afii10106 -!9B U+203A guilsinglright -!9C U+045A afii10107 -!9D U+045C afii10109 -!9E U+045B afii10108 -!9F U+045F afii10193 -!A0 U+00A0 space -!A1 U+040E afii10062 -!A2 U+045E afii10110 -!A3 U+0408 afii10057 -!A4 U+00A4 currency -!A5 U+0490 afii10050 -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+0401 afii10023 -!A9 U+00A9 copyright -!AA U+0404 afii10053 -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+0407 afii10056 -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+0406 afii10055 -!B3 U+0456 afii10103 -!B4 U+0491 afii10098 -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+0451 afii10071 -!B9 U+2116 afii61352 -!BA U+0454 afii10101 -!BB U+00BB guillemotright -!BC U+0458 afii10105 -!BD U+0405 afii10054 -!BE U+0455 afii10102 -!BF U+0457 afii10104 -!C0 U+0410 afii10017 -!C1 U+0411 afii10018 -!C2 U+0412 afii10019 -!C3 U+0413 afii10020 -!C4 U+0414 afii10021 -!C5 U+0415 afii10022 -!C6 U+0416 afii10024 -!C7 U+0417 afii10025 -!C8 U+0418 afii10026 -!C9 U+0419 afii10027 -!CA U+041A afii10028 -!CB U+041B afii10029 -!CC U+041C afii10030 -!CD U+041D afii10031 -!CE U+041E afii10032 -!CF U+041F afii10033 -!D0 U+0420 afii10034 -!D1 U+0421 afii10035 -!D2 U+0422 afii10036 -!D3 U+0423 afii10037 -!D4 U+0424 afii10038 -!D5 U+0425 afii10039 -!D6 U+0426 afii10040 -!D7 U+0427 afii10041 -!D8 U+0428 afii10042 -!D9 U+0429 afii10043 -!DA U+042A afii10044 -!DB U+042B afii10045 -!DC U+042C afii10046 -!DD U+042D afii10047 -!DE U+042E afii10048 -!DF U+042F afii10049 -!E0 U+0430 afii10065 -!E1 U+0431 afii10066 -!E2 U+0432 afii10067 -!E3 U+0433 afii10068 -!E4 U+0434 afii10069 -!E5 U+0435 afii10070 -!E6 U+0436 afii10072 -!E7 U+0437 afii10073 -!E8 U+0438 afii10074 -!E9 U+0439 afii10075 -!EA U+043A afii10076 -!EB U+043B afii10077 -!EC U+043C afii10078 -!ED U+043D afii10079 -!EE U+043E afii10080 -!EF U+043F afii10081 -!F0 U+0440 afii10082 -!F1 U+0441 afii10083 -!F2 U+0442 afii10084 -!F3 U+0443 afii10085 -!F4 U+0444 afii10086 -!F5 U+0445 afii10087 -!F6 U+0446 afii10088 -!F7 U+0447 afii10089 -!F8 U+0448 afii10090 -!F9 U+0449 afii10091 -!FA U+044A afii10092 -!FB U+044B afii10093 -!FC U+044C afii10094 -!FD U+044D afii10095 -!FE U+044E afii10096 -!FF U+044F afii10097 diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1252.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1252.map deleted file mode 100644 index dd490e5..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/cp1252.map +++ /dev/null @@ -1,251 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+02C6 circumflex -!89 U+2030 perthousand -!8A U+0160 Scaron -!8B U+2039 guilsinglleft -!8C U+0152 OE -!8E U+017D Zcaron -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!98 U+02DC tilde -!99 U+2122 trademark -!9A U+0161 scaron -!9B U+203A guilsinglright -!9C U+0153 oe -!9E U+017E zcaron -!9F U+0178 Ydieresis -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+00D0 Eth -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+00DE Thorn -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+00F0 eth -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+00FE thorn -!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1253.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1253.map deleted file mode 100644 index 4bd826f..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/cp1253.map +++ /dev/null @@ -1,239 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!89 U+2030 perthousand -!8B U+2039 guilsinglleft -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!99 U+2122 trademark -!9B U+203A guilsinglright -!A0 U+00A0 space -!A1 U+0385 dieresistonos -!A2 U+0386 Alphatonos -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+2015 afii00208 -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+0384 tonos -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+0388 Epsilontonos -!B9 U+0389 Etatonos -!BA U+038A Iotatonos -!BB U+00BB guillemotright -!BC U+038C Omicrontonos -!BD U+00BD onehalf -!BE U+038E Upsilontonos -!BF U+038F Omegatonos -!C0 U+0390 iotadieresistonos -!C1 U+0391 Alpha -!C2 U+0392 Beta -!C3 U+0393 Gamma -!C4 U+0394 Delta -!C5 U+0395 Epsilon -!C6 U+0396 Zeta -!C7 U+0397 Eta -!C8 U+0398 Theta -!C9 U+0399 Iota -!CA U+039A Kappa -!CB U+039B Lambda -!CC U+039C Mu -!CD U+039D Nu -!CE U+039E Xi -!CF U+039F Omicron -!D0 U+03A0 Pi -!D1 U+03A1 Rho -!D3 U+03A3 Sigma -!D4 U+03A4 Tau -!D5 U+03A5 Upsilon -!D6 U+03A6 Phi -!D7 U+03A7 Chi -!D8 U+03A8 Psi -!D9 U+03A9 Omega -!DA U+03AA Iotadieresis -!DB U+03AB Upsilondieresis -!DC U+03AC alphatonos -!DD U+03AD epsilontonos -!DE U+03AE etatonos -!DF U+03AF iotatonos -!E0 U+03B0 upsilondieresistonos -!E1 U+03B1 alpha -!E2 U+03B2 beta -!E3 U+03B3 gamma -!E4 U+03B4 delta -!E5 U+03B5 epsilon -!E6 U+03B6 zeta -!E7 U+03B7 eta -!E8 U+03B8 theta -!E9 U+03B9 iota -!EA U+03BA kappa -!EB U+03BB lambda -!EC U+03BC mu -!ED U+03BD nu -!EE U+03BE xi -!EF U+03BF omicron -!F0 U+03C0 pi -!F1 U+03C1 rho -!F2 U+03C2 sigma1 -!F3 U+03C3 sigma -!F4 U+03C4 tau -!F5 U+03C5 upsilon -!F6 U+03C6 phi -!F7 U+03C7 chi -!F8 U+03C8 psi -!F9 U+03C9 omega -!FA U+03CA iotadieresis -!FB U+03CB upsilondieresis -!FC U+03CC omicrontonos -!FD U+03CD upsilontonos -!FE U+03CE omegatonos diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1254.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1254.map deleted file mode 100644 index 829473b..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/cp1254.map +++ /dev/null @@ -1,249 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+02C6 circumflex -!89 U+2030 perthousand -!8A U+0160 Scaron -!8B U+2039 guilsinglleft -!8C U+0152 OE -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!98 U+02DC tilde -!99 U+2122 trademark -!9A U+0161 scaron -!9B U+203A guilsinglright -!9C U+0153 oe -!9F U+0178 Ydieresis -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+011E Gbreve -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+0130 Idotaccent -!DE U+015E Scedilla -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+011F gbreve -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+0131 dotlessi -!FE U+015F scedilla -!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1255.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1255.map deleted file mode 100644 index 079e10c..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/cp1255.map +++ /dev/null @@ -1,233 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+02C6 circumflex -!89 U+2030 perthousand -!8B U+2039 guilsinglleft -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!98 U+02DC tilde -!99 U+2122 trademark -!9B U+203A guilsinglright -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+20AA afii57636 -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00D7 multiply -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD sfthyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 middot -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00F7 divide -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+05B0 afii57799 -!C1 U+05B1 afii57801 -!C2 U+05B2 afii57800 -!C3 U+05B3 afii57802 -!C4 U+05B4 afii57793 -!C5 U+05B5 afii57794 -!C6 U+05B6 afii57795 -!C7 U+05B7 afii57798 -!C8 U+05B8 afii57797 -!C9 U+05B9 afii57806 -!CB U+05BB afii57796 -!CC U+05BC afii57807 -!CD U+05BD afii57839 -!CE U+05BE afii57645 -!CF U+05BF afii57841 -!D0 U+05C0 afii57842 -!D1 U+05C1 afii57804 -!D2 U+05C2 afii57803 -!D3 U+05C3 afii57658 -!D4 U+05F0 afii57716 -!D5 U+05F1 afii57717 -!D6 U+05F2 afii57718 -!D7 U+05F3 gereshhebrew -!D8 U+05F4 gershayimhebrew -!E0 U+05D0 afii57664 -!E1 U+05D1 afii57665 -!E2 U+05D2 afii57666 -!E3 U+05D3 afii57667 -!E4 U+05D4 afii57668 -!E5 U+05D5 afii57669 -!E6 U+05D6 afii57670 -!E7 U+05D7 afii57671 -!E8 U+05D8 afii57672 -!E9 U+05D9 afii57673 -!EA U+05DA afii57674 -!EB U+05DB afii57675 -!EC U+05DC afii57676 -!ED U+05DD afii57677 -!EE U+05DE afii57678 -!EF U+05DF afii57679 -!F0 U+05E0 afii57680 -!F1 U+05E1 afii57681 -!F2 U+05E2 afii57682 -!F3 U+05E3 afii57683 -!F4 U+05E4 afii57684 -!F5 U+05E5 afii57685 -!F6 U+05E6 afii57686 -!F7 U+05E7 afii57687 -!F8 U+05E8 afii57688 -!F9 U+05E9 afii57689 -!FA U+05EA afii57690 -!FD U+200E afii299 -!FE U+200F afii300 diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1257.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1257.map deleted file mode 100644 index 2f2ecfa..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/cp1257.map +++ /dev/null @@ -1,244 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!89 U+2030 perthousand -!8B U+2039 guilsinglleft -!8D U+00A8 dieresis -!8E U+02C7 caron -!8F U+00B8 cedilla -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!99 U+2122 trademark -!9B U+203A guilsinglright -!9D U+00AF macron -!9E U+02DB ogonek -!A0 U+00A0 space -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00D8 Oslash -!A9 U+00A9 copyright -!AA U+0156 Rcommaaccent -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00C6 AE -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00F8 oslash -!B9 U+00B9 onesuperior -!BA U+0157 rcommaaccent -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00E6 ae -!C0 U+0104 Aogonek -!C1 U+012E Iogonek -!C2 U+0100 Amacron -!C3 U+0106 Cacute -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+0118 Eogonek -!C7 U+0112 Emacron -!C8 U+010C Ccaron -!C9 U+00C9 Eacute -!CA U+0179 Zacute -!CB U+0116 Edotaccent -!CC U+0122 Gcommaaccent -!CD U+0136 Kcommaaccent -!CE U+012A Imacron -!CF U+013B Lcommaaccent -!D0 U+0160 Scaron -!D1 U+0143 Nacute -!D2 U+0145 Ncommaaccent -!D3 U+00D3 Oacute -!D4 U+014C Omacron -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+0172 Uogonek -!D9 U+0141 Lslash -!DA U+015A Sacute -!DB U+016A Umacron -!DC U+00DC Udieresis -!DD U+017B Zdotaccent -!DE U+017D Zcaron -!DF U+00DF germandbls -!E0 U+0105 aogonek -!E1 U+012F iogonek -!E2 U+0101 amacron -!E3 U+0107 cacute -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+0119 eogonek -!E7 U+0113 emacron -!E8 U+010D ccaron -!E9 U+00E9 eacute -!EA U+017A zacute -!EB U+0117 edotaccent -!EC U+0123 gcommaaccent -!ED U+0137 kcommaaccent -!EE U+012B imacron -!EF U+013C lcommaaccent -!F0 U+0161 scaron -!F1 U+0144 nacute -!F2 U+0146 ncommaaccent -!F3 U+00F3 oacute -!F4 U+014D omacron -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+0173 uogonek -!F9 U+0142 lslash -!FA U+015B sacute -!FB U+016B umacron -!FC U+00FC udieresis -!FD U+017C zdotaccent -!FE U+017E zcaron -!FF U+02D9 dotaccent diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1258.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1258.map deleted file mode 100644 index fed915f..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/cp1258.map +++ /dev/null @@ -1,247 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+02C6 circumflex -!89 U+2030 perthousand -!8B U+2039 guilsinglleft -!8C U+0152 OE -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!98 U+02DC tilde -!99 U+2122 trademark -!9B U+203A guilsinglright -!9C U+0153 oe -!9F U+0178 Ydieresis -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+0102 Abreve -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+0300 gravecomb -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+0110 Dcroat -!D1 U+00D1 Ntilde -!D2 U+0309 hookabovecomb -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+01A0 Ohorn -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+01AF Uhorn -!DE U+0303 tildecomb -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+0103 abreve -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+0301 acutecomb -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+0111 dcroat -!F1 U+00F1 ntilde -!F2 U+0323 dotbelowcomb -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+01A1 ohorn -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+01B0 uhorn -!FE U+20AB dong -!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp874.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp874.map deleted file mode 100644 index 1006e6b..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/cp874.map +++ /dev/null @@ -1,225 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!85 U+2026 ellipsis -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!A0 U+00A0 space -!A1 U+0E01 kokaithai -!A2 U+0E02 khokhaithai -!A3 U+0E03 khokhuatthai -!A4 U+0E04 khokhwaithai -!A5 U+0E05 khokhonthai -!A6 U+0E06 khorakhangthai -!A7 U+0E07 ngonguthai -!A8 U+0E08 chochanthai -!A9 U+0E09 chochingthai -!AA U+0E0A chochangthai -!AB U+0E0B sosothai -!AC U+0E0C chochoethai -!AD U+0E0D yoyingthai -!AE U+0E0E dochadathai -!AF U+0E0F topatakthai -!B0 U+0E10 thothanthai -!B1 U+0E11 thonangmonthothai -!B2 U+0E12 thophuthaothai -!B3 U+0E13 nonenthai -!B4 U+0E14 dodekthai -!B5 U+0E15 totaothai -!B6 U+0E16 thothungthai -!B7 U+0E17 thothahanthai -!B8 U+0E18 thothongthai -!B9 U+0E19 nonuthai -!BA U+0E1A bobaimaithai -!BB U+0E1B poplathai -!BC U+0E1C phophungthai -!BD U+0E1D fofathai -!BE U+0E1E phophanthai -!BF U+0E1F fofanthai -!C0 U+0E20 phosamphaothai -!C1 U+0E21 momathai -!C2 U+0E22 yoyakthai -!C3 U+0E23 roruathai -!C4 U+0E24 ruthai -!C5 U+0E25 lolingthai -!C6 U+0E26 luthai -!C7 U+0E27 wowaenthai -!C8 U+0E28 sosalathai -!C9 U+0E29 sorusithai -!CA U+0E2A sosuathai -!CB U+0E2B hohipthai -!CC U+0E2C lochulathai -!CD U+0E2D oangthai -!CE U+0E2E honokhukthai -!CF U+0E2F paiyannoithai -!D0 U+0E30 saraathai -!D1 U+0E31 maihanakatthai -!D2 U+0E32 saraaathai -!D3 U+0E33 saraamthai -!D4 U+0E34 saraithai -!D5 U+0E35 saraiithai -!D6 U+0E36 sarauethai -!D7 U+0E37 saraueethai -!D8 U+0E38 sarauthai -!D9 U+0E39 sarauuthai -!DA U+0E3A phinthuthai -!DF U+0E3F bahtthai -!E0 U+0E40 saraethai -!E1 U+0E41 saraaethai -!E2 U+0E42 saraothai -!E3 U+0E43 saraaimaimuanthai -!E4 U+0E44 saraaimaimalaithai -!E5 U+0E45 lakkhangyaothai -!E6 U+0E46 maiyamokthai -!E7 U+0E47 maitaikhuthai -!E8 U+0E48 maiekthai -!E9 U+0E49 maithothai -!EA U+0E4A maitrithai -!EB U+0E4B maichattawathai -!EC U+0E4C thanthakhatthai -!ED U+0E4D nikhahitthai -!EE U+0E4E yamakkanthai -!EF U+0E4F fongmanthai -!F0 U+0E50 zerothai -!F1 U+0E51 onethai -!F2 U+0E52 twothai -!F3 U+0E53 threethai -!F4 U+0E54 fourthai -!F5 U+0E55 fivethai -!F6 U+0E56 sixthai -!F7 U+0E57 seventhai -!F8 U+0E58 eightthai -!F9 U+0E59 ninethai -!FA U+0E5A angkhankhuthai -!FB U+0E5B khomutthai diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-1.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-1.map deleted file mode 100644 index 61740a3..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-1.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+00D0 Eth -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+00DE Thorn -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+00F0 eth -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+00FE thorn -!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-11.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-11.map deleted file mode 100644 index 9168812..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-11.map +++ /dev/null @@ -1,248 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0E01 kokaithai -!A2 U+0E02 khokhaithai -!A3 U+0E03 khokhuatthai -!A4 U+0E04 khokhwaithai -!A5 U+0E05 khokhonthai -!A6 U+0E06 khorakhangthai -!A7 U+0E07 ngonguthai -!A8 U+0E08 chochanthai -!A9 U+0E09 chochingthai -!AA U+0E0A chochangthai -!AB U+0E0B sosothai -!AC U+0E0C chochoethai -!AD U+0E0D yoyingthai -!AE U+0E0E dochadathai -!AF U+0E0F topatakthai -!B0 U+0E10 thothanthai -!B1 U+0E11 thonangmonthothai -!B2 U+0E12 thophuthaothai -!B3 U+0E13 nonenthai -!B4 U+0E14 dodekthai -!B5 U+0E15 totaothai -!B6 U+0E16 thothungthai -!B7 U+0E17 thothahanthai -!B8 U+0E18 thothongthai -!B9 U+0E19 nonuthai -!BA U+0E1A bobaimaithai -!BB U+0E1B poplathai -!BC U+0E1C phophungthai -!BD U+0E1D fofathai -!BE U+0E1E phophanthai -!BF U+0E1F fofanthai -!C0 U+0E20 phosamphaothai -!C1 U+0E21 momathai -!C2 U+0E22 yoyakthai -!C3 U+0E23 roruathai -!C4 U+0E24 ruthai -!C5 U+0E25 lolingthai -!C6 U+0E26 luthai -!C7 U+0E27 wowaenthai -!C8 U+0E28 sosalathai -!C9 U+0E29 sorusithai -!CA U+0E2A sosuathai -!CB U+0E2B hohipthai -!CC U+0E2C lochulathai -!CD U+0E2D oangthai -!CE U+0E2E honokhukthai -!CF U+0E2F paiyannoithai -!D0 U+0E30 saraathai -!D1 U+0E31 maihanakatthai -!D2 U+0E32 saraaathai -!D3 U+0E33 saraamthai -!D4 U+0E34 saraithai -!D5 U+0E35 saraiithai -!D6 U+0E36 sarauethai -!D7 U+0E37 saraueethai -!D8 U+0E38 sarauthai -!D9 U+0E39 sarauuthai -!DA U+0E3A phinthuthai -!DF U+0E3F bahtthai -!E0 U+0E40 saraethai -!E1 U+0E41 saraaethai -!E2 U+0E42 saraothai -!E3 U+0E43 saraaimaimuanthai -!E4 U+0E44 saraaimaimalaithai -!E5 U+0E45 lakkhangyaothai -!E6 U+0E46 maiyamokthai -!E7 U+0E47 maitaikhuthai -!E8 U+0E48 maiekthai -!E9 U+0E49 maithothai -!EA U+0E4A maitrithai -!EB U+0E4B maichattawathai -!EC U+0E4C thanthakhatthai -!ED U+0E4D nikhahitthai -!EE U+0E4E yamakkanthai -!EF U+0E4F fongmanthai -!F0 U+0E50 zerothai -!F1 U+0E51 onethai -!F2 U+0E52 twothai -!F3 U+0E53 threethai -!F4 U+0E54 fourthai -!F5 U+0E55 fivethai -!F6 U+0E56 sixthai -!F7 U+0E57 seventhai -!F8 U+0E58 eightthai -!F9 U+0E59 ninethai -!FA U+0E5A angkhankhuthai -!FB U+0E5B khomutthai diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-15.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-15.map deleted file mode 100644 index 6c2b571..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-15.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+20AC Euro -!A5 U+00A5 yen -!A6 U+0160 Scaron -!A7 U+00A7 section -!A8 U+0161 scaron -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+017D Zcaron -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+017E zcaron -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+0152 OE -!BD U+0153 oe -!BE U+0178 Ydieresis -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+00D0 Eth -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+00DE Thorn -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+00F0 eth -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+00FE thorn -!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-16.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-16.map deleted file mode 100644 index 202c8fe..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-16.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0104 Aogonek -!A2 U+0105 aogonek -!A3 U+0141 Lslash -!A4 U+20AC Euro -!A5 U+201E quotedblbase -!A6 U+0160 Scaron -!A7 U+00A7 section -!A8 U+0161 scaron -!A9 U+00A9 copyright -!AA U+0218 Scommaaccent -!AB U+00AB guillemotleft -!AC U+0179 Zacute -!AD U+00AD hyphen -!AE U+017A zacute -!AF U+017B Zdotaccent -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+010C Ccaron -!B3 U+0142 lslash -!B4 U+017D Zcaron -!B5 U+201D quotedblright -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+017E zcaron -!B9 U+010D ccaron -!BA U+0219 scommaaccent -!BB U+00BB guillemotright -!BC U+0152 OE -!BD U+0153 oe -!BE U+0178 Ydieresis -!BF U+017C zdotaccent -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+0102 Abreve -!C4 U+00C4 Adieresis -!C5 U+0106 Cacute -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+0110 Dcroat -!D1 U+0143 Nacute -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+0150 Ohungarumlaut -!D6 U+00D6 Odieresis -!D7 U+015A Sacute -!D8 U+0170 Uhungarumlaut -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+0118 Eogonek -!DE U+021A Tcommaaccent -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+0103 abreve -!E4 U+00E4 adieresis -!E5 U+0107 cacute -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+0111 dcroat -!F1 U+0144 nacute -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+0151 ohungarumlaut -!F6 U+00F6 odieresis -!F7 U+015B sacute -!F8 U+0171 uhungarumlaut -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+0119 eogonek -!FE U+021B tcommaaccent -!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-2.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-2.map deleted file mode 100644 index 65ae09f..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-2.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0104 Aogonek -!A2 U+02D8 breve -!A3 U+0141 Lslash -!A4 U+00A4 currency -!A5 U+013D Lcaron -!A6 U+015A Sacute -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+0160 Scaron -!AA U+015E Scedilla -!AB U+0164 Tcaron -!AC U+0179 Zacute -!AD U+00AD hyphen -!AE U+017D Zcaron -!AF U+017B Zdotaccent -!B0 U+00B0 degree -!B1 U+0105 aogonek -!B2 U+02DB ogonek -!B3 U+0142 lslash -!B4 U+00B4 acute -!B5 U+013E lcaron -!B6 U+015B sacute -!B7 U+02C7 caron -!B8 U+00B8 cedilla -!B9 U+0161 scaron -!BA U+015F scedilla -!BB U+0165 tcaron -!BC U+017A zacute -!BD U+02DD hungarumlaut -!BE U+017E zcaron -!BF U+017C zdotaccent -!C0 U+0154 Racute -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+0102 Abreve -!C4 U+00C4 Adieresis -!C5 U+0139 Lacute -!C6 U+0106 Cacute -!C7 U+00C7 Ccedilla -!C8 U+010C Ccaron -!C9 U+00C9 Eacute -!CA U+0118 Eogonek -!CB U+00CB Edieresis -!CC U+011A Ecaron -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+010E Dcaron -!D0 U+0110 Dcroat -!D1 U+0143 Nacute -!D2 U+0147 Ncaron -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+0150 Ohungarumlaut -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+0158 Rcaron -!D9 U+016E Uring -!DA U+00DA Uacute -!DB U+0170 Uhungarumlaut -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+0162 Tcommaaccent -!DF U+00DF germandbls -!E0 U+0155 racute -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+0103 abreve -!E4 U+00E4 adieresis -!E5 U+013A lacute -!E6 U+0107 cacute -!E7 U+00E7 ccedilla -!E8 U+010D ccaron -!E9 U+00E9 eacute -!EA U+0119 eogonek -!EB U+00EB edieresis -!EC U+011B ecaron -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+010F dcaron -!F0 U+0111 dcroat -!F1 U+0144 nacute -!F2 U+0148 ncaron -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+0151 ohungarumlaut -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+0159 rcaron -!F9 U+016F uring -!FA U+00FA uacute -!FB U+0171 uhungarumlaut -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+0163 tcommaaccent -!FF U+02D9 dotaccent diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-4.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-4.map deleted file mode 100644 index a7d87bf..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-4.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0104 Aogonek -!A2 U+0138 kgreenlandic -!A3 U+0156 Rcommaaccent -!A4 U+00A4 currency -!A5 U+0128 Itilde -!A6 U+013B Lcommaaccent -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+0160 Scaron -!AA U+0112 Emacron -!AB U+0122 Gcommaaccent -!AC U+0166 Tbar -!AD U+00AD hyphen -!AE U+017D Zcaron -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+0105 aogonek -!B2 U+02DB ogonek -!B3 U+0157 rcommaaccent -!B4 U+00B4 acute -!B5 U+0129 itilde -!B6 U+013C lcommaaccent -!B7 U+02C7 caron -!B8 U+00B8 cedilla -!B9 U+0161 scaron -!BA U+0113 emacron -!BB U+0123 gcommaaccent -!BC U+0167 tbar -!BD U+014A Eng -!BE U+017E zcaron -!BF U+014B eng -!C0 U+0100 Amacron -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+012E Iogonek -!C8 U+010C Ccaron -!C9 U+00C9 Eacute -!CA U+0118 Eogonek -!CB U+00CB Edieresis -!CC U+0116 Edotaccent -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+012A Imacron -!D0 U+0110 Dcroat -!D1 U+0145 Ncommaaccent -!D2 U+014C Omacron -!D3 U+0136 Kcommaaccent -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+0172 Uogonek -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+0168 Utilde -!DE U+016A Umacron -!DF U+00DF germandbls -!E0 U+0101 amacron -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+012F iogonek -!E8 U+010D ccaron -!E9 U+00E9 eacute -!EA U+0119 eogonek -!EB U+00EB edieresis -!EC U+0117 edotaccent -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+012B imacron -!F0 U+0111 dcroat -!F1 U+0146 ncommaaccent -!F2 U+014D omacron -!F3 U+0137 kcommaaccent -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+0173 uogonek -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+0169 utilde -!FE U+016B umacron -!FF U+02D9 dotaccent diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-5.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-5.map deleted file mode 100644 index f9cd4ed..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-5.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0401 afii10023 -!A2 U+0402 afii10051 -!A3 U+0403 afii10052 -!A4 U+0404 afii10053 -!A5 U+0405 afii10054 -!A6 U+0406 afii10055 -!A7 U+0407 afii10056 -!A8 U+0408 afii10057 -!A9 U+0409 afii10058 -!AA U+040A afii10059 -!AB U+040B afii10060 -!AC U+040C afii10061 -!AD U+00AD hyphen -!AE U+040E afii10062 -!AF U+040F afii10145 -!B0 U+0410 afii10017 -!B1 U+0411 afii10018 -!B2 U+0412 afii10019 -!B3 U+0413 afii10020 -!B4 U+0414 afii10021 -!B5 U+0415 afii10022 -!B6 U+0416 afii10024 -!B7 U+0417 afii10025 -!B8 U+0418 afii10026 -!B9 U+0419 afii10027 -!BA U+041A afii10028 -!BB U+041B afii10029 -!BC U+041C afii10030 -!BD U+041D afii10031 -!BE U+041E afii10032 -!BF U+041F afii10033 -!C0 U+0420 afii10034 -!C1 U+0421 afii10035 -!C2 U+0422 afii10036 -!C3 U+0423 afii10037 -!C4 U+0424 afii10038 -!C5 U+0425 afii10039 -!C6 U+0426 afii10040 -!C7 U+0427 afii10041 -!C8 U+0428 afii10042 -!C9 U+0429 afii10043 -!CA U+042A afii10044 -!CB U+042B afii10045 -!CC U+042C afii10046 -!CD U+042D afii10047 -!CE U+042E afii10048 -!CF U+042F afii10049 -!D0 U+0430 afii10065 -!D1 U+0431 afii10066 -!D2 U+0432 afii10067 -!D3 U+0433 afii10068 -!D4 U+0434 afii10069 -!D5 U+0435 afii10070 -!D6 U+0436 afii10072 -!D7 U+0437 afii10073 -!D8 U+0438 afii10074 -!D9 U+0439 afii10075 -!DA U+043A afii10076 -!DB U+043B afii10077 -!DC U+043C afii10078 -!DD U+043D afii10079 -!DE U+043E afii10080 -!DF U+043F afii10081 -!E0 U+0440 afii10082 -!E1 U+0441 afii10083 -!E2 U+0442 afii10084 -!E3 U+0443 afii10085 -!E4 U+0444 afii10086 -!E5 U+0445 afii10087 -!E6 U+0446 afii10088 -!E7 U+0447 afii10089 -!E8 U+0448 afii10090 -!E9 U+0449 afii10091 -!EA U+044A afii10092 -!EB U+044B afii10093 -!EC U+044C afii10094 -!ED U+044D afii10095 -!EE U+044E afii10096 -!EF U+044F afii10097 -!F0 U+2116 afii61352 -!F1 U+0451 afii10071 -!F2 U+0452 afii10099 -!F3 U+0453 afii10100 -!F4 U+0454 afii10101 -!F5 U+0455 afii10102 -!F6 U+0456 afii10103 -!F7 U+0457 afii10104 -!F8 U+0458 afii10105 -!F9 U+0459 afii10106 -!FA U+045A afii10107 -!FB U+045B afii10108 -!FC U+045C afii10109 -!FD U+00A7 section -!FE U+045E afii10110 -!FF U+045F afii10193 diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-7.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-7.map deleted file mode 100644 index e163796..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-7.map +++ /dev/null @@ -1,250 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+2018 quoteleft -!A2 U+2019 quoteright -!A3 U+00A3 sterling -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AF U+2015 afii00208 -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+0384 tonos -!B5 U+0385 dieresistonos -!B6 U+0386 Alphatonos -!B7 U+00B7 periodcentered -!B8 U+0388 Epsilontonos -!B9 U+0389 Etatonos -!BA U+038A Iotatonos -!BB U+00BB guillemotright -!BC U+038C Omicrontonos -!BD U+00BD onehalf -!BE U+038E Upsilontonos -!BF U+038F Omegatonos -!C0 U+0390 iotadieresistonos -!C1 U+0391 Alpha -!C2 U+0392 Beta -!C3 U+0393 Gamma -!C4 U+0394 Delta -!C5 U+0395 Epsilon -!C6 U+0396 Zeta -!C7 U+0397 Eta -!C8 U+0398 Theta -!C9 U+0399 Iota -!CA U+039A Kappa -!CB U+039B Lambda -!CC U+039C Mu -!CD U+039D Nu -!CE U+039E Xi -!CF U+039F Omicron -!D0 U+03A0 Pi -!D1 U+03A1 Rho -!D3 U+03A3 Sigma -!D4 U+03A4 Tau -!D5 U+03A5 Upsilon -!D6 U+03A6 Phi -!D7 U+03A7 Chi -!D8 U+03A8 Psi -!D9 U+03A9 Omega -!DA U+03AA Iotadieresis -!DB U+03AB Upsilondieresis -!DC U+03AC alphatonos -!DD U+03AD epsilontonos -!DE U+03AE etatonos -!DF U+03AF iotatonos -!E0 U+03B0 upsilondieresistonos -!E1 U+03B1 alpha -!E2 U+03B2 beta -!E3 U+03B3 gamma -!E4 U+03B4 delta -!E5 U+03B5 epsilon -!E6 U+03B6 zeta -!E7 U+03B7 eta -!E8 U+03B8 theta -!E9 U+03B9 iota -!EA U+03BA kappa -!EB U+03BB lambda -!EC U+03BC mu -!ED U+03BD nu -!EE U+03BE xi -!EF U+03BF omicron -!F0 U+03C0 pi -!F1 U+03C1 rho -!F2 U+03C2 sigma1 -!F3 U+03C3 sigma -!F4 U+03C4 tau -!F5 U+03C5 upsilon -!F6 U+03C6 phi -!F7 U+03C7 chi -!F8 U+03C8 psi -!F9 U+03C9 omega -!FA U+03CA iotadieresis -!FB U+03CB upsilondieresis -!FC U+03CC omicrontonos -!FD U+03CD upsilontonos -!FE U+03CE omegatonos diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-9.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-9.map deleted file mode 100644 index 48c123a..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-9.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+011E Gbreve -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+0130 Idotaccent -!DE U+015E Scedilla -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+011F gbreve -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+0131 dotlessi -!FE U+015F scedilla -!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/koi8-r.map b/dompdf/vendor/dompdf/php-font-lib/maps/koi8-r.map deleted file mode 100644 index 6ad5d05..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/koi8-r.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+2500 SF100000 -!81 U+2502 SF110000 -!82 U+250C SF010000 -!83 U+2510 SF030000 -!84 U+2514 SF020000 -!85 U+2518 SF040000 -!86 U+251C SF080000 -!87 U+2524 SF090000 -!88 U+252C SF060000 -!89 U+2534 SF070000 -!8A U+253C SF050000 -!8B U+2580 upblock -!8C U+2584 dnblock -!8D U+2588 block -!8E U+258C lfblock -!8F U+2590 rtblock -!90 U+2591 ltshade -!91 U+2592 shade -!92 U+2593 dkshade -!93 U+2320 integraltp -!94 U+25A0 filledbox -!95 U+2219 periodcentered -!96 U+221A radical -!97 U+2248 approxequal -!98 U+2264 lessequal -!99 U+2265 greaterequal -!9A U+00A0 space -!9B U+2321 integralbt -!9C U+00B0 degree -!9D U+00B2 twosuperior -!9E U+00B7 periodcentered -!9F U+00F7 divide -!A0 U+2550 SF430000 -!A1 U+2551 SF240000 -!A2 U+2552 SF510000 -!A3 U+0451 afii10071 -!A4 U+2553 SF520000 -!A5 U+2554 SF390000 -!A6 U+2555 SF220000 -!A7 U+2556 SF210000 -!A8 U+2557 SF250000 -!A9 U+2558 SF500000 -!AA U+2559 SF490000 -!AB U+255A SF380000 -!AC U+255B SF280000 -!AD U+255C SF270000 -!AE U+255D SF260000 -!AF U+255E SF360000 -!B0 U+255F SF370000 -!B1 U+2560 SF420000 -!B2 U+2561 SF190000 -!B3 U+0401 afii10023 -!B4 U+2562 SF200000 -!B5 U+2563 SF230000 -!B6 U+2564 SF470000 -!B7 U+2565 SF480000 -!B8 U+2566 SF410000 -!B9 U+2567 SF450000 -!BA U+2568 SF460000 -!BB U+2569 SF400000 -!BC U+256A SF540000 -!BD U+256B SF530000 -!BE U+256C SF440000 -!BF U+00A9 copyright -!C0 U+044E afii10096 -!C1 U+0430 afii10065 -!C2 U+0431 afii10066 -!C3 U+0446 afii10088 -!C4 U+0434 afii10069 -!C5 U+0435 afii10070 -!C6 U+0444 afii10086 -!C7 U+0433 afii10068 -!C8 U+0445 afii10087 -!C9 U+0438 afii10074 -!CA U+0439 afii10075 -!CB U+043A afii10076 -!CC U+043B afii10077 -!CD U+043C afii10078 -!CE U+043D afii10079 -!CF U+043E afii10080 -!D0 U+043F afii10081 -!D1 U+044F afii10097 -!D2 U+0440 afii10082 -!D3 U+0441 afii10083 -!D4 U+0442 afii10084 -!D5 U+0443 afii10085 -!D6 U+0436 afii10072 -!D7 U+0432 afii10067 -!D8 U+044C afii10094 -!D9 U+044B afii10093 -!DA U+0437 afii10073 -!DB U+0448 afii10090 -!DC U+044D afii10095 -!DD U+0449 afii10091 -!DE U+0447 afii10089 -!DF U+044A afii10092 -!E0 U+042E afii10048 -!E1 U+0410 afii10017 -!E2 U+0411 afii10018 -!E3 U+0426 afii10040 -!E4 U+0414 afii10021 -!E5 U+0415 afii10022 -!E6 U+0424 afii10038 -!E7 U+0413 afii10020 -!E8 U+0425 afii10039 -!E9 U+0418 afii10026 -!EA U+0419 afii10027 -!EB U+041A afii10028 -!EC U+041B afii10029 -!ED U+041C afii10030 -!EE U+041D afii10031 -!EF U+041E afii10032 -!F0 U+041F afii10033 -!F1 U+042F afii10049 -!F2 U+0420 afii10034 -!F3 U+0421 afii10035 -!F4 U+0422 afii10036 -!F5 U+0423 afii10037 -!F6 U+0416 afii10024 -!F7 U+0412 afii10019 -!F8 U+042C afii10046 -!F9 U+042B afii10045 -!FA U+0417 afii10025 -!FB U+0428 afii10042 -!FC U+042D afii10047 -!FD U+0429 afii10043 -!FE U+0427 afii10041 -!FF U+042A afii10044 diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/koi8-u.map b/dompdf/vendor/dompdf/php-font-lib/maps/koi8-u.map deleted file mode 100644 index 40a7e4f..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/maps/koi8-u.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+2500 SF100000 -!81 U+2502 SF110000 -!82 U+250C SF010000 -!83 U+2510 SF030000 -!84 U+2514 SF020000 -!85 U+2518 SF040000 -!86 U+251C SF080000 -!87 U+2524 SF090000 -!88 U+252C SF060000 -!89 U+2534 SF070000 -!8A U+253C SF050000 -!8B U+2580 upblock -!8C U+2584 dnblock -!8D U+2588 block -!8E U+258C lfblock -!8F U+2590 rtblock -!90 U+2591 ltshade -!91 U+2592 shade -!92 U+2593 dkshade -!93 U+2320 integraltp -!94 U+25A0 filledbox -!95 U+2022 bullet -!96 U+221A radical -!97 U+2248 approxequal -!98 U+2264 lessequal -!99 U+2265 greaterequal -!9A U+00A0 space -!9B U+2321 integralbt -!9C U+00B0 degree -!9D U+00B2 twosuperior -!9E U+00B7 periodcentered -!9F U+00F7 divide -!A0 U+2550 SF430000 -!A1 U+2551 SF240000 -!A2 U+2552 SF510000 -!A3 U+0451 afii10071 -!A4 U+0454 afii10101 -!A5 U+2554 SF390000 -!A6 U+0456 afii10103 -!A7 U+0457 afii10104 -!A8 U+2557 SF250000 -!A9 U+2558 SF500000 -!AA U+2559 SF490000 -!AB U+255A SF380000 -!AC U+255B SF280000 -!AD U+0491 afii10098 -!AE U+255D SF260000 -!AF U+255E SF360000 -!B0 U+255F SF370000 -!B1 U+2560 SF420000 -!B2 U+2561 SF190000 -!B3 U+0401 afii10023 -!B4 U+0404 afii10053 -!B5 U+2563 SF230000 -!B6 U+0406 afii10055 -!B7 U+0407 afii10056 -!B8 U+2566 SF410000 -!B9 U+2567 SF450000 -!BA U+2568 SF460000 -!BB U+2569 SF400000 -!BC U+256A SF540000 -!BD U+0490 afii10050 -!BE U+256C SF440000 -!BF U+00A9 copyright -!C0 U+044E afii10096 -!C1 U+0430 afii10065 -!C2 U+0431 afii10066 -!C3 U+0446 afii10088 -!C4 U+0434 afii10069 -!C5 U+0435 afii10070 -!C6 U+0444 afii10086 -!C7 U+0433 afii10068 -!C8 U+0445 afii10087 -!C9 U+0438 afii10074 -!CA U+0439 afii10075 -!CB U+043A afii10076 -!CC U+043B afii10077 -!CD U+043C afii10078 -!CE U+043D afii10079 -!CF U+043E afii10080 -!D0 U+043F afii10081 -!D1 U+044F afii10097 -!D2 U+0440 afii10082 -!D3 U+0441 afii10083 -!D4 U+0442 afii10084 -!D5 U+0443 afii10085 -!D6 U+0436 afii10072 -!D7 U+0432 afii10067 -!D8 U+044C afii10094 -!D9 U+044B afii10093 -!DA U+0437 afii10073 -!DB U+0448 afii10090 -!DC U+044D afii10095 -!DD U+0449 afii10091 -!DE U+0447 afii10089 -!DF U+044A afii10092 -!E0 U+042E afii10048 -!E1 U+0410 afii10017 -!E2 U+0411 afii10018 -!E3 U+0426 afii10040 -!E4 U+0414 afii10021 -!E5 U+0415 afii10022 -!E6 U+0424 afii10038 -!E7 U+0413 afii10020 -!E8 U+0425 afii10039 -!E9 U+0418 afii10026 -!EA U+0419 afii10027 -!EB U+041A afii10028 -!EC U+041B afii10029 -!ED U+041C afii10030 -!EE U+041D afii10031 -!EF U+041E afii10032 -!F0 U+041F afii10033 -!F1 U+042F afii10049 -!F2 U+0420 afii10034 -!F3 U+0421 afii10035 -!F4 U+0422 afii10036 -!F5 U+0423 afii10037 -!F6 U+0416 afii10024 -!F7 U+0412 afii10019 -!F8 U+042C afii10046 -!F9 U+042B afii10045 -!FA U+0417 afii10025 -!FB U+0428 afii10042 -!FC U+042D afii10047 -!FD U+0429 afii10043 -!FE U+0427 afii10041 -!FF U+042A afii10044 diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/AdobeFontMetrics.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/AdobeFontMetrics.php deleted file mode 100644 index eeaeb89..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/AdobeFontMetrics.php +++ /dev/null @@ -1,252 +0,0 @@ -font = $font; - } - - function write($file, $encoding = null) { - $map_data = array(); - - if ($encoding) { - $encoding = preg_replace("/[^a-z0-9-_]/", "", $encoding); - $map_file = dirname(__FILE__) . "/../../maps/$encoding.map"; - if (!file_exists($map_file)) { - throw new \Exception("Unknown encoding ($encoding)"); - } - - $map = new EncodingMap($map_file); - $map_data = $map->parse(); - } - - $this->f = fopen($file, "w+"); - - $font = $this->font; - - $this->startSection("FontMetrics", 4.1); - $this->addPair("Notice", "Converted by PHP-font-lib"); - $this->addPair("Comment", "https://github.com/dompdf/php-font-lib"); - - $encoding_scheme = ($encoding ? $encoding : "FontSpecific"); - $this->addPair("EncodingScheme", $encoding_scheme); - - $records = $font->getData("name", "records"); - foreach ($records as $id => $record) { - if (!isset(name::$nameIdCodes[$id]) || preg_match("/[\r\n]/", $record->string)) { - continue; - } - - $this->addPair(name::$nameIdCodes[$id], $record->string); - } - - $os2 = $font->getData("OS/2"); - $this->addPair("Weight", ($os2["usWeightClass"] > 400 ? "Bold" : "Medium")); - - $post = $font->getData("post"); - $this->addPair("ItalicAngle", $post["italicAngle"]); - $this->addPair("IsFixedPitch", ($post["isFixedPitch"] ? "true" : "false")); - $this->addPair("UnderlineThickness", $font->normalizeFUnit($post["underlineThickness"])); - $this->addPair("UnderlinePosition", $font->normalizeFUnit($post["underlinePosition"])); - - $hhea = $font->getData("hhea"); - - if (isset($hhea["ascent"])) { - $this->addPair("FontHeightOffset", $font->normalizeFUnit($hhea["lineGap"])); - } - else { - $this->addPair("FontHeightOffset", $font->normalizeFUnit($os2["typoLineGap"])); - } - - $glyf = $font->getData("glyf"); - $glyphIndexArray = $font->getUnicodeCharMap(); - $hasGlyphs = $glyf instanceof glyf && is_array($glyphIndexArray); - - // capHeight is based on capital H - if ($hasGlyphs && \array_key_exists(72, $glyphIndexArray)) { - $upperH = $glyf[$glyphIndexArray[72]]; - $upperH->parseData(); - $this->addPair("CapHeight", $font->normalizeFUnit($upperH->yMax)); - } - - // xHeight is based on lowercase x - if ($hasGlyphs && \array_key_exists(120, $glyphIndexArray)) { - $lowerX = $glyf[$glyphIndexArray[120]]; - $lowerX->parseData(); - $this->addPair("XHeight", $font->normalizeFUnit($lowerX->yMax)); - } - - // ascender is based on lowercase d - if ($hasGlyphs && \array_key_exists(100, $glyphIndexArray)) { - $lowerD = $glyf[$glyphIndexArray[100]]; - $lowerD->parseData(); - $this->addPair("Ascender", $font->normalizeFUnit($lowerD->yMax)); - } elseif (isset($hhea["ascent"])) { - $this->addPair("Ascender", $font->normalizeFUnit($hhea["ascent"])); - } - else { - $this->addPair("Ascender", $font->normalizeFUnit($os2["typoAscender"])); - } - - // descender is based on lowercase p - if ($hasGlyphs && \array_key_exists(112, $glyphIndexArray)) { - $lowerP = $glyf[$glyphIndexArray[112]]; - $lowerP->parseData(); - $this->addPair("Descender", $font->normalizeFUnit($lowerP->yMin)); - } elseif (isset($hhea["descent"])) { - $this->addPair("Descender", $font->normalizeFUnit($hhea["descent"])); - } - else { - $this->addPair("Descender", -abs($font->normalizeFUnit($os2["typoDescender"]))); - } - - $head = $font->getData("head"); - $this->addArray("FontBBox", array( - $font->normalizeFUnit($head["xMin"]), - $font->normalizeFUnit($head["yMin"]), - $font->normalizeFUnit($head["xMax"]), - $font->normalizeFUnit($head["yMax"]), - )); - - if ($glyphIndexArray) { - $hmtx = $font->getData("hmtx"); - $names = $font->getData("post", "names"); - - $this->startSection("CharMetrics", count($hmtx)); - - if ($encoding) { - foreach ($map_data as $code => $value) { - list($c, $name) = $value; - - if (!isset($glyphIndexArray[$c])) { - continue; - } - - $g = $glyphIndexArray[$c]; - - if (!isset($hmtx[$g])) { - $hmtx[$g] = $hmtx[0]; - } - - $this->addMetric(array( - "C" => ($code > 255 ? -1 : $code), - "WX" => $font->normalizeFUnit($hmtx[$g][0]), - "N" => $name, - )); - } - } - else { - foreach ($glyphIndexArray as $c => $g) { - if (!isset($hmtx[$g])) { - $hmtx[$g] = $hmtx[0]; - } - - $this->addMetric(array( - "U" => $c, - "WX" => $font->normalizeFUnit($hmtx[$g][0]), - "N" => (isset($names[$g]) ? $names[$g] : sprintf("uni%04x", $c)), - "G" => $g, - )); - } - } - - $this->endSection("CharMetrics"); - - $kern = $font->getData("kern", "subtable"); - $tree = is_array($kern) ? $kern["tree"] : null; - - if (!$encoding && is_array($tree)) { - $this->startSection("KernData"); - $this->startSection("KernPairs", count($tree, COUNT_RECURSIVE) - count($tree)); - - foreach ($tree as $left => $values) { - if (!is_array($values)) { - continue; - } - if (!isset($glyphIndexArray[$left])) { - continue; - } - - $left_gid = $glyphIndexArray[$left]; - - if (!isset($names[$left_gid])) { - continue; - } - - $left_name = $names[$left_gid]; - - $this->addLine(""); - - foreach ($values as $right => $value) { - if (!isset($glyphIndexArray[$right])) { - continue; - } - - $right_gid = $glyphIndexArray[$right]; - - if (!isset($names[$right_gid])) { - continue; - } - - $right_name = $names[$right_gid]; - $this->addPair("KPX", "$left_name $right_name $value"); - } - } - - $this->endSection("KernPairs"); - $this->endSection("KernData"); - } - } - - $this->endSection("FontMetrics"); - } - - function addLine($line) { - fwrite($this->f, "$line\n"); - } - - function addPair($key, $value) { - $this->addLine("$key $value"); - } - - function addArray($key, $array) { - $this->addLine("$key " . implode(" ", $array)); - } - - function addMetric($data) { - $array = array(); - foreach ($data as $key => $value) { - $array[] = "$key $value"; - } - $this->addLine(implode(" ; ", $array)); - } - - function startSection($name, $value = "") { - $this->addLine("Start$name $value"); - } - - function endSection($name) { - $this->addLine("End$name"); - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/BinaryStream.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/BinaryStream.php deleted file mode 100644 index cc5e72c..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/BinaryStream.php +++ /dev/null @@ -1,448 +0,0 @@ -open($filename, self::modeRead); - } - - /** - * Open a font file in a chosen mode - * - * @param string $filename The file name of the font to open - * @param string $mode The opening mode - * - * @throws \Exception - * @return bool - */ - public function open($filename, $mode = self::modeRead) { - if (!in_array($mode, array(self::modeRead, self::modeWrite, self::modeReadWrite))) { - throw new \Exception("Unknown file open mode"); - } - - $this->f = fopen($filename, $mode); - - return $this->f != false; - } - - /** - * Close the internal file pointer - */ - public function close() { - return fclose($this->f) != false; - } - - /** - * Change the internal file pointer - * - * @param resource $fp - * - * @throws \Exception - */ - public function setFile($fp) { - if (!is_resource($fp)) { - throw new \Exception('$fp is not a valid resource'); - } - - $this->f = $fp; - } - - /** - * Create a temporary file in write mode - * - * @param bool $allow_memory Allow in-memory files - * - * @return resource the temporary file pointer resource - */ - public static function getTempFile($allow_memory = true) { - $f = null; - - if ($allow_memory) { - $f = fopen("php://temp", "rb+"); - } - else { - $f = fopen(tempnam(sys_get_temp_dir(), "fnt"), "rb+"); - } - - return $f; - } - - /** - * Move the internal file pinter to $offset bytes - * - * @param int $offset - * - * @return bool True if the $offset position exists in the file - */ - public function seek($offset) { - return fseek($this->f, $offset, SEEK_SET) == 0; - } - - /** - * Gives the current position in the file - * - * @return int The current position - */ - public function pos() { - return ftell($this->f); - } - - public function skip($n) { - fseek($this->f, $n, SEEK_CUR); - } - - /** - * @param int $n The number of bytes to read - * - * @return string - */ - public function read($n) { - if ($n < 1) { - return ""; - } - - return (string) fread($this->f, $n); - } - - public function write($data, $length = null) { - if ($data === null || $data === "" || $data === false) { - return 0; - } - - return fwrite($this->f, $data, $length); - } - - public function readUInt8() { - return ord($this->read(1)); - } - - public function readUInt8Many($count) { - return array_values(unpack("C*", $this->read($count))); - } - - public function writeUInt8($data) { - return $this->write(chr($data), 1); - } - - public function readInt8() { - $v = $this->readUInt8(); - - if ($v >= 0x80) { - $v -= 0x100; - } - - return $v; - } - - public function readInt8Many($count) { - return array_values(unpack("c*", $this->read($count))); - } - - public function writeInt8($data) { - if ($data < 0) { - $data += 0x100; - } - - return $this->writeUInt8($data); - } - - public function readUInt16() { - $a = unpack("nn", $this->read(2)); - - return $a["n"]; - } - - public function readUInt16Many($count) { - return array_values(unpack("n*", $this->read($count * 2))); - } - - public function readUFWord() { - return $this->readUInt16(); - } - - public function writeUInt16($data) { - return $this->write(pack("n", $data), 2); - } - - public function writeUFWord($data) { - return $this->writeUInt16($data); - } - - public function readInt16() { - $a = unpack("nn", $this->read(2)); - $v = $a["n"]; - - if ($v >= 0x8000) { - $v -= 0x10000; - } - - return $v; - } - - public function readInt16Many($count) { - $vals = array_values(unpack("n*", $this->read($count * 2))); - foreach ($vals as &$v) { - if ($v >= 0x8000) { - $v -= 0x10000; - } - } - - return $vals; - } - - public function readFWord() { - return $this->readInt16(); - } - - public function writeInt16($data) { - if ($data < 0) { - $data += 0x10000; - } - - return $this->writeUInt16($data); - } - - public function writeFWord($data) { - return $this->writeInt16($data); - } - - public function readUInt32() { - $a = unpack("NN", $this->read(4)); - - return $a["N"]; - } - - public function writeUInt32($data) { - return $this->write(pack("N", $data), 4); - } - - public function readFixed() { - $d = $this->readInt16(); - $d2 = $this->readUInt16(); - - return round($d + $d2 / 0x10000, 4); - } - - public function writeFixed($data) { - $left = floor($data); - $right = ($data - $left) * 0x10000; - - return $this->writeInt16($left) + $this->writeUInt16($right); - } - - public function readLongDateTime() { - $this->readUInt32(); // ignored - $date = $this->readUInt32() - 2082844800; - - # PHP_INT_MIN isn't defined in PHP < 7.0 - $php_int_min = defined("PHP_INT_MIN") ? PHP_INT_MIN : ~PHP_INT_MAX; - - if (is_string($date) || $date > PHP_INT_MAX || $date < $php_int_min) { - $date = 0; - } - - return date("Y-m-d H:i:s", $date); - } - - public function writeLongDateTime($data) { - $date = strtotime($data); - $date += 2082844800; - - return $this->writeUInt32(0) + $this->writeUInt32($date); - } - - public function unpack($def) { - $d = array(); - foreach ($def as $name => $type) { - $d[$name] = $this->r($type); - } - - return $d; - } - - public function pack($def, $data) { - $bytes = 0; - foreach ($def as $name => $type) { - $bytes += $this->w($type, $data[$name]); - } - - return $bytes; - } - - /** - * Read a data of type $type in the file from the current position - * - * @param mixed $type The data type to read - * - * @return mixed The data that was read - */ - public function r($type) { - switch ($type) { - case self::uint8: - return $this->readUInt8(); - case self::int8: - return $this->readInt8(); - case self::uint16: - return $this->readUInt16(); - case self::int16: - return $this->readInt16(); - case self::uint32: - return $this->readUInt32(); - case self::int32: - return $this->readUInt32(); - case self::shortFrac: - return $this->readFixed(); - case self::Fixed: - return $this->readFixed(); - case self::FWord: - return $this->readInt16(); - case self::uFWord: - return $this->readUInt16(); - case self::F2Dot14: - return $this->readInt16(); - case self::longDateTime: - return $this->readLongDateTime(); - case self::char: - return $this->read(1); - default: - if (is_array($type)) { - if ($type[0] == self::char) { - return $this->read($type[1]); - } - if ($type[0] == self::uint16) { - return $this->readUInt16Many($type[1]); - } - if ($type[0] == self::int16) { - return $this->readInt16Many($type[1]); - } - if ($type[0] == self::uint8) { - return $this->readUInt8Many($type[1]); - } - if ($type[0] == self::int8) { - return $this->readInt8Many($type[1]); - } - - $ret = array(); - for ($i = 0; $i < $type[1]; $i++) { - $ret[] = $this->r($type[0]); - } - - return $ret; - } - - return null; - } - } - - /** - * Write $data of type $type in the file from the current position - * - * @param mixed $type The data type to write - * @param mixed $data The data to write - * - * @return int The number of bytes read - */ - public function w($type, $data) { - switch ($type) { - case self::uint8: - return $this->writeUInt8($data); - case self::int8: - return $this->writeInt8($data); - case self::uint16: - return $this->writeUInt16($data); - case self::int16: - return $this->writeInt16($data); - case self::uint32: - return $this->writeUInt32($data); - case self::int32: - return $this->writeUInt32($data); - case self::shortFrac: - return $this->writeFixed($data); - case self::Fixed: - return $this->writeFixed($data); - case self::FWord: - return $this->writeInt16($data); - case self::uFWord: - return $this->writeUInt16($data); - case self::F2Dot14: - return $this->writeInt16($data); - case self::longDateTime: - return $this->writeLongDateTime($data); - case self::char: - return $this->write($data, 1); - default: - if (is_array($type)) { - if ($type[0] == self::char) { - return $this->write($data, $type[1]); - } - - $ret = 0; - for ($i = 0; $i < $type[1]; $i++) { - if (isset($data[$i])) { - $ret += $this->w($type[0], $data[$i]); - } - } - - return $ret; - } - - return null; - } - } - - /** - * Converts a Uint32 value to string - * - * @param int $uint32 - * - * @return string The string - */ - public function convertUInt32ToStr($uint32) { - return chr(($uint32 >> 24) & 0xFF) . chr(($uint32 >> 16) & 0xFF) . chr(($uint32 >> 8) & 0xFF) . chr($uint32 & 0xFF); - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EOT/File.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EOT/File.php deleted file mode 100644 index fb07cdd..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EOT/File.php +++ /dev/null @@ -1,158 +0,0 @@ -header)) { - return; - } - - $this->header = new Header($this); - $this->header->parse(); - } - - function parse() { - $this->parseHeader(); - - $flags = $this->header->data["Flags"]; - - if ($flags & self::TTEMBED_TTCOMPRESSED) { - $mtx_version = $this->readUInt8(); - $mtx_copy_limit = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8(); - $mtx_offset_1 = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8(); - $mtx_offset_2 = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8(); - /* - var_dump("$mtx_version $mtx_copy_limit $mtx_offset_1 $mtx_offset_2"); - - $pos = $this->pos(); - $size = $mtx_offset_1 - $pos; - var_dump("pos: $pos"); - var_dump("size: $size");*/ - } - - if ($flags & self::TTEMBED_XORENCRYPTDATA) { - // Process XOR - } - // TODO Read font data ... - } - - /** - * Little endian version of the read method - * - * @param int $n The number of bytes to read - * - * @return string - */ - public function read($n) { - if ($n < 1) { - return ""; - } - - $string = (string) fread($this->f, $n); - $chunks = mb_str_split($string, 2, '8bit'); - $chunks = array_map("strrev", $chunks); - return implode("", $chunks); - } - - public function readUInt32() { - $uint32 = parent::readUInt32(); - - return $uint32 >> 16 & 0x0000FFFF | $uint32 << 16 & 0xFFFF0000; - } - - /** - * Get font copyright - * - * @return string|null - */ - function getFontCopyright() { - return null; - } - - /** - * Get font name - * - * @return string|null - */ - function getFontName() { - return $this->header->data["FamilyName"]; - } - - /** - * Get font subfamily - * - * @return string|null - */ - function getFontSubfamily() { - return $this->header->data["StyleName"]; - } - - /** - * Get font subfamily ID - * - * @return string|null - */ - function getFontSubfamilyID() { - return $this->header->data["StyleName"]; - } - - /** - * Get font full name - * - * @return string|null - */ - function getFontFullName() { - return $this->header->data["FullName"]; - } - - /** - * Get font version - * - * @return string|null - */ - function getFontVersion() { - return $this->header->data["VersionName"]; - } - - /** - * Get font weight - * - * @return string|null - */ - function getFontWeight() { - return $this->header->data["Weight"]; - } - - /** - * Get font Postscript name - * - * @return string|null - */ - function getFontPostscriptName() { - return null; - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EOT/Header.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EOT/Header.php deleted file mode 100644 index 492da8a..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EOT/Header.php +++ /dev/null @@ -1,112 +0,0 @@ - self::uint32, - "numTables" => self::uint16, - "searchRange" => self::uint16, - "entrySelector" => self::uint16, - "rangeShift" => self::uint16, - ); - - public function parse() { - $font = $this->font; - - $this->data = $font->unpack(array( - "EOTSize" => self::uint32, - "FontDataSize" => self::uint32, - "Version" => self::uint32, - "Flags" => self::uint32, - "FontPANOSE" => array(self::uint8, 10), - "Charset" => self::uint8, - "Italic" => self::uint8, - "Weight" => self::uint32, - "fsType" => self::uint16, - "MagicNumber" => self::uint16, - "UnicodeRange1" => self::uint32, - "UnicodeRange2" => self::uint32, - "UnicodeRange3" => self::uint32, - "UnicodeRange4" => self::uint32, - "CodePageRange1" => self::uint32, - "CodePageRange2" => self::uint32, - "CheckSumAdjustment" => self::uint32, - "Reserved1" => self::uint32, - "Reserved2" => self::uint32, - "Reserved3" => self::uint32, - "Reserved4" => self::uint32, - )); - - $this->data["Padding1"] = $font->readUInt16(); - $this->readString("FamilyName"); - - $this->data["Padding2"] = $font->readUInt16(); - $this->readString("StyleName"); - - $this->data["Padding3"] = $font->readUInt16(); - $this->readString("VersionName"); - - $this->data["Padding4"] = $font->readUInt16(); - $this->readString("FullName"); - - switch ($this->data["Version"]) { - default: - throw new Exception("Unknown EOT version " . $this->data["Version"]); - - case 0x00010000: - // Nothing to do more - break; - - case 0x00020001: - $this->data["Padding5"] = $font->readUInt16(); - $this->readString("RootString"); - break; - - case 0x00020002: - $this->data["Padding5"] = $font->readUInt16(); - $this->readString("RootString"); - - $this->data["RootStringCheckSum"] = $font->readUInt32(); - $this->data["EUDCCodePage"] = $font->readUInt32(); - - $this->data["Padding6"] = $font->readUInt16(); - $this->readString("Signature"); - - $this->data["EUDCFlags"] = $font->readUInt32(); - $this->data["EUDCFontSize"] = $font->readUInt32(); - break; - } - - if (!empty($this->data["RootString"])) { - $this->data["RootString"] = explode("\0", $this->data["RootString"]); - } - } - - private function readString($name) { - $font = $this->font; - $size = $font->readUInt16(); - - $this->data["{$name}Size"] = $size; - $this->data[$name] = Font::UTF16ToUTF8($font->read($size)); - } - - public function encode() { - //return $this->font->pack($this->def, $this->data); - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EncodingMap.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EncodingMap.php deleted file mode 100644 index a5942ef..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EncodingMap.php +++ /dev/null @@ -1,36 +0,0 @@ -f = fopen($file, "r"); - } - - function parse() { - $map = array(); - - while ($line = fgets($this->f)) { - if (preg_match('/^[\!\=]([0-9A-F]{2,})\s+U\+([0-9A-F]{2})([0-9A-F]{2})\s+([^\s]+)/', $line, $matches)) { - $unicode = (hexdec($matches[2]) << 8) + hexdec($matches[3]); - $map[hexdec($matches[1])] = array($unicode, $matches[4]); - } - } - - ksort($map); - - return $map; - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Exception/FontNotFoundException.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Exception/FontNotFoundException.php deleted file mode 100644 index d97f252..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Exception/FontNotFoundException.php +++ /dev/null @@ -1,11 +0,0 @@ -message = 'Font not found in: ' . $fontPath; - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Font.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Font.php deleted file mode 100644 index 8661288..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Font.php +++ /dev/null @@ -1,88 +0,0 @@ -load($file); - - return $obj; - } - - return null; - } - - static function d($str) { - if (!self::$debug) { - return; - } - echo "$str\n"; - } - - static function UTF16ToUTF8($str) { - return mb_convert_encoding($str, "utf-8", "utf-16"); - } - - static function UTF8ToUTF16($str) { - return mb_convert_encoding($str, "utf-16", "utf-8"); - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/Outline.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/Outline.php deleted file mode 100644 index dde4de2..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/Outline.php +++ /dev/null @@ -1,108 +0,0 @@ -seek($offset); - - if ($size === 0 || $font->readInt16() > -1) { - /** @var OutlineSimple $glyph */ - $glyph = new OutlineSimple($table, $offset, $size); - } - else { - /** @var OutlineComposite $glyph */ - $glyph = new OutlineComposite($table, $offset, $size); - } - - $glyph->parse($font); - - return $glyph; - } - - /** - * @return File - */ - function getFont() { - return $this->table->getFont(); - } - - function __construct(glyf $table, $offset = null, $size = null) { - $this->table = $table; - $this->offset = $offset; - $this->size = $size; - } - - function parse(BinaryStream $font) { - $font->seek($this->offset); - - $this->raw = $font->read($this->size); - } - - function parseData() { - $font = $this->getFont(); - $font->seek($this->offset); - - $this->numberOfContours = $font->readInt16(); - $this->xMin = $font->readFWord(); - $this->yMin = $font->readFWord(); - $this->xMax = $font->readFWord(); - $this->yMax = $font->readFWord(); - } - - function encode() { - $font = $this->getFont(); - - return $font->write($this->raw, mb_strlen((string) $this->raw, '8bit')); - } - - function getSVGContours() { - // Inherit - } - - function getGlyphIDs() { - return array(); - } -} - diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineComponent.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineComponent.php deleted file mode 100644 index 40aade3..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineComponent.php +++ /dev/null @@ -1,30 +0,0 @@ -a, $this->b, - $this->c, $this->d, - $this->e, $this->f, - ); - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineComposite.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineComposite.php deleted file mode 100644 index 179c012..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineComposite.php +++ /dev/null @@ -1,252 +0,0 @@ -components)) { - $this->parseData(); - } - - $glyphIDs = array(); - foreach ($this->components as $_component) { - $glyphIDs[] = $_component->glyphIndex; - - $_glyph = $this->table->data[$_component->glyphIndex]; - - if ($_glyph !== $this) { - $glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs()); - } - } - - return $glyphIDs; - } - - /*function parse() { - //$this->parseData(); - }*/ - - function parseData() { - parent::parseData(); - - $font = $this->getFont(); - - do { - $flags = $font->readUInt16(); - $glyphIndex = $font->readUInt16(); - - $a = 1.0; - $b = 0.0; - $c = 0.0; - $d = 1.0; - $e = 0.0; - $f = 0.0; - - $point_compound = null; - $point_component = null; - - $instructions = null; - - if ($flags & self::ARG_1_AND_2_ARE_WORDS) { - if ($flags & self::ARGS_ARE_XY_VALUES) { - $e = $font->readInt16(); - $f = $font->readInt16(); - } - else { - $point_compound = $font->readUInt16(); - $point_component = $font->readUInt16(); - } - } - else { - if ($flags & self::ARGS_ARE_XY_VALUES) { - $e = $font->readInt8(); - $f = $font->readInt8(); - } - else { - $point_compound = $font->readUInt8(); - $point_component = $font->readUInt8(); - } - } - - if ($flags & self::WE_HAVE_A_SCALE) { - $a = $d = $font->readInt16(); - } - elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) { - $a = $font->readInt16(); - $d = $font->readInt16(); - } - elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) { - $a = $font->readInt16(); - $b = $font->readInt16(); - $c = $font->readInt16(); - $d = $font->readInt16(); - } - - //if ($flags & self::WE_HAVE_INSTRUCTIONS) { - // - //} - - $component = new OutlineComponent(); - $component->flags = $flags; - $component->glyphIndex = $glyphIndex; - $component->a = $a; - $component->b = $b; - $component->c = $c; - $component->d = $d; - $component->e = $e; - $component->f = $f; - $component->point_compound = $point_compound; - $component->point_component = $point_component; - $component->instructions = $instructions; - - $this->components[] = $component; - } while ($flags & self::MORE_COMPONENTS); - if ($flags & self::WE_HAVE_INSTRUCTIONS) { - $numInstr = $font->readUInt16(); - $instr = $font->read($numInstr); - $this->components[count($this->components) - 1]->instructions = pack('n', $numInstr) . $instr; - } - } - - function encode() { - $font = $this->getFont(); - - $gids = $font->getSubset(); - - $size = $font->writeInt16(-1); - $size += $font->writeFWord($this->xMin); - $size += $font->writeFWord($this->yMin); - $size += $font->writeFWord($this->xMax); - $size += $font->writeFWord($this->yMax); - - foreach ($this->components as $_i => $_component) { - $flags = 0; - if ($_component->point_component === null && $_component->point_compound === null) { - $flags |= self::ARGS_ARE_XY_VALUES; - - if (abs($_component->e) > 0x7F || abs($_component->f) > 0x7F) { - $flags |= self::ARG_1_AND_2_ARE_WORDS; - } - } - elseif ($_component->point_component > 0xFF || $_component->point_compound > 0xFF) { - $flags |= self::ARG_1_AND_2_ARE_WORDS; - } - - if ($_component->b == 0 && $_component->c == 0) { - if ($_component->a == $_component->d) { - if ($_component->a != 1.0) { - $flags |= self::WE_HAVE_A_SCALE; - } - } - else { - $flags |= self::WE_HAVE_AN_X_AND_Y_SCALE; - } - } - else { - $flags |= self::WE_HAVE_A_TWO_BY_TWO; - } - - if ($_i < count($this->components) - 1) { - $flags |= self::MORE_COMPONENTS; - } elseif($_component->instructions !== null) { - $flags |= self::WE_HAVE_INSTRUCTIONS; - } - - $size += $font->writeUInt16($flags); - - $new_gid = array_search($_component->glyphIndex, $gids); - $size += $font->writeUInt16($new_gid); - - if ($flags & self::ARG_1_AND_2_ARE_WORDS) { - if ($flags & self::ARGS_ARE_XY_VALUES) { - $size += $font->writeInt16($_component->e); - $size += $font->writeInt16($_component->f); - } - else { - $size += $font->writeUInt16($_component->point_compound); - $size += $font->writeUInt16($_component->point_component); - } - } - else { - if ($flags & self::ARGS_ARE_XY_VALUES) { - $size += $font->writeInt8($_component->e); - $size += $font->writeInt8($_component->f); - } - else { - $size += $font->writeUInt8($_component->point_compound); - $size += $font->writeUInt8($_component->point_component); - } - } - - if ($flags & self::WE_HAVE_A_SCALE) { - $size += $font->writeInt16($_component->a); - } - elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) { - $size += $font->writeInt16($_component->a); - $size += $font->writeInt16($_component->d); - } - elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) { - $size += $font->writeInt16($_component->a); - $size += $font->writeInt16($_component->b); - $size += $font->writeInt16($_component->c); - $size += $font->writeInt16($_component->d); - } - } - - if($_component->instructions !== null) { - $size += $font->write($_component->instructions, strlen($_component->instructions)); - } - - return $size; - } - - public function getSVGContours() { - $contours = array(); - - /** @var \FontLib\Table\Type\glyf $glyph_data */ - $glyph_data = $this->getFont()->getTableObject("glyf"); - - /** @var Outline[] $glyphs */ - $glyphs = $glyph_data->data; - - foreach ($this->components as $component) { - $_glyph = $glyphs[$component->glyphIndex]; - - if ($_glyph !== $this) { - $contours[] = array( - "contours" => $_glyph->getSVGContours(), - "transform" => $component->getMatrix(), - ); - } - } - - return $contours; - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineSimple.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineSimple.php deleted file mode 100644 index 4b2d4ca..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineSimple.php +++ /dev/null @@ -1,334 +0,0 @@ -size) { - return; - } - - $font = $this->getFont(); - - $noc = $this->numberOfContours; - - if ($noc == 0) { - return; - } - - $endPtsOfContours = $font->r(array(self::uint16, $noc)); - - $instructionLength = $font->readUInt16(); - $this->instructions = $font->r(array(self::uint8, $instructionLength)); - - $count = $endPtsOfContours[$noc - 1] + 1; - - // Flags - $flags = array(); - for ($index = 0; $index < $count; $index++) { - $flags[$index] = $font->readUInt8(); - - if ($flags[$index] & self::REPEAT) { - $repeats = $font->readUInt8(); - - for ($i = 1; $i <= $repeats; $i++) { - $flags[$index + $i] = $flags[$index]; - } - - $index += $repeats; - } - } - - $points = array(); - foreach ($flags as $i => $flag) { - $points[$i]["onCurve"] = $flag & self::ON_CURVE; - $points[$i]["endOfContour"] = in_array($i, $endPtsOfContours); - } - - // X Coords - $x = 0; - for ($i = 0; $i < $count; $i++) { - $flag = $flags[$i]; - - if ($flag & self::THIS_X_IS_SAME) { - if ($flag & self::X_SHORT_VECTOR) { - $x += $font->readUInt8(); - } - } - else { - if ($flag & self::X_SHORT_VECTOR) { - $x -= $font->readUInt8(); - } - else { - $x += $font->readInt16(); - } - } - - $points[$i]["x"] = $x; - } - - // Y Coords - $y = 0; - for ($i = 0; $i < $count; $i++) { - $flag = $flags[$i]; - - if ($flag & self::THIS_Y_IS_SAME) { - if ($flag & self::Y_SHORT_VECTOR) { - $y += $font->readUInt8(); - } - } - else { - if ($flag & self::Y_SHORT_VECTOR) { - $y -= $font->readUInt8(); - } - else { - $y += $font->readInt16(); - } - } - - $points[$i]["y"] = $y; - } - - $this->points = $points; - } - - public function splitSVGPath($path) { - preg_match_all('/([a-z])|(-?\d+(?:\.\d+)?)/i', $path, $matches, PREG_PATTERN_ORDER); - - return $matches[0]; - } - - public function makePoints($path) { - $path = $this->splitSVGPath($path); - $l = count($path); - $i = 0; - - $points = array(); - - while ($i < $l) { - switch ($path[$i]) { - // moveTo - case "M": - $points[] = array( - "onCurve" => true, - "x" => $path[++$i], - "y" => $path[++$i], - "endOfContour" => false, - ); - break; - - // lineTo - case "L": - $points[] = array( - "onCurve" => true, - "x" => $path[++$i], - "y" => $path[++$i], - "endOfContour" => false, - ); - break; - - // quadraticCurveTo - case "Q": - $points[] = array( - "onCurve" => false, - "x" => $path[++$i], - "y" => $path[++$i], - "endOfContour" => false, - ); - $points[] = array( - "onCurve" => true, - "x" => $path[++$i], - "y" => $path[++$i], - "endOfContour" => false, - ); - break; - - // closePath - /** @noinspection PhpMissingBreakStatementInspection */ - case "z": - $points[count($points) - 1]["endOfContour"] = true; - - default: - $i++; - break; - } - } - - return $points; - } - - function encode() { - if (empty($this->points)) { - return parent::encode(); - } - - return $this->size = $this->encodePoints($this->points); - } - - public function encodePoints($points) { - $endPtsOfContours = array(); - $flags = array(); - $coords_x = array(); - $coords_y = array(); - - $last_x = 0; - $last_y = 0; - $xMin = $yMin = 0xFFFF; - $xMax = $yMax = -0xFFFF; - foreach ($points as $i => $point) { - $flag = 0; - if ($point["onCurve"]) { - $flag |= self::ON_CURVE; - } - - if ($point["endOfContour"]) { - $endPtsOfContours[] = $i; - } - - // Simplified, we could do some optimizations - if ($point["x"] == $last_x) { - $flag |= self::THIS_X_IS_SAME; - } - else { - $x = intval($point["x"]); - $xMin = min($x, $xMin); - $xMax = max($x, $xMax); - $coords_x[] = $x - $last_x; // int16 - } - - // Simplified, we could do some optimizations - if ($point["y"] == $last_y) { - $flag |= self::THIS_Y_IS_SAME; - } - else { - $y = intval($point["y"]); - $yMin = min($y, $yMin); - $yMax = max($y, $yMax); - $coords_y[] = $y - $last_y; // int16 - } - - $flags[] = $flag; - $last_x = $point["x"]; - $last_y = $point["y"]; - } - - $font = $this->getFont(); - - $l = 0; - $l += $font->writeInt16(count($endPtsOfContours)); // endPtsOfContours - $l += $font->writeFWord(isset($this->xMin) ? $this->xMin : $xMin); // xMin - $l += $font->writeFWord(isset($this->yMin) ? $this->yMin : $yMin); // yMin - $l += $font->writeFWord(isset($this->xMax) ? $this->xMax : $xMax); // xMax - $l += $font->writeFWord(isset($this->yMax) ? $this->yMax : $yMax); // yMax - - // Simple glyf - $l += $font->w(array(self::uint16, count($endPtsOfContours)), $endPtsOfContours); // endPtsOfContours - $l += $font->writeUInt16(0); // instructionLength - $l += $font->w(array(self::uint8, count($flags)), $flags); // flags - $l += $font->w(array(self::int16, count($coords_x)), $coords_x); // xCoordinates - $l += $font->w(array(self::int16, count($coords_y)), $coords_y); // yCoordinates - return $l; - } - - public function getSVGContours($points = null) { - $path = ""; - - if (!$points) { - if (empty($this->points)) { - $this->parseData(); - } - - $points = $this->points; - } - - $length = (empty($points) ? 0 : count($points)); - $firstIndex = 0; - $count = 0; - - for ($i = 0; $i < $length; $i++) { - $count++; - - if ($points[$i]["endOfContour"]) { - $path .= $this->getSVGPath($points, $firstIndex, $count); - $firstIndex = $i + 1; - $count = 0; - } - } - - return $path; - } - - protected function getSVGPath($points, $startIndex, $count) { - $offset = 0; - $path = ""; - - while ($offset < $count) { - $point = $points[$startIndex + $offset % $count]; - $point_p1 = $points[$startIndex + ($offset + 1) % $count]; - - if ($offset == 0) { - $path .= "M{$point['x']},{$point['y']} "; - } - - if ($point["onCurve"]) { - if ($point_p1["onCurve"]) { - $path .= "L{$point_p1['x']},{$point_p1['y']} "; - $offset++; - } - else { - $point_p2 = $points[$startIndex + ($offset + 2) % $count]; - - if ($point_p2["onCurve"]) { - $path .= "Q{$point_p1['x']},{$point_p1['y']},{$point_p2['x']},{$point_p2['y']} "; - } - else { - $path .= "Q{$point_p1['x']},{$point_p1['y']}," . $this->midValue($point_p1['x'], $point_p2['x']) . "," . $this->midValue($point_p1['y'], $point_p2['y']) . " "; - } - - $offset += 2; - } - } - else { - if ($point_p1["onCurve"]) { - $path .= "Q{$point['x']},{$point['y']},{$point_p1['x']},{$point_p1['y']} "; - } - else { - $path .= "Q{$point['x']},{$point['y']}," . $this->midValue($point['x'], $point_p1['x']) . "," . $this->midValue($point['y'], $point_p1['y']) . " "; - } - - $offset++; - } - } - - $path .= "z "; - - return $path; - } - - function midValue($a, $b) { - return $a + ($b - $a) / 2; - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Header.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Header.php deleted file mode 100644 index 32b80c6..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Header.php +++ /dev/null @@ -1,36 +0,0 @@ -font = $font; - } - - public function encode() { - return $this->font->pack($this->def, $this->data); - } - - public function parse() { - $this->data = $this->font->unpack($this->def); - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/OpenType/File.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/OpenType/File.php deleted file mode 100644 index 8bfed0b..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/OpenType/File.php +++ /dev/null @@ -1,17 +0,0 @@ -font = $font; - $this->f = $font->f; - } - - function parse() { - $this->tag = $this->font->read(4); - } - - function open($filename, $mode = self::modeRead) { - // void - } - - function setTable(Table $font_table) { - $this->font_table = $font_table; - } - - function encode($entry_offset) { - Font::d("\n==== $this->tag ===="); - //Font::d("Entry offset = $entry_offset"); - - $data = $this->font_table; - $font = $this->font; - - $table_offset = $font->pos(); - $this->offset = $table_offset; - $table_length = $data->encode(); - - $font->seek($table_offset + $table_length); - $pad = 0; - $mod = $table_length % 4; - if ($mod != 0) { - $pad = 4 - $mod; - $font->write(str_pad("", $pad, "\0"), $pad); - } - - $font->seek($table_offset); - $table_data = $font->read($table_length); - - $font->seek($entry_offset); - - $font->write($this->tag, 4); - $font->writeUInt32(self::computeChecksum($table_data)); - $font->writeUInt32($table_offset); - $font->writeUInt32($table_length); - - Font::d("Bytes written = $table_length"); - - $font->seek($table_offset + $table_length + $pad); - } - - /** - * @return File - */ - function getFont() { - return $this->font; - } - - function startRead() { - $this->font->seek($this->offset); - } - - function endRead() { - // - } - - function startWrite() { - $this->font->seek($this->offset); - } - - function endWrite() { - // - } -} - diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Table.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Table.php deleted file mode 100644 index 6b3a565..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Table.php +++ /dev/null @@ -1,92 +0,0 @@ -entry = $entry; - $entry->setTable($this); - } - - /** - * @return File - */ - public function getFont() { - return $this->entry->getFont(); - } - - protected function _encode() { - if (empty($this->data)) { - Font::d(" >> Table is empty"); - - return 0; - } - - return $this->getFont()->pack($this->def, $this->data); - } - - protected function _parse() { - $this->data = $this->getFont()->unpack($this->def); - } - - protected function _parseRaw() { - $this->data = $this->getFont()->read($this->entry->length); - } - - protected function _encodeRaw() { - return $this->getFont()->write($this->data, $this->entry->length); - } - - public function toHTML() { - return "
" . var_export($this->data, true) . "
"; - } - - final public function encode() { - $this->entry->startWrite(); - - if (false && empty($this->def)) { - $length = $this->_encodeRaw(); - } - else { - $length = $this->_encode(); - } - - $this->entry->endWrite(); - - return $length; - } - - final public function parse() { - $this->entry->startRead(); - - if (false && empty($this->def)) { - $this->_parseRaw(); - } - else { - $this->_parse(); - } - - $this->entry->endRead(); - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/cmap.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/cmap.php deleted file mode 100644 index c7abca7..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/cmap.php +++ /dev/null @@ -1,380 +0,0 @@ - self::uint16, - "numberSubtables" => self::uint16, - ); - - private static $subtable_header_format = array( - "platformID" => self::uint16, - "platformSpecificID" => self::uint16, - "offset" => self::uint32, - ); - - private static $subtable_v2_format = array( - "length" => self::uint16, - "language" => self::uint16 - ); - - private static $subtable_v2_format_subheader = array( - "firstCode" => self::uint16, - "entryCount" => self::uint16, - "idDelta" => self::int16, - "idRangeOffset" => self::uint16 - ); - - private static $subtable_v4_format = array( - "length" => self::uint16, - "language" => self::uint16, - "segCountX2" => self::uint16, - "searchRange" => self::uint16, - "entrySelector" => self::uint16, - "rangeShift" => self::uint16, - ); - - private static $subtable_v12_format = array( - "length" => self::uint32, - "language" => self::uint32, - "ngroups" => self::uint32 - ); - - protected function _parse() { - $font = $this->getFont(); - - $cmap_offset = $font->pos(); - - $data = $font->unpack(self::$header_format); - - $subtables = array(); - for ($i = 0; $i < $data["numberSubtables"]; $i++) { - $subtables[] = $font->unpack(self::$subtable_header_format); - } - - $data["subtables"] = $subtables; - - foreach ($data["subtables"] as $i => &$subtable) { - $font->seek($cmap_offset + $subtable["offset"]); - - $subtable["format"] = $font->readUInt16(); - - switch ($subtable["format"]) { - case 0: - case 6: - case 8: - case 10: - case 13: - case 14: - unset($data["subtables"][$i]); - $data["numberSubtables"]--; - continue 2; - - case 2: - $subtable += $font->unpack(self::$subtable_v2_format); - - $subHeaderKeys = array_map(function($val) { return $val / 8; }, $font->readUInt16Many(256)); - $subHeaders = array(); - - $glyphIdArray = array(); - $maxSubHeaderIndex = max($subHeaderKeys); - for ($i = 0; $i <= $maxSubHeaderIndex; $i++) { - $subHeader = $font->unpack(self::$subtable_v2_format_subheader); - $offset = $font->pos(); - $subHeader["glyphIdArrayOffset"] = $offset + $subHeader["idRangeOffset"] - 2; - $subHeaders[$i] = $subHeader; - - if (!\array_key_exists($subHeader["glyphIdArrayOffset"], $glyphIdArray) || count($glyphIdArray[$subHeader["glyphIdArrayOffset"]]) < $subHeader["entryCount"]) { - $font->seek($subHeader["glyphIdArrayOffset"]); - $glyphIdArray[$subHeader["glyphIdArrayOffset"]] = $font->readUInt16Many($subHeader["entryCount"]); - $font->seek($offset); - } - } - - $glyphIndexArray = array(); - foreach ($subHeaderKeys as $highByte => $subHeaderKey) { - $subHeader = $subHeaders[$subHeaderKey]; - if ($subHeaderKey === 0) { - $c = $highByte; - if ($c < $subHeader["firstCode"] || $c >= ($subHeader["firstCode"] + $subHeader["entryCount"])) { - $glyphIndexArray[$c] = 0; - continue; - } - $c = $highByte; - $index = $c - $subHeader["firstCode"]; - $glyphId = $glyphIdArray[$subHeader["glyphIdArrayOffset"]][$index]; - if ($glyphId === 0) { - $glyphIndexArray[$c] = 0; - } else { - $glyphIndexArray[$c] = ($glyphId + $subHeader["idDelta"]) & 0xFFFF; - } - } else { - for ($index = 0; $index < $subHeader["entryCount"]; $index++) { - $c = null; - $lowByte = $subHeader["firstCode"] + $index; - $c = (($highByte & 0xFF) << 8) | ($lowByte & 0xFF); - $glyphId = $glyphIdArray[$subHeader["glyphIdArrayOffset"]][$index]; - if ($glyphId === 0) { - $glyphIndexArray[$c] = 0; - } else { - $glyphIndexArray[$c] = ($glyphId + $subHeader["idDelta"]) & 0xFFFF; - } - } - } - } - - $subtable += array( - "subHeaderKeys" => $subHeaderKeys, - "subHeaders" => $subHeaders, - "glyphIdArray" => $glyphIdArray, - "glyphIndexArray" => $glyphIndexArray - ); - - break; - - case 4: - $subtable += $font->unpack(self::$subtable_v4_format); - - $segCount = $subtable["segCountX2"] / 2; - $subtable["segCount"] = $segCount; - - $endCode = $font->readUInt16Many($segCount); - - $font->readUInt16(); // reservedPad - - $startCode = $font->readUInt16Many($segCount); - $idDelta = $font->readInt16Many($segCount); - - $ro_start = $font->pos(); - $idRangeOffset = $font->readUInt16Many($segCount); - - $glyphIndexArray = array(); - for ($i = 0; $i < $segCount; $i++) { - $c1 = $startCode[$i]; - $c2 = $endCode[$i]; - $d = $idDelta[$i]; - $ro = $idRangeOffset[$i]; - - if ($ro > 0) { - $font->seek($subtable["offset"] + 2 * $i + $ro); - } - - for ($c = $c1; $c <= $c2; $c++) { - if ($c === 0xFFFF) { - continue; - } - - if ($ro == 0) { - $gid = ($c + $d) & 0xFFFF; - } - else { - $offset = ($c - $c1) * 2 + $ro; - $offset = $ro_start + 2 * $i + $offset; - - $gid = 0; - if ($font->seek($offset) === true) { - $gid = $font->readUInt16(); - } - - if ($gid != 0) { - $gid = ($gid + $d) & 0xFFFF; - } - } - - if ($gid >= 0) { - $glyphIndexArray[$c] = $gid; - } - } - } - - $subtable += array( - "endCode" => $endCode, - "startCode" => $startCode, - "idDelta" => $idDelta, - "idRangeOffset" => $idRangeOffset, - "glyphIndexArray" => $glyphIndexArray - ); - break; - - case 12: - $font->readUInt16(); - - $subtable += $font->unpack(self::$subtable_v12_format); - - $glyphIndexArray = array(); - $endCodes = array(); - $startCodes = array(); - - for ($p = 0; $p < $subtable['ngroups']; $p++) { - - $startCode = $startCodes[] = $font->readUInt32(); - $endCode = $endCodes[] = $font->readUInt32(); - $startGlyphCode = $font->readUInt32(); - - for ($c = $startCode; $c <= $endCode; $c++) { - $glyphIndexArray[$c] = $startGlyphCode; - $startGlyphCode++; - } - } - - $subtable += array( - "startCode" => $startCodes, - "endCode" => $endCodes, - "glyphIndexArray" => $glyphIndexArray, - ); - break; - } - } - - $this->data = $data; - } - - function _encode() { - $font = $this->getFont(); - - $subset = $font->getSubset(); - $glyphIndexArray = $font->getUnicodeCharMap(); - - $newGlyphIndexArray = array(); - foreach ($glyphIndexArray as $code => $gid) { - $new_gid = array_search($gid, $subset); - if ($new_gid !== false) { - $newGlyphIndexArray[$code] = $new_gid; - } - } - - ksort($newGlyphIndexArray); // Sort by char code - - $segments = array(); - - $i = -1; - $prevCode = 0xFFFF; - $prevGid = 0xFFFF; - - foreach ($newGlyphIndexArray as $code => $gid) { - if ( - $prevCode + 1 != $code || - $prevGid + 1 != $gid - ) { - $i++; - $segments[$i] = array(); - } - - $segments[$i][] = array($code, $gid); - - $prevCode = $code; - $prevGid = $gid; - } - - $segments[][] = array(0xFFFF, null); - - $startCode = array(); - $endCode = array(); - $idDelta = array(); - - foreach ($segments as $codes) { - $start = reset($codes); - $end = end($codes); - - $startCode[] = $start[0]; - $endCode[] = $end[0]; - $idDelta[] = $start[1] - $start[0]; - } - - $segCount = count($startCode); - $idRangeOffset = array_fill(0, $segCount, 0); - - $searchRange = 1; - $entrySelector = 0; - while ($searchRange * 2 <= $segCount) { - $searchRange *= 2; - $entrySelector++; - } - $searchRange *= 2; - $rangeShift = $segCount * 2 - $searchRange; - - $subtables = array( - array( - // header - "platformID" => 3, // Unicode - "platformSpecificID" => 1, - "offset" => null, - - // subtable - "format" => 4, - "length" => null, - "language" => 0, - "segCount" => $segCount, - "segCountX2" => $segCount * 2, - "searchRange" => $searchRange, - "entrySelector" => $entrySelector, - "rangeShift" => $rangeShift, - "startCode" => $startCode, - "endCode" => $endCode, - "idDelta" => $idDelta, - "idRangeOffset" => $idRangeOffset, - "glyphIndexArray" => $newGlyphIndexArray, - ) - ); - - $data = array( - "version" => 0, - "numberSubtables" => count($subtables), - "subtables" => $subtables, - ); - - $length = $font->pack(self::$header_format, $data); - - $subtable_headers_size = $data["numberSubtables"] * 8; // size of self::$subtable_header_format - $subtable_headers_offset = $font->pos(); - - $length += $font->write(str_repeat("\0", $subtable_headers_size), $subtable_headers_size); - - // write subtables data - foreach ($data["subtables"] as $i => $subtable) { - $length_before = $length; - $data["subtables"][$i]["offset"] = $length; - - $length += $font->writeUInt16($subtable["format"]); - - $before_subheader = $font->pos(); - $length += $font->pack(self::$subtable_v4_format, $subtable); - - $segCount = $subtable["segCount"]; - $length += $font->w(array(self::uint16, $segCount), $subtable["endCode"]); - $length += $font->writeUInt16(0); // reservedPad - $length += $font->w(array(self::uint16, $segCount), $subtable["startCode"]); - $length += $font->w(array(self::int16, $segCount), $subtable["idDelta"]); - $length += $font->w(array(self::uint16, $segCount), $subtable["idRangeOffset"]); - $length += $font->w(array(self::uint16, $segCount), array_values($subtable["glyphIndexArray"])); - - $after_subtable = $font->pos(); - - $subtable["length"] = $length - $length_before; - $font->seek($before_subheader); - $font->pack(self::$subtable_v4_format, $subtable); - - $font->seek($after_subtable); - } - - // write subtables headers - $font->seek($subtable_headers_offset); - foreach ($data["subtables"] as $subtable) { - $font->pack(self::$subtable_header_format, $subtable); - } - - return $length; - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/cvt.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/cvt.php deleted file mode 100644 index 82a9514..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/cvt.php +++ /dev/null @@ -1,26 +0,0 @@ -getFont(); - $font->seek($this->entry->offset); - $this->rawData = $font->read($this->entry->length); - } - function _encode() { - return $this->getFont()->write($this->rawData, $this->entry->length); - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/fpgm.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/fpgm.php deleted file mode 100644 index e97d9ed..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/fpgm.php +++ /dev/null @@ -1,26 +0,0 @@ -getFont(); - $font->seek($this->entry->offset); - $this->rawData = $font->read($this->entry->length); - } - function _encode() { - return $this->getFont()->write($this->rawData, $this->entry->length); - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/glyf.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/glyf.php deleted file mode 100644 index 94ee2d3..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/glyf.php +++ /dev/null @@ -1,165 +0,0 @@ -getFont(); - $offset = $font->pos(); - - $loca = $font->getData("loca"); - $real_loca = array_slice($loca, 0, -1); // Not the last dummy loca entry - - $data = array(); - - foreach ($real_loca as $gid => $location) { - $_offset = $offset + $loca[$gid]; - $_size = $loca[$gid + 1] - $loca[$gid]; - $data[$gid] = Outline::init($this, $_offset, $_size, $font); - } - - $this->data = $data; - } - - public function getGlyphIDs($gids = array()) { - $glyphIDs = array(); - - foreach ($gids as $_gid) { - $_glyph = $this->data[$_gid]; - $glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs()); - } - - return array_unique(array_merge($gids, $glyphIDs)); - } - - public function toHTML($n = 500) { - $max = 160; - $font = $this->getFont(); - - $head = $font->getData("head"); - $head_json = json_encode($head); - - $os2 = $font->getData("OS/2"); - $os2_json = json_encode($os2); - - $hmtx = $font->getData("hmtx"); - $hmtx_json = json_encode($hmtx); - - $names = $font->getData("post", "names"); - $glyphIndexArray = array_flip($font->getUnicodeCharMap()); - - $width = (abs($head["xMin"]) + $head["xMax"]); - $height = (abs($head["yMin"]) + $head["yMax"]); - - $ratio = 1; - if ($width > $max || $height > $max) { - $ratio = max($width, $height) / $max; - $width = round($width / $ratio); - $height = round($height / $ratio); - } - - $s = "

" . "Only the first $n simple glyphs are shown (" . count($this->data) . " total) -
Simple glyph
-
Composite glyph
- Zoom: -

- "; - - foreach ($this->data as $g => $glyph) { - if ($n-- <= 0) { - break; - } - - $glyph->parseData(); - - $shape = array( - "SVGContours" => $glyph->getSVGContours(), - "xMin" => $glyph->xMin, - "yMin" => $glyph->yMin, - "xMax" => $glyph->xMax, - "yMax" => $glyph->yMax, - ); - $shape_json = json_encode($shape); - - $type = ($glyph instanceof OutlineSimple ? "simple" : "composite"); - $char = isset($glyphIndexArray[$g]) ? $glyphIndexArray[$g] : 0; - $name = isset($names[$g]) ? $names[$g] : sprintf("uni%04x", $char); - $char = $char ? "&#{$glyphIndexArray[$g]};" : ""; - - if ($char === "" && empty($shape["SVGContours"])) { - $n++; - continue; - } - - $s .= "
- $g - $char - $name - "; - - if ($type == "composite") { - foreach ($glyph->getGlyphIDs() as $_id) { - $s .= "$_id "; - } - } - - $s .= "
- -
- "; - } - - return $s; - } - - - protected function _encode() { - $font = $this->getFont(); - $subset = $font->getSubset(); - $data = $this->data; - - $loca = array(); - - $length = 0; - foreach ($subset as $gid) { - $loca[] = $length; - - $bytes = $data[$gid]->encode(); - - $pad = 0; - $mod = $bytes % 4; - if ($mod != 0) { - $pad = 4 - $mod; - $font->write(str_pad("", $pad, "\0"), $pad); - } - $length += $bytes + $pad; - } - - $loca[] = $length; // dummy loca - $font->getTableObject("loca")->data = $loca; - - return $length; - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/head.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/head.php deleted file mode 100644 index ce5a3a4..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/head.php +++ /dev/null @@ -1,50 +0,0 @@ - self::Fixed, - "fontRevision" => self::Fixed, - "checkSumAdjustment" => self::uint32, - "magicNumber" => self::uint32, - "flags" => self::uint16, - "unitsPerEm" => self::uint16, - "created" => self::longDateTime, - "modified" => self::longDateTime, - "xMin" => self::FWord, - "yMin" => self::FWord, - "xMax" => self::FWord, - "yMax" => self::FWord, - "macStyle" => self::uint16, - "lowestRecPPEM" => self::uint16, - "fontDirectionHint" => self::int16, - "indexToLocFormat" => self::int16, - "glyphDataFormat" => self::int16, - ); - - protected function _parse() { - parent::_parse(); - - if ($this->data["magicNumber"] != 0x5F0F3CF5) { - throw new Exception("Incorrect magic number (" . dechex($this->data["magicNumber"]) . ")"); - } - } - - function _encode() { - $this->data["checkSumAdjustment"] = 0; - return parent::_encode(); - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/hhea.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/hhea.php deleted file mode 100644 index becb9a4..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/hhea.php +++ /dev/null @@ -1,43 +0,0 @@ - self::Fixed, - "ascent" => self::FWord, - "descent" => self::FWord, - "lineGap" => self::FWord, - "advanceWidthMax" => self::uFWord, - "minLeftSideBearing" => self::FWord, - "minRightSideBearing" => self::FWord, - "xMaxExtent" => self::FWord, - "caretSlopeRise" => self::int16, - "caretSlopeRun" => self::int16, - "caretOffset" => self::FWord, - self::int16, - self::int16, - self::int16, - self::int16, - "metricDataFormat" => self::int16, - "numOfLongHorMetrics" => self::uint16, - ); - - function _encode() { - $font = $this->getFont(); - $this->data["numOfLongHorMetrics"] = count($font->getSubset()); - - return parent::_encode(); - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/hmtx.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/hmtx.php deleted file mode 100644 index ccd37d7..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/hmtx.php +++ /dev/null @@ -1,64 +0,0 @@ -getFont(); - $offset = $font->pos(); - - $numOfLongHorMetrics = $font->getData("hhea", "numOfLongHorMetrics"); - $numGlyphs = $font->getData("maxp", "numGlyphs"); - - $font->seek($offset); - - $data = array(); - $metrics = $font->readUInt16Many($numOfLongHorMetrics * 2); - for ($gid = 0, $mid = 0; $gid < $numOfLongHorMetrics; $gid++) { - $advanceWidth = isset($metrics[$mid]) ? $metrics[$mid] : 0; - $mid += 1; - $leftSideBearing = isset($metrics[$mid]) ? $metrics[$mid] : 0; - $mid += 1; - $data[$gid] = array($advanceWidth, $leftSideBearing); - } - - if ($numOfLongHorMetrics < $numGlyphs) { - $lastWidth = end($data)[0]; - $numLeft = $numGlyphs - $numOfLongHorMetrics; - $metrics = $font->readUInt16Many($numLeft); - for($i = 0; $i < $numLeft; $i++) { - $gid = $numOfLongHorMetrics + $i; - $leftSideBearing = isset($metrics[$i]) ? $metrics[$i] : 0; - $data[$gid] = array($lastWidth, $leftSideBearing); - } - } - - $this->data = $data; - } - - protected function _encode() { - $font = $this->getFont(); - $subset = $font->getSubset(); - $data = $this->data; - - $length = 0; - - foreach ($subset as $gid) { - $length += $font->writeUInt16($data[$gid][0]); - $length += $font->writeUInt16($data[$gid][1]); - } - - return $length; - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/kern.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/kern.php deleted file mode 100644 index 75f2c6f..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/kern.php +++ /dev/null @@ -1,79 +0,0 @@ -getFont(); - - $data = $font->unpack(array( - "version" => self::uint16, - "nTables" => self::uint16, - - // only the first subtable will be parsed - "subtableVersion" => self::uint16, - "length" => self::uint16, - "coverage" => self::uint16, - )); - - $data["format"] = ($data["coverage"] >> 8); - - $subtable = array(); - - switch ($data["format"]) { - case 0: - $subtable = $font->unpack(array( - "nPairs" => self::uint16, - "searchRange" => self::uint16, - "entrySelector" => self::uint16, - "rangeShift" => self::uint16, - )); - - $pairs = array(); - $tree = array(); - - $values = $font->readUInt16Many($subtable["nPairs"] * 3); - for ($i = 0, $idx = 0; $i < $subtable["nPairs"]; $i++) { - $left = $values[$idx++]; - $right = $values[$idx++]; - $value = $values[$idx++]; - - if ($value >= 0x8000) { - $value -= 0x10000; - } - - $pairs[] = array( - "left" => $left, - "right" => $right, - "value" => $value, - ); - - $tree[$left][$right] = $value; - } - - //$subtable["pairs"] = $pairs; - $subtable["tree"] = $tree; - break; - - case 1: - case 2: - case 3: - break; - } - - $data["subtable"] = $subtable; - - $this->data = $data; - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/loca.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/loca.php deleted file mode 100644 index bbd87d1..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/loca.php +++ /dev/null @@ -1,79 +0,0 @@ -getFont(); - $offset = $font->pos(); - - $indexToLocFormat = $font->getData("head", "indexToLocFormat"); - $numGlyphs = $font->getData("maxp", "numGlyphs"); - - $font->seek($offset); - - $data = array(); - - // 2 bytes - if ($indexToLocFormat == 0) { - $d = $font->read(($numGlyphs + 1) * 2); - $loc = unpack("n*", $d); - - for ($i = 0; $i <= $numGlyphs; $i++) { - $data[] = isset($loc[$i + 1]) ? $loc[$i + 1] * 2 : 0; - } - } - - // 4 bytes - else { - if ($indexToLocFormat == 1) { - $d = $font->read(($numGlyphs + 1) * 4); - $loc = unpack("N*", $d); - - for ($i = 0; $i <= $numGlyphs; $i++) { - $data[] = isset($loc[$i + 1]) ? $loc[$i + 1] : 0; - } - } - } - - $this->data = $data; - } - - function _encode() { - $font = $this->getFont(); - $data = $this->data; - - $indexToLocFormat = $font->getData("head", "indexToLocFormat"); - $numGlyphs = $font->getData("maxp", "numGlyphs"); - $length = 0; - - // 2 bytes - if ($indexToLocFormat == 0) { - for ($i = 0; $i <= $numGlyphs; $i++) { - $length += $font->writeUInt16($data[$i] / 2); - } - } - - // 4 bytes - else { - if ($indexToLocFormat == 1) { - for ($i = 0; $i <= $numGlyphs; $i++) { - $length += $font->writeUInt32($data[$i]); - } - } - } - - return $length; - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/maxp.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/maxp.php deleted file mode 100644 index 867125a..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/maxp.php +++ /dev/null @@ -1,41 +0,0 @@ - self::Fixed, - "numGlyphs" => self::uint16, - "maxPoints" => self::uint16, - "maxContours" => self::uint16, - "maxComponentPoints" => self::uint16, - "maxComponentContours" => self::uint16, - "maxZones" => self::uint16, - "maxTwilightPoints" => self::uint16, - "maxStorage" => self::uint16, - "maxFunctionDefs" => self::uint16, - "maxInstructionDefs" => self::uint16, - "maxStackElements" => self::uint16, - "maxSizeOfInstructions" => self::uint16, - "maxComponentElements" => self::uint16, - "maxComponentDepth" => self::uint16, - ); - - function _encode() { - $font = $this->getFont(); - $this->data["numGlyphs"] = count($font->getSubset()); - - return parent::_encode(); - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/name.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/name.php deleted file mode 100644 index 003a1e8..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/name.php +++ /dev/null @@ -1,241 +0,0 @@ - self::uint16, - "count" => self::uint16, - "stringOffset" => self::uint16, - ); - - const NAME_COPYRIGHT = 0; - const NAME_NAME = 1; - const NAME_SUBFAMILY = 2; - const NAME_SUBFAMILY_ID = 3; - const NAME_FULL_NAME = 4; - const NAME_VERSION = 5; - const NAME_POSTSCRIPT_NAME = 6; - const NAME_TRADEMARK = 7; - const NAME_MANUFACTURER = 8; - const NAME_DESIGNER = 9; - const NAME_DESCRIPTION = 10; - const NAME_VENDOR_URL = 11; - const NAME_DESIGNER_URL = 12; - const NAME_LICENSE = 13; - const NAME_LICENSE_URL = 14; - const NAME_PREFERRE_FAMILY = 16; - const NAME_PREFERRE_SUBFAMILY = 17; - const NAME_COMPAT_FULL_NAME = 18; - const NAME_SAMPLE_TEXT = 19; - - static $nameIdCodes = array( - 0 => "Copyright", - 1 => "FontName", - 2 => "FontSubfamily", - 3 => "UniqueID", - 4 => "FullName", - 5 => "Version", - 6 => "PostScriptName", - 7 => "Trademark", - 8 => "Manufacturer", - 9 => "Designer", - 10 => "Description", - 11 => "FontVendorURL", - 12 => "FontDesignerURL", - 13 => "LicenseDescription", - 14 => "LicenseURL", - // 15 - 16 => "PreferredFamily", - 17 => "PreferredSubfamily", - 18 => "CompatibleFullName", - 19 => "SampleText", - ); - - static $platforms = array( - 0 => "Unicode", - 1 => "Macintosh", - // 2 => Reserved - 3 => "Microsoft", - ); - - static $platformSpecific = array( - // Unicode - 0 => array( - 0 => "Default semantics", - 1 => "Version 1.1 semantics", - 2 => "ISO 10646 1993 semantics (deprecated)", - 3 => "Unicode 2.0 or later semantics", - ), - - // Macintosh - 1 => array( - 0 => "Roman", - 1 => "Japanese", - 2 => "Traditional Chinese", - 3 => "Korean", - 4 => "Arabic", - 5 => "Hebrew", - 6 => "Greek", - 7 => "Russian", - 8 => "RSymbol", - 9 => "Devanagari", - 10 => "Gurmukhi", - 11 => "Gujarati", - 12 => "Oriya", - 13 => "Bengali", - 14 => "Tamil", - 15 => "Telugu", - 16 => "Kannada", - 17 => "Malayalam", - 18 => "Sinhalese", - 19 => "Burmese", - 20 => "Khmer", - 21 => "Thai", - 22 => "Laotian", - 23 => "Georgian", - 24 => "Armenian", - 25 => "Simplified Chinese", - 26 => "Tibetan", - 27 => "Mongolian", - 28 => "Geez", - 29 => "Slavic", - 30 => "Vietnamese", - 31 => "Sindhi", - ), - - // Microsoft - 3 => array( - 0 => "Symbol", - 1 => "Unicode BMP (UCS-2)", - 2 => "ShiftJIS", - 3 => "PRC", - 4 => "Big5", - 5 => "Wansung", - 6 => "Johab", - // 7 => Reserved - // 8 => Reserved - // 9 => Reserved - 10 => "Unicode UCS-4", - ), - ); - - protected function _parse() { - $font = $this->getFont(); - - $tableOffset = $font->pos(); - - $data = $font->unpack(self::$header_format); - - $records = array(); - for ($i = 0; $i < $data["count"]; $i++) { - $record = new nameRecord(); - $record_data = $font->unpack(nameRecord::$format); - $record->map($record_data); - - $records[] = $record; - } - - $system_encodings = mb_list_encodings(); - $system_encodings = array_change_key_case(array_fill_keys($system_encodings, true), CASE_UPPER); - - $names = array(); - foreach ($records as $record) { - $font->seek($tableOffset + $data["stringOffset"] + $record->offset); - $record->stringRaw = $font->read($record->length); - - $encoding = null; - switch ($record->platformID) { - case 3: - switch ($record->platformSpecificID) { - case 2: - if (\array_key_exists("SJIS", $system_encodings)) { - $encoding = "SJIS"; - } - break; - case 3: - if (\array_key_exists("GB18030", $system_encodings)) { - $encoding = "GB18030"; - } - break; - case 4: - if (\array_key_exists("BIG-5", $system_encodings)) { - $encoding = "BIG-5"; - } - break; - case 5: - if (\array_key_exists("UHC", $system_encodings)) { - $encoding = "UHC"; - } - break; - } - break; - } - if ($encoding === null) { - $encoding = "UTF-16"; - } - - $record->string = mb_convert_encoding($record->stringRaw, "UTF-8", $encoding); - if (strpos($record->string, "\0") !== false) { - $record->string = str_replace("\0", "", $record->string); - } - $names[$record->nameID] = $record; - } - - $data["records"] = $names; - - $this->data = $data; - } - - protected function _encode() { - $font = $this->getFont(); - - /** @var nameRecord[] $records */ - $records = $this->data["records"]; - $count_records = \count($records); - - $this->data["count"] = $count_records; - $this->data["stringOffset"] = 6 + ($count_records * 12); // 6 => uint16 * 3, 12 => sizeof self::$record_format - - $length = $font->pack(self::$header_format, $this->data); - - $offset = 0; - - /** @var nameRecord[] $records_to_encode */ - $records_to_encode = array(); - foreach ($records as $record) { - $encoded_record = new nameRecord(); - $encoded_record->platformID = 3; - $encoded_record->platformSpecificID = 1; - $encoded_record->languageID = $record->languageID; - $encoded_record->nameID = $record->nameID; - $encoded_record->offset = $offset; - $encoded_record->string = $record->string; - $encoded_record->length = mb_strlen($encoded_record->getUTF16(), "8bit"); - $records_to_encode[] = $encoded_record; - - $offset += $encoded_record->length; - $length += $font->pack(nameRecord::$format, (array)$encoded_record); - } - - foreach ($records_to_encode as $record) { - $str = $record->getUTF16(); - $length += $font->write($str, mb_strlen($str, "8bit")); - } - - return $length; - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/nameRecord.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/nameRecord.php deleted file mode 100644 index 162629d..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/nameRecord.php +++ /dev/null @@ -1,53 +0,0 @@ - self::uint16, - "platformSpecificID" => self::uint16, - "languageID" => self::uint16, - "nameID" => self::uint16, - "length" => self::uint16, - "offset" => self::uint16, - ); - - public function map($data) { - foreach ($data as $key => $value) { - $this->$key = $value; - } - } - - public function getUTF8() { - return $this->string; - } - - public function getUTF16() { - return Font::UTF8ToUTF16($this->string); - } - - function __toString() { - return $this->string; - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/os2.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/os2.php deleted file mode 100644 index b1a2016..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/os2.php +++ /dev/null @@ -1,46 +0,0 @@ - self::uint16, - "xAvgCharWidth" => self::int16, - "usWeightClass" => self::uint16, - "usWidthClass" => self::uint16, - "fsType" => self::int16, - "ySubscriptXSize" => self::int16, - "ySubscriptYSize" => self::int16, - "ySubscriptXOffset" => self::int16, - "ySubscriptYOffset" => self::int16, - "ySuperscriptXSize" => self::int16, - "ySuperscriptYSize" => self::int16, - "ySuperscriptXOffset" => self::int16, - "ySuperscriptYOffset" => self::int16, - "yStrikeoutSize" => self::int16, - "yStrikeoutPosition" => self::int16, - "sFamilyClass" => self::int16, - "panose" => array(self::uint8, 10), - "ulCharRange" => array(self::uint32, 4), - "achVendID" => array(self::char, 4), - "fsSelection" => self::uint16, - "fsFirstCharIndex" => self::uint16, - "fsLastCharIndex" => self::uint16, - "typoAscender" => self::int16, - "typoDescender" => self::int16, - "typoLineGap" => self::int16, - "winAscent" => self::int16, - "winDescent" => self::int16, - ); -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/post.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/post.php deleted file mode 100644 index 3b29c08..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/post.php +++ /dev/null @@ -1,142 +0,0 @@ - self::Fixed, - "italicAngle" => self::Fixed, - "underlinePosition" => self::FWord, - "underlineThickness" => self::FWord, - "isFixedPitch" => self::uint32, - "minMemType42" => self::uint32, - "maxMemType42" => self::uint32, - "minMemType1" => self::uint32, - "maxMemType1" => self::uint32, - ); - - protected function _parse() { - $font = $this->getFont(); - $data = $font->unpack($this->def); - - $names = array(); - - switch ($data["format"]) { - case 1: - $names = File::$macCharNames; - break; - - case 2: - $data["numberOfGlyphs"] = $font->readUInt16(); - - $glyphNameIndex = $font->readUInt16Many($data["numberOfGlyphs"]); - - $data["glyphNameIndex"] = $glyphNameIndex; - - $namesPascal = array(); - for ($i = 0; $i < $data["numberOfGlyphs"]; $i++) { - $len = $font->readUInt8(); - $namesPascal[] = $font->read($len); - } - - foreach ($glyphNameIndex as $g => $index) { - if ($index < 258) { - $names[$g] = File::$macCharNames[$index]; - } - else { - if (array_key_exists($index - 258, $namesPascal)) { - $names[$g] = $namesPascal[$index - 258]; - } - } - } - - break; - - case 2.5: - // TODO - break; - - case 3: - // nothing - break; - - case 4: - // TODO - break; - } - - $data["names"] = $names; - - $this->data = $data; - } - - function _encode() { - $font = $this->getFont(); - $data = $this->data; - $data["format"] = 3; - - $length = $font->pack($this->def, $data); - - return $length; - /* - $subset = $font->getSubset(); - - switch($data["format"]) { - case 1: - // nothing to do - break; - - case 2: - $old_names = $data["names"]; - - $glyphNameIndex = range(0, count($subset)); - - $names = array(); - foreach($subset as $gid) { - $names[] = $data["names"][$data["glyphNameIndex"][$gid]]; - } - - $numberOfGlyphs = count($names); - $length += $font->writeUInt16($numberOfGlyphs); - - foreach($glyphNameIndex as $gni) { - $length += $font->writeUInt16($gni); - } - - //$names = array_slice($names, 257); - foreach($names as $name) { - $len = strlen($name); - $length += $font->writeUInt8($len); - $length += $font->write($name, $len); - } - - break; - - case 2.5: - // TODO - break; - - case 3: - // nothing - break; - - case 4: - // TODO - break; - } - - return $length;*/ - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/prep.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/prep.php deleted file mode 100644 index a8442cf..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/prep.php +++ /dev/null @@ -1,29 +0,0 @@ -getFont(); - $font->seek($this->entry->offset); - $this->rawData = $font->read($this->entry->length); - } - function _encode() { - return $this->getFont()->write($this->rawData, $this->entry->length); - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/Collection.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/Collection.php deleted file mode 100644 index 2c97030..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/Collection.php +++ /dev/null @@ -1,99 +0,0 @@ -numFonts)) { - return; - } - - $this->read(4); // tag name - - $this->version = $this->readFixed(); - $this->numFonts = $this->readUInt32(); - - for ($i = 0; $i < $this->numFonts; $i++) { - $this->collectionOffsets[] = $this->readUInt32(); - } - } - - /** - * @param int $fontId - * - * @throws OutOfBoundsException - * @return File - */ - function getFont($fontId) { - $this->parse(); - - if (!isset($this->collectionOffsets[$fontId])) { - throw new OutOfBoundsException(); - } - - if (isset($this->collection[$fontId])) { - return $this->collection[$fontId]; - } - - $font = new File(); - $font->f = $this->f; - $font->setTableOffset($this->collectionOffsets[$fontId]); - - return $this->collection[$fontId] = $font; - } - - function current() { - return $this->getFont($this->position); - } - - function key() { - return $this->position; - } - - function next() { - return ++$this->position; - } - - function rewind() { - $this->position = 0; - } - - function valid() { - $this->parse(); - - return isset($this->collectionOffsets[$this->position]); - } - - function count() { - $this->parse(); - - return $this->numFonts; - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/File.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/File.php deleted file mode 100644 index f4c797a..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/File.php +++ /dev/null @@ -1,590 +0,0 @@ -> 0x05) === 0x06) { // 2 bytes character (0x06 = 110 BIN) - $bytes[] = ($o - 0xC0) << 0x06; - $numbytes = 2; - } elseif (($o >> 0x04) === 0x0E) { // 3 bytes character (0x0E = 1110 BIN) - $bytes[] = ($o - 0xE0) << 0x0C; - $numbytes = 3; - } elseif (($o >> 0x03) === 0x1E) { // 4 bytes character (0x1E = 11110 BIN) - $bytes[] = ($o - 0xF0) << 0x12; - $numbytes = 4; - } else { - $ord = false; - break; - } - } elseif (($o >> 0x06) === 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN - $bytes[] = $o - 0x80; - if (\count($bytes) === $numbytes) { - // compose UTF-8 bytes to a single unicode value - $o = $bytes[0]; - for ($j = 1; $j < $numbytes; $j++) { - $o += ($bytes[$j] << (($numbytes - $j - 1) * 0x06)); - } - if ((($o >= 0xD800) and ($o <= 0xDFFF)) or ($o >= 0x10FFFF)) { - // The definition of UTF-8 prohibits encoding character numbers between - // U+D800 and U+DFFF, which are reserved for use with the UTF-16 - // encoding form (as surrogate pairs) and do not directly represent - // characters. - return false; - } else { - $ord = $o; // add char to array - } - // reset data for next char - $bytes = []; - $numbytes = 1; - } - } else { - $ord = false; - break; - } - } - - return $ord; - } - - function getTable() { - $this->parseTableEntries(); - - return $this->directory; - } - - function setTableOffset($offset) { - $this->tableOffset = $offset; - } - - function parse() { - $this->parseTableEntries(); - - $this->data = array(); - - foreach ($this->directory as $tag => $table) { - if (empty($this->data[$tag])) { - $this->readTable($tag); - } - } - } - - function utf8toUnicode($str) { - $len = mb_strlen($str, '8bit'); - $out = array(); - - for ($i = 0; $i < $len; $i++) { - $uni = -1; - $h = ord($str[$i]); - - if ($h <= 0x7F) { - $uni = $h; - } - elseif ($h >= 0xC2) { - if (($h <= 0xDF) && ($i < $len - 1)) { - $uni = ($h & 0x1F) << 6 | (ord($str[++$i]) & 0x3F); - } - elseif (($h <= 0xEF) && ($i < $len - 2)) { - $uni = ($h & 0x0F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F); - } - elseif (($h <= 0xF4) && ($i < $len - 3)) { - $uni = ($h & 0x0F) << 18 | (ord($str[++$i]) & 0x3F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F); - } - } - - if ($uni >= 0) { - $out[] = $uni; - } - } - - return $out; - } - - function getUnicodeCharMap() { - $subtable = null; - foreach ($this->getData("cmap", "subtables") as $_subtable) { - if ($_subtable["platformID"] == 0 || ($_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1)) { - $subtable = $_subtable; - break; - } - } - - if ($subtable) { - return $subtable["glyphIndexArray"]; - } - - $system_encodings = mb_list_encodings(); - $system_encodings = array_change_key_case(array_fill_keys($system_encodings, true), CASE_UPPER); - foreach ($this->getData("cmap", "subtables") as $_subtable) { - $encoding = null; - switch ($_subtable["platformID"]) { - case 3: - switch ($_subtable["platformSpecificID"]) { - case 2: - if (\array_key_exists("SJIS", $system_encodings)) { - $encoding = "SJIS"; - } - break; - case 3: - if (\array_key_exists("GB18030", $system_encodings)) { - $encoding = "GB18030"; - } - break; - case 4: - if (\array_key_exists("BIG-5", $system_encodings)) { - $encoding = "BIG-5"; - } - break; - case 5: - if (\array_key_exists("UHC", $system_encodings)) { - $encoding = "UHC"; - } - break; - } - break; - } - if ($encoding) { - $glyphIndexArray = array(); - foreach ($_subtable["glyphIndexArray"] as $c => $gid) { - $str = trim(pack("N", $c)); - if (\strlen($str) > 0) { - $ord = $this->uniord($str, $encoding); - if ($ord > 0) { - $glyphIndexArray[$ord] = $gid; - } - } - } - return $glyphIndexArray; - } - } - - return null; - } - - function setSubset($subset) { - if (!is_array($subset)) { - $subset = $this->utf8toUnicode($subset); - } - - $subset = array_unique($subset); - - $glyphIndexArray = $this->getUnicodeCharMap(); - - if (!$glyphIndexArray) { - return; - } - - $gids = array( - 0, // .notdef - 1, // .null - ); - - foreach ($subset as $code) { - if (!isset($glyphIndexArray[$code])) { - continue; - } - - $gid = $glyphIndexArray[$code]; - $gids[$gid] = $gid; - } - - /** @var glyf $glyf */ - $glyf = $this->getTableObject("glyf"); - if ($glyf) { - $gids = $glyf->getGlyphIDs($gids); - sort($gids); - $this->glyph_subset = $gids; - } - $this->glyph_all = array_values($glyphIndexArray); // FIXME - } - - function getSubset() { - if (empty($this->glyph_subset)) { - return $this->glyph_all; - } - - return $this->glyph_subset; - } - - function encode($tags = array()) { - if (!self::$raw) { - $tags = array_merge(array("head", "hhea", "cmap", "hmtx", "maxp", "glyf", "loca", "name", "post", "cvt ", "fpgm", "prep"), $tags); - } - else { - $tags = array_keys($this->directory); - } - - $n = 16; // @todo - - Font::d("Tables : " . implode(", ", $tags)); - - /** @var DirectoryEntry[] $entries */ - $entries = array(); - foreach ($tags as $tag) { - if (!isset($this->directory[$tag])) { - Font::d(" >> '$tag' table doesn't exist"); - continue; - } - - $entries[$tag] = $this->directory[$tag]; - } - - $num_tables = count($entries); - $exponent = floor(log($num_tables, 2)); - $power_of_two = pow(2, $exponent); - - $this->header->data["numTables"] = $num_tables; - $this->header->data["searchRange"] = $power_of_two * 16; - $this->header->data["entrySelector"] = log($power_of_two, 2); - $this->header->data["rangeShift"] = $num_tables * 16 - $this->header->data["searchRange"]; - $this->header->encode(); - - $directory_offset = $this->pos(); - $offset = $directory_offset + $num_tables * $n; - $this->seek($offset); - - $i = 0; - foreach ($entries as $entry) { - $entry->encode($directory_offset + $i * $n); - $i++; - } - } - - function parseHeader() { - if (!empty($this->header)) { - return; - } - - $this->seek($this->tableOffset); - - $this->header = new Header($this); - $this->header->parse(); - } - - function getFontType(){ - $class_parts = explode("\\", get_class($this)); - return $class_parts[1]; - } - - function parseTableEntries() { - $this->parseHeader(); - - if (!empty($this->directory)) { - return; - } - - if (empty($this->header->data["numTables"])) { - return; - } - - - $type = $this->getFontType(); - $class = "FontLib\\$type\\TableDirectoryEntry"; - - for ($i = 0; $i < $this->header->data["numTables"]; $i++) { - /** @var TableDirectoryEntry $entry */ - $entry = new $class($this); - $entry->parse(); - - $this->directory[$entry->tag] = $entry; - } - } - - function normalizeFUnit($value, $base = 1000) { - return round($value * ($base / $this->getData("head", "unitsPerEm"))); - } - - protected function readTable($tag) { - $this->parseTableEntries(); - - if (!self::$raw) { - $name_canon = preg_replace("/[^a-z0-9]/", "", strtolower($tag)); - - $class = "FontLib\\Table\\Type\\$name_canon"; - - if (!isset($this->directory[$tag]) || !@class_exists($class)) { - return; - } - } - else { - $class = "FontLib\\Table\\Table"; - } - - /** @var Table $table */ - $table = new $class($this->directory[$tag]); - $table->parse(); - - $this->data[$tag] = $table; - } - - /** - * @param $name - * - * @return Table - */ - public function getTableObject($name) { - if (\array_key_exists($name, $this->data)) { - return $this->data[$name]; - } - return null; - } - - public function setTableObject($name, Table $data) { - $this->data[$name] = $data; - } - - public function getData($name, $key = null) { - $this->parseTableEntries(); - - if (empty($this->data[$name])) { - $this->readTable($name); - } - - if (!isset($this->data[$name])) { - return null; - } - - if (!$key) { - return $this->data[$name]->data; - } - else { - return $this->data[$name]->data[$key]; - } - } - - function addDirectoryEntry(DirectoryEntry $entry) { - $this->directory[$entry->tag] = $entry; - } - - function saveAdobeFontMetrics($file, $encoding = null) { - $afm = new AdobeFontMetrics($this); - $afm->write($file, $encoding); - } - - /** - * Get a specific name table string value from its ID - * - * @param int $nameID The name ID - * - * @return string|null - */ - function getNameTableString($nameID) { - /** @var nameRecord[] $records */ - $records = $this->getData("name", "records"); - - if (!isset($records[$nameID])) { - return null; - } - - return $records[$nameID]->string; - } - - /** - * Get font copyright - * - * @return string|null - */ - function getFontCopyright() { - return $this->getNameTableString(name::NAME_COPYRIGHT); - } - - /** - * Get font name - * - * @return string|null - */ - function getFontName() { - return $this->getNameTableString(name::NAME_NAME); - } - - /** - * Get font subfamily - * - * @return string|null - */ - function getFontSubfamily() { - return $this->getNameTableString(name::NAME_SUBFAMILY); - } - - /** - * Get font subfamily ID - * - * @return string|null - */ - function getFontSubfamilyID() { - return $this->getNameTableString(name::NAME_SUBFAMILY_ID); - } - - /** - * Get font full name - * - * @return string|null - */ - function getFontFullName() { - return $this->getNameTableString(name::NAME_FULL_NAME); - } - - /** - * Get font version - * - * @return string|null - */ - function getFontVersion() { - return $this->getNameTableString(name::NAME_VERSION); - } - - /** - * Get font weight - * - * @return string|null - */ - function getFontWeight() { - return $this->getTableObject("OS/2")->data["usWeightClass"]; - } - - /** - * Get font Postscript name - * - * @return string|null - */ - function getFontPostscriptName() { - return $this->getNameTableString(name::NAME_POSTSCRIPT_NAME); - } - - function reduce() { - $names_to_keep = array( - name::NAME_COPYRIGHT, - name::NAME_NAME, - name::NAME_SUBFAMILY, - name::NAME_SUBFAMILY_ID, - name::NAME_FULL_NAME, - name::NAME_VERSION, - name::NAME_POSTSCRIPT_NAME, - ); - - foreach ($this->data["name"]->data["records"] as $id => $rec) { - if (!in_array($id, $names_to_keep)) { - unset($this->data["name"]->data["records"][$id]); - } - } - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/Header.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/Header.php deleted file mode 100644 index 7c04728..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/Header.php +++ /dev/null @@ -1,30 +0,0 @@ - self::uint32, - "numTables" => self::uint16, - "searchRange" => self::uint16, - "entrySelector" => self::uint16, - "rangeShift" => self::uint16, - ); - - public function parse() { - parent::parse(); - - $format = $this->data["format"]; - $this->data["formatText"] = $this->convertUInt32ToStr($format); - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/TableDirectoryEntry.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/TableDirectoryEntry.php deleted file mode 100644 index 3ddd6d0..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/TableDirectoryEntry.php +++ /dev/null @@ -1,32 +0,0 @@ -font; - $this->checksum = $font->readUInt32(); - $this->offset = $font->readUInt32(); - $this->length = $font->readUInt32(); - $this->entryLength += 12; - } -} - diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/File.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/File.php deleted file mode 100644 index bbc40fb..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/File.php +++ /dev/null @@ -1,80 +0,0 @@ -header)) { - return; - } - - $this->header = new Header($this); - $this->header->parse(); - } - - public function load($file) { - parent::load($file); - - $this->parseTableEntries(); - $dataOffset = $this->pos() + count($this->directory) * 20; - - $fw = $this->getTempFile(false); - $fr = $this->f; - - $this->f = $fw; - $offset = $this->header->encode(); - - foreach ($this->directory as $entry) { - // Read ... - $this->f = $fr; - $this->seek($entry->offset); - $data = $this->read($entry->length); - - if ($entry->length < $entry->origLength) { - $data = (string) gzuncompress($data); - } - - // Prepare data ... - $length = mb_strlen($data, '8bit'); - $entry->length = $entry->origLength = $length; - $entry->offset = $dataOffset; - - // Write ... - $this->f = $fw; - - // Woff Entry - $this->seek($offset); - $offset += $this->write($entry->tag, 4); // tag - $offset += $this->writeUInt32($dataOffset); // offset - $offset += $this->writeUInt32($length); // length - $offset += $this->writeUInt32($length); // origLength - $offset += $this->writeUInt32(DirectoryEntry::computeChecksum($data)); // checksum - - // Data - $this->seek($dataOffset); - $dataOffset += $this->write($data, $length); - } - - $this->f = $fw; - $this->seek(0); - - // Need to re-parse this, don't know why - $this->header = null; - $this->directory = array(); - $this->parseTableEntries(); - } -} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/Header.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/Header.php deleted file mode 100644 index e87a8d3..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/Header.php +++ /dev/null @@ -1,31 +0,0 @@ - self::uint32, - "flavor" => self::uint32, - "length" => self::uint32, - "numTables" => self::uint16, - self::uint16, - "totalSfntSize" => self::uint32, - "majorVersion" => self::uint16, - "minorVersion" => self::uint16, - "metaOffset" => self::uint32, - "metaLength" => self::uint32, - "metaOrigLength" => self::uint32, - "privOffset" => self::uint32, - "privLength" => self::uint32, - ); -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/TableDirectoryEntry.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/TableDirectoryEntry.php deleted file mode 100644 index b57a650..0000000 --- a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/TableDirectoryEntry.php +++ /dev/null @@ -1,33 +0,0 @@ -font; - $this->offset = $font->readUInt32(); - $this->length = $font->readUInt32(); - $this->origLength = $font->readUInt32(); - $this->checksum = $font->readUInt32(); - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/AUTHORS.md b/dompdf/vendor/dompdf/php-svg-lib/AUTHORS.md deleted file mode 100644 index 6642e3d..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/AUTHORS.md +++ /dev/null @@ -1,17 +0,0 @@ -SvgLib was designed and developed by Fabien Ménager. - -### Current Team - -* **Brian Sweeney** (maintainer) - -### Alumni - -* **Fabien Ménager** (creator) - -### Contributors -* **ssddanbrown** -* [and many more...](https://github.com/dompdf/php-svg-lib/graphs/contributors) - -### Thanks - -SvgLib would not have been possible without strong community support. \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-svg-lib/LICENSE b/dompdf/vendor/dompdf/php-svg-lib/LICENSE deleted file mode 100644 index 0a04128..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/dompdf/vendor/dompdf/php-svg-lib/README.md b/dompdf/vendor/dompdf/php-svg-lib/README.md deleted file mode 100644 index ff3c921..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# SVG file parsing / rendering library - -[![Build Status](https://github.com/dompdf/php-svg-lib/actions/workflows/test.yml/badge.svg)](https://github.com/dompdf/php-svg-lib/actions/workflows/test.yml) - -[![Latest Stable Version](https://poser.pugx.org/phenx/php-svg-lib/v/stable)](https://packagist.org/packages/phenx/php-svg-lib) -[![Total Downloads](https://poser.pugx.org/phenx/php-svg-lib/downloads)](https://packagist.org/packages/phenx/php-svg-lib) -[![Latest Unstable Version](https://poser.pugx.org/phenx/php-svg-lib/v/unstable)](https://packagist.org/packages/phenx/php-svg-lib) -[![License](https://poser.pugx.org/phenx/php-svg-lib/license)](https://packagist.org/packages/phenx/php-svg-lib) - -The main purpose of this lib is to rasterize SVG to a surface which can be an image or a PDF for example, through a `\Svg\Surface` PHP interface. - -This project was initialized by the need to render SVG documents inside PDF files for the [DomPdf](https://github.com/dompdf/dompdf) project. diff --git a/dompdf/vendor/dompdf/php-svg-lib/composer.json b/dompdf/vendor/dompdf/php-svg-lib/composer.json deleted file mode 100644 index bf2b153..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/composer.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "dompdf/php-svg-lib", - "type": "library", - "description": "A library to read, parse and export to PDF SVG files.", - "homepage": "https://github.com/dompdf/php-svg-lib", - "license": "LGPL-3.0-or-later", - "authors": [ - { - "name": "The SvgLib Community", - "homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md" - } - ], - "autoload": { - "psr-4": { - "Svg\\": "src/Svg" - } - }, - "autoload-dev": { - "psr-4": { - "Svg\\Tests\\": "tests/Svg" - } - }, - "require": { - "php": "^7.1 || ^8.0", - "ext-mbstring": "*", - "sabberworm/php-css-parser": "^8.4" - }, - "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5" - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/CssLength.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/CssLength.php deleted file mode 100644 index 88eda8c..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/CssLength.php +++ /dev/null @@ -1,135 +0,0 @@ - - */ - protected static $inchDivisions = [ - 'in' => 1, - 'cm' => 2.54, - 'mm' => 25.4, - 'q' => 101.6, - 'pc' => 6, - 'pt' => 72, - ]; - - /** - * The CSS length unit indicator. - * Will be lower-case and one of the units listed in the '$units' array or empty. - * - * @var string - */ - protected $unit = ''; - - /** - * The numeric value of the given length. - * - * @var float - */ - protected $value = 0; - - /** - * The original unparsed length provided. - * - * @var string - */ - protected $unparsed; - - public function __construct(string $length) - { - $this->unparsed = $length; - $this->parseLengthComponents($length); - } - - /** - * Parse out the unit and value components from the given string length. - */ - protected function parseLengthComponents(string $length): void - { - $length = strtolower($length); - - foreach (self::$units as $unit) { - $pos = strpos($length, $unit); - if ($pos) { - $this->value = floatval(substr($length, 0, $pos)); - $this->unit = $unit; - return; - } - } - - $this->unit = ''; - $this->value = floatval($length); - } - - /** - * Get the unit type of this css length. - * Units are standardised to be lower-cased. - * - * @return string - */ - public function getUnit(): string - { - return $this->unit; - } - - /** - * Get this CSS length in the equivalent pixel count size. - * - * @param float $referenceSize - * @param float $dpi - * - * @return float - */ - public function toPixels(float $referenceSize = 11.0, float $dpi = 96.0): float - { - // Standard relative units - if (in_array($this->unit, ['em', 'rem', 'ex', 'ch'])) { - return $this->value * $referenceSize; - } - - // Percentage relative units - if (in_array($this->unit, ['%', 'vw', 'vh', 'vmin', 'vmax'])) { - return $this->value * ($referenceSize / 100); - } - - // Inch relative units - if (in_array($this->unit, array_keys(static::$inchDivisions))) { - $inchValue = $this->value * $dpi; - $division = static::$inchDivisions[$this->unit]; - return $inchValue / $division; - } - - return $this->value; - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/DefaultStyle.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/DefaultStyle.php deleted file mode 100644 index e27bdb9..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/DefaultStyle.php +++ /dev/null @@ -1,28 +0,0 @@ -filename = $filename; - } - - protected function initParser() { - $parser = xml_parser_create("utf-8"); - xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false); - xml_set_element_handler( - $parser, - array($this, "_tagStart"), - array($this, "_tagEnd") - ); - xml_set_character_data_handler( - $parser, - array($this, "_charData") - ); - - return $parser; - } - - public function __construct() { - - } - - /** - * Increase the nesting level for defs-like elements - * - * @return int - */ - public function enterDefs () { - $this->_defs_depth++; - $this->inDefs = true; - return $this->_defs_depth; - } - - /** - * Decrease the nesting level for defs-like elements - * - * @return int - */ - public function exitDefs () { - $this->_defs_depth--; - if ($this->_defs_depth < 0) { - $this->_defs_depth = 0; - } - $this->inDefs = ($this->_defs_depth > 0 ? true : false); - return $this->_defs_depth; - } - - /** - * @return SurfaceInterface - */ - public function getSurface() - { - return $this->surface; - } - - public function getStack() - { - return $this->stack; - } - - public function getWidth() - { - return $this->width; - } - - public function getHeight() - { - return $this->height; - } - - public function getDiagonal() - { - return sqrt(($this->width)**2 + ($this->height)**2) / sqrt(2); - } - - public function getDimensions() { - $rootAttributes = null; - - $parser = xml_parser_create("utf-8"); - xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false); - xml_set_element_handler( - $parser, - function ($parser, $name, $attributes) use (&$rootAttributes) { - if ($name === "svg" && $rootAttributes === null) { - $attributes = array_change_key_case($attributes, CASE_LOWER); - - $rootAttributes = $attributes; - } - }, - function ($parser, $name) {} - ); - - $fp = fopen($this->filename, "r"); - while ($line = fread($fp, 8192)) { - xml_parse($parser, $line, false); - - if ($rootAttributes !== null) { - break; - } - } - xml_parse($parser, "", true); - - xml_parser_free($parser); - - return $this->handleSizeAttributes($rootAttributes); - } - - public function handleSizeAttributes($attributes){ - if ($this->width === null) { - if (isset($attributes["width"])) { - $width = $this->convertSize($attributes["width"], 400); - $this->width = $width; - } - - if (isset($attributes["height"])) { - $height = $this->convertSize($attributes["height"], 300); - $this->height = $height; - } - - if (isset($attributes['viewbox'])) { - $viewBox = preg_split('/[\s,]+/is', trim($attributes['viewbox'])); - if (count($viewBox) == 4) { - $this->x = $viewBox[0]; - $this->y = $viewBox[1]; - - if (!$this->width) { - $this->width = $viewBox[2]; - } - if (!$this->height) { - $this->height = $viewBox[3]; - } - } - } - } - - return array( - 0 => $this->width, - 1 => $this->height, - - "width" => $this->width, - "height" => $this->height, - ); - } - - public function getDocument(){ - return $this; - } - - /** - * Append a style sheet - * - * @param \Sabberworm\CSS\CSSList\Document $stylesheet - */ - public function appendStyleSheet($stylesheet) { - $this->styleSheets[] = $stylesheet; - } - - /** - * Get the document style sheets - * - * @return \Sabberworm\CSS\CSSList\Document[] - */ - public function getStyleSheets() { - return $this->styleSheets; - } - - protected function before($attributes) - { - $surface = $this->getSurface(); - - $style = new DefaultStyle($this); - $style->inherit($this); - $style->fromAttributes($attributes); - - $this->setStyle($style); - - $surface->setStyle($style); - } - - public function render(SurfaceInterface $surface) - { - $this->_defs_depth = 0; - $this->inDefs = false; - $this->surface = $surface; - - $parser = $this->initParser(); - - if ($this->x || $this->y) { - $surface->translate(-$this->x, -$this->y); - } - - $fp = fopen($this->filename, "r"); - while ($line = fread($fp, 8192)) { - xml_parse($parser, $line, false); - } - - xml_parse($parser, "", true); - - xml_parser_free($parser); - } - - protected function svgOffset($attributes) - { - $this->attributes = $attributes; - - $this->handleSizeAttributes($attributes); - } - - public function getDef($id) { - $id = ltrim($id, "#"); - - return isset($this->defs[$id]) ? $this->defs[$id] : null; - } - - private function _tagStart($parser, $name, $attributes) - { - $this->x = 0; - $this->y = 0; - - $tag = null; - - $attributes = array_change_key_case($attributes, CASE_LOWER); - - switch (strtolower($name)) { - case 'defs': - $this->enterDefs(); - return; - - case 'svg': - if (count($this->attributes)) { - $tag = new Group($this, $name); - } - else { - $tag = $this; - $this->svgOffset($attributes); - } - break; - - case 'path': - $tag = new Path($this, $name); - break; - - case 'rect': - $tag = new Rect($this, $name); - break; - - case 'circle': - $tag = new Circle($this, $name); - break; - - case 'ellipse': - $tag = new Ellipse($this, $name); - break; - - case 'image': - $tag = new Image($this, $name); - break; - - case 'line': - $tag = new Line($this, $name); - break; - - case 'polyline': - $tag = new Polyline($this, $name); - break; - - case 'polygon': - $tag = new Polygon($this, $name); - break; - - case 'lineargradient': - $tag = new LinearGradient($this, $name); - break; - - case 'radialgradient': - $tag = new LinearGradient($this, $name); - break; - - case 'stop': - $tag = new Stop($this, $name); - break; - - case 'style': - $tag = new StyleTag($this, $name); - break; - - case 'a': - $tag = new Anchor($this, $name); - break; - - case 'g': - $tag = new Group($this, $name); - break; - - case 'symbol': - $this->enterDefs(); - $tag = new Symbol($this, $name); - break; - - case 'clippath': - $tag = new ClipPath($this, $name); - break; - - case 'use': - $tag = new UseTag($this, $name); - break; - - case 'text': - $tag = new Text($this, $name); - break; - - case 'desc': - return; - } - - if ($tag) { - if (isset($attributes["id"])) { - $this->defs[$attributes["id"]] = $tag; - } - else { - /** @var AbstractTag $top */ - $top = end($this->stack); - if ($top && $top != $tag) { - $top->children[] = $tag; - } - } - - $this->stack[] = $tag; - - $tag->handle($attributes); - } - } - - function _charData($parser, $data) - { - $stack_top = end($this->stack); - - if ($stack_top instanceof Text || $stack_top instanceof StyleTag) { - $stack_top->appendText($data); - } - } - - function _tagEnd($parser, $name) - { - /** @var AbstractTag $tag */ - $tag = null; - switch (strtolower($name)) { - case 'defs': - $this->exitDefs(); - return; - - case 'symbol': - $this->exitDefs(); - $tag = array_pop($this->stack); - break; - - case 'svg': - case 'path': - case 'rect': - case 'circle': - case 'ellipse': - case 'image': - case 'line': - case 'polyline': - case 'polygon': - case 'radialgradient': - case 'lineargradient': - case 'stop': - case 'style': - case 'text': - case 'g': - case 'clippath': - case 'use': - case 'a': - $tag = array_pop($this->stack); - break; - } - - if ((!$this->inDefs && $tag) || $tag instanceof StyleTag) { - $tag->handleEnd(); - } - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Gradient/Stop.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Gradient/Stop.php deleted file mode 100644 index 186cc57..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Gradient/Stop.php +++ /dev/null @@ -1,15 +0,0 @@ -_document = $document; - } - } - - protected function getStyleMap() - { - return array( - 'color' => array('color', self::TYPE_COLOR), - 'opacity' => array('opacity', self::TYPE_NUMBER), - 'display' => array('display', self::TYPE_NAME), - - 'fill' => array('fill', self::TYPE_COLOR), - 'fill-opacity' => array('fillOpacity', self::TYPE_NUMBER), - 'fill-rule' => array('fillRule', self::TYPE_NAME), - - 'stroke' => array('stroke', self::TYPE_COLOR), - 'stroke-dasharray' => array('strokeDasharray', self::TYPE_NAME), - 'stroke-dashoffset' => array('strokeDashoffset', self::TYPE_NUMBER), - 'stroke-linecap' => array('strokeLinecap', self::TYPE_NAME), - 'stroke-linejoin' => array('strokeLinejoin', self::TYPE_NAME), - 'stroke-miterlimit' => array('strokeMiterlimit', self::TYPE_NUMBER), - 'stroke-opacity' => array('strokeOpacity', self::TYPE_NUMBER), - 'stroke-width' => array('strokeWidth', self::TYPE_NUMBER), - - 'font-family' => array('fontFamily', self::TYPE_NAME), - 'font-size' => array('fontSize', self::TYPE_NUMBER), - 'font-weight' => array('fontWeight', self::TYPE_NAME), - 'font-style' => array('fontStyle', self::TYPE_NAME), - 'text-anchor' => array('textAnchor', self::TYPE_NAME), - ); - } - - /** - * @param $attributes - * - * @return Style - */ - public function fromAttributes($attributes) - { - $this->fillStyles($attributes); - - if (isset($attributes["style"])) { - $styles = self::parseCssStyle($attributes["style"]); - $this->fillStyles($styles); - } - } - - public function inherit(AbstractTag $tag) { - $group = $tag->getParentGroup(); - if ($group) { - $parent_style = $group->getStyle(); - $this->_parentStyle = $parent_style; - foreach ($parent_style as $_key => $_value) { - if ($_value !== null) { - $this->$_key = $_value; - } - } - } - } - - public function fromStyleSheets(AbstractTag $tag, $attributes) { - $class = isset($attributes["class"]) ? preg_split('/\s+/', trim($attributes["class"])) : null; - - $stylesheets = $tag->getDocument()->getStyleSheets(); - - $styles = array(); - - foreach ($stylesheets as $_sc) { - - /** @var \Sabberworm\CSS\RuleSet\DeclarationBlock $_decl */ - foreach ($_sc->getAllDeclarationBlocks() as $_decl) { - - /** @var \Sabberworm\CSS\Property\Selector $_selector */ - foreach ($_decl->getSelectors() as $_selector) { - $_selector = $_selector->getSelector(); - - // Match class name - if ($class !== null) { - foreach ($class as $_class) { - if ($_selector === ".$_class") { - /** @var \Sabberworm\CSS\Rule\Rule $_rule */ - foreach ($_decl->getRules() as $_rule) { - $styles[$_rule->getRule()] = $_rule->getValue() . ""; - } - - break 2; - } - } - } - - // Match tag name - if ($_selector === $tag->tagName) { - /** @var \Sabberworm\CSS\Rule\Rule $_rule */ - foreach ($_decl->getRules() as $_rule) { - $styles[$_rule->getRule()] = $_rule->getValue() . ""; - } - - break; - } - } - } - } - - $this->fillStyles($styles); - } - - protected function fillStyles($styles) - { - $style_map = $this->getStyleMap(); - foreach ($style_map as $from => $spec) { - if (isset($styles[$from])) { - list($to, $type) = $spec; - $value = null; - switch ($type) { - case self::TYPE_COLOR: - $value = self::parseColor($styles[$from]); - if ($value === "currentcolor") { - if ($type === "color") { - $value = $this->_parentStyle->color; - } else { - $value = $this->color; - } - } - if (is_array($value) && $value[3] !== 1.0 && array_key_exists("{$from}-opacity", $style_map) === true) { - $styles["{$from}-opacity"] = $value[3]; - } - break; - - case self::TYPE_NUMBER: - $value = ($styles[$from] === null) ? null : (float)$styles[$from]; - break; - - default: - $value = $styles[$from]; - } - - if ($from === "font-family") { - $scheme = \strtolower(parse_url($value, PHP_URL_SCHEME) ?: ""); - if ( - $scheme === "phar" || \strtolower(\substr($value, 0, 7)) === "phar://" - || ($this->_document !== null && $this->_document->allowExternalReferences === false && $scheme !== "data") - ) { - continue; - } - } - - if ($value !== null) { - $this->$to = $value; - } - } - } - } - - static function parseColor($color) - { - $color = strtolower(trim($color)); - - $parts = preg_split('/[^,]\s+/', $color, 2); - - if (count($parts) == 2) { - $color = $parts[1]; - } else { - $color = $parts[0]; - } - - if ($color === "none") { - return "none"; - } - - if ($color === "currentcolor") { - return "currentcolor"; - } - - if ($color === "transparent") { - return [0.0, 0.0, 0.0, 0.0]; - } - - // SVG color name - if (isset(self::$colorNames[$color])) { - return self::parseHexColor(self::$colorNames[$color]); - } - - // Hex color - if ($color[0] === "#") { - return self::parseHexColor($color); - } - - // RGB color - if (strpos($color, "rgb") !== false) { - return self::getQuad($color); - } - - // HSL color - if (strpos($color, "hsl") !== false) { - $quad = self::getQuad($color, true); - - if ($quad == null) { - return null; - } - - list($h, $s, $l, $a) = $quad; - - $r = $l; - $g = $l; - $b = $l; - $v = ($l <= 0.5) ? ($l * (1.0 + $s)) : ($l + $s - $l * $s); - if ($v > 0) { - $m = $l + $l - $v; - $sv = ($v - $m) / $v; - $h *= 6.0; - $sextant = floor($h); - $fract = $h - $sextant; - $vsf = $v * $sv * $fract; - $mid1 = $m + $vsf; - $mid2 = $v - $vsf; - - switch ($sextant) { - case 0: - $r = $v; - $g = $mid1; - $b = $m; - break; - case 1: - $r = $mid2; - $g = $v; - $b = $m; - break; - case 2: - $r = $m; - $g = $v; - $b = $mid1; - break; - case 3: - $r = $m; - $g = $mid2; - $b = $v; - break; - case 4: - $r = $mid1; - $g = $m; - $b = $v; - break; - case 5: - $r = $v; - $g = $m; - $b = $mid2; - break; - } - } - $a = $a * 255; - - return array( - $r * 255.0, - $g * 255.0, - $b * 255.0, - $a - ); - } - - // Gradient - if (strpos($color, "url(#") !== false) { - $i = strpos($color, "("); - $j = strpos($color, ")"); - - // Bad url format - if ($i === false || $j === false) { - return null; - } - - //FIXME: gradients not supported? - return null; // trim(substr($color, $i + 1, $j - $i - 1)); - } - - return null; - } - - static function getQuad($color, $percent = false) { - $i = strpos($color, "("); - $j = strpos($color, ")"); - - // Bad color value - if ($i === false || $j === false) { - return null; - } - - $quad = preg_split("/\\s*[,\\/]\\s*/", trim(substr($color, $i + 1, $j - $i - 1))); - if (!isset($quad[3])) { - $quad[3] = "1"; - } - - if (count($quad) != 3 && count($quad) != 4) { - return null; - } - - foreach (array_keys($quad) as $c) { - $quad[$c] = trim($quad[$c]); - - if ($percent) { - if ($quad[$c][strlen($quad[$c]) - 1] === "%") { - $quad[$c] = floatval($quad[$c]) / 100; - } else { - $quad[$c] = floatval($quad[$c]) / 255; - } - } else { - if ($quad[$c][strlen($quad[$c]) - 1] === "%") { - $quad[$c] = floatval($quad[$c]) * 2.55; - } else { - $quad[$c] = floatval($quad[$c]); - } - } - } - - return $quad; - } - - static function parseHexColor($hex) - { - $c = array(0.0, 0.0, 0.0, 1.0); - - // #FFFFFF - if (isset($hex[6])) { - $c[0] = hexdec(substr($hex, 1, 2)); - $c[1] = hexdec(substr($hex, 3, 2)); - $c[2] = hexdec(substr($hex, 5, 2)); - - if (isset($hex[7])) { - $alpha = substr($hex, 7, 2); - if (ctype_xdigit($alpha)) { - $c[3] = round(hexdec($alpha)/255, 2); - } - } - } else { - $c[0] = hexdec($hex[1] . $hex[1]); - $c[1] = hexdec($hex[2] . $hex[2]); - $c[2] = hexdec($hex[3] . $hex[3]); - - if (isset($hex[4])) { - if (ctype_xdigit($hex[4])) { - $c[3] = round(hexdec($hex[4] . $hex[4])/255, 2); - } - } - } - - return $c; - } - - /** - * Simple CSS parser - * - * @param $style - * - * @return array - */ - static function parseCssStyle($style) - { - $matches = array(); - preg_match_all("/([a-z-]+)\\s*:\\s*([^;$]+)/si", $style, $matches, PREG_SET_ORDER); - - $styles = array(); - foreach ($matches as $match) { - $styles[$match[1]] = $match[2]; - } - - return $styles; - } - - static $colorNames = array( - 'antiquewhite' => '#FAEBD7', - 'aqua' => '#00FFFF', - 'aquamarine' => '#7FFFD4', - 'beige' => '#F5F5DC', - 'black' => '#000000', - 'blue' => '#0000FF', - 'brown' => '#A52A2A', - 'cadetblue' => '#5F9EA0', - 'chocolate' => '#D2691E', - 'cornflowerblue' => '#6495ED', - 'crimson' => '#DC143C', - 'darkblue' => '#00008B', - 'darkgoldenrod' => '#B8860B', - 'darkgreen' => '#006400', - 'darkmagenta' => '#8B008B', - 'darkorange' => '#FF8C00', - 'darkred' => '#8B0000', - 'darkseagreen' => '#8FBC8F', - 'darkslategray' => '#2F4F4F', - 'darkviolet' => '#9400D3', - 'deepskyblue' => '#00BFFF', - 'dodgerblue' => '#1E90FF', - 'firebrick' => '#B22222', - 'forestgreen' => '#228B22', - 'fuchsia' => '#FF00FF', - 'gainsboro' => '#DCDCDC', - 'gold' => '#FFD700', - 'gray' => '#808080', - 'green' => '#008000', - 'greenyellow' => '#ADFF2F', - 'hotpink' => '#FF69B4', - 'indigo' => '#4B0082', - 'khaki' => '#F0E68C', - 'lavenderblush' => '#FFF0F5', - 'lemonchiffon' => '#FFFACD', - 'lightcoral' => '#F08080', - 'lightgoldenrodyellow' => '#FAFAD2', - 'lightgreen' => '#90EE90', - 'lightsalmon' => '#FFA07A', - 'lightskyblue' => '#87CEFA', - 'lightslategray' => '#778899', - 'lightyellow' => '#FFFFE0', - 'lime' => '#00FF00', - 'limegreen' => '#32CD32', - 'magenta' => '#FF00FF', - 'maroon' => '#800000', - 'mediumaquamarine' => '#66CDAA', - 'mediumorchid' => '#BA55D3', - 'mediumseagreen' => '#3CB371', - 'mediumspringgreen' => '#00FA9A', - 'mediumvioletred' => '#C71585', - 'midnightblue' => '#191970', - 'mintcream' => '#F5FFFA', - 'moccasin' => '#FFE4B5', - 'navy' => '#000080', - 'olive' => '#808000', - 'orange' => '#FFA500', - 'orchid' => '#DA70D6', - 'palegreen' => '#98FB98', - 'palevioletred' => '#D87093', - 'peachpuff' => '#FFDAB9', - 'pink' => '#FFC0CB', - 'powderblue' => '#B0E0E6', - 'purple' => '#800080', - 'red' => '#FF0000', - 'royalblue' => '#4169E1', - 'salmon' => '#FA8072', - 'seagreen' => '#2E8B57', - 'sienna' => '#A0522D', - 'silver' => '#C0C0C0', - 'skyblue' => '#87CEEB', - 'slategray' => '#708090', - 'springgreen' => '#00FF7F', - 'steelblue' => '#4682B4', - 'tan' => '#D2B48C', - 'teal' => '#008080', - 'thistle' => '#D8BFD8', - 'turquoise' => '#40E0D0', - 'violetred' => '#D02090', - 'white' => '#FFFFFF', - 'yellow' => '#FFFF00', - 'aliceblue' => '#f0f8ff', - 'azure' => '#f0ffff', - 'bisque' => '#ffe4c4', - 'blanchedalmond' => '#ffebcd', - 'blueviolet' => '#8a2be2', - 'burlywood' => '#deb887', - 'chartreuse' => '#7fff00', - 'coral' => '#ff7f50', - 'cornsilk' => '#fff8dc', - 'cyan' => '#00ffff', - 'darkcyan' => '#008b8b', - 'darkgray' => '#a9a9a9', - 'darkgrey' => '#a9a9a9', - 'darkkhaki' => '#bdb76b', - 'darkolivegreen' => '#556b2f', - 'darkorchid' => '#9932cc', - 'darksalmon' => '#e9967a', - 'darkslateblue' => '#483d8b', - 'darkslategrey' => '#2f4f4f', - 'darkturquoise' => '#00ced1', - 'deeppink' => '#ff1493', - 'dimgray' => '#696969', - 'dimgrey' => '#696969', - 'floralwhite' => '#fffaf0', - 'ghostwhite' => '#f8f8ff', - 'goldenrod' => '#daa520', - 'grey' => '#808080', - 'honeydew' => '#f0fff0', - 'indianred' => '#cd5c5c', - 'ivory' => '#fffff0', - 'lavender' => '#e6e6fa', - 'lawngreen' => '#7cfc00', - 'lightblue' => '#add8e6', - 'lightcyan' => '#e0ffff', - 'lightgray' => '#d3d3d3', - 'lightgrey' => '#d3d3d3', - 'lightpink' => '#ffb6c1', - 'lightseagreen' => '#20b2aa', - 'lightslategrey' => '#778899', - 'lightsteelblue' => '#b0c4de', - 'linen' => '#faf0e6', - 'mediumblue' => '#0000cd', - 'mediumpurple' => '#9370db', - 'mediumslateblue' => '#7b68ee', - 'mediumturquoise' => '#48d1cc', - 'mistyrose' => '#ffe4e1', - 'navajowhite' => '#ffdead', - 'oldlace' => '#fdf5e6', - 'olivedrab' => '#6b8e23', - 'orangered' => '#ff4500', - 'palegoldenrod' => '#eee8aa', - 'paleturquoise' => '#afeeee', - 'papayawhip' => '#ffefd5', - 'peru' => '#cd853f', - 'plum' => '#dda0dd', - 'rosybrown' => '#bc8f8f', - 'saddlebrown' => '#8b4513', - 'sandybrown' => '#f4a460', - 'seashell' => '#fff5ee', - 'slateblue' => '#6a5acd', - 'slategrey' => '#708090', - 'snow' => '#fffafa', - 'tomato' => '#ff6347', - 'violet' => '#ee82ee', - 'wheat' => '#f5deb3', - 'whitesmoke' => '#f5f5f5', - 'yellowgreen' => '#9acd32', - ); -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/CPdf.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/CPdf.php deleted file mode 100644 index ce807a2..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/CPdf.php +++ /dev/null @@ -1,6411 +0,0 @@ - "Normal", "opacity" => 1.0]; - - /** - * array Current fill transparency (partial graphics state) - */ - public $currentFillTransparency = ["mode" => "Normal", "opacity" => 1.0]; - - /** - * @var array An array which is used to save the state of the document, mainly the colors and styles - * it is used to temporarily change to another state, then change back to what it was before - */ - public $stateStack = []; - - /** - * @var integer Number of elements within the state stack - */ - public $nStateStack = 0; - - /** - * @var integer Number of page objects within the document - */ - public $numPages = 0; - - /** - * @var array Object Id storage stack - */ - public $stack = []; - - /** - * @var integer Number of elements within the object Id storage stack - */ - public $nStack = 0; - - /** - * an array which contains information about the objects which are not firmly attached to pages - * these have been added with the addObject function - */ - public $looseObjects = []; - - /** - * array contains information about how the loose objects are to be added to the document - */ - public $addLooseObjects = []; - - /** - * @var integer The objectId of the information object for the document - * this contains authorship, title etc. - */ - public $infoObject = 0; - - /** - * @var integer Number of images being tracked within the document - */ - public $numImages = 0; - - /** - * @var array An array containing options about the document - * it defaults to turning on the compression of the objects - */ - public $options = ['compression' => true]; - - /** - * @var integer The objectId of the first page of the document - */ - public $firstPageId; - - /** - * @var integer The object Id of the procset object - */ - public $procsetObjectId; - - /** - * @var array Store the information about the relationship between font families - * this used so that the code knows which font is the bold version of another font, etc. - * the value of this array is initialised in the constructor function. - */ - public $fontFamilies = []; - - /** - * @var string Folder for php serialized formats of font metrics files. - * If empty string, use same folder as original metrics files. - * This can be passed in from class creator. - * If this folder does not exist or is not writable, Cpdf will be **much** slower. - * Because of potential trouble with php safe mode, folder cannot be created at runtime. - */ - public $fontcache = ''; - - /** - * @var integer The version of the font metrics cache file. - * This value must be manually incremented whenever the internal font data structure is modified. - */ - public $fontcacheVersion = 6; - - /** - * @var string Temporary folder. - * If empty string, will attempt system tmp folder. - * This can be passed in from class creator. - */ - public $tmp = ''; - - /** - * @var string Track if the current font is bolded or italicised - */ - public $currentTextState = ''; - - /** - * @var string Messages are stored here during processing, these can be selected afterwards to give some useful debug information - */ - public $messages = ''; - - /** - * @var string The encryption array for the document encryption is stored here - */ - public $arc4 = ''; - - /** - * @var integer The object Id of the encryption information - */ - public $arc4_objnum = 0; - - /** - * @var string The file identifier, used to uniquely identify a pdf document - */ - public $fileIdentifier = ''; - - /** - * @var boolean A flag to say if a document is to be encrypted or not - */ - public $encrypted = false; - - /** - * @var string The encryption key for the encryption of all the document content (structure is not encrypted) - */ - public $encryptionKey = ''; - - /** - * @var array Array which forms a stack to keep track of nested callback functions - */ - public $callback = []; - - /** - * @var integer The number of callback functions in the callback array - */ - public $nCallback = 0; - - /** - * @var array Store label->id pairs for named destinations, these will be used to replace internal links - * done this way so that destinations can be defined after the location that links to them - */ - public $destinations = []; - - /** - * @var array Store the stack for the transaction commands, each item in here is a record of the values of all the - * publiciables within the class, so that the user can rollback at will (from each 'start' command) - * note that this includes the objects array, so these can be large. - */ - public $checkpoint = ''; - - /** - * @var array Table of Image origin filenames and image labels which were already added with o_image(). - * Allows to merge identical images - */ - public $imagelist = []; - - /** - * @var array Table of already added alpha and plain image files for transparent PNG images. - */ - protected $imageAlphaList = []; - - /** - * @var array List of temporary image files to be deleted after processing. - */ - protected $imageCache = []; - - /** - * @var boolean Whether the text passed in should be treated as Unicode or just local character set. - */ - public $isUnicode = false; - - /** - * @var string the JavaScript code of the document - */ - public $javascript = ''; - - /** - * @var boolean whether the compression is possible - */ - protected $compressionReady = false; - - /** - * @var array Current page size - */ - protected $currentPageSize = ["width" => 0, "height" => 0]; - - /** - * @var array All the chars that will be required in the font subsets - */ - protected $stringSubsets = []; - - /** - * @var string The target internal encoding - */ - protected static $targetEncoding = 'Windows-1252'; - - /** - * @var array - */ - protected $byteRange = array(); - - /** - * @var array The list of the core fonts - */ - protected static $coreFonts = [ - 'courier', - 'courier-bold', - 'courier-oblique', - 'courier-boldoblique', - 'helvetica', - 'helvetica-bold', - 'helvetica-oblique', - 'helvetica-boldoblique', - 'times-roman', - 'times-bold', - 'times-italic', - 'times-bolditalic', - 'symbol', - 'zapfdingbats' - ]; - - /** - * Class constructor - * This will start a new document - * - * @param array $pageSize Array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero. - * @param boolean $isUnicode Whether text will be treated as Unicode or not. - * @param string $fontcache The font cache folder - * @param string $tmp The temporary folder - */ - function __construct($pageSize = [0, 0, 612, 792], $isUnicode = false, $fontcache = '', $tmp = '') - { - $this->isUnicode = $isUnicode; - $this->fontcache = rtrim($fontcache, DIRECTORY_SEPARATOR."/\\"); - $this->tmp = ($tmp !== '' ? $tmp : sys_get_temp_dir()); - $this->newDocument($pageSize); - - $this->compressionReady = function_exists('gzcompress'); - - if (in_array('Windows-1252', mb_list_encodings())) { - self::$targetEncoding = 'Windows-1252'; - } - - // also initialize the font families that are known about already - $this->setFontFamily('init'); - } - - public function __destruct() - { - foreach ($this->imageCache as $file) { - if (file_exists($file)) { - unlink($file); - } - } - } - - /** - * Document object methods (internal use only) - * - * There is about one object method for each type of object in the pdf document - * Each function has the same call list ($id,$action,$options). - * $id = the object ID of the object, or what it is to be if it is being created - * $action = a string specifying the action to be performed, though ALL must support: - * 'new' - create the object with the id $id - * 'out' - produce the output for the pdf object - * $options = optional, a string or array containing the various parameters for the object - * - * These, in conjunction with the output function are the ONLY way for output to be produced - * within the pdf 'file'. - */ - - /** - * Destination object, used to specify the location for the user to jump to, presently on opening - * - * @param $id - * @param $action - * @param string $options - * @return string|null - */ - protected function o_destination($id, $action, $options = '') - { - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'destination', 'info' => []]; - $tmp = ''; - switch ($options['type']) { - case 'XYZ': - /** @noinspection PhpMissingBreakStatementInspection */ - case 'FitR': - $tmp = ' ' . $options['p3'] . $tmp; - case 'FitH': - case 'FitV': - case 'FitBH': - /** @noinspection PhpMissingBreakStatementInspection */ - case 'FitBV': - $tmp = ' ' . $options['p1'] . ' ' . $options['p2'] . $tmp; - case 'Fit': - case 'FitB': - $tmp = $options['type'] . $tmp; - $this->objects[$id]['info']['string'] = $tmp; - $this->objects[$id]['info']['page'] = $options['page']; - } - break; - - case 'out': - $o = &$this->objects[$id]; - - $tmp = $o['info']; - $res = "\n$id 0 obj\n" . '[' . $tmp['page'] . ' 0 R /' . $tmp['string'] . "]\nendobj"; - - return $res; - } - - return null; - } - - /** - * set the viewer preferences - * - * @param $id - * @param $action - * @param string|array $options - * @return string|null - */ - protected function o_viewerPreferences($id, $action, $options = '') - { - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'viewerPreferences', 'info' => []]; - break; - - case 'add': - $o = &$this->objects[$id]; - - foreach ($options as $k => $v) { - switch ($k) { - // Boolean keys - case 'HideToolbar': - case 'HideMenubar': - case 'HideWindowUI': - case 'FitWindow': - case 'CenterWindow': - case 'DisplayDocTitle': - case 'PickTrayByPDFSize': - $o['info'][$k] = (bool)$v; - break; - - // Integer keys - case 'NumCopies': - $o['info'][$k] = (int)$v; - break; - - // Name keys - case 'ViewArea': - case 'ViewClip': - case 'PrintClip': - case 'PrintArea': - $o['info'][$k] = (string)$v; - break; - - // Named with limited valid values - case 'NonFullScreenPageMode': - if (!in_array($v, ['UseNone', 'UseOutlines', 'UseThumbs', 'UseOC'])) { - break; - } - $o['info'][$k] = $v; - break; - - case 'Direction': - if (!in_array($v, ['L2R', 'R2L'])) { - break; - } - $o['info'][$k] = $v; - break; - - case 'PrintScaling': - if (!in_array($v, ['None', 'AppDefault'])) { - break; - } - $o['info'][$k] = $v; - break; - - case 'Duplex': - if (!in_array($v, ['None', 'Simplex', 'DuplexFlipShortEdge', 'DuplexFlipLongEdge'])) { - break; - } - $o['info'][$k] = $v; - break; - - // Integer array - case 'PrintPageRange': - // Cast to integer array - foreach ($v as $vK => $vV) { - $v[$vK] = (int)$vV; - } - $o['info'][$k] = array_values($v); - break; - } - } - break; - - case 'out': - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<< "; - - foreach ($o['info'] as $k => $v) { - if (is_string($v)) { - $v = '/' . $v; - } elseif (is_int($v)) { - $v = (string) $v; - } elseif (is_bool($v)) { - $v = ($v ? 'true' : 'false'); - } elseif (is_array($v)) { - $v = '[' . implode(' ', $v) . ']'; - } - $res .= "\n/$k $v"; - } - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * define the document catalog, the overall controller for the document - * - * @param $id - * @param $action - * @param string|array $options - * @return string|null - */ - protected function o_catalog($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'catalog', 'info' => []]; - $this->catalogId = $id; - break; - - case 'acroform': - case 'outlines': - case 'pages': - case 'openHere': - case 'names': - $o['info'][$action] = $options; - break; - - case 'viewerPreferences': - if (!isset($o['info']['viewerPreferences'])) { - $this->numObj++; - $this->o_viewerPreferences($this->numObj, 'new'); - $o['info']['viewerPreferences'] = $this->numObj; - } - - $vp = $o['info']['viewerPreferences']; - $this->o_viewerPreferences($vp, 'add', $options); - - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /Catalog"; - - foreach ($o['info'] as $k => $v) { - switch ($k) { - case 'outlines': - $res .= "\n/Outlines $v 0 R"; - break; - - case 'pages': - $res .= "\n/Pages $v 0 R"; - break; - - case 'viewerPreferences': - $res .= "\n/ViewerPreferences $v 0 R"; - break; - - case 'openHere': - $res .= "\n/OpenAction $v 0 R"; - break; - - case 'names': - $res .= "\n/Names $v 0 R"; - break; - - case 'acroform': - $res .= "\n/AcroForm $v 0 R"; - break; - } - } - - $res .= " >>\nendobj"; - - return $res; - } - - return null; - } - - /** - * object which is a parent to the pages in the document - * - * @param $id - * @param $action - * @param string $options - * @return string|null - */ - protected function o_pages($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'pages', 'info' => []]; - $this->o_catalog($this->catalogId, 'pages', $id); - break; - - case 'page': - if (!is_array($options)) { - // then it will just be the id of the new page - $o['info']['pages'][] = $options; - } else { - // then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative - // and pos is either 'before' or 'after', saying where this page will fit. - if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])) { - $i = array_search($options['rid'], $o['info']['pages']); - if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i] == $options['rid']) { - - // then there is a match - // make a space - switch ($options['pos']) { - case 'before': - $k = $i; - break; - - case 'after': - $k = $i + 1; - break; - - default: - $k = -1; - break; - } - - if ($k >= 0) { - for ($j = count($o['info']['pages']) - 1; $j >= $k; $j--) { - $o['info']['pages'][$j + 1] = $o['info']['pages'][$j]; - } - - $o['info']['pages'][$k] = $options['id']; - } - } - } - } - break; - - case 'procset': - $o['info']['procset'] = $options; - break; - - case 'mediaBox': - $o['info']['mediaBox'] = $options; - // which should be an array of 4 numbers - $this->currentPageSize = ['width' => $options[2], 'height' => $options[3]]; - break; - - case 'font': - $o['info']['fonts'][] = ['objNum' => $options['objNum'], 'fontNum' => $options['fontNum']]; - break; - - case 'extGState': - $o['info']['extGStates'][] = ['objNum' => $options['objNum'], 'stateNum' => $options['stateNum']]; - break; - - case 'xObject': - $o['info']['xObjects'][] = ['objNum' => $options['objNum'], 'label' => $options['label']]; - break; - - case 'out': - if (count($o['info']['pages'])) { - $res = "\n$id 0 obj\n<< /Type /Pages\n/Kids ["; - foreach ($o['info']['pages'] as $v) { - $res .= "$v 0 R\n"; - } - - $res .= "]\n/Count " . count($this->objects[$id]['info']['pages']); - - if ((isset($o['info']['fonts']) && count($o['info']['fonts'])) || - isset($o['info']['procset']) || - (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) - ) { - $res .= "\n/Resources <<"; - - if (isset($o['info']['procset'])) { - $res .= "\n/ProcSet " . $o['info']['procset'] . " 0 R"; - } - - if (isset($o['info']['fonts']) && count($o['info']['fonts'])) { - $res .= "\n/Font << "; - foreach ($o['info']['fonts'] as $finfo) { - $res .= "\n/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - - if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])) { - $res .= "\n/XObject << "; - foreach ($o['info']['xObjects'] as $finfo) { - $res .= "\n/" . $finfo['label'] . " " . $finfo['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - - if (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) { - $res .= "\n/ExtGState << "; - foreach ($o['info']['extGStates'] as $gstate) { - $res .= "\n/GS" . $gstate['stateNum'] . " " . $gstate['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - - $res .= "\n>>"; - if (isset($o['info']['mediaBox'])) { - $tmp = $o['info']['mediaBox']; - $res .= "\n/MediaBox [" . sprintf( - '%.3F %.3F %.3F %.3F', - $tmp[0], - $tmp[1], - $tmp[2], - $tmp[3] - ) . ']'; - } - } - - $res .= "\n >>\nendobj"; - } else { - $res = "\n$id 0 obj\n<< /Type /Pages\n/Count 0\n>>\nendobj"; - } - - return $res; - } - - return null; - } - - /** - * define the outlines in the doc, empty for now - * - * @param $id - * @param $action - * @param string $options - * @return string|null - */ - protected function o_outlines($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'outlines', 'info' => ['outlines' => []]]; - $this->o_catalog($this->catalogId, 'outlines', $id); - break; - - case 'outline': - $o['info']['outlines'][] = $options; - break; - - case 'out': - if (count($o['info']['outlines'])) { - $res = "\n$id 0 obj\n<< /Type /Outlines /Kids ["; - foreach ($o['info']['outlines'] as $v) { - $res .= "$v 0 R "; - } - - $res .= "] /Count " . count($o['info']['outlines']) . " >>\nendobj"; - } else { - $res = "\n$id 0 obj\n<< /Type /Outlines /Count 0 >>\nendobj"; - } - - return $res; - } - - return null; - } - - /** - * an object to hold the font description - * - * @param $id - * @param $action - * @param string|array $options - * @return string|null - * @throws FontNotFoundException - */ - protected function o_font($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = [ - 't' => 'font', - 'info' => [ - 'name' => $options['name'], - 'fontFileName' => $options['fontFileName'], - 'SubType' => 'Type1', - 'isSubsetting' => $options['isSubsetting'] - ] - ]; - $fontNum = $this->numFonts; - $this->objects[$id]['info']['fontNum'] = $fontNum; - - // deal with the encoding and the differences - if (isset($options['differences'])) { - // then we'll need an encoding dictionary - $this->numObj++; - $this->o_fontEncoding($this->numObj, 'new', $options); - $this->objects[$id]['info']['encodingDictionary'] = $this->numObj; - } else { - if (isset($options['encoding'])) { - // we can specify encoding here - switch ($options['encoding']) { - case 'WinAnsiEncoding': - case 'MacRomanEncoding': - case 'MacExpertEncoding': - $this->objects[$id]['info']['encoding'] = $options['encoding']; - break; - - case 'none': - break; - - default: - $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; - break; - } - } else { - $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; - } - } - - if ($this->fonts[$options['fontFileName']]['isUnicode']) { - // For Unicode fonts, we need to incorporate font data into - // sub-sections that are linked from the primary font section. - // Look at o_fontGIDtoCID and o_fontDescendentCID functions - // for more information. - // - // All of this code is adapted from the excellent changes made to - // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) - - $toUnicodeId = ++$this->numObj; - $this->o_toUnicode($toUnicodeId, 'new'); - $this->objects[$id]['info']['toUnicode'] = $toUnicodeId; - - $cidFontId = ++$this->numObj; - $this->o_fontDescendentCID($cidFontId, 'new', $options); - $this->objects[$id]['info']['cidFont'] = $cidFontId; - } - - // also tell the pages node about the new font - $this->o_pages($this->currentNode, 'font', ['fontNum' => $fontNum, 'objNum' => $id]); - break; - - case 'add': - $font_options = $this->processFont($id, $o['info']); - - if ($font_options !== false) { - foreach ($font_options as $k => $v) { - switch ($k) { - case 'BaseFont': - $o['info']['name'] = $v; - break; - case 'FirstChar': - case 'LastChar': - case 'Widths': - case 'FontDescriptor': - case 'SubType': - $this->addMessage('o_font ' . $k . " : " . $v); - $o['info'][$k] = $v; - break; - } - } - - // pass values down to descendent font - if (isset($o['info']['cidFont'])) { - $this->o_fontDescendentCID($o['info']['cidFont'], 'add', $font_options); - } - } - break; - - case 'out': - if ($this->fonts[$this->objects[$id]['info']['fontFileName']]['isUnicode']) { - // For Unicode fonts, we need to incorporate font data into - // sub-sections that are linked from the primary font section. - // Look at o_fontGIDtoCID and o_fontDescendentCID functions - // for more information. - // - // All of this code is adapted from the excellent changes made to - // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) - - $res = "\n$id 0 obj\n<fonts[$fontFileName])) { - return false; - } - - $font = &$this->fonts[$fontFileName]; - - $fileSuffix = $font['fileSuffix']; - $fileSuffixLower = strtolower($font['fileSuffix']); - $fbfile = "$fontFileName.$fileSuffix"; - $isTtfFont = $fileSuffixLower === 'ttf'; - $isPfbFont = $fileSuffixLower === 'pfb'; - - $this->addMessage('selectFont: checking for - ' . $fbfile); - - if (!$fileSuffix) { - $this->addMessage( - 'selectFont: pfb or ttf file not found, ok if this is one of the 14 standard fonts' - ); - - return false; - } else { - $adobeFontName = isset($font['PostScriptName']) ? $font['PostScriptName'] : $font['FontName']; - // $fontObj = $this->numObj; - $this->addMessage("selectFont: adding font file - $fbfile - $adobeFontName"); - - // find the array of font widths, and put that into an object. - $firstChar = -1; - $lastChar = 0; - $widths = []; - $cid_widths = []; - - foreach ($font['C'] as $num => $d) { - if (intval($num) > 0 || $num == '0') { - if (!$font['isUnicode']) { - // With Unicode, widths array isn't used - if ($lastChar > 0 && $num > $lastChar + 1) { - for ($i = $lastChar + 1; $i < $num; $i++) { - $widths[] = 0; - } - } - } - - $widths[] = $d; - - if ($font['isUnicode']) { - $cid_widths[$num] = $d; - } - - if ($firstChar == -1) { - $firstChar = $num; - } - - $lastChar = $num; - } - } - - // also need to adjust the widths for the differences array - if (isset($object['differences'])) { - foreach ($object['differences'] as $charNum => $charName) { - if ($charNum > $lastChar) { - if (!$object['isUnicode']) { - // With Unicode, widths array isn't used - for ($i = $lastChar + 1; $i <= $charNum; $i++) { - $widths[] = 0; - } - } - - $lastChar = $charNum; - } - - if (isset($font['C'][$charName])) { - $widths[$charNum - $firstChar] = $font['C'][$charName]; - if ($font['isUnicode']) { - $cid_widths[$charName] = $font['C'][$charName]; - } - } - } - } - - if ($font['isUnicode']) { - $font['CIDWidths'] = $cid_widths; - } - - $this->addMessage('selectFont: FirstChar = ' . $firstChar); - $this->addMessage('selectFont: LastChar = ' . $lastChar); - - $widthid = -1; - - if (!$font['isUnicode']) { - // With Unicode, widths array isn't used - - $this->numObj++; - $this->o_contents($this->numObj, 'new', 'raw'); - $this->objects[$this->numObj]['c'] .= '[' . implode(' ', $widths) . ']'; - $widthid = $this->numObj; - } - - $missing_width = 500; - $stemV = 70; - - if (isset($font['MissingWidth'])) { - $missing_width = $font['MissingWidth']; - } - if (isset($font['StdVW'])) { - $stemV = $font['StdVW']; - } else { - if (isset($font['Weight']) && preg_match('!(bold|black)!i', $font['Weight'])) { - $stemV = 120; - } - } - - // load the pfb file, and put that into an object too. - // note that pdf supports only binary format type 1 font files, though there is a - // simple utility to convert them from pfa to pfb. - $data = file_get_contents($fbfile); - - // create the font descriptor - $this->numObj++; - $fontDescriptorId = $this->numObj; - - $this->numObj++; - $pfbid = $this->numObj; - - // determine flags (more than a little flakey, hopefully will not matter much) - $flags = 0; - - if ($font['ItalicAngle'] != 0) { - $flags += pow(2, 6); - } - - if ($font['IsFixedPitch'] === 'true') { - $flags += 1; - } - - $flags += pow(2, 5); // assume non-sybolic - $list = [ - 'Ascent' => 'Ascender', - 'CapHeight' => 'Ascender', //FIXME: php-font-lib is not grabbing this value, so we'll fake it and use the Ascender value // 'CapHeight' - 'MissingWidth' => 'MissingWidth', - 'Descent' => 'Descender', - 'FontBBox' => 'FontBBox', - 'ItalicAngle' => 'ItalicAngle' - ]; - $fdopt = [ - 'Flags' => $flags, - 'FontName' => $adobeFontName, - 'StemV' => $stemV - ]; - - foreach ($list as $k => $v) { - if (isset($font[$v])) { - $fdopt[$k] = $font[$v]; - } - } - - if ($isPfbFont) { - $fdopt['FontFile'] = $pfbid; - } elseif ($isTtfFont) { - $fdopt['FontFile2'] = $pfbid; - } - - $this->o_fontDescriptor($fontDescriptorId, 'new', $fdopt); - - // embed the font program - $this->o_contents($this->numObj, 'new'); - $this->objects[$pfbid]['c'] .= $data; - - // determine the cruicial lengths within this file - if ($isPfbFont) { - $l1 = strpos($data, 'eexec') + 6; - $l2 = strpos($data, '00000000') - $l1; - $l3 = mb_strlen($data, '8bit') - $l2 - $l1; - $this->o_contents( - $this->numObj, - 'add', - ['Length1' => $l1, 'Length2' => $l2, 'Length3' => $l3] - ); - } elseif ($isTtfFont) { - $l1 = mb_strlen($data, '8bit'); - $this->o_contents($this->numObj, 'add', ['Length1' => $l1]); - } - - // tell the font object about all this new stuff - $options = [ - 'BaseFont' => $adobeFontName, - 'MissingWidth' => $missing_width, - 'Widths' => $widthid, - 'FirstChar' => $firstChar, - 'LastChar' => $lastChar, - 'FontDescriptor' => $fontDescriptorId - ]; - - if ($isTtfFont) { - $options['SubType'] = 'TrueType'; - } - - $this->addMessage("adding extra info to font.($fontObjId)"); - - foreach ($options as $fk => $fv) { - $this->addMessage("$fk : $fv"); - } - } - - return $options; - } - - /** - * A toUnicode section, needed for unicode fonts - * - * @param $id - * @param $action - * @return null|string - */ - protected function o_toUnicode($id, $action) - { - switch ($action) { - case 'new': - $this->objects[$id] = [ - 't' => 'toUnicode' - ]; - break; - case 'add': - break; - case 'out': - $ordering = 'UCS'; - $registry = 'Adobe'; - - if ($this->encrypted) { - $this->encryptInit($id); - $ordering = $this->ARC4($ordering); - $registry = $this->filterText($this->ARC4($registry), false, false); - } - - $stream = <<> def -/CMapName /Adobe-Identity-UCS def -/CMapType 2 def -1 begincodespacerange -<0000> -endcodespacerange -1 beginbfrange -<0000> <0000> -endbfrange -endcmap -CMapName currentdict /CMap defineresource pop -end -end -EOT; - - $res = "\n$id 0 obj\n"; - $res .= "<>\n"; - $res .= "stream\n" . $stream . "\nendstream" . "\nendobj"; - - return $res; - } - - return null; - } - - /** - * a font descriptor, needed for including additional fonts - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_fontDescriptor($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'fontDescriptor', 'info' => $options]; - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /FontDescriptor\n"; - foreach ($o['info'] as $label => $value) { - switch ($label) { - case 'Ascent': - case 'CapHeight': - case 'Descent': - case 'Flags': - case 'ItalicAngle': - case 'StemV': - case 'AvgWidth': - case 'Leading': - case 'MaxWidth': - case 'MissingWidth': - case 'StemH': - case 'XHeight': - case 'CharSet': - if (mb_strlen($value, '8bit')) { - $res .= "/$label $value\n"; - } - - break; - case 'FontFile': - case 'FontFile2': - case 'FontFile3': - $res .= "/$label $value 0 R\n"; - break; - - case 'FontBBox': - $res .= "/$label [$value[0] $value[1] $value[2] $value[3]]\n"; - break; - - case 'FontName': - $res .= "/$label /$value\n"; - break; - } - } - - $res .= ">>\nendobj"; - - return $res; - } - - return null; - } - - /** - * the font encoding - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_fontEncoding($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - // the options array should contain 'differences' and maybe 'encoding' - $this->objects[$id] = ['t' => 'fontEncoding', 'info' => $options]; - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /Encoding\n"; - if (!isset($o['info']['encoding'])) { - $o['info']['encoding'] = 'WinAnsiEncoding'; - } - - if ($o['info']['encoding'] !== 'none') { - $res .= "/BaseEncoding /" . $o['info']['encoding'] . "\n"; - } - - $res .= "/Differences \n["; - - $onum = -100; - - foreach ($o['info']['differences'] as $num => $label) { - if ($num != $onum + 1) { - // we cannot make use of consecutive numbering - $res .= "\n$num /$label"; - } else { - $res .= " /$label"; - } - - $onum = $num; - } - - $res .= "\n]\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * a descendent cid font, needed for unicode fonts - * - * @param $id - * @param $action - * @param string|array $options - * @return null|string - */ - protected function o_fontDescendentCID($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'fontDescendentCID', 'info' => $options]; - - // we need a CID system info section - $cidSystemInfoId = ++$this->numObj; - $this->o_cidSystemInfo($cidSystemInfoId, 'new'); - $this->objects[$id]['info']['cidSystemInfo'] = $cidSystemInfoId; - - // and a CID to GID map - $cidToGidMapId = ++$this->numObj; - $this->o_fontGIDtoCIDMap($cidToGidMapId, 'new', $options); - $this->objects[$id]['info']['cidToGidMap'] = $cidToGidMapId; - break; - - case 'add': - foreach ($options as $k => $v) { - switch ($k) { - case 'BaseFont': - $o['info']['name'] = $v; - break; - - case 'FirstChar': - case 'LastChar': - case 'MissingWidth': - case 'FontDescriptor': - case 'SubType': - $this->addMessage("o_fontDescendentCID $k : $v"); - $o['info'][$k] = $v; - break; - } - } - - // pass values down to cid to gid map - $this->o_fontGIDtoCIDMap($o['info']['cidToGidMap'], 'add', $options); - break; - - case 'out': - $res = "\n$id 0 obj\n"; - $res .= "<fonts[$o['info']['fontFileName']]['CIDWidths'])) { - $cid_widths = &$this->fonts[$o['info']['fontFileName']]['CIDWidths']; - $w = ''; - foreach ($cid_widths as $cid => $width) { - $w .= "$cid [$width] "; - } - $res .= "/W [$w]\n"; - } - - $res .= "/CIDToGIDMap " . $o['info']['cidToGidMap'] . " 0 R\n"; - $res .= ">>\n"; - $res .= "endobj"; - - return $res; - } - - return null; - } - - /** - * CID system info section, needed for unicode fonts - * - * @param $id - * @param $action - * @return null|string - */ - protected function o_cidSystemInfo($id, $action) - { - switch ($action) { - case 'new': - $this->objects[$id] = [ - 't' => 'cidSystemInfo' - ]; - break; - case 'add': - break; - case 'out': - $ordering = 'UCS'; - $registry = 'Adobe'; - - if ($this->encrypted) { - $this->encryptInit($id); - $ordering = $this->ARC4($ordering); - $registry = $this->ARC4($registry); - } - - - $res = "\n$id 0 obj\n"; - - $res .= '<objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'fontGIDtoCIDMap', 'info' => $options]; - break; - - case 'out': - $res = "\n$id 0 obj\n"; - $fontFileName = $o['info']['fontFileName']; - $tmp = $this->fonts[$fontFileName]['CIDtoGID'] = base64_decode($this->fonts[$fontFileName]['CIDtoGID']); - - $compressed = isset($this->fonts[$fontFileName]['CIDtoGID_Compressed']) && - $this->fonts[$fontFileName]['CIDtoGID_Compressed']; - - if (!$compressed && isset($o['raw'])) { - $res .= $tmp; - } else { - $res .= "<<"; - - if (!$compressed && $this->compressionReady && $this->options['compression']) { - // then implement ZLIB based compression on this content stream - $compressed = true; - $tmp = gzcompress($tmp, 6); - } - if ($compressed) { - $res .= "\n/Filter /FlateDecode"; - } - - if ($this->encrypted) { - $this->encryptInit($id); - $tmp = $this->ARC4($tmp); - } - - $res .= "\n/Length " . mb_strlen($tmp, '8bit') . ">>\nstream\n$tmp\nendstream"; - } - - $res .= "\nendobj"; - - return $res; - } - - return null; - } - - /** - * the document procset, solves some problems with printing to old PS printers - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_procset($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'procset', 'info' => ['PDF' => 1, 'Text' => 1]]; - $this->o_pages($this->currentNode, 'procset', $id); - $this->procsetObjectId = $id; - break; - - case 'add': - // this is to add new items to the procset list, despite the fact that this is considered - // obsolete, the items are required for printing to some postscript printers - switch ($options) { - case 'ImageB': - case 'ImageC': - case 'ImageI': - $o['info'][$options] = 1; - break; - } - break; - - case 'out': - $res = "\n$id 0 obj\n["; - foreach ($o['info'] as $label => $val) { - $res .= "/$label "; - } - $res .= "]\nendobj"; - - return $res; - } - - return null; - } - - /** - * define the document information - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_info($id, $action, $options = '') - { - switch ($action) { - case 'new': - $this->infoObject = $id; - $date = 'D:' . @date('Ymd'); - $this->objects[$id] = [ - 't' => 'info', - 'info' => [ - 'Producer' => 'CPDF (dompdf)', - 'CreationDate' => $date - ] - ]; - break; - case 'Title': - case 'Author': - case 'Subject': - case 'Keywords': - case 'Creator': - case 'Producer': - case 'CreationDate': - case 'ModDate': - case 'Trapped': - $this->objects[$id]['info'][$action] = $options; - break; - - case 'out': - $encrypted = $this->encrypted; - if ($encrypted) { - $this->encryptInit($id); - } - - $res = "\n$id 0 obj\n<<\n"; - $o = &$this->objects[$id]; - foreach ($o['info'] as $k => $v) { - $res .= "/$k ("; - - // dates must be outputted as-is, without Unicode transformations - if ($k !== 'CreationDate' && $k !== 'ModDate') { - $v = $this->utf8toUtf16BE($v); - } - - if ($encrypted) { - $v = $this->ARC4($v); - } - - $res .= $this->filterText($v, false, false); - $res .= ")\n"; - } - - $res .= ">>\nendobj"; - - return $res; - } - - return null; - } - - /** - * an action object, used to link to URLS initially - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_action($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - if (is_array($options)) { - $this->objects[$id] = ['t' => 'action', 'info' => $options, 'type' => $options['type']]; - } else { - // then assume a URI action - $this->objects[$id] = ['t' => 'action', 'info' => $options, 'type' => 'URI']; - } - break; - - case 'out': - if ($this->encrypted) { - $this->encryptInit($id); - } - - $res = "\n$id 0 obj\n<< /Type /Action"; - switch ($o['type']) { - case 'ilink': - if (!isset($this->destinations[(string)$o['info']['label']])) { - break; - } - - // there will be an 'label' setting, this is the name of the destination - $res .= "\n/S /GoTo\n/D " . $this->destinations[(string)$o['info']['label']] . " 0 R"; - break; - - case 'URI': - $res .= "\n/S /URI\n/URI ("; - if ($this->encrypted) { - $res .= $this->filterText($this->ARC4($o['info']), false, false); - } else { - $res .= $this->filterText($o['info'], false, false); - } - - $res .= ")"; - break; - } - - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * an annotation object, this will add an annotation to the current page. - * initially will support just link annotations - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_annotation($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - // add the annotation to the current page - $pageId = $this->currentPage; - $this->o_page($pageId, 'annot', $id); - - // and add the action object which is going to be required - switch ($options['type']) { - case 'link': - $this->objects[$id] = ['t' => 'annotation', 'info' => $options]; - $this->numObj++; - $this->o_action($this->numObj, 'new', $options['url']); - $this->objects[$id]['info']['actionId'] = $this->numObj; - break; - - case 'ilink': - // this is to a named internal link - $label = $options['label']; - $this->objects[$id] = ['t' => 'annotation', 'info' => $options]; - $this->numObj++; - $this->o_action($this->numObj, 'new', ['type' => 'ilink', 'label' => $label]); - $this->objects[$id]['info']['actionId'] = $this->numObj; - break; - } - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /Annot"; - switch ($o['info']['type']) { - case 'link': - case 'ilink': - $res .= "\n/Subtype /Link"; - break; - } - $res .= "\n/A " . $o['info']['actionId'] . " 0 R"; - $res .= "\n/Border [0 0 0]"; - $res .= "\n/H /I"; - $res .= "\n/Rect [ "; - - foreach ($o['info']['rect'] as $v) { - $res .= sprintf("%.4F ", $v); - } - - $res .= "]"; - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * a page object, it also creates a contents object to hold its contents - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_page($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->numPages++; - $this->objects[$id] = [ - 't' => 'page', - 'info' => [ - 'parent' => $this->currentNode, - 'pageNum' => $this->numPages, - 'mediaBox' => $this->objects[$this->currentNode]['info']['mediaBox'] - ] - ]; - - if (is_array($options)) { - // then this must be a page insertion, array should contain 'rid','pos'=[before|after] - $options['id'] = $id; - $this->o_pages($this->currentNode, 'page', $options); - } else { - $this->o_pages($this->currentNode, 'page', $id); - } - - $this->currentPage = $id; - //make a contents object to go with this page - $this->numObj++; - $this->o_contents($this->numObj, 'new', $id); - $this->currentContents = $this->numObj; - $this->objects[$id]['info']['contents'] = []; - $this->objects[$id]['info']['contents'][] = $this->numObj; - - $match = ($this->numPages % 2 ? 'odd' : 'even'); - foreach ($this->addLooseObjects as $oId => $target) { - if ($target === 'all' || $match === $target) { - $this->objects[$id]['info']['contents'][] = $oId; - } - } - break; - - case 'content': - $o['info']['contents'][] = $options; - break; - - case 'annot': - // add an annotation to this page - if (!isset($o['info']['annot'])) { - $o['info']['annot'] = []; - } - - // $options should contain the id of the annotation dictionary - $o['info']['annot'][] = $options; - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /Page"; - if (isset($o['info']['mediaBox'])) { - $tmp = $o['info']['mediaBox']; - $res .= "\n/MediaBox [" . sprintf( - '%.3F %.3F %.3F %.3F', - $tmp[0], - $tmp[1], - $tmp[2], - $tmp[3] - ) . ']'; - } - $res .= "\n/Parent " . $o['info']['parent'] . " 0 R"; - - if (isset($o['info']['annot'])) { - $res .= "\n/Annots ["; - foreach ($o['info']['annot'] as $aId) { - $res .= " $aId 0 R"; - } - $res .= " ]"; - } - - $count = count($o['info']['contents']); - if ($count == 1) { - $res .= "\n/Contents " . $o['info']['contents'][0] . " 0 R"; - } else { - if ($count > 1) { - $res .= "\n/Contents [\n"; - - // reverse the page contents so added objects are below normal content - //foreach (array_reverse($o['info']['contents']) as $cId) { - // Back to normal now that I've got transparency working --Benj - foreach ($o['info']['contents'] as $cId) { - $res .= "$cId 0 R\n"; - } - $res .= "]"; - } - } - - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * the contents objects hold all of the content which appears on pages - * - * @param $id - * @param $action - * @param string|array $options - * @return null|string - */ - protected function o_contents($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'contents', 'c' => '', 'info' => []]; - if (mb_strlen($options, '8bit') && intval($options)) { - // then this contents is the primary for a page - $this->objects[$id]['onPage'] = $options; - } else { - if ($options === 'raw') { - // then this page contains some other type of system object - $this->objects[$id]['raw'] = 1; - } - } - break; - - case 'add': - // add more options to the declaration - foreach ($options as $k => $v) { - $o['info'][$k] = $v; - } - - case 'out': - $tmp = $o['c']; - $res = "\n$id 0 obj\n"; - - if (isset($this->objects[$id]['raw'])) { - $res .= $tmp; - } else { - $res .= "<<"; - if ($this->compressionReady && $this->options['compression']) { - // then implement ZLIB based compression on this content stream - $res .= " /Filter /FlateDecode"; - $tmp = gzcompress($tmp, 6); - } - - if ($this->encrypted) { - $this->encryptInit($id); - $tmp = $this->ARC4($tmp); - } - - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - - $res .= "\n/Length " . mb_strlen($tmp, '8bit') . " >>\nstream\n$tmp\nendstream"; - } - - $res .= "\nendobj"; - - return $res; - } - - return null; - } - - /** - * @param $id - * @param $action - * @return string|null - */ - protected function o_embedjs($id, $action) - { - switch ($action) { - case 'new': - $this->objects[$id] = [ - 't' => 'embedjs', - 'info' => [ - 'Names' => '[(EmbeddedJS) ' . ($id + 1) . ' 0 R]' - ] - ]; - break; - - case 'out': - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<< "; - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * @param $id - * @param $action - * @param string $code - * @return null|string - */ - protected function o_javascript($id, $action, $code = '') - { - switch ($action) { - case 'new': - $this->objects[$id] = [ - 't' => 'javascript', - 'info' => [ - 'S' => '/JavaScript', - 'JS' => '(' . $this->filterText($code, true, false) . ')', - ] - ]; - break; - - case 'out': - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<< "; - - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * an image object, will be an XObject in the document, includes description and data - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_image($id, $action, $options = '') - { - switch ($action) { - case 'new': - // make the new object - $this->objects[$id] = ['t' => 'image', 'data' => &$options['data'], 'info' => []]; - - $info =& $this->objects[$id]['info']; - - $info['Type'] = '/XObject'; - $info['Subtype'] = '/Image'; - $info['Width'] = $options['iw']; - $info['Height'] = $options['ih']; - - if (isset($options['masked']) && $options['masked']) { - $info['SMask'] = ($this->numObj - 1) . ' 0 R'; - } - - if (!isset($options['type']) || $options['type'] === 'jpg') { - if (!isset($options['channels'])) { - $options['channels'] = 3; - } - - switch ($options['channels']) { - case 1: - $info['ColorSpace'] = '/DeviceGray'; - break; - case 4: - $info['ColorSpace'] = '/DeviceCMYK'; - break; - default: - $info['ColorSpace'] = '/DeviceRGB'; - break; - } - - if ($info['ColorSpace'] === '/DeviceCMYK') { - $info['Decode'] = '[1 0 1 0 1 0 1 0]'; - } - - $info['Filter'] = '/DCTDecode'; - $info['BitsPerComponent'] = 8; - } else { - if ($options['type'] === 'png') { - $info['Filter'] = '/FlateDecode'; - $info['DecodeParms'] = '<< /Predictor 15 /Colors ' . $options['ncolor'] . ' /Columns ' . $options['iw'] . ' /BitsPerComponent ' . $options['bitsPerComponent'] . '>>'; - - if ($options['isMask']) { - $info['ColorSpace'] = '/DeviceGray'; - } else { - if (mb_strlen($options['pdata'], '8bit')) { - $tmp = ' [ /Indexed /DeviceRGB ' . (mb_strlen($options['pdata'], '8bit') / 3 - 1) . ' '; - $this->numObj++; - $this->o_contents($this->numObj, 'new'); - $this->objects[$this->numObj]['c'] = $options['pdata']; - $tmp .= $this->numObj . ' 0 R'; - $tmp .= ' ]'; - $info['ColorSpace'] = $tmp; - - if (isset($options['transparency'])) { - $transparency = $options['transparency']; - switch ($transparency['type']) { - case 'indexed': - $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] '; - $info['Mask'] = $tmp; - break; - - case 'color-key': - $tmp = ' [ ' . - $transparency['r'] . ' ' . $transparency['r'] . - $transparency['g'] . ' ' . $transparency['g'] . - $transparency['b'] . ' ' . $transparency['b'] . - ' ] '; - $info['Mask'] = $tmp; - break; - } - } - } else { - if (isset($options['transparency'])) { - $transparency = $options['transparency']; - - switch ($transparency['type']) { - case 'indexed': - $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] '; - $info['Mask'] = $tmp; - break; - - case 'color-key': - $tmp = ' [ ' . - $transparency['r'] . ' ' . $transparency['r'] . ' ' . - $transparency['g'] . ' ' . $transparency['g'] . ' ' . - $transparency['b'] . ' ' . $transparency['b'] . - ' ] '; - $info['Mask'] = $tmp; - break; - } - } - $info['ColorSpace'] = '/' . $options['color']; - } - } - - $info['BitsPerComponent'] = $options['bitsPerComponent']; - } - } - - // assign it a place in the named resource dictionary as an external object, according to - // the label passed in with it. - $this->o_pages($this->currentNode, 'xObject', ['label' => $options['label'], 'objNum' => $id]); - - // also make sure that we have the right procset object for it. - $this->o_procset($this->procsetObjectId, 'add', 'ImageC'); - break; - - case 'out': - $o = &$this->objects[$id]; - $tmp = &$o['data']; - $res = "\n$id 0 obj\n<<"; - - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - - if ($this->encrypted) { - $this->encryptInit($id); - $tmp = $this->ARC4($tmp); - } - - $res .= "\n/Length " . mb_strlen($tmp, '8bit') . ">>\nstream\n$tmp\nendstream\nendobj"; - - return $res; - } - - return null; - } - - /** - * graphics state object - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_extGState($id, $action, $options = "") - { - static $valid_params = [ - "LW", - "LC", - "LC", - "LJ", - "ML", - "D", - "RI", - "OP", - "op", - "OPM", - "Font", - "BG", - "BG2", - "UCR", - "TR", - "TR2", - "HT", - "FL", - "SM", - "SA", - "BM", - "SMask", - "CA", - "ca", - "AIS", - "TK" - ]; - - switch ($action) { - case "new": - $this->objects[$id] = ['t' => 'extGState', 'info' => $options]; - - // Tell the pages about the new resource - $this->numStates++; - $this->o_pages($this->currentNode, 'extGState', ["objNum" => $id, "stateNum" => $this->numStates]); - break; - - case "out": - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<< /Type /ExtGState\n"; - - foreach ($o["info"] as $k => $v) { - if (!in_array($k, $valid_params)) { - continue; - } - $res .= "/$k $v\n"; - } - - $res .= ">>\nendobj"; - - return $res; - } - - return null; - } - - /** - * @param integer $id - * @param string $action - * @param mixed $options - * @return string - */ - protected function o_xobject($id, $action, $options = '') - { - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'xobject', 'info' => $options, 'c' => '']; - break; - - case 'procset': - $this->objects[$id]['procset'] = $options; - break; - - case 'font': - $this->objects[$id]['fonts'][$options['fontNum']] = [ - 'objNum' => $options['objNum'], - 'fontNum' => $options['fontNum'] - ]; - break; - - case 'xObject': - $this->objects[$id]['xObjects'][] = ['objNum' => $options['objNum'], 'label' => $options['label']]; - break; - - case 'out': - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<< /Type /XObject\n"; - - foreach ($o["info"] as $k => $v) { - switch ($k) { - case 'Subtype': - $res .= "/Subtype /$v\n"; - break; - case 'bbox': - $res .= "/BBox ["; - foreach ($v as $value) { - $res .= sprintf("%.4F ", $value); - } - $res .= "]\n"; - break; - default: - $res .= "/$k $v\n"; - break; - } - } - $res .= "/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]\n"; - - $res .= "/Resources <<"; - if (isset($o['procset'])) { - $res .= "\n/ProcSet " . $o['procset'] . " 0 R"; - } else { - $res .= "\n/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]"; - } - if (isset($o['fonts']) && count($o['fonts'])) { - $res .= "\n/Font << "; - foreach ($o['fonts'] as $finfo) { - $res .= "\n/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - if (isset($o['xObjects']) && count($o['xObjects'])) { - $res .= "\n/XObject << "; - foreach ($o['xObjects'] as $finfo) { - $res .= "\n/" . $finfo['label'] . " " . $finfo['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - $res .= "\n>>\n"; - - $tmp = $o["c"]; - if ($this->compressionReady && $this->options['compression']) { - // then implement ZLIB based compression on this content stream - $res .= " /Filter /FlateDecode\n"; - $tmp = gzcompress($tmp, 6); - } - - if ($this->encrypted) { - $this->encryptInit($id); - $tmp = $this->ARC4($tmp); - } - - $res .= "/Length " . mb_strlen($tmp, '8bit') . " >>\n"; - $res .= "stream\n" . $tmp . "\nendstream" . "\nendobj"; - - return $res; - } - - return null; - } - - /** - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_acroform($id, $action, $options = '') - { - switch ($action) { - case "new": - $this->o_catalog($this->catalogId, 'acroform', $id); - $this->objects[$id] = array('t' => 'acroform', 'info' => $options); - break; - - case 'addfield': - $this->objects[$id]['info']['Fields'][] = $options; - break; - - case 'font': - $this->objects[$id]['fonts'][$options['fontNum']] = [ - 'objNum' => $options['objNum'], - 'fontNum' => $options['fontNum'] - ]; - break; - - case "out": - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<<"; - - foreach ($o["info"] as $k => $v) { - switch ($k) { - case 'Fields': - $res .= " /Fields ["; - foreach ($v as $i) { - $res .= "$i 0 R "; - } - $res .= "]\n"; - break; - default: - $res .= "/$k $v\n"; - } - } - - $res .= "/DR <<\n"; - if (isset($o['fonts']) && count($o['fonts'])) { - $res .= "/Font << \n"; - foreach ($o['fonts'] as $finfo) { - $res .= "/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R\n"; - } - $res .= ">>\n"; - } - $res .= ">>\n"; - - $res .= ">>\nendobj"; - - return $res; - } - - return null; - } - - /** - * @param $id - * @param $action - * @param mixed $options - * @return null|string - */ - protected function o_field($id, $action, $options = '') - { - switch ($action) { - case "new": - $this->o_page($options['pageid'], 'annot', $id); - $this->o_acroform($this->acroFormId, 'addfield', $id); - $this->objects[$id] = ['t' => 'field', 'info' => $options]; - break; - - case 'set': - $this->objects[$id]['info'] = array_merge($this->objects[$id]['info'], $options); - break; - - case "out": - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<< /Type /Annot /Subtype /Widget \n"; - - $encrypted = $this->encrypted; - if ($encrypted) { - $this->encryptInit($id); - } - - foreach ($o["info"] as $k => $v) { - switch ($k) { - case 'pageid': - $res .= "/P $v 0 R\n"; - break; - case 'value': - if ($encrypted) { - $v = $this->filterText($this->ARC4($v), false, false); - } - $res .= "/V ($v)\n"; - break; - case 'refvalue': - $res .= "/V $v 0 R\n"; - break; - case 'da': - if ($encrypted) { - $v = $this->filterText($this->ARC4($v), false, false); - } - $res .= "/DA ($v)\n"; - break; - case 'options': - $res .= "/Opt [\n"; - foreach ($v as $opt) { - if ($encrypted) { - $opt = $this->filterText($this->ARC4($opt), false, false); - } - $res .= "($opt)\n"; - } - $res .= "]\n"; - break; - case 'rect': - $res .= "/Rect ["; - foreach ($v as $value) { - $res .= sprintf("%.4F ", $value); - } - $res .= "]\n"; - break; - case 'appearance': - $res .= "/AP << "; - foreach ($v as $a => $ref) { - $res .= "/$a $ref 0 R "; - } - $res .= ">>\n"; - break; - case 'T': - if ($encrypted) { - $v = $this->filterText($this->ARC4($v), false, false); - } - $res .= "/T ($v)\n"; - break; - default: - $res .= "/$k $v\n"; - } - - } - - $res .= ">>\nendobj"; - - return $res; - } - - return null; - } - - /** - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_sig($id, $action, $options = '') - { - $sign_maxlen = $this->signatureMaxLen; - - switch ($action) { - case "new": - $this->objects[$id] = array('t' => 'sig', 'info' => $options); - $this->byteRange[$id] = ['t' => 'sig']; - break; - - case 'byterange': - $o = &$this->objects[$id]; - $content =& $options['content']; - $content_len = strlen($content); - $pos = strpos($content, sprintf("/ByteRange [ %'.010d", $id)); - $len = strlen('/ByteRange [ ********** ********** ********** ********** ]'); - $rangeStartPos = $pos + $len + 1 + 10; // before '<' - $content = substr_replace($content, str_pad(sprintf('/ByteRange [ 0 %u %u %u ]', $rangeStartPos, $rangeStartPos + $sign_maxlen + 2, $content_len - 2 - $sign_maxlen - $rangeStartPos), $len, ' ', STR_PAD_RIGHT), $pos, $len); - - $fuid = uniqid(); - $tmpInput = $this->tmp . "/pkcs7.tmp." . $fuid . '.in'; - $tmpOutput = $this->tmp . "/pkcs7.tmp." . $fuid . '.out'; - - if (file_put_contents($tmpInput, substr($content, 0, $rangeStartPos)) === false) { - throw new \Exception("Unable to write temporary file for signing."); - } - if (file_put_contents($tmpInput, substr($content, $rangeStartPos + 2 + $sign_maxlen), - FILE_APPEND) === false) { - throw new \Exception("Unable to write temporary file for signing."); - } - - if (openssl_pkcs7_sign($tmpInput, $tmpOutput, - $o['info']['SignCert'], - array($o['info']['PrivKey'], $o['info']['Password']), - array(), PKCS7_BINARY | PKCS7_DETACHED) === false) { - throw new \Exception("Failed to prepare signature."); - } - - $signature = file_get_contents($tmpOutput); - - unlink($tmpInput); - unlink($tmpOutput); - - $sign = substr($signature, (strpos($signature, "%%EOF\n\n------") + 13)); - list($head, $signature) = explode("\n\n", $sign); - - $signature = base64_decode(trim($signature)); - - $signature = current(unpack('H*', $signature)); - $signature = str_pad($signature, $sign_maxlen, '0'); - $siglen = strlen($signature); - if (strlen($signature) > $sign_maxlen) { - throw new \Exception("Signature length ($siglen) exceeds the $sign_maxlen limit."); - } - - $content = substr_replace($content, $signature, $rangeStartPos + 1, $sign_maxlen); - break; - - case "out": - $res = "\n$id 0 obj\n<<\n"; - - $encrypted = $this->encrypted; - if ($encrypted) { - $this->encryptInit($id); - } - - $res .= "/ByteRange " .sprintf("[ %'.010d ********** ********** ********** ]\n", $id); - $res .= "/Contents <" . str_pad('', $sign_maxlen, '0') . ">\n"; - $res .= "/Filter/Adobe.PPKLite\n"; //PPKMS \n"; - $res .= "/Type/Sig/SubFilter/adbe.pkcs7.detached \n"; - - $date = "D:" . substr_replace(date('YmdHisO'), '\'', -2, 0) . '\''; - if ($encrypted) { - $date = $this->ARC4($date); - } - - $res .= "/M ($date)\n"; - $res .= "/Prop_Build << /App << /Name /DomPDF >> /Filter << /Name /Adobe.PPKLite >> >>\n"; - - $o = &$this->objects[$id]; - foreach ($o['info'] as $k => $v) { - switch ($k) { - case 'Name': - case 'Location': - case 'Reason': - case 'ContactInfo': - if ($v !== null && $v !== '') { - $res .= "/$k (" . - ($encrypted ? $this->filterText($this->ARC4($v), false, false) : $v) . ") \n"; - } - break; - } - } - $res .= ">>\nendobj"; - - return $res; - } - - return null; - } - - /** - * encryption object. - * - * @param $id - * @param $action - * @param string $options - * @return string|null - */ - protected function o_encryption($id, $action, $options = '') - { - switch ($action) { - case 'new': - // make the new object - $this->objects[$id] = ['t' => 'encryption', 'info' => $options]; - $this->arc4_objnum = $id; - break; - - case 'keys': - // figure out the additional parameters required - $pad = chr(0x28) . chr(0xBF) . chr(0x4E) . chr(0x5E) . chr(0x4E) . chr(0x75) . chr(0x8A) . chr(0x41) - . chr(0x64) . chr(0x00) . chr(0x4E) . chr(0x56) . chr(0xFF) . chr(0xFA) . chr(0x01) . chr(0x08) - . chr(0x2E) . chr(0x2E) . chr(0x00) . chr(0xB6) . chr(0xD0) . chr(0x68) . chr(0x3E) . chr(0x80) - . chr(0x2F) . chr(0x0C) . chr(0xA9) . chr(0xFE) . chr(0x64) . chr(0x53) . chr(0x69) . chr(0x7A); - - $info = $this->objects[$id]['info']; - - $len = mb_strlen($info['owner'], '8bit'); - - if ($len > 32) { - $owner = substr($info['owner'], 0, 32); - } else { - if ($len < 32) { - $owner = $info['owner'] . substr($pad, 0, 32 - $len); - } else { - $owner = $info['owner']; - } - } - - $len = mb_strlen($info['user'], '8bit'); - if ($len > 32) { - $user = substr($info['user'], 0, 32); - } else { - if ($len < 32) { - $user = $info['user'] . substr($pad, 0, 32 - $len); - } else { - $user = $info['user']; - } - } - - $tmp = $this->md5_16($owner); - $okey = substr($tmp, 0, 5); - $this->ARC4_init($okey); - $ovalue = $this->ARC4($user); - $this->objects[$id]['info']['O'] = $ovalue; - - // now make the u value, phew. - $tmp = $this->md5_16( - $user . $ovalue . chr($info['p']) . chr(255) . chr(255) . chr(255) . hex2bin($this->fileIdentifier) - ); - - $ukey = substr($tmp, 0, 5); - $this->ARC4_init($ukey); - $this->encryptionKey = $ukey; - $this->encrypted = true; - $uvalue = $this->ARC4($pad); - $this->objects[$id]['info']['U'] = $uvalue; - // initialize the arc4 array - break; - - case 'out': - $o = &$this->objects[$id]; - - $res = "\n$id 0 obj\n<<"; - $res .= "\n/Filter /Standard"; - $res .= "\n/V 1"; - $res .= "\n/R 2"; - $res .= "\n/O (" . $this->filterText($o['info']['O'], false, false) . ')'; - $res .= "\n/U (" . $this->filterText($o['info']['U'], false, false) . ')'; - // and the p-value needs to be converted to account for the twos-complement approach - $o['info']['p'] = (($o['info']['p'] ^ 255) + 1) * -1; - $res .= "\n/P " . ($o['info']['p']); - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - protected function o_indirect_references($id, $action, $options = null) - { - switch ($action) { - case 'new': - case 'add': - if ($id === 0) { - $id = ++$this->numObj; - $this->o_catalog($this->catalogId, 'names', $id); - $this->objects[$id] = ['t' => 'indirect_references', 'info' => $options]; - $this->indirectReferenceId = $id; - } else { - $this->objects[$id]['info'] = array_merge($this->objects[$id]['info'], $options); - } - break; - case 'out': - $res = "\n$id 0 obj << "; - - foreach ($this->objects[$id]['info'] as $referenceObjName => $referenceObjId) { - $res .= "/$referenceObjName $referenceObjId 0 R "; - } - - $res .= ">> endobj"; - return $res; - } - - return null; - } - - protected function o_names($id, $action, $options = null) - { - switch ($action) { - case 'new': - case 'add': - if ($id === 0) { - $id = ++$this->numObj; - $this->objects[$id] = ['t' => 'names', 'info' => [$options]]; - $this->o_indirect_references($this->indirectReferenceId, 'add', ['EmbeddedFiles' => $id]); - $this->embeddedFilesId = $id; - } else { - $this->objects[$id]['info'][] = $options; - } - break; - case 'out': - $info = &$this->objects[$id]['info']; - $res = ''; - if (count($info) > 0) { - $res = "\n$id 0 obj << /Names [ "; - - if ($this->encrypted) { - $this->encryptInit($id); - } - - foreach ($info as $entry) { - if ($this->encrypted) { - $filename = $this->ARC4($entry['filename']); - } else { - $filename = $entry['filename']; - } - - $res .= "($filename) " . $entry['dict_reference'] . " 0 R "; - } - - $res .= "] >> endobj"; - } - return $res; - } - - return null; - } - - protected function o_embedded_file_dictionary($id, $action, $options = null) - { - switch ($action) { - case 'new': - $embeddedFileId = ++$this->numObj; - $options['embedded_reference'] = $embeddedFileId; - $this->objects[$id] = ['t' => 'embedded_file_dictionary', 'info' => $options]; - $this->o_embedded_file($embeddedFileId, 'new', $options); - $options['dict_reference'] = $id; - $this->o_names($this->embeddedFilesId, 'add', $options); - break; - case 'out': - $info = &$this->objects[$id]['info']; - $filename = $this->utf8toUtf16BE($info['filename']); - $description = $this->utf8toUtf16BE($info['description']); - - if ($this->encrypted) { - $this->encryptInit($id); - $filename = $this->ARC4($filename); - $description = $this->ARC4($description); - } - - $filename = $this->filterText($filename, false, false); - $description = $this->filterText($description, false, false); - - $res = "\n$id 0 obj <>"; - $res .= " /F ($filename) /UF ($filename) /Desc ($description)"; - $res .= " >> endobj"; - return $res; - } - - return null; - } - - protected function o_embedded_file($id, $action, $options = null): ?string - { - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'embedded_file', 'info' => $options]; - break; - case 'out': - $info = &$this->objects[$id]['info']; - - if ($this->compressionReady) { - $filepath = $info['filepath']; - $checksum = md5_file($filepath); - $f = fopen($filepath, "rb"); - - $file_content_compressed = ''; - $deflateContext = deflate_init(ZLIB_ENCODING_DEFLATE, ['level' => 6]); - while (($block = fread($f, 8192))) { - $file_content_compressed .= deflate_add($deflateContext, $block, ZLIB_NO_FLUSH); - } - $file_content_compressed .= deflate_add($deflateContext, '', ZLIB_FINISH); - $file_size_uncompressed = ftell($f); - fclose($f); - } else { - $file_content = file_get_contents($info['filepath']); - $file_size_uncompressed = mb_strlen($file_content, '8bit'); - $checksum = md5($file_content); - } - - if ($this->encrypted) { - $this->encryptInit($id); - $checksum = $this->ARC4($checksum); - $file_content_compressed = $this->ARC4($file_content_compressed); - } - $file_size_compressed = mb_strlen($file_content_compressed, '8bit'); - - $res = "\n$id 0 obj <>" . - " /Type/EmbeddedFile /Filter/FlateDecode" . - " /Length $file_size_compressed >> stream\n$file_content_compressed\nendstream\nendobj"; - - return $res; - } - - return null; - } - - /** - * ARC4 functions - * A series of function to implement ARC4 encoding in PHP - */ - - /** - * calculate the 16 byte version of the 128 bit md5 digest of the string - * - * @param $string - * @return string - */ - function md5_16($string) - { - $tmp = md5($string); - $out = ''; - for ($i = 0; $i <= 30; $i = $i + 2) { - $out .= chr(hexdec(substr($tmp, $i, 2))); - } - - return $out; - } - - /** - * initialize the encryption for processing a particular object - * - * @param $id - */ - function encryptInit($id) - { - $tmp = $this->encryptionKey; - $hex = dechex($id); - if (mb_strlen($hex, '8bit') < 6) { - $hex = substr('000000', 0, 6 - mb_strlen($hex, '8bit')) . $hex; - } - $tmp .= chr(hexdec(substr($hex, 4, 2))) - . chr(hexdec(substr($hex, 2, 2))) - . chr(hexdec(substr($hex, 0, 2))) - . chr(0) - . chr(0) - ; - $key = $this->md5_16($tmp); - $this->ARC4_init(substr($key, 0, 10)); - } - - /** - * initialize the ARC4 encryption - * - * @param string $key - */ - function ARC4_init($key = '') - { - $this->arc4 = ''; - - // setup the control array - if (mb_strlen($key, '8bit') == 0) { - return; - } - - $k = ''; - while (mb_strlen($k, '8bit') < 256) { - $k .= $key; - } - - $k = substr($k, 0, 256); - for ($i = 0; $i < 256; $i++) { - $this->arc4 .= chr($i); - } - - $j = 0; - - for ($i = 0; $i < 256; $i++) { - $t = $this->arc4[$i]; - $j = ($j + ord($t) + ord($k[$i])) % 256; - $this->arc4[$i] = $this->arc4[$j]; - $this->arc4[$j] = $t; - } - } - - /** - * ARC4 encrypt a text string - * - * @param $text - * @return string - */ - function ARC4($text) - { - $len = mb_strlen($text, '8bit'); - $a = 0; - $b = 0; - $c = $this->arc4; - $out = ''; - for ($i = 0; $i < $len; $i++) { - $a = ($a + 1) % 256; - $t = $c[$a]; - $b = ($b + ord($t)) % 256; - $c[$a] = $c[$b]; - $c[$b] = $t; - $k = ord($c[(ord($c[$a]) + ord($c[$b])) % 256]); - $out .= chr(ord($text[$i]) ^ $k); - } - - return $out; - } - - /** - * functions which can be called to adjust or add to the document - */ - - /** - * add a link in the document to an external URL - * - * @param $url - * @param $x0 - * @param $y0 - * @param $x1 - * @param $y1 - */ - function addLink($url, $x0, $y0, $x1, $y1) - { - $this->numObj++; - $info = ['type' => 'link', 'url' => $url, 'rect' => [$x0, $y0, $x1, $y1]]; - $this->o_annotation($this->numObj, 'new', $info); - } - - /** - * add a link in the document to an internal destination (ie. within the document) - * - * @param $label - * @param $x0 - * @param $y0 - * @param $x1 - * @param $y1 - */ - function addInternalLink($label, $x0, $y0, $x1, $y1) - { - $this->numObj++; - $info = ['type' => 'ilink', 'label' => $label, 'rect' => [$x0, $y0, $x1, $y1]]; - $this->o_annotation($this->numObj, 'new', $info); - } - - /** - * set the encryption of the document - * can be used to turn it on and/or set the passwords which it will have. - * also the functions that the user will have are set here, such as print, modify, add - * - * @param string $userPass - * @param string $ownerPass - * @param array $pc - */ - function setEncryption($userPass = '', $ownerPass = '', $pc = []) - { - $p = bindec("11000000"); - - $options = ['print' => 4, 'modify' => 8, 'copy' => 16, 'add' => 32]; - - foreach ($pc as $k => $v) { - if ($v && isset($options[$k])) { - $p += $options[$k]; - } else { - if (isset($options[$v])) { - $p += $options[$v]; - } - } - } - - // implement encryption on the document - if ($this->arc4_objnum == 0) { - // then the block does not exist already, add it. - $this->numObj++; - if (mb_strlen($ownerPass) == 0) { - $ownerPass = $userPass; - } - - $this->o_encryption($this->numObj, 'new', ['user' => $userPass, 'owner' => $ownerPass, 'p' => $p]); - } - } - - /** - * should be used for internal checks, not implemented as yet - */ - function checkAllHere() - { - } - - /** - * return the pdf stream as a string returned from the function - * - * @param bool $debug - * @return string - */ - function output($debug = false) - { - if ($debug) { - // turn compression off - $this->options['compression'] = false; - } - - if ($this->javascript) { - $this->numObj++; - - $js_id = $this->numObj; - $this->o_embedjs($js_id, 'new'); - $this->o_javascript(++$this->numObj, 'new', $this->javascript); - - $id = $this->catalogId; - - $this->o_indirect_references($this->indirectReferenceId, 'add', ['JavaScript' => $js_id]); - } - - if ($this->fileIdentifier === '') { - $tmp = implode('', $this->objects[$this->infoObject]['info']); - $this->fileIdentifier = md5('DOMPDF' . __FILE__ . $tmp . microtime() . mt_rand()); - } - - if ($this->arc4_objnum) { - $this->o_encryption($this->arc4_objnum, 'keys'); - $this->ARC4_init($this->encryptionKey); - } - - $this->checkAllHere(); - - $xref = []; - $content = '%PDF-' . self::PDF_VERSION; - $pos = mb_strlen($content, '8bit'); - - // pre-process o_font objects before output of all objects - foreach ($this->objects as $k => $v) { - if ($v['t'] === 'font') { - $this->o_font($k, 'add'); - } - } - - foreach ($this->objects as $k => $v) { - $tmp = 'o_' . $v['t']; - $cont = $this->$tmp($k, 'out'); - $content .= $cont; - $xref[] = $pos + 1; //+1 to account for \n at the start of each object - $pos += mb_strlen($cont, '8bit'); - } - - $content .= "\nxref\n0 " . (count($xref) + 1) . "\n0000000000 65535 f \n"; - - foreach ($xref as $p) { - $content .= str_pad($p, 10, "0", STR_PAD_LEFT) . " 00000 n \n"; - } - - $content .= "trailer\n<<\n" . - '/Size ' . (count($xref) + 1) . "\n" . - '/Root 1 0 R' . "\n" . - '/Info ' . $this->infoObject . " 0 R\n" - ; - - // if encryption has been applied to this document then add the marker for this dictionary - if ($this->arc4_objnum > 0) { - $content .= '/Encrypt ' . $this->arc4_objnum . " 0 R\n"; - } - - $content .= '/ID[<' . $this->fileIdentifier . '><' . $this->fileIdentifier . ">]\n"; - - // account for \n added at start of xref table - $pos++; - - $content .= ">>\nstartxref\n$pos\n%%EOF\n"; - - if (count($this->byteRange) > 0) { - foreach ($this->byteRange as $k => $v) { - $tmp = 'o_' . $v['t']; - $this->$tmp($k, 'byterange', ['content' => &$content]); - } - } - - return $content; - } - - /** - * initialize a new document - * if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum - * this function is called automatically by the constructor function - * - * @param array $pageSize - */ - private function newDocument($pageSize = [0, 0, 612, 792]) - { - $this->numObj = 0; - $this->objects = []; - - $this->numObj++; - $this->o_catalog($this->numObj, 'new'); - - $this->numObj++; - $this->o_outlines($this->numObj, 'new'); - - $this->numObj++; - $this->o_pages($this->numObj, 'new'); - - $this->o_pages($this->numObj, 'mediaBox', $pageSize); - $this->currentNode = 3; - - $this->numObj++; - $this->o_procset($this->numObj, 'new'); - - $this->numObj++; - $this->o_info($this->numObj, 'new'); - - $this->numObj++; - $this->o_page($this->numObj, 'new'); - - // need to store the first page id as there is no way to get it to the user during - // startup - $this->firstPageId = $this->currentContents; - } - - /** - * open the font file and return a php structure containing it. - * first check if this one has been done before and saved in a form more suited to php - * note that if a php serialized version does not exist it will try and make one, but will - * require write access to the directory to do it... it is MUCH faster to have these serialized - * files. - * - * @param $font - */ - private function openFont($font) - { - // assume that $font contains the path and file but not the extension - $name = basename($font); - $dir = dirname($font); - - $fontcache = $this->fontcache; - if ($fontcache == '') { - $fontcache = $dir; - } - - //$name filename without folder and extension of font metrics - //$dir folder of font metrics - //$fontcache folder of runtime created php serialized version of font metrics. - // If this is not given, the same folder as the font metrics will be used. - // Storing and reusing serialized versions improves speed much - - $this->addMessage("openFont: $font - $name"); - - if (!$this->isUnicode || in_array(mb_strtolower(basename($name)), self::$coreFonts)) { - $metrics_name = "$name.afm"; - } else { - $metrics_name = "$name.ufm"; - } - - $cache_name = "$metrics_name.json"; - $this->addMessage("metrics: $metrics_name, cache: $cache_name"); - - if (file_exists($fontcache . '/' . $cache_name)) { - $this->addMessage("openFont: json metrics file exists $fontcache/$cache_name"); - $cached_font_info = json_decode(file_get_contents($fontcache . '/' . $cache_name), true); - if (!isset($cached_font_info['_version_']) || $cached_font_info['_version_'] != $this->fontcacheVersion) { - $this->addMessage('openFont: font cache is out of date, regenerating'); - } else { - $this->fonts[$font] = $cached_font_info; - } - } - - if (!isset($this->fonts[$font]) && file_exists("$dir/$metrics_name")) { - // then rebuild the php_.afm file from the .afm file - $this->addMessage("openFont: build php file from $dir/$metrics_name"); - $data = []; - - // 20 => 'space' - $data['codeToName'] = []; - - // Since we're not going to enable Unicode for the core fonts we need to use a font-based - // setting for Unicode support rather than a global setting. - $data['isUnicode'] = (strtolower(substr($metrics_name, -3)) !== 'afm'); - - $cidtogid = ''; - if ($data['isUnicode']) { - $cidtogid = str_pad('', 256 * 256 * 2, "\x00"); - } - - $file = file("$dir/$metrics_name"); - - foreach ($file as $rowA) { - $row = trim($rowA); - $pos = strpos($row, ' '); - - if ($pos) { - // then there must be some keyword - $key = substr($row, 0, $pos); - switch ($key) { - case 'FontName': - case 'FullName': - case 'FamilyName': - case 'PostScriptName': - case 'Weight': - case 'ItalicAngle': - case 'IsFixedPitch': - case 'CharacterSet': - case 'UnderlinePosition': - case 'UnderlineThickness': - case 'Version': - case 'EncodingScheme': - case 'CapHeight': - case 'XHeight': - case 'Ascender': - case 'Descender': - case 'StdHW': - case 'StdVW': - case 'StartCharMetrics': - case 'FontHeightOffset': // OAR - Added so we can offset the height calculation of a Windows font. Otherwise it's too big. - $data[$key] = trim(substr($row, $pos)); - break; - - case 'FontBBox': - $data[$key] = explode(' ', trim(substr($row, $pos))); - break; - - //C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ; - case 'C': // Found in AFM files - $bits = explode(';', trim($row)); - $dtmp = ['C' => null, 'N' => null, 'WX' => null, 'B' => []]; - - foreach ($bits as $bit) { - $bits2 = explode(' ', trim($bit)); - if (mb_strlen($bits2[0], '8bit') == 0) { - continue; - } - - if (count($bits2) > 2) { - $dtmp[$bits2[0]] = []; - for ($i = 1; $i < count($bits2); $i++) { - $dtmp[$bits2[0]][] = $bits2[$i]; - } - } else { - if (count($bits2) == 2) { - $dtmp[$bits2[0]] = $bits2[1]; - } - } - } - - $c = (int)$dtmp['C']; - $n = $dtmp['N']; - $width = floatval($dtmp['WX']); - - if ($c >= 0) { - if (!ctype_xdigit($n) || $c != hexdec($n)) { - $data['codeToName'][$c] = $n; - } - $data['C'][$c] = $width; - } elseif (isset($n)) { - $data['C'][$n] = $width; - } - - if (!isset($data['MissingWidth']) && $c === -1 && $n === '.notdef') { - $data['MissingWidth'] = $width; - } - - break; - - // U 827 ; WX 0 ; N squaresubnosp ; G 675 ; - case 'U': // Found in UFM files - if (!$data['isUnicode']) { - break; - } - - $bits = explode(';', trim($row)); - $dtmp = ['G' => null, 'N' => null, 'U' => null, 'WX' => null]; - - foreach ($bits as $bit) { - $bits2 = explode(' ', trim($bit)); - if (mb_strlen($bits2[0], '8bit') === 0) { - continue; - } - - if (count($bits2) > 2) { - $dtmp[$bits2[0]] = []; - for ($i = 1; $i < count($bits2); $i++) { - $dtmp[$bits2[0]][] = $bits2[$i]; - } - } else { - if (count($bits2) == 2) { - $dtmp[$bits2[0]] = $bits2[1]; - } - } - } - - $c = (int)$dtmp['U']; - $n = $dtmp['N']; - $glyph = $dtmp['G']; - $width = floatval($dtmp['WX']); - - if ($c >= 0) { - // Set values in CID to GID map - if ($c >= 0 && $c < 0xFFFF && $glyph) { - $cidtogid[$c * 2] = chr($glyph >> 8); - $cidtogid[$c * 2 + 1] = chr($glyph & 0xFF); - } - - if (!ctype_xdigit($n) || $c != hexdec($n)) { - $data['codeToName'][$c] = $n; - } - $data['C'][$c] = $width; - } elseif (isset($n)) { - $data['C'][$n] = $width; - } - - if (!isset($data['MissingWidth']) && $c === -1 && $n === '.notdef') { - $data['MissingWidth'] = $width; - } - - break; - - case 'KPX': - break; // don't include them as they are not used yet - //KPX Adieresis yacute -40 - /*$bits = explode(' ', trim($row)); - $data['KPX'][$bits[1]][$bits[2]] = $bits[3]; - break;*/ - } - } - } - - if ($this->compressionReady && $this->options['compression']) { - // then implement ZLIB based compression on CIDtoGID string - $data['CIDtoGID_Compressed'] = true; - $cidtogid = gzcompress($cidtogid, 6); - } - $data['CIDtoGID'] = base64_encode($cidtogid); - $data['_version_'] = $this->fontcacheVersion; - $this->fonts[$font] = $data; - - //Because of potential trouble with php safe mode, expect that the folder already exists. - //If not existing, this will hit performance because of missing cached results. - if (is_dir($fontcache) && is_writable($fontcache)) { - file_put_contents("$fontcache/$cache_name", json_encode($data, JSON_PRETTY_PRINT)); - } - $data = null; - } - - if (!isset($this->fonts[$font])) { - $this->addMessage("openFont: no font file found for $font. Do you need to run load_font.php?"); - } - } - - /** - * if the font is not loaded then load it and make the required object - * else just make it the current font - * the encoding array can contain 'encoding'=> 'none','WinAnsiEncoding','MacRomanEncoding' or 'MacExpertEncoding' - * note that encoding='none' will need to be used for symbolic fonts - * and 'differences' => an array of mappings between numbers 0->255 and character names. - * - * @param string $fontName - * @param string $encoding - * @param bool $set - * @param bool $isSubsetting - * @return int - * @throws FontNotFoundException - */ - function selectFont($fontName, $encoding = '', $set = true, $isSubsetting = true) - { - if ($fontName === null || $fontName === '') { - return $this->currentFontNum; - } - - $ext = substr($fontName, -4); - if ($ext === '.afm' || $ext === '.ufm') { - $fontName = substr($fontName, 0, mb_strlen($fontName) - 4); - } - - if (!isset($this->fonts[$fontName])) { - $this->addMessage("selectFont: selecting - $fontName - $encoding, $set"); - - // load the file - $this->openFont($fontName); - - if (isset($this->fonts[$fontName])) { - $this->numObj++; - $this->numFonts++; - - $font = &$this->fonts[$fontName]; - - $name = basename($fontName); - $options = ['name' => $name, 'fontFileName' => $fontName, 'isSubsetting' => $isSubsetting]; - - if (is_array($encoding)) { - // then encoding and differences might be set - if (isset($encoding['encoding'])) { - $options['encoding'] = $encoding['encoding']; - } - - if (isset($encoding['differences'])) { - $options['differences'] = $encoding['differences']; - } - } else { - if (mb_strlen($encoding, '8bit')) { - // then perhaps only the encoding has been set - $options['encoding'] = $encoding; - } - } - - $this->o_font($this->numObj, 'new', $options); - - if (file_exists("$fontName.ttf")) { - $fileSuffix = 'ttf'; - } elseif (file_exists("$fontName.TTF")) { - $fileSuffix = 'TTF'; - } elseif (file_exists("$fontName.pfb")) { - $fileSuffix = 'pfb'; - } elseif (file_exists("$fontName.PFB")) { - $fileSuffix = 'PFB'; - } else { - $fileSuffix = ''; - } - - $font['fileSuffix'] = $fileSuffix; - - $font['fontNum'] = $this->numFonts; - $font['isSubsetting'] = $isSubsetting && $font['isUnicode'] && strtolower($fileSuffix) === 'ttf'; - - // also set the differences here, note that this means that these will take effect only the - //first time that a font is selected, else they are ignored - if (isset($options['differences'])) { - $font['differences'] = $options['differences']; - } - } - } - - if ($set && isset($this->fonts[$fontName])) { - // so if for some reason the font was not set in the last one then it will not be selected - $this->currentBaseFont = $fontName; - - // the next lines mean that if a new font is selected, then the current text state will be - // applied to it as well. - $this->currentFont = $this->currentBaseFont; - $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; - } - - return $this->currentFontNum; - } - - /** - * sets up the current font, based on the font families, and the current text state - * note that this system is quite flexible, a bold-italic font can be completely different to a - * italic-bold font, and even bold-bold will have to be defined within the family to have meaning - * This function is to be called whenever the currentTextState is changed, it will update - * the currentFont setting to whatever the appropriate family one is. - * If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont - * This function will change the currentFont to whatever it should be, but will not change the - * currentBaseFont. - */ - private function setCurrentFont() - { - // if (strlen($this->currentBaseFont) == 0){ - // // then assume an initial font - // $this->selectFont($this->defaultFont); - // } - // $cf = substr($this->currentBaseFont,strrpos($this->currentBaseFont,'/')+1); - // if (strlen($this->currentTextState) - // && isset($this->fontFamilies[$cf]) - // && isset($this->fontFamilies[$cf][$this->currentTextState])){ - // // then we are in some state or another - // // and this font has a family, and the current setting exists within it - // // select the font, then return it - // $nf = substr($this->currentBaseFont,0,strrpos($this->currentBaseFont,'/')+1).$this->fontFamilies[$cf][$this->currentTextState]; - // $this->selectFont($nf,'',0); - // $this->currentFont = $nf; - // $this->currentFontNum = $this->fonts[$nf]['fontNum']; - // } else { - // // the this font must not have the right family member for the current state - // // simply assume the base font - $this->currentFont = $this->currentBaseFont; - $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; - // } - } - - /** - * function for the user to find out what the ID is of the first page that was created during - * startup - useful if they wish to add something to it later. - * - * @return int - */ - function getFirstPageId() - { - return $this->firstPageId; - } - - /** - * add content to the currently active object - * - * @param $content - */ - private function addContent($content) - { - $this->objects[$this->currentContents]['c'] .= $content; - } - - /** - * sets the color for fill operations - * - * @param array $color - * @param bool $force - */ - function setColor($color, $force = false) - { - $new_color = [$color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null]; - - if (!$force && $this->currentColor == $new_color) { - return; - } - - if (isset($new_color[3])) { - $this->currentColor = $new_color; - $this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F k", $this->currentColor)); - } else { - if (isset($new_color[2])) { - $this->currentColor = $new_color; - $this->addContent(vsprintf("\n%.3F %.3F %.3F rg", $this->currentColor)); - } - } - } - - /** - * sets the color for fill operations - * - * @param string $fillRule - */ - function setFillRule($fillRule) - { - if (!in_array($fillRule, ["nonzero", "evenodd"])) { - return; - } - - $this->fillRule = $fillRule; - } - - /** - * sets the color for stroke operations - * - * @param array $color - * @param bool $force - */ - function setStrokeColor($color, $force = false) - { - $new_color = [$color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null]; - - if (!$force && $this->currentStrokeColor == $new_color) { - return; - } - - if (isset($new_color[3])) { - $this->currentStrokeColor = $new_color; - $this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F K", $this->currentStrokeColor)); - } else { - if (isset($new_color[2])) { - $this->currentStrokeColor = $new_color; - $this->addContent(vsprintf("\n%.3F %.3F %.3F RG", $this->currentStrokeColor)); - } - } - } - - /** - * Set the graphics state for compositions - * - * @param $parameters - */ - function setGraphicsState($parameters) - { - // Create a new graphics state object if necessary - if (($gstate = array_search($parameters, $this->gstates)) === false) { - $this->numObj++; - $this->o_extGState($this->numObj, 'new', $parameters); - $gstate = $this->numStates; - $this->gstates[$gstate] = $parameters; - } - $this->addContent("\n/GS$gstate gs"); - } - - /** - * Set current blend mode & opacity for lines. - * - * Valid blend modes are: - * - * Normal, Multiply, Screen, Overlay, Darken, Lighten, - * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, - * Exclusion - * - * @param string $mode the blend mode to use - * @param float $opacity 0.0 fully transparent, 1.0 fully opaque - */ - function setLineTransparency($mode, $opacity) - { - static $blend_modes = [ - "Normal", - "Multiply", - "Screen", - "Overlay", - "Darken", - "Lighten", - "ColorDogde", - "ColorBurn", - "HardLight", - "SoftLight", - "Difference", - "Exclusion" - ]; - - if (!in_array($mode, $blend_modes)) { - $mode = "Normal"; - } - - if (is_null($this->currentLineTransparency)) { - $this->currentLineTransparency = []; - } - - if ($mode === (key_exists('mode', $this->currentLineTransparency) ? - $this->currentLineTransparency['mode'] : '') && - $opacity === (key_exists('opacity', $this->currentLineTransparency) ? - $this->currentLineTransparency["opacity"] : '')) { - return; - } - - $this->currentLineTransparency["mode"] = $mode; - $this->currentLineTransparency["opacity"] = $opacity; - - $options = [ - "BM" => "/$mode", - "CA" => (float)$opacity - ]; - - $this->setGraphicsState($options); - } - - /** - * Set current blend mode & opacity for filled objects. - * - * Valid blend modes are: - * - * Normal, Multiply, Screen, Overlay, Darken, Lighten, - * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, - * Exclusion - * - * @param string $mode the blend mode to use - * @param float $opacity 0.0 fully transparent, 1.0 fully opaque - */ - function setFillTransparency($mode, $opacity) - { - static $blend_modes = [ - "Normal", - "Multiply", - "Screen", - "Overlay", - "Darken", - "Lighten", - "ColorDogde", - "ColorBurn", - "HardLight", - "SoftLight", - "Difference", - "Exclusion" - ]; - - if (!in_array($mode, $blend_modes)) { - $mode = "Normal"; - } - - if (is_null($this->currentFillTransparency)) { - $this->currentFillTransparency = []; - } - - if ($mode === (key_exists('mode', $this->currentFillTransparency) ? - $this->currentFillTransparency['mode'] : '') && - $opacity === (key_exists('opacity', $this->currentFillTransparency) ? - $this->currentFillTransparency["opacity"] : '')) { - return; - } - - $this->currentFillTransparency["mode"] = $mode; - $this->currentFillTransparency["opacity"] = $opacity; - - $options = [ - "BM" => "/$mode", - "ca" => (float)$opacity, - ]; - - $this->setGraphicsState($options); - } - - /** - * draw a line from one set of coordinates to another - * - * @param float $x1 - * @param float $y1 - * @param float $x2 - * @param float $y2 - * @param bool $stroke - */ - function line($x1, $y1, $x2, $y2, $stroke = true) - { - $this->addContent(sprintf("\n%.3F %.3F m %.3F %.3F l", $x1, $y1, $x2, $y2)); - - if ($stroke) { - $this->addContent(' S'); - } - } - - /** - * draw a bezier curve based on 4 control points - * - * @param float $x0 - * @param float $y0 - * @param float $x1 - * @param float $y1 - * @param float $x2 - * @param float $y2 - * @param float $x3 - * @param float $y3 - */ - function curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) - { - // in the current line style, draw a bezier curve from (x0,y0) to (x3,y3) using the other two points - // as the control points for the curve. - $this->addContent( - sprintf("\n%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c S", $x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) - ); - } - - /** - * draw a part of an ellipse - * - * @param float $x0 - * @param float $y0 - * @param float $astart - * @param float $afinish - * @param float $r1 - * @param float $r2 - * @param float $angle - * @param int $nSeg - */ - function partEllipse($x0, $y0, $astart, $afinish, $r1, $r2 = 0, $angle = 0, $nSeg = 8) - { - $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, false); - } - - /** - * draw a filled ellipse - * - * @param float $x0 - * @param float $y0 - * @param float $r1 - * @param float $r2 - * @param float $angle - * @param int $nSeg - * @param float $astart - * @param float $afinish - */ - function filledEllipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360) - { - $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, true, true); - } - - /** - * @param float $x - * @param float $y - */ - function lineTo($x, $y) - { - $this->addContent(sprintf("\n%.3F %.3F l", $x, $y)); - } - - /** - * @param float $x - * @param float $y - */ - function moveTo($x, $y) - { - $this->addContent(sprintf("\n%.3F %.3F m", $x, $y)); - } - - /** - * draw a bezier curve based on 4 control points - * - * @param float $x1 - * @param float $y1 - * @param float $x2 - * @param float $y2 - * @param float $x3 - * @param float $y3 - */ - function curveTo($x1, $y1, $x2, $y2, $x3, $y3) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F %.3F %.3F c", $x1, $y1, $x2, $y2, $x3, $y3)); - } - - /** - * draw a bezier curve based on 4 control points - * - * @param float $cpx - * @param float $cpy - * @param float $x - * @param float $y - */ - function quadTo($cpx, $cpy, $x, $y) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F v", $cpx, $cpy, $x, $y)); - } - - function closePath() - { - $this->addContent(' h'); - } - - function endPath() - { - $this->addContent(' n'); - } - - /** - * draw an ellipse - * note that the part and filled ellipse are just special cases of this function - * - * draws an ellipse in the current line style - * centered at $x0,$y0, radii $r1,$r2 - * if $r2 is not set, then a circle is drawn - * from $astart to $afinish, measured in degrees, running anti-clockwise from the right hand side of the ellipse. - * nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a - * pretty crappy shape at 2, as we are approximating with bezier curves. - * - * @param float $x0 - * @param float $y0 - * @param float $r1 - * @param float $r2 - * @param float $angle - * @param int $nSeg - * @param float $astart - * @param float $afinish - * @param bool $close - * @param bool $fill - * @param bool $stroke - * @param bool $incomplete - */ - function ellipse( - $x0, - $y0, - $r1, - $r2 = 0, - $angle = 0, - $nSeg = 8, - $astart = 0, - $afinish = 360, - $close = true, - $fill = false, - $stroke = true, - $incomplete = false - ) { - if ($r1 == 0) { - return; - } - - if ($r2 == 0) { - $r2 = $r1; - } - - if ($nSeg < 2) { - $nSeg = 2; - } - - $astart = deg2rad((float)$astart); - $afinish = deg2rad((float)$afinish); - $totalAngle = $afinish - $astart; - - $dt = $totalAngle / $nSeg; - $dtm = $dt / 3; - - if ($angle != 0) { - $a = -1 * deg2rad((float)$angle); - - $this->addContent( - sprintf("\n q %.3F %.3F %.3F %.3F %.3F %.3F cm", cos($a), -sin($a), sin($a), cos($a), $x0, $y0) - ); - - $x0 = 0; - $y0 = 0; - } - - $t1 = $astart; - $a0 = $x0 + $r1 * cos($t1); - $b0 = $y0 + $r2 * sin($t1); - $c0 = -$r1 * sin($t1); - $d0 = $r2 * cos($t1); - - if (!$incomplete) { - $this->addContent(sprintf("\n%.3F %.3F m ", $a0, $b0)); - } - - for ($i = 1; $i <= $nSeg; $i++) { - // draw this bit of the total curve - $t1 = $i * $dt + $astart; - $a1 = $x0 + $r1 * cos($t1); - $b1 = $y0 + $r2 * sin($t1); - $c1 = -$r1 * sin($t1); - $d1 = $r2 * cos($t1); - - $this->addContent( - sprintf( - "\n%.3F %.3F %.3F %.3F %.3F %.3F c", - ($a0 + $c0 * $dtm), - ($b0 + $d0 * $dtm), - ($a1 - $c1 * $dtm), - ($b1 - $d1 * $dtm), - $a1, - $b1 - ) - ); - - $a0 = $a1; - $b0 = $b1; - $c0 = $c1; - $d0 = $d1; - } - - if (!$incomplete) { - if ($fill) { - $this->addContent(' f'); - } - - if ($stroke) { - if ($close) { - $this->addContent(' s'); // small 's' signifies closing the path as well - } else { - $this->addContent(' S'); - } - } - } - - if ($angle != 0) { - $this->addContent(' Q'); - } - } - - /** - * this sets the line drawing style. - * width, is the thickness of the line in user units - * cap is the type of cap to put on the line, values can be 'butt','round','square' - * where the diffference between 'square' and 'butt' is that 'square' projects a flat end past the - * end of the line. - * join can be 'miter', 'round', 'bevel' - * dash is an array which sets the dash pattern, is a series of length values, which are the lengths of the - * on and off dashes. - * (2) represents 2 on, 2 off, 2 on , 2 off ... - * (2,1) is 2 on, 1 off, 2 on, 1 off.. etc - * phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts. - * - * @param float $width - * @param string $cap - * @param string $join - * @param array $dash - * @param int $phase - */ - function setLineStyle($width = 1, $cap = '', $join = '', $dash = '', $phase = 0) - { - // this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day - $string = ''; - - if ($width > 0) { - $string .= "$width w"; - } - - $ca = ['butt' => 0, 'round' => 1, 'square' => 2]; - - if (isset($ca[$cap])) { - $string .= " $ca[$cap] J"; - } - - $ja = ['miter' => 0, 'round' => 1, 'bevel' => 2]; - - if (isset($ja[$join])) { - $string .= " $ja[$join] j"; - } - - if (is_array($dash)) { - $string .= ' [ ' . implode(' ', $dash) . " ] $phase d"; - } - - $this->currentLineStyle = $string; - $this->addContent("\n$string"); - } - - /** - * draw a polygon, the syntax for this is similar to the GD polygon command - * - * @param float[] $p - * @param bool $fill - */ - public function polygon(array $p, bool $fill = false): void - { - $this->addContent(sprintf("\n%.3F %.3F m ", $p[0], $p[1])); - - $n = count($p); - for ($i = 2; $i < $n; $i = $i + 2) { - $this->addContent(sprintf("%.3F %.3F l ", $p[$i], $p[$i + 1])); - } - - if ($fill) { - $this->addContent(' f'); - } else { - $this->addContent(' S'); - } - } - - /** - * a filled rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not - * the coordinates of the upper-right corner - * - * @param float $x1 - * @param float $y1 - * @param float $width - * @param float $height - */ - function filledRectangle($x1, $y1, $width, $height) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re f", $x1, $y1, $width, $height)); - } - - /** - * draw a rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not - * the coordinates of the upper-right corner - * - * @param float $x1 - * @param float $y1 - * @param float $width - * @param float $height - */ - function rectangle($x1, $y1, $width, $height) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re S", $x1, $y1, $width, $height)); - } - - /** - * draw a rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not - * the coordinates of the upper-right corner - * - * @param float $x1 - * @param float $y1 - * @param float $width - * @param float $height - */ - function rect($x1, $y1, $width, $height) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re", $x1, $y1, $width, $height)); - } - - function stroke(bool $close = false) - { - $this->addContent("\n" . ($close ? "s" : "S")); - } - - function fill() - { - $this->addContent("\nf" . ($this->fillRule === "evenodd" ? "*" : "")); - } - - function fillStroke(bool $close = false) - { - $this->addContent("\n" . ($close ? "b" : "B") . ($this->fillRule === "evenodd" ? "*" : "")); - } - - /** - * @param string $subtype - * @param integer $x - * @param integer $y - * @param integer $w - * @param integer $h - * @return int - */ - function addXObject($subtype, $x, $y, $w, $h) - { - $id = ++$this->numObj; - $this->o_xobject($id, 'new', ['Subtype' => $subtype, 'bbox' => [$x, $y, $w, $h]]); - return $id; - } - - /** - * @param integer $numXObject - * @param string $type - * @param array $options - */ - function setXObjectResource($numXObject, $type, $options) - { - if (in_array($type, ['procset', 'font', 'xObject'])) { - $this->o_xobject($numXObject, $type, $options); - } - } - - /** - * add signature - * - * $fieldSigId = $cpdf->addFormField(Cpdf::ACROFORM_FIELD_SIG, 'Signature1', 0, 0, 0, 0, 0); - * - * $signatureId = $cpdf->addSignature([ - * 'signcert' => file_get_contents('dompdf.crt'), - * 'privkey' => file_get_contents('dompdf.key'), - * 'password' => 'password', - * 'name' => 'DomPDF DEMO', - * 'location' => 'Home', - * 'reason' => 'First Form', - * 'contactinfo' => 'info' - * ]); - * $cpdf->setFormFieldValue($fieldSigId, "$signatureId 0 R"); - * - * @param string $signcert - * @param string $privkey - * @param string $password - * @param string|null $name - * @param string|null $location - * @param string|null $reason - * @param string|null $contactinfo - * @return int - */ - function addSignature($signcert, $privkey, $password = '', $name = null, $location = null, $reason = null, $contactinfo = null) { - $sigId = ++$this->numObj; - $this->o_sig($sigId, 'new', [ - 'SignCert' => $signcert, - 'PrivKey' => $privkey, - 'Password' => $password, - 'Name' => $name, - 'Location' => $location, - 'Reason' => $reason, - 'ContactInfo' => $contactinfo - ]); - - return $sigId; - } - - /** - * add field to form - * - * @param string $type ACROFORM_FIELD_* - * @param string $name - * @param $x0 - * @param $y0 - * @param $x1 - * @param $y1 - * @param integer $ff Field Flag ACROFORM_FIELD_*_* - * @param float $size - * @param array $color - * @return int - */ - public function addFormField($type, $name, $x0, $y0, $x1, $y1, $ff = 0, $size = 10.0, $color = [0, 0, 0]) - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $color = implode(' ', $color) . ' rg'; - - $currentFontNum = $this->currentFontNum; - $font = array_filter( - $this->objects[$this->currentNode]['info']['fonts'], - function ($item) use ($currentFontNum) { return $item['fontNum'] == $currentFontNum; } - ); - - $this->o_acroform($this->acroFormId, 'font', - ['objNum' => $font[0]['objNum'], 'fontNum' => $font[0]['fontNum']]); - - $fieldId = ++$this->numObj; - $this->o_field($fieldId, 'new', [ - 'rect' => [$x0, $y0, $x1, $y1], - 'F' => 4, - 'FT' => "/$type", - 'T' => $name, - 'Ff' => $ff, - 'pageid' => $this->currentPage, - 'da' => "$color /F$this->currentFontNum " . sprintf('%.1F Tf ', $size) - ]); - - return $fieldId; - } - - /** - * set Field value - * - * @param integer $numFieldObj - * @param string $value - */ - public function setFormFieldValue($numFieldObj, $value) - { - $this->o_field($numFieldObj, 'set', ['value' => $value]); - } - - /** - * set Field value (reference) - * - * @param integer $numFieldObj - * @param integer $numObj Object number - */ - public function setFormFieldRefValue($numFieldObj, $numObj) - { - $this->o_field($numFieldObj, 'set', ['refvalue' => $numObj]); - } - - /** - * set Field Appearanc (reference) - * - * @param integer $numFieldObj - * @param integer $normalNumObj - * @param integer|null $rolloverNumObj - * @param integer|null $downNumObj - */ - public function setFormFieldAppearance($numFieldObj, $normalNumObj, $rolloverNumObj = null, $downNumObj = null) - { - $appearance['N'] = $normalNumObj; - - if ($rolloverNumObj !== null) { - $appearance['R'] = $rolloverNumObj; - } - - if ($downNumObj !== null) { - $appearance['D'] = $downNumObj; - } - - $this->o_field($numFieldObj, 'set', ['appearance' => $appearance]); - } - - /** - * set Choice Field option values - * - * @param integer $numFieldObj - * @param array $value - */ - public function setFormFieldOpt($numFieldObj, $value) - { - $this->o_field($numFieldObj, 'set', ['options' => $value]); - } - - /** - * add form to document - * - * @param integer $sigFlags - * @param boolean $needAppearances - */ - public function addForm($sigFlags = 0, $needAppearances = false) - { - $this->acroFormId = ++$this->numObj; - $this->o_acroform($this->acroFormId, 'new', [ - 'NeedAppearances' => $needAppearances ? 'true' : 'false', - 'SigFlags' => $sigFlags - ]); - } - - /** - * save the current graphic state - */ - function save() - { - // we must reset the color cache or it will keep bad colors after clipping - $this->currentColor = null; - $this->currentStrokeColor = null; - $this->addContent("\nq"); - } - - /** - * restore the last graphic state - */ - function restore() - { - // we must reset the color cache or it will keep bad colors after clipping - $this->currentColor = null; - $this->currentStrokeColor = null; - $this->addContent("\nQ"); - } - - /** - * draw a clipping rectangle, all the elements added after this will be clipped - * - * @param float $x1 - * @param float $y1 - * @param float $width - * @param float $height - */ - function clippingRectangle($x1, $y1, $width, $height) - { - $this->save(); - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re W n", $x1, $y1, $width, $height)); - } - - /** - * draw a clipping rounded rectangle, all the elements added after this will be clipped - * - * @param float $x1 - * @param float $y1 - * @param float $w - * @param float $h - * @param float $rTL - * @param float $rTR - * @param float $rBR - * @param float $rBL - */ - function clippingRectangleRounded($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) - { - $this->save(); - - // start: top edge, left end - $this->addContent(sprintf("\n%.3F %.3F m ", $x1, $y1 - $rTL + $h)); - - // line: bottom edge, left end - $this->addContent(sprintf("\n%.3F %.3F l ", $x1, $y1 + $rBL)); - - // curve: bottom-left corner - $this->ellipse($x1 + $rBL, $y1 + $rBL, $rBL, 0, 0, 8, 180, 270, false, false, false, true); - - // line: right edge, bottom end - $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $w - $rBR, $y1)); - - // curve: bottom-right corner - $this->ellipse($x1 + $w - $rBR, $y1 + $rBR, $rBR, 0, 0, 8, 270, 360, false, false, false, true); - - // line: right edge, top end - $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $w, $y1 + $h - $rTR)); - - // curve: bottom-right corner - $this->ellipse($x1 + $w - $rTR, $y1 + $h - $rTR, $rTR, 0, 0, 8, 0, 90, false, false, false, true); - - // line: bottom edge, right end - $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $rTL, $y1 + $h)); - - // curve: top-right corner - $this->ellipse($x1 + $rTL, $y1 + $h - $rTL, $rTL, 0, 0, 8, 90, 180, false, false, false, true); - - // line: top edge, left end - $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $rBL, $y1)); - - // Close & clip - $this->addContent(" W n"); - } - - /** - * draw a clipping polygon, the syntax for this is similar to the GD polygon command - * - * @param float[] $p - */ - public function clippingPolygon(array $p): void - { - $this->save(); - - $this->addContent(sprintf("\n%.3F %.3F m ", $p[0], $p[1])); - - $n = count($p); - for ($i = 2; $i < $n; $i = $i + 2) { - $this->addContent(sprintf("%.3F %.3F l ", $p[$i], $p[$i + 1])); - } - - $this->addContent("W n"); - } - - /** - * ends the last clipping shape - */ - function clippingEnd() - { - $this->restore(); - } - - /** - * scale - * - * @param float $s_x scaling factor for width as percent - * @param float $s_y scaling factor for height as percent - * @param float $x Origin abscissa - * @param float $y Origin ordinate - */ - function scale($s_x, $s_y, $x, $y) - { - $y = $this->currentPageSize["height"] - $y; - - $tm = [ - $s_x, - 0, - 0, - $s_y, - $x * (1 - $s_x), - $y * (1 - $s_y) - ]; - - $this->transform($tm); - } - - /** - * translate - * - * @param float $t_x movement to the right - * @param float $t_y movement to the bottom - */ - function translate($t_x, $t_y) - { - $tm = [ - 1, - 0, - 0, - 1, - $t_x, - -$t_y - ]; - - $this->transform($tm); - } - - /** - * rotate - * - * @param float $angle angle in degrees for counter-clockwise rotation - * @param float $x Origin abscissa - * @param float $y Origin ordinate - */ - function rotate($angle, $x, $y) - { - $y = $this->currentPageSize["height"] - $y; - - $a = deg2rad($angle); - $cos_a = cos($a); - $sin_a = sin($a); - - $tm = [ - $cos_a, - -$sin_a, - $sin_a, - $cos_a, - $x - $sin_a * $y - $cos_a * $x, - $y - $cos_a * $y + $sin_a * $x, - ]; - - $this->transform($tm); - } - - /** - * skew - * - * @param float $angle_x - * @param float $angle_y - * @param float $x Origin abscissa - * @param float $y Origin ordinate - */ - function skew($angle_x, $angle_y, $x, $y) - { - $y = $this->currentPageSize["height"] - $y; - - $tan_x = tan(deg2rad($angle_x)); - $tan_y = tan(deg2rad($angle_y)); - - $tm = [ - 1, - -$tan_y, - -$tan_x, - 1, - $tan_x * $y, - $tan_y * $x, - ]; - - $this->transform($tm); - } - - /** - * apply graphic transformations - * - * @param array $tm transformation matrix - */ - function transform($tm) - { - $this->addContent(vsprintf("\n %.3F %.3F %.3F %.3F %.3F %.3F cm", $tm)); - } - - /** - * add a new page to the document - * this also makes the new page the current active object - * - * @param int $insert - * @param int $id - * @param string $pos - * @return int - */ - function newPage($insert = 0, $id = 0, $pos = 'after') - { - // if there is a state saved, then go up the stack closing them - // then on the new page, re-open them with the right setings - - if ($this->nStateStack) { - for ($i = $this->nStateStack; $i >= 1; $i--) { - $this->restoreState($i); - } - } - - $this->numObj++; - - if ($insert) { - // the id from the ezPdf class is the id of the contents of the page, not the page object itself - // query that object to find the parent - $rid = $this->objects[$id]['onPage']; - $opt = ['rid' => $rid, 'pos' => $pos]; - $this->o_page($this->numObj, 'new', $opt); - } else { - $this->o_page($this->numObj, 'new'); - } - - // if there is a stack saved, then put that onto the page - if ($this->nStateStack) { - for ($i = 1; $i <= $this->nStateStack; $i++) { - $this->saveState($i); - } - } - - // and if there has been a stroke or fill color set, then transfer them - if (isset($this->currentColor)) { - $this->setColor($this->currentColor, true); - } - - if (isset($this->currentStrokeColor)) { - $this->setStrokeColor($this->currentStrokeColor, true); - } - - // if there is a line style set, then put this in too - if (mb_strlen($this->currentLineStyle, '8bit')) { - $this->addContent("\n$this->currentLineStyle"); - } - - // the call to the o_page object set currentContents to the present page, so this can be returned as the page id - return $this->currentContents; - } - - /** - * Streams the PDF to the client. - * - * @param string $filename The filename to present to the client. - * @param array $options Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1). - */ - function stream($filename = "document.pdf", $options = []) - { - if (headers_sent()) { - die("Unable to stream pdf: headers already sent"); - } - - if (!isset($options["compress"])) $options["compress"] = true; - if (!isset($options["Attachment"])) $options["Attachment"] = true; - - $debug = !$options['compress']; - $tmp = ltrim($this->output($debug)); - - header("Cache-Control: private"); - header("Content-Type: application/pdf"); - header("Content-Length: " . mb_strlen($tmp, "8bit")); - - $filename = str_replace(["\n", "'"], "", basename($filename, ".pdf")) . ".pdf"; - $attachment = $options["Attachment"] ? "attachment" : "inline"; - - $encoding = mb_detect_encoding($filename); - $fallbackfilename = mb_convert_encoding($filename, "ISO-8859-1", $encoding); - $fallbackfilename = str_replace("\"", "", $fallbackfilename); - $encodedfilename = rawurlencode($filename); - - $contentDisposition = "Content-Disposition: $attachment; filename=\"$fallbackfilename\""; - if ($fallbackfilename !== $filename) { - $contentDisposition .= "; filename*=UTF-8''$encodedfilename"; - } - header($contentDisposition); - - echo $tmp; - flush(); - } - - /** - * return the height in units of the current font in the given size - * - * @param float $size - * - * @return float - */ - public function getFontHeight(float $size): float - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $font = $this->fonts[$this->currentFont]; - - // for the current font, and the given size, what is the height of the font in user units - if (isset($font['Ascender']) && isset($font['Descender'])) { - $h = $font['Ascender'] - $font['Descender']; - } else { - $h = $font['FontBBox'][3] - $font['FontBBox'][1]; - } - - // have to adjust by a font offset for Windows fonts. unfortunately it looks like - // the bounding box calculations are wrong and I don't know why. - if (isset($font['FontHeightOffset'])) { - // For CourierNew from Windows this needs to be -646 to match the - // Adobe native Courier font. - // - // For FreeMono from GNU this needs to be -337 to match the - // Courier font. - // - // Both have been added manually to the .afm and .ufm files. - $h += (int)$font['FontHeightOffset']; - } - - return $size * $h / 1000; - } - - /** - * @param float $size - * - * @return float - */ - public function getFontXHeight(float $size): float - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $font = $this->fonts[$this->currentFont]; - - // for the current font, and the given size, what is the height of the font in user units - if (isset($font['XHeight'])) { - $xh = $font['Ascender'] - $font['Descender']; - } else { - $xh = $this->getFontHeight($size) / 2; - } - - return $size * $xh / 1000; - } - - /** - * return the font descender, this will normally return a negative number - * if you add this number to the baseline, you get the level of the bottom of the font - * it is in the pdf user units - * - * @param float $size - * - * @return float - */ - public function getFontDescender(float $size): float - { - // note that this will most likely return a negative value - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - //$h = $this->fonts[$this->currentFont]['FontBBox'][1]; - $h = $this->fonts[$this->currentFont]['Descender']; - - return $size * $h / 1000; - } - - /** - * filter the text, this is applied to all text just before being inserted into the pdf document - * it escapes the various things that need to be escaped, and so on - * - * @param $text - * @param bool $bom - * @param bool $convert_encoding - * @return string - */ - function filterText($text, $bom = true, $convert_encoding = true) - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - if ($convert_encoding) { - $cf = $this->currentFont; - if (isset($this->fonts[$cf]) && $this->fonts[$cf]['isUnicode']) { - $text = $this->utf8toUtf16BE($text, $bom); - } else { - //$text = html_entity_decode($text, ENT_QUOTES); - $text = mb_convert_encoding($text, self::$targetEncoding, 'UTF-8'); - } - } elseif ($bom) { - $text = $this->utf8toUtf16BE($text, $bom); - } - - // the chr(13) substitution fixes a bug seen in TCPDF (bug #1421290) - return strtr($text, [')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r']); - } - - /** - * return array containing codepoints (UTF-8 character values) for the - * string passed in. - * - * based on the excellent TCPDF code by Nicola Asuni and the - * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html - * - * @param string $text UTF-8 string to process - * @return array UTF-8 codepoints array for the string - */ - function utf8toCodePointsArray(&$text) - { - $length = mb_strlen($text, '8bit'); // http://www.php.net/manual/en/function.mb-strlen.php#77040 - $unicode = []; // array containing unicode values - $bytes = []; // array containing single character byte sequences - $numbytes = 1; // number of octets needed to represent the UTF-8 character - - for ($i = 0; $i < $length; $i++) { - $c = ord($text[$i]); // get one string character at time - if (count($bytes) === 0) { // get starting octect - if ($c <= 0x7F) { - $unicode[] = $c; // use the character "as is" because is ASCII - $numbytes = 1; - } elseif (($c >> 0x05) === 0x06) { // 2 bytes character (0x06 = 110 BIN) - $bytes[] = ($c - 0xC0) << 0x06; - $numbytes = 2; - } elseif (($c >> 0x04) === 0x0E) { // 3 bytes character (0x0E = 1110 BIN) - $bytes[] = ($c - 0xE0) << 0x0C; - $numbytes = 3; - } elseif (($c >> 0x03) === 0x1E) { // 4 bytes character (0x1E = 11110 BIN) - $bytes[] = ($c - 0xF0) << 0x12; - $numbytes = 4; - } else { - // use replacement character for other invalid sequences - $unicode[] = 0xFFFD; - $bytes = []; - $numbytes = 1; - } - } elseif (($c >> 0x06) === 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN - $bytes[] = $c - 0x80; - if (count($bytes) === $numbytes) { - // compose UTF-8 bytes to a single unicode value - $c = $bytes[0]; - for ($j = 1; $j < $numbytes; $j++) { - $c += ($bytes[$j] << (($numbytes - $j - 1) * 0x06)); - } - if ((($c >= 0xD800) and ($c <= 0xDFFF)) or ($c >= 0x10FFFF)) { - // The definition of UTF-8 prohibits encoding character numbers between - // U+D800 and U+DFFF, which are reserved for use with the UTF-16 - // encoding form (as surrogate pairs) and do not directly represent - // characters. - $unicode[] = 0xFFFD; // use replacement character - } else { - $unicode[] = $c; // add char to array - } - // reset data for next char - $bytes = []; - $numbytes = 1; - } - } else { - // use replacement character for other invalid sequences - $unicode[] = 0xFFFD; - $bytes = []; - $numbytes = 1; - } - } - - return $unicode; - } - - /** - * convert UTF-8 to UTF-16 with an additional byte order marker - * at the front if required. - * - * based on the excellent TCPDF code by Nicola Asuni and the - * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html - * - * @param string $text UTF-8 string to process - * @param boolean $bom whether to add the byte order marker - * @return string UTF-16 result string - */ - function utf8toUtf16BE(&$text, $bom = true) - { - $out = $bom ? "\xFE\xFF" : ''; - - $unicode = $this->utf8toCodePointsArray($text); - foreach ($unicode as $c) { - if ($c === 0xFFFD) { - $out .= "\xFF\xFD"; // replacement character - } elseif ($c < 0x10000) { - $out .= chr($c >> 0x08) . chr($c & 0xFF); - } else { - $c -= 0x10000; - $w1 = 0xD800 | ($c >> 0x10); - $w2 = 0xDC00 | ($c & 0x3FF); - $out .= chr($w1 >> 0x08) . chr($w1 & 0xFF) . chr($w2 >> 0x08) . chr($w2 & 0xFF); - } - } - - return $out; - } - - /** - * given a start position and information about how text is to be laid out, calculate where - * on the page the text will end - * - * @param $x - * @param $y - * @param $angle - * @param $size - * @param $wa - * @param $text - * @return array - */ - private function getTextPosition($x, $y, $angle, $size, $wa, $text) - { - // given this information return an array containing x and y for the end position as elements 0 and 1 - $w = $this->getTextWidth($size, $text); - - // need to adjust for the number of spaces in this text - $words = explode(' ', $text); - $nspaces = count($words) - 1; - $w += $wa * $nspaces; - $a = deg2rad((float)$angle); - - return [cos($a) * $w + $x, -sin($a) * $w + $y]; - } - - /** - * Callback method used by smallCaps - * - * @param array $matches - * - * @return string - */ - function toUpper($matches) - { - return mb_strtoupper($matches[0]); - } - - function concatMatches($matches) - { - $str = ""; - foreach ($matches as $match) { - $str .= $match[0]; - } - - return $str; - } - - /** - * register text for font subsetting - * - * @param string $font - * @param string $text - */ - function registerText($font, $text) - { - if (!$this->isUnicode || in_array(mb_strtolower(basename($font)), self::$coreFonts)) { - return; - } - - if (!isset($this->stringSubsets[$font])) { - $base_subset = "\u{fffd}\u{fffe}\u{ffff}"; - $this->stringSubsets[$font] = $this->utf8toCodePointsArray($base_subset); - } - - $this->stringSubsets[$font] = array_unique( - array_merge($this->stringSubsets[$font], $this->utf8toCodePointsArray($text)) - ); - } - - /** - * add text to the document, at a specified location, size and angle on the page - * - * @param float $x - * @param float $y - * @param float $size - * @param string $text - * @param float $angle - * @param float $wordSpaceAdjust - * @param float $charSpaceAdjust - * @param bool $smallCaps - */ - function addText($x, $y, $size, $text, $angle = 0, $wordSpaceAdjust = 0, $charSpaceAdjust = 0, $smallCaps = false) - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $text = str_replace(["\r", "\n"], "", $text); - - // if ($smallCaps) { - // preg_match_all("/(\P{Ll}+)/u", $text, $matches, PREG_SET_ORDER); - // $lower = $this->concatMatches($matches); - // d($lower); - - // preg_match_all("/(\p{Ll}+)/u", $text, $matches, PREG_SET_ORDER); - // $other = $this->concatMatches($matches); - // d($other); - - // $text = preg_replace_callback("/\p{Ll}/u", array($this, "toUpper"), $text); - // } - - // if there are any open callbacks, then they should be called, to show the start of the line - if ($this->nCallback > 0) { - for ($i = $this->nCallback; $i > 0; $i--) { - // call each function - $info = [ - 'x' => $x, - 'y' => $y, - 'angle' => $angle, - 'status' => 'sol', - 'p' => $this->callback[$i]['p'], - 'nCallback' => $this->callback[$i]['nCallback'], - 'height' => $this->callback[$i]['height'], - 'descender' => $this->callback[$i]['descender'] - ]; - - $func = $this->callback[$i]['f']; - $this->$func($info); - } - } - - if ($angle == 0) { - $this->addContent(sprintf("\nBT %.3F %.3F Td", $x, $y)); - } else { - $a = deg2rad((float)$angle); - $this->addContent( - sprintf("\nBT %.3F %.3F %.3F %.3F %.3F %.3F Tm", cos($a), -sin($a), sin($a), cos($a), $x, $y) - ); - } - - if ($wordSpaceAdjust != 0) { - $this->addContent(sprintf(" %.3F Tw", $wordSpaceAdjust)); - } - - if ($charSpaceAdjust != 0) { - $this->addContent(sprintf(" %.3F Tc", $charSpaceAdjust)); - } - - $len = mb_strlen($text); - $start = 0; - - if ($start < $len) { - $part = $text; // OAR - Don't need this anymore, given that $start always equals zero. substr($text, $start); - $place_text = $this->filterText($part, false); - // modify unicode text so that extra word spacing is manually implemented (bug #) - if ($this->fonts[$this->currentFont]['isUnicode'] && $wordSpaceAdjust != 0) { - $space_scale = 1000 / $size; - $place_text = str_replace("\x00\x20", "\x00\x20)\x00\x20" . (-round($space_scale * $wordSpaceAdjust)) . "\x00\x20(", $place_text); - } - $this->addContent(" /F$this->currentFontNum " . sprintf('%.1F Tf ', $size)); - $this->addContent(" [($place_text)] TJ"); - } - - if ($wordSpaceAdjust != 0) { - $this->addContent(sprintf(" %.3F Tw", 0)); - } - - if ($charSpaceAdjust != 0) { - $this->addContent(sprintf(" %.3F Tc", 0)); - } - - $this->addContent(' ET'); - - // if there are any open callbacks, then they should be called, to show the end of the line - if ($this->nCallback > 0) { - for ($i = $this->nCallback; $i > 0; $i--) { - // call each function - $tmp = $this->getTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, $text); - $info = [ - 'x' => $tmp[0], - 'y' => $tmp[1], - 'angle' => $angle, - 'status' => 'eol', - 'p' => $this->callback[$i]['p'], - 'nCallback' => $this->callback[$i]['nCallback'], - 'height' => $this->callback[$i]['height'], - 'descender' => $this->callback[$i]['descender'] - ]; - $func = $this->callback[$i]['f']; - $this->$func($info); - } - } - - if ($this->fonts[$this->currentFont]['isSubsetting']) { - $this->registerText($this->currentFont, $text); - } - } - - /** - * calculate how wide a given text string will be on a page, at a given size. - * this can be called externally, but is also used by the other class functions - * - * @param float $size - * @param string $text - * @param float $wordSpacing - * @param float $charSpacing - * - * @return float - */ - public function getTextWidth(float $size, string $text, float $wordSpacing = 0.0, float $charSpacing = 0.0): float - { - static $ord_cache = []; - - // this function should not change any of the settings, though it will need to - // track any directives which change during calculation, so copy them at the start - // and put them back at the end. - $store_currentTextState = $this->currentTextState; - - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $text = str_replace(["\r", "\n"], "", $text); - - // hmm, this is where it all starts to get tricky - use the font information to - // calculate the width of each character, add them up and convert to user units - $w = 0; - $cf = $this->currentFont; - $current_font = $this->fonts[$cf]; - $space_scale = 1000 / ($size > 0 ? $size : 1); - - if ($current_font['isUnicode']) { - // for Unicode, use the code points array to calculate width rather - // than just the string itself - $unicode = $this->utf8toCodePointsArray($text); - - foreach ($unicode as $char) { - // check if we have to replace character - if (isset($current_font['differences'][$char])) { - $char = $current_font['differences'][$char]; - } - - if (isset($current_font['C'][$char])) { - $char_width = $current_font['C'][$char]; - - // add the character width - $w += $char_width; - - // add additional padding for space - if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') { // Space - $w += $wordSpacing * $space_scale; - } - } - } - - // add additional char spacing - if ($charSpacing != 0) { - $w += $charSpacing * $space_scale * count($unicode); - } - - } else { - // If CPDF is in Unicode mode but the current font does not support Unicode we need to convert the character set to Windows-1252 - if ($this->isUnicode) { - $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8'); - } - - $len = mb_strlen($text, 'Windows-1252'); - - for ($i = 0; $i < $len; $i++) { - $c = $text[$i]; - $char = isset($ord_cache[$c]) ? $ord_cache[$c] : ($ord_cache[$c] = ord($c)); - - // check if we have to replace character - if (isset($current_font['differences'][$char])) { - $char = $current_font['differences'][$char]; - } - - if (isset($current_font['C'][$char])) { - $char_width = $current_font['C'][$char]; - - // add the character width - $w += $char_width; - - // add additional padding for space - if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') { // Space - $w += $wordSpacing * $space_scale; - } - } - } - - // add additional char spacing - if ($charSpacing != 0) { - $w += $charSpacing * $space_scale * $len; - } - } - - $this->currentTextState = $store_currentTextState; - $this->setCurrentFont(); - - return $w * $size / 1000; - } - - /** - * this will be called at a new page to return the state to what it was on the - * end of the previous page, before the stack was closed down - * This is to get around not being able to have open 'q' across pages - * - * @param int $pageEnd - */ - function saveState($pageEnd = 0) - { - if ($pageEnd) { - // this will be called at a new page to return the state to what it was on the - // end of the previous page, before the stack was closed down - // This is to get around not being able to have open 'q' across pages - $opt = $this->stateStack[$pageEnd]; - // ok to use this as stack starts numbering at 1 - $this->setColor($opt['col'], true); - $this->setStrokeColor($opt['str'], true); - $this->addContent("\n" . $opt['lin']); - // $this->currentLineStyle = $opt['lin']; - } else { - $this->nStateStack++; - $this->stateStack[$this->nStateStack] = [ - 'col' => $this->currentColor, - 'str' => $this->currentStrokeColor, - 'lin' => $this->currentLineStyle - ]; - } - - $this->save(); - } - - /** - * restore a previously saved state - * - * @param int $pageEnd - */ - function restoreState($pageEnd = 0) - { - if (!$pageEnd) { - $n = $this->nStateStack; - $this->currentColor = $this->stateStack[$n]['col']; - $this->currentStrokeColor = $this->stateStack[$n]['str']; - $this->addContent("\n" . $this->stateStack[$n]['lin']); - $this->currentLineStyle = $this->stateStack[$n]['lin']; - $this->stateStack[$n] = null; - unset($this->stateStack[$n]); - $this->nStateStack--; - } - - $this->restore(); - } - - /** - * make a loose object, the output will go into this object, until it is closed, then will revert to - * the current one. - * this object will not appear until it is included within a page. - * the function will return the object number - * - * @return int - */ - function openObject() - { - $this->nStack++; - $this->stack[$this->nStack] = ['c' => $this->currentContents, 'p' => $this->currentPage]; - // add a new object of the content type, to hold the data flow - $this->numObj++; - $this->o_contents($this->numObj, 'new'); - $this->currentContents = $this->numObj; - $this->looseObjects[$this->numObj] = 1; - - return $this->numObj; - } - - /** - * open an existing object for editing - * - * @param $id - */ - function reopenObject($id) - { - $this->nStack++; - $this->stack[$this->nStack] = ['c' => $this->currentContents, 'p' => $this->currentPage]; - $this->currentContents = $id; - - // also if this object is the primary contents for a page, then set the current page to its parent - if (isset($this->objects[$id]['onPage'])) { - $this->currentPage = $this->objects[$id]['onPage']; - } - } - - /** - * close an object - */ - function closeObject() - { - // close the object, as long as there was one open in the first place, which will be indicated by - // an objectId on the stack. - if ($this->nStack > 0) { - $this->currentContents = $this->stack[$this->nStack]['c']; - $this->currentPage = $this->stack[$this->nStack]['p']; - $this->nStack--; - // easier to probably not worry about removing the old entries, they will be overwritten - // if there are new ones. - } - } - - /** - * stop an object from appearing on pages from this point on - * - * @param $id - */ - function stopObject($id) - { - // if an object has been appearing on pages up to now, then stop it, this page will - // be the last one that could contain it. - if (isset($this->addLooseObjects[$id])) { - $this->addLooseObjects[$id] = ''; - } - } - - /** - * after an object has been created, it wil only show if it has been added, using this function. - * - * @param $id - * @param string $options - */ - function addObject($id, $options = 'add') - { - // add the specified object to the page - if (isset($this->looseObjects[$id]) && $this->currentContents != $id) { - // then it is a valid object, and it is not being added to itself - switch ($options) { - case 'all': - // then this object is to be added to this page (done in the next block) and - // all future new pages. - $this->addLooseObjects[$id] = 'all'; - - case 'add': - if (isset($this->objects[$this->currentContents]['onPage'])) { - // then the destination contents is the primary for the page - // (though this object is actually added to that page) - $this->o_page($this->objects[$this->currentContents]['onPage'], 'content', $id); - } - break; - - case 'even': - $this->addLooseObjects[$id] = 'even'; - $pageObjectId = $this->objects[$this->currentContents]['onPage']; - if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 0) { - $this->addObject($id); - // hacky huh :) - } - break; - - case 'odd': - $this->addLooseObjects[$id] = 'odd'; - $pageObjectId = $this->objects[$this->currentContents]['onPage']; - if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 1) { - $this->addObject($id); - // hacky huh :) - } - break; - - case 'next': - $this->addLooseObjects[$id] = 'all'; - break; - - case 'nexteven': - $this->addLooseObjects[$id] = 'even'; - break; - - case 'nextodd': - $this->addLooseObjects[$id] = 'odd'; - break; - } - } - } - - /** - * return a storable representation of a specific object - * - * @param $id - * @return string|null - */ - function serializeObject($id) - { - if (array_key_exists($id, $this->objects)) { - return serialize($this->objects[$id]); - } - - return null; - } - - /** - * restore an object from its stored representation. Returns its new object id. - * - * @param $obj - * @return int - */ - function restoreSerializedObject($obj) - { - $obj_id = $this->openObject(); - $this->objects[$obj_id] = unserialize($obj); - $this->closeObject(); - - return $obj_id; - } - - /** - * Embeds a file inside the PDF - * - * @param string $filepath path to the file to store inside the PDF - * @param string $embeddedFilename the filename displayed in the list of embedded files - * @param string $description a description in the list of embedded files - */ - public function addEmbeddedFile(string $filepath, string $embeddedFilename, string $description): void - { - $this->numObj++; - $this->o_embedded_file_dictionary( - $this->numObj, - 'new', - [ - 'filepath' => $filepath, - 'filename' => $embeddedFilename, - 'description' => $description - ] - ); - } - - /** - * Add content to the documents info object - * - * @param string|array $label - * @param string $value - */ - public function addInfo($label, string $value = ""): void - { - // this will only work if the label is one of the valid ones. - // modify this so that arrays can be passed as well. - // if $label is an array then assume that it is key => value pairs - // else assume that they are both scalar, anything else will probably error - if (is_array($label)) { - foreach ($label as $l => $v) { - $this->o_info($this->infoObject, $l, (string) $v); - } - } else { - $this->o_info($this->infoObject, $label, $value); - } - } - - /** - * set the viewer preferences of the document, it is up to the browser to obey these. - * - * @param $label - * @param int $value - */ - function setPreferences($label, $value = 0) - { - // this will only work if the label is one of the valid ones. - if (is_array($label)) { - foreach ($label as $l => $v) { - $this->o_catalog($this->catalogId, 'viewerPreferences', [$l => $v]); - } - } else { - $this->o_catalog($this->catalogId, 'viewerPreferences', [$label => $value]); - } - } - - /** - * extract an integer from a position in a byte stream - * - * @param $data - * @param $pos - * @param $num - * @return int - */ - private function getBytes(&$data, $pos, $num) - { - // return the integer represented by $num bytes from $pos within $data - $ret = 0; - for ($i = 0; $i < $num; $i++) { - $ret *= 256; - $ret += ord($data[$pos + $i]); - } - - return $ret; - } - - /** - * Check if image already added to pdf image directory. - * If yes, need not to create again (pass empty data) - * - * @param string $imgname - * @return bool - */ - function image_iscached($imgname) - { - return isset($this->imagelist[$imgname]); - } - - /** - * add a PNG image into the document, from a GD object - * this should work with remote files - * - * @param \GdImage|resource $img A GD resource - * @param string $file The PNG file - * @param float $x X position - * @param float $y Y position - * @param float $w Width - * @param float $h Height - * @param bool $is_mask true if the image is a mask - * @param bool $mask true if the image is masked - * @throws Exception - */ - function addImagePng(&$img, $file, $x, $y, $w = 0.0, $h = 0.0, $is_mask = false, $mask = null) - { - if (!function_exists("imagepng")) { - throw new \Exception("The PHP GD extension is required, but is not installed."); - } - - //if already cached, need not to read again - if (isset($this->imagelist[$file])) { - $data = null; - } else { - // Example for transparency handling on new image. Retain for current image - // $tIndex = imagecolortransparent($img); - // if ($tIndex > 0) { - // $tColor = imagecolorsforindex($img, $tIndex); - // $new_tIndex = imagecolorallocate($new_img, $tColor['red'], $tColor['green'], $tColor['blue']); - // imagefill($new_img, 0, 0, $new_tIndex); - // imagecolortransparent($new_img, $new_tIndex); - // } - // blending mode (literal/blending) on drawing into current image. not relevant when not saved or not drawn - //imagealphablending($img, true); - - //default, but explicitely set to ensure pdf compatibility - imagesavealpha($img, false/*!$is_mask && !$mask*/); - - $error = 0; - //DEBUG_IMG_TEMP - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addImagePng ' . $file . ']'; - } - - ob_start(); - @imagepng($img); - $data = ob_get_clean(); - - if ($data == '') { - $error = 1; - $errormsg = 'trouble writing file from GD'; - //DEBUG_IMG_TEMP - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print 'trouble writing file from GD'; - } - } - - if ($error) { - $this->addMessage('PNG error - (' . $file . ') ' . $errormsg); - - return; - } - } //End isset($this->imagelist[$file]) (png Duplicate removal) - - $this->addPngFromBuf($data, $file, $x, $y, $w, $h, $is_mask, $mask); - } - - /** - * @param $file - * @param $x - * @param $y - * @param $w - * @param $h - * @param $byte - */ - protected function addImagePngAlpha($file, $x, $y, $w, $h, $byte) - { - // generate images - $img = @imagecreatefrompng($file); - - if ($img === false) { - return; - } - - // FIXME The pixel transformation doesn't work well with 8bit PNGs - $eight_bit = ($byte & 4) !== 4; - - $wpx = imagesx($img); - $hpx = imagesy($img); - - imagesavealpha($img, false); - - // create temp alpha file - $tempfile_alpha = @tempnam($this->tmp, "cpdf_img_"); - @unlink($tempfile_alpha); - $tempfile_alpha = "$tempfile_alpha.png"; - - // create temp plain file - $tempfile_plain = @tempnam($this->tmp, "cpdf_img_"); - @unlink($tempfile_plain); - $tempfile_plain = "$tempfile_plain.png"; - - $imgalpha = imagecreate($wpx, $hpx); - imagesavealpha($imgalpha, false); - - // generate gray scale palette (0 -> 255) - for ($c = 0; $c < 256; ++$c) { - imagecolorallocate($imgalpha, $c, $c, $c); - } - - // Use PECL gmagick + Graphics Magic to process transparent PNG images - if (extension_loaded("gmagick")) { - $gmagick = new \Gmagick($file); - $gmagick->setimageformat('png'); - - // Get opacity channel (negative of alpha channel) - $alpha_channel_neg = clone $gmagick; - $alpha_channel_neg->separateimagechannel(\Gmagick::CHANNEL_OPACITY); - - // Negate opacity channel - $alpha_channel = new \Gmagick(); - $alpha_channel->newimage($wpx, $hpx, "#FFFFFF", "png"); - $alpha_channel->compositeimage($alpha_channel_neg, \Gmagick::COMPOSITE_DIFFERENCE, 0, 0); - $alpha_channel->separateimagechannel(\Gmagick::CHANNEL_RED); - $alpha_channel->writeimage($tempfile_alpha); - - // Cast to 8bit+palette - $imgalpha_ = @imagecreatefrompng($tempfile_alpha); - imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx); - imagedestroy($imgalpha_); - imagepng($imgalpha, $tempfile_alpha); - - // Make opaque image - $color_channels = new \Gmagick(); - $color_channels->newimage($wpx, $hpx, "#FFFFFF", "png"); - $color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYRED, 0, 0); - $color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYGREEN, 0, 0); - $color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYBLUE, 0, 0); - $color_channels->writeimage($tempfile_plain); - - $imgplain = @imagecreatefrompng($tempfile_plain); - } - // Use PECL imagick + ImageMagic to process transparent PNG images - elseif (extension_loaded("imagick")) { - // Native cloning was added to pecl-imagick in svn commit 263814 - // the first version containing it was 3.0.1RC1 - static $imagickClonable = null; - if ($imagickClonable === null) { - $imagickClonable = true; - if (defined('Imagick::IMAGICK_EXTVER')) { - $imagickVersion = \Imagick::IMAGICK_EXTVER; - } else { - $imagickVersion = '0'; - } - if (version_compare($imagickVersion, '0.0.1', '>=')) { - $imagickClonable = version_compare($imagickVersion, '3.0.1rc1', '>='); - } - } - - $imagick = new \Imagick($file); - $imagick->setFormat('png'); - - // Get opacity channel (negative of alpha channel) - if ($imagick->getImageAlphaChannel()) { - $alpha_channel = $imagickClonable ? clone $imagick : $imagick->clone(); - $alpha_channel->separateImageChannel(\Imagick::CHANNEL_ALPHA); - // Since ImageMagick7 negate invert transparency as default - if (\Imagick::getVersion()['versionNumber'] < 1800) { - $alpha_channel->negateImage(true); - } - $alpha_channel->writeImage($tempfile_alpha); - - // Cast to 8bit+palette - $imgalpha_ = @imagecreatefrompng($tempfile_alpha); - imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx); - imagedestroy($imgalpha_); - imagepng($imgalpha, $tempfile_alpha); - } else { - $tempfile_alpha = null; - } - - // Make opaque image - $color_channels = new \Imagick(); - $color_channels->newImage($wpx, $hpx, "#FFFFFF", "png"); - $color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYRED, 0, 0); - $color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYGREEN, 0, 0); - $color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYBLUE, 0, 0); - $color_channels->writeImage($tempfile_plain); - - $imgplain = @imagecreatefrompng($tempfile_plain); - } else { - // allocated colors cache - $allocated_colors = []; - - // extract alpha channel - for ($xpx = 0; $xpx < $wpx; ++$xpx) { - for ($ypx = 0; $ypx < $hpx; ++$ypx) { - $color = imagecolorat($img, $xpx, $ypx); - $col = imagecolorsforindex($img, $color); - $alpha = $col['alpha']; - - if ($eight_bit) { - // with gamma correction - $gammacorr = 2.2; - $pixel = round(pow((((127 - $alpha) * 255 / 127) / 255), $gammacorr) * 255); - } else { - // without gamma correction - $pixel = (127 - $alpha) * 2; - - $key = $col['red'] . $col['green'] . $col['blue']; - - if (!isset($allocated_colors[$key])) { - $pixel_img = imagecolorallocate($img, $col['red'], $col['green'], $col['blue']); - $allocated_colors[$key] = $pixel_img; - } else { - $pixel_img = $allocated_colors[$key]; - } - - imagesetpixel($img, $xpx, $ypx, $pixel_img); - } - - imagesetpixel($imgalpha, $xpx, $ypx, $pixel); - } - } - - // extract image without alpha channel - $imgplain = imagecreatetruecolor($wpx, $hpx); - imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx); - imagedestroy($img); - - imagepng($imgalpha, $tempfile_alpha); - imagepng($imgplain, $tempfile_plain); - } - - $this->imageAlphaList[$file] = [$tempfile_alpha, $tempfile_plain]; - - // embed mask image - if ($tempfile_alpha) { - $this->addImagePng($imgalpha, $tempfile_alpha, $x, $y, $w, $h, true); - imagedestroy($imgalpha); - $this->imageCache[] = $tempfile_alpha; - } - - // embed image, masked with previously embedded mask - $this->addImagePng($imgplain, $tempfile_plain, $x, $y, $w, $h, false, ($tempfile_alpha !== null)); - imagedestroy($imgplain); - $this->imageCache[] = $tempfile_plain; - } - - /** - * add a PNG image into the document, from a file - * this should work with remote files - * - * @param $file - * @param $x - * @param $y - * @param int $w - * @param int $h - * @throws Exception - */ - function addPngFromFile($file, $x, $y, $w = 0, $h = 0) - { - if (!function_exists("imagecreatefrompng")) { - throw new \Exception("The PHP GD extension is required, but is not installed."); - } - - if (isset($this->imageAlphaList[$file])) { - [$alphaFile, $plainFile] = $this->imageAlphaList[$file]; - - if ($alphaFile) { - $img = null; - $this->addImagePng($img, $alphaFile, $x, $y, $w, $h, true); - } - - $img = null; - $this->addImagePng($img, $plainFile, $x, $y, $w, $h, false, ($plainFile !== null)); - return; - } - - //if already cached, need not to read again - if (isset($this->imagelist[$file])) { - $img = null; - } else { - $info = file_get_contents($file, false, null, 24, 5); - $meta = unpack("CbitDepth/CcolorType/CcompressionMethod/CfilterMethod/CinterlaceMethod", $info); - $bit_depth = $meta["bitDepth"]; - $color_type = $meta["colorType"]; - - // http://www.w3.org/TR/PNG/#11IHDR - // 3 => indexed - // 4 => greyscale with alpha - // 6 => fullcolor with alpha - $is_alpha = in_array($color_type, [4, 6]) || ($color_type == 3 && $bit_depth != 4); - - if ($is_alpha) { // exclude grayscale alpha - $this->addImagePngAlpha($file, $x, $y, $w, $h, $color_type); - return; - } - - //png files typically contain an alpha channel. - //pdf file format or class.pdf does not support alpha blending. - //on alpha blended images, more transparent areas have a color near black. - //This appears in the result on not storing the alpha channel. - //Correct would be the box background image or its parent when transparent. - //But this would make the image dependent on the background. - //Therefore create an image with white background and copy in - //A more natural background than black is white. - //Therefore create an empty image with white background and merge the - //image in with alpha blending. - $imgtmp = @imagecreatefrompng($file); - if (!$imgtmp) { - return; - } - $sx = imagesx($imgtmp); - $sy = imagesy($imgtmp); - $img = imagecreatetruecolor($sx, $sy); - imagealphablending($img, true); - - // @todo is it still needed ?? - $ti = imagecolortransparent($imgtmp); - if ($ti >= 0) { - $tc = imagecolorsforindex($imgtmp, $ti); - $ti = imagecolorallocate($img, $tc['red'], $tc['green'], $tc['blue']); - imagefill($img, 0, 0, $ti); - imagecolortransparent($img, $ti); - } else { - imagefill($img, 1, 1, imagecolorallocate($img, 255, 255, 255)); - } - - imagecopy($img, $imgtmp, 0, 0, 0, 0, $sx, $sy); - imagedestroy($imgtmp); - } - $this->addImagePng($img, $file, $x, $y, $w, $h); - - if ($img) { - imagedestroy($img); - } - } - - /** - * add a PNG image into the document, from a memory buffer of the file - * - * @param $data - * @param $file - * @param $x - * @param $y - * @param float $w - * @param float $h - * @param bool $is_mask - * @param null $mask - */ - function addPngFromBuf(&$data, $file, $x, $y, $w = 0.0, $h = 0.0, $is_mask = false, $mask = null) - { - if (isset($this->imagelist[$file])) { - $data = null; - $info['width'] = $this->imagelist[$file]['w']; - $info['height'] = $this->imagelist[$file]['h']; - $label = $this->imagelist[$file]['label']; - } else { - if ($data == null) { - $this->addMessage('addPngFromBuf error - data not present!'); - - return; - } - - $error = 0; - - if (!$error) { - $header = chr(137) . chr(80) . chr(78) . chr(71) . chr(13) . chr(10) . chr(26) . chr(10); - - if (mb_substr($data, 0, 8, '8bit') != $header) { - $error = 1; - - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile this file does not have a valid header ' . $file . ']'; - } - - $errormsg = 'this file does not have a valid header'; - } - } - - if (!$error) { - // set pointer - $p = 8; - $len = mb_strlen($data, '8bit'); - - // cycle through the file, identifying chunks - $haveHeader = 0; - $info = []; - $idata = ''; - $pdata = ''; - - while ($p < $len) { - $chunkLen = $this->getBytes($data, $p, 4); - $chunkType = mb_substr($data, $p + 4, 4, '8bit'); - - switch ($chunkType) { - case 'IHDR': - // this is where all the file information comes from - $info['width'] = $this->getBytes($data, $p + 8, 4); - $info['height'] = $this->getBytes($data, $p + 12, 4); - $info['bitDepth'] = ord($data[$p + 16]); - $info['colorType'] = ord($data[$p + 17]); - $info['compressionMethod'] = ord($data[$p + 18]); - $info['filterMethod'] = ord($data[$p + 19]); - $info['interlaceMethod'] = ord($data[$p + 20]); - - //print_r($info); - $haveHeader = 1; - if ($info['compressionMethod'] != 0) { - $error = 1; - - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile unsupported compression method ' . $file . ']'; - } - - $errormsg = 'unsupported compression method'; - } - - if ($info['filterMethod'] != 0) { - $error = 1; - - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile unsupported filter method ' . $file . ']'; - } - - $errormsg = 'unsupported filter method'; - } - break; - - case 'PLTE': - $pdata .= mb_substr($data, $p + 8, $chunkLen, '8bit'); - break; - - case 'IDAT': - $idata .= mb_substr($data, $p + 8, $chunkLen, '8bit'); - break; - - case 'tRNS': - //this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk - //print "tRNS found, color type = ".$info['colorType']."\n"; - $transparency = []; - - switch ($info['colorType']) { - // indexed color, rbg - case 3: - /* corresponding to entries in the plte chunk - Alpha for palette index 0: 1 byte - Alpha for palette index 1: 1 byte - ...etc... - */ - // there will be one entry for each palette entry. up until the last non-opaque entry. - // set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent) - $transparency['type'] = 'indexed'; - $trans = 0; - - for ($i = $chunkLen; $i >= 0; $i--) { - if (ord($data[$p + 8 + $i]) == 0) { - $trans = $i; - } - } - - $transparency['data'] = $trans; - break; - - // grayscale - case 0: - /* corresponding to entries in the plte chunk - Gray: 2 bytes, range 0 .. (2^bitdepth)-1 - */ - // $transparency['grayscale'] = $this->PRVT_getBytes($data,$p+8,2); // g = grayscale - $transparency['type'] = 'indexed'; - $transparency['data'] = ord($data[$p + 8 + 1]); - break; - - // truecolor - case 2: - /* corresponding to entries in the plte chunk - Red: 2 bytes, range 0 .. (2^bitdepth)-1 - Green: 2 bytes, range 0 .. (2^bitdepth)-1 - Blue: 2 bytes, range 0 .. (2^bitdepth)-1 - */ - $transparency['r'] = $this->getBytes($data, $p + 8, 2); - // r from truecolor - $transparency['g'] = $this->getBytes($data, $p + 10, 2); - // g from truecolor - $transparency['b'] = $this->getBytes($data, $p + 12, 2); - // b from truecolor - - $transparency['type'] = 'color-key'; - break; - - //unsupported transparency type - default: - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile unsupported transparency type ' . $file . ']'; - } - break; - } - - // KS End new code - break; - - default: - break; - } - - $p += $chunkLen + 12; - } - - if (!$haveHeader) { - $error = 1; - - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile information header is missing ' . $file . ']'; - } - - $errormsg = 'information header is missing'; - } - - if (isset($info['interlaceMethod']) && $info['interlaceMethod']) { - $error = 1; - - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile no support for interlaced images in pdf ' . $file . ']'; - } - - $errormsg = 'There appears to be no support for interlaced images in pdf.'; - } - } - - if (!$error && $info['bitDepth'] > 8) { - $error = 1; - - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile bit depth of 8 or less is supported ' . $file . ']'; - } - - $errormsg = 'only bit depth of 8 or less is supported'; - } - - if (!$error) { - switch ($info['colorType']) { - case 3: - $color = 'DeviceRGB'; - $ncolor = 1; - break; - - case 2: - $color = 'DeviceRGB'; - $ncolor = 3; - break; - - case 0: - $color = 'DeviceGray'; - $ncolor = 1; - break; - - default: - $error = 1; - - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile alpha channel not supported: ' . $info['colorType'] . ' ' . $file . ']'; - } - - $errormsg = 'transparency alpha channel not supported, transparency only supported for palette images.'; - } - } - - if ($error) { - $this->addMessage('PNG error - (' . $file . ') ' . $errormsg); - - return; - } - - //print_r($info); - // so this image is ok... add it in. - $this->numImages++; - $im = $this->numImages; - $label = "I$im"; - $this->numObj++; - - // $this->o_image($this->numObj,'new',array('label' => $label,'data' => $idata,'iw' => $w,'ih' => $h,'type' => 'png','ic' => $info['width'])); - $options = [ - 'label' => $label, - 'data' => $idata, - 'bitsPerComponent' => $info['bitDepth'], - 'pdata' => $pdata, - 'iw' => $info['width'], - 'ih' => $info['height'], - 'type' => 'png', - 'color' => $color, - 'ncolor' => $ncolor, - 'masked' => $mask, - 'isMask' => $is_mask - ]; - - if (isset($transparency)) { - $options['transparency'] = $transparency; - } - - $this->o_image($this->numObj, 'new', $options); - $this->imagelist[$file] = ['label' => $label, 'w' => $info['width'], 'h' => $info['height']]; - } - - if ($is_mask) { - return; - } - - if ($w <= 0 && $h <= 0) { - $w = $info['width']; - $h = $info['height']; - } - - if ($w <= 0) { - $w = $h / $info['height'] * $info['width']; - } - - if ($h <= 0) { - $h = $w * $info['height'] / $info['width']; - } - - $this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ", $w, $h, $x, $y, $label)); - } - - /** - * add a JPEG image into the document, from a file - * - * @param $img - * @param $x - * @param $y - * @param int $w - * @param int $h - */ - function addJpegFromFile($img, $x, $y, $w = 0, $h = 0) - { - // attempt to add a jpeg image straight from a file, using no GD commands - // note that this function is unable to operate on a remote file. - - if (!file_exists($img)) { - return; - } - - if ($this->image_iscached($img)) { - $data = null; - $imageWidth = $this->imagelist[$img]['w']; - $imageHeight = $this->imagelist[$img]['h']; - $channels = $this->imagelist[$img]['c']; - } else { - $tmp = getimagesize($img); - $imageWidth = $tmp[0]; - $imageHeight = $tmp[1]; - - if (isset($tmp['channels'])) { - $channels = $tmp['channels']; - } else { - $channels = 3; - } - - $data = file_get_contents($img); - } - - if ($w <= 0 && $h <= 0) { - $w = $imageWidth; - } - - if ($w == 0) { - $w = $h / $imageHeight * $imageWidth; - } - - if ($h == 0) { - $h = $w * $imageHeight / $imageWidth; - } - - $this->addJpegImage_common($data, $img, $imageWidth, $imageHeight, $x, $y, $w, $h, $channels); - } - - /** - * common code used by the two JPEG adding functions - * @param $data - * @param $imgname - * @param $imageWidth - * @param $imageHeight - * @param $x - * @param $y - * @param int $w - * @param int $h - * @param int $channels - */ - private function addJpegImage_common( - &$data, - $imgname, - $imageWidth, - $imageHeight, - $x, - $y, - $w = 0, - $h = 0, - $channels = 3 - ) { - if ($this->image_iscached($imgname)) { - $label = $this->imagelist[$imgname]['label']; - //debugpng - //if (DEBUGPNG) print '[addJpegImage_common Duplicate '.$imgname.']'; - - } else { - if ($data == null) { - $this->addMessage('addJpegImage_common error - (' . $imgname . ') data not present!'); - - return; - } - - // note that this function is not to be called externally - // it is just the common code between the GD and the file options - $this->numImages++; - $im = $this->numImages; - $label = "I$im"; - $this->numObj++; - - $this->o_image( - $this->numObj, - 'new', - [ - 'label' => $label, - 'data' => &$data, - 'iw' => $imageWidth, - 'ih' => $imageHeight, - 'channels' => $channels - ] - ); - - $this->imagelist[$imgname] = [ - 'label' => $label, - 'w' => $imageWidth, - 'h' => $imageHeight, - 'c' => $channels - ]; - } - - $this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ ", $w, $h, $x, $y, $label)); - } - - /** - * specify where the document should open when it first starts - * - * @param $style - * @param int $a - * @param int $b - * @param int $c - */ - function openHere($style, $a = 0, $b = 0, $c = 0) - { - // this function will open the document at a specified page, in a specified style - // the values for style, and the required parameters are: - // 'XYZ' left, top, zoom - // 'Fit' - // 'FitH' top - // 'FitV' left - // 'FitR' left,bottom,right - // 'FitB' - // 'FitBH' top - // 'FitBV' left - $this->numObj++; - $this->o_destination( - $this->numObj, - 'new', - ['page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c] - ); - $id = $this->catalogId; - $this->o_catalog($id, 'openHere', $this->numObj); - } - - /** - * Add JavaScript code to the PDF document - * - * @param string $code - */ - function addJavascript($code) - { - $this->javascript .= $code; - } - - /** - * create a labelled destination within the document - * - * @param $label - * @param $style - * @param int $a - * @param int $b - * @param int $c - */ - function addDestination($label, $style, $a = 0, $b = 0, $c = 0) - { - // associates the given label with the destination, it is done this way so that a destination can be specified after - // it has been linked to - // styles are the same as the 'openHere' function - $this->numObj++; - $this->o_destination( - $this->numObj, - 'new', - ['page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c] - ); - $id = $this->numObj; - - // store the label->idf relationship, note that this means that labels can be used only once - $this->destinations["$label"] = $id; - } - - /** - * define font families, this is used to initialize the font families for the default fonts - * and for the user to add new ones for their fonts. The default bahavious can be overridden should - * that be desired. - * - * @param $family - * @param string $options - */ - function setFontFamily($family, $options = '') - { - if (!is_array($options)) { - if ($family === 'init') { - // set the known family groups - // these font families will be used to enable bold and italic markers to be included - // within text streams. html forms will be used... - $this->fontFamilies['Helvetica.afm'] = - [ - 'b' => 'Helvetica-Bold.afm', - 'i' => 'Helvetica-Oblique.afm', - 'bi' => 'Helvetica-BoldOblique.afm', - 'ib' => 'Helvetica-BoldOblique.afm' - ]; - - $this->fontFamilies['Courier.afm'] = - [ - 'b' => 'Courier-Bold.afm', - 'i' => 'Courier-Oblique.afm', - 'bi' => 'Courier-BoldOblique.afm', - 'ib' => 'Courier-BoldOblique.afm' - ]; - - $this->fontFamilies['Times-Roman.afm'] = - [ - 'b' => 'Times-Bold.afm', - 'i' => 'Times-Italic.afm', - 'bi' => 'Times-BoldItalic.afm', - 'ib' => 'Times-BoldItalic.afm' - ]; - } - } else { - - // the user is trying to set a font family - // note that this can also be used to set the base ones to something else - if (mb_strlen($family)) { - $this->fontFamilies[$family] = $options; - } - } - } - - /** - * used to add messages for use in debugging - * - * @param $message - */ - function addMessage($message) - { - $this->messages .= $message . "\n"; - } - - /** - * a few functions which should allow the document to be treated transactionally. - * - * @param $action - */ - function transaction($action) - { - switch ($action) { - case 'start': - // store all the data away into the checkpoint variable - $data = get_object_vars($this); - $this->checkpoint = $data; - unset($data); - break; - - case 'commit': - if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])) { - $tmp = $this->checkpoint['checkpoint']; - $this->checkpoint = $tmp; - unset($tmp); - } else { - $this->checkpoint = ''; - } - break; - - case 'rewind': - // do not destroy the current checkpoint, but move us back to the state then, so that we can try again - if (is_array($this->checkpoint)) { - // can only abort if were inside a checkpoint - $tmp = $this->checkpoint; - - foreach ($tmp as $k => $v) { - if ($k !== 'checkpoint') { - $this->$k = $v; - } - } - unset($tmp); - } - break; - - case 'abort': - if (is_array($this->checkpoint)) { - // can only abort if were inside a checkpoint - $tmp = $this->checkpoint; - foreach ($tmp as $k => $v) { - $this->$k = $v; - } - unset($tmp); - } - break; - } - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/SurfaceCpdf.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/SurfaceCpdf.php deleted file mode 100644 index 7169e0e..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/SurfaceCpdf.php +++ /dev/null @@ -1,494 +0,0 @@ -getDimensions(); - $w = $dimensions["width"]; - $h = $dimensions["height"]; - - if (!$canvas) { - $canvas = new \Svg\Surface\CPdf(array(0, 0, $w, $h)); - $refl = new \ReflectionClass($canvas); - $canvas->fontcache = realpath(dirname($refl->getFileName()) . "/../../fonts/")."/"; - } - - // Flip PDF coordinate system so that the origin is in - // the top left rather than the bottom left - $canvas->transform(array( - 1, 0, - 0, -1, - 0, $h - )); - - $this->width = $w; - $this->height = $h; - - $this->canvas = $canvas; - } - - function out() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - return $this->canvas->output(); - } - - public function save() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->save(); - } - - public function restore() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->restore(); - } - - public function scale($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->transform($x, 0, 0, $y, 0, 0); - } - - public function rotate($angle) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $a = deg2rad($angle); - $cos_a = cos($a); - $sin_a = sin($a); - - $this->transform( - $cos_a, $sin_a, - -$sin_a, $cos_a, - 0, 0 - ); - } - - public function translate($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->transform( - 1, 0, - 0, 1, - $x, $y - ); - } - - public function transform($a, $b, $c, $d, $e, $f) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->canvas->transform(array($a, $b, $c, $d, $e, $f)); - } - - public function beginPath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - // TODO: Implement beginPath() method. - } - - public function closePath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->closePath(); - } - - public function fillStroke(bool $close = false) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->fillStroke($close); - } - - public function clip() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->clip(); - } - - public function fillText($text, $x, $y, $maxWidth = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->addText($x, $y, $this->style->fontSize, $text); - } - - public function strokeText($text, $x, $y, $maxWidth = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->addText($x, $y, $this->style->fontSize, $text); - } - - public function drawImage($image, $sx, $sy, $sw = null, $sh = null, $dx = null, $dy = null, $dw = null, $dh = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - if (strpos($image, "data:") === 0) { - $parts = explode(',', $image, 2); - - $data = $parts[1]; - $base64 = false; - - $token = strtok($parts[0], ';'); - while ($token !== false) { - if ($token == 'base64') { - $base64 = true; - } - - $token = strtok(';'); - } - - if ($base64) { - $data = base64_decode($data); - } - } - else { - $data = file_get_contents($image); - } - - $image = tempnam(sys_get_temp_dir(), "svg"); - file_put_contents($image, $data); - - $img = $this->image($image, $sx, $sy, $sw, $sh, "normal"); - - - unlink($image); - } - - public static function getimagesize($filename) - { - static $cache = array(); - - if (isset($cache[$filename])) { - return $cache[$filename]; - } - - list($width, $height, $type) = getimagesize($filename); - - if ($width == null || $height == null) { - $data = file_get_contents($filename, null, null, 0, 26); - - if (substr($data, 0, 2) === "BM") { - $meta = unpack('vtype/Vfilesize/Vreserved/Voffset/Vheadersize/Vwidth/Vheight', $data); - $width = (int)$meta['width']; - $height = (int)$meta['height']; - $type = IMAGETYPE_BMP; - } - } - - return $cache[$filename] = array($width, $height, $type); - } - - function image($img, $x, $y, $w, $h, $resolution = "normal") - { - list($width, $height, $type) = $this->getimagesize($img); - - switch ($type) { - case IMAGETYPE_JPEG: - $this->canvas->addJpegFromFile($img, $x, $y - $h, $w, $h); - break; - - case IMAGETYPE_GIF: - case IMAGETYPE_BMP: - // @todo use cache for BMP and GIF - $img = $this->_convert_gif_bmp_to_png($img, $type); - - case IMAGETYPE_PNG: - $this->canvas->addPngFromFile($img, $x, $y - $h, $w, $h); - break; - - default: - } - } - - public function lineTo($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->lineTo($x, $y); - } - - public function moveTo($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->moveTo($x, $y); - } - - public function quadraticCurveTo($cpx, $cpy, $x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - // FIXME not accurate - $this->canvas->quadTo($cpx, $cpy, $x, $y); - } - - public function bezierCurveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->curveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y); - } - - public function arcTo($x1, $y1, $x2, $y2, $radius) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - } - - public function arc($x, $y, $radius, $startAngle, $endAngle, $anticlockwise = false) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->ellipse($x, $y, $radius, $radius, 0, 8, $startAngle, $endAngle, false, false, false, true); - } - - public function circle($x, $y, $radius) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->ellipse($x, $y, $radius, $radius, 0, 8, 0, 360, true, false, false, false); - } - - public function ellipse($x, $y, $radiusX, $radiusY, $rotation, $startAngle, $endAngle, $anticlockwise) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->ellipse($x, $y, $radiusX, $radiusY, 0, 8, 0, 360, false, false, false, false); - } - - public function fillRect($x, $y, $w, $h) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->rect($x, $y, $w, $h); - $this->fill(); - } - - public function rect($x, $y, $w, $h, $rx = 0, $ry = 0) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $canvas = $this->canvas; - - if ($rx <= 0.000001/* && $ry <= 0.000001*/) { - $canvas->rect($x, $y, $w, $h); - - return; - } - - $rx = min($rx, $w / 2); - $rx = min($rx, $h / 2); - - /* Define a path for a rectangle with corners rounded by a given radius. - * Start from the lower left corner and proceed counterclockwise. - */ - $this->moveTo($x + $rx, $y); - - /* Start of the arc segment in the lower right corner */ - $this->lineTo($x + $w - $rx, $y); - - /* Arc segment in the lower right corner */ - $this->arc($x + $w - $rx, $y + $rx, $rx, 270, 360); - - /* Start of the arc segment in the upper right corner */ - $this->lineTo($x + $w, $y + $h - $rx ); - - /* Arc segment in the upper right corner */ - $this->arc($x + $w - $rx, $y + $h - $rx, $rx, 0, 90); - - /* Start of the arc segment in the upper left corner */ - $this->lineTo($x + $rx, $y + $h); - - /* Arc segment in the upper left corner */ - $this->arc($x + $rx, $y + $h - $rx, $rx, 90, 180); - - /* Start of the arc segment in the lower left corner */ - $this->lineTo($x , $y + $rx); - - /* Arc segment in the lower left corner */ - $this->arc($x + $rx, $y + $rx, $rx, 180, 270); - } - - public function fill() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->fill(); - } - - public function strokeRect($x, $y, $w, $h) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->rect($x, $y, $w, $h); - $this->stroke(); - } - - public function stroke(bool $close = false) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->stroke($close); - } - - public function endPath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->endPath(); - } - - public function measureText($text) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $style = $this->getStyle(); - $this->setFont($style->fontFamily, $style->fontStyle, $style->fontWeight); - - return $this->canvas->getTextWidth($this->getStyle()->fontSize, $text); - } - - public function getStyle() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - return $this->style; - } - - public function setStyle(Style $style) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->style = $style; - $canvas = $this->canvas; - - if (is_array($style->stroke) && $stroke = $style->stroke) { - $canvas->setStrokeColor(array((float)$stroke[0]/255, (float)$stroke[1]/255, (float)$stroke[2]/255), true); - } - - if (is_array($style->fill) && $fill = $style->fill) { - $canvas->setColor(array((float)$fill[0]/255, (float)$fill[1]/255, (float)$fill[2]/255), true); - } - - if ($fillRule = strtolower($style->fillRule)) { - $canvas->setFillRule($fillRule); - } - - $opacity = $style->opacity; - if ($opacity !== null && $opacity < 1.0) { - $canvas->setLineTransparency("Normal", $opacity); - $canvas->currentLineTransparency = null; - - $canvas->setFillTransparency("Normal", $opacity); - $canvas->currentFillTransparency = null; - } - else { - $fillOpacity = $style->fillOpacity; - if ($fillOpacity !== null && $fillOpacity < 1.0) { - $canvas->setFillTransparency("Normal", $fillOpacity); - $canvas->currentFillTransparency = null; - } - - $strokeOpacity = $style->strokeOpacity; - if ($strokeOpacity !== null && $strokeOpacity < 1.0) { - $canvas->setLineTransparency("Normal", $strokeOpacity); - $canvas->currentLineTransparency = null; - } - } - - $dashArray = null; - if ($style->strokeDasharray) { - $dashArray = preg_split('/\s*,\s*/', $style->strokeDasharray); - } - - - $phase=0; - if ($style->strokeDashoffset) { - $phase = $style->strokeDashoffset; - } - - - $canvas->setLineStyle( - $style->strokeWidth, - $style->strokeLinecap, - $style->strokeLinejoin, - $dashArray, - $phase - ); - - $this->setFont($style->fontFamily, $style->fontStyle, $style->fontWeight); - } - - public function setFont($family, $style, $weight) - { - $map = [ - "serif" => "times", - "sans-serif" => "helvetica", - "fantasy" => "symbol", - "cursive" => "times", - "monospace" => "courier" - ]; - - $styleMap = [ - "courier" => [ - "" => "Courier", - "b" => "Courier-Bold", - "i" => "Courier-Oblique", - "bi" => "Courier-BoldOblique", - ], - "helvetica" => [ - "" => "Helvetica", - "b" => "Helvetica-Bold", - "i" => "Helvetica-Oblique", - "bi" => "Helvetica-BoldOblique", - ], - "symbol" => [ - "" => "Symbol" - ], - "times" => [ - "" => "Times-Roman", - "b" => "Times-Bold", - "i" => "Times-Italic", - "bi" => "Times-BoldItalic", - ], - ]; - - $family_lc = strtolower($family); - if (isset($map[$family_lc])) { - $family = $map[$family_lc]; - } - - if (isset($styleMap[$family])) { - $key = ""; - - $weight = strtolower($weight); - if ($weight === "bold" || $weight === "bolder" || (is_numeric($weight) && $weight >= 600)) { - $key .= "b"; - } - - $style = strtolower($style); - if ($style === "italic" || $style === "oblique") { - $key .= "i"; - } - - if (isset($styleMap[$family][$key])) { - $family = $styleMap[$family][$key]; - } - } - - $this->canvas->selectFont("$family.afm"); - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/SurfaceInterface.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/SurfaceInterface.php deleted file mode 100644 index ed2807e..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/SurfaceInterface.php +++ /dev/null @@ -1,89 +0,0 @@ -getDimensions(); - $w = $dimensions["width"]; - $h = $dimensions["height"]; - - if (!$canvas) { - $canvas = new \PDFlib(); - - /* all strings are expected as utf8 */ - $canvas->set_option("stringformat=utf8"); - $canvas->set_option("errorpolicy=return"); - - /* open new PDF file; insert a file name to create the PDF on disk */ - if ($canvas->begin_document("", "") == 0) { - die("Error: " . $canvas->get_errmsg()); - } - $canvas->set_info("Creator", "PDFlib starter sample"); - $canvas->set_info("Title", "starter_graphics"); - - $canvas->begin_page_ext($w, $h, ""); - } - - // Flip PDF coordinate system so that the origin is in - // the top left rather than the bottom left - $canvas->setmatrix( - 1, 0, - 0, -1, - 0, $h - ); - - $this->width = $w; - $this->height = $h; - - $this->canvas = $canvas; - } - - function out() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->canvas->end_page_ext(""); - $this->canvas->end_document(""); - - return $this->canvas->get_buffer(); - } - - public function save() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->save(); - } - - public function restore() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->restore(); - } - - public function scale($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->scale($x, $y); - } - - public function rotate($angle) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->rotate($angle); - } - - public function translate($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->translate($x, $y); - } - - public function transform($a, $b, $c, $d, $e, $f) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->concat($a, $b, $c, $d, $e, $f); - } - - public function beginPath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - // TODO: Implement beginPath() method. - } - - public function closePath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->closepath(); - } - - public function fillStroke(bool $close = false) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - if ($close) { - $this->canvas->closepath_fill_stroke(); - } else { - $this->canvas->fill_stroke(); - } - } - - public function clip() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->clip(); - } - - public function fillText($text, $x, $y, $maxWidth = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->set_text_pos($x, $y); - $this->canvas->show($text); - } - - public function strokeText($text, $x, $y, $maxWidth = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - // TODO: Implement drawImage() method. - } - - public function drawImage($image, $sx, $sy, $sw = null, $sh = null, $dx = null, $dy = null, $dw = null, $dh = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - if (strpos($image, "data:") === 0) { - $data = substr($image, strpos($image, ";") + 1); - if (strpos($data, "base64") === 0) { - $data = base64_decode(substr($data, 7)); - } - } - else { - $data = file_get_contents($image); - } - - $image = tempnam(sys_get_temp_dir(), "svg"); - file_put_contents($image, $data); - - $img = $this->canvas->load_image("auto", $image, ""); - - $sy = $sy - $sh; - $this->canvas->fit_image($img, $sx, $sy, 'boxsize={' . "$sw $sh" . '} fitmethod=entire'); - - unlink($image); - } - - public function lineTo($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->lineto($x, $y); - } - - public function moveTo($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->moveto($x, $y); - } - - public function quadraticCurveTo($cpx, $cpy, $x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - // FIXME not accurate - $this->canvas->curveTo($cpx, $cpy, $cpx, $cpy, $x, $y); - } - - public function bezierCurveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->curveto($cp1x, $cp1y, $cp2x, $cp2y, $x, $y); - } - - public function arcTo($x1, $y1, $x2, $y2, $radius) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - } - - public function arc($x, $y, $radius, $startAngle, $endAngle, $anticlockwise = false) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->arc($x, $y, $radius, $startAngle, $endAngle); - } - - public function circle($x, $y, $radius) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->circle($x, $y, $radius); - } - - public function ellipse($x, $y, $radiusX, $radiusY, $rotation, $startAngle, $endAngle, $anticlockwise) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->ellipse($x, $y, $radiusX, $radiusY); - } - - public function fillRect($x, $y, $w, $h) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->rect($x, $y, $w, $h); - $this->fill(); - } - - public function rect($x, $y, $w, $h, $rx = 0, $ry = 0) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $canvas = $this->canvas; - - if ($rx <= 0.000001/* && $ry <= 0.000001*/) { - $canvas->rect($x, $y, $w, $h); - - return; - } - - /* Define a path for a rectangle with corners rounded by a given radius. - * Start from the lower left corner and proceed counterclockwise. - */ - $canvas->moveto($x + $rx, $y); - - /* Start of the arc segment in the lower right corner */ - $canvas->lineto($x + $w - $rx, $y); - - /* Arc segment in the lower right corner */ - $canvas->arc($x + $w - $rx, $y + $rx, $rx, 270, 360); - - /* Start of the arc segment in the upper right corner */ - $canvas->lineto($x + $w, $y + $h - $rx ); - - /* Arc segment in the upper right corner */ - $canvas->arc($x + $w - $rx, $y + $h - $rx, $rx, 0, 90); - - /* Start of the arc segment in the upper left corner */ - $canvas->lineto($x + $rx, $y + $h); - - /* Arc segment in the upper left corner */ - $canvas->arc($x + $rx, $y + $h - $rx, $rx, 90, 180); - - /* Start of the arc segment in the lower left corner */ - $canvas->lineto($x , $y + $rx); - - /* Arc segment in the lower left corner */ - $canvas->arc($x + $rx, $y + $rx, $rx, 180, 270); - } - - public function fill() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->fill(); - } - - public function strokeRect($x, $y, $w, $h) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->rect($x, $y, $w, $h); - $this->stroke(); - } - - public function stroke(bool $close = false) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - if ($close) { - $this->canvas->closepath_stroke(); - } else { - $this->canvas->stroke(); - } - } - - public function endPath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->endPath(); - } - - public function measureText($text) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $style = $this->getStyle(); - $font = $this->getFont($style->fontFamily, $style->fontStyle); - - return $this->canvas->stringwidth($text, $font, $this->getStyle()->fontSize); - } - - public function getStyle() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - return $this->style; - } - - public function setStyle(Style $style) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->style = $style; - $canvas = $this->canvas; - - if (is_array($style->stroke) && $stroke = $style->stroke) { - $canvas->setcolor( - "stroke", - "rgb", - $stroke[0] / 255, - $stroke[1] / 255, - $stroke[2] / 255, - null - ); - } - - if (is_array($style->fill) && $fill = $style->fill) { - $canvas->setcolor( - "fill", - "rgb", - $fill[0] / 255, - $fill[1] / 255, - $fill[2] / 255, - null - ); - } - - if ($fillRule = strtolower($style->fillRule)) { - $map = array( - "nonzero" => "winding", - "evenodd" => "evenodd", - ); - - if (isset($map[$fillRule])) { - $fillRule = $map[$fillRule]; - - $canvas->set_parameter("fillrule", $fillRule); - } - } - - $opts = array(); - if ($style->strokeWidth > 0.000001) { - $opts[] = "linewidth=$style->strokeWidth"; - } - - if (in_array($style->strokeLinecap, array("butt", "round", "projecting"))) { - $opts[] = "linecap=$style->strokeLinecap"; - } - - if (in_array($style->strokeLinejoin, array("miter", "round", "bevel"))) { - $opts[] = "linejoin=$style->strokeLinejoin"; - } - - $canvas->set_graphics_option(implode(" ", $opts)); - - $opts = array(); - $opacity = $style->opacity; - if ($opacity !== null && $opacity < 1.0) { - $opts[] = "opacityfill=$opacity"; - $opts[] = "opacitystroke=$opacity"; - } - else { - $fillOpacity = $style->fillOpacity; - if ($fillOpacity !== null && $fillOpacity < 1.0) { - $opts[] = "opacityfill=$fillOpacity"; - } - - $strokeOpacity = $style->strokeOpacity; - if ($strokeOpacity !== null && $strokeOpacity < 1.0) { - $opts[] = "opacitystroke=$strokeOpacity"; - } - } - - if (count($opts)) { - $gs = $canvas->create_gstate(implode(" ", $opts)); - $canvas->set_gstate($gs); - } - - $font = $this->getFont($style->fontFamily, $style->fontStyle); - if ($font) { - $canvas->setfont($font, $style->fontSize); - } - } - - private function getFont($family, $style) - { - $map = array( - "serif" => "Times", - "sans-serif" => "Helvetica", - "fantasy" => "Symbol", - "cursive" => "Times", - "monospace" => "Courier", - - "arial" => "Helvetica", - "verdana" => "Helvetica", - ); - - $family = strtolower($family); - if (isset($map[$family])) { - $family = $map[$family]; - } - - return $this->canvas->load_font($family, "unicode", "fontstyle=$style"); - } - - public function setFont($family, $style, $weight) - { - // TODO: Implement setFont() method. - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/AbstractTag.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/AbstractTag.php deleted file mode 100644 index 872d971..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/AbstractTag.php +++ /dev/null @@ -1,326 +0,0 @@ -document = $document; - $this->tagName = $tagName; - } - - public function getDocument(){ - return $this->document; - } - - /** - * @return Group|null - */ - public function getParentGroup() { - $stack = $this->getDocument()->getStack(); - for ($i = count($stack)-2; $i >= 0; $i--) { - $tag = $stack[$i]; - - if ($tag instanceof Group || $tag instanceof Document) { - return $tag; - } - } - - return null; - } - - public function handle($attributes) - { - $this->attributes = $attributes; - - if (!$this->getDocument()->inDefs || $this instanceof StyleTag) { - $this->before($attributes); - $this->start($attributes); - } - } - - public function handleEnd() - { - if (!$this->getDocument()->inDefs || $this instanceof StyleTag) { - $this->end(); - $this->after(); - } - } - - protected function before($attributes) - { - } - - protected function start($attributes) - { - } - - protected function end() - { - } - - protected function after() - { - } - - public function getAttributes() - { - return $this->attributes; - } - - protected function setStyle(Style $style) - { - $this->style = $style; - - if ($style->display === "none") { - $this->hasShape = false; - } - } - - /** - * @return Style - */ - public function getStyle() - { - return $this->style; - } - - /** - * Make a style object from the tag and its attributes - * - * @param array $attributes - * - * @return Style - */ - protected function makeStyle($attributes) { - $style = new Style($this->document); - $style->inherit($this); - $style->fromStyleSheets($this, $attributes); - $style->fromAttributes($attributes); - - return $style; - } - - protected function applyTransform($attributes) - { - - if (isset($attributes["transform"])) { - $surface = $this->document->getSurface(); - - $transform = $attributes["transform"]; - - $matches = array(); - preg_match_all( - '/(matrix|translate|scale|rotate|skew|skewX|skewY)\((.*?)\)/is', - $transform, - $matches, - PREG_SET_ORDER - ); - - $transformations = array(); - foreach ($matches as $match) { - $arguments = preg_split('/[ ,]+/', $match[2]); - array_unshift($arguments, $match[1]); - $transformations[] = $arguments; - } - - foreach ($transformations as $t) { - switch ($t[0]) { - case "matrix": - $surface->transform($t[1], $t[2], $t[3], $t[4], $t[5], $t[6]); - break; - - case "translate": - $surface->translate($t[1], isset($t[2]) ? $t[2] : 0); - break; - - case "scale": - $surface->scale($t[1], isset($t[2]) ? $t[2] : $t[1]); - break; - - case "rotate": - if (isset($t[2])) { - $t[3] = isset($t[3]) ? $t[3] : 0; - $surface->translate($t[2], $t[3]); - $surface->rotate($t[1]); - $surface->translate(-$t[2], -$t[3]); - } else { - $surface->rotate($t[1]); - } - break; - - case "skewX": - $tan_x = tan(deg2rad($t[1])); - $surface->transform(1, 0, $tan_x, 1, 0, 0); - break; - - case "skewY": - $tan_y = tan(deg2rad($t[1])); - $surface->transform(1, $tan_y, 0, 1, 0, 0); - break; - } - } - } - } - - /** - * Apply a viewBox transform to the element - * - * @param array $attributes - */ - protected function applyViewbox($attributes) { - if (!isset($attributes["viewbox"])) { - return; - } - - $surface = $this->document->getSurface(); - $viewBox = preg_split('/[\s,]+/is', trim($attributes['viewbox'])); - if (count($viewBox) != 4) { - return; - } - - // Computing the equivalent transform of an SVG viewport - // https://svgwg.org/svg2-draft/coords.html#ComputingAViewportsTransform - - // 1. Let vb-x, vb-y, vb-width, vb-height be the min-x, min-y, width and height values of the viewBox attribute respectively. - [$vbX, $vbY, $vbWidth, $vbHeight] = $viewBox; - - if ($vbWidth < 0 || $vbHeight < 0) { - return; - } - - // correct solution is to not render, for now scaling to 0 below - //if ($vbWidth == 0 || $vbHeight == 0) { - //} - - // 2. Let e-x, e-y, e-width, e-height be the position and size of the element respectively. - $eX = $attributes["x"] ?? 0; - $eY = $attributes["y"] ?? 0; - $eWidth = $attributes["width"] ?? $this->document->getWidth(); - $eHeight = $attributes["height"] ?? $this->document->getHeight(); - - // 3. Let align be the align value of preserveAspectRatio, or 'xMidYMid' if preserveAspectRatio is not defined. - $preserveAspectRatio = explode(" ", $attributes["preserveAspectRatio"] ?? "xMidYMid meet"); - $align = $preserveAspectRatio[0]; - - // 4. Let meetOrSlice be the meetOrSlice value of preserveAspectRatio, or 'meet' if preserveAspectRatio is not defined or if meetOrSlice is missing from this value. - $meetOrSlice = $meetOrSlice ?? "meet"; - - // 5. Initialize scale-x to e-width/vb-width. - $scaleX = $vbWidth == 0 ? 0 : ($eWidth / $vbWidth); - - // 6. Initialize scale-y to e-height/vb-height. - $scaleY = $vbHeight == 0 ? 0 : ($eHeight / $vbHeight); - - // 7. If align is not 'none' and meetOrSlice is 'meet', set the larger of scale-x and scale-y to the smaller. - if ($align !== "none" && $meetOrSlice === "meet") { - $scaleX = min($scaleX, $scaleY); - $scaleY = min($scaleX, $scaleY); - } - - // 8. Otherwise, if align is not 'none' and meetOrSlice is 'slice', set the smaller of scale-x and scale-y to the larger. - elseif ($align !== "none" && $meetOrSlice === "slice") { - $scaleX = max($scaleX, $scaleY); - $scaleY = max($scaleX, $scaleY); - } - - // 9. Initialize translate-x to e-x - (vb-x * scale-x). - $translateX = $eX - ($vbX * $scaleX); - - // 10. Initialize translate-y to e-y - (vb-y * scale-y) - $translateY = $eY - ($vbY * $scaleY); - - // 11. If align contains 'xMid', add (e-width - vb-width * scale-x) / 2 to translate-x. - if (strpos($align, "xMid") !== false) { - $translateX += ($eWidth - $vbWidth * $scaleX) / 2; - } - - // 12. If align contains 'xMax', add (e-width - vb-width * scale-x) to translate-x. - if (strpos($align, "xMax") !== false) { - $translateX += ($eWidth - $vbWidth * $scaleX); - } - - // 13. If align contains 'yMid', add (e-height - vb-height * scale-y) / 2 to translate-y. - if (strpos($align, "yMid") !== false) { - $translateX += ($eHeight - $vbHeight * $scaleY) / 2; - } - - // 14. If align contains 'yMax', add (e-height - vb-height * scale-y) to translate-y. - if (strpos($align, "yMid") !== false) { - $translateX += ($eHeight - $vbHeight * $scaleY); - } - - $surface->translate($translateX, $translateY); - $surface->scale($scaleX, $scaleY); - } - - /** - * Convert the given size for the context of this current tag. - * Takes a pixel-based reference, which is usually specific to the context of the size, - * but the actual reference size will be decided based upon the unit used. - * - * @param string $size - * @param float $pxReference - * - * @return float - */ - protected function convertSize(string $size, float $pxReference): float - { - $length = new CssLength($size); - $reference = $pxReference; - $defaultFontSize = 12; - - switch ($length->getUnit()) { - case "em": - $reference = $this->style->fontSize ?? $defaultFontSize; - break; - case "rem": - $reference = $this->document->style->fontSize ?? $defaultFontSize; - break; - case "ex": - case "ch": - $emRef = $this->style->fontSize ?? $defaultFontSize; - $reference = $emRef * 0.5; - break; - case "vw": - $reference = $this->getDocument()->getWidth(); - break; - case "vh": - $reference = $this->getDocument()->getHeight(); - break; - case "vmin": - $reference = min($this->getDocument()->getHeight(), $this->getDocument()->getWidth()); - break; - case "vmax": - $reference = max($this->getDocument()->getHeight(), $this->getDocument()->getWidth()); - break; - } - - return (new CssLength($size))->toPixels($reference); - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Anchor.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Anchor.php deleted file mode 100644 index 349bfa8..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Anchor.php +++ /dev/null @@ -1,13 +0,0 @@ -document->getWidth(); - $this->cx = $this->convertSize($attributes['cx'], $width); - } - if (isset($attributes['cy'])) { - $height = $this->document->getHeight(); - $this->cy = $this->convertSize($attributes['cy'], $height); - } - if (isset($attributes['r'])) { - $diagonal = $this->document->getDiagonal(); - $this->r = $this->convertSize($attributes['r'], $diagonal); - } - - $this->document->getSurface()->circle($this->cx, $this->cy, $this->r); - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/ClipPath.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/ClipPath.php deleted file mode 100644 index 991a4db..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/ClipPath.php +++ /dev/null @@ -1,32 +0,0 @@ -document->getSurface(); - - $surface->save(); - - $style = $this->makeStyle($attributes); - - $this->setStyle($style); - $surface->setStyle($style); - - $this->applyTransform($attributes); - } - - protected function after() - { - $this->document->getSurface()->restore(); - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Ellipse.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Ellipse.php deleted file mode 100644 index f61dfd2..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Ellipse.php +++ /dev/null @@ -1,41 +0,0 @@ -document->getWidth(); - $height = $this->document->getHeight(); - - if (isset($attributes['cx'])) { - $this->cx = $this->convertSize($attributes['cx'], $width); - } - if (isset($attributes['cy'])) { - $this->cy = $this->convertSize($attributes['cy'], $height); - } - if (isset($attributes['rx'])) { - $this->rx = $this->convertSize($attributes['rx'], $width); - } - if (isset($attributes['ry'])) { - $this->ry = $this->convertSize($attributes['ry'], $height); - } - - $this->document->getSurface()->ellipse($this->cx, $this->cy, $this->rx, $this->ry, 0, 0, 360, false); - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Group.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Group.php deleted file mode 100644 index 73d7a45..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Group.php +++ /dev/null @@ -1,32 +0,0 @@ -document->getSurface(); - - $surface->save(); - - $style = $this->makeStyle($attributes); - - $this->setStyle($style); - $surface->setStyle($style); - - $this->applyTransform($attributes); - } - - protected function after() - { - $this->document->getSurface()->restore(); - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Image.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Image.php deleted file mode 100644 index 45d51e5..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Image.php +++ /dev/null @@ -1,75 +0,0 @@ -document->getSurface(); - $surface->save(); - - $this->applyTransform($attributes); - } - - public function start($attributes) - { - $height = $this->document->getHeight(); - $width = $this->document->getWidth(); - $this->y = $height; - - if (isset($attributes['x'])) { - $this->x = $this->convertSize($attributes['x'], $width); - } - if (isset($attributes['y'])) { - $this->y = $height - $this->convertSize($attributes['y'], $height); - } - - if (isset($attributes['width'])) { - $this->width = $this->convertSize($attributes['width'], $width); - } - if (isset($attributes['height'])) { - $this->height = $this->convertSize($attributes['height'], $height); - } - - if (isset($attributes['xlink:href'])) { - $this->href = $attributes['xlink:href']; - } - - if (isset($attributes['href'])) { - $this->href = $attributes['href']; - } - - $this->document->getSurface()->transform(1, 0, 0, -1, 0, $height); - - $scheme = \strtolower(parse_url($this->href, PHP_URL_SCHEME) ?: ""); - if ( - $scheme === "phar" || \strtolower(\substr($this->href, 0, 7)) === "phar://" - || ($this->document->allowExternalReferences === false && $scheme !== "data") - ) { - return; - } - - $this->document->getSurface()->drawImage($this->href, $this->x, $this->y, $this->width, $this->height); - } - - protected function after() - { - $this->document->getSurface()->restore(); - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Line.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Line.php deleted file mode 100644 index 4f6a276..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Line.php +++ /dev/null @@ -1,42 +0,0 @@ -document->getHeight(); - $width = $this->document->getWidth(); - - if (isset($attributes['x1'])) { - $this->x1 = $this->convertSize($attributes['x1'], $width); - } - if (isset($attributes['y1'])) { - $this->y1 = $this->convertSize($attributes['y1'], $height); - } - if (isset($attributes['x2'])) { - $this->x2 = $this->convertSize($attributes['x2'], $width); - } - if (isset($attributes['y2'])) { - $this->y2 = $this->convertSize($attributes['y2'], $height); - } - - $surface = $this->document->getSurface(); - $surface->moveTo($this->x1, $this->y1); - $surface->lineTo($this->x2, $this->y2); - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/LinearGradient.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/LinearGradient.php deleted file mode 100644 index 2a42686..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/LinearGradient.php +++ /dev/null @@ -1,82 +0,0 @@ -x1 = $attributes['x1']; - } - if (isset($attributes['y1'])) { - $this->y1 = $attributes['y1']; - } - if (isset($attributes['x2'])) { - $this->x2 = $attributes['x2']; - } - if (isset($attributes['y2'])) { - $this->y2 = $attributes['y2']; - } - } - - public function getStops() { - if (empty($this->stops)) { - foreach ($this->children as $_child) { - if ($_child->tagName != "stop") { - continue; - } - - $_stop = new Gradient\Stop(); - $_attributes = $_child->attributes; - - // Style - if (isset($_attributes["style"])) { - $_style = Style::parseCssStyle($_attributes["style"]); - - if (isset($_style["stop-color"])) { - $_stop->color = Style::parseColor($_style["stop-color"]); - } - - if (isset($_style["stop-opacity"])) { - $_stop->opacity = max(0, min(1.0, $_style["stop-opacity"])); - } - } - - // Attributes - if (isset($_attributes["offset"])) { - $_stop->offset = $_attributes["offset"]; - } - if (isset($_attributes["stop-color"])) { - $_stop->color = Style::parseColor($_attributes["stop-color"]); - } - if (isset($_attributes["stop-opacity"])) { - $_stop->opacity = max(0, min(1.0, $_attributes["stop-opacity"])); - } - - $this->stops[] = $_stop; - } - } - - return $this->stops; - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Path.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Path.php deleted file mode 100644 index b792b3a..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Path.php +++ /dev/null @@ -1,580 +0,0 @@ - 2, - 'l' => 2, - 'h' => 1, - 'v' => 1, - 'c' => 6, - 's' => 4, - 'q' => 4, - 't' => 2, - 'a' => 7, - ); - - static $repeatedCommands = array( - 'm' => 'l', - 'M' => 'L', - ); - - public static function parse(string $commandSequence): array - { - $commands = array(); - preg_match_all('/([MZLHVCSQTAmzlhvcsqta])([eE ,\-.\d]+)*/', $commandSequence, $commands, PREG_SET_ORDER); - - $path = array(); - foreach ($commands as $c) { - if (count($c) == 3) { - $commandLower = strtolower($c[1]); - - // arcs have special flags that apparently don't require spaces. - if ($commandLower === 'a' && preg_match_all(static::ARC_REGEXP, $c[2], $matches, PREG_PATTERN_ORDER)) { - $numberOfMatches = count($matches[0]); - for ($k = 0; $k < $numberOfMatches; ++$k) { - $path[] = [ - $c[1], - $matches[1][$k], - $matches[2][$k], - $matches[3][$k], - $matches[4][$k], - $matches[5][$k], - $matches[6][$k], - $matches[7][$k], - ]; - } - continue; - } - - $arguments = array(); - preg_match_all('/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/i', $c[2], $arguments, PREG_PATTERN_ORDER); - $item = $arguments[0]; - - if ( - isset(self::$commandLengths[$commandLower]) && - ($commandLength = self::$commandLengths[$commandLower]) && - count($item) > $commandLength - ) { - $repeatedCommand = isset(self::$repeatedCommands[$c[1]]) ? self::$repeatedCommands[$c[1]] : $c[1]; - $command = $c[1]; - - for ($k = 0, $klen = count($item); $k < $klen; $k += $commandLength) { - $_item = array_slice($item, $k, $k + $commandLength); - array_unshift($_item, $command); - $path[] = $_item; - - $command = $repeatedCommand; - } - } else { - array_unshift($item, $c[1]); - $path[] = $item; - } - - } else { - $item = array($c[1]); - - $path[] = $item; - } - } - - return $path; - } - - public function start($attributes) - { - if (!isset($attributes['d'])) { - $this->hasShape = false; - - return; - } - - $path = static::parse($attributes['d']); - $surface = $this->document->getSurface(); - - // From https://github.com/kangax/fabric.js/blob/master/src/shapes/path.class.js - $current = null; // current instruction - $previous = null; - $subpathStartX = 0; - $subpathStartY = 0; - $x = 0; // current x - $y = 0; // current y - $controlX = 0; // current control point x - $controlY = 0; // current control point y - $tempX = null; - $tempY = null; - $tempControlX = null; - $tempControlY = null; - $l = 0; //-((this.width / 2) + $this.pathOffset.x), - $t = 0; //-((this.height / 2) + $this.pathOffset.y), - - foreach ($path as $current) { - switch ($current[0]) { // first letter - case 'l': // lineto, relative - $x += $current[1]; - $y += $current[2]; - $surface->lineTo($x + $l, $y + $t); - break; - - case 'L': // lineto, absolute - $x = $current[1]; - $y = $current[2]; - $surface->lineTo($x + $l, $y + $t); - break; - - case 'h': // horizontal lineto, relative - $x += $current[1]; - $surface->lineTo($x + $l, $y + $t); - break; - - case 'H': // horizontal lineto, absolute - $x = $current[1]; - $surface->lineTo($x + $l, $y + $t); - break; - - case 'v': // vertical lineto, relative - $y += $current[1]; - $surface->lineTo($x + $l, $y + $t); - break; - - case 'V': // verical lineto, absolute - $y = $current[1]; - $surface->lineTo($x + $l, $y + $t); - break; - - case 'm': // moveTo, relative - $x += $current[1]; - $y += $current[2]; - $subpathStartX = $x; - $subpathStartY = $y; - $surface->moveTo($x + $l, $y + $t); - break; - - case 'M': // moveTo, absolute - $x = $current[1]; - $y = $current[2]; - $subpathStartX = $x; - $subpathStartY = $y; - $surface->moveTo($x + $l, $y + $t); - break; - - case 'c': // bezierCurveTo, relative - $tempX = $x + $current[5]; - $tempY = $y + $current[6]; - $controlX = $x + $current[3]; - $controlY = $y + $current[4]; - $surface->bezierCurveTo( - $x + $current[1] + $l, // x1 - $y + $current[2] + $t, // y1 - $controlX + $l, // x2 - $controlY + $t, // y2 - $tempX + $l, - $tempY + $t - ); - $x = $tempX; - $y = $tempY; - break; - - case 'C': // bezierCurveTo, absolute - $x = $current[5]; - $y = $current[6]; - $controlX = $current[3]; - $controlY = $current[4]; - $surface->bezierCurveTo( - $current[1] + $l, - $current[2] + $t, - $controlX + $l, - $controlY + $t, - $x + $l, - $y + $t - ); - break; - - case 's': // shorthand cubic bezierCurveTo, relative - - // transform to absolute x,y - $tempX = $x + $current[3]; - $tempY = $y + $current[4]; - - if (!preg_match('/[CcSs]/', $previous[0])) { - // If there is no previous command or if the previous command was not a C, c, S, or s, - // the control point is coincident with the current point - $controlX = $x; - $controlY = $y; - } else { - // calculate reflection of previous control points - $controlX = 2 * $x - $controlX; - $controlY = 2 * $y - $controlY; - } - - $surface->bezierCurveTo( - $controlX + $l, - $controlY + $t, - $x + $current[1] + $l, - $y + $current[2] + $t, - $tempX + $l, - $tempY + $t - ); - // set control point to 2nd one of this command - // "... the first control point is assumed to be - // the reflection of the second control point on - // the previous command relative to the current point." - $controlX = $x + $current[1]; - $controlY = $y + $current[2]; - - $x = $tempX; - $y = $tempY; - break; - - case 'S': // shorthand cubic bezierCurveTo, absolute - $tempX = $current[3]; - $tempY = $current[4]; - - if (!preg_match('/[CcSs]/', $previous[0])) { - // If there is no previous command or if the previous command was not a C, c, S, or s, - // the control point is coincident with the current point - $controlX = $x; - $controlY = $y; - } else { - // calculate reflection of previous control points - $controlX = 2 * $x - $controlX; - $controlY = 2 * $y - $controlY; - } - - $surface->bezierCurveTo( - $controlX + $l, - $controlY + $t, - $current[1] + $l, - $current[2] + $t, - $tempX + $l, - $tempY + $t - ); - $x = $tempX; - $y = $tempY; - - // set control point to 2nd one of this command - // "... the first control point is assumed to be - // the reflection of the second control point on - // the previous command relative to the current point." - $controlX = $current[1]; - $controlY = $current[2]; - - break; - - case 'q': // quadraticCurveTo, relative - // transform to absolute x,y - $tempX = $x + $current[3]; - $tempY = $y + $current[4]; - - $controlX = $x + $current[1]; - $controlY = $y + $current[2]; - - $surface->quadraticCurveTo( - $controlX + $l, - $controlY + $t, - $tempX + $l, - $tempY + $t - ); - $x = $tempX; - $y = $tempY; - break; - - case 'Q': // quadraticCurveTo, absolute - $tempX = $current[3]; - $tempY = $current[4]; - - $surface->quadraticCurveTo( - $current[1] + $l, - $current[2] + $t, - $tempX + $l, - $tempY + $t - ); - $x = $tempX; - $y = $tempY; - $controlX = $current[1]; - $controlY = $current[2]; - break; - - case 't': // shorthand quadraticCurveTo, relative - - // transform to absolute x,y - $tempX = $x + $current[1]; - $tempY = $y + $current[2]; - - // calculate reflection of previous control points - if (preg_match('/[QqT]/', $previous[0])) { - $controlX = 2 * $x - $controlX; - $controlY = 2 * $y - $controlY; - } elseif ($previous[0] === 't') { - $controlX = 2 * $x - $tempControlX; - $controlY = 2 * $y - $tempControlY; - } else { - $controlX = $x; - $controlY = $y; - } - - $tempControlX = $controlX; - $tempControlY = $controlY; - - $surface->quadraticCurveTo( - $controlX + $l, - $controlY + $t, - $tempX + $l, - $tempY + $t - ); - $x = $tempX; - $y = $tempY; - break; - - case 'T': - $tempX = $current[1]; - $tempY = $current[2]; - - // calculate reflection of previous control points - if (preg_match('/[QqTt]/', $previous[0])) { - $controlX = 2 * $x - $controlX; - $controlY = 2 * $y - $controlY; - } else { - $controlX = $x; - $controlY = $y; - } - - $surface->quadraticCurveTo( - $controlX + $l, - $controlY + $t, - $tempX + $l, - $tempY + $t - ); - $x = $tempX; - $y = $tempY; - break; - - case 'a': - $this->drawArc( - $surface, - $x + $l, - $y + $t, - array( - $current[1], - $current[2], - $current[3], - $current[4], - $current[5], - $current[6] + $x + $l, - $current[7] + $y + $t - ) - ); - $x += $current[6]; - $y += $current[7]; - break; - - case 'A': - // TODO: optimize this - $this->drawArc( - $surface, - $x + $l, - $y + $t, - array( - $current[1], - $current[2], - $current[3], - $current[4], - $current[5], - $current[6] + $l, - $current[7] + $t - ) - ); - $x = $current[6]; - $y = $current[7]; - break; - - case 'z': - case 'Z': - $x = $subpathStartX; - $y = $subpathStartY; - $surface->closePath(); - break; - } - $previous = $current; - } - } - - function drawArc(SurfaceInterface $surface, $fx, $fy, $coords) - { - $rx = $coords[0]; - $ry = $coords[1]; - $rot = $coords[2]; - $large = $coords[3]; - $sweep = $coords[4]; - $tx = $coords[5]; - $ty = $coords[6]; - $segs = array( - array(), - array(), - array(), - array(), - ); - - $toX = $tx - $fx; - $toY = $ty - $fy; - - if ((float)($toX + $toY) === 0.0) { - return; - } - - if ((float)abs($rx) == 0.0 || (float)abs($ry) === 0.0) { - $surface->lineTo($tx, $ty); - return; - } - - $segsNorm = $this->arcToSegments($toX, $toY, $rx, $ry, $large, $sweep, $rot); - - for ($i = 0, $len = count($segsNorm); $i < $len; $i++) { - $segs[$i][0] = $segsNorm[$i][0] + $fx; - $segs[$i][1] = $segsNorm[$i][1] + $fy; - $segs[$i][2] = $segsNorm[$i][2] + $fx; - $segs[$i][3] = $segsNorm[$i][3] + $fy; - $segs[$i][4] = $segsNorm[$i][4] + $fx; - $segs[$i][5] = $segsNorm[$i][5] + $fy; - - call_user_func_array(array($surface, "bezierCurveTo"), $segs[$i]); - } - } - - function arcToSegments($toX, $toY, $rx, $ry, $large, $sweep, $rotateX) - { - $th = $rotateX * M_PI / 180; - $sinTh = sin($th); - $cosTh = cos($th); - $fromX = 0; - $fromY = 0; - - $rx = abs($rx); - $ry = abs($ry); - - $px = -$cosTh * $toX * 0.5 - $sinTh * $toY * 0.5; - $py = -$cosTh * $toY * 0.5 + $sinTh * $toX * 0.5; - $rx2 = $rx * $rx; - $ry2 = $ry * $ry; - $py2 = $py * $py; - $px2 = $px * $px; - $pl = $rx2 * $ry2 - $rx2 * $py2 - $ry2 * $px2; - $root = 0; - - if ($pl < 0) { - $s = sqrt(1 - $pl / ($rx2 * $ry2)); - $rx *= $s; - $ry *= $s; - } else { - $root = ($large == $sweep ? -1.0 : 1.0) * sqrt($pl / ($rx2 * $py2 + $ry2 * $px2)); - } - - $cx = $root * $rx * $py / $ry; - $cy = -$root * $ry * $px / $rx; - $cx1 = $cosTh * $cx - $sinTh * $cy + $toX * 0.5; - $cy1 = $sinTh * $cx + $cosTh * $cy + $toY * 0.5; - $mTheta = $this->calcVectorAngle(1, 0, ($px - $cx) / $rx, ($py - $cy) / $ry); - $dtheta = $this->calcVectorAngle(($px - $cx) / $rx, ($py - $cy) / $ry, (-$px - $cx) / $rx, (-$py - $cy) / $ry); - - if ($sweep == 0 && $dtheta > 0) { - $dtheta -= 2 * M_PI; - } else { - if ($sweep == 1 && $dtheta < 0) { - $dtheta += 2 * M_PI; - } - } - - // $Convert $into $cubic $bezier $segments <= 90deg - $segments = ceil(abs($dtheta / M_PI * 2)); - $result = array(); - $mDelta = $dtheta / $segments; - $mT = 8 / 3 * sin($mDelta / 4) * sin($mDelta / 4) / sin($mDelta / 2); - $th3 = $mTheta + $mDelta; - - for ($i = 0; $i < $segments; $i++) { - $result[$i] = $this->segmentToBezier( - $mTheta, - $th3, - $cosTh, - $sinTh, - $rx, - $ry, - $cx1, - $cy1, - $mT, - $fromX, - $fromY - ); - $fromX = $result[$i][4]; - $fromY = $result[$i][5]; - $mTheta = $th3; - $th3 += $mDelta; - } - - return $result; - } - - function segmentToBezier($th2, $th3, $cosTh, $sinTh, $rx, $ry, $cx1, $cy1, $mT, $fromX, $fromY) - { - $costh2 = cos($th2); - $sinth2 = sin($th2); - $costh3 = cos($th3); - $sinth3 = sin($th3); - $toX = $cosTh * $rx * $costh3 - $sinTh * $ry * $sinth3 + $cx1; - $toY = $sinTh * $rx * $costh3 + $cosTh * $ry * $sinth3 + $cy1; - $cp1X = $fromX + $mT * (-$cosTh * $rx * $sinth2 - $sinTh * $ry * $costh2); - $cp1Y = $fromY + $mT * (-$sinTh * $rx * $sinth2 + $cosTh * $ry * $costh2); - $cp2X = $toX + $mT * ($cosTh * $rx * $sinth3 + $sinTh * $ry * $costh3); - $cp2Y = $toY + $mT * ($sinTh * $rx * $sinth3 - $cosTh * $ry * $costh3); - - return array( - $cp1X, - $cp1Y, - $cp2X, - $cp2Y, - $toX, - $toY - ); - } - - function calcVectorAngle($ux, $uy, $vx, $vy) - { - $ta = atan2($uy, $ux); - $tb = atan2($vy, $vx); - if ($tb >= $ta) { - return $tb - $ta; - } else { - return 2 * M_PI - ($ta - $tb); - } - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Polygon.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Polygon.php deleted file mode 100644 index 72437af..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Polygon.php +++ /dev/null @@ -1,41 +0,0 @@ -document->getSurface(); - list($x, $y) = $points; - $surface->moveTo($x, $y); - - for ($i = 2; $i < $count; $i += 2) { - if ($i + 1 === $count) { - // invalid trailing point - continue; - } - $x = $points[$i]; - $y = $points[$i + 1]; - $surface->lineTo($x, $y); - } - - $surface->closePath(); - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Polyline.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Polyline.php deleted file mode 100644 index fce3458..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Polyline.php +++ /dev/null @@ -1,39 +0,0 @@ -document->getSurface(); - list($x, $y) = $points; - $surface->moveTo($x, $y); - - for ($i = 2; $i < $count; $i += 2) { - if ($i + 1 === $count) { - // invalid trailing point - continue; - } - $x = $points[$i]; - $y = $points[$i + 1]; - $surface->lineTo($x, $y); - } - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/RadialGradient.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/RadialGradient.php deleted file mode 100644 index 80c9879..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/RadialGradient.php +++ /dev/null @@ -1,16 +0,0 @@ -document->getWidth(); - $height = $this->document->getHeight(); - - if (isset($attributes['x'])) { - $this->x = $this->convertSize($attributes['x'], $width); - } - if (isset($attributes['y'])) { - $this->y = $this->convertSize($attributes['y'], $height); - } - - if (isset($attributes['width'])) { - $this->width = $this->convertSize($attributes['width'], $width); - } - if (isset($attributes['height'])) { - $this->height = $this->convertSize($attributes['height'], $height); - } - - if (isset($attributes['rx'])) { - $this->rx = $attributes['rx']; - } - if (isset($attributes['ry'])) { - $this->ry = $attributes['ry']; - } - - $this->document->getSurface()->rect($this->x, $this->y, $this->width, $this->height, $this->rx, $this->ry); - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Shape.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Shape.php deleted file mode 100644 index e9342a2..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Shape.php +++ /dev/null @@ -1,62 +0,0 @@ -document->getSurface(); - - $surface->save(); - - $style = $this->makeStyle($attributes); - - $this->setStyle($style); - $surface->setStyle($style); - - $this->applyTransform($attributes); - } - - protected function after() - { - $surface = $this->document->getSurface(); - - if ($this->hasShape) { - $style = $surface->getStyle(); - - $fill = $style->fill && is_array($style->fill); - $stroke = $style->stroke && is_array($style->stroke); - - if ($fill) { - if ($stroke) { - $surface->fillStroke(false); - } else { -// if (is_string($style->fill)) { -// /** @var LinearGradient|RadialGradient $gradient */ -// $gradient = $this->getDocument()->getDef($style->fill); -// -// var_dump($gradient->getStops()); -// } - - $surface->fill(); - } - } - elseif ($stroke) { - $surface->stroke(false); - } - else { - $surface->endPath(); - } - } - - $surface->restore(); - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Stop.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Stop.php deleted file mode 100644 index b7414f9..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Stop.php +++ /dev/null @@ -1,16 +0,0 @@ -text); - $this->document->appendStyleSheet($parser->parse()); - } - - public function appendText($text) - { - $this->text .= $text; - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Symbol.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Symbol.php deleted file mode 100644 index 3668a44..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Symbol.php +++ /dev/null @@ -1,33 +0,0 @@ -document->getSurface(); - - $surface->save(); - - $style = $this->makeStyle($attributes); - - $this->setStyle($style); - $surface->setStyle($style); - - $this->applyViewbox($attributes); - $this->applyTransform($attributes); - } - - protected function after() - { - $this->document->getSurface()->restore(); - } -} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Text.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Text.php deleted file mode 100644 index 0433658..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Text.php +++ /dev/null @@ -1,71 +0,0 @@ -document->getHeight(); - $this->y = $height; - - if (isset($attributes['x'])) { - $width = $this->document->getWidth(); - $this->x = $this->convertSize($attributes['x'], $width); - } - if (isset($attributes['y'])) { - $this->y = $height - $this->convertSize($attributes['y'], $height); - } - - $this->document->getSurface()->transform(1, 0, 0, -1, 0, $height); - } - - public function end() - { - $surface = $this->document->getSurface(); - $x = $this->x; - $y = $this->y; - $style = $surface->getStyle(); - $surface->setFont($style->fontFamily, $style->fontStyle, $style->fontWeight); - - switch ($style->textAnchor) { - case "middle": - $width = $surface->measureText($this->text); - $x -= $width / 2; - break; - - case "end": - $width = $surface->measureText($this->text); - $x -= $width; - break; - } - - $surface->fillText($this->getText(), $x, $y); - } - - protected function after() - { - $this->document->getSurface()->restore(); - } - - public function appendText($text) - { - $this->text .= $text; - } - - public function getText() - { - return trim($this->text); - } -} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/UseTag.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/UseTag.php deleted file mode 100644 index 66c460b..0000000 --- a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/UseTag.php +++ /dev/null @@ -1,131 +0,0 @@ -instances++; - if ($this->instances > 1) { - //TODO: log circular reference error state - return; - } - - if (isset($attributes['x'])) { - $this->x = $attributes['x']; - } - if (isset($attributes['y'])) { - $this->y = $attributes['y']; - } - - if (isset($attributes['width'])) { - $this->width = $attributes['width']; - } - if (isset($attributes['height'])) { - $this->height = $attributes['height']; - } - - parent::before($attributes); - - $document = $this->getDocument(); - - $link = $attributes["href"] ?? $attributes["xlink:href"]; - $this->reference = $document->getDef($link); - - $surface = $document->getSurface(); - $surface->save(); - - $surface->translate($this->x, $this->y); - } - - protected function after() { - if ($this->instances > 0) { - return; - } - parent::after(); - $this->getDocument()->getSurface()->restore(); - } - - public function handle($attributes) - { - if ($this->instances > 1) { - //TODO: log circular reference error state - return; - } - - parent::handle($attributes); - - if (!$this->reference) { - return; - } - - $originalAttributes = array_merge($this->reference->attributes); - $originalStyle = $this->reference->getStyle(); - $mergedAttributes = $this->reference->attributes; - $attributesToNotMerge = ['x', 'y', 'width', 'height', 'href', 'xlink:href', 'id', 'style']; - foreach ($attributes as $attrKey => $attrVal) { - if (!in_array($attrKey, $attributesToNotMerge) && !isset($mergedAttributes[$attrKey])) { - $mergedAttributes[$attrKey] = $attrVal; - } - } - $mergedAttributes['style'] = ($attributes['style'] ?? '') . ';' . ($mergedAttributes['style'] ?? ''); - - $this->_handle($this->reference, $mergedAttributes); - - $this->reference->attributes = $originalAttributes; - if ($originalStyle !== null) { - $this->reference->setStyle($originalStyle); - } - } - - public function handleEnd() - { - $this->instances--; - if ($this->instances > 0) { - return; - } - - if ($this->reference) { - $this->_handleEnd($this->reference); - } - - parent::handleEnd(); - } - - private function _handle($tag, $attributes) { - $tag->handle($attributes); - foreach ($tag->children as $child) { - $originalAttributes = array_merge($child->attributes); - $originalStyle = $child->getStyle(); - $mergedAttributes = $child->attributes; - $mergedAttributes['style'] = ($attributes['style'] ?? '') . ';' . ($mergedAttributes['style'] ?? ''); - $this->_handle($child, $mergedAttributes); - $child->attributes = $originalAttributes; - if ($originalStyle !== null) { - $child->setStyle($originalStyle); - } - } - } - - private function _handleEnd($tag) { - foreach ($tag->children as $child) { - $this->_handleEnd($child); - } - $tag->handleEnd(); - } -} diff --git a/dompdf/vendor/masterminds/html5/CREDITS b/dompdf/vendor/masterminds/html5/CREDITS deleted file mode 100644 index c2dbc4b..0000000 --- a/dompdf/vendor/masterminds/html5/CREDITS +++ /dev/null @@ -1,11 +0,0 @@ -Matt Butcher [technosophos] (lead) -Matt Farina [mattfarina] (lead) -Asmir Mustafic [goetas] (contributor) -Edward Z. Yang [ezyang] (contributor) -Geoffrey Sneddon [gsnedders] (contributor) -Kukhar Vasily [ngreduce] (contributor) -Rune Christensen [MrElectronic] (contributor) -Mišo Belica [miso-belica] (contributor) -Asmir Mustafic [goetas] (contributor) -KITAITI Makoto [KitaitiMakoto] (contributor) -Jacob Floyd [cognifloyd] (contributor) diff --git a/dompdf/vendor/masterminds/html5/LICENSE.txt b/dompdf/vendor/masterminds/html5/LICENSE.txt deleted file mode 100644 index 3c275b5..0000000 --- a/dompdf/vendor/masterminds/html5/LICENSE.txt +++ /dev/null @@ -1,66 +0,0 @@ -## HTML5-PHP License - -Copyright (c) 2013 The Authors of HTML5-PHP - -Matt Butcher - mattbutcher@google.com -Matt Farina - matt@mattfarina.com -Asmir Mustafic - goetas@gmail.com - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -## HTML5Lib License - -Portions of this are based on html5lib's PHP version, which was a -sub-project of html5lib. The following is the list of contributors from -html5lib: - -html5lib: - -Copyright (c) 2006-2009 The Authors - -Contributors: -James Graham - jg307@cam.ac.uk -Anne van Kesteren - annevankesteren@gmail.com -Lachlan Hunt - lachlan.hunt@lachy.id.au -Matt McDonald - kanashii@kanashii.ca -Sam Ruby - rubys@intertwingly.net -Ian Hickson (Google) - ian@hixie.ch -Thomas Broyer - t.broyer@ltgt.net -Jacques Distler - distler@golem.ph.utexas.edu -Henri Sivonen - hsivonen@iki.fi -Adam Barth - abarth@webkit.org -Eric Seidel - eric@webkit.org -The Mozilla Foundation (contributions from Henri Sivonen since 2008) -David Flanagan (Mozilla) - dflanagan@mozilla.com - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/dompdf/vendor/masterminds/html5/README.md b/dompdf/vendor/masterminds/html5/README.md deleted file mode 100644 index fb6e562..0000000 --- a/dompdf/vendor/masterminds/html5/README.md +++ /dev/null @@ -1,270 +0,0 @@ -> # UKRAINE NEEDS YOUR HELP NOW! -> -> On 24 February 2022, Russian [President Vladimir Putin ordered an invasion of Ukraine by Russian Armed Forces](https://www.bbc.com/news/world-europe-60504334). -> -> Your support is urgently needed. -> -> - Donate to the volunteers. Here is the volunteer fund helping the Ukrainian army to provide all the necessary equipment: -> https://bank.gov.ua/en/news/all/natsionalniy-bank-vidkriv-spetsrahunok-dlya-zboru-koshtiv-na-potrebi-armiyi or https://savelife.in.ua/en/donate/ -> - Triple-check social media sources. Russian disinformation is attempting to coverup and distort the reality in Ukraine. -> - Help Ukrainian refugees who are fleeing Russian attacks and shellings: https://www.globalcitizen.org/en/content/ways-to-help-ukraine-conflict/ -> - Put pressure on your political representatives to provide help to Ukraine. -> - Believe in the Ukrainian people, they will not surrender, they don't have another Ukraine. -> -> THANK YOU! ----- - -# HTML5-PHP - -HTML5 is a standards-compliant HTML5 parser and writer written entirely in PHP. -It is stable and used in many production websites, and has -well over [five million downloads](https://packagist.org/packages/masterminds/html5). - -HTML5 provides the following features. - -- An HTML5 serializer -- Support for PHP namespaces -- Composer support -- Event-based (SAX-like) parser -- A DOM tree builder -- Interoperability with [QueryPath](https://github.com/technosophos/querypath) -- Runs on **PHP** 5.3.0 or newer - -[![CI](https://github.com/Masterminds/html5-php/actions/workflows/ci.yaml/badge.svg)](https://github.com/Masterminds/html5-php/actions/workflows/ci.yaml) -[![Latest Stable Version](https://poser.pugx.org/masterminds/html5/v/stable.png)](https://packagist.org/packages/masterminds/html5) -[![Code Coverage](https://scrutinizer-ci.com/g/Masterminds/html5-php/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/Masterminds/html5-php/?branch=master) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/Masterminds/html5-php/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/Masterminds/html5-php/?branch=master) -[![Stability: Sustained](https://masterminds.github.io/stability/sustained.svg)](https://masterminds.github.io/stability/sustained.html) - -## Installation - -Install HTML5-PHP using [composer](http://getcomposer.org/). - -By adding the `masterminds/html5` dependency to your `composer.json` file: - -```json -{ - "require" : { - "masterminds/html5": "^2.0" - }, -} -``` - -By invoking require command via composer executable: - -```bash -composer require masterminds/html5 -``` - -## Basic Usage - -HTML5-PHP has a high-level API and a low-level API. - -Here is how you use the high-level `HTML5` library API: - -```php - - - TEST - - -

Hello World

-

This is a test of the HTML5 parser.

- - -HERE; - -// Parse the document. $dom is a DOMDocument. -$html5 = new HTML5(); -$dom = $html5->loadHTML($html); - -// Render it as HTML5: -print $html5->saveHTML($dom); - -// Or save it to a file: -$html5->save($dom, 'out.html'); -``` - -The `$dom` created by the parser is a full `DOMDocument` object. And the -`save()` and `saveHTML()` methods will take any DOMDocument. - -### Options - -It is possible to pass in an array of configuration options when loading -an HTML5 document. - -```php -// An associative array of options -$options = array( - 'option_name' => 'option_value', -); - -// Provide the options to the constructor -$html5 = new HTML5($options); - -$dom = $html5->loadHTML($html); -``` - -The following options are supported: - -* `encode_entities` (boolean): Indicates that the serializer should aggressively - encode characters as entities. Without this, it only encodes the bare - minimum. -* `disable_html_ns` (boolean): Prevents the parser from automatically - assigning the HTML5 namespace to the DOM document. This is for - non-namespace aware DOM tools. -* `target_document` (\DOMDocument): A DOM document that will be used as the - destination for the parsed nodes. -* `implicit_namespaces` (array): An assoc array of namespaces that should be - used by the parser. Name is tag prefix, value is NS URI. - -## The Low-Level API - -This library provides the following low-level APIs that you can use to -create more customized HTML5 tools: - -- A SAX-like event-based parser that you can hook into for special kinds -of parsing. -- A flexible error-reporting mechanism that can be tuned to document -syntax checking. -- A DOM implementation that uses PHP's built-in DOM library. - -The unit tests exercise each piece of the API, and every public function -is well-documented. - -### Parser Design - -The parser is designed as follows: - -- The `Scanner` handles scanning on behalf of the parser. -- The `Tokenizer` requests data off of the scanner, parses it, clasifies -it, and sends it to an `EventHandler`. It is a *recursive descent parser.* -- The `EventHandler` receives notifications and data for each specific -semantic event that occurs during tokenization. -- The `DOMBuilder` is an `EventHandler` that listens for tokenizing -events and builds a document tree (`DOMDocument`) based on the events. - -### Serializer Design - -The serializer takes a data structure (the `DOMDocument`) and transforms -it into a character representation -- an HTML5 document. - -The serializer is broken into three parts: - -- The `OutputRules` contain the rules to turn DOM elements into strings. The -rules are an implementation of the interface `RulesInterface` allowing for -different rule sets to be used. -- The `Traverser`, which is a special-purpose tree walker. It visits -each node node in the tree and uses the `OutputRules` to transform the node -into a string. -- `HTML5` manages the `Traverser` and stores the resultant data -in the correct place. - -The serializer (`save()`, `saveHTML()`) follows the -[section 8.9 of the HTML 5.0 spec](http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#serializing-html-fragments). -So tags are serialized according to these rules: - -- A tag with children: <foo>CHILDREN</foo> -- A tag that cannot have content: <foo> (no closing tag) -- A tag that could have content, but doesn't: <foo></foo> - -## Known Issues (Or, Things We Designed Against the Spec) - -Please check the issue queue for a full list, but the following are -issues known issues that are not presently on the roadmap: - -- Namespaces: HTML5 only [supports a selected list of namespaces](http://www.w3.org/TR/html5/infrastructure.html#namespaces) - and they do not operate in the same way as XML namespaces. A `:` has no special - meaning. - By default the parser does not support XML style namespaces via `:`; - to enable the XML namespaces see the [XML Namespaces section](#xml-namespaces) -- Scripts: This parser does not contain a JavaScript or a CSS - interpreter. While one may be supplied, not all features will be - supported. -- Reentrance: The current parser is not re-entrant. (Thus you can't pause - the parser to modify the HTML string mid-parse.) -- Validation: The current tree builder is **not** a validating parser. - While it will correct some HTML, it does not check that the HTML - conforms to the standard. (Should you wish, you can build a validating - parser by extending DOMTree or building your own EventHandler - implementation.) - * There is limited support for insertion modes. - * Some autocorrection is done automatically. - * Per the spec, many legacy tags are admitted and correctly handled, - even though they are technically not part of HTML5. -- Attribute names and values: Due to the implementation details of the - PHP implementation of DOM, attribute names that do not follow the - XML 1.0 standard are not inserted into the DOM. (Effectively, they - are ignored.) If you've got a clever fix for this, jump in! -- Processor Instructions: The HTML5 spec does not allow processor - instructions. We do. Since this is a server-side library, we think - this is useful. And that means, dear reader, that in some cases you - can parse the HTML from a mixed PHP/HTML document. This, however, - is an incidental feature, not a core feature. -- HTML manifests: Unsupported. -- PLAINTEXT: Unsupported. -- Adoption Agency Algorithm: Not yet implemented. (8.2.5.4.7) - -## XML Namespaces - -To use XML style namespaces you have to configure well the main `HTML5` instance. - -```php -use Masterminds\HTML5; -$html = new HTML5(array( - "xmlNamespaces" => true -)); - -$dom = $html->loadHTML(''); - -$dom->documentElement->namespaceURI; // http://www.example.com - -``` - -You can also add some default prefixes that will not require the namespace declaration, -but its elements will be namespaced. - -```php -use Masterminds\HTML5; -$html = new HTML5(array( - "implicitNamespaces"=>array( - "t"=>"http://www.example.com" - ) -)); - -$dom = $html->loadHTML(''); - -$dom->documentElement->namespaceURI; // http://www.example.com - -``` - -## Thanks to... - -The dedicated (and patient) contributors of patches small and large, -who have already made this library better.See the CREDITS file for -a list of contributors. - -We owe a huge debt of gratitude to the original authors of html5lib. - -While not much of the original parser remains, we learned a lot from -reading the html5lib library. And some pieces remain here. In -particular, much of the UTF-8 and Unicode handling is derived from the -html5lib project. - -## License - -This software is released under the MIT license. The original html5lib -library was also released under the MIT license. - -See LICENSE.txt - -Certain files contain copyright assertions by specific individuals -involved with html5lib. Those have been retained where appropriate. diff --git a/dompdf/vendor/masterminds/html5/RELEASE.md b/dompdf/vendor/masterminds/html5/RELEASE.md deleted file mode 100644 index 33007ed..0000000 --- a/dompdf/vendor/masterminds/html5/RELEASE.md +++ /dev/null @@ -1,157 +0,0 @@ -# Release Notes - -2.7.6 (2021-08-18) - -- #218: Address comment handling issues - -2.7.5 (2021-07-01) - -- #204: Travis: Enable tests on PHP 8.0 -- #207: Fix PHP 8.1 deprecations - -2.7.4 (2020-10-01) - -- #191: Fix travisci build -- #195: Add .gitattributes file with export-ignore rules -- #194: Fix query parameter parsed as character entity - -2.7.3 (2020-07-05) - -- #190: mitigate cyclic reference between output rules and the traverser objects - -2.7.2 (2020-07-01) - -- #187: Fixed memory leak in HTML5::saveHTML() -- #186: Add special case for end tag
- -2.7.1 (2020-06-14) - -- #171: add PHP 7.4 job -- #178: Prevent infinite loop on un-terminated entity declaration at EOF - -2.7.0 (2019-07-25) - -- #164: Drop HHVM support -- #168: Set default encoding in the DOMDocument object - -2.6.0 (2019-03-10) - -- #163: Allow to pass a charset to the Scanner - -2.5.0 (2018-12-27) - -- #162, #161, #155, #154, #153, #151: big performance improvements -- #156: fixed typos -- #160: adopt and enforce code style -- #159: remove deprecated php unit base test case -- #150: backport changes from old master branch - -2.4.0 (2018-11-17) - -- #148: Improve performance by moving sequence matching -- #147: Improve the Tokenizer performance -- #146: Improve performance by relying on a native string instead of InputStream -- #144: Add DOM extension in composer.json -- #145: Add more extensions on composer.json, improve phpdocs and remove dead code -- #143: Remove experimental comment - -2.3.1 (2018-10-18) - -- #121: Audio is not a block tag (fixed by #141) -- #136: Handle illegal self-closing according to spec (fixed by #137) -- #141: Minor fixes in the README - -2.3.0 (2017-09-04) - -- #129: image within inline svg breaks system (fixed by #133) -- #131: ² does not work (fixed by #132) -- #134: Improve tokenizer performance by 20% (alternative version of #130 thanks to @MichaelHeerklotz) -- #135: Raw & in attributes - -2.2.2 (2016-09-22) - -- #116: In XML mode, tags are case sensitive -- #115: Fix PHP Notice in OutputRules -- #112: fix parsing of options of an optgroup -- #111: Adding test for the address tag - -2.2.1 (2016-05-10) - -- #109: Fixed issue where address tag could be written without closing tag (thanks sylus) - -2.2.0 (2016-04-11) - -- #105: Enable composer cache (for CI/CD) -- #100: Use mb_substitute_character inset of ini_set for environments where ini_set is disable (e.g., shared hosting) -- #98: Allow link, meta, style tags in noscript tags -- #96: Fixed xml:href on svgs that use the "use" breaking -- #94: Counting UTF8 characters performance improvement -- #93: Use newer version of coveralls package -- #90: Remove duplicate test -- #87: Allow multiple root nodes - -2.1.2 (2015-06-07) -- #82: Support for PHP7 -- #84: Improved boolean attribute handling - -2.1.1 (2015-03-23) -- #78: Fixes bug where unmatched entity like string drops everything after &. - -2.1.0 (2015-02-01) -- #74: Added `disable_html_ns` and `target_doc` dom parsing options -- Unified option names -- #73: Fixed alphabet, ß now can be detected -- #75 and #76: Allow whitespace in RCDATA tags -- #77: Fixed parsing blunder for json embeds -- #72: Add options to HTML methods - -2.0.2 (2014-12-17) -- #50: empty document handling -- #63: tags with strange capitalization -- #65: dashes and underscores as allowed characters in tag names -- #68: Fixed issue with non-inline elements inside inline containers - -2.0.1 (2014-09-23) -- #59: Fixed issue parsing some fragments. -- #56: Incorrectly saw 0 as empty string -- Sami as new documentation generator - -2.0.0 (2014-07-28) -- #53: Improved boolean attributes handling -- #52: Facebook HHVM compatibility -- #48: Adopted PSR-2 as coding standard -- #47: Moved everything to Masterminds namespace -- #45: Added custom namespaces -- #44: Added support to XML-style namespaces -- #37: Refactored HTML5 class removing static methods - -1.0.5 (2014-06-10) -- #38: Set the dev-master branch as the 1.0.x branch for composer (goetas) -- #34: Tests use PSR-4 for autoloading. (goetas) -- #40, #41: Fix entity handling in RCDATA sections. (KitaitiMakoto) -- #32: Fixed issue where wharacter references were being incorrectly encoded in style tags. - -1.0.4 (2014-04-29) -- #30/#31 Don't throw an exception for invalid tag names. - -1.0.3 (2014-02-28) -- #23 and #29: Ignore attributes with illegal chars in name for the PHP DOM. - -1.0.2 (2014-02-12) -- #23: Handle missing tag close in attribute list. -- #25: Fixed text escaping in the serializer (HTML% 8.3). -- #27: Fixed tests on Windows: changed "\n" -> PHP_EOL. -- #28: Fixed infinite loop for char "&" in unquoted attribute in parser. -- #26: Updated tag name case handling to deal with uppercase usage. -- #24: Newlines and tabs are allowed inside quoted attributes (HTML5 8.2.4). -- Fixed Travis CI testing. - -1.0.1 (2013-11-07) -- CDATA encoding is improved. (Non-standard; Issue #19) -- Some parser rules were not returning the new current element. (Issue #20) -- Added, to the README, details on code test coverage and to packagist version. -- Fixed processor instructions. -- Improved test coverage and documentation coverage. - -1.0.0 (2013-10-02) -- Initial release. diff --git a/dompdf/vendor/masterminds/html5/UPGRADING.md b/dompdf/vendor/masterminds/html5/UPGRADING.md deleted file mode 100644 index 76e3a19..0000000 --- a/dompdf/vendor/masterminds/html5/UPGRADING.md +++ /dev/null @@ -1,21 +0,0 @@ -From 1.x to 2.x -================= - -- All classes uses `Masterminds` namespace. -- All public static methods has been removed from `HTML5` class and the general API to access the HTML5 functionalities has changed. - - Before: - - $dom = \HTML5::loadHTML('....'); - \HTML5::saveHTML($dom); - - After: - - use Masterminds\HTML5; - - $html5 = new HTML5(); - - $dom = $html5->loadHTML('....'); - echo $html5->saveHTML($dom); - - diff --git a/dompdf/vendor/masterminds/html5/bin/entities.php b/dompdf/vendor/masterminds/html5/bin/entities.php deleted file mode 100644 index 56323a3..0000000 --- a/dompdf/vendor/masterminds/html5/bin/entities.php +++ /dev/null @@ -1,26 +0,0 @@ - $obj) { - $sname = substr($name, 1, -1); - $table[$sname] = $obj->characters; -} - -echo '=5.3.0" - }, - "require-dev": { - "phpunit/phpunit" : "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" - }, - "autoload": { - "psr-4": {"Masterminds\\": "src"} - }, - "autoload-dev": { - "psr-4": {"Masterminds\\HTML5\\Tests\\": "test/HTML5"} - }, - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - } -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5.php b/dompdf/vendor/masterminds/html5/src/HTML5.php deleted file mode 100644 index c857145..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5.php +++ /dev/null @@ -1,246 +0,0 @@ - false, - - // Prevents the parser from automatically assigning the HTML5 namespace to the DOM document. - 'disable_html_ns' => false, - ); - - protected $errors = array(); - - public function __construct(array $defaultOptions = array()) - { - $this->defaultOptions = array_merge($this->defaultOptions, $defaultOptions); - } - - /** - * Get the current default options. - * - * @return array - */ - public function getOptions() - { - return $this->defaultOptions; - } - - /** - * Load and parse an HTML file. - * - * This will apply the HTML5 parser, which is tolerant of many - * varieties of HTML, including XHTML 1, HTML 4, and well-formed HTML - * 3. Note that in these cases, not all of the old data will be - * preserved. For example, XHTML's XML declaration will be removed. - * - * The rules governing parsing are set out in the HTML 5 spec. - * - * @param string|resource $file The path to the file to parse. If this is a resource, it is - * assumed to be an open stream whose pointer is set to the first - * byte of input. - * @param array $options Configuration options when parsing the HTML. - * - * @return \DOMDocument A DOM document. These object type is defined by the libxml - * library, and should have been included with your version of PHP. - */ - public function load($file, array $options = array()) - { - // Handle the case where file is a resource. - if (is_resource($file)) { - return $this->parse(stream_get_contents($file), $options); - } - - return $this->parse(file_get_contents($file), $options); - } - - /** - * Parse a HTML Document from a string. - * - * Take a string of HTML 5 (or earlier) and parse it into a - * DOMDocument. - * - * @param string $string A html5 document as a string. - * @param array $options Configuration options when parsing the HTML. - * - * @return \DOMDocument A DOM document. DOM is part of libxml, which is included with - * almost all distribtions of PHP. - */ - public function loadHTML($string, array $options = array()) - { - return $this->parse($string, $options); - } - - /** - * Convenience function to load an HTML file. - * - * This is here to provide backwards compatibility with the - * PHP DOM implementation. It simply calls load(). - * - * @param string $file The path to the file to parse. If this is a resource, it is - * assumed to be an open stream whose pointer is set to the first - * byte of input. - * @param array $options Configuration options when parsing the HTML. - * - * @return \DOMDocument A DOM document. These object type is defined by the libxml - * library, and should have been included with your version of PHP. - */ - public function loadHTMLFile($file, array $options = array()) - { - return $this->load($file, $options); - } - - /** - * Parse a HTML fragment from a string. - * - * @param string $string the HTML5 fragment as a string - * @param array $options Configuration options when parsing the HTML - * - * @return \DOMDocumentFragment A DOM fragment. The DOM is part of libxml, which is included with - * almost all distributions of PHP. - */ - public function loadHTMLFragment($string, array $options = array()) - { - return $this->parseFragment($string, $options); - } - - /** - * Return all errors encountered into parsing phase. - * - * @return array - */ - public function getErrors() - { - return $this->errors; - } - - /** - * Return true it some errors were encountered into parsing phase. - * - * @return bool - */ - public function hasErrors() - { - return count($this->errors) > 0; - } - - /** - * Parse an input string. - * - * @param string $input - * @param array $options - * - * @return \DOMDocument - */ - public function parse($input, array $options = array()) - { - $this->errors = array(); - $options = array_merge($this->defaultOptions, $options); - $events = new DOMTreeBuilder(false, $options); - $scanner = new Scanner($input, !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'); - $parser = new Tokenizer($scanner, $events, !empty($options['xmlNamespaces']) ? Tokenizer::CONFORMANT_XML : Tokenizer::CONFORMANT_HTML); - - $parser->parse(); - $this->errors = $events->getErrors(); - - return $events->document(); - } - - /** - * Parse an input stream where the stream is a fragment. - * - * Lower-level loading function. This requires an input stream instead - * of a string, file, or resource. - * - * @param string $input The input data to parse in the form of a string. - * @param array $options An array of options. - * - * @return \DOMDocumentFragment - */ - public function parseFragment($input, array $options = array()) - { - $options = array_merge($this->defaultOptions, $options); - $events = new DOMTreeBuilder(true, $options); - $scanner = new Scanner($input, !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'); - $parser = new Tokenizer($scanner, $events, !empty($options['xmlNamespaces']) ? Tokenizer::CONFORMANT_XML : Tokenizer::CONFORMANT_HTML); - - $parser->parse(); - $this->errors = $events->getErrors(); - - return $events->fragment(); - } - - /** - * Save a DOM into a given file as HTML5. - * - * @param mixed $dom The DOM to be serialized. - * @param string|resource $file The filename to be written or resource to write to. - * @param array $options Configuration options when serializing the DOM. These include: - * - encode_entities: Text written to the output is escaped by default and not all - * entities are encoded. If this is set to true all entities will be encoded. - * Defaults to false. - */ - public function save($dom, $file, $options = array()) - { - $close = true; - if (is_resource($file)) { - $stream = $file; - $close = false; - } else { - $stream = fopen($file, 'wb'); - } - $options = array_merge($this->defaultOptions, $options); - $rules = new OutputRules($stream, $options); - $trav = new Traverser($dom, $stream, $rules, $options); - - $trav->walk(); - /* - * release the traverser to avoid cyclic references and allow PHP to free memory without waiting for gc_collect_cycles - */ - $rules->unsetTraverser(); - if ($close) { - fclose($stream); - } - } - - /** - * Convert a DOM into an HTML5 string. - * - * @param mixed $dom The DOM to be serialized. - * @param array $options Configuration options when serializing the DOM. These include: - * - encode_entities: Text written to the output is escaped by default and not all - * entities are encoded. If this is set to true all entities will be encoded. - * Defaults to false. - * - * @return string A HTML5 documented generated from the DOM. - */ - public function saveHTML($dom, $options = array()) - { - $stream = fopen('php://temp', 'wb'); - $this->save($dom, $stream, array_merge($this->defaultOptions, $options)); - - $html = stream_get_contents($stream, -1, 0); - - fclose($stream); - - return $html; - } -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Elements.php b/dompdf/vendor/masterminds/html5/src/HTML5/Elements.php deleted file mode 100644 index 5d8cfd4..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Elements.php +++ /dev/null @@ -1,637 +0,0 @@ - [PARENT-TAG-NAME-TO-CLOSE1, PARENT-TAG-NAME-TO-CLOSE2, ...]. - * - * Order is important, after auto-closing one parent with might have to close also their parent. - * - * @var array - */ - public static $optionalEndElementsParentsToClose = array( - 'tr' => array('td', 'tr'), - 'td' => array('td', 'th'), - 'th' => array('td', 'th'), - 'tfoot' => array('td', 'th', 'tr', 'tbody', 'thead'), - 'tbody' => array('td', 'th', 'tr', 'thead'), - ); - - /** - * The HTML5 elements as defined in http://dev.w3.org/html5/markup/elements.html. - * - * @var array - */ - public static $html5 = array( - 'a' => 1, - 'abbr' => 1, - 'address' => 65, // NORMAL | BLOCK_TAG - 'area' => 9, // NORMAL | VOID_TAG - 'article' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'aside' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'audio' => 1, // NORMAL - 'b' => 1, - 'base' => 9, // NORMAL | VOID_TAG - 'bdi' => 1, - 'bdo' => 1, - 'blockquote' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'body' => 1, - 'br' => 9, // NORMAL | VOID_TAG - 'button' => 1, - 'canvas' => 65, // NORMAL | BLOCK_TAG - 'caption' => 1, - 'cite' => 1, - 'code' => 1, - 'col' => 9, // NORMAL | VOID_TAG - 'colgroup' => 1, - 'command' => 9, // NORMAL | VOID_TAG - // "data" => 1, // This is highly experimental and only part of the whatwg spec (not w3c). See https://developer.mozilla.org/en-US/docs/HTML/Element/data - 'datalist' => 1, - 'dd' => 65, // NORMAL | BLOCK_TAG - 'del' => 1, - 'details' => 17, // NORMAL | AUTOCLOSE_P, - 'dfn' => 1, - 'dialog' => 17, // NORMAL | AUTOCLOSE_P, - 'div' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'dl' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'dt' => 1, - 'em' => 1, - 'embed' => 9, // NORMAL | VOID_TAG - 'fieldset' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'figcaption' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'figure' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'footer' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'form' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'h1' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'h2' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'h3' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'h4' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'h5' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'h6' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'head' => 1, - 'header' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'hgroup' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'hr' => 73, // NORMAL | VOID_TAG - 'html' => 1, - 'i' => 1, - 'iframe' => 3, // NORMAL | TEXT_RAW - 'img' => 9, // NORMAL | VOID_TAG - 'input' => 9, // NORMAL | VOID_TAG - 'kbd' => 1, - 'ins' => 1, - 'keygen' => 9, // NORMAL | VOID_TAG - 'label' => 1, - 'legend' => 1, - 'li' => 1, - 'link' => 9, // NORMAL | VOID_TAG - 'map' => 1, - 'mark' => 1, - 'menu' => 17, // NORMAL | AUTOCLOSE_P, - 'meta' => 9, // NORMAL | VOID_TAG - 'meter' => 1, - 'nav' => 17, // NORMAL | AUTOCLOSE_P, - 'noscript' => 65, // NORMAL | BLOCK_TAG - 'object' => 1, - 'ol' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'optgroup' => 1, - 'option' => 1, - 'output' => 65, // NORMAL | BLOCK_TAG - 'p' => 209, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | BLOCK_ONLY_INLINE - 'param' => 9, // NORMAL | VOID_TAG - 'pre' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'progress' => 1, - 'q' => 1, - 'rp' => 1, - 'rt' => 1, - 'ruby' => 1, - 's' => 1, - 'samp' => 1, - 'script' => 3, // NORMAL | TEXT_RAW - 'section' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'select' => 1, - 'small' => 1, - 'source' => 9, // NORMAL | VOID_TAG - 'span' => 1, - 'strong' => 1, - 'style' => 3, // NORMAL | TEXT_RAW - 'sub' => 1, - 'summary' => 17, // NORMAL | AUTOCLOSE_P, - 'sup' => 1, - 'table' => 65, // NORMAL | BLOCK_TAG - 'tbody' => 1, - 'td' => 1, - 'textarea' => 5, // NORMAL | TEXT_RCDATA - 'tfoot' => 65, // NORMAL | BLOCK_TAG - 'th' => 1, - 'thead' => 1, - 'time' => 1, - 'title' => 5, // NORMAL | TEXT_RCDATA - 'tr' => 1, - 'track' => 9, // NORMAL | VOID_TAG - 'u' => 1, - 'ul' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'var' => 1, - 'video' => 1, - 'wbr' => 9, // NORMAL | VOID_TAG - - // Legacy? - 'basefont' => 8, // VOID_TAG - 'bgsound' => 8, // VOID_TAG - 'noframes' => 2, // RAW_TEXT - 'frame' => 9, // NORMAL | VOID_TAG - 'frameset' => 1, - 'center' => 16, - 'dir' => 16, - 'listing' => 16, // AUTOCLOSE_P - 'plaintext' => 48, // AUTOCLOSE_P | TEXT_PLAINTEXT - 'applet' => 0, - 'marquee' => 0, - 'isindex' => 8, // VOID_TAG - 'xmp' => 20, // AUTOCLOSE_P | VOID_TAG | RAW_TEXT - 'noembed' => 2, // RAW_TEXT - ); - - /** - * The MathML elements. - * See http://www.w3.org/wiki/MathML/Elements. - * - * In our case we are only concerned with presentation MathML and not content - * MathML. There is a nice list of this subset at https://developer.mozilla.org/en-US/docs/MathML/Element. - * - * @var array - */ - public static $mathml = array( - 'maction' => 1, - 'maligngroup' => 1, - 'malignmark' => 1, - 'math' => 1, - 'menclose' => 1, - 'merror' => 1, - 'mfenced' => 1, - 'mfrac' => 1, - 'mglyph' => 1, - 'mi' => 1, - 'mlabeledtr' => 1, - 'mlongdiv' => 1, - 'mmultiscripts' => 1, - 'mn' => 1, - 'mo' => 1, - 'mover' => 1, - 'mpadded' => 1, - 'mphantom' => 1, - 'mroot' => 1, - 'mrow' => 1, - 'ms' => 1, - 'mscarries' => 1, - 'mscarry' => 1, - 'msgroup' => 1, - 'msline' => 1, - 'mspace' => 1, - 'msqrt' => 1, - 'msrow' => 1, - 'mstack' => 1, - 'mstyle' => 1, - 'msub' => 1, - 'msup' => 1, - 'msubsup' => 1, - 'mtable' => 1, - 'mtd' => 1, - 'mtext' => 1, - 'mtr' => 1, - 'munder' => 1, - 'munderover' => 1, - ); - - /** - * The svg elements. - * - * The Mozilla documentation has a good list at https://developer.mozilla.org/en-US/docs/SVG/Element. - * The w3c list appears to be lacking in some areas like filter effect elements. - * That list can be found at http://www.w3.org/wiki/SVG/Elements. - * - * Note, FireFox appears to do a better job rendering filter effects than chrome. - * While they are in the spec I'm not sure how widely implemented they are. - * - * @var array - */ - public static $svg = array( - 'a' => 1, - 'altGlyph' => 1, - 'altGlyphDef' => 1, - 'altGlyphItem' => 1, - 'animate' => 1, - 'animateColor' => 1, - 'animateMotion' => 1, - 'animateTransform' => 1, - 'circle' => 1, - 'clipPath' => 1, - 'color-profile' => 1, - 'cursor' => 1, - 'defs' => 1, - 'desc' => 1, - 'ellipse' => 1, - 'feBlend' => 1, - 'feColorMatrix' => 1, - 'feComponentTransfer' => 1, - 'feComposite' => 1, - 'feConvolveMatrix' => 1, - 'feDiffuseLighting' => 1, - 'feDisplacementMap' => 1, - 'feDistantLight' => 1, - 'feFlood' => 1, - 'feFuncA' => 1, - 'feFuncB' => 1, - 'feFuncG' => 1, - 'feFuncR' => 1, - 'feGaussianBlur' => 1, - 'feImage' => 1, - 'feMerge' => 1, - 'feMergeNode' => 1, - 'feMorphology' => 1, - 'feOffset' => 1, - 'fePointLight' => 1, - 'feSpecularLighting' => 1, - 'feSpotLight' => 1, - 'feTile' => 1, - 'feTurbulence' => 1, - 'filter' => 1, - 'font' => 1, - 'font-face' => 1, - 'font-face-format' => 1, - 'font-face-name' => 1, - 'font-face-src' => 1, - 'font-face-uri' => 1, - 'foreignObject' => 1, - 'g' => 1, - 'glyph' => 1, - 'glyphRef' => 1, - 'hkern' => 1, - 'image' => 1, - 'line' => 1, - 'linearGradient' => 1, - 'marker' => 1, - 'mask' => 1, - 'metadata' => 1, - 'missing-glyph' => 1, - 'mpath' => 1, - 'path' => 1, - 'pattern' => 1, - 'polygon' => 1, - 'polyline' => 1, - 'radialGradient' => 1, - 'rect' => 1, - 'script' => 3, // NORMAL | RAW_TEXT - 'set' => 1, - 'stop' => 1, - 'style' => 3, // NORMAL | RAW_TEXT - 'svg' => 1, - 'switch' => 1, - 'symbol' => 1, - 'text' => 1, - 'textPath' => 1, - 'title' => 1, - 'tref' => 1, - 'tspan' => 1, - 'use' => 1, - 'view' => 1, - 'vkern' => 1, - ); - - /** - * Some attributes in SVG are case sensitive. - * - * This map contains key/value pairs with the key as the lowercase attribute - * name and the value with the correct casing. - */ - public static $svgCaseSensitiveAttributeMap = array( - 'attributename' => 'attributeName', - 'attributetype' => 'attributeType', - 'basefrequency' => 'baseFrequency', - 'baseprofile' => 'baseProfile', - 'calcmode' => 'calcMode', - 'clippathunits' => 'clipPathUnits', - 'contentscripttype' => 'contentScriptType', - 'contentstyletype' => 'contentStyleType', - 'diffuseconstant' => 'diffuseConstant', - 'edgemode' => 'edgeMode', - 'externalresourcesrequired' => 'externalResourcesRequired', - 'filterres' => 'filterRes', - 'filterunits' => 'filterUnits', - 'glyphref' => 'glyphRef', - 'gradienttransform' => 'gradientTransform', - 'gradientunits' => 'gradientUnits', - 'kernelmatrix' => 'kernelMatrix', - 'kernelunitlength' => 'kernelUnitLength', - 'keypoints' => 'keyPoints', - 'keysplines' => 'keySplines', - 'keytimes' => 'keyTimes', - 'lengthadjust' => 'lengthAdjust', - 'limitingconeangle' => 'limitingConeAngle', - 'markerheight' => 'markerHeight', - 'markerunits' => 'markerUnits', - 'markerwidth' => 'markerWidth', - 'maskcontentunits' => 'maskContentUnits', - 'maskunits' => 'maskUnits', - 'numoctaves' => 'numOctaves', - 'pathlength' => 'pathLength', - 'patterncontentunits' => 'patternContentUnits', - 'patterntransform' => 'patternTransform', - 'patternunits' => 'patternUnits', - 'pointsatx' => 'pointsAtX', - 'pointsaty' => 'pointsAtY', - 'pointsatz' => 'pointsAtZ', - 'preservealpha' => 'preserveAlpha', - 'preserveaspectratio' => 'preserveAspectRatio', - 'primitiveunits' => 'primitiveUnits', - 'refx' => 'refX', - 'refy' => 'refY', - 'repeatcount' => 'repeatCount', - 'repeatdur' => 'repeatDur', - 'requiredextensions' => 'requiredExtensions', - 'requiredfeatures' => 'requiredFeatures', - 'specularconstant' => 'specularConstant', - 'specularexponent' => 'specularExponent', - 'spreadmethod' => 'spreadMethod', - 'startoffset' => 'startOffset', - 'stddeviation' => 'stdDeviation', - 'stitchtiles' => 'stitchTiles', - 'surfacescale' => 'surfaceScale', - 'systemlanguage' => 'systemLanguage', - 'tablevalues' => 'tableValues', - 'targetx' => 'targetX', - 'targety' => 'targetY', - 'textlength' => 'textLength', - 'viewbox' => 'viewBox', - 'viewtarget' => 'viewTarget', - 'xchannelselector' => 'xChannelSelector', - 'ychannelselector' => 'yChannelSelector', - 'zoomandpan' => 'zoomAndPan', - ); - - /** - * Some SVG elements are case sensitive. - * This map contains these. - * - * The map contains key/value store of the name is lowercase as the keys and - * the correct casing as the value. - */ - public static $svgCaseSensitiveElementMap = array( - 'altglyph' => 'altGlyph', - 'altglyphdef' => 'altGlyphDef', - 'altglyphitem' => 'altGlyphItem', - 'animatecolor' => 'animateColor', - 'animatemotion' => 'animateMotion', - 'animatetransform' => 'animateTransform', - 'clippath' => 'clipPath', - 'feblend' => 'feBlend', - 'fecolormatrix' => 'feColorMatrix', - 'fecomponenttransfer' => 'feComponentTransfer', - 'fecomposite' => 'feComposite', - 'feconvolvematrix' => 'feConvolveMatrix', - 'fediffuselighting' => 'feDiffuseLighting', - 'fedisplacementmap' => 'feDisplacementMap', - 'fedistantlight' => 'feDistantLight', - 'feflood' => 'feFlood', - 'fefunca' => 'feFuncA', - 'fefuncb' => 'feFuncB', - 'fefuncg' => 'feFuncG', - 'fefuncr' => 'feFuncR', - 'fegaussianblur' => 'feGaussianBlur', - 'feimage' => 'feImage', - 'femerge' => 'feMerge', - 'femergenode' => 'feMergeNode', - 'femorphology' => 'feMorphology', - 'feoffset' => 'feOffset', - 'fepointlight' => 'fePointLight', - 'fespecularlighting' => 'feSpecularLighting', - 'fespotlight' => 'feSpotLight', - 'fetile' => 'feTile', - 'feturbulence' => 'feTurbulence', - 'foreignobject' => 'foreignObject', - 'glyphref' => 'glyphRef', - 'lineargradient' => 'linearGradient', - 'radialgradient' => 'radialGradient', - 'textpath' => 'textPath', - ); - - /** - * Check whether the given element meets the given criterion. - * - * Example: - * - * Elements::isA('script', Elements::TEXT_RAW); // Returns true. - * - * Elements::isA('script', Elements::TEXT_RCDATA); // Returns false. - * - * @param string $name The element name. - * @param int $mask One of the constants on this class. - * - * @return bool true if the element matches the mask, false otherwise. - */ - public static function isA($name, $mask) - { - return (static::element($name) & $mask) === $mask; - } - - /** - * Test if an element is a valid html5 element. - * - * @param string $name The name of the element. - * - * @return bool true if a html5 element and false otherwise. - */ - public static function isHtml5Element($name) - { - // html5 element names are case insensitive. Forcing lowercase for the check. - // Do we need this check or will all data passed here already be lowercase? - return isset(static::$html5[strtolower($name)]); - } - - /** - * Test if an element name is a valid MathML presentation element. - * - * @param string $name The name of the element. - * - * @return bool true if a MathML name and false otherwise. - */ - public static function isMathMLElement($name) - { - // MathML is case-sensitive unlike html5 elements. - return isset(static::$mathml[$name]); - } - - /** - * Test if an element is a valid SVG element. - * - * @param string $name The name of the element. - * - * @return bool true if a SVG element and false otherise. - */ - public static function isSvgElement($name) - { - // SVG is case-sensitive unlike html5 elements. - return isset(static::$svg[$name]); - } - - /** - * Is an element name valid in an html5 document. - * This includes html5 elements along with other allowed embedded content - * such as svg and mathml. - * - * @param string $name The name of the element. - * - * @return bool true if valid and false otherwise. - */ - public static function isElement($name) - { - return static::isHtml5Element($name) || static::isMathMLElement($name) || static::isSvgElement($name); - } - - /** - * Get the element mask for the given element name. - * - * @param string $name The name of the element. - * - * @return int the element mask. - */ - public static function element($name) - { - if (isset(static::$html5[$name])) { - return static::$html5[$name]; - } - if (isset(static::$svg[$name])) { - return static::$svg[$name]; - } - if (isset(static::$mathml[$name])) { - return static::$mathml[$name]; - } - - return 0; - } - - /** - * Normalize a SVG element name to its proper case and form. - * - * @param string $name The name of the element. - * - * @return string the normalized form of the element name. - */ - public static function normalizeSvgElement($name) - { - $name = strtolower($name); - if (isset(static::$svgCaseSensitiveElementMap[$name])) { - $name = static::$svgCaseSensitiveElementMap[$name]; - } - - return $name; - } - - /** - * Normalize a SVG attribute name to its proper case and form. - * - * @param string $name The name of the attribute. - * - * @return string The normalized form of the attribute name. - */ - public static function normalizeSvgAttribute($name) - { - $name = strtolower($name); - if (isset(static::$svgCaseSensitiveAttributeMap[$name])) { - $name = static::$svgCaseSensitiveAttributeMap[$name]; - } - - return $name; - } - - /** - * Normalize a MathML attribute name to its proper case and form. - * Note, all MathML element names are lowercase. - * - * @param string $name The name of the attribute. - * - * @return string The normalized form of the attribute name. - */ - public static function normalizeMathMlAttribute($name) - { - $name = strtolower($name); - - // Only one attribute has a mixed case form for MathML. - if ('definitionurl' === $name) { - $name = 'definitionURL'; - } - - return $name; - } -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Entities.php b/dompdf/vendor/masterminds/html5/src/HTML5/Entities.php deleted file mode 100644 index 0e7227d..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Entities.php +++ /dev/null @@ -1,2236 +0,0 @@ - 'Á', - 'Aacut' => 'Á', - 'aacute' => 'á', - 'aacut' => 'á', - 'Abreve' => 'Ă', - 'abreve' => 'ă', - 'ac' => '∾', - 'acd' => '∿', - 'acE' => '∾̳', - 'Acirc' => 'Â', - 'Acir' => 'Â', - 'acirc' => 'â', - 'acir' => 'â', - 'acute' => '´', - 'acut' => '´', - 'Acy' => 'А', - 'acy' => 'а', - 'AElig' => 'Æ', - 'AEli' => 'Æ', - 'aelig' => 'æ', - 'aeli' => 'æ', - 'af' => '⁡', - 'Afr' => '𝔄', - 'afr' => '𝔞', - 'Agrave' => 'À', - 'Agrav' => 'À', - 'agrave' => 'à', - 'agrav' => 'à', - 'alefsym' => 'ℵ', - 'aleph' => 'ℵ', - 'Alpha' => 'Α', - 'alpha' => 'α', - 'Amacr' => 'Ā', - 'amacr' => 'ā', - 'amalg' => '⨿', - 'AMP' => '&', - 'AM' => '&', - 'amp' => '&', - 'am' => '&', - 'And' => '⩓', - 'and' => '∧', - 'andand' => '⩕', - 'andd' => '⩜', - 'andslope' => '⩘', - 'andv' => '⩚', - 'ang' => '∠', - 'ange' => '⦤', - 'angle' => '∠', - 'angmsd' => '∡', - 'angmsdaa' => '⦨', - 'angmsdab' => '⦩', - 'angmsdac' => '⦪', - 'angmsdad' => '⦫', - 'angmsdae' => '⦬', - 'angmsdaf' => '⦭', - 'angmsdag' => '⦮', - 'angmsdah' => '⦯', - 'angrt' => '∟', - 'angrtvb' => '⊾', - 'angrtvbd' => '⦝', - 'angsph' => '∢', - 'angst' => 'Å', - 'angzarr' => '⍼', - 'Aogon' => 'Ą', - 'aogon' => 'ą', - 'Aopf' => '𝔸', - 'aopf' => '𝕒', - 'ap' => '≈', - 'apacir' => '⩯', - 'apE' => '⩰', - 'ape' => '≊', - 'apid' => '≋', - 'apos' => '\'', - 'ApplyFunction' => '⁡', - 'approx' => '≈', - 'approxeq' => '≊', - 'Aring' => 'Å', - 'Arin' => 'Å', - 'aring' => 'å', - 'arin' => 'å', - 'Ascr' => '𝒜', - 'ascr' => '𝒶', - 'Assign' => '≔', - 'ast' => '*', - 'asymp' => '≈', - 'asympeq' => '≍', - 'Atilde' => 'Ã', - 'Atild' => 'Ã', - 'atilde' => 'ã', - 'atild' => 'ã', - 'Auml' => 'Ä', - 'Aum' => 'Ä', - 'auml' => 'ä', - 'aum' => 'ä', - 'awconint' => '∳', - 'awint' => '⨑', - 'backcong' => '≌', - 'backepsilon' => '϶', - 'backprime' => '‵', - 'backsim' => '∽', - 'backsimeq' => '⋍', - 'Backslash' => '∖', - 'Barv' => '⫧', - 'barvee' => '⊽', - 'Barwed' => '⌆', - 'barwed' => '⌅', - 'barwedge' => '⌅', - 'bbrk' => '⎵', - 'bbrktbrk' => '⎶', - 'bcong' => '≌', - 'Bcy' => 'Б', - 'bcy' => 'б', - 'bdquo' => '„', - 'becaus' => '∵', - 'Because' => '∵', - 'because' => '∵', - 'bemptyv' => '⦰', - 'bepsi' => '϶', - 'bernou' => 'ℬ', - 'Bernoullis' => 'ℬ', - 'Beta' => 'Β', - 'beta' => 'β', - 'beth' => 'ℶ', - 'between' => '≬', - 'Bfr' => '𝔅', - 'bfr' => '𝔟', - 'bigcap' => '⋂', - 'bigcirc' => '◯', - 'bigcup' => '⋃', - 'bigodot' => '⨀', - 'bigoplus' => '⨁', - 'bigotimes' => '⨂', - 'bigsqcup' => '⨆', - 'bigstar' => '★', - 'bigtriangledown' => '▽', - 'bigtriangleup' => '△', - 'biguplus' => '⨄', - 'bigvee' => '⋁', - 'bigwedge' => '⋀', - 'bkarow' => '⤍', - 'blacklozenge' => '⧫', - 'blacksquare' => '▪', - 'blacktriangle' => '▴', - 'blacktriangledown' => '▾', - 'blacktriangleleft' => '◂', - 'blacktriangleright' => '▸', - 'blank' => '␣', - 'blk12' => '▒', - 'blk14' => '░', - 'blk34' => '▓', - 'block' => '█', - 'bne' => '=⃥', - 'bnequiv' => '≡⃥', - 'bNot' => '⫭', - 'bnot' => '⌐', - 'Bopf' => '𝔹', - 'bopf' => '𝕓', - 'bot' => '⊥', - 'bottom' => '⊥', - 'bowtie' => '⋈', - 'boxbox' => '⧉', - 'boxDL' => '╗', - 'boxDl' => '╖', - 'boxdL' => '╕', - 'boxdl' => '┐', - 'boxDR' => '╔', - 'boxDr' => '╓', - 'boxdR' => '╒', - 'boxdr' => '┌', - 'boxH' => '═', - 'boxh' => '─', - 'boxHD' => '╦', - 'boxHd' => '╤', - 'boxhD' => '╥', - 'boxhd' => '┬', - 'boxHU' => '╩', - 'boxHu' => '╧', - 'boxhU' => '╨', - 'boxhu' => '┴', - 'boxminus' => '⊟', - 'boxplus' => '⊞', - 'boxtimes' => '⊠', - 'boxUL' => '╝', - 'boxUl' => '╜', - 'boxuL' => '╛', - 'boxul' => '┘', - 'boxUR' => '╚', - 'boxUr' => '╙', - 'boxuR' => '╘', - 'boxur' => '└', - 'boxV' => '║', - 'boxv' => '│', - 'boxVH' => '╬', - 'boxVh' => '╫', - 'boxvH' => '╪', - 'boxvh' => '┼', - 'boxVL' => '╣', - 'boxVl' => '╢', - 'boxvL' => '╡', - 'boxvl' => '┤', - 'boxVR' => '╠', - 'boxVr' => '╟', - 'boxvR' => '╞', - 'boxvr' => '├', - 'bprime' => '‵', - 'Breve' => '˘', - 'breve' => '˘', - 'brvbar' => '¦', - 'brvba' => '¦', - 'Bscr' => 'ℬ', - 'bscr' => '𝒷', - 'bsemi' => '⁏', - 'bsim' => '∽', - 'bsime' => '⋍', - 'bsol' => '\\', - 'bsolb' => '⧅', - 'bsolhsub' => '⟈', - 'bull' => '•', - 'bullet' => '•', - 'bump' => '≎', - 'bumpE' => '⪮', - 'bumpe' => '≏', - 'Bumpeq' => '≎', - 'bumpeq' => '≏', - 'Cacute' => 'Ć', - 'cacute' => 'ć', - 'Cap' => '⋒', - 'cap' => '∩', - 'capand' => '⩄', - 'capbrcup' => '⩉', - 'capcap' => '⩋', - 'capcup' => '⩇', - 'capdot' => '⩀', - 'CapitalDifferentialD' => 'ⅅ', - 'caps' => '∩︀', - 'caret' => '⁁', - 'caron' => 'ˇ', - 'Cayleys' => 'ℭ', - 'ccaps' => '⩍', - 'Ccaron' => 'Č', - 'ccaron' => 'č', - 'Ccedil' => 'Ç', - 'Ccedi' => 'Ç', - 'ccedil' => 'ç', - 'ccedi' => 'ç', - 'Ccirc' => 'Ĉ', - 'ccirc' => 'ĉ', - 'Cconint' => '∰', - 'ccups' => '⩌', - 'ccupssm' => '⩐', - 'Cdot' => 'Ċ', - 'cdot' => 'ċ', - 'cedil' => '¸', - 'cedi' => '¸', - 'Cedilla' => '¸', - 'cemptyv' => '⦲', - 'cent' => '¢', - 'cen' => '¢', - 'CenterDot' => '·', - 'centerdot' => '·', - 'Cfr' => 'ℭ', - 'cfr' => '𝔠', - 'CHcy' => 'Ч', - 'chcy' => 'ч', - 'check' => '✓', - 'checkmark' => '✓', - 'Chi' => 'Χ', - 'chi' => 'χ', - 'cir' => '○', - 'circ' => 'ˆ', - 'circeq' => '≗', - 'circlearrowleft' => '↺', - 'circlearrowright' => '↻', - 'circledast' => '⊛', - 'circledcirc' => '⊚', - 'circleddash' => '⊝', - 'CircleDot' => '⊙', - 'circledR' => '®', - 'circledS' => 'Ⓢ', - 'CircleMinus' => '⊖', - 'CirclePlus' => '⊕', - 'CircleTimes' => '⊗', - 'cirE' => '⧃', - 'cire' => '≗', - 'cirfnint' => '⨐', - 'cirmid' => '⫯', - 'cirscir' => '⧂', - 'ClockwiseContourIntegral' => '∲', - 'CloseCurlyDoubleQuote' => '”', - 'CloseCurlyQuote' => '’', - 'clubs' => '♣', - 'clubsuit' => '♣', - 'Colon' => '∷', - 'colon' => ':', - 'Colone' => '⩴', - 'colone' => '≔', - 'coloneq' => '≔', - 'comma' => ',', - 'commat' => '@', - 'comp' => '∁', - 'compfn' => '∘', - 'complement' => '∁', - 'complexes' => 'ℂ', - 'cong' => '≅', - 'congdot' => '⩭', - 'Congruent' => '≡', - 'Conint' => '∯', - 'conint' => '∮', - 'ContourIntegral' => '∮', - 'Copf' => 'ℂ', - 'copf' => '𝕔', - 'coprod' => '∐', - 'Coproduct' => '∐', - 'COPY' => '©', - 'COP' => '©', - 'copy' => '©', - 'cop' => '©', - 'copysr' => '℗', - 'CounterClockwiseContourIntegral' => '∳', - 'crarr' => '↵', - 'Cross' => '⨯', - 'cross' => '✗', - 'Cscr' => '𝒞', - 'cscr' => '𝒸', - 'csub' => '⫏', - 'csube' => '⫑', - 'csup' => '⫐', - 'csupe' => '⫒', - 'ctdot' => '⋯', - 'cudarrl' => '⤸', - 'cudarrr' => '⤵', - 'cuepr' => '⋞', - 'cuesc' => '⋟', - 'cularr' => '↶', - 'cularrp' => '⤽', - 'Cup' => '⋓', - 'cup' => '∪', - 'cupbrcap' => '⩈', - 'CupCap' => '≍', - 'cupcap' => '⩆', - 'cupcup' => '⩊', - 'cupdot' => '⊍', - 'cupor' => '⩅', - 'cups' => '∪︀', - 'curarr' => '↷', - 'curarrm' => '⤼', - 'curlyeqprec' => '⋞', - 'curlyeqsucc' => '⋟', - 'curlyvee' => '⋎', - 'curlywedge' => '⋏', - 'curren' => '¤', - 'curre' => '¤', - 'curvearrowleft' => '↶', - 'curvearrowright' => '↷', - 'cuvee' => '⋎', - 'cuwed' => '⋏', - 'cwconint' => '∲', - 'cwint' => '∱', - 'cylcty' => '⌭', - 'Dagger' => '‡', - 'dagger' => '†', - 'daleth' => 'ℸ', - 'Darr' => '↡', - 'dArr' => '⇓', - 'darr' => '↓', - 'dash' => '‐', - 'Dashv' => '⫤', - 'dashv' => '⊣', - 'dbkarow' => '⤏', - 'dblac' => '˝', - 'Dcaron' => 'Ď', - 'dcaron' => 'ď', - 'Dcy' => 'Д', - 'dcy' => 'д', - 'DD' => 'ⅅ', - 'dd' => 'ⅆ', - 'ddagger' => '‡', - 'ddarr' => '⇊', - 'DDotrahd' => '⤑', - 'ddotseq' => '⩷', - 'deg' => '°', - 'de' => '°', - 'Del' => '∇', - 'Delta' => 'Δ', - 'delta' => 'δ', - 'demptyv' => '⦱', - 'dfisht' => '⥿', - 'Dfr' => '𝔇', - 'dfr' => '𝔡', - 'dHar' => '⥥', - 'dharl' => '⇃', - 'dharr' => '⇂', - 'DiacriticalAcute' => '´', - 'DiacriticalDot' => '˙', - 'DiacriticalDoubleAcute' => '˝', - 'DiacriticalGrave' => '`', - 'DiacriticalTilde' => '˜', - 'diam' => '⋄', - 'Diamond' => '⋄', - 'diamond' => '⋄', - 'diamondsuit' => '♦', - 'diams' => '♦', - 'die' => '¨', - 'DifferentialD' => 'ⅆ', - 'digamma' => 'ϝ', - 'disin' => '⋲', - 'div' => '÷', - 'divide' => '÷', - 'divid' => '÷', - 'divideontimes' => '⋇', - 'divonx' => '⋇', - 'DJcy' => 'Ђ', - 'djcy' => 'ђ', - 'dlcorn' => '⌞', - 'dlcrop' => '⌍', - 'dollar' => '$', - 'Dopf' => '𝔻', - 'dopf' => '𝕕', - 'Dot' => '¨', - 'dot' => '˙', - 'DotDot' => '⃜', - 'doteq' => '≐', - 'doteqdot' => '≑', - 'DotEqual' => '≐', - 'dotminus' => '∸', - 'dotplus' => '∔', - 'dotsquare' => '⊡', - 'doublebarwedge' => '⌆', - 'DoubleContourIntegral' => '∯', - 'DoubleDot' => '¨', - 'DoubleDownArrow' => '⇓', - 'DoubleLeftArrow' => '⇐', - 'DoubleLeftRightArrow' => '⇔', - 'DoubleLeftTee' => '⫤', - 'DoubleLongLeftArrow' => '⟸', - 'DoubleLongLeftRightArrow' => '⟺', - 'DoubleLongRightArrow' => '⟹', - 'DoubleRightArrow' => '⇒', - 'DoubleRightTee' => '⊨', - 'DoubleUpArrow' => '⇑', - 'DoubleUpDownArrow' => '⇕', - 'DoubleVerticalBar' => '∥', - 'DownArrow' => '↓', - 'Downarrow' => '⇓', - 'downarrow' => '↓', - 'DownArrowBar' => '⤓', - 'DownArrowUpArrow' => '⇵', - 'DownBreve' => '̑', - 'downdownarrows' => '⇊', - 'downharpoonleft' => '⇃', - 'downharpoonright' => '⇂', - 'DownLeftRightVector' => '⥐', - 'DownLeftTeeVector' => '⥞', - 'DownLeftVector' => '↽', - 'DownLeftVectorBar' => '⥖', - 'DownRightTeeVector' => '⥟', - 'DownRightVector' => '⇁', - 'DownRightVectorBar' => '⥗', - 'DownTee' => '⊤', - 'DownTeeArrow' => '↧', - 'drbkarow' => '⤐', - 'drcorn' => '⌟', - 'drcrop' => '⌌', - 'Dscr' => '𝒟', - 'dscr' => '𝒹', - 'DScy' => 'Ѕ', - 'dscy' => 'ѕ', - 'dsol' => '⧶', - 'Dstrok' => 'Đ', - 'dstrok' => 'đ', - 'dtdot' => '⋱', - 'dtri' => '▿', - 'dtrif' => '▾', - 'duarr' => '⇵', - 'duhar' => '⥯', - 'dwangle' => '⦦', - 'DZcy' => 'Џ', - 'dzcy' => 'џ', - 'dzigrarr' => '⟿', - 'Eacute' => 'É', - 'Eacut' => 'É', - 'eacute' => 'é', - 'eacut' => 'é', - 'easter' => '⩮', - 'Ecaron' => 'Ě', - 'ecaron' => 'ě', - 'ecir' => 'ê', - 'Ecirc' => 'Ê', - 'Ecir' => 'Ê', - 'ecirc' => 'ê', - 'ecolon' => '≕', - 'Ecy' => 'Э', - 'ecy' => 'э', - 'eDDot' => '⩷', - 'Edot' => 'Ė', - 'eDot' => '≑', - 'edot' => 'ė', - 'ee' => 'ⅇ', - 'efDot' => '≒', - 'Efr' => '𝔈', - 'efr' => '𝔢', - 'eg' => '⪚', - 'Egrave' => 'È', - 'Egrav' => 'È', - 'egrave' => 'è', - 'egrav' => 'è', - 'egs' => '⪖', - 'egsdot' => '⪘', - 'el' => '⪙', - 'Element' => '∈', - 'elinters' => '⏧', - 'ell' => 'ℓ', - 'els' => '⪕', - 'elsdot' => '⪗', - 'Emacr' => 'Ē', - 'emacr' => 'ē', - 'empty' => '∅', - 'emptyset' => '∅', - 'EmptySmallSquare' => '◻', - 'emptyv' => '∅', - 'EmptyVerySmallSquare' => '▫', - 'emsp' => ' ', - 'emsp13' => ' ', - 'emsp14' => ' ', - 'ENG' => 'Ŋ', - 'eng' => 'ŋ', - 'ensp' => ' ', - 'Eogon' => 'Ę', - 'eogon' => 'ę', - 'Eopf' => '𝔼', - 'eopf' => '𝕖', - 'epar' => '⋕', - 'eparsl' => '⧣', - 'eplus' => '⩱', - 'epsi' => 'ε', - 'Epsilon' => 'Ε', - 'epsilon' => 'ε', - 'epsiv' => 'ϵ', - 'eqcirc' => '≖', - 'eqcolon' => '≕', - 'eqsim' => '≂', - 'eqslantgtr' => '⪖', - 'eqslantless' => '⪕', - 'Equal' => '⩵', - 'equals' => '=', - 'EqualTilde' => '≂', - 'equest' => '≟', - 'Equilibrium' => '⇌', - 'equiv' => '≡', - 'equivDD' => '⩸', - 'eqvparsl' => '⧥', - 'erarr' => '⥱', - 'erDot' => '≓', - 'Escr' => 'ℰ', - 'escr' => 'ℯ', - 'esdot' => '≐', - 'Esim' => '⩳', - 'esim' => '≂', - 'Eta' => 'Η', - 'eta' => 'η', - 'ETH' => 'Ð', - 'ET' => 'Ð', - 'eth' => 'ð', - 'et' => 'ð', - 'Euml' => 'Ë', - 'Eum' => 'Ë', - 'euml' => 'ë', - 'eum' => 'ë', - 'euro' => '€', - 'excl' => '!', - 'exist' => '∃', - 'Exists' => '∃', - 'expectation' => 'ℰ', - 'ExponentialE' => 'ⅇ', - 'exponentiale' => 'ⅇ', - 'fallingdotseq' => '≒', - 'Fcy' => 'Ф', - 'fcy' => 'ф', - 'female' => '♀', - 'ffilig' => 'ffi', - 'fflig' => 'ff', - 'ffllig' => 'ffl', - 'Ffr' => '𝔉', - 'ffr' => '𝔣', - 'filig' => 'fi', - 'FilledSmallSquare' => '◼', - 'FilledVerySmallSquare' => '▪', - 'fjlig' => 'fj', - 'flat' => '♭', - 'fllig' => 'fl', - 'fltns' => '▱', - 'fnof' => 'ƒ', - 'Fopf' => '𝔽', - 'fopf' => '𝕗', - 'ForAll' => '∀', - 'forall' => '∀', - 'fork' => '⋔', - 'forkv' => '⫙', - 'Fouriertrf' => 'ℱ', - 'fpartint' => '⨍', - 'frac12' => '½', - 'frac1' => '¼', - 'frac13' => '⅓', - 'frac14' => '¼', - 'frac15' => '⅕', - 'frac16' => '⅙', - 'frac18' => '⅛', - 'frac23' => '⅔', - 'frac25' => '⅖', - 'frac34' => '¾', - 'frac3' => '¾', - 'frac35' => '⅗', - 'frac38' => '⅜', - 'frac45' => '⅘', - 'frac56' => '⅚', - 'frac58' => '⅝', - 'frac78' => '⅞', - 'frasl' => '⁄', - 'frown' => '⌢', - 'Fscr' => 'ℱ', - 'fscr' => '𝒻', - 'gacute' => 'ǵ', - 'Gamma' => 'Γ', - 'gamma' => 'γ', - 'Gammad' => 'Ϝ', - 'gammad' => 'ϝ', - 'gap' => '⪆', - 'Gbreve' => 'Ğ', - 'gbreve' => 'ğ', - 'Gcedil' => 'Ģ', - 'Gcirc' => 'Ĝ', - 'gcirc' => 'ĝ', - 'Gcy' => 'Г', - 'gcy' => 'г', - 'Gdot' => 'Ġ', - 'gdot' => 'ġ', - 'gE' => '≧', - 'ge' => '≥', - 'gEl' => '⪌', - 'gel' => '⋛', - 'geq' => '≥', - 'geqq' => '≧', - 'geqslant' => '⩾', - 'ges' => '⩾', - 'gescc' => '⪩', - 'gesdot' => '⪀', - 'gesdoto' => '⪂', - 'gesdotol' => '⪄', - 'gesl' => '⋛︀', - 'gesles' => '⪔', - 'Gfr' => '𝔊', - 'gfr' => '𝔤', - 'Gg' => '⋙', - 'gg' => '≫', - 'ggg' => '⋙', - 'gimel' => 'ℷ', - 'GJcy' => 'Ѓ', - 'gjcy' => 'ѓ', - 'gl' => '≷', - 'gla' => '⪥', - 'glE' => '⪒', - 'glj' => '⪤', - 'gnap' => '⪊', - 'gnapprox' => '⪊', - 'gnE' => '≩', - 'gne' => '⪈', - 'gneq' => '⪈', - 'gneqq' => '≩', - 'gnsim' => '⋧', - 'Gopf' => '𝔾', - 'gopf' => '𝕘', - 'grave' => '`', - 'GreaterEqual' => '≥', - 'GreaterEqualLess' => '⋛', - 'GreaterFullEqual' => '≧', - 'GreaterGreater' => '⪢', - 'GreaterLess' => '≷', - 'GreaterSlantEqual' => '⩾', - 'GreaterTilde' => '≳', - 'Gscr' => '𝒢', - 'gscr' => 'ℊ', - 'gsim' => '≳', - 'gsime' => '⪎', - 'gsiml' => '⪐', - 'GT' => '>', - 'G' => '>', - 'Gt' => '≫', - 'gt' => '>', - 'g' => '>', - 'gtcc' => '⪧', - 'gtcir' => '⩺', - 'gtdot' => '⋗', - 'gtlPar' => '⦕', - 'gtquest' => '⩼', - 'gtrapprox' => '⪆', - 'gtrarr' => '⥸', - 'gtrdot' => '⋗', - 'gtreqless' => '⋛', - 'gtreqqless' => '⪌', - 'gtrless' => '≷', - 'gtrsim' => '≳', - 'gvertneqq' => '≩︀', - 'gvnE' => '≩︀', - 'Hacek' => 'ˇ', - 'hairsp' => ' ', - 'half' => '½', - 'hamilt' => 'ℋ', - 'HARDcy' => 'Ъ', - 'hardcy' => 'ъ', - 'hArr' => '⇔', - 'harr' => '↔', - 'harrcir' => '⥈', - 'harrw' => '↭', - 'Hat' => '^', - 'hbar' => 'ℏ', - 'Hcirc' => 'Ĥ', - 'hcirc' => 'ĥ', - 'hearts' => '♥', - 'heartsuit' => '♥', - 'hellip' => '…', - 'hercon' => '⊹', - 'Hfr' => 'ℌ', - 'hfr' => '𝔥', - 'HilbertSpace' => 'ℋ', - 'hksearow' => '⤥', - 'hkswarow' => '⤦', - 'hoarr' => '⇿', - 'homtht' => '∻', - 'hookleftarrow' => '↩', - 'hookrightarrow' => '↪', - 'Hopf' => 'ℍ', - 'hopf' => '𝕙', - 'horbar' => '―', - 'HorizontalLine' => '─', - 'Hscr' => 'ℋ', - 'hscr' => '𝒽', - 'hslash' => 'ℏ', - 'Hstrok' => 'Ħ', - 'hstrok' => 'ħ', - 'HumpDownHump' => '≎', - 'HumpEqual' => '≏', - 'hybull' => '⁃', - 'hyphen' => '‐', - 'Iacute' => 'Í', - 'Iacut' => 'Í', - 'iacute' => 'í', - 'iacut' => 'í', - 'ic' => '⁣', - 'Icirc' => 'Î', - 'Icir' => 'Î', - 'icirc' => 'î', - 'icir' => 'î', - 'Icy' => 'И', - 'icy' => 'и', - 'Idot' => 'İ', - 'IEcy' => 'Е', - 'iecy' => 'е', - 'iexcl' => '¡', - 'iexc' => '¡', - 'iff' => '⇔', - 'Ifr' => 'ℑ', - 'ifr' => '𝔦', - 'Igrave' => 'Ì', - 'Igrav' => 'Ì', - 'igrave' => 'ì', - 'igrav' => 'ì', - 'ii' => 'ⅈ', - 'iiiint' => '⨌', - 'iiint' => '∭', - 'iinfin' => '⧜', - 'iiota' => '℩', - 'IJlig' => 'IJ', - 'ijlig' => 'ij', - 'Im' => 'ℑ', - 'Imacr' => 'Ī', - 'imacr' => 'ī', - 'image' => 'ℑ', - 'ImaginaryI' => 'ⅈ', - 'imagline' => 'ℐ', - 'imagpart' => 'ℑ', - 'imath' => 'ı', - 'imof' => '⊷', - 'imped' => 'Ƶ', - 'Implies' => '⇒', - 'in' => '∈', - 'incare' => '℅', - 'infin' => '∞', - 'infintie' => '⧝', - 'inodot' => 'ı', - 'Int' => '∬', - 'int' => '∫', - 'intcal' => '⊺', - 'integers' => 'ℤ', - 'Integral' => '∫', - 'intercal' => '⊺', - 'Intersection' => '⋂', - 'intlarhk' => '⨗', - 'intprod' => '⨼', - 'InvisibleComma' => '⁣', - 'InvisibleTimes' => '⁢', - 'IOcy' => 'Ё', - 'iocy' => 'ё', - 'Iogon' => 'Į', - 'iogon' => 'į', - 'Iopf' => '𝕀', - 'iopf' => '𝕚', - 'Iota' => 'Ι', - 'iota' => 'ι', - 'iprod' => '⨼', - 'iquest' => '¿', - 'iques' => '¿', - 'Iscr' => 'ℐ', - 'iscr' => '𝒾', - 'isin' => '∈', - 'isindot' => '⋵', - 'isinE' => '⋹', - 'isins' => '⋴', - 'isinsv' => '⋳', - 'isinv' => '∈', - 'it' => '⁢', - 'Itilde' => 'Ĩ', - 'itilde' => 'ĩ', - 'Iukcy' => 'І', - 'iukcy' => 'і', - 'Iuml' => 'Ï', - 'Ium' => 'Ï', - 'iuml' => 'ï', - 'ium' => 'ï', - 'Jcirc' => 'Ĵ', - 'jcirc' => 'ĵ', - 'Jcy' => 'Й', - 'jcy' => 'й', - 'Jfr' => '𝔍', - 'jfr' => '𝔧', - 'jmath' => 'ȷ', - 'Jopf' => '𝕁', - 'jopf' => '𝕛', - 'Jscr' => '𝒥', - 'jscr' => '𝒿', - 'Jsercy' => 'Ј', - 'jsercy' => 'ј', - 'Jukcy' => 'Є', - 'jukcy' => 'є', - 'Kappa' => 'Κ', - 'kappa' => 'κ', - 'kappav' => 'ϰ', - 'Kcedil' => 'Ķ', - 'kcedil' => 'ķ', - 'Kcy' => 'К', - 'kcy' => 'к', - 'Kfr' => '𝔎', - 'kfr' => '𝔨', - 'kgreen' => 'ĸ', - 'KHcy' => 'Х', - 'khcy' => 'х', - 'KJcy' => 'Ќ', - 'kjcy' => 'ќ', - 'Kopf' => '𝕂', - 'kopf' => '𝕜', - 'Kscr' => '𝒦', - 'kscr' => '𝓀', - 'lAarr' => '⇚', - 'Lacute' => 'Ĺ', - 'lacute' => 'ĺ', - 'laemptyv' => '⦴', - 'lagran' => 'ℒ', - 'Lambda' => 'Λ', - 'lambda' => 'λ', - 'Lang' => '⟪', - 'lang' => '⟨', - 'langd' => '⦑', - 'langle' => '⟨', - 'lap' => '⪅', - 'Laplacetrf' => 'ℒ', - 'laquo' => '«', - 'laqu' => '«', - 'Larr' => '↞', - 'lArr' => '⇐', - 'larr' => '←', - 'larrb' => '⇤', - 'larrbfs' => '⤟', - 'larrfs' => '⤝', - 'larrhk' => '↩', - 'larrlp' => '↫', - 'larrpl' => '⤹', - 'larrsim' => '⥳', - 'larrtl' => '↢', - 'lat' => '⪫', - 'lAtail' => '⤛', - 'latail' => '⤙', - 'late' => '⪭', - 'lates' => '⪭︀', - 'lBarr' => '⤎', - 'lbarr' => '⤌', - 'lbbrk' => '❲', - 'lbrace' => '{', - 'lbrack' => '[', - 'lbrke' => '⦋', - 'lbrksld' => '⦏', - 'lbrkslu' => '⦍', - 'Lcaron' => 'Ľ', - 'lcaron' => 'ľ', - 'Lcedil' => 'Ļ', - 'lcedil' => 'ļ', - 'lceil' => '⌈', - 'lcub' => '{', - 'Lcy' => 'Л', - 'lcy' => 'л', - 'ldca' => '⤶', - 'ldquo' => '“', - 'ldquor' => '„', - 'ldrdhar' => '⥧', - 'ldrushar' => '⥋', - 'ldsh' => '↲', - 'lE' => '≦', - 'le' => '≤', - 'LeftAngleBracket' => '⟨', - 'LeftArrow' => '←', - 'Leftarrow' => '⇐', - 'leftarrow' => '←', - 'LeftArrowBar' => '⇤', - 'LeftArrowRightArrow' => '⇆', - 'leftarrowtail' => '↢', - 'LeftCeiling' => '⌈', - 'LeftDoubleBracket' => '⟦', - 'LeftDownTeeVector' => '⥡', - 'LeftDownVector' => '⇃', - 'LeftDownVectorBar' => '⥙', - 'LeftFloor' => '⌊', - 'leftharpoondown' => '↽', - 'leftharpoonup' => '↼', - 'leftleftarrows' => '⇇', - 'LeftRightArrow' => '↔', - 'Leftrightarrow' => '⇔', - 'leftrightarrow' => '↔', - 'leftrightarrows' => '⇆', - 'leftrightharpoons' => '⇋', - 'leftrightsquigarrow' => '↭', - 'LeftRightVector' => '⥎', - 'LeftTee' => '⊣', - 'LeftTeeArrow' => '↤', - 'LeftTeeVector' => '⥚', - 'leftthreetimes' => '⋋', - 'LeftTriangle' => '⊲', - 'LeftTriangleBar' => '⧏', - 'LeftTriangleEqual' => '⊴', - 'LeftUpDownVector' => '⥑', - 'LeftUpTeeVector' => '⥠', - 'LeftUpVector' => '↿', - 'LeftUpVectorBar' => '⥘', - 'LeftVector' => '↼', - 'LeftVectorBar' => '⥒', - 'lEg' => '⪋', - 'leg' => '⋚', - 'leq' => '≤', - 'leqq' => '≦', - 'leqslant' => '⩽', - 'les' => '⩽', - 'lescc' => '⪨', - 'lesdot' => '⩿', - 'lesdoto' => '⪁', - 'lesdotor' => '⪃', - 'lesg' => '⋚︀', - 'lesges' => '⪓', - 'lessapprox' => '⪅', - 'lessdot' => '⋖', - 'lesseqgtr' => '⋚', - 'lesseqqgtr' => '⪋', - 'LessEqualGreater' => '⋚', - 'LessFullEqual' => '≦', - 'LessGreater' => '≶', - 'lessgtr' => '≶', - 'LessLess' => '⪡', - 'lesssim' => '≲', - 'LessSlantEqual' => '⩽', - 'LessTilde' => '≲', - 'lfisht' => '⥼', - 'lfloor' => '⌊', - 'Lfr' => '𝔏', - 'lfr' => '𝔩', - 'lg' => '≶', - 'lgE' => '⪑', - 'lHar' => '⥢', - 'lhard' => '↽', - 'lharu' => '↼', - 'lharul' => '⥪', - 'lhblk' => '▄', - 'LJcy' => 'Љ', - 'ljcy' => 'љ', - 'Ll' => '⋘', - 'll' => '≪', - 'llarr' => '⇇', - 'llcorner' => '⌞', - 'Lleftarrow' => '⇚', - 'llhard' => '⥫', - 'lltri' => '◺', - 'Lmidot' => 'Ŀ', - 'lmidot' => 'ŀ', - 'lmoust' => '⎰', - 'lmoustache' => '⎰', - 'lnap' => '⪉', - 'lnapprox' => '⪉', - 'lnE' => '≨', - 'lne' => '⪇', - 'lneq' => '⪇', - 'lneqq' => '≨', - 'lnsim' => '⋦', - 'loang' => '⟬', - 'loarr' => '⇽', - 'lobrk' => '⟦', - 'LongLeftArrow' => '⟵', - 'Longleftarrow' => '⟸', - 'longleftarrow' => '⟵', - 'LongLeftRightArrow' => '⟷', - 'Longleftrightarrow' => '⟺', - 'longleftrightarrow' => '⟷', - 'longmapsto' => '⟼', - 'LongRightArrow' => '⟶', - 'Longrightarrow' => '⟹', - 'longrightarrow' => '⟶', - 'looparrowleft' => '↫', - 'looparrowright' => '↬', - 'lopar' => '⦅', - 'Lopf' => '𝕃', - 'lopf' => '𝕝', - 'loplus' => '⨭', - 'lotimes' => '⨴', - 'lowast' => '∗', - 'lowbar' => '_', - 'LowerLeftArrow' => '↙', - 'LowerRightArrow' => '↘', - 'loz' => '◊', - 'lozenge' => '◊', - 'lozf' => '⧫', - 'lpar' => '(', - 'lparlt' => '⦓', - 'lrarr' => '⇆', - 'lrcorner' => '⌟', - 'lrhar' => '⇋', - 'lrhard' => '⥭', - 'lrm' => '‎', - 'lrtri' => '⊿', - 'lsaquo' => '‹', - 'Lscr' => 'ℒ', - 'lscr' => '𝓁', - 'Lsh' => '↰', - 'lsh' => '↰', - 'lsim' => '≲', - 'lsime' => '⪍', - 'lsimg' => '⪏', - 'lsqb' => '[', - 'lsquo' => '‘', - 'lsquor' => '‚', - 'Lstrok' => 'Ł', - 'lstrok' => 'ł', - 'LT' => '<', - 'L' => '<', - 'Lt' => '≪', - 'lt' => '<', - 'l' => '<', - 'ltcc' => '⪦', - 'ltcir' => '⩹', - 'ltdot' => '⋖', - 'lthree' => '⋋', - 'ltimes' => '⋉', - 'ltlarr' => '⥶', - 'ltquest' => '⩻', - 'ltri' => '◃', - 'ltrie' => '⊴', - 'ltrif' => '◂', - 'ltrPar' => '⦖', - 'lurdshar' => '⥊', - 'luruhar' => '⥦', - 'lvertneqq' => '≨︀', - 'lvnE' => '≨︀', - 'macr' => '¯', - 'mac' => '¯', - 'male' => '♂', - 'malt' => '✠', - 'maltese' => '✠', - 'Map' => '⤅', - 'map' => '↦', - 'mapsto' => '↦', - 'mapstodown' => '↧', - 'mapstoleft' => '↤', - 'mapstoup' => '↥', - 'marker' => '▮', - 'mcomma' => '⨩', - 'Mcy' => 'М', - 'mcy' => 'м', - 'mdash' => '—', - 'mDDot' => '∺', - 'measuredangle' => '∡', - 'MediumSpace' => ' ', - 'Mellintrf' => 'ℳ', - 'Mfr' => '𝔐', - 'mfr' => '𝔪', - 'mho' => '℧', - 'micro' => 'µ', - 'micr' => 'µ', - 'mid' => '∣', - 'midast' => '*', - 'midcir' => '⫰', - 'middot' => '·', - 'middo' => '·', - 'minus' => '−', - 'minusb' => '⊟', - 'minusd' => '∸', - 'minusdu' => '⨪', - 'MinusPlus' => '∓', - 'mlcp' => '⫛', - 'mldr' => '…', - 'mnplus' => '∓', - 'models' => '⊧', - 'Mopf' => '𝕄', - 'mopf' => '𝕞', - 'mp' => '∓', - 'Mscr' => 'ℳ', - 'mscr' => '𝓂', - 'mstpos' => '∾', - 'Mu' => 'Μ', - 'mu' => 'μ', - 'multimap' => '⊸', - 'mumap' => '⊸', - 'nabla' => '∇', - 'Nacute' => 'Ń', - 'nacute' => 'ń', - 'nang' => '∠⃒', - 'nap' => '≉', - 'napE' => '⩰̸', - 'napid' => '≋̸', - 'napos' => 'ʼn', - 'napprox' => '≉', - 'natur' => '♮', - 'natural' => '♮', - 'naturals' => 'ℕ', - 'nbsp' => ' ', - 'nbs' => ' ', - 'nbump' => '≎̸', - 'nbumpe' => '≏̸', - 'ncap' => '⩃', - 'Ncaron' => 'Ň', - 'ncaron' => 'ň', - 'Ncedil' => 'Ņ', - 'ncedil' => 'ņ', - 'ncong' => '≇', - 'ncongdot' => '⩭̸', - 'ncup' => '⩂', - 'Ncy' => 'Н', - 'ncy' => 'н', - 'ndash' => '–', - 'ne' => '≠', - 'nearhk' => '⤤', - 'neArr' => '⇗', - 'nearr' => '↗', - 'nearrow' => '↗', - 'nedot' => '≐̸', - 'NegativeMediumSpace' => '​', - 'NegativeThickSpace' => '​', - 'NegativeThinSpace' => '​', - 'NegativeVeryThinSpace' => '​', - 'nequiv' => '≢', - 'nesear' => '⤨', - 'nesim' => '≂̸', - 'NestedGreaterGreater' => '≫', - 'NestedLessLess' => '≪', - 'NewLine' => ' -', - 'nexist' => '∄', - 'nexists' => '∄', - 'Nfr' => '𝔑', - 'nfr' => '𝔫', - 'ngE' => '≧̸', - 'nge' => '≱', - 'ngeq' => '≱', - 'ngeqq' => '≧̸', - 'ngeqslant' => '⩾̸', - 'nges' => '⩾̸', - 'nGg' => '⋙̸', - 'ngsim' => '≵', - 'nGt' => '≫⃒', - 'ngt' => '≯', - 'ngtr' => '≯', - 'nGtv' => '≫̸', - 'nhArr' => '⇎', - 'nharr' => '↮', - 'nhpar' => '⫲', - 'ni' => '∋', - 'nis' => '⋼', - 'nisd' => '⋺', - 'niv' => '∋', - 'NJcy' => 'Њ', - 'njcy' => 'њ', - 'nlArr' => '⇍', - 'nlarr' => '↚', - 'nldr' => '‥', - 'nlE' => '≦̸', - 'nle' => '≰', - 'nLeftarrow' => '⇍', - 'nleftarrow' => '↚', - 'nLeftrightarrow' => '⇎', - 'nleftrightarrow' => '↮', - 'nleq' => '≰', - 'nleqq' => '≦̸', - 'nleqslant' => '⩽̸', - 'nles' => '⩽̸', - 'nless' => '≮', - 'nLl' => '⋘̸', - 'nlsim' => '≴', - 'nLt' => '≪⃒', - 'nlt' => '≮', - 'nltri' => '⋪', - 'nltrie' => '⋬', - 'nLtv' => '≪̸', - 'nmid' => '∤', - 'NoBreak' => '⁠', - 'NonBreakingSpace' => ' ', - 'Nopf' => 'ℕ', - 'nopf' => '𝕟', - 'Not' => '⫬', - 'not' => '¬', - 'no' => '¬', - 'NotCongruent' => '≢', - 'NotCupCap' => '≭', - 'NotDoubleVerticalBar' => '∦', - 'NotElement' => '∉', - 'NotEqual' => '≠', - 'NotEqualTilde' => '≂̸', - 'NotExists' => '∄', - 'NotGreater' => '≯', - 'NotGreaterEqual' => '≱', - 'NotGreaterFullEqual' => '≧̸', - 'NotGreaterGreater' => '≫̸', - 'NotGreaterLess' => '≹', - 'NotGreaterSlantEqual' => '⩾̸', - 'NotGreaterTilde' => '≵', - 'NotHumpDownHump' => '≎̸', - 'NotHumpEqual' => '≏̸', - 'notin' => '∉', - 'notindot' => '⋵̸', - 'notinE' => '⋹̸', - 'notinva' => '∉', - 'notinvb' => '⋷', - 'notinvc' => '⋶', - 'NotLeftTriangle' => '⋪', - 'NotLeftTriangleBar' => '⧏̸', - 'NotLeftTriangleEqual' => '⋬', - 'NotLess' => '≮', - 'NotLessEqual' => '≰', - 'NotLessGreater' => '≸', - 'NotLessLess' => '≪̸', - 'NotLessSlantEqual' => '⩽̸', - 'NotLessTilde' => '≴', - 'NotNestedGreaterGreater' => '⪢̸', - 'NotNestedLessLess' => '⪡̸', - 'notni' => '∌', - 'notniva' => '∌', - 'notnivb' => '⋾', - 'notnivc' => '⋽', - 'NotPrecedes' => '⊀', - 'NotPrecedesEqual' => '⪯̸', - 'NotPrecedesSlantEqual' => '⋠', - 'NotReverseElement' => '∌', - 'NotRightTriangle' => '⋫', - 'NotRightTriangleBar' => '⧐̸', - 'NotRightTriangleEqual' => '⋭', - 'NotSquareSubset' => '⊏̸', - 'NotSquareSubsetEqual' => '⋢', - 'NotSquareSuperset' => '⊐̸', - 'NotSquareSupersetEqual' => '⋣', - 'NotSubset' => '⊂⃒', - 'NotSubsetEqual' => '⊈', - 'NotSucceeds' => '⊁', - 'NotSucceedsEqual' => '⪰̸', - 'NotSucceedsSlantEqual' => '⋡', - 'NotSucceedsTilde' => '≿̸', - 'NotSuperset' => '⊃⃒', - 'NotSupersetEqual' => '⊉', - 'NotTilde' => '≁', - 'NotTildeEqual' => '≄', - 'NotTildeFullEqual' => '≇', - 'NotTildeTilde' => '≉', - 'NotVerticalBar' => '∤', - 'npar' => '∦', - 'nparallel' => '∦', - 'nparsl' => '⫽⃥', - 'npart' => '∂̸', - 'npolint' => '⨔', - 'npr' => '⊀', - 'nprcue' => '⋠', - 'npre' => '⪯̸', - 'nprec' => '⊀', - 'npreceq' => '⪯̸', - 'nrArr' => '⇏', - 'nrarr' => '↛', - 'nrarrc' => '⤳̸', - 'nrarrw' => '↝̸', - 'nRightarrow' => '⇏', - 'nrightarrow' => '↛', - 'nrtri' => '⋫', - 'nrtrie' => '⋭', - 'nsc' => '⊁', - 'nsccue' => '⋡', - 'nsce' => '⪰̸', - 'Nscr' => '𝒩', - 'nscr' => '𝓃', - 'nshortmid' => '∤', - 'nshortparallel' => '∦', - 'nsim' => '≁', - 'nsime' => '≄', - 'nsimeq' => '≄', - 'nsmid' => '∤', - 'nspar' => '∦', - 'nsqsube' => '⋢', - 'nsqsupe' => '⋣', - 'nsub' => '⊄', - 'nsubE' => '⫅̸', - 'nsube' => '⊈', - 'nsubset' => '⊂⃒', - 'nsubseteq' => '⊈', - 'nsubseteqq' => '⫅̸', - 'nsucc' => '⊁', - 'nsucceq' => '⪰̸', - 'nsup' => '⊅', - 'nsupE' => '⫆̸', - 'nsupe' => '⊉', - 'nsupset' => '⊃⃒', - 'nsupseteq' => '⊉', - 'nsupseteqq' => '⫆̸', - 'ntgl' => '≹', - 'Ntilde' => 'Ñ', - 'Ntild' => 'Ñ', - 'ntilde' => 'ñ', - 'ntild' => 'ñ', - 'ntlg' => '≸', - 'ntriangleleft' => '⋪', - 'ntrianglelefteq' => '⋬', - 'ntriangleright' => '⋫', - 'ntrianglerighteq' => '⋭', - 'Nu' => 'Ν', - 'nu' => 'ν', - 'num' => '#', - 'numero' => '№', - 'numsp' => ' ', - 'nvap' => '≍⃒', - 'nVDash' => '⊯', - 'nVdash' => '⊮', - 'nvDash' => '⊭', - 'nvdash' => '⊬', - 'nvge' => '≥⃒', - 'nvgt' => '>⃒', - 'nvHarr' => '⤄', - 'nvinfin' => '⧞', - 'nvlArr' => '⤂', - 'nvle' => '≤⃒', - 'nvlt' => '<⃒', - 'nvltrie' => '⊴⃒', - 'nvrArr' => '⤃', - 'nvrtrie' => '⊵⃒', - 'nvsim' => '∼⃒', - 'nwarhk' => '⤣', - 'nwArr' => '⇖', - 'nwarr' => '↖', - 'nwarrow' => '↖', - 'nwnear' => '⤧', - 'Oacute' => 'Ó', - 'Oacut' => 'Ó', - 'oacute' => 'ó', - 'oacut' => 'ó', - 'oast' => '⊛', - 'ocir' => 'ô', - 'Ocirc' => 'Ô', - 'Ocir' => 'Ô', - 'ocirc' => 'ô', - 'Ocy' => 'О', - 'ocy' => 'о', - 'odash' => '⊝', - 'Odblac' => 'Ő', - 'odblac' => 'ő', - 'odiv' => '⨸', - 'odot' => '⊙', - 'odsold' => '⦼', - 'OElig' => 'Œ', - 'oelig' => 'œ', - 'ofcir' => '⦿', - 'Ofr' => '𝔒', - 'ofr' => '𝔬', - 'ogon' => '˛', - 'Ograve' => 'Ò', - 'Ograv' => 'Ò', - 'ograve' => 'ò', - 'ograv' => 'ò', - 'ogt' => '⧁', - 'ohbar' => '⦵', - 'ohm' => 'Ω', - 'oint' => '∮', - 'olarr' => '↺', - 'olcir' => '⦾', - 'olcross' => '⦻', - 'oline' => '‾', - 'olt' => '⧀', - 'Omacr' => 'Ō', - 'omacr' => 'ō', - 'Omega' => 'Ω', - 'omega' => 'ω', - 'Omicron' => 'Ο', - 'omicron' => 'ο', - 'omid' => '⦶', - 'ominus' => '⊖', - 'Oopf' => '𝕆', - 'oopf' => '𝕠', - 'opar' => '⦷', - 'OpenCurlyDoubleQuote' => '“', - 'OpenCurlyQuote' => '‘', - 'operp' => '⦹', - 'oplus' => '⊕', - 'Or' => '⩔', - 'or' => '∨', - 'orarr' => '↻', - 'ord' => 'º', - 'order' => 'ℴ', - 'orderof' => 'ℴ', - 'ordf' => 'ª', - 'ordm' => 'º', - 'origof' => '⊶', - 'oror' => '⩖', - 'orslope' => '⩗', - 'orv' => '⩛', - 'oS' => 'Ⓢ', - 'Oscr' => '𝒪', - 'oscr' => 'ℴ', - 'Oslash' => 'Ø', - 'Oslas' => 'Ø', - 'oslash' => 'ø', - 'oslas' => 'ø', - 'osol' => '⊘', - 'Otilde' => 'Õ', - 'Otild' => 'Õ', - 'otilde' => 'õ', - 'otild' => 'õ', - 'Otimes' => '⨷', - 'otimes' => '⊗', - 'otimesas' => '⨶', - 'Ouml' => 'Ö', - 'Oum' => 'Ö', - 'ouml' => 'ö', - 'oum' => 'ö', - 'ovbar' => '⌽', - 'OverBar' => '‾', - 'OverBrace' => '⏞', - 'OverBracket' => '⎴', - 'OverParenthesis' => '⏜', - 'par' => '¶', - 'para' => '¶', - 'parallel' => '∥', - 'parsim' => '⫳', - 'parsl' => '⫽', - 'part' => '∂', - 'PartialD' => '∂', - 'Pcy' => 'П', - 'pcy' => 'п', - 'percnt' => '%', - 'period' => '.', - 'permil' => '‰', - 'perp' => '⊥', - 'pertenk' => '‱', - 'Pfr' => '𝔓', - 'pfr' => '𝔭', - 'Phi' => 'Φ', - 'phi' => 'φ', - 'phiv' => 'ϕ', - 'phmmat' => 'ℳ', - 'phone' => '☎', - 'Pi' => 'Π', - 'pi' => 'π', - 'pitchfork' => '⋔', - 'piv' => 'ϖ', - 'planck' => 'ℏ', - 'planckh' => 'ℎ', - 'plankv' => 'ℏ', - 'plus' => '+', - 'plusacir' => '⨣', - 'plusb' => '⊞', - 'pluscir' => '⨢', - 'plusdo' => '∔', - 'plusdu' => '⨥', - 'pluse' => '⩲', - 'PlusMinus' => '±', - 'plusmn' => '±', - 'plusm' => '±', - 'plussim' => '⨦', - 'plustwo' => '⨧', - 'pm' => '±', - 'Poincareplane' => 'ℌ', - 'pointint' => '⨕', - 'Popf' => 'ℙ', - 'popf' => '𝕡', - 'pound' => '£', - 'poun' => '£', - 'Pr' => '⪻', - 'pr' => '≺', - 'prap' => '⪷', - 'prcue' => '≼', - 'prE' => '⪳', - 'pre' => '⪯', - 'prec' => '≺', - 'precapprox' => '⪷', - 'preccurlyeq' => '≼', - 'Precedes' => '≺', - 'PrecedesEqual' => '⪯', - 'PrecedesSlantEqual' => '≼', - 'PrecedesTilde' => '≾', - 'preceq' => '⪯', - 'precnapprox' => '⪹', - 'precneqq' => '⪵', - 'precnsim' => '⋨', - 'precsim' => '≾', - 'Prime' => '″', - 'prime' => '′', - 'primes' => 'ℙ', - 'prnap' => '⪹', - 'prnE' => '⪵', - 'prnsim' => '⋨', - 'prod' => '∏', - 'Product' => '∏', - 'profalar' => '⌮', - 'profline' => '⌒', - 'profsurf' => '⌓', - 'prop' => '∝', - 'Proportion' => '∷', - 'Proportional' => '∝', - 'propto' => '∝', - 'prsim' => '≾', - 'prurel' => '⊰', - 'Pscr' => '𝒫', - 'pscr' => '𝓅', - 'Psi' => 'Ψ', - 'psi' => 'ψ', - 'puncsp' => ' ', - 'Qfr' => '𝔔', - 'qfr' => '𝔮', - 'qint' => '⨌', - 'Qopf' => 'ℚ', - 'qopf' => '𝕢', - 'qprime' => '⁗', - 'Qscr' => '𝒬', - 'qscr' => '𝓆', - 'quaternions' => 'ℍ', - 'quatint' => '⨖', - 'quest' => '?', - 'questeq' => '≟', - 'QUOT' => '"', - 'QUO' => '"', - 'quot' => '"', - 'quo' => '"', - 'rAarr' => '⇛', - 'race' => '∽̱', - 'Racute' => 'Ŕ', - 'racute' => 'ŕ', - 'radic' => '√', - 'raemptyv' => '⦳', - 'Rang' => '⟫', - 'rang' => '⟩', - 'rangd' => '⦒', - 'range' => '⦥', - 'rangle' => '⟩', - 'raquo' => '»', - 'raqu' => '»', - 'Rarr' => '↠', - 'rArr' => '⇒', - 'rarr' => '→', - 'rarrap' => '⥵', - 'rarrb' => '⇥', - 'rarrbfs' => '⤠', - 'rarrc' => '⤳', - 'rarrfs' => '⤞', - 'rarrhk' => '↪', - 'rarrlp' => '↬', - 'rarrpl' => '⥅', - 'rarrsim' => '⥴', - 'Rarrtl' => '⤖', - 'rarrtl' => '↣', - 'rarrw' => '↝', - 'rAtail' => '⤜', - 'ratail' => '⤚', - 'ratio' => '∶', - 'rationals' => 'ℚ', - 'RBarr' => '⤐', - 'rBarr' => '⤏', - 'rbarr' => '⤍', - 'rbbrk' => '❳', - 'rbrace' => '}', - 'rbrack' => ']', - 'rbrke' => '⦌', - 'rbrksld' => '⦎', - 'rbrkslu' => '⦐', - 'Rcaron' => 'Ř', - 'rcaron' => 'ř', - 'Rcedil' => 'Ŗ', - 'rcedil' => 'ŗ', - 'rceil' => '⌉', - 'rcub' => '}', - 'Rcy' => 'Р', - 'rcy' => 'р', - 'rdca' => '⤷', - 'rdldhar' => '⥩', - 'rdquo' => '”', - 'rdquor' => '”', - 'rdsh' => '↳', - 'Re' => 'ℜ', - 'real' => 'ℜ', - 'realine' => 'ℛ', - 'realpart' => 'ℜ', - 'reals' => 'ℝ', - 'rect' => '▭', - 'REG' => '®', - 'RE' => '®', - 'reg' => '®', - 're' => '®', - 'ReverseElement' => '∋', - 'ReverseEquilibrium' => '⇋', - 'ReverseUpEquilibrium' => '⥯', - 'rfisht' => '⥽', - 'rfloor' => '⌋', - 'Rfr' => 'ℜ', - 'rfr' => '𝔯', - 'rHar' => '⥤', - 'rhard' => '⇁', - 'rharu' => '⇀', - 'rharul' => '⥬', - 'Rho' => 'Ρ', - 'rho' => 'ρ', - 'rhov' => 'ϱ', - 'RightAngleBracket' => '⟩', - 'RightArrow' => '→', - 'Rightarrow' => '⇒', - 'rightarrow' => '→', - 'RightArrowBar' => '⇥', - 'RightArrowLeftArrow' => '⇄', - 'rightarrowtail' => '↣', - 'RightCeiling' => '⌉', - 'RightDoubleBracket' => '⟧', - 'RightDownTeeVector' => '⥝', - 'RightDownVector' => '⇂', - 'RightDownVectorBar' => '⥕', - 'RightFloor' => '⌋', - 'rightharpoondown' => '⇁', - 'rightharpoonup' => '⇀', - 'rightleftarrows' => '⇄', - 'rightleftharpoons' => '⇌', - 'rightrightarrows' => '⇉', - 'rightsquigarrow' => '↝', - 'RightTee' => '⊢', - 'RightTeeArrow' => '↦', - 'RightTeeVector' => '⥛', - 'rightthreetimes' => '⋌', - 'RightTriangle' => '⊳', - 'RightTriangleBar' => '⧐', - 'RightTriangleEqual' => '⊵', - 'RightUpDownVector' => '⥏', - 'RightUpTeeVector' => '⥜', - 'RightUpVector' => '↾', - 'RightUpVectorBar' => '⥔', - 'RightVector' => '⇀', - 'RightVectorBar' => '⥓', - 'ring' => '˚', - 'risingdotseq' => '≓', - 'rlarr' => '⇄', - 'rlhar' => '⇌', - 'rlm' => '‏', - 'rmoust' => '⎱', - 'rmoustache' => '⎱', - 'rnmid' => '⫮', - 'roang' => '⟭', - 'roarr' => '⇾', - 'robrk' => '⟧', - 'ropar' => '⦆', - 'Ropf' => 'ℝ', - 'ropf' => '𝕣', - 'roplus' => '⨮', - 'rotimes' => '⨵', - 'RoundImplies' => '⥰', - 'rpar' => ')', - 'rpargt' => '⦔', - 'rppolint' => '⨒', - 'rrarr' => '⇉', - 'Rrightarrow' => '⇛', - 'rsaquo' => '›', - 'Rscr' => 'ℛ', - 'rscr' => '𝓇', - 'Rsh' => '↱', - 'rsh' => '↱', - 'rsqb' => ']', - 'rsquo' => '’', - 'rsquor' => '’', - 'rthree' => '⋌', - 'rtimes' => '⋊', - 'rtri' => '▹', - 'rtrie' => '⊵', - 'rtrif' => '▸', - 'rtriltri' => '⧎', - 'RuleDelayed' => '⧴', - 'ruluhar' => '⥨', - 'rx' => '℞', - 'Sacute' => 'Ś', - 'sacute' => 'ś', - 'sbquo' => '‚', - 'Sc' => '⪼', - 'sc' => '≻', - 'scap' => '⪸', - 'Scaron' => 'Š', - 'scaron' => 'š', - 'sccue' => '≽', - 'scE' => '⪴', - 'sce' => '⪰', - 'Scedil' => 'Ş', - 'scedil' => 'ş', - 'Scirc' => 'Ŝ', - 'scirc' => 'ŝ', - 'scnap' => '⪺', - 'scnE' => '⪶', - 'scnsim' => '⋩', - 'scpolint' => '⨓', - 'scsim' => '≿', - 'Scy' => 'С', - 'scy' => 'с', - 'sdot' => '⋅', - 'sdotb' => '⊡', - 'sdote' => '⩦', - 'searhk' => '⤥', - 'seArr' => '⇘', - 'searr' => '↘', - 'searrow' => '↘', - 'sect' => '§', - 'sec' => '§', - 'semi' => ';', - 'seswar' => '⤩', - 'setminus' => '∖', - 'setmn' => '∖', - 'sext' => '✶', - 'Sfr' => '𝔖', - 'sfr' => '𝔰', - 'sfrown' => '⌢', - 'sharp' => '♯', - 'SHCHcy' => 'Щ', - 'shchcy' => 'щ', - 'SHcy' => 'Ш', - 'shcy' => 'ш', - 'ShortDownArrow' => '↓', - 'ShortLeftArrow' => '←', - 'shortmid' => '∣', - 'shortparallel' => '∥', - 'ShortRightArrow' => '→', - 'ShortUpArrow' => '↑', - 'shy' => '­', - 'sh' => '­', - 'Sigma' => 'Σ', - 'sigma' => 'σ', - 'sigmaf' => 'ς', - 'sigmav' => 'ς', - 'sim' => '∼', - 'simdot' => '⩪', - 'sime' => '≃', - 'simeq' => '≃', - 'simg' => '⪞', - 'simgE' => '⪠', - 'siml' => '⪝', - 'simlE' => '⪟', - 'simne' => '≆', - 'simplus' => '⨤', - 'simrarr' => '⥲', - 'slarr' => '←', - 'SmallCircle' => '∘', - 'smallsetminus' => '∖', - 'smashp' => '⨳', - 'smeparsl' => '⧤', - 'smid' => '∣', - 'smile' => '⌣', - 'smt' => '⪪', - 'smte' => '⪬', - 'smtes' => '⪬︀', - 'SOFTcy' => 'Ь', - 'softcy' => 'ь', - 'sol' => '/', - 'solb' => '⧄', - 'solbar' => '⌿', - 'Sopf' => '𝕊', - 'sopf' => '𝕤', - 'spades' => '♠', - 'spadesuit' => '♠', - 'spar' => '∥', - 'sqcap' => '⊓', - 'sqcaps' => '⊓︀', - 'sqcup' => '⊔', - 'sqcups' => '⊔︀', - 'Sqrt' => '√', - 'sqsub' => '⊏', - 'sqsube' => '⊑', - 'sqsubset' => '⊏', - 'sqsubseteq' => '⊑', - 'sqsup' => '⊐', - 'sqsupe' => '⊒', - 'sqsupset' => '⊐', - 'sqsupseteq' => '⊒', - 'squ' => '□', - 'Square' => '□', - 'square' => '□', - 'SquareIntersection' => '⊓', - 'SquareSubset' => '⊏', - 'SquareSubsetEqual' => '⊑', - 'SquareSuperset' => '⊐', - 'SquareSupersetEqual' => '⊒', - 'SquareUnion' => '⊔', - 'squarf' => '▪', - 'squf' => '▪', - 'srarr' => '→', - 'Sscr' => '𝒮', - 'sscr' => '𝓈', - 'ssetmn' => '∖', - 'ssmile' => '⌣', - 'sstarf' => '⋆', - 'Star' => '⋆', - 'star' => '☆', - 'starf' => '★', - 'straightepsilon' => 'ϵ', - 'straightphi' => 'ϕ', - 'strns' => '¯', - 'Sub' => '⋐', - 'sub' => '⊂', - 'subdot' => '⪽', - 'subE' => '⫅', - 'sube' => '⊆', - 'subedot' => '⫃', - 'submult' => '⫁', - 'subnE' => '⫋', - 'subne' => '⊊', - 'subplus' => '⪿', - 'subrarr' => '⥹', - 'Subset' => '⋐', - 'subset' => '⊂', - 'subseteq' => '⊆', - 'subseteqq' => '⫅', - 'SubsetEqual' => '⊆', - 'subsetneq' => '⊊', - 'subsetneqq' => '⫋', - 'subsim' => '⫇', - 'subsub' => '⫕', - 'subsup' => '⫓', - 'succ' => '≻', - 'succapprox' => '⪸', - 'succcurlyeq' => '≽', - 'Succeeds' => '≻', - 'SucceedsEqual' => '⪰', - 'SucceedsSlantEqual' => '≽', - 'SucceedsTilde' => '≿', - 'succeq' => '⪰', - 'succnapprox' => '⪺', - 'succneqq' => '⪶', - 'succnsim' => '⋩', - 'succsim' => '≿', - 'SuchThat' => '∋', - 'Sum' => '∑', - 'sum' => '∑', - 'sung' => '♪', - 'Sup' => '⋑', - 'sup' => '³', - 'sup1' => '¹', - 'sup2' => '²', - 'sup3' => '³', - 'supdot' => '⪾', - 'supdsub' => '⫘', - 'supE' => '⫆', - 'supe' => '⊇', - 'supedot' => '⫄', - 'Superset' => '⊃', - 'SupersetEqual' => '⊇', - 'suphsol' => '⟉', - 'suphsub' => '⫗', - 'suplarr' => '⥻', - 'supmult' => '⫂', - 'supnE' => '⫌', - 'supne' => '⊋', - 'supplus' => '⫀', - 'Supset' => '⋑', - 'supset' => '⊃', - 'supseteq' => '⊇', - 'supseteqq' => '⫆', - 'supsetneq' => '⊋', - 'supsetneqq' => '⫌', - 'supsim' => '⫈', - 'supsub' => '⫔', - 'supsup' => '⫖', - 'swarhk' => '⤦', - 'swArr' => '⇙', - 'swarr' => '↙', - 'swarrow' => '↙', - 'swnwar' => '⤪', - 'szlig' => 'ß', - 'szli' => 'ß', - 'Tab' => ' ', - 'target' => '⌖', - 'Tau' => 'Τ', - 'tau' => 'τ', - 'tbrk' => '⎴', - 'Tcaron' => 'Ť', - 'tcaron' => 'ť', - 'Tcedil' => 'Ţ', - 'tcedil' => 'ţ', - 'Tcy' => 'Т', - 'tcy' => 'т', - 'tdot' => '⃛', - 'telrec' => '⌕', - 'Tfr' => '𝔗', - 'tfr' => '𝔱', - 'there4' => '∴', - 'Therefore' => '∴', - 'therefore' => '∴', - 'Theta' => 'Θ', - 'theta' => 'θ', - 'thetasym' => 'ϑ', - 'thetav' => 'ϑ', - 'thickapprox' => '≈', - 'thicksim' => '∼', - 'ThickSpace' => '  ', - 'thinsp' => ' ', - 'ThinSpace' => ' ', - 'thkap' => '≈', - 'thksim' => '∼', - 'THORN' => 'Þ', - 'THOR' => 'Þ', - 'thorn' => 'þ', - 'thor' => 'þ', - 'Tilde' => '∼', - 'tilde' => '˜', - 'TildeEqual' => '≃', - 'TildeFullEqual' => '≅', - 'TildeTilde' => '≈', - 'times' => '×', - 'time' => '×', - 'timesb' => '⊠', - 'timesbar' => '⨱', - 'timesd' => '⨰', - 'tint' => '∭', - 'toea' => '⤨', - 'top' => '⊤', - 'topbot' => '⌶', - 'topcir' => '⫱', - 'Topf' => '𝕋', - 'topf' => '𝕥', - 'topfork' => '⫚', - 'tosa' => '⤩', - 'tprime' => '‴', - 'TRADE' => '™', - 'trade' => '™', - 'triangle' => '▵', - 'triangledown' => '▿', - 'triangleleft' => '◃', - 'trianglelefteq' => '⊴', - 'triangleq' => '≜', - 'triangleright' => '▹', - 'trianglerighteq' => '⊵', - 'tridot' => '◬', - 'trie' => '≜', - 'triminus' => '⨺', - 'TripleDot' => '⃛', - 'triplus' => '⨹', - 'trisb' => '⧍', - 'tritime' => '⨻', - 'trpezium' => '⏢', - 'Tscr' => '𝒯', - 'tscr' => '𝓉', - 'TScy' => 'Ц', - 'tscy' => 'ц', - 'TSHcy' => 'Ћ', - 'tshcy' => 'ћ', - 'Tstrok' => 'Ŧ', - 'tstrok' => 'ŧ', - 'twixt' => '≬', - 'twoheadleftarrow' => '↞', - 'twoheadrightarrow' => '↠', - 'Uacute' => 'Ú', - 'Uacut' => 'Ú', - 'uacute' => 'ú', - 'uacut' => 'ú', - 'Uarr' => '↟', - 'uArr' => '⇑', - 'uarr' => '↑', - 'Uarrocir' => '⥉', - 'Ubrcy' => 'Ў', - 'ubrcy' => 'ў', - 'Ubreve' => 'Ŭ', - 'ubreve' => 'ŭ', - 'Ucirc' => 'Û', - 'Ucir' => 'Û', - 'ucirc' => 'û', - 'ucir' => 'û', - 'Ucy' => 'У', - 'ucy' => 'у', - 'udarr' => '⇅', - 'Udblac' => 'Ű', - 'udblac' => 'ű', - 'udhar' => '⥮', - 'ufisht' => '⥾', - 'Ufr' => '𝔘', - 'ufr' => '𝔲', - 'Ugrave' => 'Ù', - 'Ugrav' => 'Ù', - 'ugrave' => 'ù', - 'ugrav' => 'ù', - 'uHar' => '⥣', - 'uharl' => '↿', - 'uharr' => '↾', - 'uhblk' => '▀', - 'ulcorn' => '⌜', - 'ulcorner' => '⌜', - 'ulcrop' => '⌏', - 'ultri' => '◸', - 'Umacr' => 'Ū', - 'umacr' => 'ū', - 'uml' => '¨', - 'um' => '¨', - 'UnderBar' => '_', - 'UnderBrace' => '⏟', - 'UnderBracket' => '⎵', - 'UnderParenthesis' => '⏝', - 'Union' => '⋃', - 'UnionPlus' => '⊎', - 'Uogon' => 'Ų', - 'uogon' => 'ų', - 'Uopf' => '𝕌', - 'uopf' => '𝕦', - 'UpArrow' => '↑', - 'Uparrow' => '⇑', - 'uparrow' => '↑', - 'UpArrowBar' => '⤒', - 'UpArrowDownArrow' => '⇅', - 'UpDownArrow' => '↕', - 'Updownarrow' => '⇕', - 'updownarrow' => '↕', - 'UpEquilibrium' => '⥮', - 'upharpoonleft' => '↿', - 'upharpoonright' => '↾', - 'uplus' => '⊎', - 'UpperLeftArrow' => '↖', - 'UpperRightArrow' => '↗', - 'Upsi' => 'ϒ', - 'upsi' => 'υ', - 'upsih' => 'ϒ', - 'Upsilon' => 'Υ', - 'upsilon' => 'υ', - 'UpTee' => '⊥', - 'UpTeeArrow' => '↥', - 'upuparrows' => '⇈', - 'urcorn' => '⌝', - 'urcorner' => '⌝', - 'urcrop' => '⌎', - 'Uring' => 'Ů', - 'uring' => 'ů', - 'urtri' => '◹', - 'Uscr' => '𝒰', - 'uscr' => '𝓊', - 'utdot' => '⋰', - 'Utilde' => 'Ũ', - 'utilde' => 'ũ', - 'utri' => '▵', - 'utrif' => '▴', - 'uuarr' => '⇈', - 'Uuml' => 'Ü', - 'Uum' => 'Ü', - 'uuml' => 'ü', - 'uum' => 'ü', - 'uwangle' => '⦧', - 'vangrt' => '⦜', - 'varepsilon' => 'ϵ', - 'varkappa' => 'ϰ', - 'varnothing' => '∅', - 'varphi' => 'ϕ', - 'varpi' => 'ϖ', - 'varpropto' => '∝', - 'vArr' => '⇕', - 'varr' => '↕', - 'varrho' => 'ϱ', - 'varsigma' => 'ς', - 'varsubsetneq' => '⊊︀', - 'varsubsetneqq' => '⫋︀', - 'varsupsetneq' => '⊋︀', - 'varsupsetneqq' => '⫌︀', - 'vartheta' => 'ϑ', - 'vartriangleleft' => '⊲', - 'vartriangleright' => '⊳', - 'Vbar' => '⫫', - 'vBar' => '⫨', - 'vBarv' => '⫩', - 'Vcy' => 'В', - 'vcy' => 'в', - 'VDash' => '⊫', - 'Vdash' => '⊩', - 'vDash' => '⊨', - 'vdash' => '⊢', - 'Vdashl' => '⫦', - 'Vee' => '⋁', - 'vee' => '∨', - 'veebar' => '⊻', - 'veeeq' => '≚', - 'vellip' => '⋮', - 'Verbar' => '‖', - 'verbar' => '|', - 'Vert' => '‖', - 'vert' => '|', - 'VerticalBar' => '∣', - 'VerticalLine' => '|', - 'VerticalSeparator' => '❘', - 'VerticalTilde' => '≀', - 'VeryThinSpace' => ' ', - 'Vfr' => '𝔙', - 'vfr' => '𝔳', - 'vltri' => '⊲', - 'vnsub' => '⊂⃒', - 'vnsup' => '⊃⃒', - 'Vopf' => '𝕍', - 'vopf' => '𝕧', - 'vprop' => '∝', - 'vrtri' => '⊳', - 'Vscr' => '𝒱', - 'vscr' => '𝓋', - 'vsubnE' => '⫋︀', - 'vsubne' => '⊊︀', - 'vsupnE' => '⫌︀', - 'vsupne' => '⊋︀', - 'Vvdash' => '⊪', - 'vzigzag' => '⦚', - 'Wcirc' => 'Ŵ', - 'wcirc' => 'ŵ', - 'wedbar' => '⩟', - 'Wedge' => '⋀', - 'wedge' => '∧', - 'wedgeq' => '≙', - 'weierp' => '℘', - 'Wfr' => '𝔚', - 'wfr' => '𝔴', - 'Wopf' => '𝕎', - 'wopf' => '𝕨', - 'wp' => '℘', - 'wr' => '≀', - 'wreath' => '≀', - 'Wscr' => '𝒲', - 'wscr' => '𝓌', - 'xcap' => '⋂', - 'xcirc' => '◯', - 'xcup' => '⋃', - 'xdtri' => '▽', - 'Xfr' => '𝔛', - 'xfr' => '𝔵', - 'xhArr' => '⟺', - 'xharr' => '⟷', - 'Xi' => 'Ξ', - 'xi' => 'ξ', - 'xlArr' => '⟸', - 'xlarr' => '⟵', - 'xmap' => '⟼', - 'xnis' => '⋻', - 'xodot' => '⨀', - 'Xopf' => '𝕏', - 'xopf' => '𝕩', - 'xoplus' => '⨁', - 'xotime' => '⨂', - 'xrArr' => '⟹', - 'xrarr' => '⟶', - 'Xscr' => '𝒳', - 'xscr' => '𝓍', - 'xsqcup' => '⨆', - 'xuplus' => '⨄', - 'xutri' => '△', - 'xvee' => '⋁', - 'xwedge' => '⋀', - 'Yacute' => 'Ý', - 'Yacut' => 'Ý', - 'yacute' => 'ý', - 'yacut' => 'ý', - 'YAcy' => 'Я', - 'yacy' => 'я', - 'Ycirc' => 'Ŷ', - 'ycirc' => 'ŷ', - 'Ycy' => 'Ы', - 'ycy' => 'ы', - 'yen' => '¥', - 'ye' => '¥', - 'Yfr' => '𝔜', - 'yfr' => '𝔶', - 'YIcy' => 'Ї', - 'yicy' => 'ї', - 'Yopf' => '𝕐', - 'yopf' => '𝕪', - 'Yscr' => '𝒴', - 'yscr' => '𝓎', - 'YUcy' => 'Ю', - 'yucy' => 'ю', - 'Yuml' => 'Ÿ', - 'yuml' => 'ÿ', - 'yum' => 'ÿ', - 'Zacute' => 'Ź', - 'zacute' => 'ź', - 'Zcaron' => 'Ž', - 'zcaron' => 'ž', - 'Zcy' => 'З', - 'zcy' => 'з', - 'Zdot' => 'Ż', - 'zdot' => 'ż', - 'zeetrf' => 'ℨ', - 'ZeroWidthSpace' => '​', - 'Zeta' => 'Ζ', - 'zeta' => 'ζ', - 'Zfr' => 'ℨ', - 'zfr' => '𝔷', - 'ZHcy' => 'Ж', - 'zhcy' => 'ж', - 'zigrarr' => '⇝', - 'Zopf' => 'ℤ', - 'zopf' => '𝕫', - 'Zscr' => '𝒵', - 'zscr' => '𝓏', - 'zwj' => '‍', - 'zwnj' => '‌', - ); -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Exception.php b/dompdf/vendor/masterminds/html5/src/HTML5/Exception.php deleted file mode 100644 index 64e97e6..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Exception.php +++ /dev/null @@ -1,10 +0,0 @@ - self::NAMESPACE_HTML, - 'svg' => self::NAMESPACE_SVG, - 'math' => self::NAMESPACE_MATHML, - ); - - /** - * Holds the always available namespaces (which does not require the XMLNS declaration). - * - * @var array - */ - protected $implicitNamespaces = array( - 'xml' => self::NAMESPACE_XML, - 'xmlns' => self::NAMESPACE_XMLNS, - 'xlink' => self::NAMESPACE_XLINK, - ); - - /** - * Holds a stack of currently active namespaces. - * - * @var array - */ - protected $nsStack = array(); - - /** - * Holds the number of namespaces declared by a node. - * - * @var array - */ - protected $pushes = array(); - - /** - * Defined in 8.2.5. - */ - const IM_INITIAL = 0; - - const IM_BEFORE_HTML = 1; - - const IM_BEFORE_HEAD = 2; - - const IM_IN_HEAD = 3; - - const IM_IN_HEAD_NOSCRIPT = 4; - - const IM_AFTER_HEAD = 5; - - const IM_IN_BODY = 6; - - const IM_TEXT = 7; - - const IM_IN_TABLE = 8; - - const IM_IN_TABLE_TEXT = 9; - - const IM_IN_CAPTION = 10; - - const IM_IN_COLUMN_GROUP = 11; - - const IM_IN_TABLE_BODY = 12; - - const IM_IN_ROW = 13; - - const IM_IN_CELL = 14; - - const IM_IN_SELECT = 15; - - const IM_IN_SELECT_IN_TABLE = 16; - - const IM_AFTER_BODY = 17; - - const IM_IN_FRAMESET = 18; - - const IM_AFTER_FRAMESET = 19; - - const IM_AFTER_AFTER_BODY = 20; - - const IM_AFTER_AFTER_FRAMESET = 21; - - const IM_IN_SVG = 22; - - const IM_IN_MATHML = 23; - - protected $options = array(); - - protected $stack = array(); - - protected $current; // Pointer in the tag hierarchy. - protected $rules; - protected $doc; - - protected $frag; - - protected $processor; - - protected $insertMode = 0; - - /** - * Track if we are in an element that allows only inline child nodes. - * - * @var string|null - */ - protected $onlyInline; - - /** - * Quirks mode is enabled by default. - * Any document that is missing the DT will be considered to be in quirks mode. - */ - protected $quirks = true; - - protected $errors = array(); - - public function __construct($isFragment = false, array $options = array()) - { - $this->options = $options; - - if (isset($options[self::OPT_TARGET_DOC])) { - $this->doc = $options[self::OPT_TARGET_DOC]; - } else { - $impl = new \DOMImplementation(); - // XXX: - // Create the doctype. For now, we are always creating HTML5 - // documents, and attempting to up-convert any older DTDs to HTML5. - $dt = $impl->createDocumentType('html'); - // $this->doc = \DOMImplementation::createDocument(NULL, 'html', $dt); - $this->doc = $impl->createDocument(null, '', $dt); - $this->doc->encoding = !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'; - } - - $this->errors = array(); - - $this->current = $this->doc; // ->documentElement; - - // Create a rules engine for tags. - $this->rules = new TreeBuildingRules(); - - $implicitNS = array(); - if (isset($this->options[self::OPT_IMPLICIT_NS])) { - $implicitNS = $this->options[self::OPT_IMPLICIT_NS]; - } elseif (isset($this->options['implicitNamespaces'])) { - $implicitNS = $this->options['implicitNamespaces']; - } - - // Fill $nsStack with the defalut HTML5 namespaces, plus the "implicitNamespaces" array taken form $options - array_unshift($this->nsStack, $implicitNS + array('' => self::NAMESPACE_HTML) + $this->implicitNamespaces); - - if ($isFragment) { - $this->insertMode = static::IM_IN_BODY; - $this->frag = $this->doc->createDocumentFragment(); - $this->current = $this->frag; - } - } - - /** - * Get the document. - */ - public function document() - { - return $this->doc; - } - - /** - * Get the DOM fragment for the body. - * - * This returns a DOMNodeList because a fragment may have zero or more - * DOMNodes at its root. - * - * @see http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#concept-frag-parse-context - * - * @return \DOMDocumentFragment - */ - public function fragment() - { - return $this->frag; - } - - /** - * Provide an instruction processor. - * - * This is used for handling Processor Instructions as they are - * inserted. If omitted, PI's are inserted directly into the DOM tree. - * - * @param InstructionProcessor $proc - */ - public function setInstructionProcessor(InstructionProcessor $proc) - { - $this->processor = $proc; - } - - public function doctype($name, $idType = 0, $id = null, $quirks = false) - { - // This is used solely for setting quirks mode. Currently we don't - // try to preserve the inbound DT. We convert it to HTML5. - $this->quirks = $quirks; - - if ($this->insertMode > static::IM_INITIAL) { - $this->parseError('Illegal placement of DOCTYPE tag. Ignoring: ' . $name); - - return; - } - - $this->insertMode = static::IM_BEFORE_HTML; - } - - /** - * Process the start tag. - * - * @todo - XMLNS namespace handling (we need to parse, even if it's not valid) - * - XLink, MathML and SVG namespace handling - * - Omission rules: 8.1.2.4 Optional tags - * - * @param string $name - * @param array $attributes - * @param bool $selfClosing - * - * @return int - */ - public function startTag($name, $attributes = array(), $selfClosing = false) - { - $lname = $this->normalizeTagName($name); - - // Make sure we have an html element. - if (!$this->doc->documentElement && 'html' !== $name && !$this->frag) { - $this->startTag('html'); - } - - // Set quirks mode if we're at IM_INITIAL with no doctype. - if ($this->insertMode === static::IM_INITIAL) { - $this->quirks = true; - $this->parseError('No DOCTYPE specified.'); - } - - // SPECIAL TAG HANDLING: - // Spec says do this, and "don't ask." - // find the spec where this is defined... looks problematic - if ('image' === $name && !($this->insertMode === static::IM_IN_SVG || $this->insertMode === static::IM_IN_MATHML)) { - $name = 'img'; - } - - // Autoclose p tags where appropriate. - if ($this->insertMode >= static::IM_IN_BODY && Elements::isA($name, Elements::AUTOCLOSE_P)) { - $this->autoclose('p'); - } - - // Set insert mode: - switch ($name) { - case 'html': - $this->insertMode = static::IM_BEFORE_HEAD; - break; - case 'head': - if ($this->insertMode > static::IM_BEFORE_HEAD) { - $this->parseError('Unexpected head tag outside of head context.'); - } else { - $this->insertMode = static::IM_IN_HEAD; - } - break; - case 'body': - $this->insertMode = static::IM_IN_BODY; - break; - case 'svg': - $this->insertMode = static::IM_IN_SVG; - break; - case 'math': - $this->insertMode = static::IM_IN_MATHML; - break; - case 'noscript': - if ($this->insertMode === static::IM_IN_HEAD) { - $this->insertMode = static::IM_IN_HEAD_NOSCRIPT; - } - break; - } - - // Special case handling for SVG. - if ($this->insertMode === static::IM_IN_SVG) { - $lname = Elements::normalizeSvgElement($lname); - } - - $pushes = 0; - // when we found a tag thats appears inside $nsRoots, we have to switch the defalut namespace - if (isset($this->nsRoots[$lname]) && $this->nsStack[0][''] !== $this->nsRoots[$lname]) { - array_unshift($this->nsStack, array( - '' => $this->nsRoots[$lname], - ) + $this->nsStack[0]); - ++$pushes; - } - $needsWorkaround = false; - if (isset($this->options['xmlNamespaces']) && $this->options['xmlNamespaces']) { - // when xmlNamespaces is true a and we found a 'xmlns' or 'xmlns:*' attribute, we should add a new item to the $nsStack - foreach ($attributes as $aName => $aVal) { - if ('xmlns' === $aName) { - $needsWorkaround = $aVal; - array_unshift($this->nsStack, array( - '' => $aVal, - ) + $this->nsStack[0]); - ++$pushes; - } elseif ('xmlns' === (($pos = strpos($aName, ':')) ? substr($aName, 0, $pos) : '')) { - array_unshift($this->nsStack, array( - substr($aName, $pos + 1) => $aVal, - ) + $this->nsStack[0]); - ++$pushes; - } - } - } - - if ($this->onlyInline && Elements::isA($lname, Elements::BLOCK_TAG)) { - $this->autoclose($this->onlyInline); - $this->onlyInline = null; - } - - // some elements as table related tags might have optional end tags that force us to auto close multiple tags - // https://www.w3.org/TR/html401/struct/tables.html - if ($this->current instanceof \DOMElement && isset(Elements::$optionalEndElementsParentsToClose[$lname])) { - foreach (Elements::$optionalEndElementsParentsToClose[$lname] as $parentElName) { - if ($this->current instanceof \DOMElement && $this->current->tagName === $parentElName) { - $this->autoclose($parentElName); - } - } - } - - try { - $prefix = ($pos = strpos($lname, ':')) ? substr($lname, 0, $pos) : ''; - - if (false !== $needsWorkaround) { - $xml = "<$lname xmlns=\"$needsWorkaround\" " . (strlen($prefix) && isset($this->nsStack[0][$prefix]) ? ("xmlns:$prefix=\"" . $this->nsStack[0][$prefix] . '"') : '') . '/>'; - - $frag = new \DOMDocument('1.0', 'UTF-8'); - $frag->loadXML($xml); - - $ele = $this->doc->importNode($frag->documentElement, true); - } else { - if (!isset($this->nsStack[0][$prefix]) || ('' === $prefix && isset($this->options[self::OPT_DISABLE_HTML_NS]) && $this->options[self::OPT_DISABLE_HTML_NS])) { - $ele = $this->doc->createElement($lname); - } else { - $ele = $this->doc->createElementNS($this->nsStack[0][$prefix], $lname); - } - } - } catch (\DOMException $e) { - $this->parseError("Illegal tag name: <$lname>. Replaced with ."); - $ele = $this->doc->createElement('invalid'); - } - - if (Elements::isA($lname, Elements::BLOCK_ONLY_INLINE)) { - $this->onlyInline = $lname; - } - - // When we add some namespacess, we have to track them. Later, when "endElement" is invoked, we have to remove them. - // When we are on a void tag, we do not need to care about namesapce nesting. - if ($pushes > 0 && !Elements::isA($name, Elements::VOID_TAG)) { - // PHP tends to free the memory used by DOM, - // to avoid spl_object_hash collisions whe have to avoid garbage collection of $ele storing it into $pushes - // see https://bugs.php.net/bug.php?id=67459 - $this->pushes[spl_object_hash($ele)] = array($pushes, $ele); - } - - foreach ($attributes as $aName => $aVal) { - // xmlns attributes can't be set - if ('xmlns' === $aName) { - continue; - } - - if ($this->insertMode === static::IM_IN_SVG) { - $aName = Elements::normalizeSvgAttribute($aName); - } elseif ($this->insertMode === static::IM_IN_MATHML) { - $aName = Elements::normalizeMathMlAttribute($aName); - } - - $aVal = (string) $aVal; - - try { - $prefix = ($pos = strpos($aName, ':')) ? substr($aName, 0, $pos) : false; - - if ('xmlns' === $prefix) { - $ele->setAttributeNS(self::NAMESPACE_XMLNS, $aName, $aVal); - } elseif (false !== $prefix && isset($this->nsStack[0][$prefix])) { - $ele->setAttributeNS($this->nsStack[0][$prefix], $aName, $aVal); - } else { - $ele->setAttribute($aName, $aVal); - } - } catch (\DOMException $e) { - $this->parseError("Illegal attribute name for tag $name. Ignoring: $aName"); - continue; - } - - // This is necessary on a non-DTD schema, like HTML5. - if ('id' === $aName) { - $ele->setIdAttribute('id', true); - } - } - - if ($this->frag !== $this->current && $this->rules->hasRules($name)) { - // Some elements have special processing rules. Handle those separately. - $this->current = $this->rules->evaluate($ele, $this->current); - } else { - // Otherwise, it's a standard element. - $this->current->appendChild($ele); - - if (!Elements::isA($name, Elements::VOID_TAG)) { - $this->current = $ele; - } - - // Self-closing tags should only be respected on foreign elements - // (and are implied on void elements) - // See: https://www.w3.org/TR/html5/syntax.html#start-tags - if (Elements::isHtml5Element($name)) { - $selfClosing = false; - } - } - - // This is sort of a last-ditch attempt to correct for cases where no head/body - // elements are provided. - if ($this->insertMode <= static::IM_BEFORE_HEAD && 'head' !== $name && 'html' !== $name) { - $this->insertMode = static::IM_IN_BODY; - } - - // When we are on a void tag, we do not need to care about namesapce nesting, - // but we have to remove the namespaces pushed to $nsStack. - if ($pushes > 0 && Elements::isA($name, Elements::VOID_TAG)) { - // remove the namespaced definded by current node - for ($i = 0; $i < $pushes; ++$i) { - array_shift($this->nsStack); - } - } - - if ($selfClosing) { - $this->endTag($name); - } - - // Return the element mask, which the tokenizer can then use to set - // various processing rules. - return Elements::element($name); - } - - public function endTag($name) - { - $lname = $this->normalizeTagName($name); - - // Special case within 12.2.6.4.7: An end tag whose tag name is "br" should be treated as an opening tag - if ('br' === $name) { - $this->parseError('Closing tag encountered for void element br.'); - - $this->startTag('br'); - } - // Ignore closing tags for other unary elements. - elseif (Elements::isA($name, Elements::VOID_TAG)) { - return; - } - - if ($this->insertMode <= static::IM_BEFORE_HTML) { - // 8.2.5.4.2 - if (in_array($name, array( - 'html', - 'br', - 'head', - 'title', - ))) { - $this->startTag('html'); - $this->endTag($name); - $this->insertMode = static::IM_BEFORE_HEAD; - - return; - } - - // Ignore the tag. - $this->parseError('Illegal closing tag at global scope.'); - - return; - } - - // Special case handling for SVG. - if ($this->insertMode === static::IM_IN_SVG) { - $lname = Elements::normalizeSvgElement($lname); - } - - $cid = spl_object_hash($this->current); - - // XXX: HTML has no parent. What do we do, though, - // if this element appears in the wrong place? - if ('html' === $lname) { - return; - } - - // remove the namespaced definded by current node - if (isset($this->pushes[$cid])) { - for ($i = 0; $i < $this->pushes[$cid][0]; ++$i) { - array_shift($this->nsStack); - } - unset($this->pushes[$cid]); - } - - if (!$this->autoclose($lname)) { - $this->parseError('Could not find closing tag for ' . $lname); - } - - switch ($lname) { - case 'head': - $this->insertMode = static::IM_AFTER_HEAD; - break; - case 'body': - $this->insertMode = static::IM_AFTER_BODY; - break; - case 'svg': - case 'mathml': - $this->insertMode = static::IM_IN_BODY; - break; - } - } - - public function comment($cdata) - { - // TODO: Need to handle case where comment appears outside of the HTML tag. - $node = $this->doc->createComment($cdata); - $this->current->appendChild($node); - } - - public function text($data) - { - // XXX: Hmmm.... should we really be this strict? - if ($this->insertMode < static::IM_IN_HEAD) { - // Per '8.2.5.4.3 The "before head" insertion mode' the characters - // " \t\n\r\f" should be ignored but no mention of a parse error. This is - // practical as most documents contain these characters. Other text is not - // expected here so recording a parse error is necessary. - $dataTmp = trim($data, " \t\n\r\f"); - if (!empty($dataTmp)) { - // fprintf(STDOUT, "Unexpected insert mode: %d", $this->insertMode); - $this->parseError('Unexpected text. Ignoring: ' . $dataTmp); - } - - return; - } - // fprintf(STDOUT, "Appending text %s.", $data); - $node = $this->doc->createTextNode($data); - $this->current->appendChild($node); - } - - public function eof() - { - // If the $current isn't the $root, do we need to do anything? - } - - public function parseError($msg, $line = 0, $col = 0) - { - $this->errors[] = sprintf('Line %d, Col %d: %s', $line, $col, $msg); - } - - public function getErrors() - { - return $this->errors; - } - - public function cdata($data) - { - $node = $this->doc->createCDATASection($data); - $this->current->appendChild($node); - } - - public function processingInstruction($name, $data = null) - { - // XXX: Ignore initial XML declaration, per the spec. - if ($this->insertMode === static::IM_INITIAL && 'xml' === strtolower($name)) { - return; - } - - // Important: The processor may modify the current DOM tree however it sees fit. - if ($this->processor instanceof InstructionProcessor) { - $res = $this->processor->process($this->current, $name, $data); - if (!empty($res)) { - $this->current = $res; - } - - return; - } - - // Otherwise, this is just a dumb PI element. - $node = $this->doc->createProcessingInstruction($name, $data); - - $this->current->appendChild($node); - } - - // ========================================================================== - // UTILITIES - // ========================================================================== - - /** - * Apply normalization rules to a tag name. - * See sections 2.9 and 8.1.2. - * - * @param string $tagName - * - * @return string The normalized tag name. - */ - protected function normalizeTagName($tagName) - { - /* - * Section 2.9 suggests that we should not do this. if (strpos($name, ':') !== false) { // We know from the grammar that there must be at least one other // char besides :, since : is not a legal tag start. $parts = explode(':', $name); return array_pop($parts); } - */ - return $tagName; - } - - protected function quirksTreeResolver($name) - { - throw new \Exception('Not implemented.'); - } - - /** - * Automatically climb the tree and close the closest node with the matching $tag. - * - * @param string $tagName - * - * @return bool - */ - protected function autoclose($tagName) - { - $working = $this->current; - do { - if (XML_ELEMENT_NODE !== $working->nodeType) { - return false; - } - if ($working->tagName === $tagName) { - $this->current = $working->parentNode; - - return true; - } - } while ($working = $working->parentNode); - - return false; - } - - /** - * Checks if the given tagname is an ancestor of the present candidate. - * - * If $this->current or anything above $this->current matches the given tag - * name, this returns true. - * - * @param string $tagName - * - * @return bool - */ - protected function isAncestor($tagName) - { - $candidate = $this->current; - while (XML_ELEMENT_NODE === $candidate->nodeType) { - if ($candidate->tagName === $tagName) { - return true; - } - $candidate = $candidate->parentNode; - } - - return false; - } - - /** - * Returns true if the immediate parent element is of the given tagname. - * - * @param string $tagName - * - * @return bool - */ - protected function isParent($tagName) - { - return $this->current->tagName === $tagName; - } -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php deleted file mode 100644 index 9893a71..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php +++ /dev/null @@ -1,114 +0,0 @@ -). - * - * @return int one of the Tokenizer::TEXTMODE_* constants - */ - public function startTag($name, $attributes = array(), $selfClosing = false); - - /** - * An end-tag. - */ - public function endTag($name); - - /** - * A comment section (unparsed character data). - */ - public function comment($cdata); - - /** - * A unit of parsed character data. - * - * Entities in this text are *already decoded*. - */ - public function text($cdata); - - /** - * Indicates that the document has been entirely processed. - */ - public function eof(); - - /** - * Emitted when the parser encounters an error condition. - */ - public function parseError($msg, $line, $col); - - /** - * A CDATA section. - * - * @param string $data - * The unparsed character data - */ - public function cdata($data); - - /** - * This is a holdover from the XML spec. - * - * While user agents don't get PIs, server-side does. - * - * @param string $name The name of the processor (e.g. 'php'). - * @param string $data The unparsed data. - */ - public function processingInstruction($name, $data = null); -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php deleted file mode 100644 index b081ed9..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php +++ /dev/null @@ -1,33 +0,0 @@ -errors = UTF8Utils::checkForIllegalCodepoints($data); - - $data = $this->replaceLinefeeds($data); - - $this->data = $data; - $this->char = 0; - $this->EOF = strlen($data); - } - - /** - * Check if upcomming chars match the given sequence. - * - * This will read the stream for the $sequence. If it's - * found, this will return true. If not, return false. - * Since this unconsumes any chars it reads, the caller - * will still need to read the next sequence, even if - * this returns true. - * - * Example: $this->scanner->sequenceMatches('') will - * see if the input stream is at the start of a - * '' string. - * - * @param string $sequence - * @param bool $caseSensitive - * - * @return bool - */ - public function sequenceMatches($sequence, $caseSensitive = true) - { - $portion = substr($this->data, $this->char, strlen($sequence)); - - return $caseSensitive ? $portion === $sequence : 0 === strcasecmp($portion, $sequence); - } - - /** - * Get the current position. - * - * @return int The current intiger byte position. - */ - public function position() - { - return $this->char; - } - - /** - * Take a peek at the next character in the data. - * - * @return string The next character. - */ - public function peek() - { - if (($this->char + 1) < $this->EOF) { - return $this->data[$this->char + 1]; - } - - return false; - } - - /** - * Get the next character. - * Note: This advances the pointer. - * - * @return string The next character. - */ - public function next() - { - ++$this->char; - - if ($this->char < $this->EOF) { - return $this->data[$this->char]; - } - - return false; - } - - /** - * Get the current character. - * Note, this does not advance the pointer. - * - * @return string The current character. - */ - public function current() - { - if ($this->char < $this->EOF) { - return $this->data[$this->char]; - } - - return false; - } - - /** - * Silently consume N chars. - * - * @param int $count - */ - public function consume($count = 1) - { - $this->char += $count; - } - - /** - * Unconsume some of the data. - * This moves the data pointer backwards. - * - * @param int $howMany The number of characters to move the pointer back. - */ - public function unconsume($howMany = 1) - { - if (($this->char - $howMany) >= 0) { - $this->char -= $howMany; - } - } - - /** - * Get the next group of that contains hex characters. - * Note, along with getting the characters the pointer in the data will be - * moved as well. - * - * @return string The next group that is hex characters. - */ - public function getHex() - { - return $this->doCharsWhile(static::CHARS_HEX); - } - - /** - * Get the next group of characters that are ASCII Alpha characters. - * Note, along with getting the characters the pointer in the data will be - * moved as well. - * - * @return string The next group of ASCII alpha characters. - */ - public function getAsciiAlpha() - { - return $this->doCharsWhile(static::CHARS_ALPHA); - } - - /** - * Get the next group of characters that are ASCII Alpha characters and numbers. - * Note, along with getting the characters the pointer in the data will be - * moved as well. - * - * @return string The next group of ASCII alpha characters and numbers. - */ - public function getAsciiAlphaNum() - { - return $this->doCharsWhile(static::CHARS_ALNUM); - } - - /** - * Get the next group of numbers. - * Note, along with getting the characters the pointer in the data will be - * moved as well. - * - * @return string The next group of numbers. - */ - public function getNumeric() - { - return $this->doCharsWhile('0123456789'); - } - - /** - * Consume whitespace. - * Whitespace in HTML5 is: formfeed, tab, newline, space. - * - * @return int The length of the matched whitespaces. - */ - public function whitespace() - { - if ($this->char >= $this->EOF) { - return false; - } - - $len = strspn($this->data, "\n\t\f ", $this->char); - - $this->char += $len; - - return $len; - } - - /** - * Returns the current line that is being consumed. - * - * @return int The current line number. - */ - public function currentLine() - { - if (empty($this->EOF) || 0 === $this->char) { - return 1; - } - - // Add one to $this->char because we want the number for the next - // byte to be processed. - return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1; - } - - /** - * Read chars until something in the mask is encountered. - * - * @param string $mask - * - * @return mixed - */ - public function charsUntil($mask) - { - return $this->doCharsUntil($mask); - } - - /** - * Read chars as long as the mask matches. - * - * @param string $mask - * - * @return int - */ - public function charsWhile($mask) - { - return $this->doCharsWhile($mask); - } - - /** - * Returns the current column of the current line that the tokenizer is at. - * - * Newlines are column 0. The first char after a newline is column 1. - * - * @return int The column number. - */ - public function columnOffset() - { - // Short circuit for the first char. - if (0 === $this->char) { - return 0; - } - - // strrpos is weird, and the offset needs to be negative for what we - // want (i.e., the last \n before $this->char). This needs to not have - // one (to make it point to the next character, the one we want the - // position of) added to it because strrpos's behaviour includes the - // final offset byte. - $backwardFrom = $this->char - 1 - strlen($this->data); - $lastLine = strrpos($this->data, "\n", $backwardFrom); - - // However, for here we want the length up until the next byte to be - // processed, so add one to the current byte ($this->char). - if (false !== $lastLine) { - $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine); - } else { - // After a newline. - $findLengthOf = substr($this->data, 0, $this->char); - } - - return UTF8Utils::countChars($findLengthOf); - } - - /** - * Get all characters until EOF. - * - * This consumes characters until the EOF. - * - * @return int The number of characters remaining. - */ - public function remainingChars() - { - if ($this->char < $this->EOF) { - $data = substr($this->data, $this->char); - $this->char = $this->EOF; - - return $data; - } - - return ''; // false; - } - - /** - * Replace linefeed characters according to the spec. - * - * @param $data - * - * @return string - */ - private function replaceLinefeeds($data) - { - /* - * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially. - * Any CR characters that are followed by LF characters must be removed, and any CR characters not - * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are - * represented by LF characters, and there are never any CR characters in the input to the tokenization - * stage. - */ - $crlfTable = array( - "\0" => "\xEF\xBF\xBD", - "\r\n" => "\n", - "\r" => "\n", - ); - - return strtr($data, $crlfTable); - } - - /** - * Read to a particular match (or until $max bytes are consumed). - * - * This operates on byte sequences, not characters. - * - * Matches as far as possible until we reach a certain set of bytes - * and returns the matched substring. - * - * @param string $bytes Bytes to match. - * @param int $max Maximum number of bytes to scan. - * - * @return mixed Index or false if no match is found. You should use strong - * equality when checking the result, since index could be 0. - */ - private function doCharsUntil($bytes, $max = null) - { - if ($this->char >= $this->EOF) { - return false; - } - - if (0 === $max || $max) { - $len = strcspn($this->data, $bytes, $this->char, $max); - } else { - $len = strcspn($this->data, $bytes, $this->char); - } - - $string = (string) substr($this->data, $this->char, $len); - $this->char += $len; - - return $string; - } - - /** - * Returns the string so long as $bytes matches. - * - * Matches as far as possible with a certain set of bytes - * and returns the matched substring. - * - * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the - * current char, the pointer advances and the char is part of the - * substring. - * @param int $max The max number of chars to read. - * - * @return string - */ - private function doCharsWhile($bytes, $max = null) - { - if ($this->char >= $this->EOF) { - return false; - } - - if (0 === $max || $max) { - $len = strspn($this->data, $bytes, $this->char, $max); - } else { - $len = strspn($this->data, $bytes, $this->char); - } - - $string = (string) substr($this->data, $this->char, $len); - $this->char += $len; - - return $string; - } -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php deleted file mode 100644 index 75b0886..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php +++ /dev/null @@ -1,336 +0,0 @@ - - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*/ - -// Some conventions: -// - /* */ indicates verbatim text from the HTML 5 specification -// MPB: Not sure which version of the spec. Moving from HTML5lib to -// HTML5-PHP, I have been using this version: -// http://www.w3.org/TR/2012/CR-html5-20121217/Overview.html#contents -// -// - // indicates regular comments - -/** - * @deprecated since 2.4, to remove in 3.0. Use a string in the scanner instead. - */ -class StringInputStream implements InputStream -{ - /** - * The string data we're parsing. - */ - private $data; - - /** - * The current integer byte position we are in $data. - */ - private $char; - - /** - * Length of $data; when $char === $data, we are at the end-of-file. - */ - private $EOF; - - /** - * Parse errors. - */ - public $errors = array(); - - /** - * Create a new InputStream wrapper. - * - * @param string $data Data to parse. - * @param string $encoding The encoding to use for the data. - * @param string $debug A fprintf format to use to echo the data on stdout. - */ - public function __construct($data, $encoding = 'UTF-8', $debug = '') - { - $data = UTF8Utils::convertToUTF8($data, $encoding); - if ($debug) { - fprintf(STDOUT, $debug, $data, strlen($data)); - } - - // There is good reason to question whether it makes sense to - // do this here, since most of these checks are done during - // parsing, and since this check doesn't actually *do* anything. - $this->errors = UTF8Utils::checkForIllegalCodepoints($data); - - $data = $this->replaceLinefeeds($data); - - $this->data = $data; - $this->char = 0; - $this->EOF = strlen($data); - } - - public function __toString() - { - return $this->data; - } - - /** - * Replace linefeed characters according to the spec. - */ - protected function replaceLinefeeds($data) - { - /* - * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially. - * Any CR characters that are followed by LF characters must be removed, and any CR characters not - * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are - * represented by LF characters, and there are never any CR characters in the input to the tokenization - * stage. - */ - $crlfTable = array( - "\0" => "\xEF\xBF\xBD", - "\r\n" => "\n", - "\r" => "\n", - ); - - return strtr($data, $crlfTable); - } - - /** - * Returns the current line that the tokenizer is at. - */ - public function currentLine() - { - if (empty($this->EOF) || 0 === $this->char) { - return 1; - } - // Add one to $this->char because we want the number for the next - // byte to be processed. - return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1; - } - - /** - * @deprecated - */ - public function getCurrentLine() - { - return $this->currentLine(); - } - - /** - * Returns the current column of the current line that the tokenizer is at. - * Newlines are column 0. The first char after a newline is column 1. - * - * @return int The column number. - */ - public function columnOffset() - { - // Short circuit for the first char. - if (0 === $this->char) { - return 0; - } - // strrpos is weird, and the offset needs to be negative for what we - // want (i.e., the last \n before $this->char). This needs to not have - // one (to make it point to the next character, the one we want the - // position of) added to it because strrpos's behaviour includes the - // final offset byte. - $backwardFrom = $this->char - 1 - strlen($this->data); - $lastLine = strrpos($this->data, "\n", $backwardFrom); - - // However, for here we want the length up until the next byte to be - // processed, so add one to the current byte ($this->char). - if (false !== $lastLine) { - $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine); - } else { - // After a newline. - $findLengthOf = substr($this->data, 0, $this->char); - } - - return UTF8Utils::countChars($findLengthOf); - } - - /** - * @deprecated - */ - public function getColumnOffset() - { - return $this->columnOffset(); - } - - /** - * Get the current character. - * - * @return string The current character. - */ - #[\ReturnTypeWillChange] - public function current() - { - return $this->data[$this->char]; - } - - /** - * Advance the pointer. - * This is part of the Iterator interface. - */ - #[\ReturnTypeWillChange] - public function next() - { - ++$this->char; - } - - /** - * Rewind to the start of the string. - */ - #[\ReturnTypeWillChange] - public function rewind() - { - $this->char = 0; - } - - /** - * Is the current pointer location valid. - * - * @return bool Whether the current pointer location is valid. - */ - #[\ReturnTypeWillChange] - public function valid() - { - return $this->char < $this->EOF; - } - - /** - * Get all characters until EOF. - * - * This reads to the end of the file, and sets the read marker at the - * end of the file. - * - * Note this performs bounds checking. - * - * @return string Returns the remaining text. If called when the InputStream is - * already exhausted, it returns an empty string. - */ - public function remainingChars() - { - if ($this->char < $this->EOF) { - $data = substr($this->data, $this->char); - $this->char = $this->EOF; - - return $data; - } - - return ''; // false; - } - - /** - * Read to a particular match (or until $max bytes are consumed). - * - * This operates on byte sequences, not characters. - * - * Matches as far as possible until we reach a certain set of bytes - * and returns the matched substring. - * - * @param string $bytes Bytes to match. - * @param int $max Maximum number of bytes to scan. - * - * @return mixed Index or false if no match is found. You should use strong - * equality when checking the result, since index could be 0. - */ - public function charsUntil($bytes, $max = null) - { - if ($this->char >= $this->EOF) { - return false; - } - - if (0 === $max || $max) { - $len = strcspn($this->data, $bytes, $this->char, $max); - } else { - $len = strcspn($this->data, $bytes, $this->char); - } - - $string = (string) substr($this->data, $this->char, $len); - $this->char += $len; - - return $string; - } - - /** - * Returns the string so long as $bytes matches. - * - * Matches as far as possible with a certain set of bytes - * and returns the matched substring. - * - * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the - * current char, the pointer advances and the char is part of the - * substring. - * @param int $max The max number of chars to read. - * - * @return string - */ - public function charsWhile($bytes, $max = null) - { - if ($this->char >= $this->EOF) { - return false; - } - - if (0 === $max || $max) { - $len = strspn($this->data, $bytes, $this->char, $max); - } else { - $len = strspn($this->data, $bytes, $this->char); - } - $string = (string) substr($this->data, $this->char, $len); - $this->char += $len; - - return $string; - } - - /** - * Unconsume characters. - * - * @param int $howMany The number of characters to unconsume. - */ - public function unconsume($howMany = 1) - { - if (($this->char - $howMany) >= 0) { - $this->char -= $howMany; - } - } - - /** - * Look ahead without moving cursor. - */ - public function peek() - { - if (($this->char + 1) <= $this->EOF) { - return $this->data[$this->char + 1]; - } - - return false; - } - - #[\ReturnTypeWillChange] - public function key() - { - return $this->char; - } -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php deleted file mode 100644 index e8b4aa0..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php +++ /dev/null @@ -1,1214 +0,0 @@ -scanner = $scanner; - $this->events = $eventHandler; - $this->mode = $mode; - } - - /** - * Begin parsing. - * - * This will begin scanning the document, tokenizing as it goes. - * Tokens are emitted into the event handler. - * - * Tokenizing will continue until the document is completely - * read. Errors are emitted into the event handler, but - * the parser will attempt to continue parsing until the - * entire input stream is read. - */ - public function parse() - { - do { - $this->consumeData(); - // FIXME: Add infinite loop protection. - } while ($this->carryOn); - } - - /** - * Set the text mode for the character data reader. - * - * HTML5 defines three different modes for reading text: - * - Normal: Read until a tag is encountered. - * - RCDATA: Read until a tag is encountered, but skip a few otherwise- - * special characters. - * - Raw: Read until a special closing tag is encountered (viz. pre, script) - * - * This allows those modes to be set. - * - * Normally, setting is done by the event handler via a special return code on - * startTag(), but it can also be set manually using this function. - * - * @param int $textmode One of Elements::TEXT_*. - * @param string $untilTag The tag that should stop RAW or RCDATA mode. Normal mode does not - * use this indicator. - */ - public function setTextMode($textmode, $untilTag = null) - { - $this->textMode = $textmode & (Elements::TEXT_RAW | Elements::TEXT_RCDATA); - $this->untilTag = $untilTag; - } - - /** - * Consume a character and make a move. - * HTML5 8.2.4.1. - */ - protected function consumeData() - { - $tok = $this->scanner->current(); - - if ('&' === $tok) { - // Character reference - $ref = $this->decodeCharacterReference(); - $this->buffer($ref); - - $tok = $this->scanner->current(); - } - - // Parse tag - if ('<' === $tok) { - // Any buffered text data can go out now. - $this->flushBuffer(); - - $tok = $this->scanner->next(); - - if (false === $tok) { - // end of string - $this->parseError('Illegal tag opening'); - } elseif ('!' === $tok) { - $this->markupDeclaration(); - } elseif ('/' === $tok) { - $this->endTag(); - } elseif ('?' === $tok) { - $this->processingInstruction(); - } elseif ($this->is_alpha($tok)) { - $this->tagName(); - } else { - $this->parseError('Illegal tag opening'); - // TODO is this necessary ? - $this->characterData(); - } - - $tok = $this->scanner->current(); - } - - if (false === $tok) { - // Handle end of document - $this->eof(); - } else { - // Parse character - switch ($this->textMode) { - case Elements::TEXT_RAW: - $this->rawText($tok); - break; - - case Elements::TEXT_RCDATA: - $this->rcdata($tok); - break; - - default: - if ('<' === $tok || '&' === $tok) { - break; - } - - // NULL character - if ("\00" === $tok) { - $this->parseError('Received null character.'); - - $this->text .= $tok; - $this->scanner->consume(); - - break; - } - - $this->text .= $this->scanner->charsUntil("<&\0"); - } - } - - return $this->carryOn; - } - - /** - * Parse anything that looks like character data. - * - * Different rules apply based on the current text mode. - * - * @see Elements::TEXT_RAW Elements::TEXT_RCDATA. - */ - protected function characterData() - { - $tok = $this->scanner->current(); - if (false === $tok) { - return false; - } - switch ($this->textMode) { - case Elements::TEXT_RAW: - return $this->rawText($tok); - case Elements::TEXT_RCDATA: - return $this->rcdata($tok); - default: - if ('<' === $tok || '&' === $tok) { - return false; - } - - return $this->text($tok); - } - } - - /** - * This buffers the current token as character data. - * - * @param string $tok The current token. - * - * @return bool - */ - protected function text($tok) - { - // This should never happen... - if (false === $tok) { - return false; - } - - // NULL character - if ("\00" === $tok) { - $this->parseError('Received null character.'); - } - - $this->buffer($tok); - $this->scanner->consume(); - - return true; - } - - /** - * Read text in RAW mode. - * - * @param string $tok The current token. - * - * @return bool - */ - protected function rawText($tok) - { - if (is_null($this->untilTag)) { - return $this->text($tok); - } - - $sequence = 'untilTag . '>'; - $txt = $this->readUntilSequence($sequence); - $this->events->text($txt); - $this->setTextMode(0); - - return $this->endTag(); - } - - /** - * Read text in RCDATA mode. - * - * @param string $tok The current token. - * - * @return bool - */ - protected function rcdata($tok) - { - if (is_null($this->untilTag)) { - return $this->text($tok); - } - - $sequence = 'untilTag; - $txt = ''; - - $caseSensitive = !Elements::isHtml5Element($this->untilTag); - while (false !== $tok && !('<' == $tok && ($this->scanner->sequenceMatches($sequence, $caseSensitive)))) { - if ('&' == $tok) { - $txt .= $this->decodeCharacterReference(); - $tok = $this->scanner->current(); - } else { - $txt .= $tok; - $tok = $this->scanner->next(); - } - } - $len = strlen($sequence); - $this->scanner->consume($len); - $len += $this->scanner->whitespace(); - if ('>' !== $this->scanner->current()) { - $this->parseError('Unclosed RCDATA end tag'); - } - - $this->scanner->unconsume($len); - $this->events->text($txt); - $this->setTextMode(0); - - return $this->endTag(); - } - - /** - * If the document is read, emit an EOF event. - */ - protected function eof() - { - // fprintf(STDOUT, "EOF"); - $this->flushBuffer(); - $this->events->eof(); - $this->carryOn = false; - } - - /** - * Look for markup. - */ - protected function markupDeclaration() - { - $tok = $this->scanner->next(); - - // Comment: - if ('-' == $tok && '-' == $this->scanner->peek()) { - $this->scanner->consume(2); - - return $this->comment(); - } elseif ('D' == $tok || 'd' == $tok) { // Doctype - return $this->doctype(); - } elseif ('[' == $tok) { // CDATA section - return $this->cdataSection(); - } - - // FINISH - $this->parseError('Expected . Emit an empty comment because 8.2.4.46 says to. - if ('>' == $tok) { - // Parse error. Emit the comment token. - $this->parseError("Expected comment data, got '>'"); - $this->events->comment(''); - $this->scanner->consume(); - - return true; - } - - // Replace NULL with the replacement char. - if ("\0" == $tok) { - $tok = UTF8Utils::FFFD; - } - while (!$this->isCommentEnd()) { - $comment .= $tok; - $tok = $this->scanner->next(); - } - - $this->events->comment($comment); - $this->scanner->consume(); - - return true; - } - - /** - * Check if the scanner has reached the end of a comment. - * - * @return bool - */ - protected function isCommentEnd() - { - $tok = $this->scanner->current(); - - // EOF - if (false === $tok) { - // Hit the end. - $this->parseError('Unexpected EOF in a comment.'); - - return true; - } - - // If next two tokens are not '--', not the end. - if ('-' != $tok || '-' != $this->scanner->peek()) { - return false; - } - - $this->scanner->consume(2); // Consume '-' and one of '!' or '>' - - // Test for '>' - if ('>' == $this->scanner->current()) { - return true; - } - // Test for '!>' - if ('!' == $this->scanner->current() && '>' == $this->scanner->peek()) { - $this->scanner->consume(); // Consume the last '>' - return true; - } - // Unread '-' and one of '!' or '>'; - $this->scanner->unconsume(2); - - return false; - } - - /** - * Parse a DOCTYPE. - * - * Parse a DOCTYPE declaration. This method has strong bearing on whether or - * not Quirksmode is enabled on the event handler. - * - * @todo This method is a little long. Should probably refactor. - * - * @return bool - */ - protected function doctype() - { - // Check that string is DOCTYPE. - if ($this->scanner->sequenceMatches('DOCTYPE', false)) { - $this->scanner->consume(7); - } else { - $chars = $this->scanner->charsWhile('DOCTYPEdoctype'); - $this->parseError('Expected DOCTYPE, got %s', $chars); - - return $this->bogusComment('scanner->whitespace(); - $tok = $this->scanner->current(); - - // EOF: die. - if (false === $tok) { - $this->events->doctype('html5', EventHandler::DOCTYPE_NONE, '', true); - $this->eof(); - - return true; - } - - // NULL char: convert. - if ("\0" === $tok) { - $this->parseError('Unexpected null character in DOCTYPE.'); - } - - $stop = " \n\f>"; - $doctypeName = $this->scanner->charsUntil($stop); - // Lowercase ASCII, replace \0 with FFFD - $doctypeName = strtolower(strtr($doctypeName, "\0", UTF8Utils::FFFD)); - - $tok = $this->scanner->current(); - - // If false, emit a parse error, DOCTYPE, and return. - if (false === $tok) { - $this->parseError('Unexpected EOF in DOCTYPE declaration.'); - $this->events->doctype($doctypeName, EventHandler::DOCTYPE_NONE, null, true); - - return true; - } - - // Short DOCTYPE, like - if ('>' == $tok) { - // DOCTYPE without a name. - if (0 == strlen($doctypeName)) { - $this->parseError('Expected a DOCTYPE name. Got nothing.'); - $this->events->doctype($doctypeName, 0, null, true); - $this->scanner->consume(); - - return true; - } - $this->events->doctype($doctypeName); - $this->scanner->consume(); - - return true; - } - $this->scanner->whitespace(); - - $pub = strtoupper($this->scanner->getAsciiAlpha()); - $white = $this->scanner->whitespace(); - - // Get ID, and flag it as pub or system. - if (('PUBLIC' == $pub || 'SYSTEM' == $pub) && $white > 0) { - // Get the sys ID. - $type = 'PUBLIC' == $pub ? EventHandler::DOCTYPE_PUBLIC : EventHandler::DOCTYPE_SYSTEM; - $id = $this->quotedString("\0>"); - if (false === $id) { - $this->events->doctype($doctypeName, $type, $pub, false); - - return true; - } - - // Premature EOF. - if (false === $this->scanner->current()) { - $this->parseError('Unexpected EOF in DOCTYPE'); - $this->events->doctype($doctypeName, $type, $id, true); - - return true; - } - - // Well-formed complete DOCTYPE. - $this->scanner->whitespace(); - if ('>' == $this->scanner->current()) { - $this->events->doctype($doctypeName, $type, $id, false); - $this->scanner->consume(); - - return true; - } - - // If we get here, we have scanner->charsUntil('>'); - $this->parseError('Malformed DOCTYPE.'); - $this->events->doctype($doctypeName, $type, $id, true); - $this->scanner->consume(); - - return true; - } - - // Else it's a bogus DOCTYPE. - // Consume to > and trash. - $this->scanner->charsUntil('>'); - - $this->parseError('Expected PUBLIC or SYSTEM. Got %s.', $pub); - $this->events->doctype($doctypeName, 0, null, true); - $this->scanner->consume(); - - return true; - } - - /** - * Utility for reading a quoted string. - * - * @param string $stopchars Characters (in addition to a close-quote) that should stop the string. - * E.g. sometimes '>' is higher precedence than '"' or "'". - * - * @return mixed String if one is found (quotations omitted). - */ - protected function quotedString($stopchars) - { - $tok = $this->scanner->current(); - if ('"' == $tok || "'" == $tok) { - $this->scanner->consume(); - $ret = $this->scanner->charsUntil($tok . $stopchars); - if ($this->scanner->current() == $tok) { - $this->scanner->consume(); - } else { - // Parse error because no close quote. - $this->parseError('Expected %s, got %s', $tok, $this->scanner->current()); - } - - return $ret; - } - - return false; - } - - /** - * Handle a CDATA section. - * - * @return bool - */ - protected function cdataSection() - { - $cdata = ''; - $this->scanner->consume(); - - $chars = $this->scanner->charsWhile('CDAT'); - if ('CDATA' != $chars || '[' != $this->scanner->current()) { - $this->parseError('Expected [CDATA[, got %s', $chars); - - return $this->bogusComment('scanner->next(); - do { - if (false === $tok) { - $this->parseError('Unexpected EOF inside CDATA.'); - $this->bogusComment('scanner->next(); - } while (!$this->scanner->sequenceMatches(']]>')); - - // Consume ]]> - $this->scanner->consume(3); - - $this->events->cdata($cdata); - - return true; - } - - // ================================================================ - // Non-HTML5 - // ================================================================ - - /** - * Handle a processing instruction. - * - * XML processing instructions are supposed to be ignored in HTML5, - * treated as "bogus comments". However, since we're not a user - * agent, we allow them. We consume until ?> and then issue a - * EventListener::processingInstruction() event. - * - * @return bool - */ - protected function processingInstruction() - { - if ('?' != $this->scanner->current()) { - return false; - } - - $tok = $this->scanner->next(); - $procName = $this->scanner->getAsciiAlpha(); - $white = $this->scanner->whitespace(); - - // If not a PI, send to bogusComment. - if (0 == strlen($procName) || 0 == $white || false == $this->scanner->current()) { - $this->parseError("Expected processing instruction name, got $tok"); - $this->bogusComment('. - while (!('?' == $this->scanner->current() && '>' == $this->scanner->peek())) { - $data .= $this->scanner->current(); - - $tok = $this->scanner->next(); - if (false === $tok) { - $this->parseError('Unexpected EOF in processing instruction.'); - $this->events->processingInstruction($procName, $data); - - return true; - } - } - - $this->scanner->consume(2); // Consume the closing tag - $this->events->processingInstruction($procName, $data); - - return true; - } - - // ================================================================ - // UTILITY FUNCTIONS - // ================================================================ - - /** - * Read from the input stream until we get to the desired sequene - * or hit the end of the input stream. - * - * @param string $sequence - * - * @return string - */ - protected function readUntilSequence($sequence) - { - $buffer = ''; - - // Optimization for reading larger blocks faster. - $first = substr($sequence, 0, 1); - while (false !== $this->scanner->current()) { - $buffer .= $this->scanner->charsUntil($first); - - // Stop as soon as we hit the stopping condition. - if ($this->scanner->sequenceMatches($sequence, false)) { - return $buffer; - } - $buffer .= $this->scanner->current(); - $this->scanner->consume(); - } - - // If we get here, we hit the EOF. - $this->parseError('Unexpected EOF during text read.'); - - return $buffer; - } - - /** - * Check if upcomming chars match the given sequence. - * - * This will read the stream for the $sequence. If it's - * found, this will return true. If not, return false. - * Since this unconsumes any chars it reads, the caller - * will still need to read the next sequence, even if - * this returns true. - * - * Example: $this->scanner->sequenceMatches('') will - * see if the input stream is at the start of a - * '' string. - * - * @param string $sequence - * @param bool $caseSensitive - * - * @return bool - */ - protected function sequenceMatches($sequence, $caseSensitive = true) - { - @trigger_error(__METHOD__ . ' method is deprecated since version 2.4 and will be removed in 3.0. Use Scanner::sequenceMatches() instead.', E_USER_DEPRECATED); - - return $this->scanner->sequenceMatches($sequence, $caseSensitive); - } - - /** - * Send a TEXT event with the contents of the text buffer. - * - * This emits an EventHandler::text() event with the current contents of the - * temporary text buffer. (The buffer is used to group as much PCDATA - * as we can instead of emitting lots and lots of TEXT events.) - */ - protected function flushBuffer() - { - if ('' === $this->text) { - return; - } - $this->events->text($this->text); - $this->text = ''; - } - - /** - * Add text to the temporary buffer. - * - * @see flushBuffer() - * - * @param string $str - */ - protected function buffer($str) - { - $this->text .= $str; - } - - /** - * Emit a parse error. - * - * A parse error always returns false because it never consumes any - * characters. - * - * @param string $msg - * - * @return string - */ - protected function parseError($msg) - { - $args = func_get_args(); - - if (count($args) > 1) { - array_shift($args); - $msg = vsprintf($msg, $args); - } - - $line = $this->scanner->currentLine(); - $col = $this->scanner->columnOffset(); - $this->events->parseError($msg, $line, $col); - - return false; - } - - /** - * Decode a character reference and return the string. - * - * If $inAttribute is set to true, a bare & will be returned as-is. - * - * @param bool $inAttribute Set to true if the text is inside of an attribute value. - * false otherwise. - * - * @return string - */ - protected function decodeCharacterReference($inAttribute = false) - { - // Next char after &. - $tok = $this->scanner->next(); - $start = $this->scanner->position(); - - if (false === $tok) { - return '&'; - } - - // These indicate not an entity. We return just - // the &. - if ("\t" === $tok || "\n" === $tok || "\f" === $tok || ' ' === $tok || '&' === $tok || '<' === $tok) { - // $this->scanner->next(); - return '&'; - } - - // Numeric entity - if ('#' === $tok) { - $tok = $this->scanner->next(); - - if (false === $tok) { - $this->parseError('Expected &#DEC; &#HEX;, got EOF'); - $this->scanner->unconsume(1); - - return '&'; - } - - // Hexidecimal encoding. - // X[0-9a-fA-F]+; - // x[0-9a-fA-F]+; - if ('x' === $tok || 'X' === $tok) { - $tok = $this->scanner->next(); // Consume x - - // Convert from hex code to char. - $hex = $this->scanner->getHex(); - if (empty($hex)) { - $this->parseError('Expected &#xHEX;, got &#x%s', $tok); - // We unconsume because we don't know what parser rules might - // be in effect for the remaining chars. For example. '&#>' - // might result in a specific parsing rule inside of tag - // contexts, while not inside of pcdata context. - $this->scanner->unconsume(2); - - return '&'; - } - $entity = CharacterReference::lookupHex($hex); - } // Decimal encoding. - // [0-9]+; - else { - // Convert from decimal to char. - $numeric = $this->scanner->getNumeric(); - if (false === $numeric) { - $this->parseError('Expected &#DIGITS;, got &#%s', $tok); - $this->scanner->unconsume(2); - - return '&'; - } - $entity = CharacterReference::lookupDecimal($numeric); - } - } elseif ('=' === $tok && $inAttribute) { - return '&'; - } else { // String entity. - // Attempt to consume a string up to a ';'. - // [a-zA-Z0-9]+; - $cname = $this->scanner->getAsciiAlphaNum(); - $entity = CharacterReference::lookupName($cname); - - // When no entity is found provide the name of the unmatched string - // and continue on as the & is not part of an entity. The & will - // be converted to & elsewhere. - if (null === $entity) { - if (!$inAttribute || '' === $cname) { - $this->parseError("No match in entity table for '%s'", $cname); - } - $this->scanner->unconsume($this->scanner->position() - $start); - - return '&'; - } - } - - // The scanner has advanced the cursor for us. - $tok = $this->scanner->current(); - - // We have an entity. We're done here. - if (';' === $tok) { - $this->scanner->consume(); - - return $entity; - } - - // Failing to match ; means unconsume the entire string. - $this->scanner->unconsume($this->scanner->position() - $start); - - $this->parseError('Expected &ENTITY;, got &ENTITY%s (no trailing ;) ', $tok); - - return '&'; - } - - /** - * Checks whether a (single-byte) character is an ASCII letter or not. - * - * @param string $input A single-byte string - * - * @return bool True if it is a letter, False otherwise - */ - protected function is_alpha($input) - { - $code = ord($input); - - return ($code >= 97 && $code <= 122) || ($code >= 65 && $code <= 90); - } -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php deleted file mode 100644 index 00d3951..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php +++ /dev/null @@ -1,127 +0,0 @@ - 1, - 'dd' => 1, - 'dt' => 1, - 'rt' => 1, - 'rp' => 1, - 'tr' => 1, - 'th' => 1, - 'td' => 1, - 'thead' => 1, - 'tfoot' => 1, - 'tbody' => 1, - 'table' => 1, - 'optgroup' => 1, - 'option' => 1, - ); - - /** - * Returns true if the given tagname has special processing rules. - */ - public function hasRules($tagname) - { - return isset(static::$tags[$tagname]); - } - - /** - * Evaluate the rule for the current tag name. - * - * This may modify the existing DOM. - * - * @return \DOMElement The new Current DOM element. - */ - public function evaluate($new, $current) - { - switch ($new->tagName) { - case 'li': - return $this->handleLI($new, $current); - case 'dt': - case 'dd': - return $this->handleDT($new, $current); - case 'rt': - case 'rp': - return $this->handleRT($new, $current); - case 'optgroup': - return $this->closeIfCurrentMatches($new, $current, array( - 'optgroup', - )); - case 'option': - return $this->closeIfCurrentMatches($new, $current, array( - 'option', - )); - case 'tr': - return $this->closeIfCurrentMatches($new, $current, array( - 'tr', - )); - case 'td': - case 'th': - return $this->closeIfCurrentMatches($new, $current, array( - 'th', - 'td', - )); - case 'tbody': - case 'thead': - case 'tfoot': - case 'table': // Spec isn't explicit about this, but it's necessary. - - return $this->closeIfCurrentMatches($new, $current, array( - 'thead', - 'tfoot', - 'tbody', - )); - } - - return $current; - } - - protected function handleLI($ele, $current) - { - return $this->closeIfCurrentMatches($ele, $current, array( - 'li', - )); - } - - protected function handleDT($ele, $current) - { - return $this->closeIfCurrentMatches($ele, $current, array( - 'dt', - 'dd', - )); - } - - protected function handleRT($ele, $current) - { - return $this->closeIfCurrentMatches($ele, $current, array( - 'rt', - 'rp', - )); - } - - protected function closeIfCurrentMatches($ele, $current, $match) - { - if (in_array($current->tagName, $match, true)) { - $current->parentNode->appendChild($ele); - } else { - $current->appendChild($ele); - } - - return $ele; - } -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php deleted file mode 100644 index 4405e4c..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php +++ /dev/null @@ -1,177 +0,0 @@ - - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -use Masterminds\HTML5\Exception; - -class UTF8Utils -{ - /** - * The Unicode replacement character. - */ - const FFFD = "\xEF\xBF\xBD"; - - /** - * Count the number of characters in a string. - * UTF-8 aware. This will try (in order) iconv, MB, and finally a custom counter. - * - * @param string $string - * - * @return int - */ - public static function countChars($string) - { - // Get the length for the string we need. - if (function_exists('mb_strlen')) { - return mb_strlen($string, 'utf-8'); - } - - if (function_exists('iconv_strlen')) { - return iconv_strlen($string, 'utf-8'); - } - - $count = count_chars($string); - - // 0x80 = 0x7F - 0 + 1 (one added to get inclusive range) - // 0x33 = 0xF4 - 0x2C + 1 (one added to get inclusive range) - return array_sum(array_slice($count, 0, 0x80)) + array_sum(array_slice($count, 0xC2, 0x33)); - } - - /** - * Convert data from the given encoding to UTF-8. - * - * This has not yet been tested with charactersets other than UTF-8. - * It should work with ISO-8859-1/-13 and standard Latin Win charsets. - * - * @param string $data The data to convert - * @param string $encoding A valid encoding. Examples: http://www.php.net/manual/en/mbstring.supported-encodings.php - * - * @return string - */ - public static function convertToUTF8($data, $encoding = 'UTF-8') - { - /* - * From the HTML5 spec: Given an encoding, the bytes in the input stream must be converted - * to Unicode characters for the tokeniser, as described by the rules for that encoding, - * except that the leading U+FEFF BYTE ORDER MARK character, if any, must not be stripped - * by the encoding layer (it is stripped by the rule below). Bytes or sequences of bytes - * in the original byte stream that could not be converted to Unicode characters must be - * converted to U+FFFD REPLACEMENT CHARACTER code points. - */ - - // mb_convert_encoding is chosen over iconv because of a bug. The best - // details for the bug are on http://us1.php.net/manual/en/function.iconv.php#108643 - // which contains links to the actual but reports as well as work around - // details. - if (function_exists('mb_convert_encoding')) { - // mb library has the following behaviors: - // - UTF-16 surrogates result in false. - // - Overlongs and outside Plane 16 result in empty strings. - - // Before we run mb_convert_encoding we need to tell it what to do with - // characters it does not know. This could be different than the parent - // application executing this library so we store the value, change it - // to our needs, and then change it back when we are done. This feels - // a little excessive and it would be great if there was a better way. - $save = mb_substitute_character(); - mb_substitute_character('none'); - $data = mb_convert_encoding($data, 'UTF-8', $encoding); - mb_substitute_character($save); - } - // @todo Get iconv running in at least some environments if that is possible. - elseif (function_exists('iconv') && 'auto' !== $encoding) { - // fprintf(STDOUT, "iconv found\n"); - // iconv has the following behaviors: - // - Overlong representations are ignored. - // - Beyond Plane 16 is replaced with a lower char. - // - Incomplete sequences generate a warning. - $data = @iconv($encoding, 'UTF-8//IGNORE', $data); - } else { - throw new Exception('Not implemented, please install mbstring or iconv'); - } - - /* - * One leading U+FEFF BYTE ORDER MARK character must be ignored if any are present. - */ - if ("\xEF\xBB\xBF" === substr($data, 0, 3)) { - $data = substr($data, 3); - } - - return $data; - } - - /** - * Checks for Unicode code points that are not valid in a document. - * - * @param string $data A string to analyze - * - * @return array An array of (string) error messages produced by the scanning - */ - public static function checkForIllegalCodepoints($data) - { - // Vestigal error handling. - $errors = array(); - - /* - * All U+0000 null characters in the input must be replaced by U+FFFD REPLACEMENT CHARACTERs. - * Any occurrences of such characters is a parse error. - */ - for ($i = 0, $count = substr_count($data, "\0"); $i < $count; ++$i) { - $errors[] = 'null-character'; - } - - /* - * Any occurrences of any characters in the ranges U+0001 to U+0008, U+000B, U+000E to U+001F, U+007F - * to U+009F, U+D800 to U+DFFF , U+FDD0 to U+FDEF, and characters U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, - * U+2FFFE, U+2FFFF, U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE, U+6FFFF, U+7FFFE, - * U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF, U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, - * U+DFFFE, U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, and U+10FFFF are parse errors. - * (These are all control characters or permanently undefined Unicode characters.) - */ - // Check PCRE is loaded. - $count = preg_match_all( - '/(?: - [\x01-\x08\x0B\x0E-\x1F\x7F] # U+0001 to U+0008, U+000B, U+000E to U+001F and U+007F - | - \xC2[\x80-\x9F] # U+0080 to U+009F - | - \xED(?:\xA0[\x80-\xFF]|[\xA1-\xBE][\x00-\xFF]|\xBF[\x00-\xBF]) # U+D800 to U+DFFFF - | - \xEF\xB7[\x90-\xAF] # U+FDD0 to U+FDEF - | - \xEF\xBF[\xBE\xBF] # U+FFFE and U+FFFF - | - [\xF0-\xF4][\x8F-\xBF]\xBF[\xBE\xBF] # U+nFFFE and U+nFFFF (1 <= n <= 10_{16}) - )/x', $data, $matches); - for ($i = 0; $i < $count; ++$i) { - $errors[] = 'invalid-codepoint'; - } - - return $errors; - } -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php b/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php deleted file mode 100644 index e9421a1..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php +++ /dev/null @@ -1,1533 +0,0 @@ - ' ', - "\n" => ' ', - '!' => '!', - '"' => '"', - '#' => '#', - '$' => '$', - '%' => '%', - '&' => '&', - '\'' => ''', - '(' => '(', - ')' => ')', - '*' => '*', - '+' => '+', - ',' => ',', - '.' => '.', - '/' => '/', - ':' => ':', - ';' => ';', - '<' => '<', - '<⃒' => '&nvlt', - '=' => '=', - '=⃥' => '&bne', - '>' => '>', - '>⃒' => '&nvgt', - '?' => '?', - '@' => '@', - '[' => '[', - '\\' => '\', - ']' => ']', - '^' => '^', - '_' => '_', - '`' => '`', - 'fj' => '&fjlig', - '{' => '{', - '|' => '|', - '}' => '}', - ' ' => ' ', - '¡' => '¡', - '¢' => '¢', - '£' => '£', - '¤' => '¤', - '¥' => '¥', - '¦' => '¦', - '§' => '§', - '¨' => '¨', - '©' => '©', - 'ª' => 'ª', - '«' => '«', - '¬' => '¬', - '­' => '­', - '®' => '®', - '¯' => '¯', - '°' => '°', - '±' => '±', - '²' => '²', - '³' => '³', - '´' => '´', - 'µ' => 'µ', - '¶' => '¶', - '·' => '·', - '¸' => '¸', - '¹' => '¹', - 'º' => 'º', - '»' => '»', - '¼' => '¼', - '½' => '½', - '¾' => '¾', - '¿' => '¿', - 'À' => 'À', - 'Á' => 'Á', - 'Â' => 'Â', - 'Ã' => 'Ã', - 'Ä' => 'Ä', - 'Å' => 'Å', - 'Æ' => 'Æ', - 'Ç' => 'Ç', - 'È' => 'È', - 'É' => 'É', - 'Ê' => 'Ê', - 'Ë' => 'Ë', - 'Ì' => 'Ì', - 'Í' => 'Í', - 'Î' => 'Î', - 'Ï' => 'Ï', - 'Ð' => 'Ð', - 'Ñ' => 'Ñ', - 'Ò' => 'Ò', - 'Ó' => 'Ó', - 'Ô' => 'Ô', - 'Õ' => 'Õ', - 'Ö' => 'Ö', - '×' => '×', - 'Ø' => 'Ø', - 'Ù' => 'Ù', - 'Ú' => 'Ú', - 'Û' => 'Û', - 'Ü' => 'Ü', - 'Ý' => 'Ý', - 'Þ' => 'Þ', - 'ß' => 'ß', - 'à' => 'à', - 'á' => 'á', - 'â' => 'â', - 'ã' => 'ã', - 'ä' => 'ä', - 'å' => 'å', - 'æ' => 'æ', - 'ç' => 'ç', - 'è' => 'è', - 'é' => 'é', - 'ê' => 'ê', - 'ë' => 'ë', - 'ì' => 'ì', - 'í' => 'í', - 'î' => 'î', - 'ï' => 'ï', - 'ð' => 'ð', - 'ñ' => 'ñ', - 'ò' => 'ò', - 'ó' => 'ó', - 'ô' => 'ô', - 'õ' => 'õ', - 'ö' => 'ö', - '÷' => '÷', - 'ø' => 'ø', - 'ù' => 'ù', - 'ú' => 'ú', - 'û' => 'û', - 'ü' => 'ü', - 'ý' => 'ý', - 'þ' => 'þ', - 'ÿ' => 'ÿ', - 'Ā' => 'Ā', - 'ā' => 'ā', - 'Ă' => 'Ă', - 'ă' => 'ă', - 'Ą' => 'Ą', - 'ą' => 'ą', - 'Ć' => 'Ć', - 'ć' => 'ć', - 'Ĉ' => 'Ĉ', - 'ĉ' => 'ĉ', - 'Ċ' => 'Ċ', - 'ċ' => 'ċ', - 'Č' => 'Č', - 'č' => 'č', - 'Ď' => 'Ď', - 'ď' => 'ď', - 'Đ' => 'Đ', - 'đ' => 'đ', - 'Ē' => 'Ē', - 'ē' => 'ē', - 'Ė' => 'Ė', - 'ė' => 'ė', - 'Ę' => 'Ę', - 'ę' => 'ę', - 'Ě' => 'Ě', - 'ě' => 'ě', - 'Ĝ' => 'Ĝ', - 'ĝ' => 'ĝ', - 'Ğ' => 'Ğ', - 'ğ' => 'ğ', - 'Ġ' => 'Ġ', - 'ġ' => 'ġ', - 'Ģ' => 'Ģ', - 'Ĥ' => 'Ĥ', - 'ĥ' => 'ĥ', - 'Ħ' => 'Ħ', - 'ħ' => 'ħ', - 'Ĩ' => 'Ĩ', - 'ĩ' => 'ĩ', - 'Ī' => 'Ī', - 'ī' => 'ī', - 'Į' => 'Į', - 'į' => 'į', - 'İ' => 'İ', - 'ı' => 'ı', - 'IJ' => 'IJ', - 'ij' => 'ij', - 'Ĵ' => 'Ĵ', - 'ĵ' => 'ĵ', - 'Ķ' => 'Ķ', - 'ķ' => 'ķ', - 'ĸ' => 'ĸ', - 'Ĺ' => 'Ĺ', - 'ĺ' => 'ĺ', - 'Ļ' => 'Ļ', - 'ļ' => 'ļ', - 'Ľ' => 'Ľ', - 'ľ' => 'ľ', - 'Ŀ' => 'Ŀ', - 'ŀ' => 'ŀ', - 'Ł' => 'Ł', - 'ł' => 'ł', - 'Ń' => 'Ń', - 'ń' => 'ń', - 'Ņ' => 'Ņ', - 'ņ' => 'ņ', - 'Ň' => 'Ň', - 'ň' => 'ň', - 'ʼn' => 'ʼn', - 'Ŋ' => 'Ŋ', - 'ŋ' => 'ŋ', - 'Ō' => 'Ō', - 'ō' => 'ō', - 'Ő' => 'Ő', - 'ő' => 'ő', - 'Œ' => 'Œ', - 'œ' => 'œ', - 'Ŕ' => 'Ŕ', - 'ŕ' => 'ŕ', - 'Ŗ' => 'Ŗ', - 'ŗ' => 'ŗ', - 'Ř' => 'Ř', - 'ř' => 'ř', - 'Ś' => 'Ś', - 'ś' => 'ś', - 'Ŝ' => 'Ŝ', - 'ŝ' => 'ŝ', - 'Ş' => 'Ş', - 'ş' => 'ş', - 'Š' => 'Š', - 'š' => 'š', - 'Ţ' => 'Ţ', - 'ţ' => 'ţ', - 'Ť' => 'Ť', - 'ť' => 'ť', - 'Ŧ' => 'Ŧ', - 'ŧ' => 'ŧ', - 'Ũ' => 'Ũ', - 'ũ' => 'ũ', - 'Ū' => 'Ū', - 'ū' => 'ū', - 'Ŭ' => 'Ŭ', - 'ŭ' => 'ŭ', - 'Ů' => 'Ů', - 'ů' => 'ů', - 'Ű' => 'Ű', - 'ű' => 'ű', - 'Ų' => 'Ų', - 'ų' => 'ų', - 'Ŵ' => 'Ŵ', - 'ŵ' => 'ŵ', - 'Ŷ' => 'Ŷ', - 'ŷ' => 'ŷ', - 'Ÿ' => 'Ÿ', - 'Ź' => 'Ź', - 'ź' => 'ź', - 'Ż' => 'Ż', - 'ż' => 'ż', - 'Ž' => 'Ž', - 'ž' => 'ž', - 'ƒ' => 'ƒ', - 'Ƶ' => 'Ƶ', - 'ǵ' => 'ǵ', - 'ȷ' => 'ȷ', - 'ˆ' => 'ˆ', - 'ˇ' => 'ˇ', - '˘' => '˘', - '˙' => '˙', - '˚' => '˚', - '˛' => '˛', - '˜' => '˜', - '˝' => '˝', - '̑' => '̑', - 'Α' => 'Α', - 'Β' => 'Β', - 'Γ' => 'Γ', - 'Δ' => 'Δ', - 'Ε' => 'Ε', - 'Ζ' => 'Ζ', - 'Η' => 'Η', - 'Θ' => 'Θ', - 'Ι' => 'Ι', - 'Κ' => 'Κ', - 'Λ' => 'Λ', - 'Μ' => 'Μ', - 'Ν' => 'Ν', - 'Ξ' => 'Ξ', - 'Ο' => 'Ο', - 'Π' => 'Π', - 'Ρ' => 'Ρ', - 'Σ' => 'Σ', - 'Τ' => 'Τ', - 'Υ' => 'Υ', - 'Φ' => 'Φ', - 'Χ' => 'Χ', - 'Ψ' => 'Ψ', - 'Ω' => 'Ω', - 'α' => 'α', - 'β' => 'β', - 'γ' => 'γ', - 'δ' => 'δ', - 'ε' => 'ε', - 'ζ' => 'ζ', - 'η' => 'η', - 'θ' => 'θ', - 'ι' => 'ι', - 'κ' => 'κ', - 'λ' => 'λ', - 'μ' => 'μ', - 'ν' => 'ν', - 'ξ' => 'ξ', - 'ο' => 'ο', - 'π' => 'π', - 'ρ' => 'ρ', - 'ς' => 'ς', - 'σ' => 'σ', - 'τ' => 'τ', - 'υ' => 'υ', - 'φ' => 'φ', - 'χ' => 'χ', - 'ψ' => 'ψ', - 'ω' => 'ω', - 'ϑ' => 'ϑ', - 'ϒ' => 'ϒ', - 'ϕ' => 'ϕ', - 'ϖ' => 'ϖ', - 'Ϝ' => 'Ϝ', - 'ϝ' => 'ϝ', - 'ϰ' => 'ϰ', - 'ϱ' => 'ϱ', - 'ϵ' => 'ϵ', - '϶' => '϶', - 'Ё' => 'Ё', - 'Ђ' => 'Ђ', - 'Ѓ' => 'Ѓ', - 'Є' => 'Є', - 'Ѕ' => 'Ѕ', - 'І' => 'І', - 'Ї' => 'Ї', - 'Ј' => 'Ј', - 'Љ' => 'Љ', - 'Њ' => 'Њ', - 'Ћ' => 'Ћ', - 'Ќ' => 'Ќ', - 'Ў' => 'Ў', - 'Џ' => 'Џ', - 'А' => 'А', - 'Б' => 'Б', - 'В' => 'В', - 'Г' => 'Г', - 'Д' => 'Д', - 'Е' => 'Е', - 'Ж' => 'Ж', - 'З' => 'З', - 'И' => 'И', - 'Й' => 'Й', - 'К' => 'К', - 'Л' => 'Л', - 'М' => 'М', - 'Н' => 'Н', - 'О' => 'О', - 'П' => 'П', - 'Р' => 'Р', - 'С' => 'С', - 'Т' => 'Т', - 'У' => 'У', - 'Ф' => 'Ф', - 'Х' => 'Х', - 'Ц' => 'Ц', - 'Ч' => 'Ч', - 'Ш' => 'Ш', - 'Щ' => 'Щ', - 'Ъ' => 'Ъ', - 'Ы' => 'Ы', - 'Ь' => 'Ь', - 'Э' => 'Э', - 'Ю' => 'Ю', - 'Я' => 'Я', - 'а' => 'а', - 'б' => 'б', - 'в' => 'в', - 'г' => 'г', - 'д' => 'д', - 'е' => 'е', - 'ж' => 'ж', - 'з' => 'з', - 'и' => 'и', - 'й' => 'й', - 'к' => 'к', - 'л' => 'л', - 'м' => 'м', - 'н' => 'н', - 'о' => 'о', - 'п' => 'п', - 'р' => 'р', - 'с' => 'с', - 'т' => 'т', - 'у' => 'у', - 'ф' => 'ф', - 'х' => 'х', - 'ц' => 'ц', - 'ч' => 'ч', - 'ш' => 'ш', - 'щ' => 'щ', - 'ъ' => 'ъ', - 'ы' => 'ы', - 'ь' => 'ь', - 'э' => 'э', - 'ю' => 'ю', - 'я' => 'я', - 'ё' => 'ё', - 'ђ' => 'ђ', - 'ѓ' => 'ѓ', - 'є' => 'є', - 'ѕ' => 'ѕ', - 'і' => 'і', - 'ї' => 'ї', - 'ј' => 'ј', - 'љ' => 'љ', - 'њ' => 'њ', - 'ћ' => 'ћ', - 'ќ' => 'ќ', - 'ў' => 'ў', - 'џ' => 'џ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - '​' => '​', - '‌' => '‌', - '‍' => '‍', - '‎' => '‎', - '‏' => '‏', - '‐' => '‐', - '–' => '–', - '—' => '—', - '―' => '―', - '‖' => '‖', - '‘' => '‘', - '’' => '’', - '‚' => '‚', - '“' => '“', - '”' => '”', - '„' => '„', - '†' => '†', - '‡' => '‡', - '•' => '•', - '‥' => '‥', - '…' => '…', - '‰' => '‰', - '‱' => '‱', - '′' => '′', - '″' => '″', - '‴' => '‴', - '‵' => '‵', - '‹' => '‹', - '›' => '›', - '‾' => '‾', - '⁁' => '⁁', - '⁃' => '⁃', - '⁄' => '⁄', - '⁏' => '⁏', - '⁗' => '⁗', - ' ' => ' ', - '  ' => '&ThickSpace', - '⁠' => '⁠', - '⁡' => '⁡', - '⁢' => '⁢', - '⁣' => '⁣', - '€' => '€', - '⃛' => '⃛', - '⃜' => '⃜', - 'ℂ' => 'ℂ', - '℅' => '℅', - 'ℊ' => 'ℊ', - 'ℋ' => 'ℋ', - 'ℌ' => 'ℌ', - 'ℍ' => 'ℍ', - 'ℎ' => 'ℎ', - 'ℏ' => 'ℏ', - 'ℐ' => 'ℐ', - 'ℑ' => 'ℑ', - 'ℒ' => 'ℒ', - 'ℓ' => 'ℓ', - 'ℕ' => 'ℕ', - '№' => '№', - '℗' => '℗', - '℘' => '℘', - 'ℙ' => 'ℙ', - 'ℚ' => 'ℚ', - 'ℛ' => 'ℛ', - 'ℜ' => 'ℜ', - 'ℝ' => 'ℝ', - '℞' => '℞', - '™' => '™', - 'ℤ' => 'ℤ', - '℧' => '℧', - 'ℨ' => 'ℨ', - '℩' => '℩', - 'ℬ' => 'ℬ', - 'ℭ' => 'ℭ', - 'ℯ' => 'ℯ', - 'ℰ' => 'ℰ', - 'ℱ' => 'ℱ', - 'ℳ' => 'ℳ', - 'ℴ' => 'ℴ', - 'ℵ' => 'ℵ', - 'ℶ' => 'ℶ', - 'ℷ' => 'ℷ', - 'ℸ' => 'ℸ', - 'ⅅ' => 'ⅅ', - 'ⅆ' => 'ⅆ', - 'ⅇ' => 'ⅇ', - 'ⅈ' => 'ⅈ', - '⅓' => '⅓', - '⅔' => '⅔', - '⅕' => '⅕', - '⅖' => '⅖', - '⅗' => '⅗', - '⅘' => '⅘', - '⅙' => '⅙', - '⅚' => '⅚', - '⅛' => '⅛', - '⅜' => '⅜', - '⅝' => '⅝', - '⅞' => '⅞', - '←' => '←', - '↑' => '↑', - '→' => '→', - '↓' => '↓', - '↔' => '↔', - '↕' => '↕', - '↖' => '↖', - '↗' => '↗', - '↘' => '↘', - '↙' => '↙', - '↚' => '↚', - '↛' => '↛', - '↝' => '↝', - '↝̸' => '&nrarrw', - '↞' => '↞', - '↟' => '↟', - '↠' => '↠', - '↡' => '↡', - '↢' => '↢', - '↣' => '↣', - '↤' => '↤', - '↥' => '↥', - '↦' => '↦', - '↧' => '↧', - '↩' => '↩', - '↪' => '↪', - '↫' => '↫', - '↬' => '↬', - '↭' => '↭', - '↮' => '↮', - '↰' => '↰', - '↱' => '↱', - '↲' => '↲', - '↳' => '↳', - '↵' => '↵', - '↶' => '↶', - '↷' => '↷', - '↺' => '↺', - '↻' => '↻', - '↼' => '↼', - '↽' => '↽', - '↾' => '↾', - '↿' => '↿', - '⇀' => '⇀', - '⇁' => '⇁', - '⇂' => '⇂', - '⇃' => '⇃', - '⇄' => '⇄', - '⇅' => '⇅', - '⇆' => '⇆', - '⇇' => '⇇', - '⇈' => '⇈', - '⇉' => '⇉', - '⇊' => '⇊', - '⇋' => '⇋', - '⇌' => '⇌', - '⇍' => '⇍', - '⇎' => '⇎', - '⇏' => '⇏', - '⇐' => '⇐', - '⇑' => '⇑', - '⇒' => '⇒', - '⇓' => '⇓', - '⇔' => '⇔', - '⇕' => '⇕', - '⇖' => '⇖', - '⇗' => '⇗', - '⇘' => '⇘', - '⇙' => '⇙', - '⇚' => '⇚', - '⇛' => '⇛', - '⇝' => '⇝', - '⇤' => '⇤', - '⇥' => '⇥', - '⇵' => '⇵', - '⇽' => '⇽', - '⇾' => '⇾', - '⇿' => '⇿', - '∀' => '∀', - '∁' => '∁', - '∂' => '∂', - '∂̸' => '&npart', - '∃' => '∃', - '∄' => '∄', - '∅' => '∅', - '∇' => '∇', - '∈' => '∈', - '∉' => '∉', - '∋' => '∋', - '∌' => '∌', - '∏' => '∏', - '∐' => '∐', - '∑' => '∑', - '−' => '−', - '∓' => '∓', - '∔' => '∔', - '∖' => '∖', - '∗' => '∗', - '∘' => '∘', - '√' => '√', - '∝' => '∝', - '∞' => '∞', - '∟' => '∟', - '∠' => '∠', - '∠⃒' => '&nang', - '∡' => '∡', - '∢' => '∢', - '∣' => '∣', - '∤' => '∤', - '∥' => '∥', - '∦' => '∦', - '∧' => '∧', - '∨' => '∨', - '∩' => '∩', - '∩︀' => '&caps', - '∪' => '∪', - '∪︀' => '&cups', - '∫' => '∫', - '∬' => '∬', - '∭' => '∭', - '∮' => '∮', - '∯' => '∯', - '∰' => '∰', - '∱' => '∱', - '∲' => '∲', - '∳' => '∳', - '∴' => '∴', - '∵' => '∵', - '∶' => '∶', - '∷' => '∷', - '∸' => '∸', - '∺' => '∺', - '∻' => '∻', - '∼' => '∼', - '∼⃒' => '&nvsim', - '∽' => '∽', - '∽̱' => '&race', - '∾' => '∾', - '∾̳' => '&acE', - '∿' => '∿', - '≀' => '≀', - '≁' => '≁', - '≂' => '≂', - '≂̸' => '&nesim', - '≃' => '≃', - '≄' => '≄', - '≅' => '≅', - '≆' => '≆', - '≇' => '≇', - '≈' => '≈', - '≉' => '≉', - '≊' => '≊', - '≋' => '≋', - '≋̸' => '&napid', - '≌' => '≌', - '≍' => '≍', - '≍⃒' => '&nvap', - '≎' => '≎', - '≎̸' => '&nbump', - '≏' => '≏', - '≏̸' => '&nbumpe', - '≐' => '≐', - '≐̸' => '&nedot', - '≑' => '≑', - '≒' => '≒', - '≓' => '≓', - '≔' => '≔', - '≕' => '≕', - '≖' => '≖', - '≗' => '≗', - '≙' => '≙', - '≚' => '≚', - '≜' => '≜', - '≟' => '≟', - '≠' => '≠', - '≡' => '≡', - '≡⃥' => '&bnequiv', - '≢' => '≢', - '≤' => '≤', - '≤⃒' => '&nvle', - '≥' => '≥', - '≥⃒' => '&nvge', - '≦' => '≦', - '≦̸' => '&nlE', - '≧' => '≧', - '≧̸' => '&NotGreaterFullEqual', - '≨' => '≨', - '≨︀' => '&lvertneqq', - '≩' => '≩', - '≩︀' => '&gvertneqq', - '≪' => '≪', - '≪̸' => '&nLtv', - '≪⃒' => '&nLt', - '≫' => '≫', - '≫̸' => '&NotGreaterGreater', - '≫⃒' => '&nGt', - '≬' => '≬', - '≭' => '≭', - '≮' => '≮', - '≯' => '≯', - '≰' => '≰', - '≱' => '≱', - '≲' => '≲', - '≳' => '≳', - '≴' => '≴', - '≵' => '≵', - '≶' => '≶', - '≷' => '≷', - '≸' => '≸', - '≹' => '≹', - '≺' => '≺', - '≻' => '≻', - '≼' => '≼', - '≽' => '≽', - '≾' => '≾', - '≿' => '≿', - '≿̸' => '&NotSucceedsTilde', - '⊀' => '⊀', - '⊁' => '⊁', - '⊂' => '⊂', - '⊂⃒' => '&vnsub', - '⊃' => '⊃', - '⊃⃒' => '&nsupset', - '⊄' => '⊄', - '⊅' => '⊅', - '⊆' => '⊆', - '⊇' => '⊇', - '⊈' => '⊈', - '⊉' => '⊉', - '⊊' => '⊊', - '⊊︀' => '&vsubne', - '⊋' => '⊋', - '⊋︀' => '&vsupne', - '⊍' => '⊍', - '⊎' => '⊎', - '⊏' => '⊏', - '⊏̸' => '&NotSquareSubset', - '⊐' => '⊐', - '⊐̸' => '&NotSquareSuperset', - '⊑' => '⊑', - '⊒' => '⊒', - '⊓' => '⊓', - '⊓︀' => '&sqcaps', - '⊔' => '⊔', - '⊔︀' => '&sqcups', - '⊕' => '⊕', - '⊖' => '⊖', - '⊗' => '⊗', - '⊘' => '⊘', - '⊙' => '⊙', - '⊚' => '⊚', - '⊛' => '⊛', - '⊝' => '⊝', - '⊞' => '⊞', - '⊟' => '⊟', - '⊠' => '⊠', - '⊡' => '⊡', - '⊢' => '⊢', - '⊣' => '⊣', - '⊤' => '⊤', - '⊥' => '⊥', - '⊧' => '⊧', - '⊨' => '⊨', - '⊩' => '⊩', - '⊪' => '⊪', - '⊫' => '⊫', - '⊬' => '⊬', - '⊭' => '⊭', - '⊮' => '⊮', - '⊯' => '⊯', - '⊰' => '⊰', - '⊲' => '⊲', - '⊳' => '⊳', - '⊴' => '⊴', - '⊴⃒' => '&nvltrie', - '⊵' => '⊵', - '⊵⃒' => '&nvrtrie', - '⊶' => '⊶', - '⊷' => '⊷', - '⊸' => '⊸', - '⊹' => '⊹', - '⊺' => '⊺', - '⊻' => '⊻', - '⊽' => '⊽', - '⊾' => '⊾', - '⊿' => '⊿', - '⋀' => '⋀', - '⋁' => '⋁', - '⋂' => '⋂', - '⋃' => '⋃', - '⋄' => '⋄', - '⋅' => '⋅', - '⋆' => '⋆', - '⋇' => '⋇', - '⋈' => '⋈', - '⋉' => '⋉', - '⋊' => '⋊', - '⋋' => '⋋', - '⋌' => '⋌', - '⋍' => '⋍', - '⋎' => '⋎', - '⋏' => '⋏', - '⋐' => '⋐', - '⋑' => '⋑', - '⋒' => '⋒', - '⋓' => '⋓', - '⋔' => '⋔', - '⋕' => '⋕', - '⋖' => '⋖', - '⋗' => '⋗', - '⋘' => '⋘', - '⋘̸' => '&nLl', - '⋙' => '⋙', - '⋙̸' => '&nGg', - '⋚' => '⋚', - '⋚︀' => '&lesg', - '⋛' => '⋛', - '⋛︀' => '&gesl', - '⋞' => '⋞', - '⋟' => '⋟', - '⋠' => '⋠', - '⋡' => '⋡', - '⋢' => '⋢', - '⋣' => '⋣', - '⋦' => '⋦', - '⋧' => '⋧', - '⋨' => '⋨', - '⋩' => '⋩', - '⋪' => '⋪', - '⋫' => '⋫', - '⋬' => '⋬', - '⋭' => '⋭', - '⋮' => '⋮', - '⋯' => '⋯', - '⋰' => '⋰', - '⋱' => '⋱', - '⋲' => '⋲', - '⋳' => '⋳', - '⋴' => '⋴', - '⋵' => '⋵', - '⋵̸' => '¬indot', - '⋶' => '⋶', - '⋷' => '⋷', - '⋹' => '⋹', - '⋹̸' => '¬inE', - '⋺' => '⋺', - '⋻' => '⋻', - '⋼' => '⋼', - '⋽' => '⋽', - '⋾' => '⋾', - '⌅' => '⌅', - '⌆' => '⌆', - '⌈' => '⌈', - '⌉' => '⌉', - '⌊' => '⌊', - '⌋' => '⌋', - '⌌' => '⌌', - '⌍' => '⌍', - '⌎' => '⌎', - '⌏' => '⌏', - '⌐' => '⌐', - '⌒' => '⌒', - '⌓' => '⌓', - '⌕' => '⌕', - '⌖' => '⌖', - '⌜' => '⌜', - '⌝' => '⌝', - '⌞' => '⌞', - '⌟' => '⌟', - '⌢' => '⌢', - '⌣' => '⌣', - '⌭' => '⌭', - '⌮' => '⌮', - '⌶' => '⌶', - '⌽' => '⌽', - '⌿' => '⌿', - '⍼' => '⍼', - '⎰' => '⎰', - '⎱' => '⎱', - '⎴' => '⎴', - '⎵' => '⎵', - '⎶' => '⎶', - '⏜' => '⏜', - '⏝' => '⏝', - '⏞' => '⏞', - '⏟' => '⏟', - '⏢' => '⏢', - '⏧' => '⏧', - '␣' => '␣', - 'Ⓢ' => 'Ⓢ', - '─' => '─', - '│' => '│', - '┌' => '┌', - '┐' => '┐', - '└' => '└', - '┘' => '┘', - '├' => '├', - '┤' => '┤', - '┬' => '┬', - '┴' => '┴', - '┼' => '┼', - '═' => '═', - '║' => '║', - '╒' => '╒', - '╓' => '╓', - '╔' => '╔', - '╕' => '╕', - '╖' => '╖', - '╗' => '╗', - '╘' => '╘', - '╙' => '╙', - '╚' => '╚', - '╛' => '╛', - '╜' => '╜', - '╝' => '╝', - '╞' => '╞', - '╟' => '╟', - '╠' => '╠', - '╡' => '╡', - '╢' => '╢', - '╣' => '╣', - '╤' => '╤', - '╥' => '╥', - '╦' => '╦', - '╧' => '╧', - '╨' => '╨', - '╩' => '╩', - '╪' => '╪', - '╫' => '╫', - '╬' => '╬', - '▀' => '▀', - '▄' => '▄', - '█' => '█', - '░' => '░', - '▒' => '▒', - '▓' => '▓', - '□' => '□', - '▪' => '▪', - '▫' => '▫', - '▭' => '▭', - '▮' => '▮', - '▱' => '▱', - '△' => '△', - '▴' => '▴', - '▵' => '▵', - '▸' => '▸', - '▹' => '▹', - '▽' => '▽', - '▾' => '▾', - '▿' => '▿', - '◂' => '◂', - '◃' => '◃', - '◊' => '◊', - '○' => '○', - '◬' => '◬', - '◯' => '◯', - '◸' => '◸', - '◹' => '◹', - '◺' => '◺', - '◻' => '◻', - '◼' => '◼', - '★' => '★', - '☆' => '☆', - '☎' => '☎', - '♀' => '♀', - '♂' => '♂', - '♠' => '♠', - '♣' => '♣', - '♥' => '♥', - '♦' => '♦', - '♪' => '♪', - '♭' => '♭', - '♮' => '♮', - '♯' => '♯', - '✓' => '✓', - '✗' => '✗', - '✠' => '✠', - '✶' => '✶', - '❘' => '❘', - '❲' => '❲', - '❳' => '❳', - '⟈' => '⟈', - '⟉' => '⟉', - '⟦' => '⟦', - '⟧' => '⟧', - '⟨' => '⟨', - '⟩' => '⟩', - '⟪' => '⟪', - '⟫' => '⟫', - '⟬' => '⟬', - '⟭' => '⟭', - '⟵' => '⟵', - '⟶' => '⟶', - '⟷' => '⟷', - '⟸' => '⟸', - '⟹' => '⟹', - '⟺' => '⟺', - '⟼' => '⟼', - '⟿' => '⟿', - '⤂' => '⤂', - '⤃' => '⤃', - '⤄' => '⤄', - '⤅' => '⤅', - '⤌' => '⤌', - '⤍' => '⤍', - '⤎' => '⤎', - '⤏' => '⤏', - '⤐' => '⤐', - '⤑' => '⤑', - '⤒' => '⤒', - '⤓' => '⤓', - '⤖' => '⤖', - '⤙' => '⤙', - '⤚' => '⤚', - '⤛' => '⤛', - '⤜' => '⤜', - '⤝' => '⤝', - '⤞' => '⤞', - '⤟' => '⤟', - '⤠' => '⤠', - '⤣' => '⤣', - '⤤' => '⤤', - '⤥' => '⤥', - '⤦' => '⤦', - '⤧' => '⤧', - '⤨' => '⤨', - '⤩' => '⤩', - '⤪' => '⤪', - '⤳' => '⤳', - '⤳̸' => '&nrarrc', - '⤵' => '⤵', - '⤶' => '⤶', - '⤷' => '⤷', - '⤸' => '⤸', - '⤹' => '⤹', - '⤼' => '⤼', - '⤽' => '⤽', - '⥅' => '⥅', - '⥈' => '⥈', - '⥉' => '⥉', - '⥊' => '⥊', - '⥋' => '⥋', - '⥎' => '⥎', - '⥏' => '⥏', - '⥐' => '⥐', - '⥑' => '⥑', - '⥒' => '⥒', - '⥓' => '⥓', - '⥔' => '⥔', - '⥕' => '⥕', - '⥖' => '⥖', - '⥗' => '⥗', - '⥘' => '⥘', - '⥙' => '⥙', - '⥚' => '⥚', - '⥛' => '⥛', - '⥜' => '⥜', - '⥝' => '⥝', - '⥞' => '⥞', - '⥟' => '⥟', - '⥠' => '⥠', - '⥡' => '⥡', - '⥢' => '⥢', - '⥣' => '⥣', - '⥤' => '⥤', - '⥥' => '⥥', - '⥦' => '⥦', - '⥧' => '⥧', - '⥨' => '⥨', - '⥩' => '⥩', - '⥪' => '⥪', - '⥫' => '⥫', - '⥬' => '⥬', - '⥭' => '⥭', - '⥮' => '⥮', - '⥯' => '⥯', - '⥰' => '⥰', - '⥱' => '⥱', - '⥲' => '⥲', - '⥳' => '⥳', - '⥴' => '⥴', - '⥵' => '⥵', - '⥶' => '⥶', - '⥸' => '⥸', - '⥹' => '⥹', - '⥻' => '⥻', - '⥼' => '⥼', - '⥽' => '⥽', - '⥾' => '⥾', - '⥿' => '⥿', - '⦅' => '⦅', - '⦆' => '⦆', - '⦋' => '⦋', - '⦌' => '⦌', - '⦍' => '⦍', - '⦎' => '⦎', - '⦏' => '⦏', - '⦐' => '⦐', - '⦑' => '⦑', - '⦒' => '⦒', - '⦓' => '⦓', - '⦔' => '⦔', - '⦕' => '⦕', - '⦖' => '⦖', - '⦚' => '⦚', - '⦜' => '⦜', - '⦝' => '⦝', - '⦤' => '⦤', - '⦥' => '⦥', - '⦦' => '⦦', - '⦧' => '⦧', - '⦨' => '⦨', - '⦩' => '⦩', - '⦪' => '⦪', - '⦫' => '⦫', - '⦬' => '⦬', - '⦭' => '⦭', - '⦮' => '⦮', - '⦯' => '⦯', - '⦰' => '⦰', - '⦱' => '⦱', - '⦲' => '⦲', - '⦳' => '⦳', - '⦴' => '⦴', - '⦵' => '⦵', - '⦶' => '⦶', - '⦷' => '⦷', - '⦹' => '⦹', - '⦻' => '⦻', - '⦼' => '⦼', - '⦾' => '⦾', - '⦿' => '⦿', - '⧀' => '⧀', - '⧁' => '⧁', - '⧂' => '⧂', - '⧃' => '⧃', - '⧄' => '⧄', - '⧅' => '⧅', - '⧉' => '⧉', - '⧍' => '⧍', - '⧎' => '⧎', - '⧏' => '⧏', - '⧏̸' => '&NotLeftTriangleBar', - '⧐' => '⧐', - '⧐̸' => '&NotRightTriangleBar', - '⧜' => '⧜', - '⧝' => '⧝', - '⧞' => '⧞', - '⧣' => '⧣', - '⧤' => '⧤', - '⧥' => '⧥', - '⧫' => '⧫', - '⧴' => '⧴', - '⧶' => '⧶', - '⨀' => '⨀', - '⨁' => '⨁', - '⨂' => '⨂', - '⨄' => '⨄', - '⨆' => '⨆', - '⨌' => '⨌', - '⨍' => '⨍', - '⨐' => '⨐', - '⨑' => '⨑', - '⨒' => '⨒', - '⨓' => '⨓', - '⨔' => '⨔', - '⨕' => '⨕', - '⨖' => '⨖', - '⨗' => '⨗', - '⨢' => '⨢', - '⨣' => '⨣', - '⨤' => '⨤', - '⨥' => '⨥', - '⨦' => '⨦', - '⨧' => '⨧', - '⨩' => '⨩', - '⨪' => '⨪', - '⨭' => '⨭', - '⨮' => '⨮', - '⨯' => '⨯', - '⨰' => '⨰', - '⨱' => '⨱', - '⨳' => '⨳', - '⨴' => '⨴', - '⨵' => '⨵', - '⨶' => '⨶', - '⨷' => '⨷', - '⨸' => '⨸', - '⨹' => '⨹', - '⨺' => '⨺', - '⨻' => '⨻', - '⨼' => '⨼', - '⨿' => '⨿', - '⩀' => '⩀', - '⩂' => '⩂', - '⩃' => '⩃', - '⩄' => '⩄', - '⩅' => '⩅', - '⩆' => '⩆', - '⩇' => '⩇', - '⩈' => '⩈', - '⩉' => '⩉', - '⩊' => '⩊', - '⩋' => '⩋', - '⩌' => '⩌', - '⩍' => '⩍', - '⩐' => '⩐', - '⩓' => '⩓', - '⩔' => '⩔', - '⩕' => '⩕', - '⩖' => '⩖', - '⩗' => '⩗', - '⩘' => '⩘', - '⩚' => '⩚', - '⩛' => '⩛', - '⩜' => '⩜', - '⩝' => '⩝', - '⩟' => '⩟', - '⩦' => '⩦', - '⩪' => '⩪', - '⩭' => '⩭', - '⩭̸' => '&ncongdot', - '⩮' => '⩮', - '⩯' => '⩯', - '⩰' => '⩰', - '⩰̸' => '&napE', - '⩱' => '⩱', - '⩲' => '⩲', - '⩳' => '⩳', - '⩴' => '⩴', - '⩵' => '⩵', - '⩷' => '⩷', - '⩸' => '⩸', - '⩹' => '⩹', - '⩺' => '⩺', - '⩻' => '⩻', - '⩼' => '⩼', - '⩽' => '⩽', - '⩽̸' => '&nles', - '⩾' => '⩾', - '⩾̸' => '&nges', - '⩿' => '⩿', - '⪀' => '⪀', - '⪁' => '⪁', - '⪂' => '⪂', - '⪃' => '⪃', - '⪄' => '⪄', - '⪅' => '⪅', - '⪆' => '⪆', - '⪇' => '⪇', - '⪈' => '⪈', - '⪉' => '⪉', - '⪊' => '⪊', - '⪋' => '⪋', - '⪌' => '⪌', - '⪍' => '⪍', - '⪎' => '⪎', - '⪏' => '⪏', - '⪐' => '⪐', - '⪑' => '⪑', - '⪒' => '⪒', - '⪓' => '⪓', - '⪔' => '⪔', - '⪕' => '⪕', - '⪖' => '⪖', - '⪗' => '⪗', - '⪘' => '⪘', - '⪙' => '⪙', - '⪚' => '⪚', - '⪝' => '⪝', - '⪞' => '⪞', - '⪟' => '⪟', - '⪠' => '⪠', - '⪡' => '⪡', - '⪡̸' => '&NotNestedLessLess', - '⪢' => '⪢', - '⪢̸' => '&NotNestedGreaterGreater', - '⪤' => '⪤', - '⪥' => '⪥', - '⪦' => '⪦', - '⪧' => '⪧', - '⪨' => '⪨', - '⪩' => '⪩', - '⪪' => '⪪', - '⪫' => '⪫', - '⪬' => '⪬', - '⪬︀' => '&smtes', - '⪭' => '⪭', - '⪭︀' => '&lates', - '⪮' => '⪮', - '⪯' => '⪯', - '⪯̸' => '&NotPrecedesEqual', - '⪰' => '⪰', - '⪰̸' => '&NotSucceedsEqual', - '⪳' => '⪳', - '⪴' => '⪴', - '⪵' => '⪵', - '⪶' => '⪶', - '⪷' => '⪷', - '⪸' => '⪸', - '⪹' => '⪹', - '⪺' => '⪺', - '⪻' => '⪻', - '⪼' => '⪼', - '⪽' => '⪽', - '⪾' => '⪾', - '⪿' => '⪿', - '⫀' => '⫀', - '⫁' => '⫁', - '⫂' => '⫂', - '⫃' => '⫃', - '⫄' => '⫄', - '⫅' => '⫅', - '⫅̸' => '&nsubE', - '⫆' => '⫆', - '⫆̸' => '&nsupseteqq', - '⫇' => '⫇', - '⫈' => '⫈', - '⫋' => '⫋', - '⫋︀' => '&vsubnE', - '⫌' => '⫌', - '⫌︀' => '&varsupsetneqq', - '⫏' => '⫏', - '⫐' => '⫐', - '⫑' => '⫑', - '⫒' => '⫒', - '⫓' => '⫓', - '⫔' => '⫔', - '⫕' => '⫕', - '⫖' => '⫖', - '⫗' => '⫗', - '⫘' => '⫘', - '⫙' => '⫙', - '⫚' => '⫚', - '⫛' => '⫛', - '⫤' => '⫤', - '⫦' => '⫦', - '⫧' => '⫧', - '⫨' => '⫨', - '⫩' => '⫩', - '⫫' => '⫫', - '⫬' => '⫬', - '⫭' => '⫭', - '⫮' => '⫮', - '⫯' => '⫯', - '⫰' => '⫰', - '⫱' => '⫱', - '⫲' => '⫲', - '⫳' => '⫳', - '⫽︀' => '&varsupsetneqq', - 'ff' => 'ff', - 'fi' => 'fi', - 'fl' => 'fl', - 'ffi' => 'ffi', - 'ffl' => 'ffl', - '𝒜' => '𝒜', - '𝒞' => '𝒞', - '𝒟' => '𝒟', - '𝒢' => '𝒢', - '𝒥' => '𝒥', - '𝒦' => '𝒦', - '𝒩' => '𝒩', - '𝒪' => '𝒪', - '𝒫' => '𝒫', - '𝒬' => '𝒬', - '𝒮' => '𝒮', - '𝒯' => '𝒯', - '𝒰' => '𝒰', - '𝒱' => '𝒱', - '𝒲' => '𝒲', - '𝒳' => '𝒳', - '𝒴' => '𝒴', - '𝒵' => '𝒵', - '𝒶' => '𝒶', - '𝒷' => '𝒷', - '𝒸' => '𝒸', - '𝒹' => '𝒹', - '𝒻' => '𝒻', - '𝒽' => '𝒽', - '𝒾' => '𝒾', - '𝒿' => '𝒿', - '𝓀' => '𝓀', - '𝓁' => '𝓁', - '𝓂' => '𝓂', - '𝓃' => '𝓃', - '𝓅' => '𝓅', - '𝓆' => '𝓆', - '𝓇' => '𝓇', - '𝓈' => '𝓈', - '𝓉' => '𝓉', - '𝓊' => '𝓊', - '𝓋' => '𝓋', - '𝓌' => '𝓌', - '𝓍' => '𝓍', - '𝓎' => '𝓎', - '𝓏' => '𝓏', - '𝔄' => '𝔄', - '𝔅' => '𝔅', - '𝔇' => '𝔇', - '𝔈' => '𝔈', - '𝔉' => '𝔉', - '𝔊' => '𝔊', - '𝔍' => '𝔍', - '𝔎' => '𝔎', - '𝔏' => '𝔏', - '𝔐' => '𝔐', - '𝔑' => '𝔑', - '𝔒' => '𝔒', - '𝔓' => '𝔓', - '𝔔' => '𝔔', - '𝔖' => '𝔖', - '𝔗' => '𝔗', - '𝔘' => '𝔘', - '𝔙' => '𝔙', - '𝔚' => '𝔚', - '𝔛' => '𝔛', - '𝔜' => '𝔜', - '𝔞' => '𝔞', - '𝔟' => '𝔟', - '𝔠' => '𝔠', - '𝔡' => '𝔡', - '𝔢' => '𝔢', - '𝔣' => '𝔣', - '𝔤' => '𝔤', - '𝔥' => '𝔥', - '𝔦' => '𝔦', - '𝔧' => '𝔧', - '𝔨' => '𝔨', - '𝔩' => '𝔩', - '𝔪' => '𝔪', - '𝔫' => '𝔫', - '𝔬' => '𝔬', - '𝔭' => '𝔭', - '𝔮' => '𝔮', - '𝔯' => '𝔯', - '𝔰' => '𝔰', - '𝔱' => '𝔱', - '𝔲' => '𝔲', - '𝔳' => '𝔳', - '𝔴' => '𝔴', - '𝔵' => '𝔵', - '𝔶' => '𝔶', - '𝔷' => '𝔷', - '𝔸' => '𝔸', - '𝔹' => '𝔹', - '𝔻' => '𝔻', - '𝔼' => '𝔼', - '𝔽' => '𝔽', - '𝔾' => '𝔾', - '𝕀' => '𝕀', - '𝕁' => '𝕁', - '𝕂' => '𝕂', - '𝕃' => '𝕃', - '𝕄' => '𝕄', - '𝕆' => '𝕆', - '𝕊' => '𝕊', - '𝕋' => '𝕋', - '𝕌' => '𝕌', - '𝕍' => '𝕍', - '𝕎' => '𝕎', - '𝕏' => '𝕏', - '𝕐' => '𝕐', - '𝕒' => '𝕒', - '𝕓' => '𝕓', - '𝕔' => '𝕔', - '𝕕' => '𝕕', - '𝕖' => '𝕖', - '𝕗' => '𝕗', - '𝕘' => '𝕘', - '𝕙' => '𝕙', - '𝕚' => '𝕚', - '𝕛' => '𝕛', - '𝕜' => '𝕜', - '𝕝' => '𝕝', - '𝕞' => '𝕞', - '𝕟' => '𝕟', - '𝕠' => '𝕠', - '𝕡' => '𝕡', - '𝕢' => '𝕢', - '𝕣' => '𝕣', - '𝕤' => '𝕤', - '𝕥' => '𝕥', - '𝕦' => '𝕦', - '𝕧' => '𝕧', - '𝕨' => '𝕨', - '𝕩' => '𝕩', - '𝕪' => '𝕪', - '𝕫' => '𝕫', - ); -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php b/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php deleted file mode 100644 index ec467f2..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php +++ /dev/null @@ -1,553 +0,0 @@ -'http://www.w3.org/1999/xhtml', - 'attrNamespace'=>'http://www.w3.org/1999/xhtml', - - 'nodeName'=>'img', 'nodeName'=>array('img', 'a'), - 'attrName'=>'alt', 'attrName'=>array('title', 'alt'), - ), - */ - array( - 'nodeNamespace' => 'http://www.w3.org/1999/xhtml', - 'attrName' => array('href', - 'hreflang', - 'http-equiv', - 'icon', - 'id', - 'keytype', - 'kind', - 'label', - 'lang', - 'language', - 'list', - 'maxlength', - 'media', - 'method', - 'name', - 'placeholder', - 'rel', - 'rows', - 'rowspan', - 'sandbox', - 'spellcheck', - 'scope', - 'seamless', - 'shape', - 'size', - 'sizes', - 'span', - 'src', - 'srcdoc', - 'srclang', - 'srcset', - 'start', - 'step', - 'style', - 'summary', - 'tabindex', - 'target', - 'title', - 'type', - 'value', - 'width', - 'border', - 'charset', - 'cite', - 'class', - 'code', - 'codebase', - 'color', - 'cols', - 'colspan', - 'content', - 'coords', - 'data', - 'datetime', - 'default', - 'dir', - 'dirname', - 'enctype', - 'for', - 'form', - 'formaction', - 'headers', - 'height', - 'accept', - 'accept-charset', - 'accesskey', - 'action', - 'align', - 'alt', - 'bgcolor', - ), - ), - array( - 'nodeNamespace' => 'http://www.w3.org/1999/xhtml', - 'xpath' => 'starts-with(local-name(), \'data-\')', - ), - ); - - const DOCTYPE = ''; - - public function __construct($output, $options = array()) - { - if (isset($options['encode_entities'])) { - $this->encode = $options['encode_entities']; - } - - $this->outputMode = static::IM_IN_HTML; - $this->out = $output; - $this->hasHTML5 = defined('ENT_HTML5'); - } - - public function addRule(array $rule) - { - $this->nonBooleanAttributes[] = $rule; - } - - public function setTraverser(Traverser $traverser) - { - $this->traverser = $traverser; - - return $this; - } - - public function unsetTraverser() - { - $this->traverser = null; - - return $this; - } - - public function document($dom) - { - $this->doctype(); - if ($dom->documentElement) { - foreach ($dom->childNodes as $node) { - $this->traverser->node($node); - } - $this->nl(); - } - } - - protected function doctype() - { - $this->wr(static::DOCTYPE); - $this->nl(); - } - - public function element($ele) - { - $name = $ele->tagName; - - // Per spec: - // If the element has a declared namespace in the HTML, MathML or - // SVG namespaces, we use the lname instead of the tagName. - if ($this->traverser->isLocalElement($ele)) { - $name = $ele->localName; - } - - // If we are in SVG or MathML there is special handling. - // Using if/elseif instead of switch because it's faster in PHP. - if ('svg' == $name) { - $this->outputMode = static::IM_IN_SVG; - $name = Elements::normalizeSvgElement($name); - } elseif ('math' == $name) { - $this->outputMode = static::IM_IN_MATHML; - } - - $this->openTag($ele); - if (Elements::isA($name, Elements::TEXT_RAW)) { - foreach ($ele->childNodes as $child) { - if ($child instanceof \DOMCharacterData) { - $this->wr($child->data); - } elseif ($child instanceof \DOMElement) { - $this->element($child); - } - } - } else { - // Handle children. - if ($ele->hasChildNodes()) { - $this->traverser->children($ele->childNodes); - } - - // Close out the SVG or MathML special handling. - if ('svg' == $name || 'math' == $name) { - $this->outputMode = static::IM_IN_HTML; - } - } - - // If not unary, add a closing tag. - if (!Elements::isA($name, Elements::VOID_TAG)) { - $this->closeTag($ele); - } - } - - /** - * Write a text node. - * - * @param \DOMText $ele The text node to write. - */ - public function text($ele) - { - if (isset($ele->parentNode) && isset($ele->parentNode->tagName) && Elements::isA($ele->parentNode->localName, Elements::TEXT_RAW)) { - $this->wr($ele->data); - - return; - } - - // FIXME: This probably needs some flags set. - $this->wr($this->enc($ele->data)); - } - - public function cdata($ele) - { - // This encodes CDATA. - $this->wr($ele->ownerDocument->saveXML($ele)); - } - - public function comment($ele) - { - // These produce identical output. - // $this->wr(''); - $this->wr($ele->ownerDocument->saveXML($ele)); - } - - public function processorInstruction($ele) - { - $this->wr('wr($ele->target) - ->wr(' ') - ->wr($ele->data) - ->wr('?>'); - } - - /** - * Write the namespace attributes. - * - * @param \DOMNode $ele The element being written. - */ - protected function namespaceAttrs($ele) - { - if (!$this->xpath || $this->xpath->document !== $ele->ownerDocument) { - $this->xpath = new \DOMXPath($ele->ownerDocument); - } - - foreach ($this->xpath->query('namespace::*[not(.=../../namespace::*)]', $ele) as $nsNode) { - if (!in_array($nsNode->nodeValue, $this->implicitNamespaces)) { - $this->wr(' ')->wr($nsNode->nodeName)->wr('="')->wr($nsNode->nodeValue)->wr('"'); - } - } - } - - /** - * Write the opening tag. - * - * Tags for HTML, MathML, and SVG are in the local name. Otherwise, use the - * qualified name (8.3). - * - * @param \DOMNode $ele The element being written. - */ - protected function openTag($ele) - { - $this->wr('<')->wr($this->traverser->isLocalElement($ele) ? $ele->localName : $ele->tagName); - - $this->attrs($ele); - $this->namespaceAttrs($ele); - - if ($this->outputMode == static::IM_IN_HTML) { - $this->wr('>'); - } // If we are not in html mode we are in SVG, MathML, or XML embedded content. - else { - if ($ele->hasChildNodes()) { - $this->wr('>'); - } // If there are no children this is self closing. - else { - $this->wr(' />'); - } - } - } - - protected function attrs($ele) - { - // FIXME: Needs support for xml, xmlns, xlink, and namespaced elements. - if (!$ele->hasAttributes()) { - return $this; - } - - // TODO: Currently, this always writes name="value", and does not do - // value-less attributes. - $map = $ele->attributes; - $len = $map->length; - for ($i = 0; $i < $len; ++$i) { - $node = $map->item($i); - $val = $this->enc($node->value, true); - - // XXX: The spec says that we need to ensure that anything in - // the XML, XMLNS, or XLink NS's should use the canonical - // prefix. It seems that DOM does this for us already, but there - // may be exceptions. - $name = $node->nodeName; - - // Special handling for attributes in SVG and MathML. - // Using if/elseif instead of switch because it's faster in PHP. - if ($this->outputMode == static::IM_IN_SVG) { - $name = Elements::normalizeSvgAttribute($name); - } elseif ($this->outputMode == static::IM_IN_MATHML) { - $name = Elements::normalizeMathMlAttribute($name); - } - - $this->wr(' ')->wr($name); - - if ((isset($val) && '' !== $val) || $this->nonBooleanAttribute($node)) { - $this->wr('="')->wr($val)->wr('"'); - } - } - } - - protected function nonBooleanAttribute(\DOMAttr $attr) - { - $ele = $attr->ownerElement; - foreach ($this->nonBooleanAttributes as $rule) { - if (isset($rule['nodeNamespace']) && $rule['nodeNamespace'] !== $ele->namespaceURI) { - continue; - } - if (isset($rule['attNamespace']) && $rule['attNamespace'] !== $attr->namespaceURI) { - continue; - } - if (isset($rule['nodeName']) && !is_array($rule['nodeName']) && $rule['nodeName'] !== $ele->localName) { - continue; - } - if (isset($rule['nodeName']) && is_array($rule['nodeName']) && !in_array($ele->localName, $rule['nodeName'], true)) { - continue; - } - if (isset($rule['attrName']) && !is_array($rule['attrName']) && $rule['attrName'] !== $attr->localName) { - continue; - } - if (isset($rule['attrName']) && is_array($rule['attrName']) && !in_array($attr->localName, $rule['attrName'], true)) { - continue; - } - if (isset($rule['xpath'])) { - $xp = $this->getXPath($attr); - if (isset($rule['prefixes'])) { - foreach ($rule['prefixes'] as $nsPrefix => $ns) { - $xp->registerNamespace($nsPrefix, $ns); - } - } - if (!$xp->evaluate($rule['xpath'], $attr)) { - continue; - } - } - - return true; - } - - return false; - } - - private function getXPath(\DOMNode $node) - { - if (!$this->xpath) { - $this->xpath = new \DOMXPath($node->ownerDocument); - } - - return $this->xpath; - } - - /** - * Write the closing tag. - * - * Tags for HTML, MathML, and SVG are in the local name. Otherwise, use the - * qualified name (8.3). - * - * @param \DOMNode $ele The element being written. - */ - protected function closeTag($ele) - { - if ($this->outputMode == static::IM_IN_HTML || $ele->hasChildNodes()) { - $this->wr('wr($this->traverser->isLocalElement($ele) ? $ele->localName : $ele->tagName)->wr('>'); - } - } - - /** - * Write to the output. - * - * @param string $text The string to put into the output - * - * @return $this - */ - protected function wr($text) - { - fwrite($this->out, $text); - - return $this; - } - - /** - * Write a new line character. - * - * @return $this - */ - protected function nl() - { - fwrite($this->out, PHP_EOL); - - return $this; - } - - /** - * Encode text. - * - * When encode is set to false, the default value, the text passed in is - * escaped per section 8.3 of the html5 spec. For details on how text is - * escaped see the escape() method. - * - * When encoding is set to true the text is converted to named character - * references where appropriate. Section 8.1.4 Character references of the - * html5 spec refers to using named character references. This is useful for - * characters that can't otherwise legally be used in the text. - * - * The named character references are listed in section 8.5. - * - * @see http://www.w3.org/TR/2013/CR-html5-20130806/syntax.html#named-character-references True encoding will turn all named character references into their entities. - * This includes such characters as +.# and many other common ones. By default - * encoding here will just escape &'<>". - * - * Note, PHP 5.4+ has better html5 encoding. - * - * @todo Use the Entities class in php 5.3 to have html5 entities. - * - * @param string $text Text to encode. - * @param bool $attribute True if we are encoding an attrubute, false otherwise. - * - * @return string The encoded text. - */ - protected function enc($text, $attribute = false) - { - // Escape the text rather than convert to named character references. - if (!$this->encode) { - return $this->escape($text, $attribute); - } - - // If we are in PHP 5.4+ we can use the native html5 entity functionality to - // convert the named character references. - - if ($this->hasHTML5) { - return htmlentities($text, ENT_HTML5 | ENT_SUBSTITUTE | ENT_QUOTES, 'UTF-8', false); - } // If a version earlier than 5.4 html5 entities are not entirely handled. - // This manually handles them. - else { - return strtr($text, HTML5Entities::$map); - } - } - - /** - * Escape test. - * - * According to the html5 spec section 8.3 Serializing HTML fragments, text - * within tags that are not style, script, xmp, iframe, noembed, and noframes - * need to be properly escaped. - * - * The & should be converted to &, no breaking space unicode characters - * converted to  , when in attribute mode the " should be converted to - * ", and when not in attribute mode the < and > should be converted to - * < and >. - * - * @see http://www.w3.org/TR/2013/CR-html5-20130806/syntax.html#escapingString - * - * @param string $text Text to escape. - * @param bool $attribute True if we are escaping an attrubute, false otherwise. - */ - protected function escape($text, $attribute = false) - { - // Not using htmlspecialchars because, while it does escaping, it doesn't - // match the requirements of section 8.5. For example, it doesn't handle - // non-breaking spaces. - if ($attribute) { - $replace = array( - '"' => '"', - '&' => '&', - "\xc2\xa0" => ' ', - ); - } else { - $replace = array( - '<' => '<', - '>' => '>', - '&' => '&', - "\xc2\xa0" => ' ', - ); - } - - return strtr($text, $replace); - } -} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/README.md b/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/README.md deleted file mode 100644 index 849a47f..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# The Serializer (Writer) Model - -The serializer roughly follows sections _8.1 Writing HTML documents_ and section -_8.3 Serializing HTML fragments_ by converting DOMDocument, DOMDocumentFragment, -and DOMNodeList into HTML5. - - [ HTML5 ] // Interface for saving. - || - [ Traverser ] // Walk the DOM - || - [ Rules ] // Convert DOM elements into strings. - || - [ HTML5 ] // HTML5 document or fragment in text. - - -## HTML5 Class - -Provides the top level interface for saving. - -## The Traverser - -Walks the DOM finding each element and passing it off to the output rules to -convert to HTML5. - -## Output Rules - -The output rules are defined in the RulesInterface which can have multiple -implementations. Currently, the OutputRules is the default implementation that -converts a DOM as is into HTML5. - -## HTML5 String - -The output of the process it HTML5 as a string or saved to a file. \ No newline at end of file diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php b/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php deleted file mode 100644 index 69a6ecd..0000000 --- a/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php +++ /dev/null @@ -1,99 +0,0 @@ - 'html', - 'http://www.w3.org/1998/Math/MathML' => 'math', - 'http://www.w3.org/2000/svg' => 'svg', - ); - - protected $dom; - - protected $options; - - protected $encode = false; - - protected $rules; - - protected $out; - - /** - * Create a traverser. - * - * @param \DOMNode|\DOMNodeList $dom The document or node to traverse. - * @param resource $out A stream that allows writing. The traverser will output into this - * stream. - * @param array $options An array of options for the traverser as key/value pairs. These include: - * - encode_entities: A bool to specify if full encding should happen for all named - * charachter references. Defaults to false which escapes &'<>". - * - output_rules: The path to the class handling the output rules. - */ - public function __construct($dom, $out, RulesInterface $rules, $options = array()) - { - $this->dom = $dom; - $this->out = $out; - $this->rules = $rules; - $this->options = $options; - - $this->rules->setTraverser($this); - } - - /** - * Tell the traverser to walk the DOM. - * - * @return resource $out Returns the output stream. - */ - public function walk() - { - if ($this->dom instanceof \DOMDocument) { - $this->rules->document($this->dom); - } elseif ($this->dom instanceof \DOMDocumentFragment) { - // Document fragments are a special case. Only the children need to - // be serialized. - if ($this->dom->hasChildNodes()) { - $this->children($this->dom->childNodes); - } - } // If NodeList, loop - elseif ($this->dom instanceof \DOMNodeList) { - // If this is a NodeList of DOMDocuments this will not work. - $this->children($this->dom); - } // Else assume this is a DOMNode-like datastructure. - else { - $this->node($this->dom); - } - - return $this->out; - } - - /** - * Process a node in the DOM. - * - * @param mixed $node A node implementing \DOMNode. - */ - public function node($node) - { - // A listing of types is at http://php.net/manual/en/dom.constants.php - switch ($node->nodeType) { - case XML_ELEMENT_NODE: - $this->rules->element($node); - break; - case XML_TEXT_NODE: - $this->rules->text($node); - break; - case XML_CDATA_SECTION_NODE: - $this->rules->cdata($node); - break; - case XML_PI_NODE: - $this->rules->processorInstruction($node); - break; - case XML_COMMENT_NODE: - $this->rules->comment($node); - break; - // Currently we don't support embedding DTDs. - default: - //print ''; - break; - } - } - - /** - * Walk through all the nodes on a node list. - * - * @param \DOMNodeList $nl A list of child elements to walk through. - */ - public function children($nl) - { - foreach ($nl as $node) { - $this->node($node); - } - } - - /** - * Is an element local? - * - * @param mixed $ele An element that implement \DOMNode. - * - * @return bool true if local and false otherwise. - */ - public function isLocalElement($ele) - { - $uri = $ele->namespaceURI; - if (empty($uri)) { - return false; - } - - return isset(static::$local_ns[$uri]); - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/CHANGELOG.md b/dompdf/vendor/sabberworm/php-css-parser/CHANGELOG.md deleted file mode 100644 index c90927c..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/CHANGELOG.md +++ /dev/null @@ -1,365 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](https://semver.org/). - -## x.y.z - -### Added - -### Changed - -### Deprecated - -### Removed - -### Fixed - -## 8.7.0: Add support for PHP 8.4 - -### Added - -- Add support for PHP 8.4 (#675, #701, #746, #751) - -### Changed - -- Mark parsing-internal classes and methods as `@internal` (#711) -- Block installations on unsupported higher PHP versions (#691) - -### Deprecated - -- Deprecate the expansion of shorthand properties (#719) -- Deprecate `Parser::setCharset()` and `Parser::getCharset()` (#703) - -### Fixed - -- Fix type errors in PHP strict mode (#695) - -## 8.6.0 - -### Added - -- Support arithmetic operators in CSS function arguments (#607) -- Add support for inserting an item in a CSS list (#545) -- Add support for the `dvh`, `lvh` and `svh` length units (#415) - -### Changed - -- Improve performance of Value::parseValue with many delimiters by refactoring - to remove `array_search()` (#413) - -## 8.5.2 - -### Changed - -- Mark all class constants as `@internal` (#500) - -### Fixed - -- Fix undefined local variable in `CalcFunction::parse()` (#593) - -## 8.5.1 - -### Fixed - -- Fix PHP notice caused by parsing invalid color values having less than - 6 characters (#485) -- Fix (regression) failure to parse at-rules with strict parsing (#456) - -## 8.5.0 - -### Added - -- Add a method to get an import's media queries (#384) -- Add more unit tests (#381, #382) - -### Fixed - -- Retain CSSList and Rule comments when rendering CSS (#351) -- Replace invalid `turns` unit with `turn` (#350) -- Also allow string values for rules (#348) -- Fix invalid calc parsing (#169) -- Handle scientific notation when parsing sizes (#179) -- Fix PHP 8.1 compatibility in `ParserState::strsplit()` (#344) - -## 8.4.0 - -### Features - -* Support for PHP 8.x -* PHPDoc annotations -* Allow usage of CSS variables inside color functions (by parsing them as - regular functions) -* Use PSR-12 code style -* *No deprecations* - -### Bugfixes - -* Improved handling of whitespace in `calc()` -* Fix parsing units whose prefix is also a valid unit, like `vmin` -* Allow passing an object to `CSSList#replace` -* Fix PHP 7.3 warnings -* Correctly parse keyframes with `%` -* Don’t convert large numbers to scientific notation -* Allow a file to end after an `@import` -* Preserve case of CSS variables as specced -* Allow identifiers to use escapes the same way as strings -* No longer use `eval` for the comparison in `getSelectorsBySpecificity`, in - case it gets passed untrusted input (CVE-2020-13756). Also fixed in 8.3.1, - 8.2.1, 8.1.1, 8.0.1, 7.0.4, 6.0.2, 5.2.1, 5.1.3, 5.0.9, 4.0.1, 3.0.1, 2.0.1, - 1.0.1. -* Prevent an infinite loop when parsing invalid grid line names -* Remove invalid unit `vm` -* Retain rule order after expanding shorthands - -### Backwards-incompatible changes - -* PHP ≥ 5.6 is now required -* HHVM compatibility target dropped - -## 8.3.0 (2019-02-22) - -* Refactor parsing logic to mostly reside in the class files whose data - structure is to be parsed (this should eventually allow us to unit-test - specific parts of the parsing logic individually). -* Fix error in parsing `calc` expessions when the first operand is a negative - number, thanks to @raxbg. -* Support parsing CSS4 colors in hex notation with alpha values, thanks to - @raxbg. -* Swallow more errors in lenient mode, thanks to @raxbg. -* Allow specifying arbitrary strings to output before and after declaration - blocks, thanks to @westonruter. -* *No backwards-incompatible changes* -* *No deprecations* - -## 8.2.0 (2018-07-13) - -* Support parsing `calc()`, thanks to @raxbg. -* Support parsing grid-lines, again thanks to @raxbg. -* Support parsing legacy IE filters (`progid:`) in lenient mode, thanks to - @FMCorz -* Performance improvements parsing large files, again thanks to @FMCorz -* *No backwards-incompatible changes* -* *No deprecations* - -## 8.1.0 (2016-07-19) - -* Comments are no longer silently ignored but stored with the object with which - they appear (no render support, though). Thanks to @FMCorz. -* The IE hacks using `\0` and `\9` can now be parsed (and rendered) in lenient - mode. Thanks (again) to @FMCorz. -* Media queries with or without spaces before the query are parsed. Still no - *real* parsing support, though. Sorry… -* PHPUnit is now listed as a dev-dependency in composer.json. -* *No backwards-incompatible changes* -* *No deprecations* - -## 8.0.0 (2016-06-30) - -* Store source CSS line numbers in tokens and parsing exceptions. -* *No deprecations* - -### Backwards-incompatible changes - -* Unrecoverable parser errors throw an exception of type - `Sabberworm\CSS\Parsing\SourceException` instead of `\Exception`. - -## 7.0.3 (2016-04-27) - -* Fixed parsing empty CSS when multibyte is off -* *No backwards-incompatible changes* -* *No deprecations* - -## 7.0.2 (2016-02-11) - -* 150 time performance boost thanks - to @[ossinkine](https://github.com/ossinkine) -* *No backwards-incompatible changes* -* *No deprecations* - -## 7.0.1 (2015-12-25) - -* No more suppressed `E_NOTICE` -* *No backwards-incompatible changes* -* *No deprecations* - -## 7.0.0 (2015-08-24) - -* Compatibility with PHP 7. Well timed, eh? -* *No deprecations* - -### Backwards-incompatible changes - -* The `Sabberworm\CSS\Value\String` class has been renamed to - `Sabberworm\CSS\Value\CSSString`. - -## 6.0.1 (2015-08-24) - -* Remove some declarations in interfaces incompatible with PHP 5.3 (< 5.3.9) -* *No deprecations* - -## 6.0.0 (2014-07-03) - -* Format output using Sabberworm\CSS\OutputFormat -* *No backwards-incompatible changes* - -### Deprecations - -* The parse() method replaces __toString with an optional argument (instance of - the OutputFormat class) - -## 5.2.0 (2014-06-30) - -* Support removing a selector from a declaration block using - `$oBlock->removeSelector($mSelector)` -* Introduce a specialized exception (Sabberworm\CSS\Parsing\OuputException) for - exceptions during output rendering - -* *No deprecations* - -#### Backwards-incompatible changes - -* Outputting a declaration block that has no selectors throws an OuputException - instead of outputting an invalid ` {…}` into the CSS document. - -## 5.1.2 (2013-10-30) - -* Remove the use of consumeUntil in comment parsing. This makes it possible to - parse comments such as `/** Perfectly valid **/` -* Add fr relative size unit -* Fix some issues with HHVM -* *No backwards-incompatible changes* -* *No deprecations* - -## 5.1.1 (2013-10-28) - -* Updated CHANGELOG.md to reflect changes since 5.0.4 -* *No backwards-incompatible changes* -* *No deprecations* - -## 5.1.0 (2013-10-24) - -* Performance enhancements by Michael M Slusarz -* More rescue entry points for lenient parsing (unexpected tokens between - declaration blocks and unclosed comments) -* *No backwards-incompatible changes* -* *No deprecations* - -## 5.0.8 (2013-08-15) - -* Make default settings’ multibyte parsing option dependent on whether or not - the mbstring extension is actually installed. -* *No backwards-incompatible changes* -* *No deprecations* - -## 5.0.7 (2013-08-04) - -* Fix broken decimal point output optimization -* *No backwards-incompatible changes* -* *No deprecations* - -## 5.0.6 (2013-05-31) - -* Fix broken unit test -* *No backwards-incompatible changes* -* *No deprecations* - -## 5.0.5 (2013-04-17) - -* Initial support for lenient parsing (setting this parser option will catch - some exceptions internally and recover the parser’s state as neatly as - possible). -* *No backwards-incompatible changes* -* *No deprecations* - -## 5.0.4 (2013-03-21) - -* Don’t output floats with locale-aware separator chars -* *No backwards-incompatible changes* -* *No deprecations* - -## 5.0.3 (2013-03-21) - -* More size units recognized -* *No backwards-incompatible changes* -* *No deprecations* - -## 5.0.2 (2013-03-21) - -* CHANGELOG.md file added to distribution -* *No backwards-incompatible changes* -* *No deprecations* - -## 5.0.1 (2013-03-20) - -* Internal cleanup -* *No backwards-incompatible changes* -* *No deprecations* - -## 5.0.0 (2013-03-20) - -* Correctly parse all known CSS 3 units (including Hz and kHz). -* Output RGB colors in short (#aaa or #ababab) notation -* Be case-insensitive when parsing identifiers. -* *No deprecations* - -### Backwards-incompatible changes - -* `Sabberworm\CSS\Value\Color`’s `__toString` method overrides `CSSList`’s to - maybe return something other than `type(value, …)` (see above). - -## 4.0.0 (2013-03-19) - -* Support for more @-rules -* Generic interface `Sabberworm\CSS\Property\AtRule`, implemented by all @-rule - classes -* *No deprecations* - -### Backwards-incompatible changes - -* `Sabberworm\CSS\RuleSet\AtRule` renamed to `Sabberworm\CSS\RuleSet\AtRuleSet` -* `Sabberworm\CSS\CSSList\MediaQuery` renamed to - `Sabberworm\CSS\RuleSet\CSSList\AtRuleBlockList` with differing semantics and - API (which also works for other block-list-based @-rules like `@supports`). - -## 3.0.0 (2013-03-06) - -* Support for lenient parsing (on by default) -* *No deprecations* - -### Backwards-incompatible changes - -* All properties (like whether or not to use `mb_`-functions, which default - charset to use and – new – whether or not to be forgiving when parsing) are - now encapsulated in an instance of `Sabberworm\CSS\Settings` which can be - passed as the second argument to `Sabberworm\CSS\Parser->__construct()`. -* Specifying a charset as the second argument to - `Sabberworm\CSS\Parser->__construct()` is no longer supported. Use - `Sabberworm\CSS\Settings::create()->withDefaultCharset('some-charset')` - instead. -* Setting `Sabberworm\CSS\Parser->bUseMbFunctions` has no effect. Use - `Sabberworm\CSS\Settings::create()->withMultibyteSupport(true/false)` instead. -* `Sabberworm\CSS\Parser->parse()` may throw a - `Sabberworm\CSS\Parsing\UnexpectedTokenException` when in strict parsing mode. - -## 2.0.0 (2013-01-29) - -* Allow multiple rules of the same type per rule set - -### Backwards-incompatible changes - -* `Sabberworm\CSS\RuleSet->getRules()` returns an index-based array instead of - an associative array. Use `Sabberworm\CSS\RuleSet->getRulesAssoc()` (which - eliminates duplicate rules and lets the later rule of the same name win). -* `Sabberworm\CSS\RuleSet->removeRule()` works as it did before except when - passed an instance of `Sabberworm\CSS\Rule\Rule`, in which case it would only - remove the exact rule given instead of all the rules of the same type. To get - the old behaviour, use `Sabberworm\CSS\RuleSet->removeRule($oRule->getRule()`; - -## 1.0 - -Initial release of a stable public API. - -## 0.9 - -Last version not to use PSR-0 project organization semantics. diff --git a/dompdf/vendor/sabberworm/php-css-parser/LICENSE b/dompdf/vendor/sabberworm/php-css-parser/LICENSE deleted file mode 100644 index 686a4e3..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2011 Raphael Schweikert, https://www.sabberworm.com/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/dompdf/vendor/sabberworm/php-css-parser/README.md b/dompdf/vendor/sabberworm/php-css-parser/README.md deleted file mode 100644 index 90428cb..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/README.md +++ /dev/null @@ -1,637 +0,0 @@ -# PHP CSS Parser - -[![Build Status](https://github.com/sabberworm/PHP-CSS-Parser/workflows/CI/badge.svg?branch=master)](https://github.com/sabberworm/PHP-CSS-Parser/actions/) - -A Parser for CSS Files written in PHP. Allows extraction of CSS files into a data structure, manipulation of said structure and output as (optimized) CSS. - -## Usage - -### Installation using Composer - -```bash -composer require sabberworm/php-css-parser -``` - -### Extraction - -To use the CSS Parser, create a new instance. The constructor takes the following form: - -```php -new \Sabberworm\CSS\Parser($css); -``` - -To read a file, for example, you’d do the following: - -```php -$parser = new \Sabberworm\CSS\Parser(file_get_contents('somefile.css')); -$cssDocument = $parser->parse(); -``` - -The resulting CSS document structure can be manipulated prior to being output. - -### Options - -#### Charset - -The charset option will only be used if the CSS file does not contain an `@charset` declaration. UTF-8 is the default, so you won’t have to create a settings object at all if you don’t intend to change that. - -```php -$settings = \Sabberworm\CSS\Settings::create() - ->withDefaultCharset('windows-1252'); -$parser = new \Sabberworm\CSS\Parser($css, $settings); -``` - -#### Strict parsing - -To have the parser throw an exception when encountering invalid/unknown constructs (as opposed to trying to ignore them and carry on parsing), supply a thusly configured `\Sabberworm\CSS\Settings` object: - -```php -$parser = new \Sabberworm\CSS\Parser( - file_get_contents('somefile.css'), - \Sabberworm\CSS\Settings::create()->beStrict() -); -``` - -Note that this will also disable a workaround for parsing the unquoted variant of the legacy IE-specific `filter` rule. - -#### Disable multibyte functions - -To achieve faster parsing, you can choose to have PHP-CSS-Parser use regular string functions instead of `mb_*` functions. This should work fine in most cases, even for UTF-8 files, as all the multibyte characters are in string literals. Still it’s not recommended using this with input you have no control over as it’s not thoroughly covered by test cases. - -```php -$settings = \Sabberworm\CSS\Settings::create()->withMultibyteSupport(false); -$parser = new \Sabberworm\CSS\Parser($css, $settings); -``` - -### Manipulation - -The resulting data structure consists mainly of five basic types: `CSSList`, `RuleSet`, `Rule`, `Selector` and `Value`. There are two additional types used: `Import` and `Charset`, which you won’t use often. - -#### CSSList - -`CSSList` represents a generic CSS container, most likely containing declaration blocks (rule sets with a selector), but it may also contain at-rules, charset declarations, etc. - -To access the items stored in a `CSSList` – like the document you got back when calling `$parser->parse()` –, use `getContents()`, then iterate over that collection and use `instanceof` to check whether you’re dealing with another `CSSList`, a `RuleSet`, a `Import` or a `Charset`. - -To append a new item (selector, media query, etc.) to an existing `CSSList`, construct it using the constructor for this class and use the `append($oItem)` method. - -#### RuleSet - -`RuleSet` is a container for individual rules. The most common form of a rule set is one constrained by a selector. The following concrete subtypes exist: - -* `AtRuleSet` – for generic at-rules for generic at-rules which are not covered by specific classes, i.e., not `@import`, `@charset` or `@media`. A common example for this is `@font-face`. -* `DeclarationBlock` – a `RuleSet` constrained by a `Selector`; contains an array of selector objects (comma-separated in the CSS) as well as the rules to be applied to the matching elements. - -Note: A `CSSList` can contain other `CSSList`s (and `Import`s as well as a `Charset`), while a `RuleSet` can only contain `Rule`s. - -If you want to manipulate a `RuleSet`, use the methods `addRule(Rule $rule)`, `getRules()` and `removeRule($rule)` (which accepts either a `Rule` or a rule name; optionally suffixed by a dash to remove all related rules). - -#### Rule - -`Rule`s just have a string key (the rule) and a `Value`. - -#### Value - -`Value` is an abstract class that only defines the `render` method. The concrete subclasses for atomic value types are: - -* `Size` – consists of a numeric `size` value and a unit. -* `Color` – colors can be input in the form #rrggbb, #rgb or schema(val1, val2, …) but are always stored as an array of ('s' => val1, 'c' => val2, 'h' => val3, …) and output in the second form. -* `CSSString` – this is just a wrapper for quoted strings to distinguish them from keywords; always output with double quotes. -* `URL` – URLs in CSS; always output in `URL("")` notation. - -There is another abstract subclass of `Value`, `ValueList`: A `ValueList` represents a lists of `Value`s, separated by some separation character (mostly `,`, whitespace, or `/`). - -There are two types of `ValueList`s: - -* `RuleValueList` – The default type, used to represent all multivalued rules like `font: bold 12px/3 Helvetica, Verdana, sans-serif;` (where the value would be a whitespace-separated list of the primitive value `bold`, a slash-separated list and a comma-separated list). -* `CSSFunction` – A special kind of value that also contains a function name and where the values are the function’s arguments. Also handles equals-sign-separated argument lists like `filter: alpha(opacity=90);`. - -#### Convenience methods - -There are a few convenience methods on `Document` to ease finding, manipulating and deleting rules: - -* `getAllDeclarationBlocks()` – does what it says; no matter how deeply nested the selectors are. Aliased as `getAllSelectors()`. -* `getAllRuleSets()` – does what it says; no matter how deeply nested the rule sets are. -* `getAllValues()` – finds all `Value` objects inside `Rule`s. - -## To-Do - -* More convenience methods (like `selectorsWithElement($sId/Class/TagName)`, `attributesOfType($type)`, `removeAttributesOfType($type)`) -* Real multibyte support. Currently, only multibyte charsets whose first 255 code points take up only one byte and are identical with ASCII are supported (yes, UTF-8 fits this description). -* Named color support (using `Color` instead of an anonymous string literal) - -## Use cases - -### Use `Parser` to prepend an ID to all selectors - -```php -$myId = "#my_id"; -$parser = new \Sabberworm\CSS\Parser($css); -$cssDocument = $parser->parse(); -foreach ($cssDocument->getAllDeclarationBlocks() as $block) { - foreach ($block->getSelectors() as $selector) { - // Loop over all selector parts (the comma-separated strings in a - // selector) and prepend the ID. - $selector->setSelector($myId.' '.$selector->getSelector()); - } -} -``` - -### Shrink all absolute sizes to half - -```php -$parser = new \Sabberworm\CSS\Parser($css); -$cssDocument = $parser->parse(); -foreach ($cssDocument->getAllValues() as $value) { - if ($value instanceof CSSSize && !$value->isRelative()) { - $value->setSize($value->getSize() / 2); - } -} -``` - -### Remove unwanted rules - -```php -$parser = new \Sabberworm\CSS\Parser($css); -$cssDocument = $parser->parse(); -foreach($cssDocument->getAllRuleSets() as $oRuleSet) { - // Note that the added dash will make this remove all rules starting with - // `font-` (like `font-size`, `font-weight`, etc.) as well as a potential - // `font` rule. - $oRuleSet->removeRule('font-'); - $oRuleSet->removeRule('cursor'); -} -``` - -### Output - -To output the entire CSS document into a variable, just use `->render()`: - -```php -$parser = new \Sabberworm\CSS\Parser(file_get_contents('somefile.css')); -$cssDocument = $parser->parse(); -print $cssDocument->render(); -``` - -If you want to format the output, pass an instance of type `\Sabberworm\CSS\OutputFormat`: - -```php -$format = \Sabberworm\CSS\OutputFormat::create() - ->indentWithSpaces(4)->setSpaceBetweenRules("\n"); -print $cssDocument->render($format); -``` - -Or use one of the predefined formats: - -```php -print $cssDocument->render(Sabberworm\CSS\OutputFormat::createPretty()); -print $cssDocument->render(Sabberworm\CSS\OutputFormat::createCompact()); -``` - -To see what you can do with output formatting, look at the tests in `tests/OutputFormatTest.php`. - -## Examples - -### Example 1 (At-Rules) - -#### Input - -```css -@charset "utf-8"; - -@font-face { - font-family: "CrassRoots"; - src: url("../media/cr.ttf"); -} - -html, body { - font-size: 1.6em; -} - -@keyframes mymove { - from { top: 0px; } - to { top: 200px; } -} - -``` - -
- Structure (var_dump()) - -```php -class Sabberworm\CSS\CSSList\Document#4 (2) { - protected $aContents => - array(4) { - [0] => - class Sabberworm\CSS\Property\Charset#6 (2) { - private $sCharset => - class Sabberworm\CSS\Value\CSSString#5 (2) { - private $sString => - string(5) "utf-8" - protected $iLineNo => - int(1) - } - protected $iLineNo => - int(1) - } - [1] => - class Sabberworm\CSS\RuleSet\AtRuleSet#7 (4) { - private $sType => - string(9) "font-face" - private $sArgs => - string(0) "" - private $aRules => - array(2) { - 'font-family' => - array(1) { - [0] => - class Sabberworm\CSS\Rule\Rule#8 (4) { - private $sRule => - string(11) "font-family" - private $mValue => - class Sabberworm\CSS\Value\CSSString#9 (2) { - private $sString => - string(10) "CrassRoots" - protected $iLineNo => - int(4) - } - private $bIsImportant => - bool(false) - protected $iLineNo => - int(4) - } - } - 'src' => - array(1) { - [0] => - class Sabberworm\CSS\Rule\Rule#10 (4) { - private $sRule => - string(3) "src" - private $mValue => - class Sabberworm\CSS\Value\URL#11 (2) { - private $oURL => - class Sabberworm\CSS\Value\CSSString#12 (2) { - private $sString => - string(15) "../media/cr.ttf" - protected $iLineNo => - int(5) - } - protected $iLineNo => - int(5) - } - private $bIsImportant => - bool(false) - protected $iLineNo => - int(5) - } - } - } - protected $iLineNo => - int(3) - } - [2] => - class Sabberworm\CSS\RuleSet\DeclarationBlock#13 (3) { - private $aSelectors => - array(2) { - [0] => - class Sabberworm\CSS\Property\Selector#14 (2) { - private $sSelector => - string(4) "html" - private $iSpecificity => - NULL - } - [1] => - class Sabberworm\CSS\Property\Selector#15 (2) { - private $sSelector => - string(4) "body" - private $iSpecificity => - NULL - } - } - private $aRules => - array(1) { - 'font-size' => - array(1) { - [0] => - class Sabberworm\CSS\Rule\Rule#16 (4) { - private $sRule => - string(9) "font-size" - private $mValue => - class Sabberworm\CSS\Value\Size#17 (4) { - private $fSize => - double(1.6) - private $sUnit => - string(2) "em" - private $bIsColorComponent => - bool(false) - protected $iLineNo => - int(9) - } - private $bIsImportant => - bool(false) - protected $iLineNo => - int(9) - } - } - } - protected $iLineNo => - int(8) - } - [3] => - class Sabberworm\CSS\CSSList\KeyFrame#18 (4) { - private $vendorKeyFrame => - string(9) "keyframes" - private $animationName => - string(6) "mymove" - protected $aContents => - array(2) { - [0] => - class Sabberworm\CSS\RuleSet\DeclarationBlock#19 (3) { - private $aSelectors => - array(1) { - [0] => - class Sabberworm\CSS\Property\Selector#20 (2) { - private $sSelector => - string(4) "from" - private $iSpecificity => - NULL - } - } - private $aRules => - array(1) { - 'top' => - array(1) { - [0] => - class Sabberworm\CSS\Rule\Rule#21 (4) { - private $sRule => - string(3) "top" - private $mValue => - class Sabberworm\CSS\Value\Size#22 (4) { - private $fSize => - double(0) - private $sUnit => - string(2) "px" - private $bIsColorComponent => - bool(false) - protected $iLineNo => - int(13) - } - private $bIsImportant => - bool(false) - protected $iLineNo => - int(13) - } - } - } - protected $iLineNo => - int(13) - } - [1] => - class Sabberworm\CSS\RuleSet\DeclarationBlock#23 (3) { - private $aSelectors => - array(1) { - [0] => - class Sabberworm\CSS\Property\Selector#24 (2) { - private $sSelector => - string(2) "to" - private $iSpecificity => - NULL - } - } - private $aRules => - array(1) { - 'top' => - array(1) { - [0] => - class Sabberworm\CSS\Rule\Rule#25 (4) { - private $sRule => - string(3) "top" - private $mValue => - class Sabberworm\CSS\Value\Size#26 (4) { - private $fSize => - double(200) - private $sUnit => - string(2) "px" - private $bIsColorComponent => - bool(false) - protected $iLineNo => - int(14) - } - private $bIsImportant => - bool(false) - protected $iLineNo => - int(14) - } - } - } - protected $iLineNo => - int(14) - } - } - protected $iLineNo => - int(12) - } - } - protected $iLineNo => - int(1) -} - -``` -
- -#### Output (`render()`) - -```css -@charset "utf-8"; -@font-face {font-family: "CrassRoots";src: url("../media/cr.ttf");} -html, body {font-size: 1.6em;} -@keyframes mymove {from {top: 0px;} to {top: 200px;}} -``` - -### Example 2 (Values) - -#### Input - -```css -#header { - margin: 10px 2em 1cm 2%; - font-family: Verdana, Helvetica, "Gill Sans", sans-serif; - color: red !important; -} - -``` - -
- Structure (var_dump()) - -```php -class Sabberworm\CSS\CSSList\Document#4 (2) { - protected $aContents => - array(1) { - [0] => - class Sabberworm\CSS\RuleSet\DeclarationBlock#5 (3) { - private $aSelectors => - array(1) { - [0] => - class Sabberworm\CSS\Property\Selector#6 (2) { - private $sSelector => - string(7) "#header" - private $iSpecificity => - NULL - } - } - private $aRules => - array(3) { - 'margin' => - array(1) { - [0] => - class Sabberworm\CSS\Rule\Rule#7 (4) { - private $sRule => - string(6) "margin" - private $mValue => - class Sabberworm\CSS\Value\RuleValueList#12 (3) { - protected $aComponents => - array(4) { - [0] => - class Sabberworm\CSS\Value\Size#8 (4) { - private $fSize => - double(10) - private $sUnit => - string(2) "px" - private $bIsColorComponent => - bool(false) - protected $iLineNo => - int(2) - } - [1] => - class Sabberworm\CSS\Value\Size#9 (4) { - private $fSize => - double(2) - private $sUnit => - string(2) "em" - private $bIsColorComponent => - bool(false) - protected $iLineNo => - int(2) - } - [2] => - class Sabberworm\CSS\Value\Size#10 (4) { - private $fSize => - double(1) - private $sUnit => - string(2) "cm" - private $bIsColorComponent => - bool(false) - protected $iLineNo => - int(2) - } - [3] => - class Sabberworm\CSS\Value\Size#11 (4) { - private $fSize => - double(2) - private $sUnit => - string(1) "%" - private $bIsColorComponent => - bool(false) - protected $iLineNo => - int(2) - } - } - protected $sSeparator => - string(1) " " - protected $iLineNo => - int(2) - } - private $bIsImportant => - bool(false) - protected $iLineNo => - int(2) - } - } - 'font-family' => - array(1) { - [0] => - class Sabberworm\CSS\Rule\Rule#13 (4) { - private $sRule => - string(11) "font-family" - private $mValue => - class Sabberworm\CSS\Value\RuleValueList#15 (3) { - protected $aComponents => - array(4) { - [0] => - string(7) "Verdana" - [1] => - string(9) "Helvetica" - [2] => - class Sabberworm\CSS\Value\CSSString#14 (2) { - private $sString => - string(9) "Gill Sans" - protected $iLineNo => - int(3) - } - [3] => - string(10) "sans-serif" - } - protected $sSeparator => - string(1) "," - protected $iLineNo => - int(3) - } - private $bIsImportant => - bool(false) - protected $iLineNo => - int(3) - } - } - 'color' => - array(1) { - [0] => - class Sabberworm\CSS\Rule\Rule#16 (4) { - private $sRule => - string(5) "color" - private $mValue => - string(3) "red" - private $bIsImportant => - bool(true) - protected $iLineNo => - int(4) - } - } - } - protected $iLineNo => - int(1) - } - } - protected $iLineNo => - int(1) -} - -``` -
- -#### Output (`render()`) - -```css -#header {margin: 10px 2em 1cm 2%;font-family: Verdana,Helvetica,"Gill Sans",sans-serif;color: red !important;} -``` - -## Contributors/Thanks to - -* [oliverklee](https://github.com/oliverklee) for lots of refactorings, code modernizations and CI integrations -* [raxbg](https://github.com/raxbg) for contributions to parse `calc`, grid lines, and various bugfixes. -* [westonruter](https://github.com/westonruter) for bugfixes and improvements. -* [FMCorz](https://github.com/FMCorz) for many patches and suggestions, for being able to parse comments and IE hacks (in lenient mode). -* [Lullabot](https://github.com/Lullabot) for a patch that allows to know the line number for each parsed token. -* [ju1ius](https://github.com/ju1ius) for the specificity parsing code and the ability to expand/compact shorthand properties. -* [ossinkine](https://github.com/ossinkine) for a 150 time performance boost. -* [GaryJones](https://github.com/GaryJones) for lots of input and [https://css-specificity.info/](https://css-specificity.info/). -* [docteurklein](https://github.com/docteurklein) for output formatting and `CSSList->remove()` inspiration. -* [nicolopignatelli](https://github.com/nicolopignatelli) for PSR-0 compatibility. -* [diegoembarcadero](https://github.com/diegoembarcadero) for keyframe at-rule parsing. -* [goetas](https://github.com/goetas) for @namespace at-rule support. -* [View full list](https://github.com/sabberworm/PHP-CSS-Parser/contributors) - -## Misc - -* Legacy Support: The latest pre-PSR-0 version of this project can be checked with the `0.9.0` tag. -* Running Tests: To run all unit tests for this project, run `composer install` to install phpunit and use `./vendor/bin/phpunit`. diff --git a/dompdf/vendor/sabberworm/php-css-parser/composer.json b/dompdf/vendor/sabberworm/php-css-parser/composer.json deleted file mode 100644 index 685db65..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/composer.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "sabberworm/php-css-parser", - "type": "library", - "description": "Parser for CSS Files written in PHP", - "keywords": [ - "parser", - "css", - "stylesheet" - ], - "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", - "license": "MIT", - "authors": [ - { - "name": "Raphael Schweikert" - }, - { - "name": "Oliver Klee", - "email": "github@oliverklee.de" - }, - { - "name": "Jake Hotson", - "email": "jake.github@qzdesign.co.uk" - } - ], - "require": { - "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", - "ext-iconv": "*" - }, - "require-dev": { - "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.40" - }, - "suggest": { - "ext-mbstring": "for parsing UTF-8 CSS" - }, - "autoload": { - "psr-4": { - "Sabberworm\\CSS\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "Sabberworm\\CSS\\Tests\\": "tests/" - } - }, - "extra": { - "branch-alias": { - "dev-main": "9.0.x-dev" - } - }, - "scripts": { - "ci": [ - "@ci:static" - ], - "ci:php:fixer": "@php ./.phive/php-cs-fixer.phar --config=config/php-cs-fixer.php fix --dry-run -v --show-progress=dots bin src tests", - "ci:php:sniffer": "@php ./.phive/phpcs.phar --standard=config/phpcs.xml bin src tests", - "ci:php:stan": "@php ./.phive/phpstan.phar --configuration=config/phpstan.neon", - "ci:static": [ - "@ci:php:fixer", - "@ci:php:sniffer", - "@ci:php:stan" - ], - "fix:php": [ - "@fix:php:fixer", - "@fix:php:sniffer" - ], - "fix:php:fixer": "@php ./.phive/php-cs-fixer.phar --config=config/php-cs-fixer.php fix bin src tests", - "fix:php:sniffer": "@php ./.phive/phpcbf.phar --standard=config/phpcs.xml bin src tests", - "phpstan:baseline": "@php ./.phive/phpstan.phar --configuration=config/phpstan.neon --generate-baseline=config/phpstan-baseline.neon" - }, - "scripts-descriptions": { - "ci": "Runs all dynamic and static code checks (i.e. currently, only the static checks).", - "ci:php:fixer": "Checks the code style with PHP CS Fixer.", - "ci:php:sniffer": "Checks the code style with PHP_CodeSniffer.", - "ci:php:stan": "Checks the types with PHPStan.", - "ci:static": "Runs all static code analysis checks for the code.", - "fix:php": "Autofixes all autofixable issues in the PHP code.", - "fix:php:fixer": "Fixes autofixable issues found by PHP CS Fixer.", - "fix:php:sniffer": "Fixes autofixable issues found by PHP_CodeSniffer.", - "phpstand:baseline": "Updates the PHPStan baseline file to match the code." - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/AtRuleBlockList.php b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/AtRuleBlockList.php deleted file mode 100644 index 5930b93..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/AtRuleBlockList.php +++ /dev/null @@ -1,86 +0,0 @@ -sType = $sType; - $this->sArgs = $sArgs; - } - - /** - * @return string - */ - public function atRuleName() - { - return $this->sType; - } - - /** - * @return string - */ - public function atRuleArgs() - { - return $this->sArgs; - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - $sResult = $oOutputFormat->comments($this); - $sResult .= $oOutputFormat->sBeforeAtRuleBlock; - $sArgs = $this->sArgs; - if ($sArgs) { - $sArgs = ' ' . $sArgs; - } - $sResult .= "@{$this->sType}$sArgs{$oOutputFormat->spaceBeforeOpeningBrace()}{"; - $sResult .= $this->renderListContents($oOutputFormat); - $sResult .= '}'; - $sResult .= $oOutputFormat->sAfterAtRuleBlock; - return $sResult; - } - - /** - * @return bool - */ - public function isRootList() - { - return false; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/CSSBlockList.php b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/CSSBlockList.php deleted file mode 100644 index fce7913..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/CSSBlockList.php +++ /dev/null @@ -1,143 +0,0 @@ - $aResult - * - * @return void - */ - protected function allDeclarationBlocks(array &$aResult) - { - foreach ($this->aContents as $mContent) { - if ($mContent instanceof DeclarationBlock) { - $aResult[] = $mContent; - } elseif ($mContent instanceof CSSBlockList) { - $mContent->allDeclarationBlocks($aResult); - } - } - } - - /** - * @param array $aResult - * - * @return void - */ - protected function allRuleSets(array &$aResult) - { - foreach ($this->aContents as $mContent) { - if ($mContent instanceof RuleSet) { - $aResult[] = $mContent; - } elseif ($mContent instanceof CSSBlockList) { - $mContent->allRuleSets($aResult); - } - } - } - - /** - * @param CSSList|Rule|RuleSet|Value $oElement - * @param array $aResult - * @param string|null $sSearchString - * @param bool $bSearchInFunctionArguments - * - * @return void - */ - protected function allValues($oElement, array &$aResult, $sSearchString = null, $bSearchInFunctionArguments = false) - { - if ($oElement instanceof CSSBlockList) { - foreach ($oElement->getContents() as $oContent) { - $this->allValues($oContent, $aResult, $sSearchString, $bSearchInFunctionArguments); - } - } elseif ($oElement instanceof RuleSet) { - foreach ($oElement->getRules($sSearchString) as $oRule) { - $this->allValues($oRule, $aResult, $sSearchString, $bSearchInFunctionArguments); - } - } elseif ($oElement instanceof Rule) { - $this->allValues($oElement->getValue(), $aResult, $sSearchString, $bSearchInFunctionArguments); - } elseif ($oElement instanceof ValueList) { - if ($bSearchInFunctionArguments || !($oElement instanceof CSSFunction)) { - foreach ($oElement->getListComponents() as $mComponent) { - $this->allValues($mComponent, $aResult, $sSearchString, $bSearchInFunctionArguments); - } - } - } else { - // Non-List `Value` or `CSSString` (CSS identifier) - $aResult[] = $oElement; - } - } - - /** - * @param array $aResult - * @param string|null $sSpecificitySearch - * - * @return void - */ - protected function allSelectors(array &$aResult, $sSpecificitySearch = null) - { - /** @var array $aDeclarationBlocks */ - $aDeclarationBlocks = []; - $this->allDeclarationBlocks($aDeclarationBlocks); - foreach ($aDeclarationBlocks as $oBlock) { - foreach ($oBlock->getSelectors() as $oSelector) { - if ($sSpecificitySearch === null) { - $aResult[] = $oSelector; - } else { - $sComparator = '==='; - $aSpecificitySearch = explode(' ', $sSpecificitySearch); - $iTargetSpecificity = $aSpecificitySearch[0]; - if (count($aSpecificitySearch) > 1) { - $sComparator = $aSpecificitySearch[0]; - $iTargetSpecificity = $aSpecificitySearch[1]; - } - $iTargetSpecificity = (int)$iTargetSpecificity; - $iSelectorSpecificity = $oSelector->getSpecificity(); - $bMatches = false; - switch ($sComparator) { - case '<=': - $bMatches = $iSelectorSpecificity <= $iTargetSpecificity; - break; - case '<': - $bMatches = $iSelectorSpecificity < $iTargetSpecificity; - break; - case '>=': - $bMatches = $iSelectorSpecificity >= $iTargetSpecificity; - break; - case '>': - $bMatches = $iSelectorSpecificity > $iTargetSpecificity; - break; - default: - $bMatches = $iSelectorSpecificity === $iTargetSpecificity; - break; - } - if ($bMatches) { - $aResult[] = $oSelector; - } - } - } - } - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/CSSList.php b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/CSSList.php deleted file mode 100644 index 4bb3758..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/CSSList.php +++ /dev/null @@ -1,496 +0,0 @@ - - */ - protected $aComments; - - /** - * @var array - */ - protected $aContents; - - /** - * @var int - */ - protected $iLineNo; - - /** - * @param int $iLineNo - */ - public function __construct($iLineNo = 0) - { - $this->aComments = []; - $this->aContents = []; - $this->iLineNo = $iLineNo; - } - - /** - * @return void - * - * @throws UnexpectedTokenException - * @throws SourceException - */ - public static function parseList(ParserState $oParserState, CSSList $oList) - { - $bIsRoot = $oList instanceof Document; - if (is_string($oParserState)) { - $oParserState = new ParserState($oParserState, Settings::create()); - } - $bLenientParsing = $oParserState->getSettings()->bLenientParsing; - $aComments = []; - while (!$oParserState->isEnd()) { - $aComments = array_merge($aComments, $oParserState->consumeWhiteSpace()); - $oListItem = null; - if ($bLenientParsing) { - try { - $oListItem = self::parseListItem($oParserState, $oList); - } catch (UnexpectedTokenException $e) { - $oListItem = false; - } - } else { - $oListItem = self::parseListItem($oParserState, $oList); - } - if ($oListItem === null) { - // List parsing finished - return; - } - if ($oListItem) { - $oListItem->addComments($aComments); - $oList->append($oListItem); - } - $aComments = $oParserState->consumeWhiteSpace(); - } - $oList->addComments($aComments); - if (!$bIsRoot && !$bLenientParsing) { - throw new SourceException("Unexpected end of document", $oParserState->currentLine()); - } - } - - /** - * @return AtRuleBlockList|KeyFrame|Charset|CSSNamespace|Import|AtRuleSet|DeclarationBlock|null|false - * - * @throws SourceException - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - private static function parseListItem(ParserState $oParserState, CSSList $oList) - { - $bIsRoot = $oList instanceof Document; - if ($oParserState->comes('@')) { - $oAtRule = self::parseAtRule($oParserState); - if ($oAtRule instanceof Charset) { - if (!$bIsRoot) { - throw new UnexpectedTokenException( - '@charset may only occur in root document', - '', - 'custom', - $oParserState->currentLine() - ); - } - if (count($oList->getContents()) > 0) { - throw new UnexpectedTokenException( - '@charset must be the first parseable token in a document', - '', - 'custom', - $oParserState->currentLine() - ); - } - $oParserState->setCharset($oAtRule->getCharset()); - } - return $oAtRule; - } elseif ($oParserState->comes('}')) { - if ($bIsRoot) { - if ($oParserState->getSettings()->bLenientParsing) { - return DeclarationBlock::parse($oParserState); - } else { - throw new SourceException("Unopened {", $oParserState->currentLine()); - } - } else { - // End of list - return null; - } - } else { - return DeclarationBlock::parse($oParserState, $oList); - } - } - - /** - * @param ParserState $oParserState - * - * @return AtRuleBlockList|KeyFrame|Charset|CSSNamespace|Import|AtRuleSet|null - * - * @throws SourceException - * @throws UnexpectedTokenException - * @throws UnexpectedEOFException - */ - private static function parseAtRule(ParserState $oParserState) - { - $oParserState->consume('@'); - $sIdentifier = $oParserState->parseIdentifier(); - $iIdentifierLineNum = $oParserState->currentLine(); - $oParserState->consumeWhiteSpace(); - if ($sIdentifier === 'import') { - $oLocation = URL::parse($oParserState); - $oParserState->consumeWhiteSpace(); - $sMediaQuery = null; - if (!$oParserState->comes(';')) { - $sMediaQuery = trim($oParserState->consumeUntil([';', ParserState::EOF])); - } - $oParserState->consumeUntil([';', ParserState::EOF], true, true); - return new Import($oLocation, $sMediaQuery ?: null, $iIdentifierLineNum); - } elseif ($sIdentifier === 'charset') { - $oCharsetString = CSSString::parse($oParserState); - $oParserState->consumeWhiteSpace(); - $oParserState->consumeUntil([';', ParserState::EOF], true, true); - return new Charset($oCharsetString, $iIdentifierLineNum); - } elseif (self::identifierIs($sIdentifier, 'keyframes')) { - $oResult = new KeyFrame($iIdentifierLineNum); - $oResult->setVendorKeyFrame($sIdentifier); - $oResult->setAnimationName(trim($oParserState->consumeUntil('{', false, true))); - CSSList::parseList($oParserState, $oResult); - if ($oParserState->comes('}')) { - $oParserState->consume('}'); - } - return $oResult; - } elseif ($sIdentifier === 'namespace') { - $sPrefix = null; - $mUrl = Value::parsePrimitiveValue($oParserState); - if (!$oParserState->comes(';')) { - $sPrefix = $mUrl; - $mUrl = Value::parsePrimitiveValue($oParserState); - } - $oParserState->consumeUntil([';', ParserState::EOF], true, true); - if ($sPrefix !== null && !is_string($sPrefix)) { - throw new UnexpectedTokenException('Wrong namespace prefix', $sPrefix, 'custom', $iIdentifierLineNum); - } - if (!($mUrl instanceof CSSString || $mUrl instanceof URL)) { - throw new UnexpectedTokenException( - 'Wrong namespace url of invalid type', - $mUrl, - 'custom', - $iIdentifierLineNum - ); - } - return new CSSNamespace($mUrl, $sPrefix, $iIdentifierLineNum); - } else { - // Unknown other at rule (font-face or such) - $sArgs = trim($oParserState->consumeUntil('{', false, true)); - if (substr_count($sArgs, "(") != substr_count($sArgs, ")")) { - if ($oParserState->getSettings()->bLenientParsing) { - return null; - } else { - throw new SourceException("Unmatched brace count in media query", $oParserState->currentLine()); - } - } - $bUseRuleSet = true; - foreach (explode('/', AtRule::BLOCK_RULES) as $sBlockRuleName) { - if (self::identifierIs($sIdentifier, $sBlockRuleName)) { - $bUseRuleSet = false; - break; - } - } - if ($bUseRuleSet) { - $oAtRule = new AtRuleSet($sIdentifier, $sArgs, $iIdentifierLineNum); - RuleSet::parseRuleSet($oParserState, $oAtRule); - } else { - $oAtRule = new AtRuleBlockList($sIdentifier, $sArgs, $iIdentifierLineNum); - CSSList::parseList($oParserState, $oAtRule); - if ($oParserState->comes('}')) { - $oParserState->consume('}'); - } - } - return $oAtRule; - } - } - - /** - * Tests an identifier for a given value. Since identifiers are all keywords, they can be vendor-prefixed. - * We need to check for these versions too. - * - * @param string $sIdentifier - * @param string $sMatch - * - * @return bool - */ - private static function identifierIs($sIdentifier, $sMatch) - { - return (strcasecmp($sIdentifier, $sMatch) === 0) - ?: preg_match("/^(-\\w+-)?$sMatch$/i", $sIdentifier) === 1; - } - - /** - * @return int - */ - public function getLineNo() - { - return $this->iLineNo; - } - - /** - * Prepends an item to the list of contents. - * - * @param RuleSet|CSSList|Import|Charset $oItem - * - * @return void - */ - public function prepend($oItem) - { - array_unshift($this->aContents, $oItem); - } - - /** - * Appends an item to the list of contents. - * - * @param RuleSet|CSSList|Import|Charset $oItem - * - * @return void - */ - public function append($oItem) - { - $this->aContents[] = $oItem; - } - - /** - * Splices the list of contents. - * - * @param int $iOffset - * @param int $iLength - * @param array $mReplacement - * - * @return void - */ - public function splice($iOffset, $iLength = null, $mReplacement = null) - { - array_splice($this->aContents, $iOffset, $iLength, $mReplacement); - } - - /** - * Inserts an item in the CSS list before its sibling. If the desired sibling cannot be found, - * the item is appended at the end. - * - * @param RuleSet|CSSList|Import|Charset $item - * @param RuleSet|CSSList|Import|Charset $sibling - */ - public function insertBefore($item, $sibling) - { - if (in_array($sibling, $this->aContents, true)) { - $this->replace($sibling, [$item, $sibling]); - } else { - $this->append($item); - } - } - - /** - * Removes an item from the CSS list. - * - * @param RuleSet|Import|Charset|CSSList $oItemToRemove - * May be a RuleSet (most likely a DeclarationBlock), a Import, - * a Charset or another CSSList (most likely a MediaQuery) - * - * @return bool whether the item was removed - */ - public function remove($oItemToRemove) - { - $iKey = array_search($oItemToRemove, $this->aContents, true); - if ($iKey !== false) { - unset($this->aContents[$iKey]); - return true; - } - return false; - } - - /** - * Replaces an item from the CSS list. - * - * @param RuleSet|Import|Charset|CSSList $oOldItem - * May be a `RuleSet` (most likely a `DeclarationBlock`), an `Import`, a `Charset` - * or another `CSSList` (most likely a `MediaQuery`) - * - * @return bool - */ - public function replace($oOldItem, $mNewItem) - { - $iKey = array_search($oOldItem, $this->aContents, true); - if ($iKey !== false) { - if (is_array($mNewItem)) { - array_splice($this->aContents, $iKey, 1, $mNewItem); - } else { - array_splice($this->aContents, $iKey, 1, [$mNewItem]); - } - return true; - } - return false; - } - - /** - * @param array $aContents - */ - public function setContents(array $aContents) - { - $this->aContents = []; - foreach ($aContents as $content) { - $this->append($content); - } - } - - /** - * Removes a declaration block from the CSS list if it matches all given selectors. - * - * @param DeclarationBlock|array|string $mSelector the selectors to match - * @param bool $bRemoveAll whether to stop at the first declaration block found or remove all blocks - * - * @return void - */ - public function removeDeclarationBlockBySelector($mSelector, $bRemoveAll = false) - { - if ($mSelector instanceof DeclarationBlock) { - $mSelector = $mSelector->getSelectors(); - } - if (!is_array($mSelector)) { - $mSelector = explode(',', $mSelector); - } - foreach ($mSelector as $iKey => &$mSel) { - if (!($mSel instanceof Selector)) { - if (!Selector::isValid($mSel)) { - throw new UnexpectedTokenException( - "Selector did not match '" . Selector::SELECTOR_VALIDATION_RX . "'.", - $mSel, - "custom" - ); - } - $mSel = new Selector($mSel); - } - } - foreach ($this->aContents as $iKey => $mItem) { - if (!($mItem instanceof DeclarationBlock)) { - continue; - } - if ($mItem->getSelectors() == $mSelector) { - unset($this->aContents[$iKey]); - if (!$bRemoveAll) { - return; - } - } - } - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @return string - */ - protected function renderListContents(OutputFormat $oOutputFormat) - { - $sResult = ''; - $bIsFirst = true; - $oNextLevel = $oOutputFormat; - if (!$this->isRootList()) { - $oNextLevel = $oOutputFormat->nextLevel(); - } - foreach ($this->aContents as $oContent) { - $sRendered = $oOutputFormat->safely(function () use ($oNextLevel, $oContent) { - return $oContent->render($oNextLevel); - }); - if ($sRendered === null) { - continue; - } - if ($bIsFirst) { - $bIsFirst = false; - $sResult .= $oNextLevel->spaceBeforeBlocks(); - } else { - $sResult .= $oNextLevel->spaceBetweenBlocks(); - } - $sResult .= $sRendered; - } - - if (!$bIsFirst) { - // Had some output - $sResult .= $oOutputFormat->spaceAfterBlocks(); - } - - return $sResult; - } - - /** - * Return true if the list can not be further outdented. Only important when rendering. - * - * @return bool - */ - abstract public function isRootList(); - - /** - * Returns the stored items. - * - * @return array - */ - public function getContents() - { - return $this->aContents; - } - - /** - * @param array $aComments - * - * @return void - */ - public function addComments(array $aComments) - { - $this->aComments = array_merge($this->aComments, $aComments); - } - - /** - * @return array - */ - public function getComments() - { - return $this->aComments; - } - - /** - * @param array $aComments - * - * @return void - */ - public function setComments(array $aComments) - { - $this->aComments = $aComments; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/Document.php b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/Document.php deleted file mode 100644 index 7d9c6ec..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/Document.php +++ /dev/null @@ -1,177 +0,0 @@ -currentLine()); - CSSList::parseList($oParserState, $oDocument); - return $oDocument; - } - - /** - * Gets all `DeclarationBlock` objects recursively, no matter how deeply nested the selectors are. - * Aliased as `getAllSelectors()`. - * - * @return array - */ - public function getAllDeclarationBlocks() - { - /** @var array $aResult */ - $aResult = []; - $this->allDeclarationBlocks($aResult); - return $aResult; - } - - /** - * Gets all `DeclarationBlock` objects recursively. - * - * @return array - * - * @deprecated will be removed in version 9.0; use `getAllDeclarationBlocks()` instead - */ - public function getAllSelectors() - { - return $this->getAllDeclarationBlocks(); - } - - /** - * Returns all `RuleSet` objects recursively found in the tree, no matter how deeply nested the rule sets are. - * - * @return array - */ - public function getAllRuleSets() - { - /** @var array $aResult */ - $aResult = []; - $this->allRuleSets($aResult); - return $aResult; - } - - /** - * Returns all `Value` objects found recursively in `Rule`s in the tree. - * - * @param CSSList|RuleSet|string $mElement - * the `CSSList` or `RuleSet` to start the search from (defaults to the whole document). - * If a string is given, it is used as rule name filter. - * @param bool $bSearchInFunctionArguments whether to also return Value objects used as Function arguments. - * - * @return array - * - * @see RuleSet->getRules() - */ - public function getAllValues($mElement = null, $bSearchInFunctionArguments = false) - { - $sSearchString = null; - if ($mElement === null) { - $mElement = $this; - } elseif (is_string($mElement)) { - $sSearchString = $mElement; - $mElement = $this; - } - /** @var array $aResult */ - $aResult = []; - $this->allValues($mElement, $aResult, $sSearchString, $bSearchInFunctionArguments); - return $aResult; - } - - /** - * Returns all `Selector` objects with the requested specificity found recursively in the tree. - * - * Note that this does not yield the full `DeclarationBlock` that the selector belongs to - * (and, currently, there is no way to get to that). - * - * @param string|null $sSpecificitySearch - * An optional filter by specificity. - * May contain a comparison operator and a number or just a number (defaults to "=="). - * - * @return array - * @example `getSelectorsBySpecificity('>= 100')` - * - */ - public function getSelectorsBySpecificity($sSpecificitySearch = null) - { - /** @var array $aResult */ - $aResult = []; - $this->allSelectors($aResult, $sSpecificitySearch); - return $aResult; - } - - /** - * Expands all shorthand properties to their long value. - * - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function expandShorthands() - { - foreach ($this->getAllDeclarationBlocks() as $oDeclaration) { - $oDeclaration->expandShorthands(); - } - } - - /** - * Create shorthands properties whenever possible. - * - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function createShorthands() - { - foreach ($this->getAllDeclarationBlocks() as $oDeclaration) { - $oDeclaration->createShorthands(); - } - } - - /** - * Overrides `render()` to make format argument optional. - * - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat = null) - { - if ($oOutputFormat === null) { - $oOutputFormat = new OutputFormat(); - } - return $oOutputFormat->comments($this) . $this->renderListContents($oOutputFormat); - } - - /** - * @return bool - */ - public function isRootList() - { - return true; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/KeyFrame.php b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/KeyFrame.php deleted file mode 100644 index 69e2e4d..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/KeyFrame.php +++ /dev/null @@ -1,107 +0,0 @@ -vendorKeyFrame = null; - $this->animationName = null; - } - - /** - * @param string $vendorKeyFrame - */ - public function setVendorKeyFrame($vendorKeyFrame) - { - $this->vendorKeyFrame = $vendorKeyFrame; - } - - /** - * @return string|null - */ - public function getVendorKeyFrame() - { - return $this->vendorKeyFrame; - } - - /** - * @param string $animationName - */ - public function setAnimationName($animationName) - { - $this->animationName = $animationName; - } - - /** - * @return string|null - */ - public function getAnimationName() - { - return $this->animationName; - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - $sResult = $oOutputFormat->comments($this); - $sResult .= "@{$this->vendorKeyFrame} {$this->animationName}{$oOutputFormat->spaceBeforeOpeningBrace()}{"; - $sResult .= $this->renderListContents($oOutputFormat); - $sResult .= '}'; - return $sResult; - } - - /** - * @return bool - */ - public function isRootList() - { - return false; - } - - /** - * @return string|null - */ - public function atRuleName() - { - return $this->vendorKeyFrame; - } - - /** - * @return string|null - */ - public function atRuleArgs() - { - return $this->animationName; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Comment/Comment.php b/dompdf/vendor/sabberworm/php-css-parser/src/Comment/Comment.php deleted file mode 100644 index e6ffaaf..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Comment/Comment.php +++ /dev/null @@ -1,73 +0,0 @@ -sComment = $sComment; - $this->iLineNo = $iLineNo; - } - - /** - * @return string - */ - public function getComment() - { - return $this->sComment; - } - - /** - * @return int - */ - public function getLineNo() - { - return $this->iLineNo; - } - - /** - * @param string $sComment - * - * @return void - */ - public function setComment($sComment) - { - $this->sComment = $sComment; - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - return '/*' . $this->sComment . '*/'; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Comment/Commentable.php b/dompdf/vendor/sabberworm/php-css-parser/src/Comment/Commentable.php deleted file mode 100644 index 5e450bf..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Comment/Commentable.php +++ /dev/null @@ -1,25 +0,0 @@ - $aComments - * - * @return void - */ - public function addComments(array $aComments); - - /** - * @return array - */ - public function getComments(); - - /** - * @param array $aComments - * - * @return void - */ - public function setComments(array $aComments); -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/OutputFormat.php b/dompdf/vendor/sabberworm/php-css-parser/src/OutputFormat.php deleted file mode 100644 index 96f26e1..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/OutputFormat.php +++ /dev/null @@ -1,348 +0,0 @@ -set('Space*Rules', "\n");`) - */ - public $sSpaceAfterRuleName = ' '; - - /** - * @var string - */ - public $sSpaceBeforeRules = ''; - - /** - * @var string - */ - public $sSpaceAfterRules = ''; - - /** - * @var string - */ - public $sSpaceBetweenRules = ''; - - /** - * @var string - */ - public $sSpaceBeforeBlocks = ''; - - /** - * @var string - */ - public $sSpaceAfterBlocks = ''; - - /** - * @var string - */ - public $sSpaceBetweenBlocks = "\n"; - - /** - * Content injected in and around at-rule blocks. - * - * @var string - */ - public $sBeforeAtRuleBlock = ''; - - /** - * @var string - */ - public $sAfterAtRuleBlock = ''; - - /** - * This is what’s printed before and after the comma if a declaration block contains multiple selectors. - * - * @var string - */ - public $sSpaceBeforeSelectorSeparator = ''; - - /** - * @var string - */ - public $sSpaceAfterSelectorSeparator = ' '; - - /** - * This is what’s printed after the comma of value lists - * - * @var string - */ - public $sSpaceBeforeListArgumentSeparator = ''; - - /** - * @var string - */ - public $sSpaceAfterListArgumentSeparator = ''; - - /** - * @var string - */ - public $sSpaceBeforeOpeningBrace = ' '; - - /** - * Content injected in and around declaration blocks. - * - * @var string - */ - public $sBeforeDeclarationBlock = ''; - - /** - * @var string - */ - public $sAfterDeclarationBlockSelectors = ''; - - /** - * @var string - */ - public $sAfterDeclarationBlock = ''; - - /** - * Indentation character(s) per level. Only applicable if newlines are used in any of the spacing settings. - * - * @var string - */ - public $sIndentation = "\t"; - - /** - * Output exceptions. - * - * @var bool - */ - public $bIgnoreExceptions = false; - - /** - * Render comments for lists and RuleSets - * - * @var bool - */ - public $bRenderComments = false; - - /** - * @var OutputFormatter|null - */ - private $oFormatter = null; - - /** - * @var OutputFormat|null - */ - private $oNextLevelFormat = null; - - /** - * @var int - */ - private $iIndentationLevel = 0; - - public function __construct() - { - } - - /** - * @param string $sName - * - * @return string|null - */ - public function get($sName) - { - $aVarPrefixes = ['a', 's', 'm', 'b', 'f', 'o', 'c', 'i']; - foreach ($aVarPrefixes as $sPrefix) { - $sFieldName = $sPrefix . ucfirst($sName); - if (isset($this->$sFieldName)) { - return $this->$sFieldName; - } - } - return null; - } - - /** - * @param array|string $aNames - * @param mixed $mValue - * - * @return self|false - */ - public function set($aNames, $mValue) - { - $aVarPrefixes = ['a', 's', 'm', 'b', 'f', 'o', 'c', 'i']; - if (is_string($aNames) && strpos($aNames, '*') !== false) { - $aNames = - [ - str_replace('*', 'Before', $aNames), - str_replace('*', 'Between', $aNames), - str_replace('*', 'After', $aNames), - ]; - } elseif (!is_array($aNames)) { - $aNames = [$aNames]; - } - foreach ($aVarPrefixes as $sPrefix) { - $bDidReplace = false; - foreach ($aNames as $sName) { - $sFieldName = $sPrefix . ucfirst($sName); - if (isset($this->$sFieldName)) { - $this->$sFieldName = $mValue; - $bDidReplace = true; - } - } - if ($bDidReplace) { - return $this; - } - } - // Break the chain so the user knows this option is invalid - return false; - } - - /** - * @param string $sMethodName - * @param array $aArguments - * - * @return mixed - * - * @throws \Exception - */ - public function __call($sMethodName, array $aArguments) - { - if (strpos($sMethodName, 'set') === 0) { - return $this->set(substr($sMethodName, 3), $aArguments[0]); - } elseif (strpos($sMethodName, 'get') === 0) { - return $this->get(substr($sMethodName, 3)); - } elseif (method_exists(OutputFormatter::class, $sMethodName)) { - return call_user_func_array([$this->getFormatter(), $sMethodName], $aArguments); - } else { - throw new \Exception('Unknown OutputFormat method called: ' . $sMethodName); - } - } - - /** - * @param int $iNumber - * - * @return self - */ - public function indentWithTabs($iNumber = 1) - { - return $this->setIndentation(str_repeat("\t", $iNumber)); - } - - /** - * @param int $iNumber - * - * @return self - */ - public function indentWithSpaces($iNumber = 2) - { - return $this->setIndentation(str_repeat(" ", $iNumber)); - } - - /** - * @return OutputFormat - */ - public function nextLevel() - { - if ($this->oNextLevelFormat === null) { - $this->oNextLevelFormat = clone $this; - $this->oNextLevelFormat->iIndentationLevel++; - $this->oNextLevelFormat->oFormatter = null; - } - return $this->oNextLevelFormat; - } - - /** - * @return void - */ - public function beLenient() - { - $this->bIgnoreExceptions = true; - } - - /** - * @return OutputFormatter - */ - public function getFormatter() - { - if ($this->oFormatter === null) { - $this->oFormatter = new OutputFormatter($this); - } - return $this->oFormatter; - } - - /** - * @return int - */ - public function level() - { - return $this->iIndentationLevel; - } - - /** - * Creates an instance of this class without any particular formatting settings. - * - * @return self - */ - public static function create() - { - return new OutputFormat(); - } - - /** - * Creates an instance of this class with a preset for compact formatting. - * - * @return self - */ - public static function createCompact() - { - $format = self::create(); - $format->set('Space*Rules', "") - ->set('Space*Blocks', "") - ->setSpaceAfterRuleName('') - ->setSpaceBeforeOpeningBrace('') - ->setSpaceAfterSelectorSeparator('') - ->setRenderComments(false); - return $format; - } - - /** - * Creates an instance of this class with a preset for pretty formatting. - * - * @return self - */ - public static function createPretty() - { - $format = self::create(); - $format->set('Space*Rules', "\n") - ->set('Space*Blocks', "\n") - ->setSpaceBetweenBlocks("\n\n") - ->set('SpaceAfterListArgumentSeparator', ['default' => '', ',' => ' ']) - ->setRenderComments(true); - return $format; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/OutputFormatter.php b/dompdf/vendor/sabberworm/php-css-parser/src/OutputFormatter.php deleted file mode 100644 index 501d15d..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/OutputFormatter.php +++ /dev/null @@ -1,255 +0,0 @@ -oFormat = $oFormat; - } - - /** - * @param string $sName - * @param string|null $sType - * - * @return string - */ - public function space($sName, $sType = null) - { - $sSpaceString = $this->oFormat->get("Space$sName"); - // If $sSpaceString is an array, we have multiple values configured - // depending on the type of object the space applies to - if (is_array($sSpaceString)) { - if ($sType !== null && isset($sSpaceString[$sType])) { - $sSpaceString = $sSpaceString[$sType]; - } else { - $sSpaceString = reset($sSpaceString); - } - } - return $this->prepareSpace($sSpaceString); - } - - /** - * @return string - */ - public function spaceAfterRuleName() - { - return $this->space('AfterRuleName'); - } - - /** - * @return string - */ - public function spaceBeforeRules() - { - return $this->space('BeforeRules'); - } - - /** - * @return string - */ - public function spaceAfterRules() - { - return $this->space('AfterRules'); - } - - /** - * @return string - */ - public function spaceBetweenRules() - { - return $this->space('BetweenRules'); - } - - /** - * @return string - */ - public function spaceBeforeBlocks() - { - return $this->space('BeforeBlocks'); - } - - /** - * @return string - */ - public function spaceAfterBlocks() - { - return $this->space('AfterBlocks'); - } - - /** - * @return string - */ - public function spaceBetweenBlocks() - { - return $this->space('BetweenBlocks'); - } - - /** - * @return string - */ - public function spaceBeforeSelectorSeparator() - { - return $this->space('BeforeSelectorSeparator'); - } - - /** - * @return string - */ - public function spaceAfterSelectorSeparator() - { - return $this->space('AfterSelectorSeparator'); - } - - /** - * @param string $sSeparator - * - * @return string - */ - public function spaceBeforeListArgumentSeparator($sSeparator) - { - return $this->space('BeforeListArgumentSeparator', $sSeparator); - } - - /** - * @param string $sSeparator - * - * @return string - */ - public function spaceAfterListArgumentSeparator($sSeparator) - { - return $this->space('AfterListArgumentSeparator', $sSeparator); - } - - /** - * @return string - */ - public function spaceBeforeOpeningBrace() - { - return $this->space('BeforeOpeningBrace'); - } - - /** - * Runs the given code, either swallowing or passing exceptions, depending on the `bIgnoreExceptions` setting. - * - * @param string $cCode the name of the function to call - * - * @return string|null - */ - public function safely($cCode) - { - if ($this->oFormat->get('IgnoreExceptions')) { - // If output exceptions are ignored, run the code with exception guards - try { - return $cCode(); - } catch (OutputException $e) { - return null; - } // Do nothing - } else { - // Run the code as-is - return $cCode(); - } - } - - /** - * Clone of the `implode` function, but calls `render` with the current output format instead of `__toString()`. - * - * @param string $sSeparator - * @param array $aValues - * @param bool $bIncreaseLevel - * - * @return string - */ - public function implode($sSeparator, array $aValues, $bIncreaseLevel = false) - { - $sResult = ''; - $oFormat = $this->oFormat; - if ($bIncreaseLevel) { - $oFormat = $oFormat->nextLevel(); - } - $bIsFirst = true; - foreach ($aValues as $mValue) { - if ($bIsFirst) { - $bIsFirst = false; - } else { - $sResult .= $sSeparator; - } - if ($mValue instanceof Renderable) { - $sResult .= $mValue->render($oFormat); - } else { - $sResult .= $mValue; - } - } - return $sResult; - } - - /** - * @param string $sString - * - * @return string - */ - public function removeLastSemicolon($sString) - { - if ($this->oFormat->get('SemicolonAfterLastRule')) { - return $sString; - } - $sString = explode(';', $sString); - if (count($sString) < 2) { - return $sString[0]; - } - $sLast = array_pop($sString); - $sNextToLast = array_pop($sString); - array_push($sString, $sNextToLast . $sLast); - return implode(';', $sString); - } - - /** - * - * @param array $aComments - * - * @return string - */ - public function comments(Commentable $oCommentable) - { - if (!$this->oFormat->bRenderComments) { - return ''; - } - - $sResult = ''; - $aComments = $oCommentable->getComments(); - $iLastCommentIndex = count($aComments) - 1; - - foreach ($aComments as $i => $oComment) { - $sResult .= $oComment->render($this->oFormat); - $sResult .= $i === $iLastCommentIndex ? $this->spaceAfterBlocks() : $this->spaceBetweenBlocks(); - } - return $sResult; - } - - /** - * @param string $sSpaceString - * - * @return string - */ - private function prepareSpace($sSpaceString) - { - return str_replace("\n", "\n" . $this->indent(), $sSpaceString); - } - - /** - * @return string - */ - private function indent() - { - return str_repeat($this->oFormat->sIndentation, $this->oFormat->level()); - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Parser.php b/dompdf/vendor/sabberworm/php-css-parser/src/Parser.php deleted file mode 100644 index f60fc08..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Parser.php +++ /dev/null @@ -1,70 +0,0 @@ -oParserState = new ParserState($sText, $oParserSettings, $iLineNo); - } - - /** - * Sets the charset to be used if the CSS does not contain an `@charset` declaration. - * - * @param string $sCharset - * - * @return void - * - * @deprecated since 8.7.0, will be removed in version 9.0.0 with #687 - */ - public function setCharset($sCharset) - { - $this->oParserState->setCharset($sCharset); - } - - /** - * Returns the charset that is used if the CSS does not contain an `@charset` declaration. - * - * @return void - * - * @deprecated since 8.7.0, will be removed in version 9.0.0 with #687 - */ - public function getCharset() - { - // Note: The `return` statement is missing here. This is a bug that needs to be fixed. - $this->oParserState->getCharset(); - } - - /** - * Parses the CSS provided to the constructor and creates a `Document` from it. - * - * @return Document - * - * @throws SourceException - */ - public function parse() - { - return Document::parse($this->oParserState); - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/Anchor.php b/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/Anchor.php deleted file mode 100644 index a42893d..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/Anchor.php +++ /dev/null @@ -1,37 +0,0 @@ -iPosition = $iPosition; - $this->oParserState = $oParserState; - } - - /** - * @return void - */ - public function backtrack() - { - $this->oParserState->setPosition($this->iPosition); - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/OutputException.php b/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/OutputException.php deleted file mode 100644 index 9bfbc75..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/OutputException.php +++ /dev/null @@ -1,18 +0,0 @@ - - */ - private $aText; - - /** - * @var int - */ - private $iCurrentPosition; - - /** - * will only be used if the CSS does not contain an `@charset` declaration - * - * @var string - */ - private $sCharset; - - /** - * @var int - */ - private $iLength; - - /** - * @var int - */ - private $iLineNo; - - /** - * @param string $sText the complete CSS as text (i.e., usually the contents of a CSS file) - * @param int $iLineNo - */ - public function __construct($sText, Settings $oParserSettings, $iLineNo = 1) - { - $this->oParserSettings = $oParserSettings; - $this->sText = $sText; - $this->iCurrentPosition = 0; - $this->iLineNo = $iLineNo; - $this->setCharset($this->oParserSettings->sDefaultCharset); - } - - /** - * Sets the charset to be used if the CSS does not contain an `@charset` declaration. - * - * @param string $sCharset - * - * @return void - */ - public function setCharset($sCharset) - { - $this->sCharset = $sCharset; - $this->aText = $this->strsplit($this->sText); - if (is_array($this->aText)) { - $this->iLength = count($this->aText); - } - } - - /** - * Returns the charset that is used if the CSS does not contain an `@charset` declaration. - * - * @return string - */ - public function getCharset() - { - return $this->sCharset; - } - - /** - * @return int - */ - public function currentLine() - { - return $this->iLineNo; - } - - /** - * @return int - */ - public function currentColumn() - { - return $this->iCurrentPosition; - } - - /** - * @return Settings - */ - public function getSettings() - { - return $this->oParserSettings; - } - - /** - * @return \Sabberworm\CSS\Parsing\Anchor - */ - public function anchor() - { - return new Anchor($this->iCurrentPosition, $this); - } - - /** - * @param int $iPosition - * - * @return void - */ - public function setPosition($iPosition) - { - $this->iCurrentPosition = $iPosition; - } - - /** - * @param bool $bIgnoreCase - * - * @return string - * - * @throws UnexpectedTokenException - */ - public function parseIdentifier($bIgnoreCase = true) - { - if ($this->isEnd()) { - throw new UnexpectedEOFException('', '', 'identifier', $this->iLineNo); - } - $sResult = $this->parseCharacter(true); - if ($sResult === null) { - throw new UnexpectedTokenException($sResult, $this->peek(5), 'identifier', $this->iLineNo); - } - $sCharacter = null; - while (!$this->isEnd() && ($sCharacter = $this->parseCharacter(true)) !== null) { - if (preg_match('/[a-zA-Z0-9\x{00A0}-\x{FFFF}_-]/Sux', $sCharacter)) { - $sResult .= $sCharacter; - } else { - $sResult .= '\\' . $sCharacter; - } - } - if ($bIgnoreCase) { - $sResult = $this->strtolower($sResult); - } - return $sResult; - } - - /** - * @param bool $bIsForIdentifier - * - * @return string|null - * - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - public function parseCharacter($bIsForIdentifier) - { - if ($this->peek() === '\\') { - if ( - $bIsForIdentifier && $this->oParserSettings->bLenientParsing - && ($this->comes('\0') || $this->comes('\9')) - ) { - // Non-strings can contain \0 or \9 which is an IE hack supported in lenient parsing. - return null; - } - $this->consume('\\'); - if ($this->comes('\n') || $this->comes('\r')) { - return ''; - } - if (preg_match('/[0-9a-fA-F]/Su', $this->peek()) === 0) { - return $this->consume(1); - } - $sUnicode = $this->consumeExpression('/^[0-9a-fA-F]{1,6}/u', 6); - if ($this->strlen($sUnicode) < 6) { - // Consume whitespace after incomplete unicode escape - if (preg_match('/\\s/isSu', $this->peek())) { - if ($this->comes('\r\n')) { - $this->consume(2); - } else { - $this->consume(1); - } - } - } - $iUnicode = intval($sUnicode, 16); - $sUtf32 = ""; - for ($i = 0; $i < 4; ++$i) { - $sUtf32 .= chr($iUnicode & 0xff); - $iUnicode = $iUnicode >> 8; - } - return iconv('utf-32le', $this->sCharset, $sUtf32); - } - if ($bIsForIdentifier) { - $peek = ord($this->peek()); - // Ranges: a-z A-Z 0-9 - _ - if ( - ($peek >= 97 && $peek <= 122) - || ($peek >= 65 && $peek <= 90) - || ($peek >= 48 && $peek <= 57) - || ($peek === 45) - || ($peek === 95) - || ($peek > 0xa1) - ) { - return $this->consume(1); - } - } else { - return $this->consume(1); - } - return null; - } - - /** - * @return array|void - * - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - public function consumeWhiteSpace() - { - $aComments = []; - do { - while (preg_match('/\\s/isSu', $this->peek()) === 1) { - $this->consume(1); - } - if ($this->oParserSettings->bLenientParsing) { - try { - $oComment = $this->consumeComment(); - } catch (UnexpectedEOFException $e) { - $this->iCurrentPosition = $this->iLength; - return $aComments; - } - } else { - $oComment = $this->consumeComment(); - } - if ($oComment !== false) { - $aComments[] = $oComment; - } - } while ($oComment !== false); - return $aComments; - } - - /** - * @param string $sString - * @param bool $bCaseInsensitive - * - * @return bool - */ - public function comes($sString, $bCaseInsensitive = false) - { - $sPeek = $this->peek(strlen($sString)); - return ($sPeek == '') - ? false - : $this->streql($sPeek, $sString, $bCaseInsensitive); - } - - /** - * @param int $iLength - * @param int $iOffset - * - * @return string - */ - public function peek($iLength = 1, $iOffset = 0) - { - $iOffset += $this->iCurrentPosition; - if ($iOffset >= $this->iLength) { - return ''; - } - return $this->substr($iOffset, $iLength); - } - - /** - * @param int $mValue - * - * @return string - * - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - public function consume($mValue = 1) - { - if (is_string($mValue)) { - $iLineCount = substr_count($mValue, "\n"); - $iLength = $this->strlen($mValue); - if (!$this->streql($this->substr($this->iCurrentPosition, $iLength), $mValue)) { - throw new UnexpectedTokenException($mValue, $this->peek(max($iLength, 5)), $this->iLineNo); - } - $this->iLineNo += $iLineCount; - $this->iCurrentPosition += $this->strlen($mValue); - return $mValue; - } else { - if ($this->iCurrentPosition + $mValue > $this->iLength) { - throw new UnexpectedEOFException($mValue, $this->peek(5), 'count', $this->iLineNo); - } - $sResult = $this->substr($this->iCurrentPosition, $mValue); - $iLineCount = substr_count($sResult, "\n"); - $this->iLineNo += $iLineCount; - $this->iCurrentPosition += $mValue; - return $sResult; - } - } - - /** - * @param string $mExpression - * @param int|null $iMaxLength - * - * @return string - * - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - public function consumeExpression($mExpression, $iMaxLength = null) - { - $aMatches = null; - $sInput = $iMaxLength !== null ? $this->peek($iMaxLength) : $this->inputLeft(); - if (preg_match($mExpression, $sInput, $aMatches, PREG_OFFSET_CAPTURE) === 1) { - return $this->consume($aMatches[0][0]); - } - throw new UnexpectedTokenException($mExpression, $this->peek(5), 'expression', $this->iLineNo); - } - - /** - * @return Comment|false - */ - public function consumeComment() - { - $mComment = false; - if ($this->comes('/*')) { - $iLineNo = $this->iLineNo; - $this->consume(1); - $mComment = ''; - while (($char = $this->consume(1)) !== '') { - $mComment .= $char; - if ($this->comes('*/')) { - $this->consume(2); - break; - } - } - } - - if ($mComment !== false) { - // We skip the * which was included in the comment. - return new Comment(substr($mComment, 1), $iLineNo); - } - - return $mComment; - } - - /** - * @return bool - */ - public function isEnd() - { - return $this->iCurrentPosition >= $this->iLength; - } - - /** - * @param array|string $aEnd - * @param string $bIncludeEnd - * @param string $consumeEnd - * @param array $comments - * - * @return string - * - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - public function consumeUntil($aEnd, $bIncludeEnd = false, $consumeEnd = false, array &$comments = []) - { - $aEnd = is_array($aEnd) ? $aEnd : [$aEnd]; - $out = ''; - $start = $this->iCurrentPosition; - - while (!$this->isEnd()) { - $char = $this->consume(1); - if (in_array($char, $aEnd)) { - if ($bIncludeEnd) { - $out .= $char; - } elseif (!$consumeEnd) { - $this->iCurrentPosition -= $this->strlen($char); - } - return $out; - } - $out .= $char; - if ($comment = $this->consumeComment()) { - $comments[] = $comment; - } - } - - if (in_array(self::EOF, $aEnd)) { - return $out; - } - - $this->iCurrentPosition = $start; - throw new UnexpectedEOFException( - 'One of ("' . implode('","', $aEnd) . '")', - $this->peek(5), - 'search', - $this->iLineNo - ); - } - - /** - * @return string - */ - private function inputLeft() - { - return $this->substr($this->iCurrentPosition, -1); - } - - /** - * @param string $sString1 - * @param string $sString2 - * @param bool $bCaseInsensitive - * - * @return bool - */ - public function streql($sString1, $sString2, $bCaseInsensitive = true) - { - if ($bCaseInsensitive) { - return $this->strtolower($sString1) === $this->strtolower($sString2); - } else { - return $sString1 === $sString2; - } - } - - /** - * @param int $iAmount - * - * @return void - */ - public function backtrack($iAmount) - { - $this->iCurrentPosition -= $iAmount; - } - - /** - * @param string $sString - * - * @return int - */ - public function strlen($sString) - { - if ($this->oParserSettings->bMultibyteSupport) { - return mb_strlen($sString, $this->sCharset); - } else { - return strlen($sString); - } - } - - /** - * @param int $iStart - * @param int $iLength - * - * @return string - */ - private function substr($iStart, $iLength) - { - if ($iLength < 0) { - $iLength = $this->iLength - $iStart + $iLength; - } - if ($iStart + $iLength > $this->iLength) { - $iLength = $this->iLength - $iStart; - } - $sResult = ''; - while ($iLength > 0) { - $sResult .= $this->aText[$iStart]; - $iStart++; - $iLength--; - } - return $sResult; - } - - /** - * @param string $sString - * - * @return string - */ - private function strtolower($sString) - { - if ($this->oParserSettings->bMultibyteSupport) { - return mb_strtolower($sString, $this->sCharset); - } else { - return strtolower($sString); - } - } - - /** - * @param string $sString - * - * @return array - */ - private function strsplit($sString) - { - if ($this->oParserSettings->bMultibyteSupport) { - if ($this->streql($this->sCharset, 'utf-8')) { - return preg_split('//u', $sString, -1, PREG_SPLIT_NO_EMPTY); - } else { - $iLength = mb_strlen($sString, $this->sCharset); - $aResult = []; - for ($i = 0; $i < $iLength; ++$i) { - $aResult[] = mb_substr($sString, $i, 1, $this->sCharset); - } - return $aResult; - } - } else { - if ($sString === '') { - return []; - } else { - return str_split($sString); - } - } - } - - /** - * @param string $sString - * @param string $sNeedle - * @param int $iOffset - * - * @return int|false - */ - private function strpos($sString, $sNeedle, $iOffset) - { - if ($this->oParserSettings->bMultibyteSupport) { - return mb_strpos($sString, $sNeedle, $iOffset, $this->sCharset); - } else { - return strpos($sString, $sNeedle, $iOffset); - } - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/SourceException.php b/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/SourceException.php deleted file mode 100644 index 1ca668a..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/SourceException.php +++ /dev/null @@ -1,32 +0,0 @@ -iLineNo = $iLineNo; - if (!empty($iLineNo)) { - $sMessage .= " [line no: $iLineNo]"; - } - parent::__construct($sMessage); - } - - /** - * @return int - */ - public function getLineNo() - { - return $this->iLineNo; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/UnexpectedEOFException.php b/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/UnexpectedEOFException.php deleted file mode 100644 index 368ec70..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/UnexpectedEOFException.php +++ /dev/null @@ -1,12 +0,0 @@ -sExpected = $sExpected; - $this->sFound = $sFound; - $this->sMatchType = $sMatchType; - $sMessage = "Token “{$sExpected}” ({$sMatchType}) not found. Got “{$sFound}”."; - if ($this->sMatchType === 'search') { - $sMessage = "Search for “{$sExpected}” returned no results. Context: “{$sFound}”."; - } elseif ($this->sMatchType === 'count') { - $sMessage = "Next token was expected to have {$sExpected} chars. Context: “{$sFound}”."; - } elseif ($this->sMatchType === 'identifier') { - $sMessage = "Identifier expected. Got “{$sFound}”"; - } elseif ($this->sMatchType === 'custom') { - $sMessage = trim("$sExpected $sFound"); - } - - parent::__construct($sMessage, $iLineNo); - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Property/AtRule.php b/dompdf/vendor/sabberworm/php-css-parser/src/Property/AtRule.php deleted file mode 100644 index d946a90..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Property/AtRule.php +++ /dev/null @@ -1,38 +0,0 @@ - - */ - protected $aComments; - - /** - * @param string $mUrl - * @param string|null $sPrefix - * @param int $iLineNo - */ - public function __construct($mUrl, $sPrefix = null, $iLineNo = 0) - { - $this->mUrl = $mUrl; - $this->sPrefix = $sPrefix; - $this->iLineNo = $iLineNo; - $this->aComments = []; - } - - /** - * @return int - */ - public function getLineNo() - { - return $this->iLineNo; - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - return '@namespace ' . ($this->sPrefix === null ? '' : $this->sPrefix . ' ') - . $this->mUrl->render($oOutputFormat) . ';'; - } - - /** - * @return string - */ - public function getUrl() - { - return $this->mUrl; - } - - /** - * @return string|null - */ - public function getPrefix() - { - return $this->sPrefix; - } - - /** - * @param string $mUrl - * - * @return void - */ - public function setUrl($mUrl) - { - $this->mUrl = $mUrl; - } - - /** - * @param string $sPrefix - * - * @return void - */ - public function setPrefix($sPrefix) - { - $this->sPrefix = $sPrefix; - } - - /** - * @return string - */ - public function atRuleName() - { - return 'namespace'; - } - - /** - * @return array - */ - public function atRuleArgs() - { - $aResult = [$this->mUrl]; - if ($this->sPrefix) { - array_unshift($aResult, $this->sPrefix); - } - return $aResult; - } - - /** - * @param array $aComments - * - * @return void - */ - public function addComments(array $aComments) - { - $this->aComments = array_merge($this->aComments, $aComments); - } - - /** - * @return array - */ - public function getComments() - { - return $this->aComments; - } - - /** - * @param array $aComments - * - * @return void - */ - public function setComments(array $aComments) - { - $this->aComments = $aComments; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Property/Charset.php b/dompdf/vendor/sabberworm/php-css-parser/src/Property/Charset.php deleted file mode 100644 index 870380e..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Property/Charset.php +++ /dev/null @@ -1,133 +0,0 @@ - - */ - protected $aComments; - - /** - * @param CSSString $oCharset - * @param int $iLineNo - */ - public function __construct(CSSString $oCharset, $iLineNo = 0) - { - $this->oCharset = $oCharset; - $this->iLineNo = $iLineNo; - $this->aComments = []; - } - - /** - * @return int - */ - public function getLineNo() - { - return $this->iLineNo; - } - - /** - * @param string|CSSString $oCharset - * - * @return void - */ - public function setCharset($sCharset) - { - $sCharset = $sCharset instanceof CSSString ? $sCharset : new CSSString($sCharset); - $this->oCharset = $sCharset; - } - - /** - * @return string - */ - public function getCharset() - { - return $this->oCharset->getString(); - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - return "{$oOutputFormat->comments($this)}@charset {$this->oCharset->render($oOutputFormat)};"; - } - - /** - * @return string - */ - public function atRuleName() - { - return 'charset'; - } - - /** - * @return string - */ - public function atRuleArgs() - { - return $this->oCharset; - } - - /** - * @param array $aComments - * - * @return void - */ - public function addComments(array $aComments) - { - $this->aComments = array_merge($this->aComments, $aComments); - } - - /** - * @return array - */ - public function getComments() - { - return $this->aComments; - } - - /** - * @param array $aComments - * - * @return void - */ - public function setComments(array $aComments) - { - $this->aComments = $aComments; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Property/Import.php b/dompdf/vendor/sabberworm/php-css-parser/src/Property/Import.php deleted file mode 100644 index 2a7cad5..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Property/Import.php +++ /dev/null @@ -1,147 +0,0 @@ - - */ - protected $aComments; - - /** - * @param URL $oLocation - * @param string $sMediaQuery - * @param int $iLineNo - */ - public function __construct(URL $oLocation, $sMediaQuery, $iLineNo = 0) - { - $this->oLocation = $oLocation; - $this->sMediaQuery = $sMediaQuery; - $this->iLineNo = $iLineNo; - $this->aComments = []; - } - - /** - * @return int - */ - public function getLineNo() - { - return $this->iLineNo; - } - - /** - * @param URL $oLocation - * - * @return void - */ - public function setLocation($oLocation) - { - $this->oLocation = $oLocation; - } - - /** - * @return URL - */ - public function getLocation() - { - return $this->oLocation; - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - return $oOutputFormat->comments($this) . "@import " . $this->oLocation->render($oOutputFormat) - . ($this->sMediaQuery === null ? '' : ' ' . $this->sMediaQuery) . ';'; - } - - /** - * @return string - */ - public function atRuleName() - { - return 'import'; - } - - /** - * @return array - */ - public function atRuleArgs() - { - $aResult = [$this->oLocation]; - if ($this->sMediaQuery) { - array_push($aResult, $this->sMediaQuery); - } - return $aResult; - } - - /** - * @param array $aComments - * - * @return void - */ - public function addComments(array $aComments) - { - $this->aComments = array_merge($this->aComments, $aComments); - } - - /** - * @return array - */ - public function getComments() - { - return $this->aComments; - } - - /** - * @param array $aComments - * - * @return void - */ - public function setComments(array $aComments) - { - $this->aComments = $aComments; - } - - /** - * @return string - */ - public function getMediaQuery() - { - return $this->sMediaQuery; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Property/KeyframeSelector.php b/dompdf/vendor/sabberworm/php-css-parser/src/Property/KeyframeSelector.php deleted file mode 100644 index 2aff8d2..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Property/KeyframeSelector.php +++ /dev/null @@ -1,25 +0,0 @@ -]* # any sequence of valid unescaped characters - (?:\\\\.)? # a single escaped character - (?:([\'"]).*?(?\~]+)[\w]+ # elements - | - \:{1,2}( # pseudo-elements - after|before|first-letter|first-line|selection - )) - /ix'; - - /** - * regexp for specificity calculations - * - * @var string - * - * @internal since 8.5.2 - */ - const SELECTOR_VALIDATION_RX = '/ - ^( - (?: - [a-zA-Z0-9\x{00A0}-\x{FFFF}_^$|*="\'~\[\]()\-\s\.:#+>]* # any sequence of valid unescaped characters - (?:\\\\.)? # a single escaped character - (?:([\'"]).*?(?setSelector($sSelector); - if ($bCalculateSpecificity) { - $this->getSpecificity(); - } - } - - /** - * @return string - */ - public function getSelector() - { - return $this->sSelector; - } - - /** - * @param string $sSelector - * - * @return void - */ - public function setSelector($sSelector) - { - $this->sSelector = trim($sSelector); - $this->iSpecificity = null; - } - - /** - * @return string - */ - public function __toString() - { - return $this->getSelector(); - } - - /** - * @return int - */ - public function getSpecificity() - { - if ($this->iSpecificity === null) { - $a = 0; - /// @todo should exclude \# as well as "#" - $aMatches = null; - $b = substr_count($this->sSelector, '#'); - $c = preg_match_all(self::NON_ID_ATTRIBUTES_AND_PSEUDO_CLASSES_RX, $this->sSelector, $aMatches); - $d = preg_match_all(self::ELEMENTS_AND_PSEUDO_ELEMENTS_RX, $this->sSelector, $aMatches); - $this->iSpecificity = ($a * 1000) + ($b * 100) + ($c * 10) + $d; - } - return $this->iSpecificity; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Renderable.php b/dompdf/vendor/sabberworm/php-css-parser/src/Renderable.php deleted file mode 100644 index d7c6aba..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Renderable.php +++ /dev/null @@ -1,23 +0,0 @@ - - */ - private $aIeHack; - - /** - * @var int - */ - protected $iLineNo; - - /** - * @var int - */ - protected $iColNo; - - /** - * @var array - */ - protected $aComments; - - /** - * @param string $sRule - * @param int $iLineNo - * @param int $iColNo - */ - public function __construct($sRule, $iLineNo = 0, $iColNo = 0) - { - $this->sRule = $sRule; - $this->mValue = null; - $this->bIsImportant = false; - $this->aIeHack = []; - $this->iLineNo = $iLineNo; - $this->iColNo = $iColNo; - $this->aComments = []; - } - - /** - * @return Rule - * - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - public static function parse(ParserState $oParserState) - { - $aComments = $oParserState->consumeWhiteSpace(); - $oRule = new Rule( - $oParserState->parseIdentifier(!$oParserState->comes("--")), - $oParserState->currentLine(), - $oParserState->currentColumn() - ); - $oRule->setComments($aComments); - $oRule->addComments($oParserState->consumeWhiteSpace()); - $oParserState->consume(':'); - $oValue = Value::parseValue($oParserState, self::listDelimiterForRule($oRule->getRule())); - $oRule->setValue($oValue); - if ($oParserState->getSettings()->bLenientParsing) { - while ($oParserState->comes('\\')) { - $oParserState->consume('\\'); - $oRule->addIeHack($oParserState->consume()); - $oParserState->consumeWhiteSpace(); - } - } - $oParserState->consumeWhiteSpace(); - if ($oParserState->comes('!')) { - $oParserState->consume('!'); - $oParserState->consumeWhiteSpace(); - $oParserState->consume('important'); - $oRule->setIsImportant(true); - } - $oParserState->consumeWhiteSpace(); - while ($oParserState->comes(';')) { - $oParserState->consume(';'); - } - - $oParserState->consumeWhiteSpace(); - - return $oRule; - } - - /** - * @param string $sRule - * - * @return array - */ - private static function listDelimiterForRule($sRule) - { - if (preg_match('/^font($|-)/', $sRule)) { - return [',', '/', ' ']; - } - return [',', ' ', '/']; - } - - /** - * @return int - */ - public function getLineNo() - { - return $this->iLineNo; - } - - /** - * @return int - */ - public function getColNo() - { - return $this->iColNo; - } - - /** - * @param int $iLine - * @param int $iColumn - * - * @return void - */ - public function setPosition($iLine, $iColumn) - { - $this->iColNo = $iColumn; - $this->iLineNo = $iLine; - } - - /** - * @param string $sRule - * - * @return void - */ - public function setRule($sRule) - { - $this->sRule = $sRule; - } - - /** - * @return string - */ - public function getRule() - { - return $this->sRule; - } - - /** - * @return RuleValueList|string|null - */ - public function getValue() - { - return $this->mValue; - } - - /** - * @param RuleValueList|string|null $mValue - * - * @return void - */ - public function setValue($mValue) - { - $this->mValue = $mValue; - } - - /** - * @param array> $aSpaceSeparatedValues - * - * @return RuleValueList - * - * @deprecated will be removed in version 9.0 - * Old-Style 2-dimensional array given. Retained for (some) backwards-compatibility. - * Use `setValue()` instead and wrap the value inside a RuleValueList if necessary. - */ - public function setValues(array $aSpaceSeparatedValues) - { - $oSpaceSeparatedList = null; - if (count($aSpaceSeparatedValues) > 1) { - $oSpaceSeparatedList = new RuleValueList(' ', $this->iLineNo); - } - foreach ($aSpaceSeparatedValues as $aCommaSeparatedValues) { - $oCommaSeparatedList = null; - if (count($aCommaSeparatedValues) > 1) { - $oCommaSeparatedList = new RuleValueList(',', $this->iLineNo); - } - foreach ($aCommaSeparatedValues as $mValue) { - if (!$oSpaceSeparatedList && !$oCommaSeparatedList) { - $this->mValue = $mValue; - return $mValue; - } - if ($oCommaSeparatedList) { - $oCommaSeparatedList->addListComponent($mValue); - } else { - $oSpaceSeparatedList->addListComponent($mValue); - } - } - if (!$oSpaceSeparatedList) { - $this->mValue = $oCommaSeparatedList; - return $oCommaSeparatedList; - } else { - $oSpaceSeparatedList->addListComponent($oCommaSeparatedList); - } - } - $this->mValue = $oSpaceSeparatedList; - return $oSpaceSeparatedList; - } - - /** - * @return array> - * - * @deprecated will be removed in version 9.0 - * Old-Style 2-dimensional array returned. Retained for (some) backwards-compatibility. - * Use `getValue()` instead and check for the existence of a (nested set of) ValueList object(s). - */ - public function getValues() - { - if (!$this->mValue instanceof RuleValueList) { - return [[$this->mValue]]; - } - if ($this->mValue->getListSeparator() === ',') { - return [$this->mValue->getListComponents()]; - } - $aResult = []; - foreach ($this->mValue->getListComponents() as $mValue) { - if (!$mValue instanceof RuleValueList || $mValue->getListSeparator() !== ',') { - $aResult[] = [$mValue]; - continue; - } - if ($this->mValue->getListSeparator() === ' ' || count($aResult) === 0) { - $aResult[] = []; - } - foreach ($mValue->getListComponents() as $mValue) { - $aResult[count($aResult) - 1][] = $mValue; - } - } - return $aResult; - } - - /** - * Adds a value to the existing value. Value will be appended if a `RuleValueList` exists of the given type. - * Otherwise, the existing value will be wrapped by one. - * - * @param RuleValueList|array $mValue - * @param string $sType - * - * @return void - */ - public function addValue($mValue, $sType = ' ') - { - if (!is_array($mValue)) { - $mValue = [$mValue]; - } - if (!$this->mValue instanceof RuleValueList || $this->mValue->getListSeparator() !== $sType) { - $mCurrentValue = $this->mValue; - $this->mValue = new RuleValueList($sType, $this->iLineNo); - if ($mCurrentValue) { - $this->mValue->addListComponent($mCurrentValue); - } - } - foreach ($mValue as $mValueItem) { - $this->mValue->addListComponent($mValueItem); - } - } - - /** - * @param int $iModifier - * - * @return void - */ - public function addIeHack($iModifier) - { - $this->aIeHack[] = $iModifier; - } - - /** - * @param array $aModifiers - * - * @return void - */ - public function setIeHack(array $aModifiers) - { - $this->aIeHack = $aModifiers; - } - - /** - * @return array - */ - public function getIeHack() - { - return $this->aIeHack; - } - - /** - * @param bool $bIsImportant - * - * @return void - */ - public function setIsImportant($bIsImportant) - { - $this->bIsImportant = $bIsImportant; - } - - /** - * @return bool - */ - public function getIsImportant() - { - return $this->bIsImportant; - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - $sResult = "{$oOutputFormat->comments($this)}{$this->sRule}:{$oOutputFormat->spaceAfterRuleName()}"; - if ($this->mValue instanceof Value) { // Can also be a ValueList - $sResult .= $this->mValue->render($oOutputFormat); - } else { - $sResult .= $this->mValue; - } - if (!empty($this->aIeHack)) { - $sResult .= ' \\' . implode('\\', $this->aIeHack); - } - if ($this->bIsImportant) { - $sResult .= ' !important'; - } - $sResult .= ';'; - return $sResult; - } - - /** - * @param array $aComments - * - * @return void - */ - public function addComments(array $aComments) - { - $this->aComments = array_merge($this->aComments, $aComments); - } - - /** - * @return array - */ - public function getComments() - { - return $this->aComments; - } - - /** - * @param array $aComments - * - * @return void - */ - public function setComments(array $aComments) - { - $this->aComments = $aComments; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/AtRuleSet.php b/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/AtRuleSet.php deleted file mode 100644 index 93fd07a..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/AtRuleSet.php +++ /dev/null @@ -1,79 +0,0 @@ -sType = $sType; - $this->sArgs = $sArgs; - } - - /** - * @return string - */ - public function atRuleName() - { - return $this->sType; - } - - /** - * @return string - */ - public function atRuleArgs() - { - return $this->sArgs; - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - $sResult = $oOutputFormat->comments($this); - $sArgs = $this->sArgs; - if ($sArgs) { - $sArgs = ' ' . $sArgs; - } - $sResult .= "@{$this->sType}$sArgs{$oOutputFormat->spaceBeforeOpeningBrace()}{"; - $sResult .= $this->renderRules($oOutputFormat); - $sResult .= '}'; - return $sResult; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/DeclarationBlock.php b/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/DeclarationBlock.php deleted file mode 100644 index 8a1da14..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/DeclarationBlock.php +++ /dev/null @@ -1,864 +0,0 @@ - - */ - private $aSelectors; - - /** - * @param int $iLineNo - */ - public function __construct($iLineNo = 0) - { - parent::__construct($iLineNo); - $this->aSelectors = []; - } - - /** - * @param CSSList|null $oList - * - * @return DeclarationBlock|false - * - * @throws UnexpectedTokenException - * @throws UnexpectedEOFException - */ - public static function parse(ParserState $oParserState, $oList = null) - { - $aComments = []; - $oResult = new DeclarationBlock($oParserState->currentLine()); - try { - $aSelectorParts = []; - $sStringWrapperChar = false; - do { - $aSelectorParts[] = $oParserState->consume(1) - . $oParserState->consumeUntil(['{', '}', '\'', '"'], false, false, $aComments); - if (in_array($oParserState->peek(), ['\'', '"']) && substr(end($aSelectorParts), -1) != "\\") { - if ($sStringWrapperChar === false) { - $sStringWrapperChar = $oParserState->peek(); - } elseif ($sStringWrapperChar == $oParserState->peek()) { - $sStringWrapperChar = false; - } - } - } while (!in_array($oParserState->peek(), ['{', '}']) || $sStringWrapperChar !== false); - $oResult->setSelectors(implode('', $aSelectorParts), $oList); - if ($oParserState->comes('{')) { - $oParserState->consume(1); - } - } catch (UnexpectedTokenException $e) { - if ($oParserState->getSettings()->bLenientParsing) { - if (!$oParserState->comes('}')) { - $oParserState->consumeUntil('}', false, true); - } - return false; - } else { - throw $e; - } - } - $oResult->setComments($aComments); - RuleSet::parseRuleSet($oParserState, $oResult); - return $oResult; - } - - /** - * @param array|string $mSelector - * @param CSSList|null $oList - * - * @throws UnexpectedTokenException - */ - public function setSelectors($mSelector, $oList = null) - { - if (is_array($mSelector)) { - $this->aSelectors = $mSelector; - } else { - $this->aSelectors = explode(',', $mSelector); - } - foreach ($this->aSelectors as $iKey => $mSelector) { - if (!($mSelector instanceof Selector)) { - if ($oList === null || !($oList instanceof KeyFrame)) { - if (!Selector::isValid($mSelector)) { - throw new UnexpectedTokenException( - "Selector did not match '" . Selector::SELECTOR_VALIDATION_RX . "'.", - $mSelector, - "custom" - ); - } - $this->aSelectors[$iKey] = new Selector($mSelector); - } else { - if (!KeyframeSelector::isValid($mSelector)) { - throw new UnexpectedTokenException( - "Selector did not match '" . KeyframeSelector::SELECTOR_VALIDATION_RX . "'.", - $mSelector, - "custom" - ); - } - $this->aSelectors[$iKey] = new KeyframeSelector($mSelector); - } - } - } - } - - /** - * Remove one of the selectors of the block. - * - * @param Selector|string $mSelector - * - * @return bool - */ - public function removeSelector($mSelector) - { - if ($mSelector instanceof Selector) { - $mSelector = $mSelector->getSelector(); - } - foreach ($this->aSelectors as $iKey => $oSelector) { - if ($oSelector->getSelector() === $mSelector) { - unset($this->aSelectors[$iKey]); - return true; - } - } - return false; - } - - /** - * @return array - * - * @deprecated will be removed in version 9.0; use `getSelectors()` instead - */ - public function getSelector() - { - return $this->getSelectors(); - } - - /** - * @param Selector|string $mSelector - * @param CSSList|null $oList - * - * @return void - * - * @deprecated will be removed in version 9.0; use `setSelectors()` instead - */ - public function setSelector($mSelector, $oList = null) - { - $this->setSelectors($mSelector, $oList); - } - - /** - * @return array - */ - public function getSelectors() - { - return $this->aSelectors; - } - - /** - * Splits shorthand declarations (e.g. `margin` or `font`) into their constituent parts. - * - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function expandShorthands() - { - // border must be expanded before dimensions - $this->expandBorderShorthand(); - $this->expandDimensionsShorthand(); - $this->expandFontShorthand(); - $this->expandBackgroundShorthand(); - $this->expandListStyleShorthand(); - } - - /** - * Creates shorthand declarations (e.g. `margin` or `font`) whenever possible. - * - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function createShorthands() - { - $this->createBackgroundShorthand(); - $this->createDimensionsShorthand(); - // border must be shortened after dimensions - $this->createBorderShorthand(); - $this->createFontShorthand(); - $this->createListStyleShorthand(); - } - - /** - * Splits shorthand border declarations (e.g. `border: 1px red;`). - * - * Additional splitting happens in expandDimensionsShorthand. - * - * Multiple borders are not yet supported as of 3. - * - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function expandBorderShorthand() - { - $aBorderRules = [ - 'border', - 'border-left', - 'border-right', - 'border-top', - 'border-bottom', - ]; - $aBorderSizes = [ - 'thin', - 'medium', - 'thick', - ]; - $aRules = $this->getRulesAssoc(); - foreach ($aBorderRules as $sBorderRule) { - if (!isset($aRules[$sBorderRule])) { - continue; - } - $oRule = $aRules[$sBorderRule]; - $mRuleValue = $oRule->getValue(); - $aValues = []; - if (!$mRuleValue instanceof RuleValueList) { - $aValues[] = $mRuleValue; - } else { - $aValues = $mRuleValue->getListComponents(); - } - foreach ($aValues as $mValue) { - if ($mValue instanceof Value) { - $mNewValue = clone $mValue; - } else { - $mNewValue = $mValue; - } - if ($mValue instanceof Size) { - $sNewRuleName = $sBorderRule . "-width"; - } elseif ($mValue instanceof Color) { - $sNewRuleName = $sBorderRule . "-color"; - } else { - if (in_array($mValue, $aBorderSizes)) { - $sNewRuleName = $sBorderRule . "-width"; - } else { - $sNewRuleName = $sBorderRule . "-style"; - } - } - $oNewRule = new Rule($sNewRuleName, $oRule->getLineNo(), $oRule->getColNo()); - $oNewRule->setIsImportant($oRule->getIsImportant()); - $oNewRule->addValue([$mNewValue]); - $this->addRule($oNewRule); - } - $this->removeRule($sBorderRule); - } - } - - /** - * Splits shorthand dimensional declarations (e.g. `margin: 0px auto;`) - * into their constituent parts. - * - * Handles `margin`, `padding`, `border-color`, `border-style` and `border-width`. - * - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function expandDimensionsShorthand() - { - $aExpansions = [ - 'margin' => 'margin-%s', - 'padding' => 'padding-%s', - 'border-color' => 'border-%s-color', - 'border-style' => 'border-%s-style', - 'border-width' => 'border-%s-width', - ]; - $aRules = $this->getRulesAssoc(); - foreach ($aExpansions as $sProperty => $sExpanded) { - if (!isset($aRules[$sProperty])) { - continue; - } - $oRule = $aRules[$sProperty]; - $mRuleValue = $oRule->getValue(); - $aValues = []; - if (!$mRuleValue instanceof RuleValueList) { - $aValues[] = $mRuleValue; - } else { - $aValues = $mRuleValue->getListComponents(); - } - $top = $right = $bottom = $left = null; - switch (count($aValues)) { - case 1: - $top = $right = $bottom = $left = $aValues[0]; - break; - case 2: - $top = $bottom = $aValues[0]; - $left = $right = $aValues[1]; - break; - case 3: - $top = $aValues[0]; - $left = $right = $aValues[1]; - $bottom = $aValues[2]; - break; - case 4: - $top = $aValues[0]; - $right = $aValues[1]; - $bottom = $aValues[2]; - $left = $aValues[3]; - break; - } - foreach (['top', 'right', 'bottom', 'left'] as $sPosition) { - $oNewRule = new Rule(sprintf($sExpanded, $sPosition), $oRule->getLineNo(), $oRule->getColNo()); - $oNewRule->setIsImportant($oRule->getIsImportant()); - $oNewRule->addValue(${$sPosition}); - $this->addRule($oNewRule); - } - $this->removeRule($sProperty); - } - } - - /** - * Converts shorthand font declarations - * (e.g. `font: 300 italic 11px/14px verdana, helvetica, sans-serif;`) - * into their constituent parts. - * - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function expandFontShorthand() - { - $aRules = $this->getRulesAssoc(); - if (!isset($aRules['font'])) { - return; - } - $oRule = $aRules['font']; - // reset properties to 'normal' per http://www.w3.org/TR/21/fonts.html#font-shorthand - $aFontProperties = [ - 'font-style' => 'normal', - 'font-variant' => 'normal', - 'font-weight' => 'normal', - 'font-size' => 'normal', - 'line-height' => 'normal', - ]; - $mRuleValue = $oRule->getValue(); - $aValues = []; - if (!$mRuleValue instanceof RuleValueList) { - $aValues[] = $mRuleValue; - } else { - $aValues = $mRuleValue->getListComponents(); - } - foreach ($aValues as $mValue) { - if (!$mValue instanceof Value) { - $mValue = mb_strtolower($mValue); - } - if (in_array($mValue, ['normal', 'inherit'])) { - foreach (['font-style', 'font-weight', 'font-variant'] as $sProperty) { - if (!isset($aFontProperties[$sProperty])) { - $aFontProperties[$sProperty] = $mValue; - } - } - } elseif (in_array($mValue, ['italic', 'oblique'])) { - $aFontProperties['font-style'] = $mValue; - } elseif ($mValue == 'small-caps') { - $aFontProperties['font-variant'] = $mValue; - } elseif ( - in_array($mValue, ['bold', 'bolder', 'lighter']) - || ($mValue instanceof Size - && in_array($mValue->getSize(), range(100, 900, 100))) - ) { - $aFontProperties['font-weight'] = $mValue; - } elseif ($mValue instanceof RuleValueList && $mValue->getListSeparator() == '/') { - list($oSize, $oHeight) = $mValue->getListComponents(); - $aFontProperties['font-size'] = $oSize; - $aFontProperties['line-height'] = $oHeight; - } elseif ($mValue instanceof Size && $mValue->getUnit() !== null) { - $aFontProperties['font-size'] = $mValue; - } else { - $aFontProperties['font-family'] = $mValue; - } - } - foreach ($aFontProperties as $sProperty => $mValue) { - $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo()); - $oNewRule->addValue($mValue); - $oNewRule->setIsImportant($oRule->getIsImportant()); - $this->addRule($oNewRule); - } - $this->removeRule('font'); - } - - /** - * Converts shorthand background declarations - * (e.g. `background: url("chess.png") gray 50% repeat fixed;`) - * into their constituent parts. - * - * @see http://www.w3.org/TR/21/colors.html#propdef-background - * - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function expandBackgroundShorthand() - { - $aRules = $this->getRulesAssoc(); - if (!isset($aRules['background'])) { - return; - } - $oRule = $aRules['background']; - $aBgProperties = [ - 'background-color' => ['transparent'], - 'background-image' => ['none'], - 'background-repeat' => ['repeat'], - 'background-attachment' => ['scroll'], - 'background-position' => [ - new Size(0, '%', null, false, $this->iLineNo), - new Size(0, '%', null, false, $this->iLineNo), - ], - ]; - $mRuleValue = $oRule->getValue(); - $aValues = []; - if (!$mRuleValue instanceof RuleValueList) { - $aValues[] = $mRuleValue; - } else { - $aValues = $mRuleValue->getListComponents(); - } - if (count($aValues) == 1 && $aValues[0] == 'inherit') { - foreach ($aBgProperties as $sProperty => $mValue) { - $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo()); - $oNewRule->addValue('inherit'); - $oNewRule->setIsImportant($oRule->getIsImportant()); - $this->addRule($oNewRule); - } - $this->removeRule('background'); - return; - } - $iNumBgPos = 0; - foreach ($aValues as $mValue) { - if (!$mValue instanceof Value) { - $mValue = mb_strtolower($mValue); - } - if ($mValue instanceof URL) { - $aBgProperties['background-image'] = $mValue; - } elseif ($mValue instanceof Color) { - $aBgProperties['background-color'] = $mValue; - } elseif (in_array($mValue, ['scroll', 'fixed'])) { - $aBgProperties['background-attachment'] = $mValue; - } elseif (in_array($mValue, ['repeat', 'no-repeat', 'repeat-x', 'repeat-y'])) { - $aBgProperties['background-repeat'] = $mValue; - } elseif ( - in_array($mValue, ['left', 'center', 'right', 'top', 'bottom']) - || $mValue instanceof Size - ) { - if ($iNumBgPos == 0) { - $aBgProperties['background-position'][0] = $mValue; - $aBgProperties['background-position'][1] = 'center'; - } else { - $aBgProperties['background-position'][$iNumBgPos] = $mValue; - } - $iNumBgPos++; - } - } - foreach ($aBgProperties as $sProperty => $mValue) { - $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo()); - $oNewRule->setIsImportant($oRule->getIsImportant()); - $oNewRule->addValue($mValue); - $this->addRule($oNewRule); - } - $this->removeRule('background'); - } - - /** - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function expandListStyleShorthand() - { - $aListProperties = [ - 'list-style-type' => 'disc', - 'list-style-position' => 'outside', - 'list-style-image' => 'none', - ]; - $aListStyleTypes = [ - 'none', - 'disc', - 'circle', - 'square', - 'decimal-leading-zero', - 'decimal', - 'lower-roman', - 'upper-roman', - 'lower-greek', - 'lower-alpha', - 'lower-latin', - 'upper-alpha', - 'upper-latin', - 'hebrew', - 'armenian', - 'georgian', - 'cjk-ideographic', - 'hiragana', - 'hira-gana-iroha', - 'katakana-iroha', - 'katakana', - ]; - $aListStylePositions = [ - 'inside', - 'outside', - ]; - $aRules = $this->getRulesAssoc(); - if (!isset($aRules['list-style'])) { - return; - } - $oRule = $aRules['list-style']; - $mRuleValue = $oRule->getValue(); - $aValues = []; - if (!$mRuleValue instanceof RuleValueList) { - $aValues[] = $mRuleValue; - } else { - $aValues = $mRuleValue->getListComponents(); - } - if (count($aValues) == 1 && $aValues[0] == 'inherit') { - foreach ($aListProperties as $sProperty => $mValue) { - $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo()); - $oNewRule->addValue('inherit'); - $oNewRule->setIsImportant($oRule->getIsImportant()); - $this->addRule($oNewRule); - } - $this->removeRule('list-style'); - return; - } - foreach ($aValues as $mValue) { - if (!$mValue instanceof Value) { - $mValue = mb_strtolower($mValue); - } - if ($mValue instanceof Url) { - $aListProperties['list-style-image'] = $mValue; - } elseif (in_array($mValue, $aListStyleTypes)) { - $aListProperties['list-style-types'] = $mValue; - } elseif (in_array($mValue, $aListStylePositions)) { - $aListProperties['list-style-position'] = $mValue; - } - } - foreach ($aListProperties as $sProperty => $mValue) { - $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo()); - $oNewRule->setIsImportant($oRule->getIsImportant()); - $oNewRule->addValue($mValue); - $this->addRule($oNewRule); - } - $this->removeRule('list-style'); - } - - /** - * @param array $aProperties - * @param string $sShorthand - * - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function createShorthandProperties(array $aProperties, $sShorthand) - { - $aRules = $this->getRulesAssoc(); - $oRule = null; - $aNewValues = []; - foreach ($aProperties as $sProperty) { - if (!isset($aRules[$sProperty])) { - continue; - } - $oRule = $aRules[$sProperty]; - if (!$oRule->getIsImportant()) { - $mRuleValue = $oRule->getValue(); - $aValues = []; - if (!$mRuleValue instanceof RuleValueList) { - $aValues[] = $mRuleValue; - } else { - $aValues = $mRuleValue->getListComponents(); - } - foreach ($aValues as $mValue) { - $aNewValues[] = $mValue; - } - $this->removeRule($sProperty); - } - } - if ($aNewValues !== [] && $oRule instanceof Rule) { - $oNewRule = new Rule($sShorthand, $oRule->getLineNo(), $oRule->getColNo()); - foreach ($aNewValues as $mValue) { - $oNewRule->addValue($mValue); - } - $this->addRule($oNewRule); - } - } - - /** - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function createBackgroundShorthand() - { - $aProperties = [ - 'background-color', - 'background-image', - 'background-repeat', - 'background-position', - 'background-attachment', - ]; - $this->createShorthandProperties($aProperties, 'background'); - } - - /** - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function createListStyleShorthand() - { - $aProperties = [ - 'list-style-type', - 'list-style-position', - 'list-style-image', - ]; - $this->createShorthandProperties($aProperties, 'list-style'); - } - - /** - * Combines `border-color`, `border-style` and `border-width` into `border`. - * - * Should be run after `create_dimensions_shorthand`! - * - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function createBorderShorthand() - { - $aProperties = [ - 'border-width', - 'border-style', - 'border-color', - ]; - $this->createShorthandProperties($aProperties, 'border'); - } - - /** - * Looks for long format CSS dimensional properties - * (margin, padding, border-color, border-style and border-width) - * and converts them into shorthand CSS properties. - * - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function createDimensionsShorthand() - { - $aPositions = ['top', 'right', 'bottom', 'left']; - $aExpansions = [ - 'margin' => 'margin-%s', - 'padding' => 'padding-%s', - 'border-color' => 'border-%s-color', - 'border-style' => 'border-%s-style', - 'border-width' => 'border-%s-width', - ]; - $aRules = $this->getRulesAssoc(); - foreach ($aExpansions as $sProperty => $sExpanded) { - $aFoldable = []; - foreach ($aRules as $sRuleName => $oRule) { - foreach ($aPositions as $sPosition) { - if ($sRuleName == sprintf($sExpanded, $sPosition)) { - $aFoldable[$sRuleName] = $oRule; - } - } - } - // All four dimensions must be present - if (count($aFoldable) == 4) { - $aValues = []; - foreach ($aPositions as $sPosition) { - $oRule = $aRules[sprintf($sExpanded, $sPosition)]; - $mRuleValue = $oRule->getValue(); - $aRuleValues = []; - if (!$mRuleValue instanceof RuleValueList) { - $aRuleValues[] = $mRuleValue; - } else { - $aRuleValues = $mRuleValue->getListComponents(); - } - $aValues[$sPosition] = $aRuleValues; - } - $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo()); - if ((string)$aValues['left'][0] == (string)$aValues['right'][0]) { - if ((string)$aValues['top'][0] == (string)$aValues['bottom'][0]) { - if ((string)$aValues['top'][0] == (string)$aValues['left'][0]) { - // All 4 sides are equal - $oNewRule->addValue($aValues['top']); - } else { - // Top and bottom are equal, left and right are equal - $oNewRule->addValue($aValues['top']); - $oNewRule->addValue($aValues['left']); - } - } else { - // Only left and right are equal - $oNewRule->addValue($aValues['top']); - $oNewRule->addValue($aValues['left']); - $oNewRule->addValue($aValues['bottom']); - } - } else { - // No sides are equal - $oNewRule->addValue($aValues['top']); - $oNewRule->addValue($aValues['left']); - $oNewRule->addValue($aValues['bottom']); - $oNewRule->addValue($aValues['right']); - } - $this->addRule($oNewRule); - foreach ($aPositions as $sPosition) { - $this->removeRule(sprintf($sExpanded, $sPosition)); - } - } - } - } - - /** - * Looks for long format CSS font properties (e.g. `font-weight`) and - * tries to convert them into a shorthand CSS `font` property. - * - * At least `font-size` AND `font-family` must be present in order to create a shorthand declaration. - * - * @return void - * - * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 - */ - public function createFontShorthand() - { - $aFontProperties = [ - 'font-style', - 'font-variant', - 'font-weight', - 'font-size', - 'line-height', - 'font-family', - ]; - $aRules = $this->getRulesAssoc(); - if (!isset($aRules['font-size']) || !isset($aRules['font-family'])) { - return; - } - $oOldRule = isset($aRules['font-size']) ? $aRules['font-size'] : $aRules['font-family']; - $oNewRule = new Rule('font', $oOldRule->getLineNo(), $oOldRule->getColNo()); - unset($oOldRule); - foreach (['font-style', 'font-variant', 'font-weight'] as $sProperty) { - if (isset($aRules[$sProperty])) { - $oRule = $aRules[$sProperty]; - $mRuleValue = $oRule->getValue(); - $aValues = []; - if (!$mRuleValue instanceof RuleValueList) { - $aValues[] = $mRuleValue; - } else { - $aValues = $mRuleValue->getListComponents(); - } - if ($aValues[0] !== 'normal') { - $oNewRule->addValue($aValues[0]); - } - } - } - // Get the font-size value - $oRule = $aRules['font-size']; - $mRuleValue = $oRule->getValue(); - $aFSValues = []; - if (!$mRuleValue instanceof RuleValueList) { - $aFSValues[] = $mRuleValue; - } else { - $aFSValues = $mRuleValue->getListComponents(); - } - // But wait to know if we have line-height to add it - if (isset($aRules['line-height'])) { - $oRule = $aRules['line-height']; - $mRuleValue = $oRule->getValue(); - $aLHValues = []; - if (!$mRuleValue instanceof RuleValueList) { - $aLHValues[] = $mRuleValue; - } else { - $aLHValues = $mRuleValue->getListComponents(); - } - if ($aLHValues[0] !== 'normal') { - $val = new RuleValueList('/', $this->iLineNo); - $val->addListComponent($aFSValues[0]); - $val->addListComponent($aLHValues[0]); - $oNewRule->addValue($val); - } - } else { - $oNewRule->addValue($aFSValues[0]); - } - $oRule = $aRules['font-family']; - $mRuleValue = $oRule->getValue(); - $aFFValues = []; - if (!$mRuleValue instanceof RuleValueList) { - $aFFValues[] = $mRuleValue; - } else { - $aFFValues = $mRuleValue->getListComponents(); - } - $oFFValue = new RuleValueList(',', $this->iLineNo); - $oFFValue->setListComponents($aFFValues); - $oNewRule->addValue($oFFValue); - - $this->addRule($oNewRule); - foreach ($aFontProperties as $sProperty) { - $this->removeRule($sProperty); - } - } - - /** - * @return string - * - * @throws OutputException - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - * - * @throws OutputException - */ - public function render($oOutputFormat) - { - $sResult = $oOutputFormat->comments($this); - if (count($this->aSelectors) === 0) { - // If all the selectors have been removed, this declaration block becomes invalid - throw new OutputException("Attempt to print declaration block with missing selector", $this->iLineNo); - } - $sResult .= $oOutputFormat->sBeforeDeclarationBlock; - $sResult .= $oOutputFormat->implode( - $oOutputFormat->spaceBeforeSelectorSeparator() . ',' . $oOutputFormat->spaceAfterSelectorSeparator(), - $this->aSelectors - ); - $sResult .= $oOutputFormat->sAfterDeclarationBlockSelectors; - $sResult .= $oOutputFormat->spaceBeforeOpeningBrace() . '{'; - $sResult .= $this->renderRules($oOutputFormat); - $sResult .= '}'; - $sResult .= $oOutputFormat->sAfterDeclarationBlock; - return $sResult; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/RuleSet.php b/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/RuleSet.php deleted file mode 100644 index 8cbbd34..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/RuleSet.php +++ /dev/null @@ -1,332 +0,0 @@ - - */ - private $aRules; - - /** - * @var int - */ - protected $iLineNo; - - /** - * @var array - */ - protected $aComments; - - /** - * @param int $iLineNo - */ - public function __construct($iLineNo = 0) - { - $this->aRules = []; - $this->iLineNo = $iLineNo; - $this->aComments = []; - } - - /** - * @return void - * - * @throws UnexpectedTokenException - * @throws UnexpectedEOFException - */ - public static function parseRuleSet(ParserState $oParserState, RuleSet $oRuleSet) - { - while ($oParserState->comes(';')) { - $oParserState->consume(';'); - } - while (!$oParserState->comes('}')) { - $oRule = null; - if ($oParserState->getSettings()->bLenientParsing) { - try { - $oRule = Rule::parse($oParserState); - } catch (UnexpectedTokenException $e) { - try { - $sConsume = $oParserState->consumeUntil(["\n", ";", '}'], true); - // We need to “unfind” the matches to the end of the ruleSet as this will be matched later - if ($oParserState->streql(substr($sConsume, -1), '}')) { - $oParserState->backtrack(1); - } else { - while ($oParserState->comes(';')) { - $oParserState->consume(';'); - } - } - } catch (UnexpectedTokenException $e) { - // We’ve reached the end of the document. Just close the RuleSet. - return; - } - } - } else { - $oRule = Rule::parse($oParserState); - } - if ($oRule) { - $oRuleSet->addRule($oRule); - } - } - $oParserState->consume('}'); - } - - /** - * @return int - */ - public function getLineNo() - { - return $this->iLineNo; - } - - /** - * @param Rule|null $oSibling - * - * @return void - */ - public function addRule(Rule $oRule, $oSibling = null) - { - $sRule = $oRule->getRule(); - if (!isset($this->aRules[$sRule])) { - $this->aRules[$sRule] = []; - } - - $iPosition = count($this->aRules[$sRule]); - - if ($oSibling !== null) { - $iSiblingPos = array_search($oSibling, $this->aRules[$sRule], true); - if ($iSiblingPos !== false) { - $iPosition = $iSiblingPos; - $oRule->setPosition($oSibling->getLineNo(), $oSibling->getColNo() - 1); - } - } - if ($oRule->getLineNo() === 0 && $oRule->getColNo() === 0) { - //this node is added manually, give it the next best line - $rules = $this->getRules(); - $pos = count($rules); - if ($pos > 0) { - $last = $rules[$pos - 1]; - $oRule->setPosition($last->getLineNo() + 1, 0); - } - } - - array_splice($this->aRules[$sRule], $iPosition, 0, [$oRule]); - } - - /** - * Returns all rules matching the given rule name - * - * @example $oRuleSet->getRules('font') // returns array(0 => $oRule, …) or array(). - * - * @example $oRuleSet->getRules('font-') - * //returns an array of all rules either beginning with font- or matching font. - * - * @param Rule|string|null $mRule - * Pattern to search for. If null, returns all rules. - * If the pattern ends with a dash, all rules starting with the pattern are returned - * as well as one matching the pattern with the dash excluded. - * Passing a Rule behaves like calling `getRules($mRule->getRule())`. - * - * @return array - */ - public function getRules($mRule = null) - { - if ($mRule instanceof Rule) { - $mRule = $mRule->getRule(); - } - /** @var array $aResult */ - $aResult = []; - foreach ($this->aRules as $sName => $aRules) { - // Either no search rule is given or the search rule matches the found rule exactly - // or the search rule ends in “-” and the found rule starts with the search rule. - if ( - !$mRule || $sName === $mRule - || ( - strrpos($mRule, '-') === strlen($mRule) - strlen('-') - && (strpos($sName, $mRule) === 0 || $sName === substr($mRule, 0, -1)) - ) - ) { - $aResult = array_merge($aResult, $aRules); - } - } - usort($aResult, function (Rule $first, Rule $second) { - if ($first->getLineNo() === $second->getLineNo()) { - return $first->getColNo() - $second->getColNo(); - } - return $first->getLineNo() - $second->getLineNo(); - }); - return $aResult; - } - - /** - * Overrides all the rules of this set. - * - * @param array $aRules The rules to override with. - * - * @return void - */ - public function setRules(array $aRules) - { - $this->aRules = []; - foreach ($aRules as $rule) { - $this->addRule($rule); - } - } - - /** - * Returns all rules matching the given pattern and returns them in an associative array with the rule’s name - * as keys. This method exists mainly for backwards-compatibility and is really only partially useful. - * - * Note: This method loses some information: Calling this (with an argument of `background-`) on a declaration block - * like `{ background-color: green; background-color; rgba(0, 127, 0, 0.7); }` will only yield an associative array - * containing the rgba-valued rule while `getRules()` would yield an indexed array containing both. - * - * @param Rule|string|null $mRule $mRule - * Pattern to search for. If null, returns all rules. If the pattern ends with a dash, - * all rules starting with the pattern are returned as well as one matching the pattern with the dash - * excluded. Passing a Rule behaves like calling `getRules($mRule->getRule())`. - * - * @return array - */ - public function getRulesAssoc($mRule = null) - { - /** @var array $aResult */ - $aResult = []; - foreach ($this->getRules($mRule) as $oRule) { - $aResult[$oRule->getRule()] = $oRule; - } - return $aResult; - } - - /** - * Removes a rule from this RuleSet. This accepts all the possible values that `getRules()` accepts. - * - * If given a Rule, it will only remove this particular rule (by identity). - * If given a name, it will remove all rules by that name. - * - * Note: this is different from pre-v.2.0 behaviour of PHP-CSS-Parser, where passing a Rule instance would - * remove all rules with the same name. To get the old behaviour, use `removeRule($oRule->getRule())`. - * - * @param Rule|string|null $mRule - * pattern to remove. If $mRule is null, all rules are removed. If the pattern ends in a dash, - * all rules starting with the pattern are removed as well as one matching the pattern with the dash - * excluded. Passing a Rule behaves matches by identity. - * - * @return void - */ - public function removeRule($mRule) - { - if ($mRule instanceof Rule) { - $sRule = $mRule->getRule(); - if (!isset($this->aRules[$sRule])) { - return; - } - foreach ($this->aRules[$sRule] as $iKey => $oRule) { - if ($oRule === $mRule) { - unset($this->aRules[$sRule][$iKey]); - } - } - } else { - foreach ($this->aRules as $sName => $aRules) { - // Either no search rule is given or the search rule matches the found rule exactly - // or the search rule ends in “-” and the found rule starts with the search rule or equals it - // (without the trailing dash). - if ( - !$mRule || $sName === $mRule - || (strrpos($mRule, '-') === strlen($mRule) - strlen('-') - && (strpos($sName, $mRule) === 0 || $sName === substr($mRule, 0, -1))) - ) { - unset($this->aRules[$sName]); - } - } - } - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @return string - */ - protected function renderRules(OutputFormat $oOutputFormat) - { - $sResult = ''; - $bIsFirst = true; - $oNextLevel = $oOutputFormat->nextLevel(); - foreach ($this->aRules as $aRules) { - foreach ($aRules as $oRule) { - $sRendered = $oNextLevel->safely(function () use ($oRule, $oNextLevel) { - return $oRule->render($oNextLevel); - }); - if ($sRendered === null) { - continue; - } - if ($bIsFirst) { - $bIsFirst = false; - $sResult .= $oNextLevel->spaceBeforeRules(); - } else { - $sResult .= $oNextLevel->spaceBetweenRules(); - } - $sResult .= $sRendered; - } - } - - if (!$bIsFirst) { - // Had some output - $sResult .= $oOutputFormat->spaceAfterRules(); - } - - return $oOutputFormat->removeLastSemicolon($sResult); - } - - /** - * @param array $aComments - * - * @return void - */ - public function addComments(array $aComments) - { - $this->aComments = array_merge($this->aComments, $aComments); - } - - /** - * @return array - */ - public function getComments() - { - return $this->aComments; - } - - /** - * @param array $aComments - * - * @return void - */ - public function setComments(array $aComments) - { - $this->aComments = $aComments; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Settings.php b/dompdf/vendor/sabberworm/php-css-parser/src/Settings.php deleted file mode 100644 index 79d9980..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Settings.php +++ /dev/null @@ -1,100 +0,0 @@ -bMultibyteSupport = extension_loaded('mbstring'); - } - - /** - * @return self new instance - */ - public static function create() - { - return new Settings(); - } - - /** - * Enables/disables multi-byte string support. - * - * If `true` (`mbstring` extension must be enabled), will use (slower) `mb_strlen`, `mb_convert_case`, `mb_substr` - * and `mb_strpos` functions. Otherwise, the normal (ASCII-Only) functions will be used. - * - * @param bool $bMultibyteSupport - * - * @return self fluent interface - */ - public function withMultibyteSupport($bMultibyteSupport = true) - { - $this->bMultibyteSupport = $bMultibyteSupport; - return $this; - } - - /** - * Sets the charset to be used if the CSS does not contain an `@charset` declaration. - * - * @param string $sDefaultCharset - * - * @return self fluent interface - */ - public function withDefaultCharset($sDefaultCharset) - { - $this->sDefaultCharset = $sDefaultCharset; - return $this; - } - - /** - * Configures whether the parser should silently ignore invalid rules. - * - * @param bool $bLenientParsing - * - * @return self fluent interface - */ - public function withLenientParsing($bLenientParsing = true) - { - $this->bLenientParsing = $bLenientParsing; - return $this; - } - - /** - * Configures the parser to choke on invalid rules. - * - * @return self fluent interface - */ - public function beStrict() - { - return $this->withLenientParsing(false); - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/CSSFunction.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/CSSFunction.php deleted file mode 100644 index 82ffc48..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Value/CSSFunction.php +++ /dev/null @@ -1,100 +0,0 @@ - $aArguments - * @param string $sSeparator - * @param int $iLineNo - */ - public function __construct($sName, $aArguments, $sSeparator = ',', $iLineNo = 0) - { - if ($aArguments instanceof RuleValueList) { - $sSeparator = $aArguments->getListSeparator(); - $aArguments = $aArguments->getListComponents(); - } - $this->sName = $sName; - $this->iLineNo = $iLineNo; - parent::__construct($aArguments, $sSeparator, $iLineNo); - } - - /** - * @param ParserState $oParserState - * @param bool $bIgnoreCase - * - * @return CSSFunction - * - * @throws SourceException - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - public static function parse(ParserState $oParserState, $bIgnoreCase = false) - { - $mResult = $oParserState->parseIdentifier($bIgnoreCase); - $oParserState->consume('('); - $aArguments = Value::parseValue($oParserState, ['=', ' ', ',']); - $mResult = new CSSFunction($mResult, $aArguments, ',', $oParserState->currentLine()); - $oParserState->consume(')'); - return $mResult; - } - - /** - * @return string - */ - public function getName() - { - return $this->sName; - } - - /** - * @param string $sName - * - * @return void - */ - public function setName($sName) - { - $this->sName = $sName; - } - - /** - * @return array - */ - public function getArguments() - { - return $this->aComponents; - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - $aArguments = parent::render($oOutputFormat); - return "{$this->sName}({$aArguments})"; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/CSSString.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/CSSString.php deleted file mode 100644 index c19b238..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Value/CSSString.php +++ /dev/null @@ -1,112 +0,0 @@ -sString = $sString; - parent::__construct($iLineNo); - } - - /** - * @return CSSString - * - * @throws SourceException - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - public static function parse(ParserState $oParserState) - { - $sBegin = $oParserState->peek(); - $sQuote = null; - if ($sBegin === "'") { - $sQuote = "'"; - } elseif ($sBegin === '"') { - $sQuote = '"'; - } - if ($sQuote !== null) { - $oParserState->consume($sQuote); - } - $sResult = ""; - $sContent = null; - if ($sQuote === null) { - // Unquoted strings end in whitespace or with braces, brackets, parentheses - while (!preg_match('/[\\s{}()<>\\[\\]]/isu', $oParserState->peek())) { - $sResult .= $oParserState->parseCharacter(false); - } - } else { - while (!$oParserState->comes($sQuote)) { - $sContent = $oParserState->parseCharacter(false); - if ($sContent === null) { - throw new SourceException( - "Non-well-formed quoted string {$oParserState->peek(3)}", - $oParserState->currentLine() - ); - } - $sResult .= $sContent; - } - $oParserState->consume($sQuote); - } - return new CSSString($sResult, $oParserState->currentLine()); - } - - /** - * @param string $sString - * - * @return void - */ - public function setString($sString) - { - $this->sString = $sString; - } - - /** - * @return string - */ - public function getString() - { - return $this->sString; - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - $sString = addslashes($this->sString); - $sString = str_replace("\n", '\A', $sString); - return $oOutputFormat->getStringQuotingType() . $sString . $oOutputFormat->getStringQuotingType(); - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/CalcFunction.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/CalcFunction.php deleted file mode 100644 index a3db271..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Value/CalcFunction.php +++ /dev/null @@ -1,110 +0,0 @@ -parseIdentifier(); - if ($oParserState->peek() != '(') { - // Found ; or end of line before an opening bracket - throw new UnexpectedTokenException('(', $oParserState->peek(), 'literal', $oParserState->currentLine()); - } elseif (!in_array($sFunction, ['calc', '-moz-calc', '-webkit-calc'])) { - // Found invalid calc definition. Example calc (... - throw new UnexpectedTokenException('calc', $sFunction, 'literal', $oParserState->currentLine()); - } - $oParserState->consume('('); - $oCalcList = new CalcRuleValueList($oParserState->currentLine()); - $oList = new RuleValueList(',', $oParserState->currentLine()); - $iNestingLevel = 0; - $iLastComponentType = null; - while (!$oParserState->comes(')') || $iNestingLevel > 0) { - if ($oParserState->isEnd() && $iNestingLevel === 0) { - break; - } - - $oParserState->consumeWhiteSpace(); - if ($oParserState->comes('(')) { - $iNestingLevel++; - $oCalcList->addListComponent($oParserState->consume(1)); - $oParserState->consumeWhiteSpace(); - continue; - } elseif ($oParserState->comes(')')) { - $iNestingLevel--; - $oCalcList->addListComponent($oParserState->consume(1)); - $oParserState->consumeWhiteSpace(); - continue; - } - if ($iLastComponentType != CalcFunction::T_OPERAND) { - $oVal = Value::parsePrimitiveValue($oParserState); - $oCalcList->addListComponent($oVal); - $iLastComponentType = CalcFunction::T_OPERAND; - } else { - if (in_array($oParserState->peek(), $aOperators)) { - if (($oParserState->comes('-') || $oParserState->comes('+'))) { - if ( - $oParserState->peek(1, -1) != ' ' - || !($oParserState->comes('- ') - || $oParserState->comes('+ ')) - ) { - throw new UnexpectedTokenException( - " {$oParserState->peek()} ", - $oParserState->peek(1, -1) . $oParserState->peek(2), - 'literal', - $oParserState->currentLine() - ); - } - } - $oCalcList->addListComponent($oParserState->consume(1)); - $iLastComponentType = CalcFunction::T_OPERATOR; - } else { - throw new UnexpectedTokenException( - sprintf( - 'Next token was expected to be an operand of type %s. Instead "%s" was found.', - implode(', ', $aOperators), - $oParserState->peek() - ), - '', - 'custom', - $oParserState->currentLine() - ); - } - } - $oParserState->consumeWhiteSpace(); - } - $oList->addListComponent($oCalcList); - if (!$oParserState->isEnd()) { - $oParserState->consume(')'); - } - return new CalcFunction($sFunction, $oList, ',', $oParserState->currentLine()); - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/CalcRuleValueList.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/CalcRuleValueList.php deleted file mode 100644 index 17fbe7c..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Value/CalcRuleValueList.php +++ /dev/null @@ -1,26 +0,0 @@ -implode(' ', $this->aComponents); - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/Color.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/Color.php deleted file mode 100644 index a002760..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Value/Color.php +++ /dev/null @@ -1,182 +0,0 @@ - val1, 'c' => val2, 'h' => val3, …) and output in the second form. - */ -class Color extends CSSFunction -{ - /** - * @param array $aColor - * @param int $iLineNo - */ - public function __construct(array $aColor, $iLineNo = 0) - { - parent::__construct(implode('', array_keys($aColor)), $aColor, ',', $iLineNo); - } - - /** - * @param ParserState $oParserState - * @param bool $bIgnoreCase - * - * @return Color|CSSFunction - * - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - public static function parse(ParserState $oParserState, $bIgnoreCase = false) - { - $aColor = []; - if ($oParserState->comes('#')) { - $oParserState->consume('#'); - $sValue = $oParserState->parseIdentifier(false); - if ($oParserState->strlen($sValue) === 3) { - $sValue = $sValue[0] . $sValue[0] . $sValue[1] . $sValue[1] . $sValue[2] . $sValue[2]; - } elseif ($oParserState->strlen($sValue) === 4) { - $sValue = $sValue[0] . $sValue[0] . $sValue[1] . $sValue[1] . $sValue[2] . $sValue[2] . $sValue[3] - . $sValue[3]; - } - - if ($oParserState->strlen($sValue) === 8) { - $aColor = [ - 'r' => new Size(intval($sValue[0] . $sValue[1], 16), null, true, $oParserState->currentLine()), - 'g' => new Size(intval($sValue[2] . $sValue[3], 16), null, true, $oParserState->currentLine()), - 'b' => new Size(intval($sValue[4] . $sValue[5], 16), null, true, $oParserState->currentLine()), - 'a' => new Size( - round(self::mapRange(intval($sValue[6] . $sValue[7], 16), 0, 255, 0, 1), 2), - null, - true, - $oParserState->currentLine() - ), - ]; - } elseif ($oParserState->strlen($sValue) === 6) { - $aColor = [ - 'r' => new Size(intval($sValue[0] . $sValue[1], 16), null, true, $oParserState->currentLine()), - 'g' => new Size(intval($sValue[2] . $sValue[3], 16), null, true, $oParserState->currentLine()), - 'b' => new Size(intval($sValue[4] . $sValue[5], 16), null, true, $oParserState->currentLine()), - ]; - } else { - throw new UnexpectedTokenException( - 'Invalid hex color value', - $sValue, - 'custom', - $oParserState->currentLine() - ); - } - } else { - $sColorMode = $oParserState->parseIdentifier(true); - $oParserState->consumeWhiteSpace(); - $oParserState->consume('('); - - $bContainsVar = false; - $iLength = $oParserState->strlen($sColorMode); - for ($i = 0; $i < $iLength; ++$i) { - $oParserState->consumeWhiteSpace(); - if ($oParserState->comes('var')) { - $aColor[$sColorMode[$i]] = CSSFunction::parseIdentifierOrFunction($oParserState); - $bContainsVar = true; - } else { - $aColor[$sColorMode[$i]] = Size::parse($oParserState, true); - } - - if ($bContainsVar && $oParserState->comes(')')) { - // With a var argument the function can have fewer arguments - break; - } - - $oParserState->consumeWhiteSpace(); - if ($i < ($iLength - 1)) { - $oParserState->consume(','); - } - } - $oParserState->consume(')'); - - if ($bContainsVar) { - return new CSSFunction($sColorMode, array_values($aColor), ',', $oParserState->currentLine()); - } - } - return new Color($aColor, $oParserState->currentLine()); - } - - /** - * @param float $fVal - * @param float $fFromMin - * @param float $fFromMax - * @param float $fToMin - * @param float $fToMax - * - * @return float - */ - private static function mapRange($fVal, $fFromMin, $fFromMax, $fToMin, $fToMax) - { - $fFromRange = $fFromMax - $fFromMin; - $fToRange = $fToMax - $fToMin; - $fMultiplier = $fToRange / $fFromRange; - $fNewVal = $fVal - $fFromMin; - $fNewVal *= $fMultiplier; - return $fNewVal + $fToMin; - } - - /** - * @return array - */ - public function getColor() - { - return $this->aComponents; - } - - /** - * @param array $aColor - * - * @return void - */ - public function setColor(array $aColor) - { - $this->setName(implode('', array_keys($aColor))); - $this->aComponents = $aColor; - } - - /** - * @return string - */ - public function getColorDescription() - { - return $this->getName(); - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - // Shorthand RGB color values - if ($oOutputFormat->getRGBHashNotation() && implode('', array_keys($this->aComponents)) === 'rgb') { - $sResult = sprintf( - '%02x%02x%02x', - $this->aComponents['r']->getSize(), - $this->aComponents['g']->getSize(), - $this->aComponents['b']->getSize() - ); - return '#' . (($sResult[0] == $sResult[1]) && ($sResult[2] == $sResult[3]) && ($sResult[4] == $sResult[5]) - ? "$sResult[0]$sResult[2]$sResult[4]" : $sResult); - } - return parent::render($oOutputFormat); - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/LineName.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/LineName.php deleted file mode 100644 index 588cb4c..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Value/LineName.php +++ /dev/null @@ -1,67 +0,0 @@ - $aComponents - * @param int $iLineNo - */ - public function __construct(array $aComponents = [], $iLineNo = 0) - { - parent::__construct($aComponents, ' ', $iLineNo); - } - - /** - * @return LineName - * - * @throws UnexpectedTokenException - * @throws UnexpectedEOFException - */ - public static function parse(ParserState $oParserState) - { - $oParserState->consume('['); - $oParserState->consumeWhiteSpace(); - $aNames = []; - do { - if ($oParserState->getSettings()->bLenientParsing) { - try { - $aNames[] = $oParserState->parseIdentifier(); - } catch (UnexpectedTokenException $e) { - if (!$oParserState->comes(']')) { - throw $e; - } - } - } else { - $aNames[] = $oParserState->parseIdentifier(); - } - $oParserState->consumeWhiteSpace(); - } while (!$oParserState->comes(']')); - $oParserState->consume(']'); - return new LineName($aNames, $oParserState->currentLine()); - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - return '[' . parent::render(OutputFormat::createCompact()) . ']'; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/PrimitiveValue.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/PrimitiveValue.php deleted file mode 100644 index 055a439..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Value/PrimitiveValue.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * @internal - */ - const ABSOLUTE_SIZE_UNITS = [ - 'px', 'pt', 'pc', - 'cm', 'mm', 'mozmm', 'in', - 'vh', 'dvh', 'svh', 'lvh', - 'vw', 'vmin', 'vmax', 'rem', - ]; - - /** - * @var array - * - * @internal - */ - const RELATIVE_SIZE_UNITS = ['%', 'em', 'ex', 'ch', 'fr']; - - /** - * @var array - * - * @internal - */ - const NON_SIZE_UNITS = ['deg', 'grad', 'rad', 's', 'ms', 'turn', 'Hz', 'kHz']; - - /** - * @var array>|null - */ - private static $SIZE_UNITS = null; - - /** - * @var float - */ - private $fSize; - - /** - * @var string|null - */ - private $sUnit; - - /** - * @var bool - */ - private $bIsColorComponent; - - /** - * @param float|int|string $fSize - * @param string|null $sUnit - * @param bool $bIsColorComponent - * @param int $iLineNo - */ - public function __construct($fSize, $sUnit = null, $bIsColorComponent = false, $iLineNo = 0) - { - parent::__construct($iLineNo); - $this->fSize = (float)$fSize; - $this->sUnit = $sUnit; - $this->bIsColorComponent = $bIsColorComponent; - } - - /** - * @param bool $bIsColorComponent - * - * @return Size - * - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - public static function parse(ParserState $oParserState, $bIsColorComponent = false) - { - $sSize = ''; - if ($oParserState->comes('-')) { - $sSize .= $oParserState->consume('-'); - } - while (is_numeric($oParserState->peek()) || $oParserState->comes('.') || $oParserState->comes('e', true)) { - if ($oParserState->comes('.')) { - $sSize .= $oParserState->consume('.'); - } elseif ($oParserState->comes('e', true)) { - $sLookahead = $oParserState->peek(1, 1); - if (is_numeric($sLookahead) || $sLookahead === '+' || $sLookahead === '-') { - $sSize .= $oParserState->consume(2); - } else { - break; // Reached the unit part of the number like "em" or "ex" - } - } else { - $sSize .= $oParserState->consume(1); - } - } - - $sUnit = null; - $aSizeUnits = self::getSizeUnits(); - foreach ($aSizeUnits as $iLength => &$aValues) { - $sKey = strtolower($oParserState->peek($iLength)); - if (array_key_exists($sKey, $aValues)) { - if (($sUnit = $aValues[$sKey]) !== null) { - $oParserState->consume($iLength); - break; - } - } - } - return new Size((float)$sSize, $sUnit, $bIsColorComponent, $oParserState->currentLine()); - } - - /** - * @return array> - */ - private static function getSizeUnits() - { - if (!is_array(self::$SIZE_UNITS)) { - self::$SIZE_UNITS = []; - foreach (array_merge(self::ABSOLUTE_SIZE_UNITS, self::RELATIVE_SIZE_UNITS, self::NON_SIZE_UNITS) as $val) { - $iSize = strlen($val); - if (!isset(self::$SIZE_UNITS[$iSize])) { - self::$SIZE_UNITS[$iSize] = []; - } - self::$SIZE_UNITS[$iSize][strtolower($val)] = $val; - } - - krsort(self::$SIZE_UNITS, SORT_NUMERIC); - } - - return self::$SIZE_UNITS; - } - - /** - * @param string $sUnit - * - * @return void - */ - public function setUnit($sUnit) - { - $this->sUnit = $sUnit; - } - - /** - * @return string|null - */ - public function getUnit() - { - return $this->sUnit; - } - - /** - * @param float|int|string $fSize - */ - public function setSize($fSize) - { - $this->fSize = (float)$fSize; - } - - /** - * @return float - */ - public function getSize() - { - return $this->fSize; - } - - /** - * @return bool - */ - public function isColorComponent() - { - return $this->bIsColorComponent; - } - - /** - * Returns whether the number stored in this Size really represents a size (as in a length of something on screen). - * - * @return false if the unit an angle, a duration, a frequency or the number is a component in a Color object. - */ - public function isSize() - { - if (in_array($this->sUnit, self::NON_SIZE_UNITS, true)) { - return false; - } - return !$this->isColorComponent(); - } - - /** - * @return bool - */ - public function isRelative() - { - if (in_array($this->sUnit, self::RELATIVE_SIZE_UNITS, true)) { - return true; - } - if ($this->sUnit === null && $this->fSize != 0) { - return true; - } - return false; - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - $l = localeconv(); - $sPoint = preg_quote($l['decimal_point'], '/'); - $sSize = preg_match("/[\d\.]+e[+-]?\d+/i", (string)$this->fSize) - ? preg_replace("/$sPoint?0+$/", "", sprintf("%f", $this->fSize)) : (string)$this->fSize; - return preg_replace(["/$sPoint/", "/^(-?)0\./"], ['.', '$1.'], $sSize) - . ($this->sUnit === null ? '' : $this->sUnit); - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/URL.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/URL.php deleted file mode 100644 index 92da972..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Value/URL.php +++ /dev/null @@ -1,97 +0,0 @@ -oURL = $oURL; - } - - /** - * @return URL - * - * @throws SourceException - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - public static function parse(ParserState $oParserState) - { - $oAnchor = $oParserState->anchor(); - $sIdentifier = ''; - for ($i = 0; $i < 3; $i++) { - $sChar = $oParserState->parseCharacter(true); - if ($sChar === null) { - break; - } - $sIdentifier .= $sChar; - } - $bUseUrl = $oParserState->streql($sIdentifier, 'url'); - if ($bUseUrl) { - $oParserState->consumeWhiteSpace(); - $oParserState->consume('('); - } else { - $oAnchor->backtrack(); - } - $oParserState->consumeWhiteSpace(); - $oResult = new URL(CSSString::parse($oParserState), $oParserState->currentLine()); - if ($bUseUrl) { - $oParserState->consumeWhiteSpace(); - $oParserState->consume(')'); - } - return $oResult; - } - - /** - * @return void - */ - public function setURL(CSSString $oURL) - { - $this->oURL = $oURL; - } - - /** - * @return CSSString - */ - public function getURL() - { - return $this->oURL; - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - return "url({$this->oURL->render($oOutputFormat)})"; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/Value.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/Value.php deleted file mode 100644 index 4b174db..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Value/Value.php +++ /dev/null @@ -1,221 +0,0 @@ -iLineNo = $iLineNo; - } - - /** - * @param array $aListDelimiters - * - * @return RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string - * - * @throws UnexpectedTokenException - * @throws UnexpectedEOFException - */ - public static function parseValue(ParserState $oParserState, array $aListDelimiters = []) - { - /** @var array $aStack */ - $aStack = []; - $oParserState->consumeWhiteSpace(); - //Build a list of delimiters and parsed values - while ( - !($oParserState->comes('}') || $oParserState->comes(';') || $oParserState->comes('!') - || $oParserState->comes(')') - || $oParserState->comes('\\') - || $oParserState->isEnd()) - ) { - if (count($aStack) > 0) { - $bFoundDelimiter = false; - foreach ($aListDelimiters as $sDelimiter) { - if ($oParserState->comes($sDelimiter)) { - array_push($aStack, $oParserState->consume($sDelimiter)); - $oParserState->consumeWhiteSpace(); - $bFoundDelimiter = true; - break; - } - } - if (!$bFoundDelimiter) { - //Whitespace was the list delimiter - array_push($aStack, ' '); - } - } - array_push($aStack, self::parsePrimitiveValue($oParserState)); - $oParserState->consumeWhiteSpace(); - } - // Convert the list to list objects - foreach ($aListDelimiters as $sDelimiter) { - $iStackLength = count($aStack); - if ($iStackLength === 1) { - return $aStack[0]; - } - $aNewStack = []; - for ($iStartPosition = 0; $iStartPosition < $iStackLength; ++$iStartPosition) { - if ($iStartPosition === ($iStackLength - 1) || $sDelimiter !== $aStack[$iStartPosition + 1]) { - $aNewStack[] = $aStack[$iStartPosition]; - continue; - } - $iLength = 2; //Number of elements to be joined - for ($i = $iStartPosition + 3; $i < $iStackLength; $i += 2, ++$iLength) { - if ($sDelimiter !== $aStack[$i]) { - break; - } - } - $oList = new RuleValueList($sDelimiter, $oParserState->currentLine()); - for ($i = $iStartPosition; $i - $iStartPosition < $iLength * 2; $i += 2) { - $oList->addListComponent($aStack[$i]); - } - $aNewStack[] = $oList; - $iStartPosition += $iLength * 2 - 2; - } - $aStack = $aNewStack; - } - if (!isset($aStack[0])) { - throw new UnexpectedTokenException( - " {$oParserState->peek()} ", - $oParserState->peek(1, -1) . $oParserState->peek(2), - 'literal', - $oParserState->currentLine() - ); - } - return $aStack[0]; - } - - /** - * @param bool $bIgnoreCase - * - * @return CSSFunction|string - * - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - public static function parseIdentifierOrFunction(ParserState $oParserState, $bIgnoreCase = false) - { - $oAnchor = $oParserState->anchor(); - $mResult = $oParserState->parseIdentifier($bIgnoreCase); - - if ($oParserState->comes('(')) { - $oAnchor->backtrack(); - if ($oParserState->streql('url', $mResult)) { - $mResult = URL::parse($oParserState); - } elseif ( - $oParserState->streql('calc', $mResult) - || $oParserState->streql('-webkit-calc', $mResult) - || $oParserState->streql('-moz-calc', $mResult) - ) { - $mResult = CalcFunction::parse($oParserState); - } else { - $mResult = CSSFunction::parse($oParserState, $bIgnoreCase); - } - } - - return $mResult; - } - - /** - * @return CSSFunction|CSSString|LineName|Size|URL|string - * - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - * @throws SourceException - */ - public static function parsePrimitiveValue(ParserState $oParserState) - { - $oValue = null; - $oParserState->consumeWhiteSpace(); - if ( - is_numeric($oParserState->peek()) - || ($oParserState->comes('-.') - && is_numeric($oParserState->peek(1, 2))) - || (($oParserState->comes('-') || $oParserState->comes('.')) && is_numeric($oParserState->peek(1, 1))) - ) { - $oValue = Size::parse($oParserState); - } elseif ($oParserState->comes('#') || $oParserState->comes('rgb', true) || $oParserState->comes('hsl', true)) { - $oValue = Color::parse($oParserState); - } elseif ($oParserState->comes("'") || $oParserState->comes('"')) { - $oValue = CSSString::parse($oParserState); - } elseif ($oParserState->comes("progid:") && $oParserState->getSettings()->bLenientParsing) { - $oValue = self::parseMicrosoftFilter($oParserState); - } elseif ($oParserState->comes("[")) { - $oValue = LineName::parse($oParserState); - } elseif ($oParserState->comes("U+")) { - $oValue = self::parseUnicodeRangeValue($oParserState); - } else { - $sNextChar = $oParserState->peek(1); - try { - $oValue = self::parseIdentifierOrFunction($oParserState); - } catch (UnexpectedTokenException $e) { - if (\in_array($sNextChar, ['+', '-', '*', '/'], true)) { - $oValue = $oParserState->consume(1); - } else { - throw $e; - } - } - } - $oParserState->consumeWhiteSpace(); - return $oValue; - } - - /** - * @return CSSFunction - * - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - private static function parseMicrosoftFilter(ParserState $oParserState) - { - $sFunction = $oParserState->consumeUntil('(', false, true); - $aArguments = Value::parseValue($oParserState, [',', '=']); - return new CSSFunction($sFunction, $aArguments, ',', $oParserState->currentLine()); - } - - /** - * @return string - * - * @throws UnexpectedEOFException - * @throws UnexpectedTokenException - */ - private static function parseUnicodeRangeValue(ParserState $oParserState) - { - $iCodepointMaxLength = 6; // Code points outside BMP can use up to six digits - $sRange = ""; - $oParserState->consume("U+"); - do { - if ($oParserState->comes('-')) { - $iCodepointMaxLength = 13; // Max length is 2 six digit code points + the dash(-) between them - } - $sRange .= $oParserState->consume(1); - } while (strlen($sRange) < $iCodepointMaxLength && preg_match("/[A-Fa-f0-9\?-]/", $oParserState->peek())); - return "U+{$sRange}"; - } - - /** - * @return int - */ - public function getLineNo() - { - return $this->iLineNo; - } -} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/ValueList.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/ValueList.php deleted file mode 100644 index 80b26f9..0000000 --- a/dompdf/vendor/sabberworm/php-css-parser/src/Value/ValueList.php +++ /dev/null @@ -1,108 +0,0 @@ - - */ - protected $aComponents; - - /** - * @var string - */ - protected $sSeparator; - - /** - * phpcs:ignore Generic.Files.LineLength - * @param array|RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string $aComponents - * @param string $sSeparator - * @param int $iLineNo - */ - public function __construct($aComponents = [], $sSeparator = ',', $iLineNo = 0) - { - parent::__construct($iLineNo); - if (!is_array($aComponents)) { - $aComponents = [$aComponents]; - } - $this->aComponents = $aComponents; - $this->sSeparator = $sSeparator; - } - - /** - * @param RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string $mComponent - * - * @return void - */ - public function addListComponent($mComponent) - { - $this->aComponents[] = $mComponent; - } - - /** - * @return array - */ - public function getListComponents() - { - return $this->aComponents; - } - - /** - * @param array $aComponents - * - * @return void - */ - public function setListComponents(array $aComponents) - { - $this->aComponents = $aComponents; - } - - /** - * @return string - */ - public function getListSeparator() - { - return $this->sSeparator; - } - - /** - * @param string $sSeparator - * - * @return void - */ - public function setListSeparator($sSeparator) - { - $this->sSeparator = $sSeparator; - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(new OutputFormat()); - } - - /** - * @param OutputFormat|null $oOutputFormat - * - * @return string - */ - public function render($oOutputFormat) - { - return $oOutputFormat->implode( - $oOutputFormat->spaceBeforeListArgumentSeparator($this->sSeparator) . $this->sSeparator - . $oOutputFormat->spaceAfterListArgumentSeparator($this->sSeparator), - $this->aComponents - ); - } -} diff --git a/front/config.form.php b/front/config.form.php index 42332a0..b62e2eb 100644 --- a/front/config.form.php +++ b/front/config.form.php @@ -1,8 +1,7 @@ showFormProtocolsmanager(); unset($_SESSION["menu_mode"]); + Html::footer(); ?> - \ No newline at end of file diff --git a/front/generate.form.php b/front/generate.form.php index 3a7e5af..87dfe31 100644 --- a/front/generate.form.php +++ b/front/generate.form.php @@ -1,5 +1,6 @@ tableExists($name)) { - if (!$DB->query($schema)) { - Toolbox::logInFile('php-errors', "Error creating table $name: " . $DB->error() . "\n"); - return; - } + $DB->doQuery($schema); foreach ($inserts as $insert) { - if (!$DB->query($insert)) { - Toolbox::logInFile('php-errors', "Error inserting defaults for $name: " . $DB->error() . "\n"); - } + $DB->doQuery($insert); } } }; - // Profiles table + // ── Profiles ────────────────────────────────────────────────────────── $createTable( 'glpi_plugin_protocolsmanager_profiles', - "CREATE TABLE glpi_plugin_protocolsmanager_profiles ( - id INT(11) NOT NULL AUTO_INCREMENT, - profile_id INT(11), - plugin_conf CHAR(1) COLLATE utf8_unicode_ci DEFAULT NULL, - tab_access CHAR(1) COLLATE utf8_unicode_ci DEFAULT NULL, - make_access CHAR(1) COLLATE utf8_unicode_ci DEFAULT NULL, - delete_access CHAR(1) COLLATE utf8_unicode_ci DEFAULT NULL, - PRIMARY KEY (id) - ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8_unicode_ci", + "CREATE TABLE `glpi_plugin_protocolsmanager_profiles` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `profile_id` INT UNSIGNED DEFAULT NULL, + `plugin_conf` CHAR(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `tab_access` CHAR(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `make_access` CHAR(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `delete_access` CHAR(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", [ sprintf( - "INSERT INTO glpi_plugin_protocolsmanager_profiles (profile_id, plugin_conf, tab_access, make_access, delete_access) + "INSERT INTO `glpi_plugin_protocolsmanager_profiles` + (`profile_id`, `plugin_conf`, `tab_access`, `make_access`, `delete_access`) VALUES (%d, 'w', 'w', 'w', 'w')", - $_SESSION['glpiactiveprofile']['id'] ?? 0 + (int)($_SESSION['glpiactiveprofile']['id'] ?? 0) ) ] ); - // Config table + // ── Config (templates) ──────────────────────────────────────────────── $createTable( 'glpi_plugin_protocolsmanager_config', - "CREATE TABLE glpi_plugin_protocolsmanager_config ( - id INT(11) NOT NULL AUTO_INCREMENT, - name VARCHAR(255), - title VARCHAR(255), - font VARCHAR(255), - fontsize VARCHAR(255), - logo VARCHAR(255), - logo_width INT(11) DEFAULT NULL, - logo_height INT(11) DEFAULT NULL, - content TEXT, - footer TEXT, - city VARCHAR(255), - serial_mode INT(2), - column1 VARCHAR(255), - column2 VARCHAR(255), - orientation VARCHAR(10), - breakword INT(2), - email_mode INT(2), - upper_content TEXT, - email_template INT(2), - author_name VARCHAR(255), - author_state INT(2), - PRIMARY KEY (id) - ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8_unicode_ci", + "CREATE TABLE `glpi_plugin_protocolsmanager_config` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) DEFAULT NULL, + `title` VARCHAR(255) DEFAULT NULL, + `font` VARCHAR(255) DEFAULT NULL, + `fontsize` VARCHAR(10) DEFAULT NULL, + `logo` VARCHAR(255) DEFAULT NULL, + `logo_width` INT UNSIGNED DEFAULT NULL, + `logo_height` INT UNSIGNED DEFAULT NULL, + `content` TEXT, + `footer` TEXT, + `city` VARCHAR(255) DEFAULT NULL, + `serial_mode` TINYINT UNSIGNED DEFAULT 1, + `column1` VARCHAR(255) DEFAULT NULL, + `column2` VARCHAR(255) DEFAULT NULL, + `orientation` VARCHAR(10) DEFAULT NULL, + `breakword` TINYINT UNSIGNED DEFAULT 1, + `email_mode` TINYINT UNSIGNED DEFAULT 2, + `upper_content` TEXT, + `email_template` INT UNSIGNED DEFAULT NULL, + `author_name` VARCHAR(255) DEFAULT NULL, + `author_state` TINYINT UNSIGNED DEFAULT 1, + `date_format` TINYINT UNSIGNED DEFAULT 0, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", [ - "INSERT INTO glpi_plugin_protocolsmanager_config - (name, title, font, fontsize, content, footer, city, serial_mode, orientation, breakword, email_mode, author_name, author_state) + "INSERT INTO `glpi_plugin_protocolsmanager_config` + (`name`, `title`, `font`, `fontsize`, `content`, `footer`, `city`, + `serial_mode`, `orientation`, `breakword`, `email_mode`, `author_name`, `author_state`) VALUES ('Equipment report', 'Certificate of delivery of {owner}', - 'Roboto', - '9', + 'Helvetica', '9', 'User: \\n I have read the terms of use of IT equipment in the Example Company.', 'Example Company \\n Example Street 21 \\n 01-234 Example City', - 'Example city', - 1, - 'Portrait', - 1, - 2, - 'Test Division', - 1)", - "INSERT INTO glpi_plugin_protocolsmanager_config - (name, title, font, fontsize, content, footer, city, serial_mode, orientation, breakword, email_mode, author_name, author_state) + 'Example city', 1, 'Portrait', 1, 2, 'Test Division', 1)", + "INSERT INTO `glpi_plugin_protocolsmanager_config` + (`name`, `title`, `font`, `fontsize`, `content`, `footer`, `city`, + `serial_mode`, `orientation`, `breakword`, `email_mode`, `author_name`, `author_state`) VALUES ('Equipment report 2', 'Certificate of delivery of {owner}', - 'Roboto', - '9', + 'Helvetica', '9', 'User: \\n I have read the terms of use of IT equipment in the Example Company.', 'Example Company \\n Example Street 21 \\n 01-234 Example City', - 'Example city', - 1, - 'Portrait', - 1, - 2, - 'Test Division', - 1)" + 'Example city', 1, 'Portrait', 1, 2, 'Test Division', 1)" ] ); - // Email config table + // ── Email config ────────────────────────────────────────────────────── $createTable( 'glpi_plugin_protocolsmanager_emailconfig', - "CREATE TABLE glpi_plugin_protocolsmanager_emailconfig ( - id INT(11) NOT NULL AUTO_INCREMENT, - tname VARCHAR(255), - send_user INT(2), - email_content TEXT, - email_subject VARCHAR(255), - email_footer VARCHAR(255), - recipients VARCHAR(255), - PRIMARY KEY (id) - ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8_unicode_ci", + "CREATE TABLE `glpi_plugin_protocolsmanager_emailconfig` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `tname` VARCHAR(255) DEFAULT NULL, + `send_user` TINYINT UNSIGNED DEFAULT 2, + `email_content` TEXT, + `email_subject` VARCHAR(255) DEFAULT NULL, + `email_footer` VARCHAR(255) DEFAULT NULL, + `recipients` TEXT DEFAULT NULL, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", [ - "INSERT INTO glpi_plugin_protocolsmanager_emailconfig - (tname, send_user, email_content, email_subject, recipients) + "INSERT INTO `glpi_plugin_protocolsmanager_emailconfig` + (`tname`, `send_user`, `email_content`, `email_subject`, `recipients`) VALUES ('Email default', 2, 'Testmail', 'Testmail', 'Testmail')" ] ); - // Protocols table + // ── Protocols ───────────────────────────────────────────────────────── + // NOTE: DATETIME is deprecated in GLPI 11 — use TIMESTAMP instead. + // GLPI raises a WARNING for DATETIME columns and requires running + // "php bin/console migration:timestamps" to migrate them. + // This table uses TIMESTAMP from the start to avoid the warning. $createTable( 'glpi_plugin_protocolsmanager_protocols', - "CREATE TABLE glpi_plugin_protocolsmanager_protocols ( - id INT(11) NOT NULL AUTO_INCREMENT, - name VARCHAR(255), - user_id INT(11), - gen_date DATETIME, - author VARCHAR(255), - document_id INT(11), - document_type VARCHAR(255), - PRIMARY KEY (id) - ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8_unicode_ci" + "CREATE TABLE `glpi_plugin_protocolsmanager_protocols` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) DEFAULT NULL, + `user_id` INT UNSIGNED DEFAULT NULL, + `gen_date` TIMESTAMP NULL DEFAULT NULL, + `author` VARCHAR(255) DEFAULT NULL, + `document_id` INT UNSIGNED DEFAULT NULL, + `document_type` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci" ); - // Update config table fields if upgrading from older versions + // ── Migration: add fields missing from older installs ───────────────── $fieldsToAdd = [ - 'author_name' => "ALTER TABLE glpi_plugin_protocolsmanager_config ADD author_name VARCHAR(255) AFTER email_template", - 'author_state' => "ALTER TABLE glpi_plugin_protocolsmanager_config ADD author_state INT(2) AFTER author_name", - 'title' => "ALTER TABLE glpi_plugin_protocolsmanager_config ADD title VARCHAR(255) AFTER name", - 'logo_width' => "ALTER TABLE glpi_plugin_protocolsmanager_config ADD logo_width INT(11) DEFAULT NULL AFTER logo", - 'logo_height' => "ALTER TABLE glpi_plugin_protocolsmanager_config ADD logo_height INT(11) DEFAULT NULL AFTER logo_width" + 'author_name' => "ALTER TABLE `glpi_plugin_protocolsmanager_config` ADD `author_name` VARCHAR(255) DEFAULT NULL AFTER `email_template`", + 'author_state' => "ALTER TABLE `glpi_plugin_protocolsmanager_config` ADD `author_state` TINYINT UNSIGNED DEFAULT 1 AFTER `author_name`", + 'title' => "ALTER TABLE `glpi_plugin_protocolsmanager_config` ADD `title` VARCHAR(255) DEFAULT NULL AFTER `name`", + 'logo_width' => "ALTER TABLE `glpi_plugin_protocolsmanager_config` ADD `logo_width` INT UNSIGNED DEFAULT NULL AFTER `logo`", + 'logo_height' => "ALTER TABLE `glpi_plugin_protocolsmanager_config` ADD `logo_height` INT UNSIGNED DEFAULT NULL AFTER `logo_width`", + 'date_format' => "ALTER TABLE `glpi_plugin_protocolsmanager_config` ADD `date_format` TINYINT UNSIGNED DEFAULT 0 AFTER `author_state`", ]; + foreach ($fieldsToAdd as $field => $sql) { if (!$DB->fieldExists('glpi_plugin_protocolsmanager_config', $field)) { - if (!$DB->query($sql)) { - Toolbox::logInFile('php-errors', "Error adding field $field: " . $DB->error() . "\n"); - } + $DB->doQuery($sql); + } + } + + // ── Migration: recipients VARCHAR(255) → TEXT on existing installs ───── + if ($DB->tableExists('glpi_plugin_protocolsmanager_emailconfig')) { + $col = $DB->request([ + 'SELECT' => ['DATA_TYPE'], + 'FROM' => 'information_schema.COLUMNS', + 'WHERE' => [ + 'TABLE_SCHEMA' => new \QueryExpression('DATABASE()'), + 'TABLE_NAME' => 'glpi_plugin_protocolsmanager_emailconfig', + 'COLUMN_NAME' => 'recipients', + ], + ])->current(); + if ($col && strtolower($col['DATA_TYPE'] ?? '') === 'varchar') { + $DB->doQuery("ALTER TABLE `glpi_plugin_protocolsmanager_emailconfig` + MODIFY `recipients` TEXT DEFAULT NULL"); + } + } + + // ── Migration: DATETIME → TIMESTAMP on existing installs ────────────── + // GLPI 11 deprecates DATETIME. Migrate gen_date if it is still DATETIME. + if ($DB->tableExists('glpi_plugin_protocolsmanager_protocols')) { + $col = $DB->request([ + 'SELECT' => ['DATA_TYPE'], + 'FROM' => 'information_schema.COLUMNS', + 'WHERE' => [ + 'TABLE_SCHEMA' => new \QueryExpression('DATABASE()'), + 'TABLE_NAME' => 'glpi_plugin_protocolsmanager_protocols', + 'COLUMN_NAME' => 'gen_date', + ], + ])->current(); + if ($col && strtolower($col['DATA_TYPE'] ?? '') === 'datetime') { + $DB->doQuery("ALTER TABLE `glpi_plugin_protocolsmanager_protocols` + MODIFY `gen_date` TIMESTAMP NULL DEFAULT NULL"); } } $migration->executeMigration(); + return true; } /** - * Uninstall the plugin + * Uninstall the plugin — drops all plugin tables. */ function plugin_protocolsmanager_uninstall(): bool { global $DB; + $tables = [ 'glpi_plugin_protocolsmanager_protocols', 'glpi_plugin_protocolsmanager_config', 'glpi_plugin_protocolsmanager_profiles', - 'glpi_plugin_protocolsmanager_emailconfig' + 'glpi_plugin_protocolsmanager_emailconfig', ]; + // Remove logo files uploaded to GLPI_PICTURE_DIR. + if ($DB->tableExists('glpi_plugin_protocolsmanager_config')) { + foreach ($DB->request(['SELECT' => ['logo'], 'FROM' => 'glpi_plugin_protocolsmanager_config']) as $row) { + if (!empty($row['logo'])) { + $logoPath = GLPI_PICTURE_DIR . '/' . $row['logo']; + if (file_exists($logoPath)) { + @unlink($logoPath); + } + } + } + } + + // Remove generated PDF files from GLPI_UPLOAD_DIR. + if ($DB->tableExists('glpi_plugin_protocolsmanager_protocols')) { + foreach ($DB->request(['SELECT' => ['name'], 'FROM' => 'glpi_plugin_protocolsmanager_protocols']) as $row) { + if (!empty($row['name']) && $row['name'] !== 'pending') { + $pdfPath = GLPI_UPLOAD_DIR . '/' . $row['name']; + if (file_exists($pdfPath)) { + @unlink($pdfPath); + } + } + } + } + foreach ($tables as $table) { - $DB->query("DROP TABLE IF EXISTS `$table`"); + if ($DB->tableExists($table)) { + $DB->doQuery("DROP TABLE IF EXISTS `{$table}`"); + } } return true; -} \ No newline at end of file +} + +/** + * Returns the rights row for a profile, or [] if the table doesn't exist yet. + */ +function plugin_protocolsmanager_getRights(?int $profile_id = null): array +{ + global $DB; + + if (!$DB->tableExists('glpi_plugin_protocolsmanager_profiles')) { + return []; + } + + return $DB->request([ + 'FROM' => 'glpi_plugin_protocolsmanager_profiles', + 'WHERE' => ['profile_id' => $profile_id ?? 0], + ])->current() ?: []; +} diff --git a/inc/config.class.php b/inc/config.class.php index c62f0e9..82590ab 100644 --- a/inc/config.class.php +++ b/inc/config.class.php @@ -1,8 +1,12 @@

".__("Access denied").""; + echo "


".__("Access denied")."
"; } } static function checkRights() { global $DB; - $active_profile = $_SESSION['glpiactiveprofile']['id']; - $req = $DB->request('glpi_plugin_protocolsmanager_profiles', - ['profile_id' => $active_profile]); + $active_profile = $_SESSION['glpiactiveprofile']['id'] ?? 0; + if ($active_profile <= 0) { return ''; } + + // Updated DB->request syntax + $req = $DB->request([ + 'FROM' => 'glpi_plugin_protocolsmanager_profiles', + 'WHERE' => ['profile_id' => $active_profile] + ]); if($row = $req->current()) { $plugin_conf = $row['plugin_conf']; @@ -57,9 +66,11 @@ static function displayContentConfig() { $edit_id = $_POST['edit_id']; $mode = $edit_id; - $req = $DB->request( - 'glpi_plugin_protocolsmanager_config', - ['id' => $edit_id ]); + // Updated DB->request syntax + $req = $DB->request([ + 'FROM' => 'glpi_plugin_protocolsmanager_config', + 'WHERE' => ['id' => $edit_id ] + ]); if ($row = $req->current()) { $template_uppercontent = $row["upper_content"]; @@ -76,8 +87,9 @@ static function displayContentConfig() { $breakword = $row["breakword"]; $email_mode = $row["email_mode"]; $email_template = $row["email_template"]; - $author_name = $row["author_name"]; + $author_name = $row["author_name"]; $author_state = $row["author_state"]; + $date_format = (int)($row["date_format"] ?? 0); // Récupérer width/height du logo si présents $logo_width = isset($row["logo_width"]) ? $row["logo_width"] : ''; @@ -101,19 +113,18 @@ static function displayContentConfig() { $email_template = 1; $author_name = ''; $author_state = 1; - $logo_width = ''; - $logo_height = ''; + $date_format = 0; + $logo_width = ''; + $logo_height = ''; } - $fonts = array('Courier' => 'Courier', - 'Helvetica' => 'Helvetica', - 'Times' => 'Times', - 'Istok' => 'Istok', - 'UbuntuMono' => 'UbuntuMono', - 'Roboto' => 'Roboto', - 'Liberation-Sans' => 'Liberation-Sans', - 'DroidSerif' => 'DroidSerif', - 'DejaVu Sans' => 'DejaVu Sans'); + // TCPDF native fonts bundled in GLPI vendor/tecnickcom/tcpdf/fonts/ + $fonts = array( + 'Helvetica' => 'Helvetica', + 'Times' => 'Times', + 'Courier' => 'Courier', + 'DejaVu Sans' => 'DejaVu Sans (Unicode)', + ); $fontsizes = array('7' => '7', '8' => '8', @@ -122,37 +133,63 @@ static function displayContentConfig() { '11' => '11', '12' => '12'); - $orientations = array('Portrait' => 'Portrait', - 'Landscape' => 'Landscape'); + $orientations = array( + 'Portrait' => __('Portrait', 'protocolsmanager'), + 'Landscape' => __('Landscape', 'protocolsmanager') + ); if (!isset($font)) { - $font='freesans'; + $font='Helvetica'; } - echo "
"; - echo "
"; + // ── Tab navigation (GLPI nav-tabs) ────────────────────────────── + echo "
"; - + echo ""; + echo ""; + echo "
"; - echo ""; + echo ""; echo ""; - echo ""; + echo ""; + + // ── Section header: Template settings ─────────────────────────── + echo "
"; + echo "
" + . "" + . "

" + . (__($mode ? 'Edit' : 'Create') . ' ' . __('template', 'protocolsmanager')) + . "

" + . "" + . "" . __('Help', 'protocolsmanager') . "" + . "
"; + echo "
"; echo ""; - echo ""; - echo ""; - echo ""; + // Added htmlescape for XSS protection + echo ""; + echo ""; echo ""; - echo ""; - echo ""; + echo "> " . __('On', 'protocolsmanager') . ""; echo ""; + echo "> " . __('Off', 'protocolsmanager') . ""; - echo ""; - echo ""; + // Added htmlescape for XSS protection + echo ""; + echo ""; + echo ""; echo ""; - echo ""; + echo ""; echo ""; - echo ""; + echo ""; echo ""; + + echo ""; + echo ""; + echo ""; + echo ""; + echo ">, " . __('Serial and inventory number in separate columns', 'protocolsmanager') . ""; echo ""; - echo ""; + echo ""; + echo ""; // Nouveau champ largeur logo - echo ""; + // Added htmlescape for XSS protection + echo ""; // Nouveau champ hauteur logo - echo ""; + // Added htmlescape for XSS protection + echo ""; // ... suite du formulaire ... - echo ""; + echo ""; + echo "> " . __('On', 'protocolsmanager') . ""; echo ""; - echo ""; + echo ""; /** @@ -272,12 +337,14 @@ static function displayContentConfig() { if($author_state == 2) { echo ""; - echo ""; + // Added htmlescape for XSS protection + echo ""; } else { echo ""; - echo ""; + // Added htmlescape for XSS protection + echo ""; } echo ""; @@ -286,12 +353,48 @@ static function displayContentConfig() { */ echo "
".__('Create')." ".__('template')."
".__('Template name')."*
".__('Document title', 'protocolsmanager')."*
".__('Template name', 'protocolsmanager')."*
".__('Document title', 'protocolsmanager')."*
".__('You can use {owner} here.', 'protocolsmanager')."
Font
" . __('Font', 'protocolsmanager') . "
Font size" . __('Font size', 'protocolsmanager') . "
Word breaking" . __('Word breaking', 'protocolsmanager') . "
".__('City')."
".__('Upper Content')."
"; + echo "
" + . "" + . "" . __('Document content', 'protocolsmanager') . "" + . "
"; + echo "
".__('City')."
".__('Upper Content', 'protocolsmanager')."
".__('You can use {owner} or {admin} here.', 'protocolsmanager')."
".__('Content')."
".__('Content')."
".__('You can use {owner} or {admin} here.', 'protocolsmanager')."
".__('Footer')."
".__('Footer', 'protocolsmanager')."
".__('Orientation')."
" . __('Date format', 'protocolsmanager') . "
".__('Serial number')."
".__('Logo').""; + echo ">, " . __('Serial or inventory number (if serial is empty)', 'protocolsmanager') . "
"; + echo "
" + . "" + . "" . __('Logo & appearance', 'protocolsmanager') . "" + . "
"; + echo "
".__('Logo').""; // id for JS auto-fill if (isset($logo) && $logo != '') { $full_img_name = GLPI_PICTURE_DIR . '/' . $logo; if (file_exists($full_img_name)) { @@ -232,36 +291,42 @@ static function displayContentConfig() { } echo "  ".$img_tag; - echo "    ".__('Delete')." ".__('File'); + // Added htmlescape for XSS protection + echo "    ".__('Delete')." ".__('File'); } } echo "
".__('Logo width (px)')."
".__('Logo width (px)', 'protocolsmanager')."
".__('Logo height (px)')."
".__('Logo height (px)', 'protocolsmanager')."
".__('Enable email autosending').""; + echo "
" + . "" + . "" . __('Email settings', 'protocolsmanager') . "" + . "
"; + echo "
".__('Enable email autosending', 'protocolsmanager')."
".__('Email template')."
".__('Email template', 'protocolsmanager')."
"; - echo ""; + echo ""; // card-body + echo "
"; + // Save + echo ""; Html::closeForm(); - echo "
"; + echo "
"; // card-footer + echo "
"; // card + echo ""; // center echo "
"; + // ── Auto-fill logo dimensions when a file is selected ──────── + echo "\n"; self::showConfigs(); } @@ -299,26 +402,39 @@ static function displayContentConfig() { static function DisplayContentEmail() { global $DB, $CFG_GLPI; - echo "
"; - echo ""; + // ── Tab navigation (GLPI nav-tabs) ────────────────────────────── + echo "
"; - + echo ""; + echo ""; + if (isset($_POST["email_edit_id"])) { $email_edit_id = $_POST['email_edit_id']; - $req = $DB->request( - 'glpi_plugin_protocolsmanager_emailconfig', - ['id' => $email_edit_id ]); + // Updated DB->request syntax + $req = $DB->request([ + 'FROM' => 'glpi_plugin_protocolsmanager_emailconfig', + 'WHERE' => ['id' => $email_edit_id ] + ]); if ($row = $req->current()) { $tname = $row["tname"]; @@ -340,27 +456,50 @@ static function DisplayContentEmail() { echo "
"; echo ""; + echo "
"; + echo "
" + . "" + . "

" + . (__($email_edit_id ? 'Edit' : 'Create') . ' ' . __('email template', 'protocolsmanager')) + . "

" + . "" + . "" . __('Help', 'protocolsmanager') . "" + . "
"; + echo "
"; echo ""; - echo ""; - echo ""; - echo ""; + echo ""; + echo "> " . __('Send to user', 'protocolsmanager') . ""; echo ""; - echo ""; - echo ""; - echo ""; + echo "> " . __('Don\'t send to user', 'protocolsmanager') . ""; + // Added htmlescape for XSS protection + echo ""; + echo ""; + echo ""; + echo "
".__('Create')." ".__('email template')."
".__('Template name')."*
".__('Send to user')."".__('Template name', 'protocolsmanager')."*
".__('Send to user', 'protocolsmanager')."
".__('Email content')."*
".__('Email subject')."*
".__('Add emails - use ; to separate')."*
".__('Email content', 'protocolsmanager')."*
".__('Email subject', 'protocolsmanager')."*
".__('Add emails - use ; to separate', 'protocolsmanager')."*
"; + // Added htmlescape for XSS protection + echo ""; echo ""; - echo ""; - echo ""; + echo ""; // card-body + echo "
"; + echo ""; Html::closeForm(); - echo "
"; + echo "
"; // card-footer + echo "
"; // card + echo ""; // center echo "
"; self::showEmailConfigs(); } @@ -369,16 +508,17 @@ static function saveConfigs() { global $DB, $CFG_GLPI; if (empty($_POST["template_name"]) || empty($_POST["email_template"]) || empty($_POST["title"])) { - Session::AddMessageAfterRedirect('Fill mandatory fields', 'WARNING', true); + Session::addMessageAfterRedirect(__('Fill mandatory fields', 'protocolsmanager'), false, WARNING); } else { - // en général c'est soient des champs obligatoires soit du texte par défaut pas changeables mais avec une valeur différent de null + // No addslashes() needed here. GLPI 11 DB layer handles sanitization. $template_name = $_POST['template_name']; $title = $_POST['title']; $font = $_POST["font"]; $fontsize = $_POST["fontsize"]; - $serial_mode = $_POST["serial_mode"]; - $orientation = $_POST["orientation"]; + $serial_mode = $_POST["serial_mode"]; + $orientation = $_POST["orientation"]; + $date_format = isset($_POST["date_format"]) ? (int)$_POST["date_format"] : 0; if(isset($_POST["template_uppercontent"])) { $template_uppercontent = $_POST['template_uppercontent']; @@ -412,7 +552,18 @@ static function saveConfigs() { $email_template = $_POST["email_template"]; } + // Read existing logo path before uploading — to delete it if replaced. + $existing_logo = null; + if (!empty($mode)) { + $existing_row = $DB->request(['SELECT' => ['logo'], 'FROM' => 'glpi_plugin_protocolsmanager_config', 'WHERE' => ['id' => $mode]])->current(); + $existing_logo = $existing_row['logo'] ?? null; + } $full_img_name = self::uploadImage(); + // If a new logo was uploaded and an old one existed, delete the old file. + if ($full_img_name && $existing_logo && $existing_logo !== $full_img_name) { + $old_path = GLPI_PICTURE_DIR . '/' . $existing_logo; + if (file_exists($old_path)) { @unlink($old_path); } + } if (isset($_POST['img_delete'])) { @@ -443,8 +594,6 @@ static function saveConfigs() { // TODO : concaténé quand les champs sont vides - - //if new template if ($mode == 0) { @@ -461,123 +610,51 @@ static function saveConfigs() { 'font' => $font, 'fontsize' => $fontsize, 'city' => $city, - 'serial_mode' => $serial_mode, - 'orientation' => $orientation, - 'breakword' => $breakword, - 'email_mode' => $email_mode, + 'serial_mode' => $serial_mode, + 'orientation' => $orientation, + 'breakword' => $breakword, + 'email_mode' => $email_mode, 'email_template' => $email_template, - 'author_name' => $author_name, - 'author_state' => $author_state + 'author_name' => $author_name, + 'author_state' => $author_state, + 'date_format' => $date_format, ] ); } - //if edit template + // Edit existing template — single authoritative UPDATE. if ($mode != 0) { - - - // quand c'est séléctionner et qu'on refais sauvegardé - // la valeur est égale à "X\"" au lieu de "X" - - // idéalement checker la value de $email_template - $email_template = preg_replace('/[^A-Za-z0-9\-]/','',$email_template); - - - //if logo is uploaded + // Sanitize email_template id. + $email_template = preg_replace('/[^A-Za-z0-9\-]/', '', $email_template); + + $updateData = [ + 'name' => $template_name, + 'title' => $title, + 'content' => $template_content ?? '', + 'upper_content' => $template_uppercontent ?? '', + 'footer' => $template_footer ?? '', + 'logo_width' => $logo_width, + 'logo_height' => $logo_height, + 'font' => $font, + 'fontsize' => $fontsize, + 'city' => $city ?? '', + 'serial_mode' => $serial_mode, + 'orientation' => $orientation, + 'breakword' => $breakword, + 'email_mode' => $email_mode ?? 2, + 'email_template' => $email_template, + 'author_name' => $author_name, + 'author_state' => $author_state, + 'date_format' => $date_format, + ]; + // Only overwrite logo when a new file was uploaded. if (isset($full_img_name)) { - - $DB->update('glpi_plugin_protocolsmanager_config', [ - 'name' => $template_name, - 'title' => $title, - 'content' => $template_content, - 'upper_content' => $template_uppercontent, - 'footer' => $template_footer, - 'logo' => $full_img_name, - 'logo_width' => $logo_width, - 'logo_height' => $logo_height, - 'font' => $font, - 'fontsize' => $fontsize, - 'city' => $city, - 'serial_mode' => $serial_mode, - 'orientation' => $orientation, - 'breakword' => $breakword, - 'email_mode' => $email_mode, - 'email_template' => $email_template, - 'author_name' => $author_name, - 'author_state' => $author_state - ], [ - 'id' => $mode - ] - ); - } else { - if(!$city) - { - $city = ''; - } - if(!$template_uppercontent) - { - $template_uppercontent = ''; - } - if(!$template_content) - { - $template_content = ''; - } - if(!$template_footer) - { - $template_footer = ''; - } - if(!isset($email_mode)) - { - $DB->update('glpi_plugin_protocolsmanager_config', [ - 'name' => $template_name, - 'title' => $title, - 'content' => $template_content, - 'upper_content' => $template_uppercontent, - 'footer' => $template_footer, - 'logo_width' => $logo_width, - 'logo_height' => $logo_height, - 'font' => $font, - 'fontsize' => $fontsize, - 'city' => $city, - 'serial_mode' => $serial_mode, - 'orientation' => $orientation, - 'breakword' => $breakword, - 'email_template' => $email_template, - 'author_name' => $author_name, - 'author_state' => $author_state - ], [ - 'id' => $mode - ] - ); - } - else { - $DB->update('glpi_plugin_protocolsmanager_config', [ - 'name' => $template_name, - 'title' => $title, - 'content' => $template_content, - 'upper_content' => $template_uppercontent, - 'footer' => $template_footer, - 'logo_width' => $logo_width, - 'logo_height' => $logo_height, - 'font' => $font, - 'fontsize' => $fontsize, - 'city' => $city, - 'serial_mode' => $serial_mode, - 'orientation' => $orientation, - 'breakword' => $breakword, - 'email_mode' => $email_mode, - 'email_template' => $email_template, - 'author_name' => $author_name, - 'author_state' => $author_state - ], [ - 'id' => $mode - ] - ); - } + $updateData['logo'] = $full_img_name; } + $DB->update('glpi_plugin_protocolsmanager_config', $updateData, ['id' => $mode]); } - Session::AddMessageAfterRedirect('Config saved'); + Session::addMessageAfterRedirect(__('Configuration saved.', 'protocolsmanager'), false, INFO); } } @@ -586,10 +663,10 @@ static function saveEmailConfigs() { global $DB, $CFG_GLPI; if (empty($_POST["email_subject"]) || empty($_POST["email_content"]) || empty($_POST["recipients"]) || empty($_POST["tname"])) { - Session::AddMessageAfterRedirect('Fill mandatory fields', 'WARNING', true); + Session::addMessageAfterRedirect(__('Fill mandatory fields', 'protocolsmanager'), false, WARNING); } else { - + // No addslashes() needed here $tname = $_POST["tname"]; $send_user = $_POST["send_user"]; $email_subject = $_POST["email_subject"]; @@ -624,7 +701,7 @@ static function saveEmailConfigs() { } - Session::AddMessageAfterRedirect('Config saved'); + Session::addMessageAfterRedirect(__('Configuration saved.', 'protocolsmanager'), false, INFO); } } @@ -634,58 +711,86 @@ static function showConfigs() { global $DB, $CFG_GLPI; $configs = []; - echo "
"; - echo ""; - echo ""; - echo ""; - echo ""; + echo "
"; + echo "
" + . "" + . "

" . __('Templates') . "

" + . "
"; + echo "
"; + echo "
".__('Templates')."
".__('Name')."".__('Action')."
"; + echo "" + . "" + . "" + . ""; - foreach ($DB->request( - 'glpi_plugin_protocolsmanager_config') as $config_data => $configs) { + // Updated DB->request syntax + foreach ($DB->request(['FROM' => 'glpi_plugin_protocolsmanager_config']) as $config_data => $configs) { - echo ""; + echo ""; $conf_id = $configs['id']; - echo ""; - echo ""; - Html::closeForm(); - echo ""; - Html::closeForm(); + echo ""; } - echo "
" . __('Name') . "" . __('Action') . "
"; - echo $configs['name']; - echo "
" . htmlescape($configs['name']) . " -
"; + // Edit + echo ""; + echo ""; + echo ""; + echo ""; + Html::closeForm(); + // Delete + echo ""; + echo ""; + echo ""; + Html::closeForm(); + echo "
"; + echo ""; // table-responsive + card } static function showEmailConfigs() { global $DB, $CFG_GLPI; $emailconfigs = []; - echo "
"; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; + echo "
"; + echo "
" + . "" + . "

" . __('Email templates', 'protocolsmanager') . "

" + . "
"; + echo "
"; + echo "
".__('Templates')."
".__('Name')."".__('Recipients')."".__('Action')."
"; + echo "" + . "" + . "" + . "" + . ""; - foreach ($DB->request( - 'glpi_plugin_protocolsmanager_emailconfig') as $configs_data => $emailconfigs) { + // Updated DB->request syntax + foreach ($DB->request(['FROM' => 'glpi_plugin_protocolsmanager_emailconfig']) as $configs_data => $emailconfigs) { - echo ""; - echo ""; $email_conf_id = $emailconfigs['id']; - echo ""; - echo ""; - Html::closeForm(); - echo ""; - Html::closeForm(); + echo ""; + echo ""; + echo ""; } - echo "
" . __('Name') . "" . __('Recipients') . "" . __('Action') . "
"; - echo $emailconfigs['tname']; - echo ""; - echo $emailconfigs['recipients']; - echo " -
" . htmlescape($emailconfigs['tname']) . "" . htmlescape($emailconfigs['recipients']) . ""; + echo ""; + echo ""; + echo ""; + echo ""; + Html::closeForm(); + echo ""; + echo ""; + echo ""; + Html::closeForm(); + echo "
"; + echo ""; // table-responsive + card } static function uploadImage() { @@ -697,25 +802,23 @@ static function uploadImage() { if (!$_FILES['logo']['error']) { - if ($_FILES['logo']['type'] == 'image/jpeg' || $_FILES['logo']['type'] == 'image/png' || $_FILES['logo']['type'] == 'image/jpg') { - - $img_name = "logo".time(); - $ext = pathinfo($_FILES['logo']['name'], PATHINFO_EXTENSION); - $full_img_name = $img_name.'.'.$ext; - $img_path = GLPI_PICTURE_DIR . '/' . $full_img_name; - + // Validate real MIME from file content — never trust $_FILES['type']. + $finfo = new \finfo(FILEINFO_MIME_TYPE); + $realMime = $finfo->file($_FILES['logo']['tmp_name']); + if ($realMime === 'image/jpeg' || $realMime === 'image/png') { + $ext = ($realMime === 'image/png') ? 'png' : 'jpg'; + $full_img_name = 'logo' . uniqid('', true) . '.' . $ext; + $img_path = GLPI_PICTURE_DIR . '/' . $full_img_name; move_uploaded_file($_FILES['logo']['tmp_name'], $img_path); - return $full_img_name; - } else { - Session::addMessageAfterRedirect('Wrong file type. Only .jpg and .png files accepted', 'WARNING', true); + Session::addMessageAfterRedirect(__('Wrong file type. Only JPG and PNG files are accepted.', 'protocolsmanager'), false, WARNING); } } else { - Session::addMessageAfterRedirect(__('Unknown error'), 'WARNING', true); + Session::addMessageAfterRedirect(__('Unknown error'), false, WARNING); } } else { - Session::addMessageAfterRedirect('File size too large', 'WARNING', true); + Session::addMessageAfterRedirect(__('File size too large.', 'protocolsmanager'), false, WARNING); } } @@ -724,30 +827,36 @@ static function uploadImage() { static function deleteConfigs() { global $DB; - $conf_id = $_POST['conf_id']; - - $DB->delete( - 'glpi_plugin_protocolsmanager_config', [ - 'id' => $conf_id - ] - ); - + $conf_id = (int)($_POST['conf_id'] ?? 0); + if ($conf_id <= 0) { return; } + $row = $DB->request(['FROM' => 'glpi_plugin_protocolsmanager_config', 'WHERE' => ['id' => $conf_id]])->current(); + if (!$row) { + Session::addMessageAfterRedirect(__('Template not found.', 'protocolsmanager'), false, ERROR); + return; + } + // Delete logo file from disk before removing the DB row. + if (!empty($row['logo'])) { + $logoPath = GLPI_PICTURE_DIR . '/' . $row['logo']; + if (file_exists($logoPath)) { + @unlink($logoPath); + } + } + $DB->delete('glpi_plugin_protocolsmanager_config', ['id' => $conf_id]); } static function deleteEmailConfigs() { global $DB; - $email_conf_id = $_POST['email_conf_id']; - - $DB->delete( - 'glpi_plugin_protocolsmanager_emailconfig', [ - 'id' => $email_conf_id - ] - ); - + $email_conf_id = (int)($_POST['email_conf_id'] ?? 0); + if ($email_conf_id <= 0) { return; } + if (!$DB->request(['FROM' => 'glpi_plugin_protocolsmanager_emailconfig', 'WHERE' => ['id' => $email_conf_id]])->current()) { + Session::addMessageAfterRedirect(__('Email template not found.', 'protocolsmanager'), false, ERROR); + return; + } + $DB->delete('glpi_plugin_protocolsmanager_emailconfig', ['id' => $email_conf_id]); } } -?> +?> \ No newline at end of file diff --git a/inc/generate.class.php b/inc/generate.class.php index e67de78..e5dbb92 100644 --- a/inc/generate.class.php +++ b/inc/generate.class.php @@ -1,964 +1,1186 @@ showContent($item); - } else { - echo "


".__("Access denied")."
"; - } - } - - //check if logged user have rights to plugin - static function checkRights() { - global $DB; - $active_profile = $_SESSION['glpiactiveprofile']['id']; - $req = $DB->request('glpi_plugin_protocolsmanager_profiles', - ['profile_id' => $active_profile]); - - if($row = $req->current()) { - $tab_access = $row['tab_access']; - } - else{ - $tab_access = ""; - } - - return $tab_access; - - } - - //show plugin content - function showContent($item) { - global $DB, $CFG_GLPI; - - - # all other types except for User reports - if (get_class($item) !== "User") { - - // Vérifie que l'objet a bien un ID et un users_id - if (!empty($item->id) && !empty($item->fields["users_id"])) { - $itemid = $item->id; - $tstid = $item->fields["users_id"]; - - $item = new User(); - $item->getFromDB($tstid); - } else { - // Pas d'utilisateur lié - $itemid = null; - $tstid = null; - } - } - - $id = $item->getField('id'); - $type_user = $CFG_GLPI['linkuser_types']; - $field_user = 'users_id'; - $rand = mt_rand(); - $counter = 0; - - echo "
"; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo "
"; - echo ""; - echo "
"; - - // Premier tableau - echo "
"; - $header = ""; - $header .= ""; - $header .= ""; - $header .= ""; - $header .= ""; - $header .= ""; - $header .= ""; - $header .= ""; - echo $header; - - foreach ($type_user as $itemtype) { - if (!($item = getItemForItemtype($itemtype))) { - continue; - } - if ($item->canView()) { - - // il va récupérer toutes les tables du matos - $itemtable = getTableForItemType($itemtype); - - $iterator_params = "SELECT * - FROM $itemtable - WHERE $field_user = $id"; - - if ($item->maybeTemplate()) { - // j'ai du mettre un espace après le " et le and car sinon dans la requete les deux sont collés et ça casse la requête - $iterator_params .= " AND is_template = 0"; - } - - if ($item->maybeDeleted()) { - $iterator_params .= " AND is_deleted = 0"; - } - - $item_iterator = $DB->request($iterator_params); - $type_name = $item->getTypeName(); - $item_iterator->current(); - - foreach ($item_iterator as $data) { - $cansee = $item->can($data["id"], READ); - (empty($data["name"])) ? ($link = $data["id"]) : ($link = $data["name"]); - if ($cansee) { - $link_item = $item::getFormURLWithID($data['id']); - if ($_SESSION["glpiis_ids_visible"] || empty($link)) { - $link = sprintf(__('%1$s (%2$s)'), $link, $data["id"]); - } - $link = "".$link.""; - } - $linktype = ""; - - if ($data[$field_user] == $id) { - $linktype = self::getTypeName(1); - } - - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - - if (isset($data["name"]) && !empty($data["name"])) { - $item_name = $data["name"]; - } - else { - echo ' '; - $item_name = ''; - } - - if (isset($data["id"]) && !empty($data["id"])){ - $ids = $data["id"]; - } else{ - echo " "; - $ids=''; - } - $classes=$itemtype; - - $Owner = new User(); - $Owner->getFromDB($id); - $Author = new User(); - $Author->getFromDB(Session::getLoginUserID()); - // il faut get le template utilisé - // getrawname remplacé https://github.com/glpi-project/glpi/blob/10.0/bugfixes/CHANGELOG.md - // il y avait aussi getRawName() mais je suis pas sur que ça soit vu le changelog - $owner = $Owner->getFriendlyName(); - $author = $Author->getFriendlyName(); - - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - - echo ""; - echo ""; - - - $counter++; - } - - } - - } - - - echo "
".__('Type')."".__('Manufacturer')."".__('Model')."".__('Name')."".__('Serial number')."".__('Inventory number')."".__('Comments')."
"; - echo ""; - echo "$type_name"; - - if (isset($data["manufacturers_id"]) && !empty($data["manufacturers_id"])) { - - $man_id = $data["manufacturers_id"]; - - $req = $DB->request( - 'glpi_manufacturers', - ['id' => $man_id ]); - - if ($row = $req->current()) { - $man_name = $row["name"]; - } - - $man_name = explode(' ',trim($man_name))[0]; - echo $man_name; - } - else { - echo ' '; - $man_name = ''; - } - echo ""; - - $modeltypes = ["computer", "phone", "monitor", "networkequipment", "printer", "peripheral"]; - $mod_name = ''; - - foreach($modeltypes as $prefix) { - if(isset($data[$prefix.'models_id']) && !empty($data[$prefix.'models_id'])) { - $mod_id = $data[$prefix.'models_id']; - - $req2 = $DB->request( - 'glpi_'.$prefix.'models', - ['id' => $mod_id ]); - - if ($row2 = $req2->current()) { - $mod_name = $row2["name"]; - } - - else { - echo ' '; - $mod_name = ''; - } - echo $mod_name; - } - - } - echo "$link"; - - if (isset($data["serial"]) && !empty($data["serial"])) { - $serial = $data["serial"]; - echo $serial; - } else { - echo ' '; - $serial = ''; - } - - echo ""; - - if (isset($data["otherserial"]) && !empty($data["otherserial"])) { - $otherserial = $data["otherserial"]; - echo $otherserial; - } else { - echo ' '; - $otherserial = ''; - } - - echo "
"; - Html::closeForm(); - echo "
"; - - - //send email popup - $conca = ''; - $conca .= ''; - echo $conca; - // fin du popup - - - //add custom row - echo "
"; - - echo "
"; - echo ""; - - echo Html::hidden('_glpi_csrf_token', ['value' => Session::getNewCSRFToken()]); - - echo "
"; - echo ""; - echo "
"; - echo ""; - echo ""; - $header2 = ""; - $header2 .= ""; - $header2 .= ""; - $header2 .= ""; - $header2 .= ""; - $header2 .= ""; - $header2 .= ""; - echo $header2; - - self::getAllForUser($id); - echo "
".__('Name')."".__('Type')."".__('Date')."".__('File')."".__('Creator')."".__('Comment')."".__('Send email')."
"; - Html::closeForm(); - echo "
"; - - return true; - - - } - - static function getAllForUser($id) { - global $DB, $CFG_GLPI; - - $exports = []; - $doc_counter = 0; - - foreach ($DB->request('glpi_plugin_protocolsmanager_protocols', ['user_id' => $id]) as $export_data => $exports) { - - echo ""; - - echo ""; - echo ""; - echo ""; - - echo ""; - $Doc = new Document(); - $Doc->getFromDB($exports['document_id']); - echo $Doc->getLink(); - echo ""; - - echo ""; - echo $exports['document_type']; - echo ""; - - echo ""; - echo $exports['gen_date']; - echo ""; - - echo ""; - echo $Doc->getDownloadLink(); - echo ""; - - echo ""; - echo $exports['author']; - echo ""; - - echo ""; - echo $Doc->getField("comment"); - echo ""; - - echo ""; - echo ""; - echo ""; - - echo ""; - - $doc_counter++; - } - } - - - //make PDF and save to DB - static function makeProtocol() - { - global $DB, $CFG_GLPI; - - $number = $_POST['number']; - $type_name = $_POST['type_name']; - $man_name = $_POST['man_name']; - $mod_name = $_POST['mod_name']; - $serial = $_POST['serial']; - $otherserial = $_POST['otherserial']; - $item_name = $_POST['item_name']; - $owner = $_POST['owner']; - $author = $_POST['author']; - - $doc_no = $_POST['list']; - $id = $_POST['user_id']; - $notes = $_POST['notes']; - - $prot_num = self::getDocNumber(); - - $req = $DB->request( - 'glpi_plugin_protocolsmanager_config', - ['id' => $doc_no ]); - - if ($row = $req->current()) { - $content = nl2br($row["content"]); - $content = str_replace("{cur_date}", date("d.m.Y"), $content); - $content = str_replace("{owner}", $owner, $content); - $content = str_replace("{admin}", $author, $content); - $upper_content = nl2br($row["upper_content"]); - $upper_content = str_replace("{cur_date}", date("d.m.Y"), $upper_content); - $upper_content = str_replace("{owner}", $owner, $upper_content); - $upper_content = str_replace("{admin}", $author, $upper_content); - $footer = nl2br($row["footer"]); - $title = $row["title"]; - $title = str_replace("{owner}", $owner, $title); - $title_template = $row["name"]; - $full_img_name = $row["logo"]; - $font = $row["font"]; - $fontsize = $row["fontsize"]; - $city = $row["city"]; - $serial_mode = $row["serial_mode"]; - $orientation = $row["orientation"]; - $breakword = $row["breakword"]; - $email_mode = $row["email_mode"]; - $email_template = $row["email_template"]; - $author_name = $row["author_name"]; - $author_state = $row["author_state"]; - - $logo_width = isset($row["logo_width"]) ? $row["logo_width"] : null; - $logo_height = isset($row["logo_height"]) ? $row["logo_height"] : null; - } - - $req2 = $DB->request( - 'glpi_plugin_protocolsmanager_emailconfig', - ['id' => $email_template ]); - - if ($row2 = $req2->current()) { - $send_user = $row2["send_user"]; - $email_subject = $row2["email_subject"]; - $email_content = $row2["email_content"]; - $recipients = $row2["recipients"]; - } - - $comments = $_POST['comments']; - - if (!isset($font) || empty($font)) { - $font = 'dejavusans'; - } - - if (!isset($fontsize) || empty($fontsize)) { - $fontsize = '9'; - } - - if (!isset($city) || empty($city)) { - $city = ''; - } - - if (!isset($email_content) || empty($email_content)) { - $email_content = ''; - } - $email_content = str_replace("{owner}", $owner, $email_content); - $email_content = str_replace("{admin}", $author, $email_content); - $email_content = str_replace("{cur_date}", date("d.m.Y"), $email_content); - - if (!isset($email_subject) || empty($email_subject)) { - $email_subject = ''; - } - - $email_subject = str_replace("{owner}", $owner, $email_subject); - $email_subject = str_replace("{admin}", $author, $email_subject); - $email_subject = str_replace("{cur_date}", date("d.m.Y"), $email_subject); - - if (!isset($recipients) || empty($recipients)) { - $recipients = ''; - } - - //change margin if no image - if (!isset($full_img_name) || empty($full_img_name)) { - $backtop = "20mm"; - $islogo = 0; - } else { - $logo = GLPI_PICTURE_DIR . '/' . $full_img_name; - $backtop = "40mm"; - $islogo = 1; - } - - // debut buffer - // $file_content =""; - ob_start(); - - include dirname(__FILE__).'/template.php'; - - // var_dump($file_content); - $file_content = ob_get_contents(); - - // clean le buffer, il y'a plusieurs layers - // cf https://stackoverflow.com/questions/10352964/php-buffer-doesnt-stop-after-ob-end-clean - while (@ob_end_clean()) { - // do nothing - } - - - // echo ob_get_level(); - // echo $file_content; - // var_dump($file_content); - - $options = new Options(); - $options -> set('defaultFont', $font); - - $html2pdf = new Dompdf($options); - $html2pdf->loadHtml($file_content); - $html2pdf->setPaper('A4', $orientation); - $html2pdf->render(); - - $doc_name = str_replace(' ', '_', $title)."-".date('dmY').'.pdf'; - $output = $html2pdf->output(); - - file_put_contents(GLPI_UPLOAD_DIR .'/'.$doc_name, $output); - - $doc_id = self::createDoc($doc_name, $notes, $id); - - if ($email_mode == 1) { - - self::sendMail($doc_id, $send_user, $email_subject, $email_content, $recipients, $id); - - } - - $gen_date = date('Y-m-d H:i:s'); - // var_dump($title); - // die(); - $DB->insert('glpi_plugin_protocolsmanager_protocols', [ - 'name' => $doc_name, - 'gen_date' => $gen_date, - 'author' => $author, - 'user_id' => $id, - 'document_id' => $doc_id, - 'document_type' => $title_template - ] - ); - - $DB->update( - 'glpi_documents', - [ - 'users_id' => $id, - 'name'=>$doc_name, - 'comment'=>$title_template, - ], - [ - 'id' => $doc_id - ] - ); - - - $DB->insert('glpi_documents_items', [ - 'documents_id' => $doc_id, - 'items_id' => $id, - 'itemtype' => 'User', - 'users_id' => $id, - 'date_creation' => $gen_date, - 'date_mod' => $gen_date, - 'date' => $gen_date, - ] - ); - - // linking new document to all checked items - - foreach ($_POST["number"] as &$itms) { - $class = $_POST["classes"][$itms]; - $it = $_POST["ids"][$itms]; - - $DB->insert('glpi_documents_items',[ - 'documents_id' => $doc_id, - 'items_id' => $it, - 'itemtype' => $class, - 'users_id' => $id, - 'date_creation' => $gen_date, - 'date_mod' => $gen_date, - 'date' => $gen_date, - ] - ); - - } - } - - static function getDocNumber() { - global $DB; - - $req = $DB->request('SELECT MAX(id) as max FROM glpi_plugin_protocolsmanager_protocols'); - - if ($row = $req->current()) { - $nextnum = $row["max"]; - if (!$nextnum) { - return 1; - } - else { - $nextnum++; - return $nextnum; - } - } - } - - //create GLPI document - static function createDoc($doc_name, $notes, $id) { - global $DB, $CFG_GLPI; - - $req = $DB->request( - 'glpi_users', - ['id' => $id ]); - - if ($row = $req->current()) { - $entity = $row["entities_id"]; - } - - if (!Session::haveAccessToEntity($entity)) { - $entity = Session::getActiveEntity(); - } - - $input = []; - $doc = new Document(); - $input["entities_id"] = $entity; - $input["name"] = date('mdY_Hi'); - $input["upload_file"] = $doc_name; - $input["documentcategories_id"] = 0; - $input["mime"] = "application/pdf"; - $input["date_mod"] = date("Y-m-d H:i:s"); - # 2p - owners id - $input["users_id"] = Session::getLoginUserID(); - $input["comment"] = $notes; - $doc->check(-1, CREATE, $input); - $document_id = $doc->add($input); - return $document_id; - } - - //delete selected documents - static function deleteDocs() { - global $DB, $CFG_GLPI; - - $docnumber = $_POST['docnumber']; - - foreach ($docnumber as $del_key) { - - $DB->delete( - 'glpi_plugin_protocolsmanager_protocols', [ - 'document_id' => $del_key - ] - ); - - $doc = new Document(); - $doc->getFromDB($del_key); - $doc->delete(['id' => $del_key], true); - } - } - - //send mail notification - static function sendMail($doc_id, $send_user, $email_subject, $email_content, $recipients, $id) { - - global $CFG_GLPI, $DB; - $nmail = new GLPIMailer(); - - $nmail->SetFrom($CFG_GLPI["admin_email"], $CFG_GLPI["admin_email_name"], false); - - $recipients_array = explode(';',$recipients); - - $req = $DB->request( - 'glpi_documents', - ['id' => $doc_id ]); - - if ($row = $req->current()) { - $path = $row["filepath"]; - $filename = $row["filename"]; - } - - $fullpath = GLPI_VAR_DIR . '/' . $path; - - $req2 = $DB->request( - 'glpi_useremails', - ['users_id' => $id, 'is_default' => 1]); - - if ($row2 = $req2->current()) { - $owner_email = $row2["email"]; - } - - if ($send_user == 1) { - $nmail->AddAddress($owner_email); - } - - foreach($recipients_array as $recipient) { - - $nmail->AddAddress($recipient); //do konfiguracji - } - - $nmail->Subject = $email_subject; //do konfiguracji - $nmail->addAttachment($fullpath, $filename); - $nmail->Body = $email_content; - - if (!$nmail->Send()) { - Session::addMessageAfterRedirect(__('Failed to send email'), false, ERROR); - GLPINetwork::addErrorMessageAfterRedirect(); - return false; - } else { - - if ($send_user == 1) { - Session::addMessageAfterRedirect(__('Email sent')." to ".implode(", ", $recipients_array)." ".$owner_email); - return true; - } else { - Session::addMessageAfterRedirect(__('Email sent')." to ".implode(", ", $recipients_array)); - return true; - } - } - - - } - - static function sendOneMail($id=null) { - - global $CFG_GLPI, $DB; - - if (is_null($id) && isset($_POST['user_id'])) { - $id = $_POST['user_id']; - } - - $nmail = new GLPIMailer(); - - $nmail->SetFrom($CFG_GLPI["admin_email"], $CFG_GLPI["admin_email_name"], false); - - $doc_id = $_POST["doc_id"]; - - // if email is filled manually - if (isset($_POST["em_list"])) { - $recipients = $_POST["em_list"]; - } - - if (isset($_POST["email_subject"])) { - $email_subject = $_POST["email_subject"]; - } else { - $email_subject = "GLPI Protocols Manager mail"; - } - - if (isset($_POST['email_content'])) { - $email_content = $_POST['email_content']; - } else { - $email_content = ' '; - } - - // if email is from template - if (isset($_POST['e_list'])) { - $result = explode('|', $_POST['e_list']); - $recipients = $result[0]; - $email_subject = $result[1]; - $email_content = $result[2]; - $send_user = $result[3]; - } - - $owner = $_POST["owner"]; - $author = $_POST["author"]; - - $email_content = str_replace("{owner}", $owner, $email_content); - $email_content = str_replace("{admin}", $author, $email_content); - $email_content = str_replace("{cur_date}", date("d.m.Y"), $email_content); - - $email_subject = str_replace("{owner}", $owner, $email_subject); - $email_subject = str_replace("{admin}", $author, $email_subject); - $email_subject = str_replace("{cur_date}", date("d.m.Y"), $email_subject); - - $recipients_array = explode(';', $recipients); - - $req2 = $DB->request( - 'glpi_useremails', - ['users_id' => $id, 'is_default' => 1] - ); - - if ($row2 = $req2->current()) { - $owner_email = $row2["email"]; - } - - if (!empty($send_user) && $send_user == 1) { - $nmail->AddAddress($owner_email); - } - - foreach($recipients_array as $recipient) { - if (!empty($recipient)) { - $nmail->AddAddress($recipient); - } - } - - // Récupération et vérification du document - if (!empty($doc_id)) { - $req = $DB->request( - 'glpi_documents', - ['id' => $doc_id ] - ); - - if ($row = $req->current()) { - $fullpath = GLPI_VAR_DIR . '/' . $row["filepath"]; - $filename = $row["filename"]; - - if (file_exists($fullpath)) { - $nmail->addAttachment($fullpath, $filename); - } else { - Session::addMessageAfterRedirect(__('Attachment file not found: ') . $fullpath, false, ERROR); - } - } - } - - $nmail->IsHtml(true); - $nmail->Subject = $email_subject; - $nmail->Body = nl2br(stripcslashes($email_content)); - - if (!$nmail->Send()) { - Session::addMessageAfterRedirect(__('Failed to send email'), false, ERROR); - return false; - } else { - if (!empty($send_user) && $send_user == 1) { - Session::addMessageAfterRedirect(__('Email sent')." to ".implode(", ", $recipients_array)." ".$owner_email); - } else { - Session::addMessageAfterRedirect(__('Email sent')." to ".implode(", ", $recipients_array)); - } - return true; - } - } - - + die("Sorry. You can't access directly to this file"); } - +/** + * Clase principal de generación de protocolos. + * + * Gestiona la visualización de la pestaña en los ítems GLPI, + * la generación del PDF (delegada a PluginProtocolsmanagerPdfBuilder, + * que usa FPDF integrado en GLPI) y el envío de correo electrónico. + * + * No depende de ninguna librería externa al propio GLPI. + * + * @package glpi\protocolsmanager + */ +class PluginProtocolsmanagerGenerate extends CommonDBTM +{ + // ----------------------------------------------------------------------- + // Integración con el sistema de pestañas de GLPI + // ----------------------------------------------------------------------- + + public function getTabNameForItem(CommonGLPI $item, $withtemplate = 0): string + { + // createTabEntry(title, nb, form_itemtype_string_or_null, icon) + // $form_itemtype must be ?string (not an object). + // GLPI 11 accepts a 4th $icon param; GLPI 10 does not — use version check. + if (version_compare(GLPI_VERSION, '11.0.0', '>=')) { + return self::createTabEntry( + __('Protocols manager', 'protocolsmanager'), + 0, + null, + 'ti ti-file-export' + ); + } + return self::createTabEntry( + __('Protocols manager', 'protocolsmanager'), + 0, + null + ); + } + + public static function displayTabContentForItem( + CommonGLPI $item, + $tabnum = 1, + $withtemplate = 0 + ): bool { + global $CFG_GLPI; + + if (self::checkRights() !== 'w') { + echo "

" + . "
" + . __('Access denied') + . "
"; + return false; + } + + $gen = new self(); + $gen->showContent($item); + return true; + } + + // ----------------------------------------------------------------------- + // Control de acceso + // ----------------------------------------------------------------------- + + /** + * Devuelve el nivel de acceso ('w' | '') del usuario activo para este plugin. + */ + public static function checkRights(): string + { + global $DB; + + if (!isset($_SESSION['glpiactiveprofile']['id'])) { + return ''; + } + + $iterator = $DB->request([ + 'FROM' => 'glpi_plugin_protocolsmanager_profiles', + 'WHERE' => ['profile_id' => $_SESSION['glpiactiveprofile']['id']], + ]); + + if ($row = $iterator->current()) { + return (string)($row['tab_access'] ?? ''); + } + + return ''; + } + + // ----------------------------------------------------------------------- + // Datos adicionales del usuario + // ----------------------------------------------------------------------- + + /** + * Obtiene datos extra del usuario (matrícula, título, categoría). + * Usa Dropdown::getDropdownName de GLPI para evitar queries directas + * a las tablas de dropdowns. + * + * @return array{registration_number:string, title:string, category:string} + */ + private static function getUserExtraData(?int $user_id): array + { + global $DB; + + $defaults = [ + 'registration_number' => '_______________', + 'title' => '_______________', + 'category' => '_______________', + ]; + + if (empty($user_id)) { + return $defaults; + } + + $iterator = $DB->request(['FROM' => 'glpi_users', 'WHERE' => ['id' => $user_id]]); + $row = $iterator->current(); + if (!$row) { + return $defaults; + } + + $data = $defaults; + + if (!empty($row['registration_number'])) { + $data['registration_number'] = $row['registration_number']; + } + + if (!empty($row['usertitles_id'])) { + $v = Dropdown::getDropdownName('glpi_usertitles', $row['usertitles_id']); + if (!empty($v) && $v !== ' ') { + $data['title'] = $v; + } + } + + if (!empty($row['usercategories_id'])) { + $v = Dropdown::getDropdownName('glpi_usercategories', $row['usercategories_id']); + if (!empty($v) && $v !== ' ') { + $data['category'] = $v; + } + } + + return $data; + } + + // ----------------------------------------------------------------------- + // Pantalla de la pestaña + // ----------------------------------------------------------------------- + + public function showContent(CommonGLPI $item): bool + { + global $DB, $CFG_GLPI; + + if (get_class($item) !== 'User') { + if (!empty($item->id) && !empty($item->fields['users_id'])) { + $uid = $item->fields['users_id']; + $item = new User(); + $item->getFromDB($uid); + } + } + + $id = (int)$item->getField('id'); + $rand = mt_rand(); + + // Owner y Author resueltos una sola vez antes de cualquier bucle + $Owner = new User(); + $Owner->getFromDB($id); + $owner = $Owner->getFriendlyName(); + + $Author = new User(); + $Author->getFromDB(Session::getLoginUserID()); + $author = $Author->getFriendlyName(); + + $type_user = $CFG_GLPI['linkuser_types'] ?? []; + $field_user = 'users_id'; + $counter = 0; + + // Normalise: ensure Phone, Monitor, NetworkEquipment etc. are included even + // when GLPI strips them from linkuser_types in certain configurations. + $alwaysInclude = ['Computer', 'Monitor', 'Phone', 'Printer', 'Peripheral', 'NetworkEquipment']; + foreach ($alwaysInclude as $extra) { + if (!in_array($extra, $type_user, true)) { + $type_user[] = $extra; + } + } + + // Formulario principal + echo '
'; + echo ""; + echo Html::hidden('_glpi_csrf_token', ['value' => Session::getNewCSRFToken()]); + + // ── Template selector + Create (GLPI card) ─────────────────── + echo "
"; + echo "
" + . "" + . "

" . __('Equipment report', 'protocolsmanager') . "

" + . "
"; + echo "
"; + echo "
"; + echo "
" + . "" + . "
"; + echo "
" + . ""; + echo "
"; + echo "
" + . ""; + echo "
"; + echo "
"; // card-body + card + + // ── Equipment table (GLPI card) ──────────────────────────────── + echo "
"; + echo "
" + . "" + . "

" . __('Equipment', 'protocolsmanager') . "

" + . "
"; + echo "
"; + echo "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . ""; + + foreach ($type_user as $itemtype) { + $itemObj = getItemForItemtype($itemtype); + if (!$itemObj || !$itemObj->canView()) { + continue; + } + + $itemtable = getTableForItemType($itemtype); + $criteria = ['FROM' => $itemtable, 'WHERE' => [$field_user => $id]]; + + if ($itemObj->maybeTemplate()) { + $criteria['WHERE']['is_template'] = 0; + } + if ($itemObj->maybeDeleted()) { + $criteria['WHERE']['is_deleted'] = 0; + } + + $type_name = $itemObj->getTypeName(); + + foreach ($DB->request($criteria) as $data) { + $cansee = $itemObj->can($data['id'], READ); + $linkName = !empty($data['name']) ? $data['name'] : $data['id']; + + if ($cansee) { + $linkUrl = $itemObj::getFormURLWithID($data['id']); + if ($_SESSION['glpiis_ids_visible'] || empty($data['name'])) { + $linkName = sprintf(__('%1$s (%2$s)'), $linkName, $data['id']); + } + $link = "" . htmlescape($linkName) . ''; + } else { + $link = htmlescape($linkName); + } + + $man_name = ''; + if (!empty($data['manufacturers_id'])) { + $raw = Dropdown::getDropdownName('glpi_manufacturers', $data['manufacturers_id']); + $man_name = trim($raw); + } + + $mod_name = ''; + foreach (['computer', 'phone', 'monitor', 'networkequipment', 'printer', 'peripheral'] as $prefix) { + if (!empty($data[$prefix . 'models_id'])) { + $mod_name = Dropdown::getDropdownName('glpi_' . $prefix . 'models', $data[$prefix . 'models_id']); + break; + } + } + + $sta_name = ''; + if (!empty($data['states_id'])) { + $sta_name = Dropdown::getDropdownName('glpi_states', $data['states_id']); + } + + $serial = $data['serial'] ?? ''; + $otherserial = $data['otherserial'] ?? ''; + $item_name = $data['name'] ?? ''; + $ids = $data['id'] ?? ''; + + echo "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . ""; + + $counter++; + } + } + + // Bloque de Assets (GLPI 11 — tabla dinámica) + if ($DB->tableExists('glpi_assets_assets')) { + $assetIterator = $DB->request([ + 'FROM' => 'glpi_assets_assets', + 'WHERE' => ['users_id' => $id, 'is_deleted' => 0, 'is_template' => 0], + ]); + + foreach ($assetIterator as $data) { + $def_name = ''; + if (!empty($data['assets_assetdefinitions_id'])) { + $def_name = Dropdown::getDropdownName('glpi_assets_assetdefinitions', $data['assets_assetdefinitions_id']); + } + + $man_name = ''; + if (!empty($data['manufacturers_id'])) { + $raw = Dropdown::getDropdownName('glpi_manufacturers', $data['manufacturers_id']); + $man_name = trim($raw); + } + + $mod_name = ''; + if (!empty($data['assets_assetmodels_id'])) { + $mod_name = Dropdown::getDropdownName('glpi_assets_assetmodels', $data['assets_assetmodels_id']); + } + + $sta_name = ''; + if (!empty($data['states_id'])) { + $sta_name = Dropdown::getDropdownName('glpi_states', $data['states_id']); + } + + $item_name = $data['name'] ?? ''; + $serial = $data['serial'] ?? ''; + $otherserial = $data['otherserial'] ?? ''; + + echo "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" // glpi_assets_assets: skip documents_items link (dynamic type) + . "" + + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . ""; + + $counter++; + } + } + + echo '
" . __('Type') . "" . __('Manufacturer') . "" . __('Model') . "" . __('Name') . "" . __('State') . "" . __('Serial number') . "" . __('Inventory number') . "" . __('Comments') . "
" . htmlescape($type_name) . "" . ($man_name ? htmlescape($man_name) : '—') . "" . ($mod_name ? htmlescape($mod_name) : '—') . "" . $link . "" . ($sta_name ? htmlescape($sta_name) : '—') . "" . ($serial ? htmlescape($serial) : '—') . "" . ($otherserial ? htmlescape($otherserial) : '—') . "
" . htmlescape($def_name ?: __('Asset', 'protocolsmanager')) . "" . ($man_name ? htmlescape($man_name) : '—') . "" . ($mod_name ? htmlescape($mod_name) : '—') . "" . ($item_name ? htmlescape($item_name) : '—') . "" . ($sta_name ? htmlescape($sta_name) : '—') . "" . ($serial ? htmlescape($serial) : '—') . "" . ($otherserial ? htmlescape($otherserial) : '—') . "
'; // table-responsive + card + Html::closeForm(); + + // Modal de envío de email + echo ''; + + // ── Add custom row button ────────────────────────────────────── + echo "
"; + echo ""; + echo "
"; + + // ── Generated documents table (GLPI card) ──────────────────── + echo "
"; + echo ""; + echo Html::hidden('_glpi_csrf_token', ['value' => Session::getNewCSRFToken()]); + echo "
" + . "" + . "

" . __('Generated documents', 'protocolsmanager') . "

" + . "" + . "" + . "
"; + echo "
"; + echo ""; + echo "" + . "" + . "" + . "" + . "" + . "" + . "" + . "" + . ""; + + $pm_per_page = 20; + $pm_total = self::countDocsForUser($id); + $pm_start = max(0, (int)($_GET['pm_start'] ?? 0)); + if ($pm_total > 0) { + $pm_start = min($pm_start, $pm_total - 1); + } + self::getAllForUser($id, $pm_start, $pm_per_page, $pm_total); + + echo '
" . __('Name') . "" . __('Type') . "" . __('Date') . "" . __('File') . "" . __('Creator') . "" . __('Comment') . "" . __('Send email', 'protocolsmanager') . "
'; // table-responsive + card + Html::closeForm(); + + // Emit GLPI states as a JSON variable for the addNewRow JS helper. + // This must run inside showContent() where $DB is already in scope. + $pmStatesList = []; + foreach ($DB->request(['SELECT' => ['id', 'name'], 'FROM' => 'glpi_states', 'ORDER' => 'name ASC']) as $st) { + $pmStatesList[] = ['id' => (int)$st['id'], 'name' => $st['name']]; + } + $pmStatesJson = json_encode($pmStatesList, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT); + echo "\n"; + + return true; + } + + // ----------------------------------------------------------------------- + // Listado de documentos del usuario + // ----------------------------------------------------------------------- + + /** Returns total document count for a user (used for pagination). */ + public static function countDocsForUser(int $id): int + { + global $DB; + $row = $DB->request([ + 'SELECT' => [new \QueryExpression('COUNT(*) AS cnt')], + 'FROM' => 'glpi_plugin_protocolsmanager_protocols', + 'WHERE' => ['user_id' => $id], + ])->current(); + return $row ? (int)$row['cnt'] : 0; + } + + /** + * Renders document rows for a user with LIMIT/OFFSET pagination. + * + * @param int $id User ID + * @param int $start Row offset (0-based) + * @param int $perPage Rows per page + * @param int $total Total rows (for pager rendering) + */ + public static function getAllForUser(int $id, int $start = 0, int $perPage = 20, int $total = 0): void + { + global $DB, $CFG_GLPI; + + // Render GLPI-style pager above the rows if there is more than one page. + if ($total > $perPage) { + $selfUrl = $CFG_GLPI['root_doc'] . '/front/user.form.php?id=' . $id; + Html::printPager($start, $total, $selfUrl, 'pm_start', null, $perPage); + } + + $iterator = $DB->request([ + 'FROM' => 'glpi_plugin_protocolsmanager_protocols', + 'WHERE' => ['user_id' => $id], + 'ORDER' => 'gen_date DESC', + 'LIMIT' => $perPage, + 'START' => $start, + ]); + + foreach ($iterator as $exports) { + $Doc = new Document(); + $docFound = $Doc->getFromDB($exports['document_id']); + + echo "" + . "" + . "" . ($docFound ? $Doc->getLink() : __('Document not found', 'protocolsmanager')) . "" + . "" . htmlescape($exports['document_type']) . "" + . "" . htmlescape($exports['gen_date']) . "" + . "" . ($Doc->fields ? $Doc->getDownloadLink() : '') . "" + . "" . htmlescape($exports['author']) . "" + . "" . ($Doc->fields ? htmlescape($Doc->getField('comment')) : '') . "" + . "" + . ""; + } + + // Render pager below rows too if multi-page. + if ($total > $perPage) { + $selfUrl = $CFG_GLPI['root_doc'] . '/front/user.form.php?id=' . $id; + Html::printPager($start, $total, $selfUrl, 'pm_start', null, $perPage); + } + } + + // ----------------------------------------------------------------------- + // Generación del PDF + // ----------------------------------------------------------------------- + + /** + * Genera un protocolo PDF a partir de los datos en $_POST. + * + * Flujo: + * 1. Recoge datos del formulario + * 2. Carga configuración de plantilla de BD + * 3. Aplica sustituciones de texto ({owner}, {admin}, etc.) + * 4. Genera PDF via PluginProtocolsmanagerPdfBuilder (FPDF / GLPI) + * 5. Guarda archivo en GLPI_UPLOAD_DIR y crea Document GLPI + * 6. Registra protocolo en la tabla del plugin + * 7. Envía email automático si email_mode = 1 + */ + public static function makeProtocol(): void + { + global $DB; + + // 1. Recoger datos del POST + // $id and $notes first — owner resolution depends on $id. + $id = (int)($_POST['user_id'] ?? 0); + $doc_no = (int)($_POST['list'] ?? 0); + $notes = $_POST['notes'] ?? ''; + $number = $_POST['number'] ?? []; + $type_name = $_POST['type_name'] ?? []; + $man_name = $_POST['man_name'] ?? []; + $mod_name = $_POST['mod_name'] ?? []; + $serial = $_POST['serial'] ?? []; + $otherserial = $_POST['otherserial'] ?? []; + $item_name = $_POST['item_name'] ?? []; + $comments = $_POST['comments'] ?? []; + $states_id = $_POST['states_id'] ?? []; // for state name resolution + // Resolve owner and author server-side — never trust POST for display names. + $ownerUser = new User(); + $ownerUser->getFromDB($id); + $owner = $ownerUser->getFriendlyName(); + $authorUser = new User(); + $authorUser->getFromDB(Session::getLoginUserID()); + $author = $authorUser->getFriendlyName(); + + // Guard: require at least one item selected. + if (empty($number) || !is_array($number)) { + Session::addMessageAfterRedirect( + __('Please select at least one item.', 'protocolsmanager'), + false, + WARNING + ); + return; + } + + // Resolve states_id → state name for each row + $state_name_map = []; + foreach ($states_id as $idx => $sid) { + $sid = (int)$sid; + if ($sid > 0) { + $state_name_map[$idx] = Dropdown::getDropdownName('glpi_states', $sid); + } else { + $state_name_map[$idx] = ''; + } + } + + // 2. Datos extra del usuario + $userExtra = self::getUserExtraData($id); + $registration_number = $userExtra['registration_number']; + $usertitle_name = $userExtra['title']; + $usercategory_name = $userExtra['category']; + + // 3. Cargar configuración de plantilla + $req = $DB->request([ + 'FROM' => 'glpi_plugin_protocolsmanager_config', + 'WHERE' => ['id' => $doc_no], + ]); + + if (!($row = $req->current())) { + Session::addMessageAfterRedirect( + __('Template not found.', 'protocolsmanager'), + false, + ERROR + ); + return; + } + + $content = $row['content'] ?? ''; + $upper_content = $row['upper_content'] ?? ''; + $footer = $row['footer'] ?? ''; + $title = $row['title'] ?? ''; + $title_template = $row['name'] ?? ''; + $full_img_name = $row['logo'] ?? ''; + $font = !empty($row['font']) ? $row['font'] : 'Helvetica'; + $fontsize = !empty($row['fontsize']) ? $row['fontsize'] : '9'; + $city = $row['city'] ?? ''; + $orientation = $row['orientation'] ?? 'Portrait'; + $email_mode = (int)($row['email_mode'] ?? 0); + $email_template = (int)($row['email_template'] ?? 0); + $serial_mode = (int)($row['serial_mode'] ?? 1); + $author_state = (int)($row['author_state'] ?? 1); + $author_name = $row['author_name'] ?? ''; + $date_format = (int)($row['date_format'] ?? 0); + $logo_width = $row['logo_width'] ?? null; + $logo_height = $row['logo_height'] ?? null; + + // 4. Aplicar sustituciones de texto + // {items_table} se elimina: la tabla se renderiza nativamente en el PDF + $replacements = [ + '{cur_date}' => date('d.m.Y'), + '{owner}' => $owner, + '{admin}' => $author, + '{reg_num}' => $registration_number, + '{title}' => $usertitle_name, + '{category}' => $usercategory_name, + '{items_table}' => '', + ]; + + $title = str_replace('{owner}', $owner, $title); + + foreach ($replacements as $key => $val) { + $content = str_replace($key, $val, $content); + $upper_content = str_replace($key, $val, $upper_content); + } + + // 5. Configuración de email + $email_content = ''; + $email_subject = ''; + $recipients = ''; + $send_user = 0; + + if ($email_template > 0) { + $req2 = $DB->request([ + 'FROM' => 'glpi_plugin_protocolsmanager_emailconfig', + 'WHERE' => ['id' => $email_template], + ]); + if ($row2 = $req2->current()) { + $send_user = (int)($row2['send_user'] ?? 0); + $email_subject = $row2['email_subject'] ?? ''; + $email_content = $row2['email_content'] ?? ''; + $recipients = $row2['recipients'] ?? ''; + } + } + + foreach (['{owner}' => $owner, '{admin}' => $author, '{cur_date}' => date('d.m.Y')] as $k => $v) { + $email_content = str_replace($k, $v, $email_content); + $email_subject = str_replace($k, $v, $email_subject); + } + + // 6a. Reserve protocol row to obtain a unique, race-free folio number. + $gen_date = date('Y-m-d H:i:s'); + $DB->insert('glpi_plugin_protocolsmanager_protocols', [ + 'name' => 'pending', + 'gen_date' => $gen_date, + 'author' => $author, + 'user_id' => $id, + 'document_id' => 0, + 'document_type' => $title_template, + ]); + $protocol_id = $DB->insertId(); + $prot_num = $protocol_id; // guaranteed unique — no race condition + + // 6b. Generar PDF usando TCPDF integrado en GLPI (via Composer) + $logo = !empty($full_img_name) ? GLPI_PICTURE_DIR . '/' . $full_img_name : ''; + + try { + $builder = new PluginProtocolsmanagerPdfBuilder(); + $builder->setBaseFont($font, (int)$fontsize); + $builder->setFooterContent($footer); + + $pdfContent = $builder->generate([ + 'orientation' => $orientation, + 'logo' => $logo, + 'logo_width' => $logo_width, + 'logo_height' => $logo_height, + 'prot_num' => $prot_num, + 'city' => $city, + 'title' => $title, + 'upper_content' => $upper_content, + 'content' => $content, + 'serial_mode' => $serial_mode, + 'author_state' => $author_state, + 'author_name' => $author_name, + 'author' => $author, + 'date_format' => $date_format, + 'owner' => $owner, + 'number' => $number, + 'type_name' => $type_name, + 'man_name' => $man_name, + 'mod_name' => $mod_name, + 'serial' => $serial, + 'otherserial' => $otherserial, + 'item_name' => $item_name, + 'comments' => $comments, + 'state_name' => $state_name_map, + ]); + + // 7. Guardar archivo + // Sanitize: keep only safe chars, append folio+timestamp for uniqueness. + $safe_title = preg_replace('/[^\w\-]/u', '_', str_replace(' ', '_', $title)); + $safe_title = trim($safe_title, '_'); + $doc_name = $safe_title . '_' . $prot_num . '-' . date('dmYHis') . '.pdf'; + $written = file_put_contents(GLPI_UPLOAD_DIR . '/' . $doc_name, $pdfContent); + if ($written === false) { + throw new \RuntimeException('Failed to write PDF to disk: ' . GLPI_UPLOAD_DIR . '/' . $doc_name); + } + + $doc_id = self::createDoc($doc_name, $owner, $notes, $title, $id); + + } catch (\Throwable $e) { + // PDF generation or disk write failed — remove the reserved row so + // the folio number is not wasted and the list stays clean. + $DB->delete('glpi_plugin_protocolsmanager_protocols', ['id' => $protocol_id]); + Session::addMessageAfterRedirect( + __('Failed to generate document. Please try again.', 'protocolsmanager'), + false, + ERROR + ); + return; + } + + if ($email_mode === 1) { + self::sendMail($doc_id, $send_user, $email_subject, $email_content, $recipients, $id); + } + + // 8. Actualizar fila reservada del protocolo con datos definitivos. + $DB->update('glpi_plugin_protocolsmanager_protocols', [ + 'name' => $doc_name, + 'document_id' => $doc_id, + ], ['id' => $protocol_id]); + + $DB->update('glpi_documents', [ + 'users_id' => $id, + 'name' => $doc_name, + 'comment' => $notes, + ], ['id' => $doc_id]); + + // Vincular usuario al documento + $DB->insert('glpi_documents_items', [ + 'documents_id' => $doc_id, + 'items_id' => $id, + 'itemtype' => 'User', + 'users_id' => $id, + 'date_creation' => $gen_date, + 'date_mod' => $gen_date, + 'date' => $gen_date, + ]); + + // Vincular cada ítem seleccionado + if (is_array($number)) { + foreach ($number as $itms) { + $class = !empty($_POST['classes'][$itms]) ? $_POST['classes'][$itms] : null; + $it = !empty($_POST['ids'][$itms]) ? (int)$_POST['ids'][$itms] : null; + if ($class !== null && $it !== null) { + $DB->insert('glpi_documents_items', [ + 'documents_id' => $doc_id, + 'items_id' => $it, + 'itemtype' => $class, + 'users_id' => $id, + 'date_creation' => $gen_date, + 'date_mod' => $gen_date, + 'date' => $gen_date, + ]); + } + } + } + } + + // ----------------------------------------------------------------------- + // Helpers de documento GLPI + // ----------------------------------------------------------------------- + + public static function createDoc( + string $doc_name, + string $owner, + string $notes, + string $title, + int $id + ): int { + global $DB; + + $entity = Session::getActiveEntity(); + $userRow = $DB->request(['FROM' => 'glpi_users', 'WHERE' => ['id' => $id]])->current(); + if ($userRow) { + $candidate = (int)$userRow['entities_id']; + if (Session::haveAccessToEntity($candidate)) { + $entity = $candidate; + } + } + + $doc_cat_id = 0; + $catRow = $DB->request(['FROM' => 'glpi_documentcategories', 'WHERE' => ['name' => $title]])->current(); + if ($catRow) { + $doc_cat_id = (int)$catRow['id']; + } + + $doc = new Document(); + $input = [ + 'entities_id' => $entity, + 'name' => date('mdY_Hi'), + 'upload_file' => $doc_name, + 'documentcategories_id' => $doc_cat_id, + 'mime' => 'application/pdf', + 'date_mod' => date('Y-m-d H:i:s'), + 'users_id' => Session::getLoginUserID(), + 'comment' => $notes, + ]; + + $doc->check(-1, CREATE, $input); + return (int)$doc->add($input); + } + + // ----------------------------------------------------------------------- + // Eliminación de documentos + // ----------------------------------------------------------------------- + + /** + * Elimina completamente los documentos seleccionados: + * 1. Obtiene la ruta del archivo físico ANTES de borrar el registro. + * 2. Elimina el registro del plugin (glpi_plugin_protocolsmanager_protocols). + * 3. Elimina todos los vínculos del documento (glpi_documents_items). + * 4. Borra el archivo físico del filesystem de GLPI. + * 5. Hard-delete del Document de GLPI mediante delete($input, $force=true). + * + * NOTA: CommonDBTM no tiene un método purge() público. + * El hard-delete (bypass de papelera) en GLPI se realiza pasando true + * como segundo argumento a delete(): delete(['id' => $id], true). + */ + public static function deleteDocs(): void + { + global $DB; + + if (!isset($_POST['docnumber']) || !is_array($_POST['docnumber'])) { + return; + } + + foreach ($_POST['docnumber'] as $raw_key) { + $doc_id = (int)$raw_key; + if ($doc_id <= 0) { + continue; + } + + // 1. Recuperar ruta del archivo físico antes de borrar nada + $docRow = $DB->request([ + 'SELECT' => ['filepath', 'filename'], + 'FROM' => 'glpi_documents', + 'WHERE' => ['id' => $doc_id], + ])->current(); + + // 2. Borrar registro del plugin + $DB->delete('glpi_plugin_protocolsmanager_protocols', ['document_id' => $doc_id]); + + // 3. Borrar vínculos documento ↔ ítems + $DB->delete('glpi_documents_items', ['documents_id' => $doc_id]); + + // 4. Borrar archivo físico del disco + if ($docRow && !empty($docRow['filepath'])) { + $fullpath = GLPI_VAR_DIR . '/' . $docRow['filepath']; + if (file_exists($fullpath)) { + @unlink($fullpath); + } + // Borrar también de GLPI_UPLOAD_DIR si existe copia allí + if (!empty($docRow['filename'])) { + $uploadPath = GLPI_UPLOAD_DIR . '/' . $docRow['filename']; + if (file_exists($uploadPath)) { + @unlink($uploadPath); + } + } + } + + // 5. Hard-delete del registro en glpi_documents + // delete($input, $force=true) salta la papelera y elimina definitivamente. + // purge() no existe como método público en CommonDBTM de GLPI 10/11. + $doc = new Document(); + $doc->delete(['id' => $doc_id], true); + } + } + + // ----------------------------------------------------------------------- + // Envío de correo (GLPIMailer — nativo GLPI) + // ----------------------------------------------------------------------- + + /** Envío automático al generar (email_mode = 1). */ + public static function sendMail( + int $doc_id, + int $send_user, + string $email_subject, + string $email_content, + string $recipients, + int $id + ): bool { + global $CFG_GLPI, $DB; + + $nmail = new GLPIMailer(); + $nmail->SetFrom($CFG_GLPI['admin_email'], $CFG_GLPI['admin_email_name'] ?? '', false); + + $docRow = $DB->request(['FROM' => 'glpi_documents', 'WHERE' => ['id' => $doc_id]])->current(); + if ($docRow && file_exists(GLPI_VAR_DIR . '/' . $docRow['filepath'])) { + $nmail->addAttachment(GLPI_VAR_DIR . '/' . $docRow['filepath'], $docRow['filename']); + } + + $addressCount = 0; + if ($send_user === 1) { + $emailRow = $DB->request([ + 'FROM' => 'glpi_useremails', + 'WHERE' => ['users_id' => $id, 'is_default' => 1], + ])->current(); + if ($emailRow && !empty($emailRow['email'])) { + $nmail->AddAddress($emailRow['email'], ''); + $addressCount++; + } + } + + foreach (explode(';', $recipients) as $r) { + $r = trim($r); + if (!empty($r)) { + $nmail->AddAddress($r, ''); + $addressCount++; + } + } + + if ($addressCount === 0) { + Session::addMessageAfterRedirect(__('No recipients specified. Email not sent.', 'protocolsmanager'), false, WARNING); + return false; + } + + $nmail->IsHtml(true); + $nmail->Subject = $email_subject; + $nmail->Body = nl2br($email_content); + + if (!$nmail->Send()) { + Session::addMessageAfterRedirect(__('Failed to send email', 'protocolsmanager'), false, ERROR); + return false; + } + + Session::addMessageAfterRedirect(__('Email sent', 'protocolsmanager') . ' to ' . $recipients); + return true; + } + + /** Envío manual desde el modal (botón "Send email"). */ + public static function sendOneMail(?int $id = null): bool + { + global $CFG_GLPI, $DB; + + if ($id === null) { + $id = isset($_POST['user_id']) ? (int)$_POST['user_id'] : 0; + } + + $nmail = new GLPIMailer(); + $nmail->SetFrom($CFG_GLPI['admin_email'], $CFG_GLPI['admin_email_name'] ?? '', false); + + $doc_id = (int)($_POST['doc_id'] ?? 0); + $send_user = 0; + + if (isset($_POST['e_list'])) { + // Template path: content comes from DB (admin-configured, CSRF-protected). + $parts = explode('|', $_POST['e_list']); + if (count($parts) >= 4) { + $recipients = $parts[0]; + $email_subject = $parts[1]; + $email_content = $parts[2]; + $send_user = (int)$parts[3]; + } else { + $recipients = $email_subject = $email_content = ''; + } + } else { + // Manual path: sanitize all three fields from POST. + $recipients = $_POST['em_list'] ?? ''; + // Subject must be plain text (no HTML in SMTP headers). + $email_subject = strip_tags($_POST['email_subject'] ?? __('GLPI Protocols Manager mail', 'protocolsmanager')); + // Body: allow safe inline HTML; strip scripts/iframes/events. + $raw_body = $_POST['email_content'] ?? ''; + $email_content = strip_tags($raw_body, '