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);
        }

 

你可能感兴趣的:(firefox)