本文目錄一覽:
- 1、壓縮後的JS代碼怎樣解壓縮?
- 2、iis。關於js調用並打開伺服器上的word文檔
- 3、jszip.js遠程讀取一個zip文件
- 4、js 如何讀取xml文檔內容
- 5、JQuery,JS 讀取遠程伺服器的txt文件內容
- 6、nodejs實現一個word文檔解析器思路詳解
壓縮後的JS代碼怎樣解壓縮?
一般壓縮都經過混淆,如果你看到變數名都是A,B,C,D之類的無規則的命名,那就是被混淆過的,一般來說也很難閱讀,就算你 還原了格式。
如果是沒有混淆的,你可以試試用js的格式化工具來重新格式化一下的,比如:
/* 美化:格式化代碼,使之容易閱讀 */
/* 凈化:去掉代碼中多餘的注釋、換行、空格等 */
/* 壓縮:將代碼壓縮為更小體積,便於傳輸 */
/* 解壓:將壓縮後的代碼轉換為人可以閱讀的格式 */
/* 混淆:將代碼的中變數名簡短化以減小體積,但可讀性差,經混淆後的代碼無法還原 */
/* 如果有用,請別忘了推薦給你的朋友: */
/* javascript在線美化、凈化、壓縮、解壓: */
/* 以下是演示代碼 */
var Inote = {};
Inote.JSTool = function(options) {
this.options = options || {};
};
Inote.JSTool.prototype = {
_name: ‘Javascript工具’,
_history: {
‘v1.0’: [‘2011-01-18’, ‘javascript工具上線’],
‘v1.1’: [‘2012-03-23’, ‘增加混淆功能’],
‘v1.2’: [‘2012-07-21’, ‘升級美化功能引擎’],
‘v1.3’: [‘2014-03-01’, ‘升級解密功能,支持eval,window.eval,window[“eval”]等的解密’],
‘v1.4’: [‘2014-08-05’, ‘升級混淆功能引擎’],
‘v1.5’: [‘2014-08-09’, ‘升級js壓縮引擎’],
‘v1.6’: [‘2015-04-11’, ‘升級js混淆引擎’]
},
options: {},
getName: function() {return this._name;},
getHistory: function() {
return this._history;}
};
var jstool = new Inote.JSTool();
iis。關於js調用並打開伺服器上的word文檔
1、word的打開是獨佔的,你不能同時對一個程序多次打開,所以理論上你的程序只能一個人用
2、這也不是js能做得了得,js控制不了伺服器端
jszip.js遠程讀取一個zip文件
項目用到了jszip.js插件,用於在後台獲取zip文件,前端解壓並將模型進行在線顯示.
官網
jszip的API說明為英文,例子其實也有些模糊.
遠程載入一個文件, 使用官網的例子 :(自行觀看);
這裡作為筆記,主要是想說
promise.then(JSZip.loadAsync)
.then(function( zip ){returnzip.file(“Hello.txt”).async(“string”);
此處可以返回一個值,返回的值就是下一個.then的實參
})
這裡的zip就是讀取到的zip的數據,主要的屬性諸如files就是zip中的文件,可以通過zip.file(filename)的形式將該文件對象進行存儲,但是這裡的文件對象其實是一個promise,當我們需要使用的時候可以通過.then 的形式使用
例如: pic.then(function(data){
//data就是該文件的數據,得到data後可以通過使用,這裡就需要注意我們在存儲的時候可以通過使用zip.file(filename).async(數據形式)來定義數據的存儲形式,例如base64,blob,arraybuffer,其中base64是圖片的存儲格式,但是是沒有前綴的,必須加相應的前綴才可以顯示.data:image/png;base64;就可以直接賦值給image.src;
})
js 如何讀取xml文檔內容
先判斷瀏覽器,然後讀取xml數據就可以了
//判斷不同的瀏覽器
function InitMf()
{
var mf_change=false;
try {
mf_change = new ActiveXObject(“Msxml2.XMLHTTP”);
} catch (e) {
try {
mf_change = new ActiveXObject(“Microsoft.XMLHTTP”);
} catch (E) {
mf_change = false;
}
}
if (!mf_change typeof XMLHttpRequest!=’undefined’) {
mf_change = new XMLHttpRequest();
}
return mf_change;
}
讀取數據
var xmlHttp = InitMf();
var HTML = “”;
//獲得xml文件
xmlHttp.open(“GET”, xmlfile+”?”+Math.random(), true);
// 設置處理伺服器的JS函數,函數又 xmlHttp.onreadystatechange來確定
xmlHttp.onreadystatechange=function() {
//alert(xmlHttp.status);
if (xmlHttp.readyState==4 xmlHttp.status==200) {
//ajax的XML傳輸的解析。獲取解析的數據
var xml = xmlHttp.responseXML;
var node = xml.getElementsByTagName(“item”);//獲得總結點
for(var i = 0 ; i node.length ; i++){
var str_t = “”;
var str_d = “”;
var menuHTML = “”;
var elem = node[i];
//下面開始獲得子節點數據,當然可以繼續循環,獲得更下面的節點
var title = elem.getElementsByTagName(“title”)[0].textContent != undefined ? elem.getElementsByTagName(“title”)[0].textContent : elem.getElementsByTagName(“title”)[0].text;
這些只是部分代碼,不過已經足夠了
JQuery,JS 讀取遠程伺服器的txt文件內容
注意幾點:
1 一個是埠號,注意你自己設置的是哪個埠號
2 第二個是要保證txt格式中的文件是json格式 ,不然會沒有返回值。
3 不要在本地直接打開 ,放在本地伺服器上,apache之類的
nodejs實現一個word文檔解析器思路詳解
之前項目里遇到一個需求,需要前端上傳一個word文檔,然後後端提取出該文檔的指定位置的內容並保存。這裡後端用的是nodejs,開始接到這個需求,發現無從下手,主要是沒有處理過word這種類型的文檔,怎麼解析?
Excel倒是有相關的庫可以用,而且很簡單
思路
搜索了好一會兒,在npm上發現了一個叫做
adm-zip
的包,這個包可以解壓縮word文檔,原來word文檔也是可以解壓縮的,之前一直不知道,通過如下代碼就可以將word文檔解壓縮,並進一步提取內容
var
admZip
=
require(‘adm-zip’);
const
zip
=
new
admZip(‘test.docx’);
//將該docx解壓到指定文件夾result下
zip.extractAllTo(“./result”,
/*overwrite*/true);
首先我們新建一個docx文檔,內容如下
然後運行上述代碼進行解壓縮,得到如下的文件,由下圖可以看出生成了好幾個文件夾,word的內容其實是在word文件夾里的document.xml文件內(這裡解壓縮後其實源文件還在,並沒有消失)
進入word文件夾後的內容
我們繼續打開document.xml文件來一探究竟裡面到底是啥?注意要用瀏覽器直接打開,如果用ide打開顯示出的所有內容都在一行,無法閱讀!
上圖只是word文檔的一部分,會發現word文檔內看著只有幾段文字,但是xml中卻是長篇大論,仔細分析下也很正常,xml全稱可擴展標記語言,其被設計為傳輸和存儲數據,它僅僅是一個純文本的表示,而word中內容格式千變萬化,肯定需要一種方法來有效描述這些內容的格式,因此採用了xml來描述
我們嘗試一下將
測試文檔
四個字加粗變色傾斜字體,如下圖
然後再進行解壓縮,得到docuemnt.xml並查看對應的內容,如下
這就很明顯了,
w:b/
表示文字加粗,
w:i/
表示文字傾斜,
w:color
表示文字的顏色,所以這麼4個字就需要這幾行xml來描述,因此長篇大論的xml也就不足為奇
提取內容
上面說到了xml僅僅是一個文本的表示,我們可以用如下代碼讀取整個xml的內容,結果是一個
string
var
contentXml
=
zip.readAsText(“word/document.xml”);
接下來是重點,如何提取我們想要的內容呢,答案是正則表達式,首先我們得分析一下word文檔的結構,word文檔其實是由叫做
Paragraph
的段落所構成,在vb中可以很輕鬆的獲取並修改段落,官網傳送門點此
那麼到底怎麼樣才是一個
Paragraph
呢,其實很簡單,仔細觀察word文檔,見到下圖中的小箭頭了么,每個小箭頭前面的內容就是一個段落,那麼下圖中一共有16個
Paragraph
,當然有些段落是空的,沒有任何內容
我們再來研究xml的結構,收起展開的xml,如下圖,發現
w:p/w:p
這麼個標籤就是表示的一個段落,中間還有些
w:p
藏在表格內,這麼一看錶格前面3個段落,後面3個段落,和上圖是對應的
因此,
我們就可以提取出每個段落的文本並返回一個數組,每一項就是一個段落的內容
,這樣就能夠完整的解析出整個word的內容,關鍵在於如何提取每個
w:p
的內容,我們繼續展開一個
w:p
進行觀察,如下圖,發現內容雖多,其實文本都保存在
w:t
中間,因此思路就清晰了,
首先用正則表達式提取出所有w:p的內容,再針對每個w:p的內容,進行進一步正則提取,提取出其裡面所有w:t的內容,並拼接在一起構成一個段落的總內容
具體代碼
下面是具體的提取代碼
//參數是word文件名,第二個參數是回調錶示解析完成
var
parser
=
function
parseWordDocument(absoluteWordPath,callback){
//返回內容的數組
var
resultList
=
[];
//如果文件存在
fs.exists(absoluteWordPath,
function(exists){
if(exists){
//解壓縮
const
zip
=
new
admZip(absoluteWordPath);
//將document.xml(解壓縮後得到的文件)讀取為text內容
var
contentXml
=
zip.readAsText(“word/document.xml”);
//正則匹配出對應的w:p裡面的內容,方法是先匹配w:p,再匹配裡面的w:t,將匹配到的加起來即可
//注意?表示非貪婪模式(儘可能少匹配字元),否則只能匹配到一個w:p/w:p
var
matchedWP
=
contentXml.match(/w:p.*?.*?\/w:p/gi);
//繼續匹配每個w:p/w:p裡面的w:t,這裡必須判斷matchedWP存在否則報錯
if(matchedWP){
matchedWP.forEach(function(wpItem){
//注意這裡w:t的匹配,有可能是w:t
xml:space=”preserve”這種格式,需要特殊處理
var
matchedWT
=
wpItem.match(/(w:t.*?\/w:t)|(w:t\s.[^]*?.*?\/w:t)/gi);
var
textContent
=
”;
if(matchedWT){
matchedWT.forEach(function(wtItem){
//如果不是w:t
xml:space=”preserve”格式
if(wtItem.indexOf(‘xml:space’)===-1){
textContent+=wtItem.slice(5,-6);
}else{
textContent+=wtItem.slice(26,-6);
}
});
resultList.push(textContent)
}
});
//解析完成
callback(resultList)
}
}else{
callback(resultList)
}
});
};
注意一下如果段落前有空格,那麼
w:t
的格式是不同的,如下,多了這個space描述,所以需要特殊處理
代碼量其實很少,關鍵在於正則的編寫,上述docx文檔提取後的輸出結果如下
最後我把這個工具寫成了一個npm包,地址點這裡
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/154858.html