Introduction
Hello, today I will write a little bit about tooling. 2 weeks ago I thought about starting this blog. I asked my friend who blogs what blog engine should I use. His answer was rather surprising as he told me I should have used static website and commit blog posts as pull requests to it :O.
Searching for the perfect solution
So, I started exploring the internet to find the best blog layout ( reactjs ) tool to write my static blog. I was able to dig out gatsby starter blog
from hundreds of Chinese repos which GitHub is flooded with right now. At the moment I created this blog I had no experience with Gatsby ecosystem but it looked promising for me.
Running
Running this kind of Gatsby package required me only to install gatsby-cli
and run the command gatsby develop
. Pretty easy? Huh?
Modifications
I decided to add some tweaks to this simple blog package as it was a really pure blog with one author. So to add other authors( who I don't have yet :( ) I added authors folder, so to add you as an author you need to create a folder with your name and create index.js
file with this kind of content inside it:
export const Artur = { photo: require('./Artur.jpeg'), desc: 'GraphQL passionate. Code generation guru. Short code lover. Father. CTO. CEO.', name: 'Artur Czemiel', email: 'aexol@aexol.com', }
and add of course this line to authors/index.js
:
import { Artur } from './Artur' export const Authors = { Artur, }
Later on, you can use it inside your blog post.
How to add your blog post
Adding your blog post is pretty easy though. Again you have to create a folder inside pages folder with blog post slug-like my-very-interesting-article
. Add an index.md
file to it with this kind of header which is formatted by graymatter
package then:
--- title: My very interesting article date: '2018-10-27T13:23:04.284Z' author: Artur ---
ł
That's it. After writing the article you just submit pull request to your fork. I merge the pull request and publish your article to the website.
Publish tools
Sometimes I am kinda lazy person. I added small publish CLI to this project, which automatically using opn
opens the browser with prefilled URL and title fields for: reddit
LinkedIn
twitter
hackernews
. So it is much easier to share your blog posts from this blog. It lives in bin/index.js
folder of this blog and uses yargs
and inquirer
and graymatter
which I mentioned before.
Here is the code
const yargs = require('yargs') const fs = require('fs') const inquirer = require('inquirer') const opn = require('./opn') const matter = require('gray-matter') const HOSTNAME = 'https://blog.graphqleditor.com' const pagesDirectory = __dirname + '/../src/pages' const reddits = [ 'typescript', 'javascript', 'reactnative', 'reactjs', 'reactxp', 'node', 'webdev', 'graphql', 'programming', 'technology', 'startups', 'learnprogramming', 'marketing', 'entrepreneur', 'golang', 'ruby', 'dotnet', 'java', 'python' ].sort() const voats = ['technology'] const mediums = [ { name: 'voat', fn: ({ url, title }) => inquirer .prompt([ { type: 'list', name: 'voat', message: 'What voat you would like to publish to?', choices: voats, }, ]) .then(answers => submit({ medium: 'voat', reddit: answers.voat, title, url, }) ), }, { name: 'reddit', fn: ({ url, title }) => inquirer .prompt([ { type: 'list', name: 'reddit', message: 'What reddit you would like to publish to?', choices: reddits, }, ]) .then(answers => submit({ medium: 'reddit', reddit: answers.reddit, title, url, }) ), }, { name: 'hackerNews', fn: ({ url, title }) => submit({ medium: 'hackerNews', title, url, }), }, { name: 'linkedIn', fn: ({ url, title }) => submit({ medium: 'linkedIn', title, url, }), }, { name: 'twitter', fn: ({ url, title }) => submit({ medium: 'twitter', title, url, }), }, ] const submit = ({ medium, title, url, reddit }) => opn( { voat: `https://voat.co/submit?linkpost=true&title=${title}&url=${url}&subverse=${reddit}`, hackerNews: `http://news.ycombinator.com/submitlink?u=${url}&t=${encodeURIComponent( title )}`, reddit: `https://www.reddit.com/r/${reddit}/submit?title=${encodeURIComponent( title )}&url=${url}`, linkedIn: `https://www.linkedin.com/shareArticle?mini=true&url=${url}&source=${encodeURIComponent( HOSTNAME )}`, twitter: `http://twitter.com/share?url=${url}&text=${encodeURIComponent( title )}`, }[medium], { wait: false, } ) const argv = () => yargs .command( 'publish', 'Publish your blog post for different mediums', {}, async argv => { const pageNames = fs .readdirSync(pagesDirectory) .filter(page => fs.lstatSync(`${pagesDirectory}/${page}`).isDirectory() ) const pages = pageNames.map(page => ({ url: `${HOSTNAME}/${page}`, title: matter( fs.readFileSync([pagesDirectory, page, 'index.md'].join('/')) ).data.title, })) inquirer .prompt([ { type: 'list', name: 'page', message: 'Which page would you like to publish', choices: pages.map(p => p.title), }, ]) .then(answers => pages.find(p => p.title === answers.page)) .then(page => inquirer .prompt([ { type: 'list', name: 'medium', message: 'What medium you would like to publish to?', choices: mediums.map(m => m.name).concat('All mediums'), }, ]) .then( answers => answers.medium === 'All mediums' ? Promise.all( mediums .filter(m => m.name !== 'reddit' && m.name !== 'voat') .map(m => m.fn(page)) ) : mediums .find(m => m.name === answers.medium) .fn(page) .then(proc => inquirer .prompt([ { type: 'list', name: 'again', message: 'What next?', choices: ['Exit', 'Next Action'], }, ]) .then(({ again }) => { if (again === 'Exit') { return } return argv() }) ) ) ) } ) .help().argv argv()
After that, it opens a window so I can post on Reddit. Simple and beautiful!
Top comments (0)