static void WriteConvertedMarkdown( string outDir, BlogPostConversionData postConversionData, string header) { var outputFile = Path.Combine(outDir, postConversionData.Slug + ".md"); if (File.Exists(outputFile) == true) { File.Delete(outputFile); } using (var file = File.OpenWrite(outputFile)) using (var writer = new StreamWriter(file)) { writer.Write(header); writer.Flush(); var markdown = postConversionData.Post.Content.UncodedText; if (markdown.StartsWith(Environment.NewLine) == false) { writer.WriteLine(); } writer.Write(markdown); if (markdown.EndsWith(Environment.NewLine) == false) { writer.WriteLine(); } } }
public void Execute(BlogPostConversionData postConversionData) { var post = postConversionData.Post; foreach (BlogMLCategoryReference category in post.Categories) { var cat = _categories[category.Ref]; postConversionData.Categories.Add(cat.Title); } }
public BlogPostConversionPipeline Build() { var blogPostConversionData = new BlogPostConversionData(_post, _outputDirectory); var pipeline = new BlogPostConversionPipeline( blogPostConversionData); _steps.ForEach(step => { pipeline.AddStep(step); }); return(pipeline); }
public BlogPostConversionPipeline( BlogPostConversionData blogPostConversionData) { if (blogPostConversionData == null) { throw new ArgumentNullException("blogPostConversionData"); } _blogPostConversionData = blogPostConversionData; _steps = new LinkedList <IBlogPostConversionStep>(); }
public void Execute(BlogPostConversionData postConversionData) { var post = postConversionData.Post; var mdConverter = new Converter(); var markdown = mdConverter.Convert( post.Content.UncodedText); postConversionData.Post.Content = BlogMLContent.Create( markdown, BlogML.ContentTypes.Text); }
public void Execute(BlogPostConversionData postConversionData) { var post = postConversionData.Post; var markdown = post.Content.Text; markdown = ReverseMarkdownHelper .DecodeAfterConversion(markdown); post.Content = BlogMLContent.Create( markdown, ContentTypes.Text); }
public void Execute(BlogPostConversionData postConversionData) { var post = postConversionData.Post; var postHtml = post.Content.UncodedText; var htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(postHtml); ReplaceBlogImageUrls(htmlDoc); post.Content = BlogMLContent.Create( htmlDoc.DocumentNode.OuterHtml, ContentTypes.Html); }
public void Execute(BlogPostConversionData postConversionData) { var post = postConversionData.Post; bool hasAttachment = _blogPostAttachmentService.HasAttachment(post); if (hasAttachment == true) { var attachmentMetadata = _blogPostAttachmentService.GetAttachmentMetadata(post); postConversionData.AdditionalMetadeta.Add( "attachment", attachmentMetadata); } }
public void Execute(BlogPostConversionData postConversionData) { var post = postConversionData.Post; var postHtml = post.Content.UncodedText; var htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(postHtml); EncodeSpecialCharactersInHugoShortcodes(htmlDoc); post.Content = BlogMLContent.Create( htmlDoc.DocumentNode.OuterHtml, ContentTypes.Html); }
public void Execute(BlogPostConversionData postConversionData) { var post = postConversionData.Post; Console.WriteLine($"Writing {postConversionData.Slug} ({post.Title})"); var postDir = Path.Combine(postConversionData.OutputDirectory, postConversionData.Subfolder); if (!Directory.Exists(postDir)) { Directory.CreateDirectory(postDir); } var header = ComposeBlogHeader(post, postConversionData); WriteConvertedMarkdown(postDir, postConversionData, header); }
public void Execute(BlogPostConversionData postConversionData) { var post = postConversionData.Post; var postHtml = post.Content.UncodedText; var htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(postHtml); FixSpacesInCodeElements(htmlDoc); FixSpacesInCodeSpanElements(htmlDoc); FixSpacesInInlineElements(htmlDoc); post.Content = BlogMLContent.Create( htmlDoc.DocumentNode.OuterHtml, ContentTypes.Html); }
public virtual void Execute(BlogPostConversionData postConversionData) { if (postConversionData == null) { throw new ArgumentNullException("postConversionData"); } var post = postConversionData.Post; var root = _blogMLDoc.DocumentElement; var mgr = new XmlNamespaceManager(_blogMLDoc.NameTable); mgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema"); mgr.AddNamespace("blogml", "http://www.blogml.com/2006/09/BlogML"); var tagList = root.SelectNodes($"//blogml:post[@id='{post.ID}']/blogml:tags/blogml:tag", mgr); foreach (XmlNode tag in tagList) { postConversionData.Tags.Add(tag.Attributes["ref"].InnerText); } }
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()); }
public void Execute(BlogPostConversionData postConversionData) { var post = postConversionData.Post; var subfolder = postConversionData.Subfolder; var folderParts = postConversionData.Subfolder.Split( new char[] { '\\' }); if (folderParts.Length != 3) { throw new ArgumentException( "Subfolder must be year/month/day.", "postConversionData"); } var parsedDate = DateTime.ParseExact( subfolder.Replace('\\', '/'), @"yyyy/MM/dd", CultureInfo.InvariantCulture); var postDate = post.DateCreated; if (parsedDate.Year != postDate.Year || parsedDate.Month != postDate.Month || parsedDate.Day != postDate.Day) { throw new ArgumentException( $"Subfolder ({subfolder}) does not match date for post" + $" ({post.DateCreated}).", "postConversionData"); } var postDir = Path.Combine( postConversionData.OutputDirectory, postConversionData.Subfolder); if (Directory.Exists(postDir) == false) { Directory.CreateDirectory(postDir); } var dayFolder = postDir; var title = $"{postDate.ToString("MMMM d, yyyy")} Blog Posts"; var date = new DateTime(postDate.Year, postDate.Month, postDate.Day, 0, 0, 0, DateTimeKind.Local); WriteBlogArchivePage(dayFolder, title, date); var monthFolder = Directory.GetParent(dayFolder).FullName; title = $"{postDate.ToString("MMMM yyyy")} Blog Posts"; date = new DateTime(postDate.Year, postDate.Month, 1, 0, 0, 0, DateTimeKind.Local); WriteBlogArchivePage(monthFolder, title, date); var yearFolder = Directory.GetParent(monthFolder).FullName; title = $"{postDate.ToString("yyyy")} Blog Posts"; date = new DateTime(postDate.Year, 1, 1, 0, 0, 0, DateTimeKind.Local); WriteBlogArchivePage(yearFolder, title, date); }
public void Execute(BlogPostConversionData postConversionData) { var postUrl = new Uri(postConversionData.Post.PostUrl); postConversionData.Slug = _blogUrlConverter.GetSlug(postUrl); }