• 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);
            }
  • 相关阅读:
    Java Web Action DAO Service层次理解
    JSP/Servlet Web 学习笔记 DaySix —— EL表达式
    JSP/Servlet Web 学习笔记 DayFive
    JSP/Servlet Web 学习笔记 DayFour —— 实现一个简单的JSP/Servlet交互
    JSP/Servlet Web 学习笔记 DayFour
    如何快速创建百万级测试数据
    公司线上虚拟机大量GC导致STW和CPU飙升--抽丝剥茧定位的过程
    这10道springboot常见面试题你需要了解下
    这是一篇来源于阿里内部技术论坛的文章
    一文彻底弄懂如何选择抽象类还是接口
  • 原文地址:https://www.cnblogs.com/MikeYao/p/2203576.html
Copyright © 2020-2023  润新知