common.js
20.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
// -------------------------- 通用常量
import {constStrEnum,EnumDocLandMode} from "./enum"
var wps = window.wps||window
//OA门户网站用接口,配置默认服务器接口
var OA_DOOR = {
templateDataUrl: undefined, //正文模板列表接口
templateBaseURL: undefined, //指定正文模板基础接口
redHeadsPath: undefined, //默认红头模板列表获取路径
getRedHeadPath: undefined, //默认获取红头文件路径
bookmarkPath: undefined, //书签列表接口
redHeadsPath: undefined, //默认红头模板列表获取路径
}
// -------------------------- 通用方法 ---------------------------
//去除字符串左边空格
String.prototype.ltrim = function () {
return this.replace(/(^\s*)/g, "");
}
//去除字符串右边空格
String.prototype.rtrim = function () {
return this.replace(/(\s*$)/g, "");
}
//扩展js string endwith,startwith方法
String.prototype.endWith = function (str) {
if (str == null || str == "" || this.length == 0 || str.length > this.length)
return false;
if (this.substring(this.length - str.length) == str)
return true;
else
return false;
}
String.prototype.startWith = function (str) {
if (str == null || str == "" || this.length == 0 || str.length > this.length)
return false;
if (this.substr(0, str.length) == str)
return true;
else
return false;
}
//UTF-16转UTF-8
function utf16ToUtf8(s) {
if (!s) {
return;
}
var i, code, ret = [],
len = s.length;
for (i = 0; i < len; i++) {
code = s.charCodeAt(i);
if (code > 0x0 && code <= 0x7f) {
//单字节
//UTF-16 0000 - 007F
//UTF-8 0xxxxxxx
ret.push(s.charAt(i));
} else if (code >= 0x80 && code <= 0x7ff) {
//双字节
//UTF-16 0080 - 07FF
//UTF-8 110xxxxx 10xxxxxx
ret.push(
//110xxxxx
String.fromCharCode(0xc0 | ((code >> 6) & 0x1f)),
//10xxxxxx
String.fromCharCode(0x80 | (code & 0x3f))
);
} else if (code >= 0x800 && code <= 0xffff) {
//三字节
//UTF-16 0800 - FFFF
//UTF-8 1110xxxx 10xxxxxx 10xxxxxx
ret.push(
//1110xxxx
String.fromCharCode(0xe0 | ((code >> 12) & 0xf)),
//10xxxxxx
String.fromCharCode(0x80 | ((code >> 6) & 0x3f)),
//10xxxxxx
String.fromCharCode(0x80 | (code & 0x3f))
);
}
}
return ret.join('');
}
var Base64 = {
_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
encode: function(e) {
var t = "";
var n, r, i, s, o, u, a;
var f = 0;
e = Base64._utf8_encode(e);
while (f < e.length) {
n = e.charCodeAt(f++);
r = e.charCodeAt(f++);
i = e.charCodeAt(f++);
s = n >> 2;
o = (n & 3) << 4 | r >> 4;
u = (r & 15) << 2 | i >> 6;
a = i & 63;
if (isNaN(r)) {
u = a = 64
} else if (isNaN(i)) {
a = 64
}
t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)
}
return t
},
decode: function(e) {
var t = "";
var n, r, i;
var s, o, u, a;
var f = 0;
e = e.replace(/[^A-Za-z0-9+/=]/g, "");
while (f < e.length) {
s = this._keyStr.indexOf(e.charAt(f++));
o = this._keyStr.indexOf(e.charAt(f++));
u = this._keyStr.indexOf(e.charAt(f++));
a = this._keyStr.indexOf(e.charAt(f++));
n = s << 2 | o >> 4;
r = (o & 15) << 4 | u >> 2;
i = (u & 3) << 6 | a;
t = t + String.fromCharCode(n);
if (u != 64) {
t = t + String.fromCharCode(r)
}
if (a != 64) {
t = t + String.fromCharCode(i)
}
}
t = Base64._utf8_decode(t);
return t
},
_utf8_encode: function(e) {
e = e.replace(/rn/g, "n");
var t = "";
for (var n = 0; n < e.length; n++) {
var r = e.charCodeAt(n);
if (r < 128) {
t += String.fromCharCode(r)
} else if (r > 127 && r < 2048) {
t += String.fromCharCode(r >> 6 | 192);
t += String.fromCharCode(r & 63 | 128)
} else {
t += String.fromCharCode(r >> 12 | 224);
t += String.fromCharCode(r >> 6 & 63 | 128);
t += String.fromCharCode(r & 63 | 128)
}
}
return t
},
_utf8_decode: function(e) {
var t = "";
var n = 0;
let c1,c2,c3;
var r = c1 = c2 = 0;
while (n < e.length) {
r = e.charCodeAt(n);
if (r < 128) {
t += String.fromCharCode(r);
n++
} else if (r > 191 && r < 224) {
c2 = e.charCodeAt(n + 1);
t += String.fromCharCode((r & 31) << 6 | c2 & 63);
n += 2
} else {
c2 = e.charCodeAt(n + 1);
c3 = e.charCodeAt(n + 2);
t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
n += 3
}
}
return t
}
}
//UTF-8转UTF-16
function utf8ToUtf16(s) {
if (!s) {
return;
}
var i, codes, bytes, ret = [],
len = s.length;
for (i = 0; i < len; i++) {
codes = [];
codes.push(s.charCodeAt(i));
if (((codes[0] >> 7) & 0xff) == 0x0) {
//单字节 0xxxxxxx
ret.push(s.charAt(i));
} else if (((codes[0] >> 5) & 0xff) == 0x6) {
//双字节 110xxxxx 10xxxxxx
codes.push(s.charCodeAt(++i));
bytes = [];
bytes.push(codes[0] & 0x1f);
bytes.push(codes[1] & 0x3f);
ret.push(String.fromCharCode((bytes[0] << 6) | bytes[1]));
} else if (((codes[0] >> 4) & 0xff) == 0xe) {
//三字节 1110xxxx 10xxxxxx 10xxxxxx
codes.push(s.charCodeAt(++i));
codes.push(s.charCodeAt(++i));
bytes = [];
bytes.push((codes[0] << 4) | ((codes[1] >> 2) & 0xf));
bytes.push(((codes[1] & 0x3) << 6) | (codes[2] & 0x3f));
ret.push(String.fromCharCode((bytes[0] << 8) | bytes[1]));
}
}
return ret.join('');
}
function currentTime() {
var now = new Date();
var year = now.getFullYear(); //年
var month = now.getMonth() + 1; //月
var day = now.getDate(); //日
var hh = now.getHours(); //时
var mm = now.getMinutes(); //分
var clock = year + "年";
if (month < 10)
clock += "0";
clock += month + "月";
if (day < 10)
clock += "0";
clock += day + "日";
if (hh < 10)
clock += "0";
clock += hh + ":";
if (mm < 10) clock += '0';
clock += mm;
return (clock);
}
/**
* 获取文件路径
* @param {*} html 文件全称
*/
function getHtmlURL(html) {
//弹出辅助窗格框
var GetUrlPath = ()=> {
var e = document.location.toString();
return -1 != (e = decodeURI(e)).indexOf("/") && (e = e.substring(0, e.lastIndexOf("/"))), e
}
var url = GetUrlPath();
if (url.length != 0) {
url = url.concat("/" + html);
} else {
url = url.concat("./" + html);
}
return url;
}
/**
* wps内弹出web页面
* @param {*} html 文件名
* @param {*} title 窗口标题
* @param {*} hight 窗口高
* @param {*} width 窗口宽
*/
export function OnShowDialog(html, title, height, width, bModal) {
var l_ActiveDoc = wps.WpsApplication().ActiveDocument;
if (!l_ActiveDoc) {
alert("WPS当前没有可操作文档!")
return;
}
if (typeof bModal == "undefined" || bModal == null) {
bModal = true;
}
width *= window.devicePixelRatio;
height *= window.devicePixelRatio;
var url = getHtmlURL(html);
wps.ShowDialog(url, title, height, width, bModal);
}
/**
* 解析返回response的参数
* @param {*} resp
* @return {*} body
*/
function handleResultBody(resp) {
var result = "";
if (resp.Body) {
// 解析返回response的参数
}
return result;
}
/**
* 判断WPS中的文件个数是否为0,若为0则关闭WPS函数
* @param {*} name
*/
function closeWpsIfNoDocument() {
var wpsApp = wps.WpsApplication();
var docs = wpsApp.Documents;
if (!docs || docs.Count == 0) {
wps.ApiEvent.Cancel = true;
//根据业务可以选择是否退出进程 wpsApp.Quit();
}
}
export function activeTab() {
//启动WPS程序后,默认显示的工具栏选项卡为ribbon.xml中某一tab
if (wps.ribbonUI)
wps.ribbonUI.ActivateTab('wpsAddinTab');
}
// function showOATab() {
// wps.PluginStorage.setItem("ShowOATabDocActive", pCheckIfOADoc()); //根据文件是否为OA文件来显示OA菜单
// wps.ribbonUI.Invalidate(); // 刷新Ribbon自定义按钮的状态
// }
function getDemoTemplatePath() {
var url = document.location.toString();
url = decodeURI(url);
if (url.indexOf("/") != -1) {
url = url.substring(0, url.lastIndexOf("/"));
}
if (url.length !== 0)
url = url.concat("/template/红头文件.docx");
if (url.startsWith("file:///"))
url = url.substr("file:///".length);
return url;
}
function getDemoSealPath() {
var url = document.location.toString();
url = decodeURI(url);
if (url.indexOf("/") != -1) {
url = url.substring(0, url.lastIndexOf("/"));
}
if (url.length !== 0)
url = url.concat("/template/OA模板:公章.png");
if (url.startsWith("file:///"))
url = url.substr("file:///".length);
return url;
}
function pGetParamName(data, attr) {
var start = data.indexOf(attr);
data = data.substring(start + attr.length);
return data;
}
/**
* 从requst中获取文件名(确保请求中有filename这个参数)
* @param {*} request
* @param {*} url
*/
function pGetFileName(request, url) {
var disposition = request.getResponseHeader("Content-Disposition");
var filename = "";
if (disposition) {
var matchs = pGetParamName(disposition, "filename=");
if (matchs) {
filename = decodeURIComponent(matchs);
} else {
filename = "petro" + Date.getTime();
}
} else {
var filename = url.substring(url.lastIndexOf("/") + 1);
}
return filename;
}
function StringToUint8Array(string) {
var binLen, buffer, chars, i, _i;
binLen = string.length;
buffer = new ArrayBuffer(binLen);
chars = new Uint8Array(buffer);
for (var i = 0; i < binLen; ++i) {
chars[i] = String.prototype.charCodeAt.call(string, i);
}
return buffer;
}
/**
* WPS下载文件到本地打开(业务系统可根据实际情况进行修改)
* @param {*} url 文件流的下载路径
* @param {*} callback 下载后的回调
*/
export function DownloadFile(url,fileName, callback) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
//需要业务系统的服务端在传递文件流时,确保请求中的参数有filename
// var fileName = pGetFileName(xhr, url)
//落地打开模式下,WPS会将文件下载到本地的临时目录,在关闭后会进行清理
var path = wps.Env.GetTempPath() + "/" + fileName
var reader = new FileReader();
reader.onload = function () {
wps.FileSystem.writeAsBinaryString(path, reader.result);
callback(path);
};
reader.readAsBinaryString(xhr.response);
}
}
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.send();
}
/**
* WPS上传文件到服务端(业务系统可根据实际情况进行修改,为了兼容中文,服务端约定用UTF-8编码格式)
* @param {*} strFileName 上传到服务端的文件名称(包含文件后缀)
* @param {*} strPath 上传文件的文件路径(文件在操作系统的绝对路径)
* @param {*} uploadPath 上传文件的服务端地址
* @param {*} strFieldName 业务调用方自定义的一些内容可通过此字段传递,默认赋值'file'
* @param {*} OnSuccess 上传成功后的回调
* @param {*} OnFail 上传失败后的回调
*/
export function UploadFile(strFileName, strPath, uploadPath, strFieldName, params ,OnSuccess, OnFail) {
var xhr = new XMLHttpRequest();
xhr.open('POST', uploadPath);
var fileData = wps.FileSystem.readAsBinaryString(strPath);
var data = new window.FakeFormData();
if (strFieldName == "" || typeof strFieldName == "undefined"){//如果业务方没定义,默认设置为'file'
strFieldName = 'stream';
}
if(params != null && typeof params == "object"){
const {nid,pid,token,tokenIdKey} = params;
if(nid != null){
data.append("nid",nid);
data.append("reUploadNid",nid);
data.append("isReUpload",true);
}
if(pid != null){
data.append("pid",pid)
};
if(token != null) {
data.append("token",token);
if(tokenIdKey != null)
data.append(tokenIdKey,token)
else
data.append("DCI_TOKEN_ID",token);
}
}
data.append("stream", {
name: strFileName, //主要是考虑中文名的情况,服务端约定用utf-8来解码。
type: "application/octet-stream",
getAsBinary: function () {
return fileData;
}
});
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200)
OnSuccess(xhr.response)
else
OnFail(xhr.response);
}
};
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader("Accept", "*/*")
xhr.setRequestHeader("Access-Control-Allow-Origin", "*")
xhr.setRequestHeader("Access-Control-Allow-Credentials", "true")
// xhr.setRequestHeader("Accept-Encoding","gzip, deflate, br")
if (data.fake) {
xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + data.boundary);
var arr = StringToUint8Array(data.toString());
xhr.send(arr);
} else {
xhr.send(data);
}
}
// /**
// * 打开WPS后通知到业务系统,可根据需求扩展
// * @param {*} p_Url 业务方接受请求的地址
// */
// function NotifyToServer(p_Url) {
// $.ajax({
// url: p_Url, // URL + '/wps/wpsCanOpen',
// async: true,
// method: "post",
// dataType: 'json'
// });
// }
// /**
// * 更新编辑状态
// * @param {*} p_Url 要传入OA端,通知业务系统,当前文档所处的编辑状态的URL地址路径
// * @param {*} p_OpenUrl 当前文档从业务系统打开时的入口URL,这个URL包含业务系统开发者需要传入的ID等参数
// * @param {*} docId 文档id
// * @param {*} state 0-正在编辑中 1-文件保存 2-文件关闭 状态可根据需要进行自定义扩展
// */
// function UpdateEditState(p_Url, p_OpenUrl, docId, state) {
// var formData = {
// "openUrl": p_OpenUrl,
// "docId": docId,
// "state": state
// };
// $.ajax({
// url: p_Url, //URL + '/document/stateMonitor',
// async: false,
// data: formData,
// method: "post",
// dataType: 'json',
// success: function (response) {
// if (response == "success") {
// console.log(response);
// }
// },
// error: function (response) {
// console.log(response);
// }
// });
// }
// /**
// * 作用:判断文档关闭后,如果系统已经没有打开的文档了,则设置回初始用户名
// */
// function pSetWPSAppUserName() {
// //文档全部关闭的情况下,把WPS初始启动的用户名设置回去
// if (wps.WpsApplication().Documents.Count == 1) {
// var l_strUserName = wps.PluginStorage.getItem(constStrEnum.WPSInitUserName);
// wps.WpsApplication().UserName = l_strUserName;
// }
// }
/**
* 设置文档参数的属性值
* @param {*} Doc
* @param {*} Key
* @param {*} Value
*/
function SetDocParamsValue(Doc, Key, Value) {
if (!Doc || !Key) {
return;
}
var l_Params = wps.PluginStorage.getItem(Doc.DocID);
if (!l_Params) {
return;
}
var l_objParams = JSON.parse(l_Params);
if (!(typeof(l_objParams) == "undefined")) {
l_objParams[Key] = Value;
}
//把属性值整体再写回原来的文档ID中
wps.PluginStorage.setItem(Doc.DocID, JSON.stringify(l_objParams));
}
export function GetDocParamsValue(Doc, Key) {
if (!Doc) {
return "";
}
var l_Params = wps.PluginStorage.getItem(Doc.DocID);
if (!l_Params) {
return "";
}
var l_objParams = JSON.parse(l_Params);
if (typeof(l_objParams) == "undefined") {
return "";
}
var l_rtnValue = l_objParams[Key];
if (typeof(l_rtnValue) == "undefined" || l_rtnValue == null) {
return "";
}
return l_rtnValue;
}
function pIsOnlineOADoc(doc) {
var l_LandMode = GetDocParamsValue(doc, constStrEnum.OADocLandMode); //获取文档落地模式
if (l_LandMode == "") { //用户本地打开的文档
return false;
}
return l_LandMode == EnumDocLandMode.DLM_OnlineDoc;
}
export function OnUploadToServerSuccess (info){
if(info == undefined || info.length == 0) {
alert("请求处理失败!请检查是否允许跨域!")
}
if(info != null){
if(typeof info === "string"){
info = JSON.parse(info);
}
if(typeof info === "object"){
if(info.code == 0 && info.success){
alert(info.message || "上传成功!");
return;
}
}
}
alert(info && info.message || info || "上传失败!");
}
export function OnUploadToServerFail (info){
if(info == undefined || info.length == 0) {
alert("请求处理失败!请检查是否允许跨域!")
}
if( typeof info === "string"){
info = JSON.parse(info);
}
alert(info && info.message || info || "上传失败!");
}
function pInsertRInedHead(doc, strFile, bookmark) {
var bookMarks = doc.Bookmarks;
if (bookMarks.Item("quanwen")) { // 当前文档存在"quanwen"书签时候表示已经套过红头
alert("当前文档已套过红头,请勿重复操作!");
return;
}
var wpsApp = wps.WpsApplication();
var activeDoc = wpsApp.ActiveDocument;
var selection = wpsApp.ActiveWindow.Selection;
// 准备以非批注的模式插入红头文件(剪切/粘贴等操作会留有痕迹,故先关闭修订)
activeDoc.TrackRevisions = false;
selection.WholeStory(); //选取全文
bookMarks.Add("quanwen", selection.Range)
selection.Cut();
selection.InsertFile(strFile);
if (bookMarks.Exists(bookmark)) {
var bookmark1 = bookMarks.Item(bookmark);
bookmark1.Range.Select(); //获取指定书签位置
var s = activeDoc.ActiveWindow.Selection;
s.Paste();
} else {
alert("套红头失败,您选择的红头模板没有对应书签:" + bookmark);
}
// 轮询插入书签
var elements = GetDocParamsValue(doc, constStrEnum.redFileElement);
if (elements != "") {
for (var key in elements) {
console.log(key + "----" + elements[key])
if (bookMarks.Exists(key)) {
// 直接插入
var eleBookmark = bookMarks.Item(key);
eleBookmark.Range.Text = elements[key];
}
}
}
// 恢复修订模式(根据传入参数决定)
var l_revisionCtrl = GetDocParamsValue(activeDoc, constStrEnum.revisionCtrl);
activeDoc.TrackRevisions = l_revisionCtrl == "" ? false : l_revisionCtrl.bOpenRevision;
//取消WPS关闭时的提示信息
wps.WpsApplication().DisplayAlerts = wps.Enum&&wps.Enum.wdAlertsNone||0;
}
/**
* 从OA-web端点击套红头
* doc : 需要存在以下属性
* 'insertFileUrl':'',获取红头模板接口
* 'bkInsertFile':'' ,正文书签
*/
export function InsertRedHeadDoc(doc) { //插入红头
if (!doc) {
alert('文档不存在!');
return;
}
var bookmark = GetDocParamsValue(doc, constStrEnum.bkInsertFile);
var strFile = GetDocParamsValue(doc, constStrEnum.insertFileUrl);
if (strFile == "") {
alert("未获取到系统传入的红头模板URL路径,不能正常套红");
return;
}
if (bookmark == "") {
alert("套红头失败,您选择的红头模板没有正文书签!");
return;
}
pInsertRInedHead(doc, strFile, bookmark)
}