Wiz助手插件开发(3)
目标:实现给文档设置作者,关键字,打星标,同时能够实现文档中自动给出现的关键字或者作者增加链接,点击后列出相关的文档(类似将标签转换为链接的功能)。
同时将标签转换为链接的插件功能包含进来。
1、允许给文档设置作者,关键字,打星标。
首先我们应该在用户点击知识管理按钮的时候,显示一个下拉窗口,在里面完成上面的工作。
打开km.js文件,有以下内容:
/*
添加知识管理按钮并且相应该按钮消息,显示一个下拉框,该下拉框内容是一个html文件
*/
function OnKMButtonClicked() {
var pluginPath = objApp.GetPluginPathByScriptFileName(“km.js”);
var bookmarksListHtmlFileName = pluginPath + “km.htm”;
//
var rect = objWindow.GetToolButtonRect(“document”, “KMButton”);
var arr = rect.split(‘,’);
objWindow.ShowSelectorWindow(bookmarksListHtmlFileName, arr[0], arr[3], 300, 500, “”);
}
function InitKMButton() {
var pluginPath = objApp.GetPluginPathByScriptFileName(“km.js”);
var languangeFileName = pluginPath + “plugin.ini”;
var buttonText = objApp.LoadStringFromFile(languangeFileName, “strKM”);
objWindow.AddToolButton(“document”, “KMButton”, buttonText, “”, “OnKMButtonClicked”);
}
InitKMButton(); |
上面的代码,就实现了这个功能。下拉窗口显示的内容,就是km.htm文件。我们在插件文件夹里面,建立一个km.htm文件,用html编辑器或者文本编辑器,编辑该文件,实现下面的界面:
用户可以在这里输入关键字,作者,打星标的功能,通过可以通过关键字或者作者搜索相关的文档。
km.htm里面的代码:
<script language=”javascript” type=”text/javascript”>
/*
Wiz显示插件html窗口的时候(如html对话框或者下拉框),html窗口的external对象,就是WizExplorerApp对象。
通过这个对象,可以获得当前正在运行的Wiz的一些内部对象,并调用Wiz的响应功能。
*/
var objApp = window.external; //WizExplorerApp
var objDatabase = objApp.Database;
var objWindow = objApp.Window;
var objDoc = objWindow.CurrentDocument; //获得当前正在浏览的Wiz文档(WizDocument)
var objHtmlDocument = objWindow.CurrentDocumentHtmlDocument; //获得当前正在浏览的html网页的document对象(IHTMLDocument2)
//
var pluginPath = objApp.GetPluginPathByScriptFileName(“km.js”); //获得插件的路径
var languangeFileName = pluginPath + “plugin.ini”; //语言文件
//
textKeywords.value = objDoc.Keywords; //显示当前文档的关键字
textAuthor.value = objDoc.Author; //显示当前文档的作者
//
function textKeywords_onchange() {
objDoc.Keywords = textKeywords.value; //保存关键字
}
function textAuthor_onchange() {
objDoc.Author = textAuthor.value; //保存作者
}
//
/*
通过关键字搜索相关文档,显示在文档窗口中。注:目前没有将关键字进行分隔,这样会有缺陷。
*/
function SearchByKeywords() {
var keywords = textKeywords.value;
if (keywords == null || keywords == “”)
return false;
//
try {
keywords = keywords.replace(/\‘/g, “””);
var sql = “document_keywords like ‘%” + keywords + “%’”;
var documents = objDatabase.DocumentsFromSQL(sql);
if (documents != null) {
objWindow.DocumentsCtrl.SetDocuments(documents);
}
}
catch (err) {
}
}
/*
通过作者搜索相关文档,显示在文档窗口中。注:目前没有将作者进行分隔,这样会有缺陷。
*/
function SearchByAuthor() {
var author = textAuthor.value;
if (author == null || author == “”)
return false;
//
try {
author = author.replace(/\‘/g, “””);
var sql = “document_author like ‘%” + author + “%’”;
var documents = objDatabase.DocumentsFromSQL(sql);
if (documents != null) {
objWindow.DocumentsCtrl.SetDocuments(documents);
}
}
catch (err) {
}
}
//
/*
星标功能。我们将星标数据保存到文档的参数里面,如下面的getDocRate和setDocRate方法。
文档参数可以有任意数量,可以和服务器进行同步。
*/
//
function getDocRate() {
var rateval = objDoc.ParamValue(“Rate”);
if (rateval == null || rateval == “”)
return 0;
//
return parseInt(rateval);
}
function setDocRate(rateval) {
objDoc.ParamValue(“Rate”) = “” + rateval;
}
//
var imgRateArray = [rate1, rate2, rate3, rate4, rate5];
var imgRateSrc1 = ’start1.gif’;
var imgRateSrc2 = ’start2.gif’;
//
function onRateImageClick() {
setDocRate(window.event.srcElement._num + 1);
}
//
function onRateImageMouseOver() {
var elem = window.event.srcElement;
//
for (var j = 0; j < imgRateArray.length; j++) {
if (j <= elem._num) {
imgRateArray[j].src = imgRateSrc2;
} else {
imgRateArray[j].src = imgRateSrc1;
}
}
}
//
for (var i = 0; i < imgRateArray.length; i++) {
imgRateArray[i]._num = i;
imgRateArray[i].onclick = onRateImageClick;
imgRateArray[i].onmouseover = onRateImageMouseOver;
imgRateArray[i].onmouseout = resetRate;
}
//
function resetRate() {
var imgnum = getDocRate();
for (n = 0; n < imgRateArray.length; n++) {
imgRateArray[n].src = imgRateSrc1;
}
for (n = 0; n < imgnum; n++) {
imgRateArray[n].src = imgRateSrc2;
}
}
//
resetRate();
</script>
|
其中打星标的功能,是从网上搜索的,就不再描述了。这个html文件展示了插件对话框或者下拉框,如何和Wiz进行交互,获得Wiz的一些内部接口。
2、给文档中出现的关键字,作者,标签增加链接,在用户点击后,列出相应的文档供用户浏览。
首先,还是打开km.js,有以下的代码:
下面是html高亮关键字的代码,从网上搜索来的。
/*
文档关键字高亮代码
*/
var KMHighlighter = function(colors) {
this.colors = colors;
if (this.colors == null) {
//默认颜色
this.colors = ['#ffff00,#000000', '#dae9d1,#000000', '#eabcf4,#000000',
'#c8e5ef,#000000', '#f3e3cb, #000000', '#e7cfe0,#000000',
'#c5d1f1,#000000', '#deeee4, #000000', '#b55ed2,#000000',
'#dcb7a0,#333333', '#7983ab,#000000', '#6894b5, #000000'];
}
}
KMHighlighter.prototype.highlight = function(doc, node, keywords, callback) {
if (!keywords || !node || !node.nodeType || node.nodeType != 1)
return;
keywords = this.parsewords(keywords);
if (keywords == null)
return;
//
var text = node.innerText;
//
for (var i = 0; i < keywords.length; i++) {
if (-1 == text.indexOf(keywords[i].word))
continue;
this.colorword(doc, node, keywords[i], callback);
}
}
KMHighlighter.prototype.colorword = function(doc, node, keyword, callback) {
if (node.childNodes == undefined)
return false;
//
if (node.name == “wizKMHighlighterSpan”)
return false;
//
for (var i = 0; i < node.childNodes.length; i++) {
var childNode = node.childNodes[i];
if (childNode.nodeType == 3) {
//childNode is #text
var re = new RegExp(keyword.word, ‘i’);
if (childNode.data.search(re) == -1)
continue;
//
re = new RegExp(‘(‘ + keyword.word + ‘)’, ‘i’);
var forkNode = doc.createElement(’span’);
forkNode.innerHTML = childNode.data.replace(re, ‘<span name=”wizKMHighlighterSpan” style=”background-color:’ + keyword.bgColor + ‘;color:’ + keyword.foreColor + ‘; cursor:hand; border-bottom: 1px #00c dashed;”>$1</span>’);
node.replaceChild(forkNode, childNode);
//
for (var i = 0; i < forkNode.childNodes.length; i++) {
var elem = forkNode.childNodes[i];
if (elem.name == “wizKMHighlighterSpan”) {
elem.attachEvent(“onclick”, callback);
}
}
//
return true;
}
else if (childNode.nodeType == 1) {
//childNode is element
if (this.colorword(doc, childNode, keyword, callback))
return true;
}
}
return false;
}
KMHighlighter.prototype.parsewords = function(keywords) {
var results = [];
for (var i = 0; i < keywords.length; i++) {
var keyword = {};
var color = this.colors[i % this.colors.length].split(‘,’);
keyword.word = keywords[i];
keyword.bgColor = color[0];
keyword.foreColor = color[1];
results.push(keyword);
}
return results;
}
KMHighlighter.prototype.sort = function(list) {
list.sort(function(e1, e2) {
return e1.length < e2.length;
});
}
|
获得Wiz所有的标签,关键字,作者数据。这些数据,有的可以直接通过Wiz对象获得,有的需要直接查询数据库。Wiz数据库对象,提供了一个简单的SQL查询功能,可以通过下面的代码看到。
/*
获得所有的标签名称数组
*/
function KMGetAllTagsNameArray() {
var objKMTags = objDatabase.Tags;
var ret = [];
for (var i = 0; i < objKMTags.Count; i++) {
ret.push(objKMTags.Item(i).Name);
}
//
return ret;
}
/*
获得所有的关键字数组。
首先从数据库查询所有的关键字,然后分割成关键字数组,分隔符为,;,;
*/
function KMGetAllKeywordsArray() {
var objRowset = objDatabase.SQLQuery(“select distinct document_keywords from wiz_document”, “”);
//objKMTags
var objMap = {};
while (!objRowset.EOF) {
var text = objRowset.GetFieldValue(0);
text = text.replace(“;”, “,”);
text = text.replace(“,”, “,”);
text = text.replace(“;”, “,”);
var arr = text.split(‘,’);
//
for (var i = 0; i < arr.length; i++) {
var keyword = arr[i];
objMap[ keyword ] = keyword;
}
objRowset.MoveNext();
}
var ret = [];
for (var keyword in objMap) {
ret.push(keyword);
}
//
return ret;
}
/*
同样,获得所有的作者
*/
function KMGetAllAuthorArray() {
var objRowset = objDatabase.SQLQuery(“select distinct document_author from wiz_document”, “”);
//objKMTags
var objMap = {};
while (!objRowset.EOF) {
var text = objRowset.GetFieldValue(0);
text = text.replace(“;”, “,”);
text = text.replace(“,”, “,”);
text = text.replace(“;”, “,”);
var arr = text.split(‘,’);
//
for (var i = 0; i < arr.length; i++) {
var author = arr[i];
objMap[author] = author;
}
objRowset.MoveNext();
}
var ret = [];
for (var author in objMap) {
ret.push(author);
}
//
return ret;
}
/*
点击关键字,标签,或者作者的时候,显示一个下拉列表窗口,列出相关的文档
*/
function KMShowListWindow(type) {
var doc = objWindow.CurrentDocumentHtmlDocument;
if (!doc)
return false;
//
var e = doc.parentWindow.event;
if (!e)
return false;
//
var elem = e.srcElement;
if (!elem)
return false;
var text = elem.innerText;
if (text == null || text == “”)
return false;
//
var pluginpath = objApp.GetPluginPathByScriptFileName(“km.js”);
var url = pluginpath + “listdocuments.htm?type=” + type + “&text=” + text;
objWindow.ShowSelectorWindow(url, e.screenX, e.screenY, 350, 200, “”);
}
/*
标签
*/
function KMTagWordSpanOnClick() {
KMShowListWindow(“tag”);
}
/*
关键字
*/
function KMKeywordSpanOnClick() {
KMShowListWindow(“keyword”);
}
/*
作者
*/
function KMAuthorSpanOnClick() {
KMShowListWindow(“author”);
} |
在Wiz中阅读文档的时候,高亮标签,关键字,作者等信息:
下面的代码中,展示了如何响应Wiz内部的一些消息。
/*
文档显示完成的时候,高亮显示标签,关键字或者作者
*/
function KMOnHtmlDocumentComplete(doc) {
var hl = new KMHighlighter();
hl.highlight(doc, doc.body, KMGetAllTagsNameArray(), KMTagWordSpanOnClick);
hl.highlight(doc, doc.body, KMGetAllKeywordsArray(), KMKeywordSpanOnClick);
hl.highlight(doc, doc.body, KMGetAllAuthorArray(), KMAuthorSpanOnClick);
}
/*
向Wiz注册一个事件,响应文档完成的消息。在Wiz内打开一个html文件的时候(例如阅读文档),如果Html文件打开完成,则调用这个方法。
*/
eventsHtmlDocumentComplete.add(KMOnHtmlDocumentComplete);
|
在上面的代码中,实现了标签,关键字和作者的高亮。当用户点击一个链接的时候,显示一个下拉窗口,该窗口内容就是listdocument.htm这个文件,参数通过url传递:listdocument.htm?type=tag&text=xxx
listdocument.htm文件内容:
这个html文件,通过查询相关的文档,并且显示文档列表,让用户进行选择。
下面的脚本,就展示了如果通过关键字,标签或者作者文字,查询相关的文档,并且在Wiz里面打开相应的文档。
/*
获得url的参数
*/
function getQueryString(name) {
if (location.href.indexOf(“?”) == -1 || location.href.indexOf(name + ‘=’) == -1) {
return ”;
}
var queryString = location.href.substring(location.href.indexOf(“?”) + 1);
var parameters = queryString.split(“&”);
var pos, paraName, paraValue;
for (var i = 0; i < parameters.length; i++) {
pos = parameters[i].indexOf(‘=’);
if (pos == -1) { continue; }
paraName = parameters[i].substring(0, pos);
paraValue = parameters[i].substring(pos + 1);
if (paraName == name) {
return unescape(paraValue.replace(/\+/g, ” “));
}
}
return ”;
};
var WizExplorerApp = window.external;
//
var objApp = WizExplorerApp;
var objDatabase = objApp.Database;
var objWindow = objApp.Window;
//
var text = getQueryString(“text”); //正在高亮的文字
var type = getQueryString(“type”); //文字类型,应该是keyword, tag或者author
if (text != null && text != “” && type != null && type != “”)
{
var documents = null;
if (type == “tag”) {
//通过标签获得文档
var objTag = null;
try {
objTag = objDatabase.GetTagByName(text, false, “”);
}
catch (err) {
}
//
if (objTag) {
var objTags = objApp.CreateWizObject(“WizKMCore.WizTagCollection”);
objTags.Add(objTag);
documents = objDatabase.DocumentsFromTags(objTags);
}
}
else if (type == “keyword”) {
//通过关键字获得文档
try {
text = text.replace(/\‘/g, “””);
var sql = “document_keywords like ‘%” + text + “%’”;
documents = objDatabase.DocumentsFromSQL(sql);
}
catch (err) {
}
}
else if (type == “author”) {
//通过作者获得文档
try {
text = text.replace(/\‘/g, “””);
var sql = “document_author like ‘%” + text + “%’”;
documents = objDatabase.DocumentsFromSQL(sql);
}
catch (err) {
}
}
//
if (documents != null) {
//列出文档
var htmltext = “<li><a href=\”javascript:void(0);\” onclick=\”openDocumentByGUID(‘%guid%’);\”>%title%</a></li>”;
//
for (var i = 0; i < documents.Count; i++) {
var doc = documents.Item(i);
var line = htmltext;
line = line.replace(“%guid%”, doc.GUID);
line = line.replace(“%title%”, doc.Title);
document.write(line);
}
//
}
if (documents == null || documents.Count == 0) {
//如果文档结果为空,或者没有文档,显示一个消息
var pluginPath = objApp.GetPluginPathByScriptFileName(“km.js”);
var languangeFileName = pluginPath + “plugin.ini”;
var str = objApp.LoadStringFromFile(languangeFileName, “strNoDocuments”);
var strType = objApp.LoadStringFromFile(languangeFileName, type);
var msg = str.replace(“%1″, strType) + “<br /><strong>” + text + “</strong>”;
document.write(msg);
}
}
//
function openDocumentByGUID(guid) {
//通过文档guid显示文档
var doc = null;
try {
doc = objDatabase.DocumentFromGUID(guid);
}
catch (err) {
}
//
if (!doc)
return;
//
//在Wiz里面打开这个文档。第二个参数表示在新窗口打开
objWindow.ViewDocument(doc, true);
} |
注意:使用该插件前,先把“标签转化为链接”插件删除。
方法:找到我的文档\My Knowledge文件夹(或者您自己的数据存储文件夹),找到plugins\{8CA209A1-EE63-4e39-B25A-8DCCD7708138}这个文件夹,然后删除里面的所有的文件。
下次更新,将会增强星标的功能,标签云等功能
请下载附件列表里面的文件安装使用。
安装版本可以直接双击wizplugin文件安装,绿色版本可以将wizplugin文件拖放到wiz窗口上面安装。
评论 (0)
Trackbacks (0)
发表评论
Trackback
最近评论