存档

文章标签 ‘web’

从 MT 迁移到 WP 后的网页链接问题

2005年12月4日 robertbao 没有评论

Movable Type和WordPress是两个现在非常流行的Blog系统,两者都是非常棒的Blog系统,都能够支持单用户和多用户,功能也都很强大,插件和皮肤也是应有尽有。它们采用的机制有些区别,很难说谁更好…

因为WordPress安装使用更方便一些,有不少人现在从Movable Type转迁移到WordPress,这里只是对转移后的链接问题做一些探讨:

由于以前用Movable Type写的blog已经被Google等搜索引擎索引了,如果现在blog的链接地址改变的话,原来被索引的链接就会变成死链,也就是说别人点击这个链接并不会看到他希望的内容,这对网站的访问量会有很大的影响,所以我们需要改造WordPress下blog的链接地址。

方法是:将WordPresss的URL使用Movable Type的Permalink结构,即从外部看两者具有相同的Url。在WordPresss中将Permalinks设置为/archives/%year%/%monthnum%/%postname%.html,这里还有一个小问题,因为%postname%在WordPresss中,是使用”-”号来代替空格,而Movable Type使用的是”_”号,因此,需要在WordPresss上安装一个叫”Underscore Permalinks Plugin”的插件。

这个插件很简单,只是一个PHP文件。先建立一个文件,命名为underscorepermalinks.php,内容如下:

/*
Plugin Name: Underscore Permalinks
Plugin URI: http://wordpress.org/#.
Description: Converts spaces to underscores when sanitizing post titles for use in permalinks. This is handy for those moving from Movable Type who want to maintain their old permalink style.
Version: 1.0.1
Author: Ryan Boren
Author URI: http://boren.nu/
*/
function sanitize_title_with_underscores($title) {
$title = strtolower($title);
$title = preg_replace('/&.+?;/', '', $title); // kill entities
$title = preg_replace('/[^a-z0-9 _-]/', '', $title);
$title = preg_replace('/\s+/', ' ', $title);
$title = str_replace(' ', '_', $title);
$title = preg_replace('|_+|', '_', $title); return $title;
}
remove_action('sanitize_title', 'sanitize_title_with_dashes');
add_action('sanitize_title', 'sanitize_title_with_underscores');
?>

然后复制到plugins目录下的Activate。

这样原来Movable Type中的blog导入后,在WordPresss中的URL将和原来的完全一样,就实现了链接的平滑迁移。

当然你搭建WordPresss的主机需要有Url Rewrite的支持才能使用以上的方法。

分类: WORK 标签: ,

WebWork宣布加入Struts社区

2005年11月29日 robertbao 没有评论

真是想不到,WebWork宣布加入Struts社区,一起共推下一个版本的Struts,现有的WebWork版本还将继续维护,但不再出新版本了。

好事,好事啊,集中力量打歼灭战◎

分类: WORK 标签: , ,

Monkeygrease的一个示例

2005年11月10日 robertbao 1 条评论

上面说了Monkeygrease的基本用法,这里有一个示例,用于表示可变大小的文本域。

Javascript代码如下,保存为resizeabletextareas.js:

var resizeTa={loaded:null,TAlength:0,init:function(){
if(resizeTa.loaded){
return;
}else{
resizeTa.loaded=true;
var _1=document.getElementsByTagName("body")[0];
if(_1){
window.addEventListener("load",resizeTa.pageload,true);
}
}
},pageload:function(_2){
resizeTa.doc=_2.originalTarget;
resizeTa.TA=resizeTa.doc.getElementsByTagName("TEXTAREA");
resizeTa.TAlength=resizeTa.TA.length;
if(resizeTa.TAlength==0){
return;
}else{
resizeTa.rootElem=resizeTa.doc.getElementsByTagName("HTML")[0];
var i=resizeTa.TAlength;
while(i–){
resizeTa.newdiv("5","1","gripH_",i,"w");
resizeTa.newdiv("1","5","gripV_",i,"n");
resizeTa.newdiv("10","10","gripX_",i,"se");
}
resizeTa.newdiv("0","0","showCursor","","w");
CursorDiv=resizeTa.doc.getElementById("showCursor");
CursorDiv.removeEventListener("mousedown",resizeTa.activate,true);
CursorDiv.style.left="0px";
CursorDiv.style.top="0px";
resizeTa.posdivs();
window.addEventListener("resize",resizeTa.posdivs,true);
}
},newdiv:function(w,h,id,nr,cu){
var _9=resizeTa.doc.createElement("div");
_9.setAttribute("ID",id+nr);
_9.setAttribute("STYLE","position:absolute;width:"+w+"px;height:"+h+"px;cursor:"+cu+"-resize");
_9.addEventListener("mousedown",resizeTa.activate,true);
resizeTa.rootElem.appendChild(_9);
},getposition:function(i){
var _b=resizeTa.TA[i];
var _c=_b.offsetLeft;
while(_b.offsetParent){
_c+=_b.offsetParent.offsetLeft;
_b=_b.offsetParent;
}
_b=resizeTa.TA[i];
var _d=_b.offsetTop;
while(_b.offsetParent){
_d+=_b.offsetParent.offsetTop;
_b=_b.offsetParent;
}
return [_c,_d];
},posdivs:function(){
var k=resizeTa.TAlength;
while(k–){
curPos=resizeTa.getposition(k);
resizeTa.doc.getElementById("gripH_"+k).style.left=curPos[0]+resizeTa.TA[k].offsetWidth-3+"px";
resizeTa.doc.getElementById("gripH_"+k).style.top=curPos[1]+"px";
resizeTa.doc.getElementById("gripH_"+k).style.height=resizeTa.TA[k].offsetHeight-8+"px";
resizeTa.doc.getElementById("gripV_"+k).style.left=curPos[0]+"px";
resizeTa.doc.getElementById("gripV_"+k).style.top=curPos[1]+resizeTa.TA[k].offsetHeight-3+"px";
resizeTa.doc.getElementById("gripV_"+k).style.width=resizeTa.TA[k].offsetWidth-8+"px";
resizeTa.doc.getElementById("gripX_"+k).style.left=curPos[0]+resizeTa.TA[k].offsetWidth-8+"px";
resizeTa.doc.getElementById("gripX_"+k).style.top=curPos[1]+resizeTa.TA[k].offsetHeight-8+"px";
}
},activate:function(e){
resizeTa.doc=e.target.ownerDocument;
resizeTa.TA=resizeTa.doc.getElementsByTagName("TEXTAREA");
CursorDiv=resizeTa.doc.getElementById("showCursor");
resizeTa.TAlength=resizeTa.TA.length;
var _10=e.target.getAttribute("ID").split("_");
curTarget=_10[0];
curTA_Nr=parseInt(_10[1]);
resizeTa.doc.addEventListener("mouseup",resizeTa.deactivate,true);
switch(curTarget){
case "gripH":
resizeTa.doc.addEventListener("mousemove",resizeTa.resizeta_h,true);
break;
case "gripV":
resizeTa.doc.addEventListener("mousemove",resizeTa.resizeta_v,true);
break;
case "gripX":
resizeTa.doc.addEventListener("mousemove",resizeTa.resizeta_x,true);
break;
}
CursorDiv.style.width=resizeTa.rootElem.offsetWidth+"px";
CursorDiv.style.height=resizeTa.rootElem.offsetHeight+"px";
CursorDiv.style.cursor=e.target.style.cursor;
},deactivate:function(){
resizeTa.doc.removeEventListener("mouseup",resizeTa.deactivate,true);
switch(curTarget){
case "gripH":
resizeTa.doc.removeEventListener("mousemove",resizeTa.resizeta_h,true);
break;
case "gripV":
resizeTa.doc.removeEventListener("mousemove",resizeTa.resizeta_v,true);
break;
case "gripX":
resizeTa.doc.removeEventListener("mousemove",resizeTa.resizeta_x,true);
break;
}
CursorDiv.style.width="0px";
CursorDiv.style.height="0px";
resizeTa.posdivs();
},resizeta_h:function(e){
curPos=resizeTa.getposition(curTA_Nr);
resizeTa.TA[curTA_Nr].style.width=e.pageX-curPos[0]+"px";
},resizeta_v:function(e){
curPos=resizeTa.getposition(curTA_Nr);
resizeTa.TA[curTA_Nr].style.height=e.pageY-curPos[1]+"px";
},resizeta_x:function(e){
curPos=resizeTa.getposition(curTA_Nr);
resizeTa.TA[curTA_Nr].style.width=e.pageX-curPos[0]+2+"px";
resizeTa.TA[curTA_Nr].style.height=e.pageY-curPos[1]+2+"px";
}};
window.addEventListener("load",resizeTa.init,false);

在monkeygrease.xml中加入如下规则:

<rule enabled="true" name="Resizeable Textarea" url-pattern="\/.*" insert-at="head-end">
    <![CDATA[
    <script type="text/javascript" src="/yourScriptPath/resizeabletextareas.js"></script>
    ]]>
</rule>

这句话<script type="text/javascript" src="/yourScriptPath/resizeabletextareas.js"></script>就自动加入到客户端获得的html代码的head区域的后部。

这段JS只在Firefox下有效,实际上这篇文章跟Monkeygrease相关性不大,主要就是展示这段代码。

分类: WORK 标签: ,

W3C发布新的XML方面的候选标准

2005年11月9日 robertbao 2 条评论
分类: WORK 标签: , ,

新书:《Jakarta Struts编程(第二版)》

2005年8月29日 robertbao 2 条评论

作者: Chuck Cavaness
出版: 2005年8月
书号: 7-5083-3503-1
页数: 452
定价: 52.00元



近来想深入研究一下Stucts和JSF的东东。

本书介绍: 尽管企业Web应用程序的外观和操作方式很重要,但是开发人员发现,开始编写应用程序的业务逻辑之前他们总是要花太多的时间在前端的表示上。为了解决这个问题,Jakarta Struts将Java Servlet、JavaServer Pages(JSP)、自定义标记以及消息资源(messaging resource)结合为一种统一的、可重用的框架。Struts是一个可以共同合作、协同动作的平台,对于独立的开发人员、大型开发团队以及介于这二者之间的任何人都很适用。
自本书第一版发行以来,Struts开源项目变得越来越受欢迎。尽管这项技术令人振奋,但是它的说明文档却仍然少得可怜 —— 大多数的指南都太简单,那些要编写复杂Web应用程序的开发人员根本找不到所需的关键信息。本书第二版为了填补这个信息缺口,针对最近发布的Struts 1.1版重新修订扩编,提供最新的信息。第二版增加了新的章节来专门探讨安全、与JSF API的集成、JSP标准标记库(JSTL)以及Struts的表达式语言(EL)。此外,第二版对第一版中原有的主题也做了扩充,包括:
● 安装、建立和配置Struts
● 说明Web应用程序的基本概念
● 实现MVC设计模式(Model 2方法),让你的应用程序得以使用这个模式
● 采用Struts的日志记录、验证和异常处理机制
● 使用Struts Tiles模板库
● 使用Struts编写国际化和本地化代码
● 对Web应用程序应用真实有用的最佳实践

分类: WORK 标签: , ,