public function render(Job $job) { $format = $this->configuration->getString('format', 'png'); $defaultColor = $format == 'png' ? 0x0 : 0xffffffff; $backgroundColor = $this->configuration->getColor('background', $defaultColor); foreach ($job->spritesheets as $spritesheet) { /** @var Spritesheet $spritesheet */ $image = ImageTools::createImage($spritesheet->width, $spritesheet->height, $backgroundColor); foreach ($spritesheet->sprites as $sprite) { $repeatY = $sprite->repeatY; while ($repeatY--) { $repeatX = $sprite->repeatX; while ($repeatX--) { imagecopy($image, $sprite->image, $sprite->spriteX + $sprite->paddingLeft + $repeatX * $sprite->width, $sprite->spriteY + $sprite->paddingTop + $repeatY * $sprite->height, 0, 0, $sprite->width, $sprite->height); } } } $output = $this->mosaic->getPath($this->configuration->getString('outputFolder', Configuration::VALUE_REQUIRED)); $encodedSpritesheetPath = Tools::encodeFilePath($output . '/' . $spritesheet->name . '.' . $format); FileTools::createDirectory(dirname($encodedSpritesheetPath)); if ($format == 'png') { imagepng($image, $encodedSpritesheetPath, 9, E_ALL); } elseif ($format == 'jpg') { imagejpeg($image, $encodedSpritesheetPath, $this->configuration->getInt('quality', 90)); } imagedestroy($image); $encodedSpritesheetPath = realpath($encodedSpritesheetPath); if (!$encodedSpritesheetPath) { throw new \Exception('Could not verify rendered spritesheet path.'); } // Normalize output path $spritesheet->path = Tools::decodeFilePath($encodedSpritesheetPath); } }
public function onRendered(Event $e) { $json = ['images' => [], 'frames' => [], 'animations' => []]; if ($framerate = $this->configuration->getFloat('framerate')) { $json['framerate'] = $framerate; } $spritesheetIndex = -1; $spriteIndex = -1; foreach ($this->job->spritesheets as $spritesheet) { $spritesheetIndex++; $animations = []; // $animationPrefix = $this->_configuration->getString('animationPrefix', $this->_job->configuration->getString('name')); $json['images'][] = $this->configuration->getString('spritesheetFolder', Configuration::VALUE_REQUIRED) . basename($spritesheet->path); foreach ($spritesheet->sprites as $sprite) { $spriteIndex++; $configuration = $this->getSpriteConfiguration($sprite); if (preg_match('!(.+)\\{animation(@([0-9.]+))?(@([^@\\}]+))?}!', $sprite->originalName, $animationData)) { if (!isset($animations[$animationData[1]])) { $animations[$animationData[1]] = ['speed' => isset($animationData[3]) ? floatval($animationData[3]) : null, 'sprites' => [$spriteIndex], 'next' => isset($animationData[5]) ? $animationData[5] : null]; if (!$animations[$animationData[1]]['speed']) { $animations[$animationData[1]]['speed'] = $configuration->getFloat('speed', 0); } } else { $animations[$animationData[1]]['sprites'][] = $spriteIndex; } } $frameConfiguration = [$sprite->spriteX, $sprite->spriteY, $sprite->spriteWidth, $sprite->spriteHeight, $spritesheetIndex]; if ($configuration->getBool('center')) { $frameConfiguration[] = round($sprite->spriteWidth / 2); $frameConfiguration[] = round($sprite->spriteHeight / 2); } $json['frames'][] = $frameConfiguration; $json['animations'][$sprite->name] = [$spriteIndex]; } foreach ($animations as $name => $animation) { $ani = ['frames' => $animation['sprites']]; if ($animation['speed']) { $ani['speed'] = $animation['speed']; } if ($next = $animation['next']) { if ($next == 'loop') { $next = $name; } $ani['next'] = $next; } $json['animations'][$name] = $ani; } } $outputFolder = $this->mosaic->getPath($this->configuration->getString('outputFolder', Configuration::VALUE_REQUIRED)); $outputFileBasename = $this->configuration->getString('outputFile', $this->job->configuration->getString('name', Configuration::VALUE_REQUIRED)); $outputPath = $outputFolder . $outputFileBasename . '.json'; $jsonFiles = [$outputPath => $json]; foreach ($jsonFiles as $path => $content) { $path = Tools::encodeFilePath($path); FileTools::createDirectory(dirname($path)); file_put_contents($path, json_encode($content, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); } }
public function deleteAllStorages() { $storages = glob($this->directory . '*'); if ($storages) { foreach ($storages as $storage) { if (is_dir($storage)) { FileTools::deleteDirectory($storage); } } } }
public function load(Job $job) { $excludeFilters = $job->configuration->get('excludes', null); $includeFilters = $job->configuration->get('includes', null); /** @var Sprite[] $loadSprites */ $loadSprites = []; foreach ($this->folders as $folder) { $files = FileTools::listDirectory($folder, false, true); foreach ($files as $file) { $originalSpriteName = pathinfo(str_replace('/', '-', $file), PATHINFO_FILENAME); $filteredSpriteName = preg_replace('/\\{[^\\}]+\\}/', '', $originalSpriteName); // Strip {tags} $included = true; if ($excludeFilters !== null) { $included = !Tools::matches($excludeFilters, $originalSpriteName) && !Tools::matches($excludeFilters, $filteredSpriteName); } elseif ($includeFilters !== null) { $included = false; } if (!$included && $includeFilters !== null) { $included = Tools::matches($includeFilters, $originalSpriteName) || Tools::matches($includeFilters, $filteredSpriteName); } if (!$included) { continue; } $sprite = new Sprite(); $sprite->originalName = $sprite->name = $originalSpriteName; $sprite->name = $filteredSpriteName; $sprite->path = $folder . $file; $loadSprites[$sprite->name] = $sprite; } } foreach ($loadSprites as $sprite) { $sprite->configuration->extend($job->configuration->configuration); $this->extendSpriteSettings($job, $sprite); if (!$sprite->configuration->getBool('enabled', true)) { continue; } $image = ImageTools::checkFile($sprite->path); if ($image->success) { $sprite->image = $image->image; $sprite->calculateDimensions(); $job->sprites[$sprite->name] = $sprite; } } }
public function cleanUp() { if (!$this->filesExpire) { return; } $t = time(); $directories = FileTools::listDirectory($this->directory, true, false); array_unshift($directories, ''); foreach ($directories as $directory) { $files = glob($this->directory . $directory . $this->idPrefix . '*' . $this->idSuffix . $this->extension, GLOB_NOSORT); if ($files) { foreach ($files as $file) { if (filemtime($file) < $t) { unlink($file); if ($this->storeMetadata) { unlink($file . '.dat'); } } } } } }
public function onRendered(Event $e) { $scssContent = ''; $scssVariablesContent = ''; foreach ($this->job->spritesheets as $spritesheet) { $spritesheetName = $spritesheet->name; $spritePrefix = $this->configuration->getString('classPrefix', $this->job->configuration->getString('name') . '-'); $scssPrefix = $this->configuration->getString('scssPrefix', $spritePrefix); $image = $this->configuration->getString('spritesheetFolder') . basename($spritesheet->path); if ($this->configuration->getBool('refreshCache')) { $image .= '?_' . sha1_file($spritesheet->path); } $retinaFactor = $this->configuration->getInt('retinaFactor', 1); $retinaThreshold = $retinaFactor - 0.75; $retinaThresholdPx = round($retinaThreshold * 96); $retinaEnabled = $retinaFactor > 1; $indent = str_repeat(' ', 4); $scssContent .= <<<SCSS @mixin spritesheet-{$spritesheetName}() { display: inline-block; overflow: hidden; background-repeat: no-repeat; background-image: url({$image}); SCSS; $mixinsContent = ''; if ($retinaEnabled) { $scssContent .= $indent . 'background-size: ' . self::cssFormatPx($spritesheet->width / $retinaFactor) . ' auto;' . chr(10); } else { $scssContent .= $indent . 'background-size: auto;' . chr(10); } $scssContent .= '}' . chr(10) . chr(10); if ($retinaEnabled) { $scssContent .= <<<SCSS @media (min-device-pixel-ratio: {$retinaThreshold}), (min-resolution: {$retinaThresholdPx}dpi) { SCSS; } foreach ($spritesheet->sprites as $sprite) { $configuration = $this->getSpriteConfiguration($sprite); $spriteName = $spritePrefix . $sprite->name; $scssName = $scssPrefix . $sprite->name; $realSpriteWidth = $sprite->spriteWidth; $realSpriteHeight = $sprite->spriteHeight; $realSpriteX = $sprite->spriteX; $realSpriteY = $sprite->spriteY; if ($retinaEnabled) { $realSpriteWidth = $realSpriteWidth / $retinaFactor; $realSpriteHeight = $realSpriteHeight / $retinaFactor; $realSpriteX = $realSpriteX / $retinaFactor; $realSpriteY = $realSpriteY / $retinaFactor; } $spriteContent = $indent . $indent . '@include spritesheet-' . $spritesheetName . '();' . chr(10); if ($configuration->getBool('center')) { $spriteContent .= $indent . $indent . 'margin-left: ' . self::cssFormatPx(-$realSpriteWidth / $retinaFactor) . ';' . chr(10); $spriteContent .= $indent . $indent . 'margin-top: ' . self::cssFormatPx(-$realSpriteHeight / $retinaFactor) . ';' . chr(10); } $spriteContent .= $indent . $indent . 'width: ' . self::cssFormatPx($realSpriteWidth) . ';' . chr(10); $spriteContent .= $indent . $indent . 'height: ' . self::cssFormatPx($realSpriteHeight) . ';' . chr(10); $spriteContent .= $indent . $indent . 'background-position: ' . self::cssFormatPx(-$realSpriteX) . ' ' . self::cssFormatPx(-$realSpriteY) . ';' . chr(10); foreach ($configuration->getNode('styles') as $styleName => $styleValue) { $spriteContent .= $indent . $indent . $styleName . ': ' . $styleValue . ';' . chr(10); } if ($configuration->getBool('createClass', true)) { // Write class $scssContent .= $indent . '.' . $spriteName . ' {' . chr(10) . $spriteContent . $indent . '}' . chr(10) . chr(10); } if ($configuration->getBool('createMixin', true)) { // Write mixin $mixinsContent .= chr(10) . $indent . '@mixin ' . $scssName . ' {' . chr(10) . $spriteContent . $indent . '}' . chr(10); } if ($configuration->getBool('createVariables', true)) { $scssVariablesContent .= '$' . $scssName . '-width: ' . self::cssFormatPx($sprite->spriteWidth) . ';' . chr(10); $scssVariablesContent .= '$' . $scssName . '-height: ' . self::cssFormatPx($sprite->spriteHeight) . ';' . chr(10); $scssVariablesContent .= '$' . $scssName . '-x: ' . self::cssFormatPx(-$sprite->spriteX) . ';' . chr(10); $scssVariablesContent .= '$' . $scssName . '-y: ' . self::cssFormatPx(-$sprite->spriteY) . ';' . chr(10); $scssVariablesContent .= "\${$scssName}-image: '{$image}';" . chr(10); $scssVariablesContent .= "\${$scssName}-retina-factor: {$retinaFactor};" . chr(10); $scssVariablesContent .= chr(10); } } if ($retinaEnabled) { $scssContent .= ' }' . chr(10); } if ($mixinsContent) { $scssContent .= chr(10) . $mixinsContent; } } $outputFolder = $this->mosaic->getPath($this->configuration->getString('outputFolder')); $outputFileBasename = $this->configuration->getString('outputFile', '_' . $this->job->configuration->getString('name')); $outputPath = $outputFolder . $outputFileBasename . '.scss'; $outputPathVariables = $outputFolder . $outputFileBasename . '_variables.scss'; $scssFiles = [$outputPath => $scssContent, $outputPathVariables => $scssVariablesContent]; foreach ($scssFiles as $path => $content) { $path = Tools::encodeFilePath($path); FileTools::createDirectory(dirname($path)); file_put_contents($path, $content); } }
public function parseTask() { /** @var $m MailModule */ $m = $this->task->module; $mode = $this->request()->get->get('mode'); $status = null; if ($m->moduleConfig->mode != MailModule::MODE_DIRECTORY) { $this->setResult('Directory logging is disabled.'); return; } $directory = $m->moduleConfig->directory; $content = ''; if ($mode == 'clear') { FileTools::deleteContents($directory); $status = 'All mails have been cleared.'; } elseif ($mode == 'showhtml') { $id = $this->task->request->get->asString('mail')->asInput(128)->value; if (preg_match('!^[a-zA-Z0-9_+ -]+$!', $id) && is_file($directory . $id . '.htm')) { $this->setResult(file_get_contents($directory . $id . '.htm'), ContentType::TYPE_HTML_UTF8); return; } else { $content = 'Mail does not exist'; } } elseif ($mode == 'show') { $id = $this->task->request->get->asString('mail')->asInput(128)->value; if (preg_match('!^[a-zA-Z0-9_+ -]+$!', $id)) { if ($id != 'latest' && !is_file($directory . $id . '.txt')) { $content = 'Mail does not exist.'; } else { if ($id == 'latest') { $files = scandir($directory); $id = null; foreach ($files as $file) { if ($file == '.' || $file == '..' || !preg_match('!^(.*)\\.txt$!', $file, $fileData)) { continue; } $id = $fileData[1]; } } if (!$id) { $content = 'Mail does not exist'; } else { $content = StringTools::escapeHtml(file_get_contents($directory . $id . '.txt')); $content = preg_replace('![a-zA-Z0-9]+://[^\\s\\(\\)]+!', '<a href="\\0" target="_blank">\\0</a>', $content); $content = '<pre>' . $content . '</pre>'; if (is_file($directory . $id . '.htm')) { $content .= '<iframe src="?mode=showhtml&mail=' . rawurlencode($id) . '" width="900" height="600"></iframe>'; } } } } else { $content = 'Please enter a valid id.'; } } else { $files = FileTools::listDirectory($directory, false); $mailList = array(); foreach ($files as $file) { if (preg_match('!^(.+)\\.([a-zA-Z0-9]+)$!', $file, $fileData)) { if (in_array($fileData[2], array('txt', 'htm'))) { $mailList[$fileData[1]] = true; } } } krsort($mailList); $ui = new Ui(); $content = '<ul>'; foreach ($mailList as $mailId => $foo) { $content .= '<li>' . $ui->link('?mode=show&mail=' . rawurlencode($mailId), $mailId) . '</li>'; } $content .= '</ul>'; } $content = <<<CNT <!DOCTYPE html> <body> <div> <a href="?">Show mails</a> <a href="?mode=show&mail=latest">Show latest mail</a> <a href="?mode=clear">Clear mails</a> </div> <div><strong> {$status} </strong></div> <hr> {$content} </table> </pre> </body> CNT; $this->task->response->postContent($content, ContentType::TYPE_HTML_UTF8); }
public function save() { if ($this->_data) { unlink($this->saveDirectory . $this->_data); } if ($this->saveFilename) { $this->_data = $this->saveFilename; } else { if ($this->keepExtension) { $extension = explode('.', $this->uploadedFile->name); $extension = '.' . strtolower(array_pop($extension)); } else { $extension = '.dat'; } $this->_data = FileTools::createUniqueFilename($this->saveDirectory, $extension, 32, true) . $extension; } move_uploaded_file($this->uploadedFile->file, $this->saveDirectory . $this->_data); }
public function save() { if ($this->_image) { $this->onProcessImage($this->_image); if ($this->_data) { $this->saveFilename = $this->_data; if (!$this->valueContainsExtension) { $this->saveFilename .= '.' . $this->saveFormat; } } else { if (!$this->saveFilename) { $this->_data = FileTools::createUniqueFilename($this->saveDirectory, '.' . $this->saveFormat, 32, true); if ($this->valueContainsExtension) { $this->saveFilename = $this->_data = $this->_data . '.' . $this->saveFormat; } else { $this->saveFilename = $this->_data . '.' . $this->saveFormat; } } } if ($this->resizeToWidth) { $image = ImageTools::resizeImage($this->_image, $this->resizeToWidth, $this->resizeToHeight, false, $this->resizeImageToolsScaleMode, $this->resizeImageToolsBackground); } else { $image = $this->_image; } if ($this->saveFormat == 'jpg') { imagejpeg($image, $this->saveDirectory . $this->saveFilename, $this->saveQuality); } else { if ($this->saveFormat == 'png') { imagepng($image, $this->saveDirectory . $this->saveFilename); } } $this->onImageProcessed($this->_image); if ($image != $this->_image) { imagedestroy($this->_image); } imagedestroy($image); } }