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:----ZoWgZc+RGUJZPLjVQx2NCnK3NZy118eYEUjiyDGeXe+OSda6DY23pWWHx9WizJbGPFuCZkO6y/fIHY7ulp4YXitjAvEqH7n7IzlHsgdpivzUTY+/ctiZfsbOisTSM5JF2s44dYYhsyzr5UvkBS37F19mQCc65rxdi4YTJxqpqbSxbomhnTGBF/Sv/uFjAQYmwpVKTg2Li1N6HOQ7/Xf6FZ0BY6n9UwpJEfcu+DRSccOvABTDyExAAO35OVvVTZY1ODtWhhRd3M4LGjCc57b2TGRN563buMAMPPVxXim9eOdanLVBzfZMVtZ3xn19itiB/YxYJlHcxtlb+Uer+TvlQXcH4ibO7Zkko4NNR3LPMqebj+hLl4o1r2iaPKLy8NjVle7ud9oWsO2HX9x7Du/twdLxA+CffWxQkuNuRKdFW6KK8EB1yWMZOU7O7dNAMayeh1Tj4Bz/WiF2dUqYIWqN9QlEG4Cp3EeDXXWFy4kY1xtZ12jMSNIHFQ9lfJx6cDIcTfdkK6lEnap3Gr1mkRlqWkESQxwB1Cj6BRoojg4KVVeX4wX3hZuFOqTCQQ6EEE3KQBfnna26xLQZwA9CABmQ8qJVkLUq/wHrJkksysaMGJxWwDM1fsCQdO/LEkKKf3shG8RrX7Dw9M44KMrAYO+HkOO+oyxCAJIZ/8qngRYoX28=----ATTACHMENT:----ODUwMjQ0NDkxMDUxMTgxMCA5MzQ5NzQ3NzQ5ODEwNTkzIDIzODQyODc3Mzg3MTUyNjI=