Add a generator for blog posts
This commit is contained in:
parent
a14aa34897
commit
29c9bc1438
3 changed files with 303 additions and 1 deletions
135
generators/blog-post.php
Normal file
135
generators/blog-post.php
Normal file
|
@ -0,0 +1,135 @@
|
|||
<?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();
|
Loading…
Add table
Add a link
Reference in a new issue