:::

DSpace加強Browse功能的BrowseUtil

布丁布丁吃布丁

DSpace加強Browse功能的BrowseUtil

image

DSpace具備強大的Browse功能,可是唯獨換頁的功能卻只有薄弱的「next」(下一頁)跟「prev」(上一頁)。因此我寫了一支BrowseUtil來提供這方面的功能,也把[dspace-jspui-webapp]/browse/中full.jsp、single.jsp能作到的功能也加了進去,提供程式設計師在修改Browse功能時能夠有靈活的彈性。


安裝BrowseUtil

請下載以下檔案,並放置指定的位置:

  • BrowseUtil.java (SkyDriveMiroko)
    [dspace-source]/dspace-jspui/src/main/java/org/dspace/app/webui/util/BrowseUtil.java
  • BrowseInfo.java (SkyDriveMiroko)
    [dspace-source]/dspace-jspui/src/main/java/org/dspace/browse/BrowseInfo.java
  • full.jsp (SkyDriveMiroko)
    single.jsp (SkyDriveMiroko)
    [dspace-source]/dspace/modules/jspui/src/main/webapp/browse/full.jsp
    [dspace-source]/dspace/modules/jspui/src/main/webapp/browse/single.jsp

然後請重新編譯DSpace,作mvn package跟ant update的動作。

使用BrowseUtil

引用與建立BrowseUtil物件

在JSP檔案裡面,請輸入以下語法以引用BrowseUtil:

<%@ page import="org.dspace.app.webui.util.BrowseUtil" %>

BrowseUtil物件建立需要輸入兩個參數,個別是HttpServletRequest跟BrowseInfo(這是DSpace的Browse物件),建立範例如下;

<%
BrowseInfo bi = (BrowseInfo) request.getAttribute("browse.info"); //先取得BrowseInfo物件
BrowseUtil bu = new BrowseUtil(request, bi); //建立BrowseUtil
%>

然後我們就可以以這個bu物件來取得連結了。

取得換頁連結
<%
String next = bu.getNextLink(); //下一頁
String last = bu.getLastLink(); //最後一頁
String prev = bu.getPrevLink(); //前一頁
String first = bu.getFirstLink(); //第一頁
%>

取得頁碼

以下語法會取得每一頁頁碼與連結,但是會排除自己的頁碼:

<%= bu.getPagesList() %>

結果如下:

<<first < previous 1 2 3 4 5 6 next > last >>

以下語法會取得該頁前後2頁之內的頁碼:

<%= bu.getPagesLink(2) %>

結果如下:

<<first < previous ... 2 3 4 5 6 ... next > last >>


其他BrowseInfo其實還有小功能,如果有需要的話就請自行看看程式碼囉。寫小功能還是非常讓人愉快的,大家加油!

(more...)

DSpace擴增Collection Browse功能

布丁布丁吃布丁

DSpace擴增Collection Browse功能

image

DSpace內建了非常強大的Browse功能,只是一般好像比較少看到有人善加利用。這次主要是要擴增Browse功能,讓他具備可以找出特定Metadata欄位中的值。


安裝方法

請下載以下檔案,依照同樣的目錄結構放到[dspace-source]當中,再重新編譯DSpace即可。


使用方法

舉例來說,下面網址與圖片顯示是在預設情況下全部的item:(因為這是區域網路,所以下面的網址應該連不到這個網頁)

http://192.168.1.30:8080/jspui/handle/123456789/56/browse?type=title&submit_browse=Title

image

但是只要在網址的GET參數當中加入「fdc[0]=欄位=值」(fdc是FilterDCValue的縮寫),就會出現特定item的效果,如下,注意紅字的位置:

http://192.168.1.30:8080/jspui/handle/123456789/56/browse?type=title&submit_browse=Title&fdc[0]=dc.title=121212

image

如果你要找出具備兩個條件的item,那就輸入「fdc[0]=欄位=值&fdc[1]=欄位=值」,例如下面的網址與圖:

http://192.168.1.30:8080/jspui/handle/123456789/56/browse?type=title&submit_browse=Title&fdc[0]=dc.title=121212&fdc[1]=dc.date.issued=2009

image

裡面的所有連結我都已經調整過了,會自動帶入fdc的參數進去。至於細微的版面調整,那就是大家各自努力囉。


DSpace的Browse功能意外地複雜,解析物件的結構、資料的流向花了我不少的時間。雖然瀏覽感覺上只是個小功能,但是既然DSpace都有提供了,還是希望大家能夠好好利用吧!

(more...)

使用SWFTools把PDF轉成可以瀏覽的SWF檔案

布丁布丁吃布丁

使用SWFTools把PDF轉成可以瀏覽的SWF檔案

image

SWFTools,是個功能強大的SWF工具,可以把AVI影片、PNG JPEG圖片、PDF轉換成SWF格式的檔案。SWF格式是Adobe Flash匯出後的檔案,現在大部分都支援Flash的瀏覽器中都可以直接播放,Wikipedia寫說有99%的網路使用者都可以讀取swf檔案,包括任天堂Wii或是Sony的PSP。

image

其中pdf2swf + rfxview viewer 的功能最讓我感到驚豔。如名稱所示,他可以把PDF轉換成SWF之後,再結合rfxview viewer輸出成一個可供瀏覽的SWF檔案。瀏覽的項目包括放大、縮小、拖曳、換頁等功能,而且可以直接在網頁上播放,非常令人讚賞!有興趣的話可以先開啟範例網頁來玩玩看!

詳細的SWFTools指令,可以參考「光头的专栏 - SWFTools 命令」,裡面也介紹了中文字的解決方案。

我也把SWFTools加入了DSpace的Media-filter功能當中,這一篇則是先單純地介紹怎麼安裝SWFTools,並且把PDF轉換成SWF、並結合到SWFTools。


安裝SWFTools

SWFTools下載網頁:http://www.swftools.org/download.html,內有Windows版本跟Linux版本。

如果你跟我一樣是用CentOS的話,我們可以直接使用yum指令來直接安裝SWFTOOLS喔!

請以root身份登入,然後輸入以下指令:

[root@dspace ~]# yum -y install swftools

安裝完成之後,就可以用「pdf2swf [來源的pdf檔] [輸出的swf檔]」來作轉換喔,例如下面的指令:

[root@dspace ~]# pdf2swf input.pdf output.swf

取得rfxview.swf瀏覽器

直接用pdf2swf轉換出來的swf檔案並不具備瀏覽器的功能,必須搭配rfxview.swf才有這個效果。

rfxview.swf可以從SWFTools下載頁面中的swftools-0.9.0.tar.gz找到,我也另外備份了一份到SkyDriveMiroko空間當中。

實作範例

請先把PDF檔案、rfxview.swf瀏覽器放到同一個資料夾當中。
PDF範例檔案可以使用我的Blog(SkyDrive下載Miroko下載)

轉換的指令如下:

pdf2swf -z -B [rfxview.swf瀏覽器的路徑] -s flashversion=7 -t [來源PDF] -o [輸出SWF]

於是實際上輸入的指令如下:

[dspace@dspace-course ~]$ pdf2swf -z -B rfxview.swf -s flashversion=7 -t 1.pdf -o 2.swf

你可以用以下HTML程式碼寫在網頁中以開啟轉換後的2.swf:

<OBJECT CLASSID="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
 WIDTH="595"
 HEIGHT="842"
 CODEBASE="http://active.macromedia.com/flash5/cabs/swflash.cab#version=8,0,0,0">
  <PARAM NAME="MOVIE" VALUE="2.swf">
  <PARAM NAME="PLAY" VALUE="true">
  <PARAM NAME="LOOP" VALUE="true">
  <PARAM NAME="QUALITY" VALUE="high">
  <EMBED SRC="2.swf" WIDTH="595" HEIGHT="842"
   PLAY="true" ALIGN="" LOOP="true" QUALITY="high"
   TYPE="application/x-shockwave-flash"
   PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer">
  </EMBED>
</OBJECT>

輸出結果應該要如下所示(SkyDrive下載Miroko下載):


SWFTools轉出來的PDF2SWF+rfxview仍有個缺點,就是他的大圖瀏覽在一開始的顯示比例跟位置不是說很好,開啟之後無法預設用「全畫面」來瀏覽。不過暫時也找不到其他的開放原始碼的替代方案,所以就期待SWFTools繼續改版吧。

(more...)

HTML中object標籤在Firefox會出現底下margin-bottom: 2px現象的解決方法

布丁布丁吃布丁

HTML中object標籤在Firefox會出現底下margin-bottom: 2px現象的解決方法

image

上圖的圖片是一個<object>標籤,外面包著一層<div>用以表示圖片與其他元素的位置,但是會發現到底下多出了大約2px的間隔,除了原本在<object>裡面設定的height之外,還被強迫下向擠了一些間隔。

這是Firefox才會出現的錯誤,修正方法是在<object>的style屬性當中加入font-size: 0 (字體大小為0)、line-height: 0 (行高為0) 即可,程式碼如下:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
	width="640"
	height="380"
	style="font-size: 0;line-height: 0;"
	codebase="http://active.macromedia.com/flash5/cabs/swflash.cab#version=4,0,0,0">
		<param name="movie" value="http://140.119.61.174:8080/jspui/retrieve/1366">
		<param name="play" value="true">
		<param name="loop" value="true">
		<param name="quality" value="high">
		<param name="wmode" value="transparent">

		<embed src="http://140.119.61.174:8080/jspui/retrieve/1366" width="640" height="380" style="font-size: 0;line-height: 0;" 
			play="true" align="" loop="true" quality="high"
			type="application/x-shockwave-flash"
			wmode="transparent"
			pluginspage="http://www.macromedia.com/go/getflashplayer">
		</embed>
	</object>

修正結果之後的畫面如下,下面的間隔不見了。

image

(more...)

CentOS安裝Xpdf教學

布丁布丁吃布丁

CentOS安裝Xpdf教學

image

Xpdf是Linux中可以讀取PDF檔案的開放原始碼程式,我引用一下Wikipedia的詳細介紹:

Xpdf 是一個開放原始碼PDF檔案瀏覽器,此軟體運行於X Window以及Motif上。 Xpdf 也實際運行於所有類Unix作業系統上。Xpdf 可解碼LZW壓縮格式並閱讀加密的PDF文件。官方版本的Xpdf遵循PDF檔案的智慧財產權政策,因此可能禁止拷貝、列印或轉換的功能。當然有某些破解補丁可以忽略這些智慧財產管理限制。

Xpdf包含數項不需要X windows系統的程式,包含了解析PDF的圖檔以及將PDF轉檔成文字檔或PostScript的程式。

Xpdf也被其他PDF瀏覽程式用於前端,例如KPDF(一個運行在KDE桌面的程式)。而它的文字引擎則被許多PDF瀏覽程式運用,例如BeOS上的BePDF、RISCOS上的!PDF以及Palm OS上的PalmPDF。

Poppler以xpdf 3.0的繪圖函式庫為基礎創造出來,以便增加其再用性。許多程式(包括Xpdf自己)可使用poppler為它們的後端繪圖器。

來源:Xpdf - 維基百科,自由的百科全書,http://zh.wikipedia.org/wiki/Xpdf

Xpdf很重要的功能在於「從PDF轉成文字檔」,這可以取代DSpace原本使用PDFbox的缺點:PDFbox不支援Acrobat 9的PDF檔案。

在一篇網路上到處轉載的「JAVA抽取WORD和PDF格式文件的四种武器」當中也有介紹到Xpdf,但並沒有很詳盡的安裝方法。所以這一篇主要是來教大家怎麼在Linux,特別是在CentOS當中安裝Xpdf。


Xpdf可以利用rpm來安裝,而相依套件的部份我們則是用yum來安裝。

1. 安裝Xpdf的相依套件

請以root的身份輸入以下指令:

[root@dspace ~]# yum install -y openmotif libpaper poppler-utils xdg-utils

2. 下載Xpdf的rpm檔案並安裝

Xpdf沒有提供rpm,但我們可以在RPM pbone.net找到Xpdf的rpm安裝檔。網頁位置在這裡,其中一個載點請點此下載,另外我準備了SkyDrive備份。

確定你存放的位置之後,請以root的身份輸入以下指令:.

[root@dspace ~]# rpm -ivh xpdf-3.02-5.el5.1.i386.rpm

如果沒有錯誤訊息,表示安裝成功。

3. 安裝語系檔

請先下載以下語系檔,或是下載我在SkyDrive的語系檔備份

如果你下載我備份的壓縮檔,請依照以下指令來解壓縮並安裝。

[root@dspace ~]# unzip xpdf-language-i386.zip -d lang
[root@dspace ~]# rpm –ivh lang/xpdf-*.rpm --force

4. 使用Xpdf的pdftotext來抽取PDF的文字檔

讓我們試著將一個PDF檔案中的文字抽取成txt文字檔吧。

  1. 請下載PDF檔案:「Chen, A Study on Knowledge Extraction from User Reading Annotation of Digital Library.pdf」(其實這是我的論文計畫書初稿XD)。
  2. 放到伺服器中的位置,你知道的地方即可。
  3. 執行pdftotext指令與檔名,如下:
  4. [root@dspace ~]# pdftotext Chen\,\ A\ Study\ on\ Knowledge\ Extraction\ from\ User\ Reading\ Annotation\ of\ Digital\ Library.pdf
  5. 此時應該會有同樣檔名,但是副檔名為.txt的檔案產生。結果應該跟這個檔案一樣,下圖中,左邊是PDF原稿,右邊則是抽取出來的文字檔!image

這樣就安裝完成囉。此外,上面安裝過語系檔的檔案也全都可以如法炮製地抽取出文字檔,Xpdf非常地強大!


本篇教學是為了擴增DSpace的Media-filter而鋪路,我現在正要把Xpdf跟DSpace整合,讓DSpace全文搜尋功能更為完整。

(more...)

橫跨政大景美溪對岸堤防

布丁布丁吃布丁

橫跨政大景美溪對岸堤防

image

聽說政大有列出十條必走不可的路,可是對我來說,其實最想要走的一條路,就在政大過景美溪對岸的河堤。每次傍晚經過的時候,都可以看到好多人悠閒地散步、騎腳踏車,昏黃的夕陽與路燈之下交織出一種幸福的景色。

今天晚餐難得一個人下山吃飯,也沒有特別要再上山回實驗室,剛好趁著吃飽飯要回宿舍的機會,來走走看這條路線吧!

2009-06-23-013

上道南橋的樓梯在那邊,平常只有到對面吃日本料裡的時候才會走的路呢。

2009-06-23-014

狹窄的樓梯,還碰到一對情侶剛好要下來,就先讓他們過吧。

2009-06-23-015

道南橋上一景,平常我會在右邊的道路上騎車,今天則是走旁邊的人行道。

2009-06-23-016

從道南橋上遠眺政大。

2009-06-23-019

回頭看看道南橋,車子好多喔。

2009-06-23-018

這就是待會要走的堤岸,要走上面還是下面好呢?

2009-06-23-020

從橋上是直接接到上面的河堤,那就走這邊吧。要開始囉~

2009-06-23-021

馬上就在路口出發現了一個神秘的石碑!「木柵舊址」,原來木柵以前真的有柵欄,只是不知道什麼時候拆掉了。

2009-06-23-024

因為越來越晚了,如果不找些有光源的地方照,憑手機相機拍起來還真的會什麼都看不到。我指的光源是指路燈,並不是指路邊座椅上正在親密聊天的情侶喔。

2009-06-23-023

回頭看看,那個方形的建築物是管制設施,頗神秘。

2009-06-23-025

走到一半,看到了樓梯,來下去走走吧!

2009-06-23-026

景美溪河岸有籃球場、散步道與腳踏車道路,可惜太暗了什麼都看不清楚。

2009-06-23-027 2009-06-23-028

發現了「渡船頭」!上面還有指出東西南北方位,各以一個景點作為代表:北—陽明山花季、南—林家花園、西—忘了(喂~)、東—貓空採茶。

2009-06-23-031

然後,我跑去景美溪踏水了!穿著涼鞋,感受溪水從腳底下不斷流過的清涼感,以及在水中舉步維艱的阻力,真的很讓人開心!

好像是有個挖土機在鏟土,留下了一條到溪邊的道路,我才能順利下去,不然其他用水泥建好的道路幾乎都被雜草擋住了。可惜景美溪又深又廣,一不小心腳滑還可能就上演溪中游泳的戲碼,只好踏踏水就上來。不過不禁感慨到,還好現在有道南橋了,不然要靠船送東西還真的很麻煩耶。

2009-06-23-032

舉頭看看政大藝文中心,還真的很大一棟。

2009-06-23-033 

2009-06-23-034

繼續往 下走吧,天已經暗到拍照只能拍到遠方的路燈了。

 2009-06-23-035

又發現了一處可以靠近溪邊道路,只是這邊的水深已經不是可以下去踏踏的程度了。

2009-06-23-037

恆光橋下小公園,許多老人、小孩在此處聊天、嬉戲。可以明顯地發現這邊沒什麼年輕人(汗

2009-06-23-038

2009-06-23-039 

恆光橋對面就是大大的「國立政治大學」六個字。

2009-06-23-040

上恆光橋吧!

2009-06-23-043

回頭來看看政大與剛剛走過的路,雖然是幾乎看不太到啦。

2009-06-23-041

終點就在橋的對岸,回宿舍囉!


這樣逛啊逛的也花去了一個多小時的時間,而我又對政大的景色有更多的認識。至於照片太過模糊、雜訊過多的問題,就不要勉強手機相機了吧,他已經盡力囉。

好啦,回到宿舍就繼續工作吧,加油!

(more...)

DSpace Input-type新增taiwanaddress

布丁布丁吃布丁

DSpace Input-type新增taiwanaddress

2009-06-15_000205

為了因應臺灣的地址,我開發了一個TaiwanAddress的input-type,可以在選擇縣市之後,由程式自動帶入郵遞區號前三碼。

這個程式我也寫成jQuery的plugin,只要引入之後以jQuery(selecotr).taiwanAddress()就可以使用。

由於最近修改程式碼的頻率頻繁,故不提供檔案,而是以指示的方式教你安裝這些功能。以下是安裝與使用教學:


檔案下載

請下載以下檔案,並擺到下述的指定位置:

修改遞交作業

本步驟有兩個檔案必需要修改。

修改edit-metadata.jsp

edit-metadata.jsp是遞交作業中填寫metadata使用的JSP檔案。

如果你修改過edit-metadata.jsp的話,你應該要在[dspace-source]/dspace/modules/jspui/src/main/webapp/submit/edit-metadata.jsp找到該檔案,否則請到[dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/submit/edit-metadata.jsp找到該檔案。

請依照以下指示修改程式碼:

插入doTaiwanAddress函式

請找到「do」開頭函式的最後一個,如果你安裝過我之前介紹的DSpace新增input-type,那麼可以找到「}    //void doXMLMetadata()」,請在後面插入以下程式碼:

    void doTaiwanAddress(javax.servlet.jsp.JspWriter out, Item item,
      String fieldName, String schema, String element, String qualifier, boolean repeatable,
      int fieldCountIncr, String label, PageContext pageContext, String vocabulary, boolean closedVocabulary) 
      throws java.io.IOException 
    {

      DCValue[] defaults = item.getMetadata(schema, element, qualifier, Item.ANY);
      int fieldCount = defaults.length + fieldCountIncr;
      StringBuffer sb = new StringBuffer();
      String val;

      if (fieldCount == 0)
         fieldCount = 1;

      for (int i = 0; i < fieldCount; i++) 
      {
	 if (i == 0) 
	    sb.append("<tr><td class=\"submitFormLabel\">")
	      .append(label)
	      .append("</td>");
	 else
	    sb.append("<tr><td>&nbsp;</td>");

         if (i < defaults.length)
           val = defaults[i].value.replaceAll("\"", "&quot;");
         else
           val = "";

         sb.append("<td colspan=\"2\"><input type=\"text\" name=\"")
           .append(fieldName);
         if (repeatable && i>0)
           sb.append("_").append(i);
         
         sb.append("\" size=\"50\" value=\"")
           .append(val +"\"")
           .append(hasVocabulary(vocabulary)&&closedVocabulary?" readonly=\"readonly\" ":"")
	   	.append("   />")
	   .append(doControlledVocabulary(fieldName + (repeatable?"_" + i:""), pageContext, vocabulary))
	   .append("<script type=\"text/javascript\">" + "\n")
		.append("jQuery(document).ready(function () {" + "\n")
		.append("jQuery(\"input[name=\'")
		.append(fieldName);
		if (repeatable && i>0)
           sb.append("_").append(i);
		sb.append("\']\").taiwanAddress();" + "\n")
		.append("});" + "\n")
	   .append("</script>")
	   .append("</td>\n");
	   

	 if (repeatable && i < defaults.length) 
	 {
	    // put a remove button next to filled in values
	    sb.append("<td><input type=\"submit\" name=\"submit_")
	      .append(fieldName)
	      .append("_remove_")
	      .append(i)
//	      .append("\" value=\"Remove This Entry\"/> </td></tr>");
	      .append("\" value=\"")
   	      .append(LocaleSupport.getLocalizedMessage(pageContext, "jsp.submit.edit-metadata.button.remove"))
   	      .append("\"/> </td></tr>");
	 } 
	 else if (repeatable && i == fieldCount - 1) 
	 {
	    // put a 'more' button next to the last space
	    sb.append("<td><input type=\"submit\" name=\"submit_")
	      .append(fieldName)
//	      .append("_add\" value=\"Add More\"/> </td></tr>");
	      .append("_add\" value=\"")
	      .append(LocaleSupport.getLocalizedMessage(pageContext, "jsp.submit.edit-metadata.button.add"))
	      .append("\"/> </td></tr>");
	 } 
	 else 
	 {
	    // put a blank if nothing else
	    sb.append("<td>&nbsp;</td></tr>");
	 }
      }

      out.write(sb.toString());
    }

引用jquery-plugin-taiwan-address.js

找到引用JavaScript與CSS的地方,在「<link rel="stylesheet" href="<%= request.getContextPath() %>/extension/xmlmetadata/dspace-inputtype-xml.css" type="text/css" media="screen">」之後插入以下程式碼:

<script type="text/javascript" src="<%= request.getContextPath() %>/extension/taiwan-address/jquery-plugin-taiwain-address.js"></script>

插入選擇使用doTaiwanAddress

最後找到以下程式碼:

								else if (inputType.equals("xmlmetadata")) 
								{
									pageContent.append(doXMLMetadata(out, item, fieldName, dcSchema, dcElement, dcQualifier, 
											  repeatable, fieldCountIncr, label, pageContext, vocabulary,
											  closedVocabulary, workspaceItemID, 
											  nonInternalBistreamsID, hasMultipleFiles, defaultValue, 
											  request.getContextPath()));
								} 

在這之後插入以下程式碼:

								else if (inputType.equals("taiwanaddress")) 
								{
									pageContent.append(doTaiwanAddress(out, item, fieldName, dcSchema, dcElement, dcQualifier, 
										repeatable, fieldCountIncr, label, pageContext, vocabulary, 
										closedVocabulary));	
								}
修改DescribeStep.java

DescribeStep.java是遞交作業中儲存資料時使用的檔案。

DescribeStep.java的位置在[dspace-source]/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java

請找到以下程式碼:(如果增加過input-type,那這邊應該也會有所改變)

            else if ((inputType.equals("onebox"))
                    || (inputType.equals("twobox"))
                    || (inputType.equals("textarea"))

請多加一個條件式如下:

					|| (inputType.equals("taiwanaddress"))

修改完畢之後,必須將DSpace重新編譯,方能生效。

2009-06-15_010334

修改edit-item-form.jsp

edit-item-form.jsp是修改文件時使用的JSP檔案。

你必須先確認你之前安裝過我寫的DSpace擴增文件編輯功能,你才能夠繼續安裝以下功能。

如果你修改過edit-item-form.jsp的話,你應該要在[dspace-source]/dspace/modules/jspui/src/main/webapp/tools/edit-item-forms.jsp找到該檔案,否則請到[dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/tools/edit-item-form.jsp找到該檔案。

請依照以下步驟一一插入程式碼。

插入doTaiwanAddress函式

請找到「String doXMLMetadata(…」函式的結束位置,我應該有加一個註解:「}//doXMLMetadata End」,再之後加入以下程式碼:

    String doTaiwanAddress(javax.servlet.jsp.JspWriter out, Item item,
      String fieldName, String schema, String element, String qualifier, boolean repeatable,
      int fieldCountIncr, String label, PageContext pageContext, String vocabulary, boolean closedVocabulary) 
      throws java.io.IOException 
	{
		StringBuffer output = new StringBuffer();
      DCValue[] defaults = item.getMetadata(schema, element, qualifier, Item.ANY);
      int fieldCount = defaults.length + fieldCountIncr;
      StringBuffer sb = new StringBuffer();
      String val;

      if (fieldCount == 0)
         fieldCount = 1;

	  int index = 0;
      for (int i = 0; i < fieldCount; i++) 
      {
	 if (i == 0) 
	    sb.append("<tr><td class=\"submitFormLabel\" width=\"35%\">")
	      .append(label)
	      .append("</td>");
	 else
	    sb.append("<tr><td>&nbsp;</td>");

         if (i < defaults.length)
           val = defaults[i].value.replaceAll("\"", "&quot;");
         else
           val = "";

         sb.append("<td colspan=\"2\"><input type=\"text\" name=\"")
           .append(fieldName);
         if (repeatable && i>0)
           sb.append("_").append(i);
         

		String editItemFormID = getMetadataID("value_", schema, element, qualifier, index);
		String editItemFormRemoveID = getMetadataID("submit_remove_", schema, element, qualifier, index);
		String editItemFormAddID = getAddID(schema, element, qualifier);
		index++;
		 
         sb.append("\" size=\"80\" value=\"")
           .append(val +"\"")
           //.append(hasVocabulary(vocabulary)&&closedVocabulary?" readonly=\"readonly\" ":"")
	   	.append("  onchange=\"editItemFormSync('"+editItemFormID+"', this.value)\" class=\"doTaiwanAddress\" />")
	   //.append(doControlledVocabulary(fieldName + (repeatable?"_" + i:""), pageContext, vocabulary))
	   .append("<textarea class=\"javascript\" style=\"display:none\">" + "\n")
		.append("jQuery(document).ready(function () {" + "\n")
		.append("jQuery(\"input[name=\'")
		.append(fieldName);
		if (repeatable && i>0)
           sb.append("_").append(i);
		sb.append("\']\").taiwanAddress();" + "\n")
		.append("});" + "\n")
	   .append("</textarea>")
	   .append("</td>\n");
	  
	 String fieldNameFull = fieldName;
	 if (repeatable && i>0)
           fieldNameFull = fieldNameFull + "_" + i;
	 
     
	 if (repeatable && i < defaults.length) 
	 {
	    // put a remove button next to filled in values
	    sb.append("<td><input type=\"button\" onclick=\"editItemRemove('"+editItemFormRemoveID+"')\" name=\"submit_")
	      .append(fieldName)
	      .append("_remove_")
	      .append(i)
//	      .append("\" value=\"Remove This Entry\"/> </td></tr>");
	      .append("\" value=\"")
   	      .append(LocaleSupport.getLocalizedMessage(pageContext, "jsp.submit.edit-metadata.button.remove"))
   	      .append("\"/> </td></tr>");
	 } 
	 else if (repeatable && i == fieldCount - 1) 
	 //else if (true)
	 {
	    // put a 'more' button next to the last space
	    sb.append("<td><input type=\"button\" onclick=\"editItemAdd('"+editItemFormAddID+"')\" name=\"submit_")
	      .append(fieldName)
//	      .append("_add\" value=\"Add More\"/> </td></tr>");
	      .append("_add\" value=\"")
	      .append(LocaleSupport.getLocalizedMessage(pageContext, "jsp.submit.edit-metadata.button.add"))
	      .append("\"/> </td></tr>");
	 } 
	 else 
	 {
	    // put a blank if nothing else
	    sb.append("<td>&nbsp;</td></tr>");
	 }
      }

     	//out.write(sb.toString());
		output.append(sb.toString());
		return output.toString();
    }//doTaiwanAddress End

引用jquery-plugin-taiwan-address.js

找到引用JavaScript與CSS的地方,在「<link rel="stylesheet" href="<%= request.getContextPath() %>/extension/xmlmetadata/flora.datepicker.css" type="text/css" media="screen">」之後插入以下程式碼:

<script type="text/javascript" src="<%= request.getContextPath() %>/extension/taiwan-address/jquery-plugin-taiwain-address.js"></script>

插入選擇使用doTaiwanAddress

最後找到以下程式碼:

								else if (inputType.equals("xmlmetadata")) 
								{
									pageContent.append(doXMLMetadata(out, item, fieldName, dcSchema, dcElement, dcQualifier, 
											  repeatable, fieldCountIncr, label, pageContext, vocabulary,
											  closedVocabulary, workspaceItemID, 
											  nonInternalBistreamsID, hasMultipleFiles, defaultValue, 
											  request.getContextPath()));
								} 

在這之後插入以下程式碼:

								else if (inputType.equals("taiwanaddress")) 
								{
									pageContent.append(doTaiwanAddress(out, item, fieldName, dcSchema, dcElement, dcQualifier, 
										repeatable, fieldCountIncr, label, pageContext, vocabulary, 
										closedVocabulary));	
								}

完成!

2009-06-15_000205

使用input-type:taiwanaddress

請修改[dspace]/config/input-forms.xml,把input-type設為taiwanaddress就可以囉。舉例來說如下:

       <field>
         <dc-schema>dc</dc-schema>
         <dc-element>contributor</dc-element>
         <dc-qualifier>authorAddress</dc-qualifier>
         <repeatable>true</repeatable>
         <label>Author Address</label>
         <input-type>taiwanaddress</input-type>
         <hint>Enter the address of the author of this item below.</hint>
         <required></required>
       </field>

結語

之後還會陸續加入一些東西,我想等穩定一點再來發佈edit-metadata.jsp或其他檔案吧。

<-- Post Catalog -->

(more...)