項目突然經update後就不能build了。鬱悶。
問了老大,說是==
於是無聊的我看了http://www.cnblogs.com/sanshi的部落格
覺得cnblogs這個blog不錯。。。。
希望csdn能後繼續努力。
在http://www.cnblogs.com/sanshi上發現了html beauty。下來自己研究了下。。。
研究了一半,老大說要安裝新的server。。。。
等中午吃飯的時候再看下。。。。
具體代碼如下。還是比較簡單。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>自己實現HTML-Beautify</title>
<script src="jquery-1.3.2.js" type="text/javascript"></script>
<script type="text/javascript">
見 <body>
</script>
</head>
<body>
<h1>
自己實現HTML-Beautify</h1>
<textarea style="width: 600px; height: 300px;" id="content">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head><title>Untitled Page</title></head><body><h1>Page Header</h1><ul><li>list item 1</li><li>list item 2</li><li>list item 3</li><li>list item 4</li></ul></body></html>
</textarea>
<br />
<input type="button" id="format" value="Format" />
<br />
<br />
學習HTML-Beautify.js之後,我們發現使用JavaScript對HTML進行解析也並不神秘, 首先是逐字元進行分析,從中提取標記(Token),在HTML只存在兩種類型的標記-標籤和本文,
然後對這些Token進行文法分析,主要是縮排量是多少。
<br />
在有這些基本概念後,今天我們就自己來實現這個小程式:
<pre>
// 我在Html Beautifier的一個簡單嘗試
function HtmlBeautify(source, indent_value) {
this.source = source;
this.indent_value = indent_value;
this.result = "";
this.parse();
}
// 分析併產生輸出到this.result
HtmlBeautify.prototype.parse = function() {
var that = this;
// 當前分析到哪個字元,當前標記值,標記類型,輸出數組,縮排層級
var pos = 0, token_value = "", token_type = "",
output = [], indent_level = 0;
// 把這些標籤作為Single Tag
var single_token = "br,input,link,meta,!doctype,basefont,base,area,hr,wbr,param,img,isindex,?xml,embed".split(',');
// 輸出當前標記(換行+縮排量+標記值)
function outputToken() {
output.push("/n");
for (var i = 0; i < indent_level; i++) {
output.push(that.indent_value);
}
output.push(token_value);
}
// 擷取下一個標記(首先擷取本文,如果本文為空白則擷取標籤)
function nextToken() {
var token_value_array = [], val = "";
// "<"之前的所有內容作為本文標籤
while ((val = that.source[pos]) !== "<") {
if (pos >= that.source.length) {
token_type = "END";
return;
}
token_value_array.push(val);
pos++;
}
token_value = $.trim(token_value_array.join(""));
if (token_value === "") {
// 如果本文標記為空白,則擷取標籤標記
nextTokenTag();
} else {
token_type = "CONTENT";
}
}
function nextTokenTag() {
var token_value_array = [], val = "", tagName = "";
// 擷取標籤標記,直到遇到">"
do {
val = that.source[pos];
token_value_array.push(val);
pos++;
} while (val !== ">");
token_value = $.trim(token_value_array.join(""));
// 當前標籤的名稱(小寫)
tagName = getTagName();
if (token_value[1] === "/") {
// token_value以"</"開始,則認為是結束標籤
token_type = "END_TAG";
} else if (contains(tagName, single_token) || token_value[token_value.length - 2] === "/") {
// 如果標籤在single_token或者token_value以"/>"結尾,則認為是獨立標籤
// 這種判斷沒有考慮這種情況:"<br></br>"
token_type = "SINGLE_TAG";
} else {
token_type = "START_TAG";
}
}
function getTagName() {
var tagName = token_value.substr(1, token_value.length - 2);
var spaceIndex = tagName.indexOf(" ");
if (spaceIndex > 0) {
tagName = tagName.substr(0, spaceIndex);
}
return tagName.toLowerCase();
}
function contains(val, array) {
for (var i = 0; i < array.length; i++) {
if (val === array[i]) {
return true;
}
}
return false;
}
// parse的主體函數,迴圈擷取下一個Token
while (true) {
nextToken();
// 當前Token為結束標記
if (token_type === "END") {
break;
}
switch (token_type) {
case "START_TAG":
// 我們對縮排的控制非常簡單,開始標籤後縮排一個單位
outputToken();
indent_level++;
break;
case "END_TAG":
// 結束標籤前減少一個單位縮排
indent_level--;
outputToken();
break;
case "SINGLE_TAG":
case "CONTENT":
outputToken();
break;
}
}
// 去除最前面的"/n"
this.result = output.join("").substr(1);
};
$(function() {
$("#format").click(function() {
// 執行個體化HtmlBeautify,傳遞需要解析的HTML片段和縮排字串
var beautify = new HtmlBeautify($("#content").val(), " ");
$("#content").val(beautify.result);
});
});
</pre>
</body>
</html>