Files
piratepoet/templates/generate.php
2022-01-18 15:30:22 +01:00

198 lines
5.7 KiB
PHP

<?php
require __DIR__.'/vendor/autoload.php';
use Tarsana\Functional as F;
function main(object $config) : void {
$generate = F\curry('generate');
F\each(
$generate($config),
loadTemplates($config->templatesDir)
);
}
function loadTemplates(string $templatesDir) : array {
return F\s(glob("{$templatesDir}/*.json"))
->map(F\pipe('file_get_contents', function($content) {
return json_decode($content, true);
}))
->result();
}
function generate(object $config, array $template) : void {
$templateDir = makeTemplateDirectory($config->assetsDir, $template);
$classTemplate = file_get_contents($config->classTemplatePath);
F\s($template)
->saveThumbnail($templateDir)
->normalizeBody($templateDir)
->renderBody()
->renderTemplate($classTemplate)
->saveTemplate($config->classesDir)
->result();
echo $template['name'], ' generated!', PHP_EOL;
}
function makeTemplateDirectory(string $assetsDir, array $template) : string {
$path = $assetsDir. '/' . getDirectoryName($template);
if (!is_dir($path) && !mkdir($path))
throw new \Exception("Unable to create directory '{$path}'!");
return $path;
}
function saveThumbnail(string $templateDir, array $template) : array {
$thumbnail = substr($template['thumbnail'], 23); // 'data:image/jpeg;base64,' is 23 chars
file_put_contents($templateDir.'/thumbnail.jpg', base64_decode($thumbnail));
return $template;
}
F\Stream::operation('saveThumbnail', 'String -> Array -> Array');
function normalizeBody(string $templateDir, array $template) : array {
$template['body'] = F\s($template['body'])
->removeContainerDefaults()
->downloadAndReplaceImages($templateDir)
->replaceSocialIconURLs()
->result();
return $template;
}
F\Stream::operation('normalizeBody', 'String -> Array -> Array');
function renderBody(array $template) : array {
$template['body'] = F\s($template['body'])
->then('export')
->render([
'image_url' => '\' . $this->template_image_url . \'',
'icon_url' => '\' . $this->social_icon_url . \''
])
->replace("'' . ", '')
->split("\n")
->map(F\prepend(" "))
->join("\n")
->then('trim')
->result();
return $template;
}
F\Stream::operation('renderBody', 'Array -> Array');
function renderTemplate(string $classTemplate, array $template) : array {
$template['body'] = render([
'class_name' => getClassName($template),
'dir_name' => getDirectoryName($template),
'template_name' => $template['name'],
'category' => getCategory($template),
'body' => $template['body']
], $classTemplate);
return $template;
}
F\Stream::operation('renderTemplate', 'String -> Array -> Array');
function saveTemplate(string $classesDir, array $template) : void {
file_put_contents($classesDir . '/' . getClassName($template) . '.php', $template['body']);
}
F\Stream::operation('saveTemplate', 'String -> Array -> Null');
function removeContainerDefaults(array $body) : array {
unset($body['blockDefaults']['container']);
return $body;
}
F\Stream::operation('removeContainerDefaults', 'Array -> Array');
function downloadAndReplaceImages(string $templateDir, array $block) : array {
if (!empty($block['content'])) {
$block['content'] = downloadAndReplaceImages($templateDir, $block['content']);
}
if ($block['type'] == 'image' && !empty($block['src'])) {
$block['src'] = downloadImage($templateDir, $block['src']);
}
if (!empty($block['image']) && !empty($block['image']['src'])) {
$block['image']['src'] = downloadImage($templateDir, $block['image']['src']);
}
if (!empty($block['blocks'])) {
foreach ($block['blocks'] as $i => $innerBlock) {
$block['blocks'][$i] = downloadAndReplaceImages($templateDir, $innerBlock);
}
}
return $block;
}
F\Stream::operation('downloadAndReplaceImages', 'String -> Array -> Array');
function replaceSocialIconURLs(array $block) : array {
if (!empty($block['content'])) {
$block['content'] = replaceSocialIconURLs($block['content']);
}
if (!empty($block['blockDefaults']) && !empty($block['blockDefaults']['social'])) {
$block['blockDefaults']['social'] = replaceSocialIconURLs($block['blockDefaults']['social']);
}
if ($block['type'] == 'socialIcon' && !empty($block['image'])) {
$block['image'] = F\s($block['image'])
->split('?')
->head()
->split('/')
->take(-2)
->prepend('{{icon_url}}')
->join('/')
->result();
}
if (!empty($block['icons'])) {
foreach ($block['icons'] as $i => $icon) {
$block['icons'][$i] = replaceSocialIconURLs($icon);
}
}
if (!empty($block['blocks'])) {
foreach ($block['blocks'] as $i => $innerBlock) {
$block['blocks'][$i] = replaceSocialIconURLs($innerBlock);
}
}
return $block;
}
F\Stream::operation('replaceSocialIconURLs', 'Array -> Array');
function render(array $data, string $text) : string {
foreach ($data as $name => $value) {
$text = str_replace('{{'.$name.'}}', $value, $text);
}
return $text;
}
F\Stream::operation('render', 'Array -> String -> String');
function getDirectoryName(array $template) : string {
return F\snakeCase('-', $template['name']);
}
function getClassName(array $template) : string {
return ucfirst(F\camelCase($template['name']));
}
function getCategory(array $template) : string {
$categories = json_decode($template['categories']);
return $categories[0] == 'saved' ? $categories[1] : $categories[0];
}
function downloadImage($templateDir, $src) {
$name = F\s($src)
->split('/')
->last()
->split('?')
->head()
->result();
file_put_contents($templateDir . '/' . $name, file_get_contents($src));
return '{{image_url}}/' . $name;
}
function export($variable) : string {
return var_export($variable, true);
}
main(require __DIR__.'/config.php');