使用code-printer生成一份炫酷的簡歷

歡迎光臨我的博客拓跋的前端客棧豆村,這個(gè)是原文地址剖踊,這個(gè)是項(xiàng)目地址,歡迎star&fork秦驯。如果您發(fā)現(xiàn)我文章中存在錯(cuò)誤,請(qǐng)盡情向我吐槽挣棕,大家一起學(xué)習(xí)一起進(jìn)步φ(>ω<*)


DEMO


最終效果請(qǐng)點(diǎn)擊這里译隘,是不是有點(diǎn)意思亲桥?

code-printer.png

源碼分析


code-printer的原理是首先搭起一個(gè)骨架,然后通過遍歷的方式固耘,一點(diǎn)一點(diǎn)地往骨架里塞東西题篷。

骨架主要有三塊:

  • <pre id="my-code">: 主要用來展示的HTML代碼的,帶標(biāo)簽
  • <style id="style-elem">: 主要填CSS代碼的厅目,用于把<pre>里特定的標(biāo)簽轉(zhuǎn)換成特定的樣式
  • <div id="script-area">: 主要是填JS代碼的番枚。但是由于一個(gè)字符一個(gè)字符往里面填代碼會(huì)出現(xiàn)大量報(bào)錯(cuò),因此這部分需要一個(gè)段落的JS代碼全部書寫完畢以后损敷,通過一個(gè)命令符'~'來一次性填入葫笼。

printCodes

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);
    }
};

這段代碼的主要作用就是遍歷打印字符,同時(shí)每次打印的時(shí)候都將滾動(dòng)條拖到最底下拗馒,保證用戶能看到最新的變化路星。

printChar

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函數(shù)是code-printer的核心函數(shù)诱桂,這個(gè)函數(shù)會(huì)根據(jù)當(dāng)前的代碼是JS還是CSS洋丐,來進(jìn)行不同的處理。

如何判斷是JS還是CSS代碼呢挥等?默認(rèn)設(shè)置

let isJs = false;

也就是默認(rèn)是CSS友绝,然后以 ` 作為切換符號(hào),每次遇到 ` 就切換一次語言肝劲。

當(dāng)前字符屬于JS時(shí)九榔,在沒遇到執(zhí)行符號(hào) ~ 之前,printChar只是單純的打印格式化后的字符涡相。遇到 ~ 以后哲泊,printChar進(jìn)行了如下操作:

  1. 函數(shù)首先通過正則匹配,匹配出之前的JS整段代碼催蝗。
  2. 再調(diào)用createElement()來創(chuàng)造一對(duì)<script></script>標(biāo)簽切威,用來存放JS代碼。
  3. 然后將處理過的JS代碼存入<script></script>標(biāo)簽內(nèi)丙号。
  4. 最后通過$script_area.appendChild()的方式將<script></script>及其內(nèi)部的JS代碼存入<div id="script-area">中先朦。注意,每次調(diào)用$script_area.appendChild()之前犬缨,都要將之前<div id="script-area">清空一遍喳魏,防止之前的JS代碼再執(zhí)行一次。

當(dāng)前字符屬于CSS時(shí)怀薛,每次打印過程刺彩,一方面會(huì)將未格式化的字符串傳入<style id="style-elem">中,用以生成樣式。另一方面會(huì)將格式化的代碼輸出到<pre id="my-code">中创倔,用以展示代碼嗡害。

cssHighlightjsHighlight

這兩個(gè)函數(shù)十分類似,主要作用就是通過正則匹配畦攘,給不同類型的字符兩端封上不同的標(biāo)簽霸妹,用以高亮代碼。舉個(gè)栗子:

if (openInteger && !which.match(/[0-9\.]/) && !openString && !openComment) {
    s = string.replace(/([0-9\.]*)$/, "<em class=\"int\">$1</em>" + which);
}

這就是一處典型的匹配+替換標(biāo)簽組合拳知押。作用是代碼在以數(shù)字結(jié)尾時(shí)叹螟,給數(shù)字兩端封上<em class="int"></em>的標(biāo)簽。

代碼中還有很多用作標(biāo)志位的參數(shù)台盯,比如說openInteger罢绽,表示這段輸入都是數(shù)字。通過對(duì)這些控制位進(jìn)行操作爷恳,可以將零散的字符分成一段一段的有缆,方便進(jìn)行處理。

其他部分就不談了温亲,自己可以看源代碼棚壁,我已經(jīng)加了備注。

使用方法


您可以fork過去直接修改栈虚,也可以按照如下步驟操作

git clone https://github.com/tuobaye0711/code-printer.git

安裝依賴文件

npm install

打包文件

npm start

起服務(wù)

npm run server

修改配置說明:

resume 文件存放簡歷或者其他靜態(tài)資源

source/code.js 存放需要打印并展示樣式的代碼(CSS/JS)

source/app.js 是主代碼袖外,可以修改一些比如說打印速度、高亮色等配置

小結(jié)


能在自己網(wǎng)站掛一份帶打印特效的簡歷魂务,想必能讓人眼前一亮吧曼验。這篇文章主要安利了一下我這個(gè)名為code-printer的小項(xiàng)目,希望能幫到各位~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末粘姜,一起剝皮案震驚了整個(gè)濱河市鬓照,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孤紧,老刑警劉巖豺裆,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異号显,居然都是意外死亡臭猜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門押蚤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔑歌,“玉大人,你說我怎么就攤上這事揽碘〈瓮溃” “怎么了园匹?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長帅矗。 經(jīng)常有香客問我偎肃,道長煞烫,這世上最難降的妖魔是什么浑此? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮滞详,結(jié)果婚禮上凛俱,老公的妹妹穿的比我還像新娘。我一直安慰自己料饥,他們只是感情好蒲犬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岸啡,像睡著了一般原叮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巡蘸,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天奋隶,我揣著相機(jī)與錄音,去河邊找鬼悦荒。 笑死唯欣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搬味。 我是一名探鬼主播境氢,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碰纬!你這毒婦竟也來了萍聊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤悦析,失蹤者是張志新(化名)和其女友劉穎寿桨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體她按,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牛隅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酌泰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媒佣。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖陵刹,靈堂內(nèi)的尸體忽然破棺而出默伍,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布也糊,位于F島的核電站炼蹦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏狸剃。R本人自食惡果不足惜掐隐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钞馁。 院中可真熱鬧虑省,春花似錦、人聲如沸僧凰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽训措。三九已至伪节,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绩鸣,已是汗流浹背怀大。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留全闷,地道東北人叉寂。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像总珠,于是被迫代替她去往敵國和親屏鳍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,105評(píng)論 25 707
  • error code(錯(cuò)誤代碼)=0是操作成功完成局服。error code(錯(cuò)誤代碼)=1是功能錯(cuò)誤钓瞭。error c...
    Heikki_閱讀 3,381評(píng)論 1 9
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,148評(píng)論 0 13
  • 怎樣愛一個(gè)人淫奔,在不同時(shí)期會(huì)有不同體悟山涡。 年少時(shí)初喜歡一個(gè)人,覺得特別神圣唆迁,很偉大鸭丛,卻又懵懂無知,不知道做些什么好唐责,...
    彥希媽閱讀 356評(píng)論 2 1
  • @font-family為樣式表添加字體鳞溉,通過指定字體的下載地址。 @font-family{ font-fami...
    猿分讓我們相遇閱讀 212評(píng)論 0 0