# DocuWidgets 使用導引 (舊版)
<!-- 標籤 -->
###### tags: `使用導引`, `文件狀態:停止更新`
<!-- 內文編輯更新資訊,若有更動此份文件內容,請更新此項資訊 -->
> [name=Hsieh-Chang Tu, 杜協昌]
> [time=Aug, 2017]
<!-- 摘要 -->
:::success
<!-- 當前負責人使用高亮標示,新接替維護人員請加在第一個 -->
- **建立者**:杜協昌
- **維護者**:杜協昌
:::
<!-- 筆記正文開始 -->
## Briefly description
- DocuWidgets 是由數個 DocuSky widgets 所組成。其中,每個 widget 是一份 JavaScript 元件形式的程式碼, 便利工具開發者存取 DocuSky 上的資料。
- DocuSky 提供一組 Web API 供工具開發者存取 DocuSky 的資料。這些 API 可讓工具透過 HTTP protocol 來進行使用者登入、登出、資料庫列表、資料庫查詢、以及二進位檔案 (binary file) 上載與下載等操作。 DocuSky widgets 可將登入認證的程序包裝起來,如此工具開發者就不必去處理繁雜的認證程序。 此外,widget 也將 DocuSky Web API 以 JavaScript 物件的形式進行包裝, 如此工具就可直接呼叫物件的函式(而不需自己處理 Web API 的輸入輸出格式)來存取 DocuSky 資料。 DocuSky widgets 必須使用 jQuery 和 jQuery UI 來進行一些版面的設定。 因此工具程式除了引入 widget 外,也需引入 jQuery 和 jQuery UI 的程式庫。
- 目前,DocuSky 提供了三個簡單的 widgets:
1. ++docusky.ui.getDbCorpusDocumentsSimpleUI.js++
2. ++docusky.ui.manageDataFileListSimpleUI.js++
3. ++docusky.ui.manageDbListSimpleUI.js++
- 其中
- getDbCorpusDocumentsSimpleUI 可用來讓工具查找資料庫文件
- manageDataFileListSimpleUI 則可讓工具上載 binary file
- manageDbListSimpleUI 可用來讓使用者建構(透過上載 DocuXml 建庫檔)與刪除資料庫。 以下分別介紹這些 widgets 載入後所提供的函式 API。
## docusky.ui.getDbCorpusDocumentsSimpleUI.js
- **範例程式:**[簡單範例與說明](https://docusky.digital.ntu.edu.tw/DocuSky/documentation/docs/widget.getDbCorpusDocumentsSimpleUI/simpleExample-docs.html)
- 這個 widget 主要是提供查找資料庫文件的功能。工具引入 widget 後, 全域的 getDbCorpusDocumentsSimpleUI 物件將提供以下的方法 (methods):
1. getDbCorpusDocuments(target, db, corpus, evt, successFunc)
2. getDbCorpusDocumentsGivenPageAndSize(target, db, corpus, page, pageSize, evt, successFunc, message)
3. getQueryResultDocuments(param, evt, successFunc, successFuncParameters)
4. addExtraApiFunctions(apiObj)
- **getDbCorpusDocuments(target, db, corpus, evt, successFunc)**
- 這個函式可指定的資料庫文獻集,然後取得其結果的第一頁內容。
- 它的功能,相當於在 getDbCorpusDocumentsGivenPageAndSize() 函式指定 page=1, 然後使用當前(預設)pageSize。
- target 的值必須是 'USER'
- db 的值為資料庫名稱,而 corpus 的值則為欲查詢的文獻集名稱
- evt 可傳入(例如滑鼠點選所觸發的事件)event 物件
- successFunc 則可傳入查找成功後的回呼 (callback) 函式。
- 查詢的回傳結果,可以從 getDbCorpusDocumentsSimpleUI 物件的相關屬性取得。這些屬性包括:
- query(查詢字串)
- totalFound(符合查詢的條目總筆數)
- page(當前的資料是查詢結果的第幾頁)
- pageSize(每頁的條目數量)
- docList(符合條件的回傳文件集)
- target(目前只能是 'USER')
- db(資料庫名稱)
- corpus(文獻集名稱)
- spotlights(該文獻集的後分類項目編碼)
- 其中,docList 是一個陣列 \[e, e, ...\],其中每一個元素 e 是一個包含回傳編號的物件:
```json
{
"number": ...,
"docInfo": {...}
};
```
- docList 陣列元素的 docInfo 屬性中,包含了這篇文件的所有資訊。例如 DocuXml Sample-01 的文件上載建庫後, widget 所回傳的 docInfo 物件,應該長得像這樣 :
```json
{
"xmlFormatName": "ThdlContentXml",
"docXmlFormatSubname": "-",
"docId": "14428854",
"docFilename": "cca100003_od_ta_01516_000112_0001_u.xml",
"srcFilename": "DB_01001863_000.xml",
"corpus": "古契書",
"corpusOrder": "0",
"docAuthor": "許汝旺(賣主)",
"docCompilation": "臺灣總督府檔案抄錄契約文書‧永久保存公文類纂(國中圖93)",
"placeInfo": {
"geoLevel1": "桃澗堡",
"geoLevel2": "銅鑼圈",
"geoLevel3": "銅鑼圈庄",
"geoX": "121.193740",
"geoY": "24.839710"
},
"docTopicL1": "杜賣契",
"docTopicL1Order": "0",
"timeInfo": {
"dateOrigStr": "道光十一年",
"dateDynasty": "清",
"dateEra": "道光",
"dateAdDate": "18320103",
"dateAdYear": "1832",
"timeseqType": "my_time_sequence",
"timeseqNumber": "1018320103",
"dateChNormYear": "清道光十一年",
},
"docUserTagging": "測試;相關",
"docTitleXml": "<DocTitle>賣土窨字|臺灣總督府檔案</DocTitle>",
"docMetadataXml": "<DocMetadata>...</DocMetadata>",
"extraMetadata": {
"allFeaturesXml": "<AllFeatures/>"
},
"docTimeCreated": "2017-07-26 11:12:00",
"docContentXml": "<Content>od-ta_01516_000112 \n<LocName>桃澗堡</LocName>\n...</Content>"
}
```
- 下表說明以上各屬性所代表的意義:
|docInfo 屬性名稱|說明|DocuXml 1.0 的對應標籤|
|--- |--- |--- |
|xmlFormatName|記錄當前的 XML 格式| |
|docXmlFormatSubname|當前 XML 格式的額外資訊| |
|docId|系統自動產生的文件辨識碼| |
|docFilename|文件的檔名(文獻集中可唯一辨識該文件的編碼)|\<document\> 的 filename 屬性|
|srcFilename|上載建庫過程中,系統自動產生的 XML 檔名||
|corpus|文件所屬的文獻集名稱|\<corpus\>|
|corpusOrder|文獻集的排序編號(數字小的文獻集會排在前面)|\<corpus\> 的 corpus_order 屬性|
|docAuthor|文件的作者|\<author\>|
|docCompilation|文件的出處|\<coompilation\>|
|placeInfo.geoLevel1|文件的地理資訊:地域階層第一層|\<geo_level1\>|
|placeInfo.geoLevel2|文件的地理資訊:地域階層第二層|\<geo_level2\>|
|placeInfo.geoLevel3|文件的地理資訊:地域階層第三層|\<geo_level3\>|
|placeInfo.geoX|文件的地理資訊:經度座標(可被換算為浮點數)|\<geo_longitude\>|
|placeInfo.geoY|文件的地理資訊:緯度座標(可被換算為浮點數)|\<geo_latitude\>|
|docTopicL1|文件的主題|\<topic\>|
|timeInfo.dateOrigStr|文件的時間資訊:原始的日期字串|\<time_orig_str\>|
|timeInfo.dateDynasty|文件的時間資訊:朝代|\<time_dynasty\>|
|timeInfo.dateEra|文件的時間資訊:年號|\<time_era\>|
|timeInfo.dateChNormYear|文件的時間資訊:中曆年|\<time_norm_year\>|
|timeInfo.dateAdDate|文件的時間資訊:西元日期(可被轉換為整數)|\<time_ad_date\>|
|timeInfo.dateAdYear|文件的時間資訊:西元年(可被轉換為整數)|\<time_ad_year\>|
|timeInfo.timeseqType|文件的時間資訊:時間序列的型態|\<timeseq_type\>|
|timeInfo.timeseqNumber|文件的時間資訊:時間序列的編號(可被轉換為數字)|\<timeseq_number\>|\
|docUserTagging|使用者自訂的標記資訊(一個詞彙列表,詞彙間以分號 ';' 隔開)|\<doc_user_tagging\>|
|docTitleXml|以 XML 表示的文件標題|\<title\>|
|docMetadataXml|以 XML 表示的(使用者自訂)詮釋資料|\<xml_metadata\>|
|extraMetadata|額外的詮釋資料(系統保留以後使用)||
|docTimeCreated|文件的建立時間||
|docContentXml|以 XML 表示的文件內文|\<doc_content\>|
- **getDbCorpusDocumentsGivenPageAndSize(target, db, corpus, page, pageSize, evt, successFunc, message)**
- 這個函式提供比 getDbCorpusDocumentsGivenPageAndSize() 更有彈性的功能。 它將 target, db, corpus, query, page, pageSize 等參數包裝到 param 物件內。 例如
```json
var param = {
"target": 'USER',
"db": '我的資料庫',
"corpus": '我的文獻集',
"query": '芝麻',
"page": 2,
"pageSize": 100
};
```
- 可指定要在使用者資料庫「我的資料庫」、文獻集名稱「我的文獻集」中,查詢「芝麻」, 並回傳查詢結果的第 2 頁(每頁 100 筆文件,也就是第 101-200 筆資料)內容。 若在 param 中加入 message 屬性,則 widget 會將 message 的內容顯示在 loading icon(正在進行載入程序的動態圖示)內。
- `evt` 可傳入(例如滑鼠點選所觸發的事件)event 物件,而 `successFunc` 則傳入查找成功後的回呼函式。 與 getDbCorpusDocumentsGivenPageAndSize() 相較,這個函式還多出一個 successFuncParameters 參數,讓 widget 在成功從 DocuSky 取回資料後, 以 `successFunc(successFuncParameters)` 的方式, 將參數 successFuncParameters 傳給指定的回呼函式。
- **addExtraApiFunctions(apiObj)**
- 這個函式是用來在 getDbCorpusDocumentsSimpleUI 物件上,動態添加 dbRefdataAPI 的函式。 DocuSky 允許在每個資料庫中,以 JSON 格式儲存工具所需的 dbRefdata(資料庫參考資料)。 若這個資料庫被刪除,該資料庫下的所有 dbRefdata 都會被一併移除。欲存取一份 dbRefdata, 必須指定 dbTitle(該資料庫的名稱)、dbRefdataDatasetName(一般建議以專案或工具名稱, 來作為資料集名稱)、以及 dbRefdataName(資料名稱)。dbRefdataAPI 將這些存取的 Web API 包裝起來,以 JavaScript 物件函式的方式讓工具呼叫使用。
- dbRefdataAPI 將這些存取的 Web API 包裝起來,以 JavaScript 物件函式的方式讓工具呼叫使用。
- 範例程式:[範例截圖與程式](https://docusky.digital.ntu.edu.tw/DocuSky/documentation/docs/widget.getDbCorpusDocumentsSimpleUI/simpleExample-dbRefdata-docs.html)
- 工具程式可透過以下程式碼, 將 dbRefdataAPI 所提供的函式加入 getDbCorpusDocumentsSimpleUI 物件:
```javascript
var docuSkyObj = getDbCorpusDocumentsSimpleUI;
$.getScript("js.ui/extra/docusky.dbRefdataAPI.js", function() {
docuSkyObj.addExtraApiFunctions(appendDbRefdataAPI);
});
```
- dbRefdataAPI 提供以下幾個函式:
- **deleteDbRefdataData(dbTitle, dbRefdataDatasetName, dbRefdataName, callback)**
- 嘗試從 DocuSky 中,刪除資料庫名稱 dbTitle,參考資料集名稱為 dbRefdataDatasetName 之下的 dbRefdataName 資料集。 接著,widget 會將控制權轉給 callback 回呼函式。
- **getDbRefdataData(dbTitle, dbRefdataDatasetName, dbRefdataName, callback)**
- 嘗試從 DocuSky 中,取得資料庫名稱 dbTitle、參考資料集名稱 dbRefdataDatasetName、且資料名稱為 dbRefdataName 的資料項。回呼函式 callback 可利用 `getDbCorpusDocumentsSimpleUI.dbRefdataObj` 取得 DocuSky 所回傳的 **dbRefdataObj 物件**:
```json
{
"dbTitle": ...,
"dbRefdataDatasetName": ...,
"dbRefdataName": ...,
"dbRefdataType": ...,
"dbRefdataFormat": ...,
"dbRefdataFormatVersion": ...,
"dbRefdataData": ...
}
```
- 其中,dbRefdataObj 物件的 dbRefdataData 屬性,就是以 JavaScript 物件形式儲存的該資料項內容。 也就是說,工具可透過 `getDbCorpusDocumentsSimpleUI.dbRefdataObj.dbRefdataData` 直接取得該資料項的內容。
- **getDbRefdataInfoList(dbTitle, callback)**
- 回傳資料庫名稱 dbTitle 下的所有資料集資訊。 工具可在回呼函式中,透過 `getDbCorpusDocumentsSimpleUI.dbRefdataInfoList` 來取得這些資料集的資訊列表。這個列表是一個 JavaScript 陣列, 其中每個元素都具有以下的結構(與 dbRefdataObj 物件 相較,少了 dbRefdataData 屬性)的物件,而每個物件則提供一份資料項的參考資訊。工具可透過 getDbRefdataData() 方法取得該資料項的內容。:
```json
{
"dbTitle": ...,
"dbRefdataDatasetName": ...,
"dbRefdataName": ...
"dbRefdataType": ...,
"dbRefdataFormat": ...,
"dbRefdataFormatVersion": ...,
}
```
- **replaceDbRefdataData(dbRefdataObj, callback)**
- 這個函式可將 dbRefdataObj 物件的 dbRefdataData 屬性內容, 儲存到 dbRefdataObj.dbTitle 資料庫、dbRefdataObj.dbRefdataDatasetName 資料集的 資料庫、dbRefdataObj.
- 另外,這個 widget 還提供以下幾個尚處於開發測試階段的函式:
:::success
1. getQueryPostClassification(param, evt, successFunc, successFuncParameters)
2. getQueryTagAnalysis(param, evt, successFunc, successFuncParameters)
3. hideLoadingIcon(bool)
4. hideWidget(bool)
5. setLoginAction(loginInvokeFun, loginInvokeFunParameters)
6. updateDocument(db, corpus, docInfo)
- getQueryPostClassification(param, evt, successFunc, successFuncParameters)
- 這個函式的參數與 getQueryResultDocuments() 相同,請參看該函式的說明。 它的目的,是將查詢的後分類結果,放到 getDbCorpusDocumentsSimpleUI 物件的 postClassification 屬性中。
- getQueryTagAnalysis(param, evt, successFunc, successFuncParameters)
- 這個函式的參數與 getQueryResultDocuments() 相同,請參看該函式的說明。 它的目的,是將查詢的標記分析結果,放到 getDbCorpusDocumentsSimpleUI 物件的 tagAnalysis 屬性中。
- hideLoadingIcon(bool)
- 由於通常需要一段時間才能從 DocuSky 將查詢結果的文件載入 widget 中, 因此 widget 在載入文件時,會在瀏覽器上顯示動態的 loading 圖示。 這個函式的目的,是讓工具程式能夠隱藏這個圖示。
- hideWidget(bool)
- 這個函式的目的,是讓工具程式能夠隱藏 widget。執行 getDbCorpusDocumentsSimpleUI.hideWidget(true) 後, widget 將盡量不在執行物件的 getDbCorpusDocuments()、 getDbCorpusDocumentsGivenPageAndSize() 或 getQueryResultDocuments() 方法過程中, 顯示 widget 的各項訊息。
- setLoginAction(loginInvokeFun, loginInvokeFunParameters)
- 這個函式的目的,是讓工具程式能夠設定成功登入後的行為。
- updateDocument(db, corpus, docInfo)
- 這個函式可讓工具程式動態更新文件的內容。 工具程式需在 db 和 corpus 參數指定正確的資料庫和文獻集名稱, 並且以 docInfo 物件的形式傳入文件欲更新的內容。 呼叫此函式後,widget 會嘗試更新該資料庫文獻集的文件內容,並以 JavaScript alert() 顯示是否更新成功。
- **注意**:此函式只能用於更新文件內容,並無法在資料庫的文獻集中新增文件。
:::
## docusky.ui.manageDataFileListSimpleUI.js
- 這個 widget 可讓使用者上載檔案,並且透過 widget 對這些檔案進行檢視或刪除。 上載的檔案需指定 category, datapath, filename 三項參數,而上載後工具或使用者可透過以下的 URL 從 DocuSky 取得這份檔案的內容。
- `http://docusky.digital.ntu.edu.tw/DocuSky/webApi/getDataFileBinary.php?catpathfile=<catpathfile>`
- **注意**:`<catpathfile>` 為 category, datapath, filename 三者串接(中間加上斜線 '/')起來的字串 category/datapath/filename。
- **manageDataFileList(evt, successFunc)**
- 這個函式要求 widget 列出使用者儲存在 DocuSky 的資料檔案。 evt 可傳入使用者所點選的滑鼠事件,而 successCallback 這個參數可傳一個回呼函式, 要求 widget 在取得資料檔的列表後,將控制權轉移到回呼函式(若沒有傳入 successCallback 參數,widget 會在瀏覽器上顯示使用者的資料檔, 並讓使用者可以對資料檔進行檢視或刪除,或者上載一份資料檔)。
- 範例程式:[點我執行](https://docusky.digital.ntu.edu.tw/DocuSky/documentation/docs/widget.manageDataFileListSimpleUI/simpleExample-manageDataFileList.html)
- 以下的函式,則仍處於開發測試階段:
:::success
- **hideWidget(bool)**
- 這個函式的目的,是讓工具程式能夠隱藏 widget。
- 這個 widget 另外提供了一個 jsonTransporter 物件, 讓工具程式經由這個物件在 DocuSky 上以 JSON 格式來存取資料。 這些資料對使用者帳號而言是全域的(刪除資料庫後依然存在,且其他的工具也可存取到), 而工具必須提供 category, datapath, 以及 filename 來唯一辨識這個 JSON 物件。 為了避免其他工具錯誤存取到這個物件,我們建議在 category 填入專案或工具的名稱, datapath 填入工具對這個 JSON 物件的分類路徑, 而 filename 則以 xxx.json 的形式(以 .json 作為附加檔名)指定檔案名稱。
- 注意到,呼叫這些函式後,回傳的結果都必須在回呼函式中處理。 DocuSky 回傳的結果將會被放在 jsonTransporter.jsonObj 物件中。這個物件包含兩項基本的屬性 code 和 message。 code 碼若為 0,表示 API 呼叫成功,執行的結果將以 JSON 格式放在 message 中。 code 碼若不為零,表示 API 在執行過程中發生錯誤,錯誤訊息將以字串的方式存放在 message 中。
- 範例程式:[點我](https://docusky.digital.ntu.edu.tw/DocuSky/documentation/docs/widget.manageDataFileListSimpleUI/simpleExample-jsonTransporter.html)
- **jsonTransporter.deleteDataFile(category, datapath, filename, callback)**
- 這個函式將嘗試從 DocuSky 刪除符合 category、datapath 條件下的 filename 資料檔,然後執行回呼函式 callback。
- **jsonTransporter.listCategoryDataFiles(category, datapath, callback)**
- 這個函式將嘗試從 DocuSky 取得符合 category 和 datapath 的所有資料檔名稱,然後執行回呼函式 callback。
- **jsonTransporter.retrieveJson(category, datapath, filename, callback)**
- 這個函式將嘗試從 DocuSky 取得符合 category 和 datapath,資料檔名稱為 filename 的資料,然後執行回呼函式 callback。 若 widget 執行成功,這份資料將以 JSON 格式存放在 jsonTransporter.jsonObj 的 message 屬性中。
- **jsonTransporter.storeJson(category, datapath, filename, jsonObj, callback)**
- 這個函式會先將 jsonObj 物件執行序列化 (serialization),並將序列化之後的結果儲存在 DocuSky 中(以 category, datapath, filename 區隔不同的資料)。 回呼函式可檢視 jsonTransporter.jsonObj 的 code 屬性,若它的值為 0,表示 widget 執行成功。
:::
## docusky.ui.manageDbListSimpleUI.js
- 這個 widget 的功能是讓工具可以建構、列出與刪除資料庫。在目前的版本中, 它僅提供一個操作介面,列出使用者當前所擁有的資料庫。 工具引入 widget 後,全域的 manageDbListSimpleUI 物件將提供以下的方法 (methods):
- **manageDbList(evt, successCallback)**
- 這個函式要求 widget 顯示出當前的資料庫與文獻集列表。evt 可傳入使用者所點選的滑鼠事件。 successCallback 這個參數可傳一個回呼函式,要求 widget 在取得使用者的資料庫列表後, 將控制權轉移到回呼函式;若沒有傳入 successCallback 參數, widget 會在瀏覽器上顯示使用者的資料庫列表,並讓使用者新增或刪除資料庫。
- 範例程式:[點我執行](https://docusky.digital.ntu.edu.tw/DocuSky/documentation/docs/widget.manageDbListSimpleUI/simpleExample-manageDbList.html)
- **uploadMultipart(url, data, callback)**
- 此函式可將 `data` 的字串,以 HTTP multipart/form-data 的方式 POST 到 `url` 所指定的網址。成功後,將控制權轉移到回呼函式。
- 以下的函式,則仍處於開發測試階段:
:::success
- hideWidget(bool)
- 這個函式的目的,是讓工具程式能夠隱藏 widget。
:::