delicious备份文件转入firefox书签,delicious2firefox -- 原创、开源

delicious(美味书签)9月底改版以来,备受新页面的困扰,没有以前好用了,书签也不正常了,迫使我必须进行改变。寻找解决方案不久后,我发现Firefox的书签是可以在不同的机器上同步的,只要登录相同的账号就可以,于是我将delicious上的书签备份成html格式的文件,准备导入Firefox,问题就来了:Firefox不兼容delicious的备份文件。于是我写了一套程序,将这个文件改成Firefox认识的格式,代码贴出来,与遇到相同问题的朋友一起共享,开发环境是vs2010。

 

源码下载: /Files/BenjaminYao/delicious2firefox.7z

 

View Code
private void btnBrowers_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "htm files (*.htm)|*.htm";

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    CreateFirefoxFile(ofd.FileName);
                }
                catch
                {
                    MessageBox.Show("您选择的文件可能不是delicious书签的备份文件,或者其他未知原因造成程序出错。欢迎到 http://www.cnblogs.com/BenjaminYao 与作者联系,共同完善。",
                        "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
        }

        /// <summary>
        
/// 哈希表分隔符,连接key使用,避免与普通分隔符相同,比如“-”
        
/// </summary>
        private static readonly string keySeparator = "*#*#*";

        private void CreateFirefoxFile(string fileName)
        {
            if (!File.Exists(fileName))
            {
                MessageBox.Show("文件不存在""出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            string oldAll = File.ReadAllText(fileName, Encoding.UTF8);
            
            string head = oldAll.Substring(0, oldAll.IndexOf("<DL><p>") + 7);
            string oldBody = oldAll.Substring(head.Length, oldAll.IndexOf("</DL><p>") - head.Length);
            string foot = oldAll.Substring(oldAll.IndexOf("</DL><p>"));

            //生成哈希表
            Hashtable hstBody = new Hashtable();
            int i = 1;      //避免哈希表中的key相同            
            foreach (string bookmark in Regex.Split(oldBody, "<DT>"))
            {
                if (bookmark.IndexOf("A HREF") >= 0)
                {
                    //取出标签名
                    string key = bookmark.Substring(
                        bookmark.IndexOf("TAGS=\"") + 6,
                        bookmark.IndexOf("\">") - (bookmark.IndexOf("TAGS=\"") + 6))
                        + keySeparator
                        + Convert.ToString(i++);
                    hstBody.Add(key, bookmark);
                }
            }

            if (hstBody.Count == 0)
            {
                MessageBox.Show("没有书签""警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            //对哈希表进行排序
            ArrayList aKeys = new ArrayList(hstBody.Keys);
            aKeys.Sort();

            string tempKey = string.Empty;
            bool isHead = true;

            StringBuilder sbNewBody = new StringBuilder();
            foreach (string akey in aKeys)
            {
                //插入标签(标签即目录)
                if (tempKey.ToLower() != akey.Substring(0, akey.IndexOf(keySeparator)).ToLower())
                {
                    tempKey = akey.Substring(0, akey.IndexOf(keySeparator));

                    if (isHead)
                    {
                        sbNewBody.AppendFormat("\n\n<DT><H3 FOLDED ADD_DATE=\"\">{0}</H3> \n<DL><p>\n", tempKey);

                        isHead = false;
                    }
                    else
                    {
                        sbNewBody.AppendFormat("</DL><p> \n\n<DT><H3 FOLDED ADD_DATE=\"\">{0}</H3> \n<DL><p>\n", tempKey);
                    }
                }

                sbNewBody.Append("<DT>" + hstBody[akey].ToString());
            }

            sbNewBody.Append("</DL><p>\n");

            string newBody = sbNewBody.ToString();
            head = head.Replace("charset=UTF-8""charset=gb2312");
            string newAll = head + newBody + foot;

            //生成文件
            string newFileName = fileName.Substring(0, fileName.LastIndexOf('\\') + 1);
            newFileName += "delicious2firefox.htm";

            File.WriteAllText(newFileName, newAll, Encoding.GetEncoding("gb2312"));

            MessageBox.Show("恭喜恭喜,转换成功。将生成的 delicious2firefox.htm 导入 firefox 书签即可。""成功", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
        }

 

posted @ 2011-10-09 13:31  姚一^o^  阅读(446)  评论(0编辑  收藏  举报