在之前的帖子中,详细解释了如何在GitHub上设置博客。现在,是时候将旧Blogger博客转换为崭新的GitHub格式了。
要将博客从Blogger导出,请登录Blogger,进入博客控制面板,点击“设置”下的“其他”选项卡,然后点击“导出博客”。
将获得一个基本上是Atom格式的XML文件。这个文件很难理解,因为它没有换行符(除了博客模板中的换行符,这些换行符只会分散注意力)。它是一个包含许多
以下是编写的将博客导出到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文件,例如:
这些文件名格式正确,适合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。