This repository has been archived on 2025-01-19. You can view files and clone it, but cannot push or open issues or pull requests.
oliverdavies.uk-old-sculpin/generators/blog-post.php

136 lines
3.5 KiB
PHP
Raw Normal View History

2020-03-10 20:19:27 +00:00
<?php
use Spatie\String\Str;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Style\SymfonyStyle;
require_once __DIR__.'/../vendor/autoload.php';
$application = new Application();
$application->addCommands([
new class extends Command
{
/**
* {@inheritdoc}
*/
protected static $defaultName = 'main';
/**
* {@inheritdoc}
*/
protected function configure()
{
$this->addArgument('title', InputArgument::OPTIONAL);
$this->addArgument('excerpt', InputArgument::OPTIONAL);
$this->addArgument('tags', InputArgument::IS_ARRAY);
}
/**
* {@inheritdoc}
*/
protected function interact(InputInterface $input, OutputInterface $output)
{
$io = new SymfonyStyle($input, $output);
if (!$input->getArgument('title')) {
$input->setArgument('title', $io->askQuestion(
new Question('The post title')
));
}
if (!$input->getArgument('excerpt')) {
$input->setArgument('excerpt', $io->askQuestion(
new Question('The post excerpt')
));
}
$io->writeln("\nEnter any tags for the post.\nPress <info>enter</info> to <info>continue</info>.\n");
$tags = [];
while (true) {
$tag = $io->askQuestion(
new Question('Enter a tag')
);
if (empty($tag)) {
break;
}
$tags[] = $tag;
}
$input->setArgument('tags', $tags);
}
/**
* {@inheritdoc}
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$io = new SymfonyStyle($input, $output);
$title = $input->getArgument('title');
if (!$title) {
throw new \RuntimeException('No title');
}
$excerpt = $input->getArgument('excerpt') ?? $title;
$slug = (new Str($title))->slugify();
$tags = '[' . implode(', ', $input->getArgument('tags')) . ']';
$date = (new \DateTime())->format('Y-m-d');
$contents = $this->generateFileFromStub(
$title,
$excerpt,
$tags,
$date
);
$this->writeFile($slug, $contents);
$this->createImagesDirectory($slug);
$io->listing([
"{$slug}.md"
]);
}
private function generateFileFromStub(...$args): string
{
[$title, $excerpt, $tags, $date] = $args;
return <<<EOF
---
title: $title
excerpt: $excerpt
date: $date
tags: $tags
draft: true
---
TODO.
EOF;
}
private function writeFile(string $slug, string $contents): void
{
file_put_contents("source/_posts/{$slug}.md", $contents);
}
private function createImagesDirectory(string $slug): void
{
mkdir("source/images/{$slug}");
}
}
]);
$application->setDefaultCommand('main');
$application->run();