Commit 2c4930cd by lmf

删除定制插件

删除mageplaza插件
修改翻译文字
parent 5457bd56
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 03/09/2020
*/
namespace Customily\Categories\Api\Server;
use Customily\Categories\Helper\CustomilyHelper;
use Customily\Categories\Util\ManageOptions;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Filesystem;
use Magento\Framework\Webapi\Rest\Request;
use Magento\MediaStorage\Model\File\UploaderFactory;
use Psr\Log\LoggerInterface;
class ApiRestImpl implements ApiRestInterface
{
protected $helper;
protected $manageOptions;
protected $mediaDirectory;
protected $fileUploaderFactory;
protected $request;
protected $logger;
const SWATCH_THUMBNAILS_URL_PATH = 'catalog/product/customily/swatches/thumbnails/';
const PREVIEW_URL_PATH = 'catalog/product/customily/previews/';
const THUMBNAILS_URL_PATH = 'catalog/product/customily/previews/thumbnails/';
/**
* ApiRestImpl constructor.
* @param CustomilyHelper $helper
* @param ManageOptions $manageOptions
* @param Filesystem $filesystem
* @param UploaderFactory $fileUploaderFactory
* @param Request $request
* @param LoggerInterface $logger
* @throws \Magento\Framework\Exception\FileSystemException
*/
public function __construct(
CustomilyHelper $helper,
ManageOptions $manageOptions,
Filesystem $filesystem,
UploaderFactory $fileUploaderFactory,
Request $request,
LoggerInterface $logger
)
{
$this->helper = $helper;
$this->manageOptions = $manageOptions;
$this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
$this->fileUploaderFactory = $fileUploaderFactory;
$this->request = $request;
$this->logger = $logger;
}
/**
* @return false|mixed|string
*/
public function testApi()
{
if (!$this->checkPermissions()) {
return false;
}
$this->logger->debug('CUSTOMILY: Test api.');
$count = $this->helper->getCustomilyProductCount();
$response = ['success' => true, 'products' => $count];
return json_encode($response);
}
/**
* @return false|mixed|string
*/
public function status()
{
$memoryLimit = ini_get('memory_limit');
if (preg_match('/^(\d+)(.)$/', $memoryLimit, $matches)) {
if ($matches[2] == 'M') {
$memoryLimit = $matches[1]; // nnnM -> nnn MB
} else if ($matches[2] == 'K') {
$memoryLimit = $matches[1] / 1024; // nnnK -> nnn KB
}
}
$response = [
'status' => 'active',
'version' => $this->helper->getModuleVersion(),
'memory_limit' => "{$memoryLimit}MB",
'max_input_vars' => ini_get('max_input_vars'),
'max_execution_time' => ini_get('max_execution_time')
];
return json_encode($response);
}
/**
* @return false|mixed|string
*/
public function uploadThumbnail()
{
if (!$this->checkPermissions()) {
return false;
}
$data = $this->request->getBodyParams();
if (isset($data) && isset($data['fileContent'])) {
$fileType = $data['fileType'] ?? 'image';
$targetDir = $this->mediaDirectory->getAbsolutePath(self::SWATCH_THUMBNAILS_URL_PATH);
$response = $this->saveImage(
$data['fileContent'],
$targetDir,
self::SWATCH_THUMBNAILS_URL_PATH,
$fileType
);
} else {
$response = ['success' => false, 'imageUrl' => false];
}
return json_encode($response);
}
/**
* @return false|mixed|string
*/
public function deleteThumbnail()
{
if (!$this->checkPermissions()) {
return false;
}
$data = $this->request->getBodyParams();
if (isset($data) && isset($data['thumbnailName'])) {
$file = $this->mediaDirectory->getAbsolutePath(self::SWATCH_THUMBNAILS_URL_PATH . $data['thumbnailName']);
$response = ['success' => unlink($file)];
} else {
$response = ['success' => false];
}
return json_encode($response);
}
/**
* @return false|mixed|string
*/
public function uploadPreview()
{
if (!$this->checkPermissions()) {
return false;
}
$data = $this->request->getBodyParams();
if (isset($data) && isset($data['productId']) && isset($data['fileContent'])) {
if (isset($data['isThumbnail'])) {
$urlPath = self::THUMBNAILS_URL_PATH;
} else {
$urlPath = self::PREVIEW_URL_PATH;
}
$targetDir = $this->mediaDirectory->getAbsolutePath($urlPath . $data['productId'] . '/');
$response = $this->saveImage($data['fileContent'], $targetDir, $urlPath . $data['productId'] . '/');
} else {
$response = ['success' => false, 'imageUrl' => false];
}
return json_encode($response);
}
/**
* @return false|mixed|string
*/
public function optionsFromTemplate()
{
if (!$this->checkPermissions()) {
return false;
}
$data = $this->request->getBodyParams();
if (isset($data) && isset($data['productId']) && isset($data['templateId']) && isset($data['lastSortOrder'])) {
$this->logger->debug(
"Importing options <=> ProductId: {$data['productId']}, TemplateId: {$data['templateId']}," .
" LastSortOrder : {$data['lastSortOrder']}"
);
$result = $this->manageOptions->optionsFromTemplate(
$data['productId'],
$data['templateId'],
$data['lastSortOrder']
);
$response = ['success' => $result];
} else {
$response = ['success' => false];
}
return json_encode($response);
}
/**
* @return bool|mixed
*/
public function createLog()
{
if (!$this->checkPermissions()) {
return false;
}
$data = $this->request->getBodyParams();
if (isset($data) && isset($data['productId']) && isset($data['title']) && isset($data['message'])) {
/* @var \Magento\Catalog\Model\Product $product */
$product = $this->helper->getProduct($data['productId']);
$templateId = $data['templateId'] ?? '';
if (isset($product) && !empty($product)) {
$this->logger->debug(
"CUSTOMILY: {$data['title']} (sku: {$product->getSku()}, productName: {$product->getName()}," .
" templateId: {$templateId})"
);
$this->logger->debug($data['message']);
}
}
return true;
}
/**
* @param $data
* @param $targetDir
* @param $urlPath
* @param string $fileType
* @return array|false
*/
private function saveImage($data, $targetDir, $urlPath, $fileType = 'image')
{
if (!$this->checkPermissions()) {
return false;
}
try {
if ($fileType == 'svg') {
$ext = 'svg';
} else {
$data = 'image/png;base64,' . $data;
list($type, $data) = explode(';', $data);
list(, $data) = explode(',', $data);
$data = base64_decode($data);
list(, $ext) = explode('/', $type);
}
if (!file_exists($targetDir)) {
mkdir($targetDir, 0777, true);
}
$imageId = uniqid('', true);
$imageId = str_replace('.', '', $imageId);
$imagePath = $targetDir . $imageId . '.' . $ext;
$imageUrl = $urlPath . $imageId . '.' . $ext;
file_put_contents($imagePath, $data);
return [
'success' => true,
'imageUrl' => $imageUrl
];
} catch (\Exception $e) {
$this->logger->debug('CUSTOMILY: Error uploading swatch thumbnail.');
$this->logger->debug($e->getTraceAsString());
return [
'success' => false,
'imageUrl' => ''
];
}
}
/**
* @return bool
*/
private function checkPermissions()
{
try {
$settings = $this->helper->getCustomilyConfig();
$localApiKey = $settings['m_api_key'];
$apiKey = $this->request->getHeader('m-api-key');
if (
isset($localApiKey) && !empty($localApiKey) &&
isset($apiKey) && !empty($localApiKey) &&
base64_decode($localApiKey) == base64_decode($apiKey)
) {
return true;
}
} catch (\Exception $ex) {
$this->logger->debug('CUSTOMILY: Invalid api key.');
$this->logger->debug($ex->getTraceAsString());
}
return false;
}
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 03/09/2020
*/
namespace Customily\Categories\Api\Server;
interface ApiRestInterface
{
/**
* @return mixed
*/
public function testApi();
/**
* @return mixed
*/
public function status();
/**
* @return mixed
*/
public function uploadThumbnail();
/**
* @return mixed
*/
public function deleteThumbnail();
/**
* @return mixed
*/
public function uploadPreview();
/**
* @return mixed
*/
public function optionsFromTemplate();
/**
* @return mixed
*/
public function createLog();
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
*/
namespace Customily\Categories\Block\Product\View\Options\Type\Select;
use Magento\Catalog\Api\Data\ProductCustomOptionValuesInterface;
use Magento\Catalog\Block\Product\View\Options\AbstractOptions;
use Magento\Catalog\Model\Product\Option;
class Checkable extends AbstractOptions
{
/**
* @var string
*/
protected $_template = 'Customily_Categories::product/composite/fieldset/options/view/checkable.phtml';
/**
* @param ProductCustomOptionValuesInterface $value
* Returns formatted price
*/
public function formatPrice(ProductCustomOptionValuesInterface $value)
{
// @noinspection PhpMethodParametersCountMismatchInspection
return parent::_formatPrice(
[
'is_percent' => $value->getPriceType() === 'percent',
'pricing_value' => $value->getPrice($value->getPriceType() === 'percent')
]
);
}
/**
* @param ProductCustomOptionValuesInterface $value
* Returns current currency for store
*
* @return float|string
*/
public function getCurrencyByStore(ProductCustomOptionValuesInterface $value)
{
// @noinspection PhpMethodParametersCountMismatchInspection
return $this->pricingHelper->currencyByStore(
$value->getPrice(true),
$this->getProduct()->getStore(),
false
);
}
/**
* @param Option $option
* Returns preconfigured value for given option
*
* @return null|array|string
*/
public function getPreconfiguredValue(Option $option)
{
return $this->getProduct()->getPreconfiguredValues()->getData('options/' . $option->getId());
}
}
<?php
/**
* Copyright © Customily. All rights reserved.
*/
namespace Customily\Categories\Block\Product\View\Options\Type\Select;
use Magento\Catalog\Block\Product\View\Options\AbstractOptions;
use Magento\Catalog\Model\Product\Option;
use Magento\Framework\View\Element\Html\Select;
class Multiple extends AbstractOptions
{
/**
* @var bool
*/
private $existConfigValue = false;
/**
* {@inheritdoc}
*
* @throws \Magento\Framework\Exception\LocalizedException
*
* @return string
*/
protected function _toHtml()
{
$option = $this->getOption();
$optionType = $option->getType();
$configValue = $this->getProduct()->getPreconfiguredValues()->getData('options/' . $option->getId());
$require = $option->getIsRequire() ? ' required' : '';
$extraParams = '';
if ($configValue) {
$this->existConfigValue = true;
}
/** @var Select $select */
$select = $this->getLayout()->createBlock(Select::class)->setData(
[
'id' => 'select_' . $option->getId(),
'class' => $require . ' product-custom-option admin__control-select'
]
);
$select = $this->insertSelectOption($select, $option);
$select = $this->processSelectOption($select, $option);
if ($optionType === Option::OPTION_TYPE_MULTIPLE) {
$extraParams = ' multiple="multiple"';
}
if (!$this->getSkipJsReloadPrice()) {
$extraParams .= ' onchange="opConfig.reloadPrice()"';
}
$extraParams .= ' data-selector="' . $select->getName() . '"';
$select->setExtraParams($extraParams);
if ($this->existConfigValue) {
$select->setValue($configValue);
}
return $select->getHtml();
}
/**
* Returns select with inserted option give as a parameter
*/
private function insertSelectOption(Select $select, Option $option): Select
{
$require = $option->getIsRequire() ? ' required' : '';
if ($option->getType() === Option::OPTION_TYPE_DROP_DOWN) {
$select->setName('options[' . $option->getId() . ']')->addOption('', __('-- Please Select --'));
} else {
$select->setName('options[' . $option->getId() . '][]');
$select->setClass('multiselect admin__control-multiselect' . $require . ' product-custom-option');
}
return $select;
}
/**
* Returns select with formatted option prices
*/
private function processSelectOption(Select $select, Option $option): Select
{
$store = $this->getProduct()->getStore();
foreach ($option->getValues() as $_value) {
$isPercentPriceType = $_value->getPriceType() === 'percent';
$priceStr = $this->_formatPrice(
[
'is_percent' => $isPercentPriceType,
'pricing_value' => $_value->getPrice($isPercentPriceType)
],
false
);
$selectOption = [];
if (!$this->existConfigValue && $_value->getData('customily_is_default')) {
$selectOption = ['selected' => 'selected'];
}
$select->addOption(
$_value->getOptionTypeId(),
$_value->getTitle() . ' ' . strip_tags($priceStr) . '',
[
'price' => $this->pricingHelper->currencyByStore(
$_value->getPrice(true),
$store,
false
),
$selectOption
]
);
}
return $select;
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib;
use Customily\Categories\Libraries\FontLib\Table\Type\name;
use Customily\Categories\Libraries\FontLib\TrueType\File;
/**
* Adobe Font Metrics file creation utility class.
*
* @package php-font-lib
*/
class AdobeFontMetrics {
private $f;
/**
* @var File
*/
private $font;
function __construct(File $font) {
$this->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("Unkown 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/PhenX/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"]));
$this->addPair("Ascender", $font->normalizeFUnit($hhea["ascent"]));
$this->addPair("Descender", $font->normalizeFUnit($hhea["descent"]));
}
else {
$this->addPair("FontHeightOffset", $font->normalizeFUnit($os2["typoLineGap"]));
$this->addPair("Ascender", $font->normalizeFUnit($os2["typoAscender"]));
$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"]),
));
$glyphIndexArray = $font->getUnicodeCharMap();
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");
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien M�nager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib;
/**
* Autoloads FontLib classes
*
* @package php-font-lib
*/
class Autoloader {
const PREFIX = 'FontLib';
/**
* Register the autoloader
*/
public static function register() {
spl_autoload_register(array(new self, 'autoload'));
}
/**
* Autoloader
*
* @param string
*/
public static function autoload($class) {
$prefixLength = strlen(self::PREFIX);
if (0 === strncmp(self::PREFIX, $class, $prefixLength)) {
$file = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, $prefixLength));
$file = realpath(__DIR__ . (empty($file) ? '' : DIRECTORY_SEPARATOR) . $file . '.php');
if (file_exists($file)) {
require_once $file;
}
}
}
}
Autoloader::register();
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\EOT;
/**
* EOT font file.
*
* @package php-font-lib
*/
class File extends \Customily\Categories\Libraries\FontLib\TrueType\File {
const TTEMBED_SUBSET = 0x00000001;
const TTEMBED_TTCOMPRESSED = 0x00000004;
const TTEMBED_FAILIFVARIATIONSIMULATED = 0x00000010;
const TTMBED_EMBEDEUDC = 0x00000020;
const TTEMBED_VALIDATIONTESTS = 0x00000040; // Deprecated
const TTEMBED_WEBOBJECT = 0x00000080;
const TTEMBED_XORENCRYPTDATA = 0x10000000;
/**
* @var Header
*/
public $header;
function parseHeader() {
if (!empty($this->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 = fread($this->f, $n);
$chunks = str_split($string, 2);
$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;
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\EOT;
use Exception;
use Customily\Categories\Libraries\FontLib\Font;
/**
* TrueType font file header.
*
* @package php-font-lib
*
* @property File $font
*/
class Header extends \Customily\Categories\Libraries\FontLib\Header {
protected $def = array(
"format" => 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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib;
/**
* Encoding map used to map a code point to a Unicode char.
*
* @package php-font-lib
*/
class EncodingMap {
private $f;
function __construct($file) {
$this->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;
}
}
<?php
namespace Customily\Categories\Libraries\FontLib\Exception;
class FontNotFoundException extends \Exception
{
public function __construct($fontPath)
{
$this->message = 'Font not found in: ' . $fontPath;
}
}
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib;
use Customily\Categories\Libraries\FontLib\Exception\FontNotFoundException;
/**
* Generic font file.
*
* @package php-font-lib
*/
class Font {
static $debug = false;
/**
* @param string $file The font file
*
* @return TrueType\File|null $file
*/
public static function load($file) {
if(!file_exists($file)){
throw new FontNotFoundException($file);
}
$header = file_get_contents($file, false, null, null, 4);
$class = null;
switch ($header) {
case "\x00\x01\x00\x00":
case "true":
case "typ1":
$class = "TrueType\\File";
break;
case "OTTO":
$class = "OpenType\\File";
break;
case "wOFF":
$class = "WOFF\\File";
break;
case "ttcf":
$class = "TrueType\\Collection";
break;
// Unknown type or EOT
default:
$magicNumber = file_get_contents($file, false, null, 34, 2);
if ($magicNumber === "LP") {
$class = "EOT\\File";
}
}
if ($class) {
$class = "Customily\\Categories\\Libraries\\FontLib\\$class";
/** @var TrueType\File $obj */
$obj = new $class;
$obj->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");
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
*/
namespace Customily\Categories\Libraries\FontLib\Glyph;
use Customily\Categories\Libraries\FontLib\Table\Type\glyf;
use Customily\Categories\Libraries\FontLib\TrueType\File;
use Customily\Categories\Libraries\FontLib\BinaryStream;
/**
* `glyf` font table.
*
* @package php-font-lib
*/
class Outline extends BinaryStream {
/**
* @var \Customily\Categories\Libraries\FontLib\Table\Type\glyf
*/
protected $table;
protected $offset;
protected $size;
// Data
public $numberOfContours;
public $xMin;
public $yMin;
public $xMax;
public $yMax;
public $raw;
/**
* @param glyf $table
* @param $offset
* @param $size
*
* @return Outline
*/
static function init(glyf $table, $offset, $size, BinaryStream $font) {
$font->seek($offset);
if ($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);
if (!$this->size) {
return;
}
$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, strlen($this->raw));
}
function getSVGContours() {
// Inherit
}
function getGlyphIDs() {
return array();
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
*/
namespace Customily\Categories\Libraries\FontLib\Glyph;
/**
* Glyph outline component
*
* @package php-font-lib
*/
class OutlineComponent {
public $flags;
public $glyphIndex;
public $a, $b, $c, $d, $e, $f;
public $point_compound;
public $point_component;
public $instructions;
function getMatrix() {
return array(
$this->a, $this->b,
$this->c, $this->d,
$this->e, $this->f,
);
}
}
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
*/
namespace Customily\Categories\Libraries\FontLib\Glyph;
/**
* Composite glyph outline
*
* @package php-font-lib
*/
class OutlineComposite extends Outline {
const ARG_1_AND_2_ARE_WORDS = 0x0001;
const ARGS_ARE_XY_VALUES = 0x0002;
const ROUND_XY_TO_GRID = 0x0004;
const WE_HAVE_A_SCALE = 0x0008;
const MORE_COMPONENTS = 0x0020;
const WE_HAVE_AN_X_AND_Y_SCALE = 0x0040;
const WE_HAVE_A_TWO_BY_TWO = 0x0080;
const WE_HAVE_INSTRUCTIONS = 0x0100;
const USE_MY_METRICS = 0x0200;
const OVERLAP_COMPOUND = 0x0400;
/**
* @var OutlineComponent[]
*/
public $components = array();
function getGlyphIDs() {
if (empty($this->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);
}
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;
}
$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);
}
}
return $size;
}
public function getSVGContours() {
$contours = array();
/** @var \Customily\Categories\Libraries\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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
*/
namespace Customily\Categories\Libraries\FontLib\Glyph;
/**
* `glyf` font table.
*
* @package php-font-lib
*/
class OutlineSimple extends Outline {
const ON_CURVE = 0x01;
const X_SHORT_VECTOR = 0x02;
const Y_SHORT_VECTOR = 0x04;
const REPEAT = 0x08;
const THIS_X_IS_SAME = 0x10;
const THIS_Y_IS_SAME = 0x20;
public $instructions;
public $points;
function parseData() {
parent::parseData();
if (!$this->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 = 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;
}
}
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib;
use Customily\Categories\Libraries\FontLib\TrueType\File;
/**
* Font header container.
*
* @package php-font-lib
*/
abstract class Header extends BinaryStream {
/**
* @var File
*/
protected $font;
protected $def = array();
public $data;
public function __construct(File $font) {
$this->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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\OpenType;
/**
* Open Type font, the same as a TrueType one.
*
* @package php-font-lib
*/
class File extends \Customily\Categories\Libraries\FontLib\TrueType\File {
//
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\OpenType;
/**
* Open Type Table directory entry, the same as a TrueType one.
*
* @package php-font-lib
*/
class TableDirectoryEntry extends \Customily\Categories\Libraries\FontLib\TrueType\TableDirectoryEntry {
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table;
use Customily\Categories\Libraries\FontLib\TrueType\File;
use Customily\Categories\Libraries\FontLib\Font;
use Customily\Categories\Libraries\FontLib\BinaryStream;
/**
* Generic Font table directory entry.
*
* @package php-font-lib
*/
class DirectoryEntry extends BinaryStream {
/**
* @var File
*/
protected $font;
/**
* @var Table
*/
protected $font_table;
public $entryLength = 4;
public $tag;
public $checksum;
public $offset;
public $length;
protected $origF;
static function computeChecksum($data) {
$len = strlen($data);
$mod = $len % 4;
if ($mod) {
$data = str_pad($data, $len + (4 - $mod), "\0");
}
$len = strlen($data);
$hi = 0x0000;
$lo = 0x0000;
for ($i = 0; $i < $len; $i += 4) {
$hi += (ord($data[$i]) << 8) + ord($data[$i + 1]);
$lo += (ord($data[$i + 2]) << 8) + ord($data[$i + 3]);
$hi += $lo >> 16;
$lo = $lo & 0xFFFF;
$hi = $hi & 0xFFFF;
}
return ($hi << 8) + $lo;
}
function __construct(File $font) {
$this->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_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);
}
/**
* @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() {
//
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table;
use Customily\Categories\Libraries\FontLib\TrueType\File;
use Customily\Categories\Libraries\FontLib\Font;
use Customily\Categories\Libraries\FontLib\BinaryStream;
/**
* Generic font table.
*
* @package php-font-lib
*/
class Table extends BinaryStream {
/**
* @var DirectoryEntry
*/
protected $entry;
protected $def = array();
public $data;
final public function __construct(DirectoryEntry $entry) {
$this->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 "<pre>" . var_export($this->data, true) . "</pre>";
}
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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Table\Table;
/**
* `cmap` font table.
*
* @package php-font-lib
*/
class cmap extends Table {
private static $header_format = array(
"version" => self::uint16,
"numberSubtables" => self::uint16,
);
private static $subtable_header_format = array(
"platformID" => self::uint16,
"platformSpecificID" => self::uint16,
"offset" => self::uint32,
);
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();
// @todo Only CMAP version 4 and 12
if (($subtable["format"] != 4) && ($subtable["format"] != 12)) {
unset($data["subtables"][$i]);
$data["numberSubtables"]--;
continue;
}
if ($subtable["format"] == 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,
);
}
else if ($subtable["format"] == 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 ($ro == 0) {
$gid = ($c + $d) & 0xFFFF;
}
else {
$offset = ($c - $c1) * 2 + $ro;
$offset = $ro_start + 2 * $i + $offset;
$font->seek($offset);
$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,
);
}
}
$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, 0xFFFF);
$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);
$length += $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;
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Table\Table;
use Customily\Categories\Libraries\FontLib\Glyph\Outline;
use Customily\Categories\Libraries\FontLib\Glyph\OutlineSimple;
/**
* `glyf` font table.
*
* @package php-font-lib
* @property Outline[] $data
*/
class glyf extends Table {
protected function _parse() {
$font = $this->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() {
$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);
}
$n = 500;
$s = "<h3>" . "Only the first $n simple glyphs are shown (" . count($this->data) . " total)
<div class='glyph-view simple'>Simple glyph</div>
<div class='glyph-view composite'>Composite glyph</div>
Zoom: <input type='range' value='100' max='400' onchange='Glyph.resize(this.value)' />
</h3>
<script>
Glyph.ratio = $ratio;
Glyph.head = $head_json;
Glyph.os2 = $os2_json;
Glyph.hmtx = $hmtx_json;
Glyph.width = $width;
Glyph.height = $height;
</script>";
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]};" : "";
$s .= "<div class='glyph-view $type' id='glyph-$g'>
<span class='glyph-id'>$g</span>
<span class='char'>$char</span>
<span class='char-name'>$name</span>
";
if ($type == "composite") {
foreach ($glyph->getGlyphIDs() as $_id) {
$s .= "<a href='#glyph-$_id' class='glyph-component-id'>$_id</a> ";
}
}
$s .= "<br />
<canvas width='$width' height='$height' id='glyph-canvas-$g'></canvas>
</div>
<script>Glyph.glyphs.push([$g,$shape_json]);</script>";
}
return $s;
}
protected function _encode() {
$font = $this->getFont();
$subset = $font->getSubset();
$data = $this->data;
$loca = array();
$length = 0;
foreach ($subset as $gid) {
$loca[] = $length;
$length += $data[$gid]->encode();
}
$loca[] = $length; // dummy loca
$font->getTableObject("loca")->data = $loca;
return $length;
}
}
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Table\Table;
use Exception;
/**
* `head` font table.
*
* @package php-font-lib
*/
class head extends Table {
protected $def = array(
"tableVersion" => 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"]) . ")");
}
}
}
\ No newline at end of file
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Table\Table;
/**
* `hhea` font table.
*
* @package php-font-lib
*/
class hhea extends Table {
protected $def = array(
"version" => 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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Table\Table;
/**
* `hmtx` font table.
*
* @package php-font-lib
*/
class hmtx extends Table {
protected function _parse() {
$font = $this->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);
$data = array_pad($data, $numGlyphs, $lastWidth);
}
$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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Table\Table;
/**
* `kern` font table.
*
* @package php-font-lib
*/
class kern extends Table {
protected function _parse() {
$font = $this->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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Table\Table;
/**
* `loca` font table.
*
* @package php-font-lib
*/
class loca extends Table {
protected function _parse() {
$font = $this->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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Table\Table;
/**
* `maxp` font table.
*
* @package php-font-lib
*/
class maxp extends Table {
protected $def = array(
"version" => 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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Table\Table;
use Customily\Categories\Libraries\FontLib\Font;
/**
* `name` font table.
*
* @package php-font-lib
*/
class name extends Table {
private static $header_format = array(
"format" => 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;
}
$names = array();
foreach ($records as $record) {
$font->seek($tableOffset + $data["stringOffset"] + $record->offset);
$s = $font->read($record->length);
$record->string = Font::UTF16ToUTF8($s);
$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;
foreach ($records as $record) {
$record->length = mb_strlen($record->getUTF16(), "8bit");
$record->offset = $offset;
$offset += $record->length;
$length += $font->pack(nameRecord::$format, (array)$record);
}
foreach ($records as $record) {
$str = $record->getUTF16();
$length += $font->write($str, mb_strlen($str, "8bit"));
}
return $length;
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Font;
use Customily\Categories\Libraries\FontLib\BinaryStream;
/**
* Font table name record.
*
* @package php-font-lib
*/
class nameRecord extends BinaryStream {
public $platformID;
public $platformSpecificID;
public $languageID;
public $nameID;
public $length;
public $offset;
public $string;
public static $format = array(
"platformID" => 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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Table\Table;
/**
* `OS/2` font table.
*
* @package php-font-lib
*/
class os2 extends Table {
protected $def = array(
"version" => 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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\Table\Type;
use Customily\Categories\Libraries\FontLib\Table\Table;
use Customily\Categories\Libraries\FontLib\TrueType\File;
/**
* `post` font table.
*
* @package php-font-lib
*/
class post extends Table {
protected $def = array(
"format" => 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 {
$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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\TrueType;
use Countable;
use Customily\Categories\Libraries\FontLib\BinaryStream;
use Iterator;
use OutOfBoundsException;
/**
* TrueType collection font file.
*
* @package php-font-lib
*/
class Collection extends BinaryStream implements Iterator, Countable {
/**
* Current iterator position.
*
* @var integer
*/
private $position = 0;
protected $collectionOffsets = array();
protected $collection = array();
protected $version;
protected $numFonts;
function parse() {
if (isset($this->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();
}
}
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;
}
#[\ReturnTypeWillChange]
function current() {
return $this->getFont($this->position);
}
#[\ReturnTypeWillChange]
function key() {
return $this->position;
}
#[\ReturnTypeWillChange]
function next() {
return ++$this->position;
}
#[\ReturnTypeWillChange]
function rewind() {
$this->position = 0;
}
#[\ReturnTypeWillChange]
function valid() {
$this->parse();
return isset($this->collectionOffsets[$this->position]);
}
#[\ReturnTypeWillChange]
function count() {
$this->parse();
return $this->numFonts;
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\TrueType;
/**
* TrueType font file header.
*
* @package php-font-lib
*/
class Header extends \Customily\Categories\Libraries\FontLib\Header {
protected $def = array(
"format" => 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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\TrueType;
use Customily\Categories\Libraries\FontLib\Table\DirectoryEntry;
/**
* TrueType table directory entry.
*
* @package php-font-lib
*/
class TableDirectoryEntry extends DirectoryEntry {
function __construct(File $font) {
parent::__construct($font);
}
function parse() {
parent::parse();
$font = $this->font;
$this->checksum = $font->readUInt32();
$this->offset = $font->readUInt32();
$this->length = $font->readUInt32();
$this->entryLength += 12;
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\WOFF;
use Customily\Categories\Libraries\FontLib\Table\DirectoryEntry;
/**
* WOFF font file.
*
* @package php-font-lib
*
* @property TableDirectoryEntry[] $directory
*/
class File extends \Customily\Categories\Libraries\FontLib\TrueType\File {
function parseHeader() {
if (!empty($this->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 = gzuncompress($data);
}
// Prepare data ...
$length = strlen($data);
$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();
}
}
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\WOFF;
/**
* WOFF font file header.
*
* @package php-font-lib
*/
class Header extends \Customily\Categories\Libraries\FontLib\TrueType\Header {
protected $def = array(
"format" => 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
<?php
/**
* @package php-font-lib
* @link https://github.com/PhenX/php-font-lib
* @author Fabien Ménager <fabien.menager@gmail.com>
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
namespace Customily\Categories\Libraries\FontLib\WOFF;
use Customily\Categories\Libraries\FontLib\Table\DirectoryEntry;
/**
* WOFF font file table directory entry.
*
* @package php-font-lib
*/
class TableDirectoryEntry extends DirectoryEntry {
public $origLength;
function __construct(File $font) {
parent::__construct($font);
}
function parse() {
parent::parse();
$font = $this->font;
$this->offset = $font->readUInt32();
$this->length = $font->readUInt32();
$this->origLength = $font->readUInt32();
$this->checksum = $font->readUInt32();
}
}
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 30/09/2020
*/
namespace Customily\Categories\Model\Config;
use Customily\Categories\Helper\CustomilyHelper;
use Magento\Config\Model\Config\CommentInterface;
class ModuleEnableComment implements CommentInterface
{
private $helper;
/**
* ModuleEnableComment constructor.
* @param CustomilyHelper $helper
*/
public function __construct(CustomilyHelper $helper)
{
$this->helper = $helper;
}
/**
* Retrieve element comment by element value
* @param string $elementValue
* @return string
*/
public function getCommentText($elementValue)
{
$moduleVersion = $this->helper->getModuleVersion();
$productCount = $this->helper->getCustomilyProductCount();
return '<b>Module Version: </b>' . $moduleVersion . '&nbsp;&nbsp;&nbsp;&nbsp;<b>Products Count: </b>' . $productCount;
}
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 25/08/2020
*/
namespace Customily\Categories\Model\Config\Source;
class PersonalizationAttachTo implements \Magento\Framework\Data\OptionSourceInterface
{
/**
* Options getter
*
* @return array
*/
public function toOptionArray()
{
return [
['value' => 'default', 'label' => __('Default')],
['value' => 'child', 'label' => __('Child Product')]
];
}
/**
* Get options in "key-value" format
*
* @return array
*/
public function toArray()
{
return ['default' => __('Default'), 'child' => __('Child Product')];
}
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 25/08/2020
*/
namespace Customily\Categories\Model\Config\Source;
class PersonalizationBehavior implements \Magento\Framework\Data\OptionSourceInterface
{
/**
* Options getter
*
* @return array
*/
public function toOptionArray()
{
return [
['value' => 'visible', 'label' => __('Visible by Default')],
['value' => 'hidden', 'label' => __('Hidden by Default')]
];
}
/**
* Get options in "key-value" format
*
* @return array
*/
public function toArray()
{
return ['visible' => __('Visible by Default'), 'hidden' => __('Hidden by Default')];
}
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 25/08/2020
*/
namespace Customily\Categories\Model\Config\Source;
class PersonalizationType implements \Magento\Framework\Data\OptionSourceInterface
{
/**
* Options getter
*
* @return array
*/
public function toOptionArray()
{
return [
['value' => 'page-preview', 'label' => __('Product Page Preview')],
['value' => 'modal-preview', 'label' => __('Modal Preview')]
];
}
/**
* Get options in "key-value" format
*
* @return array
*/
public function toArray()
{
return ['page-preview' => __('Product Page Preview'), 'modal-preview' => __('Modal Preview')];
}
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 04/09/2020
*/
namespace Customily\Categories\Model\Config\Source;
class ServerToSaveFile implements \Magento\Framework\Data\OptionSourceInterface
{
/**
* Options getter
*
* @return array
*/
public function toOptionArray()
{
return [
['value' => 'magento', 'label' => __('Magento Server')],
['value' => 'customily', 'label' => __('Customily Server')]
];
}
/**
* Get options in "key-value" format
*
* @return array
*/
public function toArray()
{
return ['magento' => __('Magento Server'), 'customily' => __('Customily Server')];
}
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
*/
/**
* Author: Customily
* Date: 18-07-18
* Time: 06:41 PM
*/
namespace Customily\Categories\Observer\Frontend;
use Customily\Categories\Api\Client\ApiClient;
use Customily\Categories\Helper\CustomilyHelper;
use Magento\Framework\Event\Observer as EventObserver;
use Magento\Framework\Event\ObserverInterface;
use Psr\Log\LoggerInterface;
class QuoteSubmitBeforeObserver implements ObserverInterface
{
private $quoteItems = [];
/* @var Magento\Payment\Model\Cart\SalesModel\Quote */
private $quote = null;
/* @var \Magento\Sales\Model\Order */
private $order = null;
private $helper;
private $apiClient;
private $logger;
private $settings;
public function __construct(
CustomilyHelper $helper,
ApiClient $apiClient,
LoggerInterface $logger
)
{
$this->helper = $helper;
$this->apiClient = $apiClient;
$this->logger = $logger;
$this->settings = $helper->getCustomilyConfig();
}
/**
* @param EventObserver $observer
* @return void
*/
public function execute(EventObserver $observer) {
$this->quote = $observer->getQuote();
$this->order = $observer->getOrder();
if (!$this->quote->getItems()) {
return $this;
}
$this->initQuoteItems();
$index = 0;
/* @var \Magento\Sales\Model\Order\Item $orderItem */
foreach ($this->order->getItems() as $orderItem) {
if (!$orderItem->getParentItemId()) {
/* @var \Magento\Quote\Model\Quote\Item $quoteItem */
if ($quoteItem = $this->getQuoteItemById($orderItem->getQuoteItemId())) {
/* @var \Magento\Framework\DataObject $infoBuyRequest */
$infoBuyRequest = $quoteItem->getBuyRequest();
$additionalOptions = array();
$index++;
if ($additionalOption = $quoteItem->getOptionByCode('additional_options')) {
$additionalOptions = json_decode($additionalOption->getValue(), true);
}
if (isset($infoBuyRequest)) {
$customilyInfo = $infoBuyRequest->getCustomily();
if (isset($customilyInfo)) {
if (isset($customilyInfo['url_thumbnail']) && !empty($customilyInfo['url_thumbnail'])) {
$additionalOptions[] = [
'label' => 'Thumbnail',
'value' => $customilyInfo['url_thumbnail']
];
}
if (isset($customilyInfo['url_preview']) && !empty($customilyInfo['url_preview'])) {
$additionalOptions[] = [
'label' => 'Preview',
'value' => $customilyInfo['url_preview']
];
}
if (isset($customilyInfo['magento_product_id']) && !empty($customilyInfo['magento_product_id'])) {
$additionalOptions[] = [
'label' => 'magento_product_id',
'value' => $customilyInfo['magento_product_id']
];
}
if (isset($customilyInfo['personalization_id']) && !empty($customilyInfo['personalization_id'])) {
$additionalOptions[] = [
'label' => 'Personalization Id',
'value' => $customilyInfo['personalization_id']
];
if (isset($this->settings['enable_logs']) && $this->settings['enable_logs'] === '1') {
$this->logger->debug("Customily Magento: generating production file for orderId: {$this->order->getIncrementId()}, personalizationId {$customilyInfo['personalization_id']}, sku: {$quoteItem->getSku()}, productName: {$quoteItem->getName()}.");
}
$response = $this->exportProductionFile($customilyInfo['personalization_id'], $orderItem, $index);
if (isset($response) && isset($response['Url'])) {
$additionalOptions[] = [
'label' => 'Production file',
'value' => $response['Url']
];
if (isset($this->settings['enable_logs']) && $this->settings['enable_logs'] === '1') {
$this->logger->debug("Customily Magento: production file generated for orderId: {$this->order->getIncrementId()}, sku: {$quoteItem->getSku()}, productName: {$quoteItem->getName()}, productionFileUrl: {$response['Url']}.");
}
} else {
if (isset($this->settings['enable_logs']) && $this->settings['enable_logs'] === '1') {
$this->logger->debug("Customily Magento: Error generating production file for orderId: {$this->order->getIncrementId()}, personalizationId {$customilyInfo['personalization_id']}, sku: {$quoteItem->getSku()}, productName: {$quoteItem->getName()}.");
}
}
}
}
}
if (count($additionalOptions) > 0) {
$options = $orderItem->getProductOptions();
$options['additional_options'] = $additionalOptions;
$orderItem->setProductOptions($options);
}
}
}
}
}
private function initQuoteItems() {
/* @var \Magento\Quote\Model\Quote\Item $item */
foreach ($this->quote->getItems() as $item) {
if (!$item->getParentItemId()) {
$this->quoteItems[$item->getId()] = $item;
}
}
}
/**
* @param $id
* @return \Magento\Sales\Model\Order\Item|null
*/
private function getQuoteItemById($id) {
if (array_key_exists($id, $this->quoteItems)) {
return $this->quoteItems[$id];
}
return null;
}
/**
* @param $personalizationId
* @param $orderItem
* @param $index
* @return \GuzzleHttp\Psr7\PumpStream|\GuzzleHttp\Psr7\Stream|\Psr\Http\Message\StreamInterface|null
*/
private function exportProductionFile($personalizationId, $orderItem, $index) {
if (isset($this->settings['rename_file']) && $this->settings['rename_file'] === '1') {
$fileName = $this->helper->getProductionFileName($this->order, $orderItem) . '_' . $index;
} else {
$fileName = $this->helper->guidv4();
}
return $this->apiClient->generateProductionFile($personalizationId, $this->order->getIncrementId(), $fileName);
}
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
*/
namespace Customily\Categories\Plugin\Catalog\Block\Product\View\Options\Type;
use Customily\Categories\Helper\CustomilyHelper;
use Magento\Catalog\Block\Product\View\Options\Type\Select as TypeSelect;
use Magento\Catalog\Model\Product\Option;
use Psr\Log\LoggerInterface;
use Customily\Categories\Block\Product\View\Options\Type\Select\Multiple;
use Customily\Categories\Block\Product\View\Options\Type\Select\Checkable;
final class Select
{
private $helper;
private $logger;
private $multipleBlock;
private $checkableBlock;
/**
* Select constructor.
* @param CustomilyHelper $helper
* @param LoggerInterface $logger
* @param Multiple $multipleBlock
* @param Checkable $checkableBlock
*/
public function __construct(
CustomilyHelper $helper,
LoggerInterface $logger,
Multiple $multipleBlock,
Checkable $checkableBlock
)
{
$this->helper = $helper;
$this->logger = $logger;
$this->multipleBlock = $multipleBlock;
$this->checkableBlock = $checkableBlock;
}
public function aroundGetValuesHtml(TypeSelect $subject, \Closure $proceed)
{
$settings = $this->helper->getCustomilyConfig();
if (isset($settings) && $settings['enable'] === '1' && $settings['selectable_default_value'] === '1') {
try {
$option = $subject->getOption();
$optionType = $option->getType();
if ($optionType === Option::OPTION_TYPE_DROP_DOWN || $optionType === Option::OPTION_TYPE_MULTIPLE) {
return $this->multipleBlock
->setOption($option)
->setProduct($subject->getProduct())
->setSkipJsReloadPrice(1)
->toHtml();
}
if ($optionType === Option::OPTION_TYPE_RADIO || $optionType === Option::OPTION_TYPE_CHECKBOX) {
return $this->checkableBlock
->setOption($option)
->setProduct($subject->getProduct())
->setSkipJsReloadPrice(1)
->toHtml();
}
} catch (\Exception $e) {
if ($settings['enable_logs'] === '1') {
$this->logger->debug($e->getTraceAsString());
}
}
}
return $proceed();
}
}
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 09/12/2019
*/
namespace Customily\Categories\Plugin\Checkout\Block\Cart\Item;
use Customily\Categories\Helper\CustomilyHelper;
use Psr\Log\LoggerInterface;
class Renderer
{
private $helper;
private $logger;
/**
* Renderer constructor.
* @param CustomilyHelper $helper
* @param LoggerInterface $logger
*/
public function __construct(CustomilyHelper $helper, LoggerInterface $logger)
{
$this->helper = $helper;
$this->logger = $logger;
}
public function afterGetImage($subject, $result)
{
$settings = $this->helper->getCustomilyConfig();
if (isset($settings) && $settings['enable'] === '1' && $settings['custom_cart_thumbnail'] === '1') {
try {
$item = $subject->getItem();
$data = $this->helper->getQuoteBuyRequest($item->getId());
if (
isset($data['customily']) &&
isset($data['customily']['url_thumbnail']) &&
!empty($data['customily']['url_thumbnail'])
) {
$result->setImageUrl($data['customily']['url_thumbnail']);
}
} catch (\Exception $e) {
if ($settings['enable_logs'] === '1') {
$this->logger->debug($e->getTraceAsString());
}
}
}
return $result;
}
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 09/12/2019
*/
namespace Customily\Categories\Plugin\Checkout\CustomerData;
use Customily\Categories\Helper\CustomilyHelper;
use Psr\Log\LoggerInterface;
class AbstractItem
{
private $helper;
private $logger;
/**
* CustomMiniCartItemImage constructor.
* @param CustomilyHelper $helper
* @param LoggerInterface $logger
*/
public function __construct(CustomilyHelper $helper, LoggerInterface $logger)
{
$this->helper = $helper;
$this->logger = $logger;
}
public function aroundGetItemData($subject, $proceed, $item)
{
$result = $proceed($item);
$settings = $this->helper->getCustomilyConfig();
if (isset($settings) && $settings['enable'] === '1' && $settings['custom_minicart_thumbnail'] === '1') {
try {
$data = $this->helper->getQuoteBuyRequest($result['item_id']);
if (
isset($data['customily']) &&
isset($data['customily']['url_thumbnail']) &&
!empty($data['customily']['url_thumbnail'])
) {
$result['product_image']['src'] = $data['customily']['url_thumbnail'];
}
} catch (\Exception $e) {
if ($settings['enable_logs'] === '1') {
$this->logger->debug($e->getTraceAsString());
}
}
}
return $result;
}
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 30/04/2020
*/
namespace Customily\Categories\Plugin\Quote\Model\Quote;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Customily\Categories\Helper\CustomilyHelper;
use Psr\Log\LoggerInterface;
class Item
{
private $helper;
private $productRepository;
private $logger;
/**
* AddNewProductToCart constructor.
* @param CustomilyHelper $helper
* @param ProductRepositoryInterface $productRepository
* @param LoggerInterface $logger
*/
public function __construct(
CustomilyHelper $helper,
ProductRepositoryInterface $productRepository,
LoggerInterface $logger
)
{
$this->productRepository = $productRepository;
$this->helper = $helper;
$this->logger = $logger;
}
public function afterRepresentProduct($subject, $result)
{
try {
$settings = $this->helper->getCustomilyConfig();
$isCustomilyEnabled = $settings['enable'] ?? false;
$representProduct = $settings['represent_product'] ?? false;
if ($isCustomilyEnabled === '1' && $representProduct === '1') {
$product = $subject->getProduct();
$product = $this->productRepository->getById($product->getId());
$isCustomilyProduct = $product->getCustomProduct();
$isCustomilyProduct = $isCustomilyProduct ?? false;
$customilyProductId = $product->getProductCustomizationId();
$isValidCustomilyProductId = isset($customilyProductId) && $this->helper->validateGuid(
trim($customilyProductId)
);
$isPersonalizedItem = $this->helper->isPersonalizedItem($subject);
if ($isCustomilyProduct === '1' && $isValidCustomilyProductId && $isPersonalizedItem) {
$result = false;
}
}
} catch (\Exception $e) {
$this->logger->debug($e->getTraceAsString());
}
return $result;
}
}
\ No newline at end of file
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 15/12/2021
*/
namespace Customily\Categories\Plugin\Sales\Block\Order\Email\Items;
use Magento\Sales\Block\Order\Email\Items\DefaultItems as BaseDefaultItems;
use Customily\Categories\Helper\CustomilyHelper;
use Psr\Log\LoggerInterface;
class DefaultItems
{
private $helper;
private $logger;
/**
* DefaultItems constructor.
* @param CustomilyHelper $helper
* @param LoggerInterface $logger
*/
public function __construct(
CustomilyHelper $helper,
LoggerInterface $logger
)
{
$this->helper = $helper;
$this->logger = $logger;
}
/**
* @param BaseDefaultItems $subject
* @param array $options
* @return array|mixed
*/
public function afterGetItemOptions($subject, $options) {
try {
$settings = $this->helper->getCustomilyConfig();
if (count($options) > 0 && isset($settings) && $settings['enable'] === '1') {
return $this->helper->getItemOptionsToShow($options, $settings['show_uploaded_image_url']);
}
} catch (\Exception $e) {
$this->logger->debug($e->getTraceAsString());
}
return $options;
}
}
<?php
/**
* Copyright © Customily. All rights reserved.
* Date: 15/12/2021
*/
namespace Customily\Categories\Plugin\Sales\Block\Order\Email\Items\Order;
use Magento\Sales\Block\Order\Email\Items\Order\DefaultOrder as BaseDefaultOrder;
use Customily\Categories\Helper\CustomilyHelper;
use Psr\Log\LoggerInterface;
class DefaultOrder
{
private $helper;
private $logger;
/**
* DefaultOrder constructor.
* @param CustomilyHelper $helper
* @param LoggerInterface $logger
*/
public function __construct(
CustomilyHelper $helper,
LoggerInterface $logger
)
{
$this->helper = $helper;
$this->logger = $logger;
}
/**
* @param BaseDefaultOrder $subject
* @param array $options
* @return array|mixed
*/
public function afterGetItemOptions($subject, $options) {
try {
$settings = $this->helper->getCustomilyConfig();
if (count($options) > 0 && isset($settings) && $settings['enable'] === '1') {
return $this->helper->getItemOptionsToShow($options, $settings['show_uploaded_image_url']);
}
} catch (\Exception $e) {
$this->logger->debug($e->getTraceAsString());
}
return $options;
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment