搜狗浏览器书签排序
来源:互联网 发布: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
);
?>
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'];
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);
//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);
}
$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);
$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/>");
}
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)
{
{
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);
$itemlist = addItem($parent,$itemlist);
foreach($itemlist as $item)
{
if( intval($item["item"]["IsFolder"]) == 1)
{
triSort($item["loc"],$item);
}
}
}
{
if( intval($item["item"]["IsFolder"]) == 1)
{
triSort($item["loc"],$item);
}
}
}
function triSort($parent,$xml)
{
{
$itemlist = triSortBase($xml);
$itemlist = addItem($parent,$itemlist);
$itemlist = addItem($parent,$itemlist);
foreach($itemlist as $item)
{
if( intval($item["item"]["IsFolder"]) == 1)
{
triSort($item["loc"],$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 = 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;
}
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 = 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;
}
return $list;
}
function myCompare($a,$b)
{
global $CONF;
$type1 = intval($a["item"]["IsFolder"]);
$type2 = intval($b["item"]["IsFolder"]);
{
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($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) ;
}
return 0;
return intval(strcasecmp($str1,$str2)) * intval($direction) ;
}
function dtCompare($a,$b,$direction)
{
$str1 = $a["item"]["addtime"];
$str2 = $b["item"]["addtime"];
{
$str1 = $a["item"]["addtime"];
$str2 = $b["item"]["addtime"];
if($str1 == $str2)
return 0;
return strcasecmp($str1,$str2) * intval($direction) ;
}
return 0;
return strcasecmp($str1,$str2) * intval($direction) ;
}
function addItem($parent,$itemlist)
{
global $doc;
global $xml;
{
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"];
$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);
$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);
$bookmark->appendChild($name);
$value = $doc->createTextNode($addtime);
$name->appendChild($value);
$urlnode = $doc->createTextNode($url);
$bookmark->appendChild($urlnode);
$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
请下载改名称即可。
- 搜狗浏览器书签排序
- 将google书签导入到搜狗浏览器,google书签->Firefox书签->IE书签->搜狗书签
- 源泉书签增加了支持搜狗浏览器的添加书签插件
- android:浏览器添加书签
- 浏览器书签小记
- 火狐浏览器书签工具栏固定书签宽度
- 各种浏览器,书签设置体验
- 火狐浏览器 导入书签 乱码
- 浏览器书签导入于导出
- chrome浏览器书签同步问题
- 浏览器书签的变革遐想——关系型书签
- opera浏览器导入的书签如何显示在书签栏
- 【源泉书签】【里程碑】支持导入浏览器的书签到源泉书签
- Bookmarklet - 小书签,实用浏览器小工具
- Symbian版QQ浏览器书签文件格式解析
- 浏览器书签(bookmarks)结构格式分析
- Chrome浏览器扩展学习之 - 添加书签
- Google 浏览器(2011)书签同步
- 关于GridView中自定义分页、单选、多选、排序、自增列的简单应用
- 天涯
- 黄灿的黄玫瑰
- 新浪微博PC客户端(DotNet WinForm C# 版,C#调用新浪微博API代码,源码下载)—— 初探 (第二部分内置链接)
- 3排序
- 搜狗浏览器书签排序
- 【转】合并单元格时 如何判断所选区域是否为矩形
- Broadcom芯片53262的SDK移植
- chmod- linux修改文件权限
- 再谈Http协议中消息的编码
- C++ 二级指针
- tair的fdb原理
- POJ 3498 March of the Penguins
- C++ Coding Standards 读书笔记一