private string ComposeBlogHeader(
            BlogMLPost post,
            BlogPostConversionData postConversionData)
        {
            var header = new StringBuilder("---");

            header.AppendLine();

            var title = QuoteStringForYamlIfNecessary(post.Title);

            header.AppendLine($"title: {title}");

            header.AppendLine($"date: {post.DateCreated.ToLocalTime():yyyy-MM-ddTHH:mm:ssK}");

            if (post.DateModified != post.DateCreated)
            {
                header.AppendLine($"lastmod: {post.DateModified.ToLocalTime():yyyy-MM-ddTHH:mm:ssK}");
            }

            if (post.HasExcerpt)
            {
                var excerpt = NormalizeSpace(post.Excerpt.UncodedText);

                excerpt = QuoteStringForYamlIfNecessary(excerpt);

                var wrappedExcerpt = _textFormatter.WrapText(excerpt, 78);

                wrappedExcerpt = _textFormatter.IndentLines(wrappedExcerpt, "  ");

                header.AppendLine("excerpt:");
                header.AppendLine(wrappedExcerpt);
            }

            header.AppendLine("aliases:");
            header.AppendLine("  [");
            postConversionData.Aliases.ForEach(alias =>
            {
                header.Append("    \"");
                header.Append(alias);
                header.AppendLine("\",");
            });
            header.AppendLine("  ]");

            if (_markPostAsDraft == true)
            {
                header.AppendLine($"draft: true");
            }

            var joinedCategories = "\"" + string.Join("\", \"", postConversionData.Categories) + "\"";

            header.Append($"categories: [");
            header.Append(joinedCategories);
            header.AppendLine("]");

            header.Append($"tags: [");

            var joinedTags = "\"" + string.Join("\", \"", postConversionData.Tags) + "\"";

            header.Append(joinedTags);
            header.AppendLine("]");
            // header.AppendLine("isCJKLanguage: true");

            postConversionData.AdditionalMetadeta.Keys.ToList().ForEach(key =>
            {
                header.Append($"{key}: ");

                // TODO: Consider utilizing something like YamlDotNet for
                // serialization -- but for now just use a little bit of
                // code to deal with BlogAttachmentMetadata. Everything else
                // is assumed to be serializable by simply calling ToString()

                var value = postConversionData.AdditionalMetadeta[key];

                if (value is BlogAttachmentMetadata)
                {
                    var attachmentMetadata = (BlogAttachmentMetadata)value;

                    header.AppendLine();
                    header.AppendLine($"  url: \"{attachmentMetadata.Url}\"");
                    header.AppendLine($"  fileName: {attachmentMetadata.FileName}");
                    header.Append("  fileSizeInBytes: ");
                    header.AppendLine(attachmentMetadata.FileSizeInBytes.ToString(
                                          CultureInfo.InvariantCulture));
                }
                else
                {
                    var stringValue = value.ToString();

                    stringValue = QuoteStringForYamlIfNecessary(stringValue);

                    header.AppendLine(stringValue);
                }
            });


            header.AppendLine("---");
            return(header.ToString());
        }