从Blogger迁移到GitHub Pages的详细指南

在之前的帖子中,详细解释了如何在GitHub上设置博客。现在,是时候将旧Blogger博客转换为崭新的GitHub格式了。

导出Blogger博客

要将博客从Blogger导出,请登录Blogger,进入博客控制面板,点击“设置”下的“其他”选项卡,然后点击“导出博客”。

将获得一个基本上是Atom格式的XML文件。这个文件很难理解,因为它没有换行符(除了博客模板中的换行符,这些换行符只会分散注意力)。它是一个包含许多元素的根元素,其中一些包含文章,其他的包含元数据。

转换为GitHub格式

以下是编写的将博客导出到GitHub的代码。只需将此代码粘贴到LINQPad或其他工具中,将文件路径更改为XML文件路径,然后运行即可!

void Main() { string filepath = @"C:\Downloads\Blog.xml"; string text = File.ReadAllText(filepath); XDocument doc = XDocument.Parse(text); // 使用XNamespace处理那些烦人的"xmlns"属性。 var _ = XNamespace.Get("http://www.w3.org/2005/Atom"); var app = XNamespace.Get("http://purl.org/atom/app#"); var posts = doc.Root.Elements(_ + "entry") // 一个要么是文章,要么是没人关心的元数据。 // 排除没有子元素的条目。 .Where(entry => entry.Element(_ + "category").Attribute("term").ToString().Contains("#post")) // 排除任何包含元素的条目,除了no。 .Where(entry => !entry.Descendants(app + "draft").Any(draft => draft.Value != "no")); var outfolder = Path.Combine(Path.GetDirectoryName(filepath), Path.GetFileNameWithoutExtension(filepath)); Directory.CreateDirectory(outfolder); foreach (var entry in posts) { // 从XML中提取数据 DateTime published = DateTime.Parse(entry.Element(_ + "published").Value); DateTime updated = DateTime.Parse(entry.Element(_ + "updated").Value); string title = entry.Element(_ + "title").Value; string content = entry.Element(_ + "content").Value; string type = entry.Element(_ + "content").Attribute("type").Value ?? "html"; XElement empty = new XElement("empty"); XAttribute emptA = new XAttribute("empty", ""); string originalLink = ((entry.Elements(_ + "link") .FirstOrDefault(e => e.Attribute("rel").Value == "alternate") ?? empty) .Attribute("href") ?? emptA).Value; string outFileName = string.Format("{0:yyyy-MM-dd}-{1}.{2}", published, Path.GetFileNameWithoutExtension(originalLink), type); var outPath = Path.Combine(outfolder, outFileName); if (content.Count(c => c == '\n') <= 3) content = AddLineBreaks(content); // 可选 Write output file (partial HTML forJekyll) using (StreamWriter output = File.CreateText(outPath)) { output.WriteLine("---"); output.WriteLine("title: \"{0}\"", title); output.WriteLine("layout: post"); output.WriteLine("# Pulled from Blogger. Last updated there on: {0:yyyy-MM-dd}", updated); output.WriteLine("---"); if (originalLink != "") output.WriteLine("

This post was imported from " + ".

", originalLink); output.WriteLine(""); // 禁用Jekyll/Liquid output.Write(content); output.WriteLine(""); } } }

这将在以XML文件命名的文件夹中为每篇文章创建一个HTML文件,例如:

  • 2007-09-03-hello-no-one.html
  • 2011-07-05-why-wpf-sucks.html
  • 2012-06-07-smart-tabs.html
  • 2013-05-28-onward.html

这些文件名格式正确,适合Jekyll,所以如果要迁移到GitHub,只需将所有这些文件移动到/_posts文件夹中,提交,就完成了!如果想要有“适当”的HTML文件,请修改上述代码以生成像......这样的代码,而不是Jekyllfront-matter。

顺便说一下,Blogger导出的HTML在文章中没有换行符。所以写了这个小方法在适当的地方添加一些换行符:

string AddLineBreaks(string content) { var sb = new StringBuilder(content.Length + 100); bool pre = false, fail; for (UString rest = content; !rest.IsEmpty;) { if (rest.StartsWith("
")) pre = true;
                if (rest.StartsWith("
")) pre = false; bool s; if ((s = rest.StartsWith("")) || rest.StartsWith("")) { sb.Append(pre ? "\n" : "\n"); rest = rest.Substring(s ? 6 : 5); continue; } if (rest.StartsWith("
  • ") || rest.StartsWith("

    ") || rest.StartsWith("") || rest.StartsWith("

    ") || rest.StartsWith("
    ") || rest.StartsWith("") || rest.StartsWith("") || rest.StartsWith("
    ")) sb.Append('\n'); char c = (char)rest.PopFront(out fail); if (!fail) sb.Append(c); } return sb.ToString(); }

  • 这依赖于Loyc.Essentials.dll库中的UString(它是一种字符串切片)。如果想使用这个函数,请从NuGet下载LoycCore。

    沪ICP备2024098111号-1
    上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485