Being a good programmer, I am told, is all about being lazy. So, I got bored with creating posts by hand and wrote a little console application to do it for me.

It accepts up to 3 arguments, the post title, a date in ISO 8601 format (today's date is assumed), and a list of tags.

Many of the refinements are based on my own setup, so if it's run from the main jekyll folder, with a _posts subfolder, the post will be created there.


class Program
{
    static void Main(string[] args)
    {
        if (args.Length == 0)
        {
            Console.WriteLine("post <title> <optional-date> <optional-tags>");
            return;
        }

        string title = args[0];

        string outputFolder = Directory.GetCurrentDirectory();

        string postSubFolder = Path.Combine(outputFolder, "_posts");

        if (Directory.Exists(postSubFolder))
            outputFolder = postSubFolder;

        string formattedDate = string.Empty;

        if (args.Length > 1)
        {
            formattedDate = args[1];
        }
        else
        {
            DateTime date = DateTime.Now;
            formattedDate = date.ToString("yyyy-MM-dd");
        }

        string suggestedTags = string.Empty;

        if (args.Length > 2)
        {
            suggestedTags = args[2];
        }

        string fileName = string.Format("{0}-{1}.markdown", formattedDate, title.Replace(" ", "-").ToLower());
        string path = Path.Combine(outputFolder, fileName);

        var utf8WithoutBom = new System.Text.UTF8Encoding(false);

        const bool AppendToFile = false;

        using (var writer = new StreamWriter(path, AppendToFile, utf8WithoutBom))
        {
            writer.WriteLine("---");
            writer.WriteLine("layout: post");
            writer.WriteLine("title: {0}", title);
            writer.WriteLine("published: true");
            writer.Write("tags: [ ");

            if (!String.IsNullOrEmpty(suggestedTags))
            {
                string[] tags = suggestedTags.Split(new char[] { ' ', ';' });
                writer.Write(String.Join(", ", tags));
            }

            writer.WriteLine(" ]");
            writer.WriteLine("---");
            writer.WriteLine();
            writer.WriteLine(title + " - post goes here");
            writer.WriteLine();
        }
    }
}

One important feature to note is jekyll really, really doesn't like Unicode with BOM, so you have to be careful to explicitly create a UTF8Encoding object (with BOM turned off) when writing out the file content (see line 42).