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()); }