コード例 #1
0
        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();
                    }
                }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        public BlogPostConversionPipeline Build()
        {
            var blogPostConversionData = new BlogPostConversionData(_post, _outputDirectory);

            var pipeline = new BlogPostConversionPipeline(
                blogPostConversionData);

            _steps.ForEach(step => { pipeline.AddStep(step); });

            return(pipeline);
        }
コード例 #4
0
        public BlogPostConversionPipeline(
            BlogPostConversionData blogPostConversionData)
        {
            if (blogPostConversionData == null)
            {
                throw new ArgumentNullException("blogPostConversionData");
            }

            _blogPostConversionData = blogPostConversionData;

            _steps = new LinkedList <IBlogPostConversionStep>();
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        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);
            }
        }
コード例 #13
0
        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());
        }
コード例 #14
0
        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);
        }
コード例 #15
0
        public void Execute(BlogPostConversionData postConversionData)
        {
            var postUrl = new Uri(postConversionData.Post.PostUrl);

            postConversionData.Slug = _blogUrlConverter.GetSlug(postUrl);
        }