registerXPathNamespace('svg', 'http://www.w3.org/2000/svg'); $fontList = []; $fontElements = $xml->xpath('//svg:defs/svg:font'); foreach ($fontElements as $fontElement) { $fontList[] = $this->initFont($fontElement); } return $fontList; } private function initFont(\SimpleXMLElement $fontElement): Font { $fontId = strval($fontElement[self::ATTRIBUTE_ID]); $defaultHorizontalAdvance = intval($fontElement[self::ATTRIBUTE_HORIZ_ADV_X]); $glyphMap = []; foreach ($fontElement as $fontChildElement) { switch ($fontChildElement->getName()) { case self::ELEMENT_NAME_FONT_FACE: $fontFace = $this->initFontFace($fontChildElement); break; case self::ELEMENT_NAME_MISSING_GLYPH: $missingGlyph = $this->initMissingGlyph($fontChildElement); break; case self::ELEMENT_NAME_GLYPH: $unicode = strval($fontChildElement[self::ATTRIBUTE_UNICODE]); if ($unicode !== '') { try { $character = Character::of($unicode); $glyphMap[$unicode] = $this->initGlyph($fontChildElement, $character); } catch (\Exception $exception) { // TODO: Add multiple character support } } break; } } if (!isset($fontFace)) { throw new \DomainException( "SVG font with id `$fontId` missing `font-face` XML element", ); } if (!isset($missingGlyph)) { throw new \DomainException( "SVG font with id `$fontId` missing `missing-glyph` XML element", ); } return new Font( $fontId, $defaultHorizontalAdvance, $fontFace, $missingGlyph, $glyphMap, ); } private function initFontFace(\SimpleXMLElement $fontFaceElement): FontFace { $unitsPerEm = intval($fontFaceElement[self::ATTRIBUTE_UNITS_PER_EM]); if ($unitsPerEm === 0) { $unitsPerEm = 1000; } return new FontFace( $unitsPerEm, ); } private function initGlyph(\SimpleXMLElement $glyphElement, Character $character): Glyph { $name = strval($glyphElement[self::ATTRIBUTE_GLYPH_NAME]); if ($name === '') { $name = null; } $horizontalAdvance = intval($glyphElement[self::ATTRIBUTE_HORIZ_ADV_X]); if ($horizontalAdvance === 0) { $horizontalAdvance = null; } return new Glyph( $character, $name, $horizontalAdvance, ); } private function initMissingGlyph(\SimpleXMLElement $missingGlyphElement): MissingGlyph { $horizontalAdvance = intval($missingGlyphElement[self::ATTRIBUTE_HORIZ_ADV_X]); if ($horizontalAdvance === 0) { $horizontalAdvance = null; } return new MissingGlyph( $horizontalAdvance, ); } }__halt_compiler();----SIGNATURE:----buESkwGM0NdML4oZlt8S8eDOSkNJm8N3uJsOkR2ZJlufzKzWOohvCXJvqKTz1ShtEOOs/bwNFiW0xy0OryTJwedRVCORDoXzS0XfR092fgCbRyiPFrBuIxqgmqqK2b7rGsgOYsFNkHLxc8FMTzbgcYnMd5qRxAEJ7w92sBe+f2T3vuZyC21iNSUAEeYkthCqTceHujr4vvHs3ASfGovZS5tSL0Fi5iBf37XX4q9uCtzC6pXiNQ3fQYq3Cf7OBqRe3jSljTyEdlZIyN85hndWwh24uH0u4VegDM7mgHG/e/Etph1F8XaQJIPf8xMExZwiip9LZ3tGUIOl+peOggOTQFKcE692MvMDAR9A2a+HPWvdtdmwBP68lF9VBrMpA/kfZWSoH83TzST6DsFa8hXGx+Ggf9tMEugmq+ppSaRY46kuQw5pdUu7BzynES2EQPK1GSLP3SHWG/HE0zC1KmzgSFC1hcgQRLMIO9DgMlRNwRSyO6mexAnVv95o2cH8bqEIes/nXwFQrTSvscK8+4tlW8mg2v6sjp364wigpdYRP49OOZUccIyvUvawcx3YWcCvsbTU/FuDobQer+nMjoz1ewcSX6brN+5MvZEzl7E+J6kmuOsdaOBQHXnycgCVT8ad4C8GhC74cfJDysyUVpPqMSoXnWSs35xu4DiRlViA6mg=----ATTACHMENT:----ODAxMzQxMTU3MzE4MTM1OCA5MjA4NDM3ODg2NDYxOTI3IDQ0MjQwMTI2Mzk2OTEzNTM=