個人我的網站:拓跋的前端客棧瞭解一哈,這裏是原文地址,這裏是項目地址,歡迎star&fork。若是您發現我文章中存在錯誤,請盡情向我吐槽,你們一塊兒學習一塊兒進步φ(>ω<*)javascript
最終效果請點擊 這裏 ,是否是有點意思?css
code-printer的最基本的原理是首先搭起一個骨架,而後經過遍歷的方式,一點一點地往骨架裏塞東西。前端
骨架主要有三塊:java
let printCodes = function (message, index, interval) {
if (index < message.length) {
$code_pre.scrollTop = $code_pre.scrollHeight;
printChar(message[index++]);
return setTimeout((function () {
return printCodes(message, index, interval);
}), speed);
}
};
複製代碼
這段代碼的主要做用就是遍歷打印字符,同時每次打印的時候都將滾動條拖到最底下,保證用戶能看到最新的變化。git
let printChar = function (which) {
let char, formatted_code, prior_block_match, prior_comment_match, script_tag;
if (which === "`") {
// 重置爲空字符串,防止打印出來
which = "";
isJs = !isJs;
}
if (isJs) {
if (which === "~" && !openComment) {
script_tag = createElement("script");
// two matches based on prior scenario
prior_comment_match = /(?:\*\/([^\~]*))$/;
prior_block_match = /([^~]*)$/;
if (unformatted_code.match(prior_comment_match)) {
script_tag.innerHTML = unformatted_code.match(prior_comment_match)[0].replace("*/", "") + "\n\n";
} else {
script_tag.innerHTML = unformatted_code.match(prior_block_match)[0] + "\n\n";
}
$script_area.innerHTML = "";
$script_area.appendChild(script_tag);
}
char = which;
formatted_code = jsHighlight($code_pre.innerHTML, char);
} else {
char = which === "~" ? "" : which;
$style_elem.innerHTML += char;
formatted_code = cssHighlight($code_pre.innerHTML, char);
}
prevAsterisk = which === "*";
prevSlash = (which === "/") && !openComment;
openInteger = which.match(/[0-9]/) || (openInteger && which.match(/[\.\%pxems]/)) ? true : false;
if (which === '"') {
openString = !openString;
}
unformatted_code += which;
return $code_pre.innerHTML = formatted_code;
};
複製代碼
printChar函數是code-printer的核心函數,這個函數會根據當前的代碼是JS仍是CSS,來進行不一樣的處理。github
如何判斷是JS仍是CSS代碼呢?默認設置npm
let isJs = false;
複製代碼
也就是默認是CSS,而後以 ` 做爲切換符號,每次遇到 ` 就切換一次語言。bash
當前字符屬於JS時,在沒遇到執行符號 ~ 以前,printChar只是單純的打印格式化後的字符。遇到 ~ 之後,printChar進行了以下操做:app
當前字符屬於CSS時,每次打印過程,一方面會將未格式化的字符串傳入<style id="style-elem">中,用以生成樣式。另外一方面會將格式化的代碼輸出到<pre id="my-code">中,用以展現代碼。函數
這兩個函數十分相似,主要做用就是經過正則匹配,給不一樣類型的字符兩端封上不一樣的標籤,用以高亮代碼。舉個栗子:
if (openInteger && !which.match(/[0-9\.]/) && !openString && !openComment) {
s = string.replace(/([0-9\.]*)$/, "<em class=\"int\">$1</em>" + which);
}
複製代碼
這就是一處典型的匹配+替換標籤組合拳。做用是代碼在以數字結尾時,給數字兩端封上<em class="int"></em>的標籤。
代碼中還有不少用做標誌位的參數,好比說openInteger,表示這段輸入都是數字。經過對這些控制位進行操做,能夠將零散的字符分紅一段一段的,方便進行處理。
其餘部分就不談了,本身能夠看源代碼,我已經加了備註。
您能夠fork過去直接修改,也能夠按照以下步驟操做
git clone https://github.com/tuobaye0711/code-printer.git
複製代碼
安裝依賴文件
npm install
複製代碼
打包文件
npm start
複製代碼
起服務
npm run server
複製代碼
修改配置說明:
resume 文件存放簡歷或者其餘靜態資源
source/code.js 存放須要打印並展現樣式的代碼(CSS/JS)
source/app.js 是主代碼,能夠修改一些好比說打印速度、高亮色等配置
能在本身網站掛一份帶打印特效的簡歷,想必能讓人眼前一亮吧。這篇文章主要安利了一下我這個名爲code-printer的小項目,但願能幫到各位~