搜狗浏览器书签排序

来源:互联网 发布:java 验证 香港身份证 编辑:程序博客网 时间:2024/05/17 07:33

通过16小时的努力,终于写出了“搜狗浏览器书签排序”的程序,开发环境:ubuntu10.4  apache  php

 

 

思路:


1.搜狗浏览器书签是xml文件,格式诸如:

<item IsFolder="1" name="将来有用" addtime="2010-02-05 10:12:48">

            <item IsFolder="0" name="sqlserver中有类似于split方法吗" addtime="2010-02-05 10:11:58">http://topic.csdn.net/u/20100204/18/15167893-670b-49c1-9a95-a44e26a2af4c.html?14390</item>
            <item IsFolder="0" name="outline sorting - Google 搜索" addtime="2010-08-18 08:59:41">http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&q=outline+sorting&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&aqi=&aql=&oq=&gs_rfai=</item>
            <item IsFolder="0" name="商城特价 波斯顿男士香水LOST迷失男香30ml绿叶调植物清香-淘宝网" addtime="2010-09-27 00:24:25">http://item.taobao.com/item.htm?id=4508909983</item>
</item>
<item IsFolder="0" name="进程关系之进程组、会话和控制终端_notebook_linux的空间_百度空间" addtime="2010-11-16 14:09:31">http://hi.baidu.com/ntbk/blog/item/2055dcbc75131a0119d81fca.html</item>
 
IsFolder=1标明这个节点是个文件夹,IsFolder=0标明这个节点是普通的书签;当前我的配置是文件夹按照名称排序(因为这样比较好找),书签按照最近添加时间(一来是因为新添加的书签一般是自己比较关注的,而来方便整理陈年的书签)。name是书签名称。addtime是书签添加的时间。书签对<item>url</item>中的url就是该书签对应的实际网址。
 
2.由于鄙人受php-xml能力的有限,使用了下面的设计方式,望莫怪。
 
3.php正则表达式修改xml文件格式如下:

<item IsFolder="1" name="将来有用" addtime="2010-02-05 10:12:48">

            <item IsFolder="0" name="sqlserver中有类似于split方法吗" addtime="2010-02-05 10:11:58" url="http://topic.csdn.net/u/20100204/18/15167893-670b-49c1-9a95-a44e26a2af4c.html?14390"></item>
            <item IsFolder="0" name="outline sorting - Google 搜索" addtime="2010-08-18 08:59:41" url="http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&q=outline+sorting&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&aqi=&aql=&oq=&gs_rfai="></item>
            <item IsFolder="0" name="商城特价 波斯顿男士香水LOST迷失男香30ml绿叶调植物清香-淘宝网" addtime="2010-09-27 00:24:25" url="http://item.taobao.com/item.htm?id=4508909983"></item>
</item>
<item IsFolder="0" name="进程关系之进程组、会话和控制终端_notebook_linux的空间_百度空间" addtime="2010-11-16 14:09:31" url="http://hi.baidu.com/ntbk/blog/item/2055dcbc75131a0119d81fca.html"></item>
 
即将网址移到item内部,作为属性,而节点非值(为了simplexmldocument读取)。
 
4.使用simplexml加载修改过的xml书签文件(因为simplexml对层次比较直观,通过children()可以获取子层)。
 
5.       获取一层item,就排序一次;
          排好一层后,用new DOMDocument('1.0','UTF-8'); 创建新的xml对象 ,保存该层数据(以搜狗浏览器书签的的格式);
          对于IsFolder=1的再对其子层进行排序。。。。
 
6. 完成思路及算法。
 
 
 
 
操作顺序:

1.导出书签xml文件
2.配置脚本文件   conf.inc.php  。主要涉及  排序规则,原始书签xml路径名,排好序的书签xml路径名
3.访问执行页面,鄙人的是http://localhost:8080/xml4.php
4.导入新书签xml文件 到浏览器即可。
 
 
 
 
 
以下为两个脚本文件:

1.配置文件
conf.inc.php  :
 
<?php
 define("FOLDIERFIRST",1);  //文件夹  排在  书签 前面
 define("BOOKMARKFIRST",2);     //书签  排在  文件夹 前面
 define("SNAME",3);    //按照名称排序
 define("SDATETIME",4);          //按照时间排序
 define("UP",1);                 //正序
 define("DOWN",-1);              //倒序
 
 $CONF = array(
  'FILE'    => array( 'source'=>"/mnt/hgfs/ubuntu_share/others/BackupSource.xml", //搜狗浏览器导出的书签xml文件
          'dest' =>"/mnt/hgfs/ubuntu_share/others/BackupDest.xml"),  //经过排序的新书签xml文件
  'FOLDIERORBOOKMARK' => array( 'type' =>FOLDIERFIRST, 'direction'=>DOWN,),
  //FOLDIERFIRST:同一层次中文件夹排在书签前面,DOWN:倒序
  'FSORT'    => array( 'type' =>SNAME,   'direction'=>UP,),
  //对于文件夹,按照名称排序SNAME,升序UP
  'BSORT'    => array( 'type' =>SDATETIME,  'direction'=>DOWN,),
  //对于书签,按照提那家日期排序SDATETIME,降序DOWN
 );
?>
 
2.执行页面文件 xml4.xml  :
 
<?php
 require_once("conf.inc.php");
 
 $sourcefile = $CONF['FILE']['source'];
 $destfile  = $CONF['FILE']['dest'];
 funcMakeURL($sourcefile);
 
 //the main operation
 //{
   $xml = simplexml_load_file($sourcefile.".xml") or die("Canot open then file:<br/> $file");
   $doc = new DOMDocument('1.0','UTF-8');
   $doc->formatOutput = true; 
   $root  = $doc->createElement("main");
   $root  = $doc->appendChild($root);
   $name = $doc->createAttribute('version'); 
       $root->appendChild($name);
   $value = $doc->createTextNode(2);
       $name->appendChild($value);
   $x = array('loc'=>$root,'item'=>$xml); 

   mainSort($root,$x);
    
   echo "Saving all the document:<br/>";
   $doc->save($destfile);     
   echo "succeffully at ".date('Y-m-d H:i:s'); 
   die(1);
 //}
 function funcMakeURL($sourcefile)
 {
  $content = "";
  $fd = fopen($sourcefile,'r');
  while(!feof($fd))
  {
   $content.= fgets($fd,4096);
  }
  $pattern = '/(<item/s+)(.*?)(>http)(.*?)[^/"](<//item>)[^/"]/e';
  $content = preg_replace($pattern,"addURL('//1','//2','//3','//4','//5')",$content);
  $fdw = fopen($sourcefile.".xml",'w');
  fwrite($fdw,$content);
  fclose($fdw);
  fclose($fd);
 
  echo("make url inner item ok.<br/>");
 }
 function addURL($str1,$str2,$str3,$str4,$str5)
 {
  return  preg_replace('/////"/','"',$str1).
    preg_replace('/////"/','"',$str2).
    " url=/"".substr($str3,1,strlen($str3)-1)."$str4/">$str5";
 }
 function mainSort($parent,$xml)
 { 
  $itemlist = sortBase($xml);
  $itemlist = addItem($parent,$itemlist);
  foreach($itemlist as $item)
  {  
   if( intval($item["item"]["IsFolder"]) == 1)
   {  
    triSort($item["loc"],$item);
   }
  }
 
 }
 function triSort($parent,$xml)
 {
 
  $itemlist = triSortBase($xml);
  $itemlist = addItem($parent,$itemlist);
  foreach($itemlist as $item)
  {  
   if( intval($item["item"]["IsFolder"]) == 1)
   {
    triSort($item["loc"],$item);
   }
  
  }
 
 }
 function triSortBase($xml)
 { 
  $list = array();
  foreach($xml["item"]->children() as $item)
  {  
  
   $IsFolder = $item["IsFolder"];  
   $itemname = $item["name"];
   $addtime = $item["addtime"];
   $key   =  md5("$IsFolder$itemname$addtime");
   $list[$key] = array('loc'=>null,'item'=>$item);
  }
  usort($list,"myCompare"); 
    
  return $list; 
 }
 function sortBase($xml)
 { 
  $list = array();
  foreach($xml["item"]->children() as $item)
  {  
   $IsFolder = $item["IsFolder"];  
   $itemname = $item["name"];
   $addtime = $item["addtime"];
   $key   =  md5("$IsFolder$itemname$addtime");
   $list[$key] = array('loc'=>null,'item'=>$item);
  }
  usort($list,"myCompare");   
  return $list; 
 }
 function myCompare($a,$b)
 {
  global $CONF;
  $type1 = intval($a["item"]["IsFolder"]);
  $type2 = intval($b["item"]["IsFolder"]);
  //folder
  if($type1==1 && $type2 == 1)
  {
   switch($CONF['FSORT']['type'])
   {
    case SNAME: 
     return nameCompare($a,$b,$CONF['FSORT']['direction']);break;
    case SDATETIME:
     return dtCompare($a,$b,$CONF['FSORT']['direction']);break;
   }
  }else if($type1==0 && $type2 == 0)
  //bookmark
  {
   switch($CONF['BSORT']['type'])
   {
    case SNAME: 
     return nameCompare($a,$b,$CONF['BSORT']['direction']);break;
    case SDATETIME:
     return dtCompare($a,$b,$CONF['BSORT']['direction']);break;
   }
  }
  //folder and bookmark
  {
   if($CONF['FOLDIERORBOOKMARK']['type']==FOLDIERFIRST)
    return $type1>$type2?-1:1;
   else
    return $type1>$type2?1:-1;
  }
 }
 function nameCompare($a,$b,$direction)
 {  
 
  $str1 = $a["item"]["name"];
  $str2 = $b["item"]["name"];
  if($str1 == $str2)
   return 0;
  
  return intval(strcasecmp($str1,$str2)) * intval($direction) ;
 }
 function dtCompare($a,$b,$direction)
 {  
 
  $str1 = $a["item"]["addtime"];
  $str2 = $b["item"]["addtime"];
  if($str1 == $str2)
   return 0;
   
  return strcasecmp($str1,$str2) * intval($direction) ;
 } 
 function addItem($parent,$itemlist)
 {
  global $doc;
  global $xml;
  $list = array();
  foreach($itemlist as $item)
  {
   $IsFolder = $item["item"]["IsFolder"];  
   $itemname = $item["item"]["name"];
   $addtime = $item["item"]["addtime"]; 
   $url  = $item["item"]["url"];
   $bookmark  =  $doc->createElement("item");
   $bookmark  =  $parent->appendChild($bookmark);
   $item["loc"]= $bookmark;
  
   $name   =  $doc->createAttribute("IsFolder"); 
       $bookmark->appendChild($name); 
   $value  = $doc->createTextNode($IsFolder);
       $name->appendChild($value);
        
   $name   =  $doc->createAttribute('name'); 
       $bookmark->appendChild($name);
   $value  = $doc->createTextNode($itemname);
       $name->appendChild($value); 
   $name   =  $doc->createAttribute('addtime'); 
       $bookmark->appendChild($name);
   $value  = $doc->createTextNode($addtime);
       $name->appendChild($value);  
   $urlnode = $doc->createTextNode($url);       
       $bookmark->appendChild($urlnode);        
   $list[] = $item ;      
  } 
  return $list; 
 }
?>
 
 
 

两张图片实际为xml文件:

http://hi.csdn.net/attachment/201011/26/0_1290787510kCsW.gif 是conf.inc.php

http://hi.csdn.net/attachment/201011/26/0_12907875418030.gif 是xml4.php

请下载改名称即可。

原创粉丝点击