精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

圣誕節(jié),把你的 JavaScript 代碼都裝扮成圣誕樹吧

開發(fā) 前端
我們使用了自己寫的一個nodejs庫,如果您要實現(xiàn)這樣的效果,只需要按照下面第一章節(jié)的方法即可。當然您也可以在線壓縮代碼:http://f2e.souche.com/cheniu/js2image.html

效果的話,可以去看一下我們公司的官網(wǎng)(http://www.souche.com ),里面涉及到的js代碼在今天大部分被臨時替換成了圣誕樹,打開每個js代碼即可看到效果。

其實也不神奇,我們使用了自己寫的一個nodejs庫,如果您要實現(xiàn)這樣的效果,只需要按照下面***章節(jié)的方法即可。當然您也可以在線壓縮代碼:http://f2e.souche.com/cheniu/js2image.html

下面分兩章節(jié),分別講解如何使用js2image這個庫 和 js2image這個庫的原理。

圣誕節(jié),把你的 JavaScript 代碼都裝扮成圣誕樹吧

js2image使用

github地址:https://github.com/xinyu198736/js2image 歡迎送上star或者follow。

js2image主要有兩個比較特殊的特性:

  1. 將任意js源碼 壓縮成 用代碼堆砌成圖形的最終代碼。例如圣誕樹,圣誕老人,代碼和圖片都可以自定義。

  2. 壓縮后的js代碼格式雖然被破壞,但是仍然可以運行。這個是關鍵點!

壓縮后的示例可以查看這些js(均來自搜車官網(wǎng)):

使用方式很簡單:

  1. npm install js2image -g; 

然后在存在js的文件夾中執(zhí)行:

  1. js2image -s ./resource/jquery.js 

或者針對某個目錄下所有的js執(zhí)行(慎用),會深度遍歷此目錄里所有的js文件然后壓縮出.xmas.js后綴的結(jié)果文件。

  1. js2image -s ./resource/ 

即可生成一個對應的 **.xmas.js 的文件。

如果要將js2image集成到gulp或者其他nodes項目中,可以使用用模塊的形式:

  1. var Js2Image = require("js2image");//獲取結(jié)果的    codeJs2Image.getCode("./resource/jquery.js","./resource/tree.png",  {}).then(function(code){  
  2.    console.log(code); 
  3. }) 

更多的信息可以參照github上的文檔。

如果只是要使用這個效果,看到這里就ok啦,下面講解這個庫的原理,有些地方可能比較繞。

js2image實現(xiàn)原理

js2image的實現(xiàn)從宏觀來說,大體只有3個要點。

  1. 從圖片生成字符畫,這個有現(xiàn)成的庫。

  2. 把js代碼分割成一小塊一小塊,盡量小,然后用逐行填充的方式分別替換到上一步生成的字符畫里去。

  3. js代碼中有諸多不能分開的語法,分塊的時候要把這些語法保留在一個塊內(nèi)。這個是這個庫的難點所在,也是代碼最多最繞的地方。

稍有想法的同學估計看到這里基本已經(jīng)明白是怎么回事了,下面一一講解這3個要點。

① 從圖片生成2值得字符畫

這里用到了一個現(xiàn)成的npm包:image-to-ascii 。這個庫的作用是用指定的字符來還原一個圖像。而我們用這個庫來生成一個用 ☃字符和空格 分別表示黑和白的字符畫,然后將字符畫的每一行分解成數(shù)組的一個元素,供第二步使用,這就是我們中間生成的一個struct,代碼見 utils/image-to-struct.js

② 分割js源碼成盡量小的小塊。

這是非常重要的一步,js代碼具體可以分解成多細的小塊呢?

看下面一段代碼:

  1.                         !function             
  2.                         (e,t             
  3.                         ){ (             
  4.                        "objec"           
  5.                       +"t")  ==           
  6.                      typeof           
  7.                    module &&  (         
  8.                   "objec"+"t")           
  9.                 == typeof module         
  10.               .exports?module.       
  11.             exports=e.document?t(e       
  12.           ,!0):function(e){if(!e.     
  13.         document) throw new Error (     
  14.       ("jQuer"+"y req"+"uires"+" a wi"   
  15.    +"ndow "+"with "+"a doc"+"ument") )   
  16. return t (e)}:t(e)}( ("undef"+"ined"
  17. !=typeof    window ?window:this,function(e,t){var 

這是jQuery開始的一段代碼,可以看到,大部分操作符都允許中間插入任意多的空格或者換行,我們正是利用這一特性將js代碼解肢,然后拼接成任意形狀的圖片。

核心代碼其實就是一個正則,我們用這個正則把js源碼解構(gòu)成一個數(shù)組,然后后續(xù)根據(jù)每行需要的字符數(shù),從這個數(shù)組里不斷取片段出來拼接。

 

  1. //分離代碼,以可分割單位拆分成數(shù)組。var lines = hold_code.replace(/([^a-zA-Z_0-9=!|&$])/g,"/n$1/n").split("/n"); 
  2. //有了這個lines數(shù)組之后后面就簡單了,根據(jù)***步里生成的struct不斷遍歷從lines抽取代碼填充到struct里即可生成最終的代碼: 
  3. while(lines.length>0){  
  4.     //循環(huán)往struct里填充代碼 
  5.     struct.forEach(function(s){ 
  6.         var chars_arr = s.replace(/ +/g," ");//一行有多組分離的***** 
  7.         var r = s; 
  8.         chars_arr.split(/ +/).forEach(function(chars){ 
  9.             if(chars.length == 0){ 
  10.                 return
  11.             } 
  12.             var char_count = chars.length; 
  13.             //從lines里取出char_count數(shù)量的代碼來填充,不一定精準,要確保斷行正確 
  14.             var l = pickFromLines(lines,char_count); 
  15.  
  16.             r = r.replace(chars,function(){ 
  17.                 return l; 
  18.             }) 
  19.         }) 
  20.         result += r+"/n" 
  21.     }) 
  22.  

③ 保留不可分割的語法

注意:到了這一步,還很早,你分解出來的代碼是無法運行的,很多不能換行和加空格的代碼都被你分開了,自然會報錯,那如何處理這些情況呢?

這一步,我們做的工作就是:

在執(zhí)行代碼分拆之前,提取出代碼里所有不可分割的語法,將他們保留在一個對象中,并且在源代碼中用占位符替代這些語法,然后讓占位符參與上個步驟的分離,因為占位符是一個完整的連字符變量,所以不會被分割。在分割完成之后,我們再把這些占位符替換回來即可。

不過,在js中哪些語法必須是連接在一起才能正常運行的呢?

這里總結(jié)下:

  1. 字符串不可分割 包括雙引號單引號內(nèi)的內(nèi)容。

  2. 正則表達式絕對不可分割 正則里的轉(zhuǎn)義很難處理,這是這個算法里的難點。

  3. 運算操作符 包括2字符的3字符的 例如 以下兩種

  1. var double_operator = ["=="">=""<=""+=""-=""*=""/=""%=""++""--""&&""||"">>""<<"]  
  2. var three_operator = ['===''!=='

一些固定語法,可以用正則表達,如下:

  1. var reg_operator = [  
  2.     { 
  3.         start:"return"
  4.         reg:/^return[^a-zA-Z_0-1"'][a-zA-Z_0-1.]+/ 
  5.         // return 0.1 或者 return function 或者return aaabb 
  6.     }, 
  7.     { 
  8.         start:"return/"", 
  9.         reg:/^return".*?"// return "d" 或者 return "" 
  10.     }, 
  11.     { 
  12.         start:"return/'"
  13.         reg:/^return'.*?'/  // return 'd' 或者 return '' 
  14.     }, 
  15.     { 
  16.         start:"throw"
  17.         reg:/^throw [a-zA-Z_0-1]+?/ //throw new 或者 throw obj 
  18.     } 

小數(shù)點語法,例如 0.01 因為之前我們用點號來分割代碼的,但是這里的點號不能作為分割符使用,需要保留前后數(shù)字跟點號在一行 其他語法,例如 value++ 之類的語法,變量和操作符之間不可分割。 那我們?nèi)绾螐脑创a中解析出這些語法,然后做處理呢?

核心代碼均在 utils/keep-line.js 中

核心算法,事實上是通過一個對字符串的遍歷來完成的,然后在遍歷每個字符的時候都會判斷是否進入某個邏輯來跳躍處理。

例如,判斷出當前在雙引號內(nèi),則進入字符串提取邏輯,一直到字符串結(jié)束的時候再繼續(xù)正常的遍歷。

其他操作符和正則表達式的算法也是類似,不過里面很多細節(jié)需要處理,例如轉(zhuǎn)義字符之類的。

有些比較特殊的,例如小數(shù)點語法的提取,在判斷到當前字符是點號之后,需要往前和向后循環(huán)查找數(shù)字,然后把整個語法找出來。

這里不細講,在keep-line.js 這個文件中又一大坨代碼做這個事情的。

④ 字符串解構(gòu)

做到這一步的時候,其實效果已經(jīng)很不錯了,也可以保證代碼的可運行,但是代碼里有些字符串很長,他們總是會被被保留在一行里,這樣就造成他會影響一些圖案的邊緣的準確性(代碼分離原則是越細越好,就是為這個考慮)。

我們?nèi)绾翁幚砟兀蔷褪菍⒆址鈽?gòu),以5個為單位將字符串分離成小塊。

這里有兩個比較重要的問題需要處理;

  1. 字符串內(nèi)的轉(zhuǎn)義字符如何處理,還有一些特殊字符,例如0×01這樣的字符,這些字符不能被分離到不同的字符串里,所以分離的時候要保留這些字符串的完整性。

  2. 字符串分離成小字符串,然后用+號拼接起來,不過要注意操作符優(yōu)先級的問題,所以所有分離后的字符串,都要用括號包起來,讓這個+號的優(yōu)先級永遠***。
    具體算法見 keep-line.js 中的 splitDoubleQuot (分離雙引號字符串)。

結(jié)語

至此,整個應用就完成了,可以順利完成從任意js和圖像生成圖形代碼了。

再說一遍項目開源地址:https://github.com/xinyu198736/js2image 歡迎star,順便follow下樓主就更開心了。

 

責任編輯:王雪燕 來源: souche
相關推薦

2021-12-24 11:58:20

Shell腳本圣誕樹編程語言

2017-12-22 17:12:54

圣誕節(jié)

2018-12-25 09:27:55

Python圣誕帽程序員

2015-12-04 09:38:03

2013-01-28 09:11:56

圣誕推廣移動應用

2021-12-31 11:35:40

藍牙漏洞玩具Fisher-Pric

2021-12-06 14:02:25

勒索軟件攻擊數(shù)據(jù)泄露

2020-12-24 13:20:17

機器人人工智能圣誕節(jié)

2009-02-19 08:49:11

Windows 7發(fā)布日期

2019-12-25 15:22:20

Python 開發(fā)編程語言

2012-12-28 11:23:36

App Store圣誕節(jié)

2010-12-27 14:26:04

2011-12-20 14:49:21

投影儀推薦

2009-12-25 17:10:54

2011-12-28 10:23:30

Google

2013-01-04 11:08:20

云瀏覽器遨游

2016-12-13 08:40:15

app移動應用Go語言

2009-05-12 09:13:17

微軟SQLSQL Server

2014-12-22 11:10:06

LG

2011-12-20 21:02:07

蘋果
點贊
收藏

51CTO技術棧公眾號

日本不卡一二三| 毛片网站在线| 亚洲午夜极品| 亚洲美女福利视频网站| 国产一伦一伦一伦| 美足av综合网| 国产欧美精品一区二区色综合| 91在线视频九色| 无码人妻丰满熟妇区96| av在线女优影院| 高潮精品一区videoshd| 青草热久免费精品视频| 国产又粗又猛又爽又黄| 91看片在线观看| 视频一区二区三区入口| 久久久av网站| 男人操女人动态图| 日本成人精品| 欧美日韩在线播放| 97国产精东麻豆人妻电影| 毛片在线视频| 国产视频一区二区在线观看| 国产一区二区免费电影| 曰批又黄又爽免费视频| 亚洲欧美久久| 欧美精品xxx| 亚洲一级二级片| 欧洲grand老妇人| 日韩av在线网站| 日本中文字幕观看| 日韩在线免费| 精品毛片网大全| 欧美高清中文字幕| 国产盗摄在线观看| 国产精品色婷婷| 免费h精品视频在线播放| 农村少妇久久久久久久| 国产高清不卡一区二区| 成人黄色午夜影院| 亚洲中文无码av在线| 免费欧美一区| 在线观看国产91| 女人和拘做爰正片视频| 爱搞国产精品| 香蕉影视欧美成人| 国产女主播自拍| 欧美日韩色网| 亚洲最大成人网4388xx| 少妇久久久久久被弄到高潮| 四虎永久在线精品免费网址| 国产69精品一区二区亚洲孕妇| 91久久久久久久一区二区| 中文字幕av网站| 日韩—二三区免费观看av| 日韩av免费看网站| 国产寡妇亲子伦一区二区三区四区| 一区二区三区四区五区精品视频 | 91精品综合久久久久久久久久久 | 麻豆一区在线观看| av在线不卡免费观看| 国产亚洲xxx| 免费看污片的网站| 成人一二三区| 久久精品2019中文字幕| 午夜爱爱毛片xxxx视频免费看| 欧美岛国激情| 九九精品视频在线| 国产精品成人国产乱| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美激情在线有限公司| 日本亚洲欧美在线| 久久视频一区| 国产日韩精品电影| 国产婷婷在线视频| 成人午夜大片免费观看| 日本免费久久高清视频| 免费看av在线| 国产一区二区剧情av在线| 99影视tv| 欧美视频综合| 国产精品久久三| www.69av| 在线视频1区2区| 亚洲码国产岛国毛片在线| 国产二区视频在线| av网址在线| 亚洲va欧美va天堂v国产综合| 国模无码视频一区二区三区| 99热播精品免费| 日韩欧美你懂的| 日韩人妻一区二区三区 | 黑人巨大国产9丨视频| 国精一区二区三区| 日本高清不卡在线观看| 六月婷婷在线视频| 网友自拍亚洲| 日韩欧美国产系列| 免费观看av网站| 国产一区福利| 日韩视频在线一区| 日韩欧美亚洲视频| 久久成人羞羞网站| 久久99精品久久久久久三级| 色综合久久影院| 午夜精品久久一牛影视| 五月天视频在线观看| 丁香婷婷久久| 亚洲国产欧美日韩精品| 亚洲图片第一页| 在线日本成人| 亚洲一区亚洲二区亚洲三区| 国产资源在线观看| 亚洲国产婷婷综合在线精品| 日本在线一二三区| 亚洲欧洲免费| 国产+人+亚洲| 中日韩精品视频在线观看| 裸体一区二区三区| 牛人盗摄一区二区三区视频| 性欧美高清come| 欧美日韩国产系列| 亚洲av综合一区二区| 激情久久一区| 99国产视频在线| 嫩草香蕉在线91一二三区| 色婷婷综合久久久久中文一区二区 | 欧美日韩在线播放一区| av黄色免费网站| 国产亚洲欧洲| 国产伦理久久久| 性欧美ⅴideo另类hd| 91麻豆精品国产91久久久资源速度 | 久久91精品| 91国语精品自产拍在线观看性色| www精品国产| 亚洲免费在线播放| 肉色超薄丝袜脚交| 99成人在线视频| 国产精品网红直播| www.国产精品.com| 欧美日韩国产综合视频在线观看| 欧美黄色激情视频| 日韩专区中文字幕一区二区| 另类小说综合网| 亚洲最大成人| 欧美日韩中文字幕| 久久久久国产精品无码免费看| 国产精品午夜av| 欧美激情极品视频| 亚洲精品无amm毛片| 亚洲在线中文字幕| 精品国产免费久久久久久婷婷| 欧美巨大xxxx| 97在线视频精品| 少妇av一区二区| 黑人巨大精品欧美一区二区一视频 | 日韩视频一区在线| 国产精品亚洲欧美在线播放| 亚洲欧美中日韩| 亚洲国产欧美91| 黄色免费成人| 久久久久久国产精品mv| 希岛爱理一区二区三区av高清| 亚洲人成绝费网站色www| 波多野结衣mp4| 国产精品麻豆久久久| 在线a免费观看| 国产精品videosex极品| 国产一区二区无遮挡| 超级碰碰久久| 日韩一区二区三区国产| 亚洲精品成av人片天堂无码| 香蕉乱码成人久久天堂爱免费| 少妇光屁股影院| 蜜臀av在线播放一区二区三区| 免费国产成人看片在线| 亚洲一区二区三区四区电影| 欧美一区二区视频97| av在线播放网站| 日韩视频一区二区三区 | 国产精品嫩草99av在线| 色一情一乱一伦一区二区三区| 91麻豆精品国产综合久久久 | 亚洲免费av片| 91精品国产乱码久久久| 一区二区在线观看视频| 亚洲一区二区三区四区五区六区| 日韩av高清在线观看| 色婷婷777777仙踪林| 看全色黄大色大片免费久久久| 国产精品美乳一区二区免费| 天堂8中文在线| 亚洲人成在线观看| 精品人妻一区二区三区三区四区| 色综合久久中文字幕| 国产中文av在线| 91蜜桃视频在线| 亚洲国产欧美91| 老司机午夜免费精品视频| 日本a级片在线观看| 免费久久精品| 国产精品久久久久久久久久久久冷| 韩国精品主播一区二区在线观看| 欧美激情视频在线观看| 国产黄在线看| 黄色成人av网| 亚洲精品卡一卡二| 国产亚洲自拍一区| 91超薄肉色丝袜交足高跟凉鞋| 日韩av一区二区三区四区| 亚洲国产成人精品无码区99| 91精品国产91久久久久久黑人| 欧美另类视频在线| 精品综合久久88少妇激情| 成人国产在线视频| 欧美aaa视频| 88xx成人精品| av电影院在线看| 超碰91人人草人人干| av免费观看一区二区| 精品视频在线播放| 狠狠综合久久av一区二区| 欧美日韩mp4| 中国a一片一级一片| 岛国av一区二区在线在线观看| 国产va在线播放| 亚洲欧洲av在线| 免费成人美女女在线观看| 久久久久一区二区三区四区| 女同性恋一区二区三区| 国产91丝袜在线播放0| 亚洲高清av一区二区三区| 美女任你摸久久| 亚洲77777| 日韩国产在线观看一区| 情侣黄网站免费看| 成人久久综合| 欧美亚洲免费高清在线观看| 日韩av黄色在线| 精品国产乱码久久久久久108| 成人av激情人伦小说| 999国产在线| 婷婷视频一区二区三区| 97se亚洲综合在线| 欧美欧美在线| 欧美中文字幕在线视频| 狼人综合视频| 欧美一区在线直播| 久久91导航| 国产精品久久91| 国产成人a视频高清在线观看| 国产精品美乳在线观看| 在线免费成人| 91久久伊人青青碰碰婷婷| 日韩在线成人| 国产亚洲一区在线播放 | 色吧亚洲视频| 手机在线电影一区| 可以免费看的黄色网址| 欧美午夜视频| 国产免费一区二区三区视频| 久久一区精品| 亚洲综合av在线播放| 国内精品视频一区二区三区八戒| 黄色片免费网址| 成人av在线一区二区| 激情综合丁香五月| 亚洲国产精品成人综合| 女同久久另类69精品国产| 一区二区三区四区激情| 日本中文字幕免费| 91成人网在线| 国产成人三级在线播放| 亚洲国产天堂网精品网站| 你懂的视频在线播放| 色偷偷av亚洲男人的天堂| 黄色羞羞视频在线观看| 日本国产一区二区三区| 亚洲伊人精品酒店| 精品一区日韩成人| 欧美丰满老妇| 天天夜碰日日摸日日澡性色av| 久久综合九色| 野花视频免费在线观看| 久久视频一区二区| 手机av在线看| 欧美日韩在线视频一区二区| 中文字幕在线播放不卡| 欧美成人a∨高清免费观看| 精彩国产在线| 色综合久久悠悠| 久久人体大尺度| 成人免费在线一区二区三区| 免费看av成人| 蜜臀av.com| 日日嗨av一区二区三区四区| jjzz黄色片| 中文字幕中文在线不卡住| 男人的天堂一区| 欧美精品乱码久久久久久按摩| 日本高清视频网站| 久久久999精品免费| 国产精品粉嫩| 翡翠波斯猫1977年美国| 97精品视频| 四虎永久在线精品无码视频| 国产69精品久久久久毛片| av资源在线免费观看| 欧美性20hd另类| 日韩一级片免费| 久久久久99精品久久久久| 欧美日韩大片| 精品久久久久亚洲| 欧美涩涩视频| 天天色天天综合网| 国产色综合一区| 亚洲乱码国产乱码精品| 精品国产凹凸成av人网站| 麻豆tv免费在线观看| 国产精品久久久久国产a级| 天堂网av成人| 美女精品国产| 欧美日韩影院| 五月天视频在线观看| 中文字幕二三区不卡| 一级片视频在线观看| 亚洲高清不卡av| 黑人玩欧美人三根一起进| 99久久精品免费看国产四区| 91精品亚洲| 依人在线免费视频| 中文字幕国产一区| 中文精品久久久久人妻不卡| 亚洲无限av看| 欧美韩国亚洲| 日韩av不卡播放| 亚洲国产精品久久久天堂| 亚洲欧美激情网| 国产精品中文字幕日韩精品| 成年人网站在线观看视频| 欧美在线啊v一区| 番号集在线观看| 国产精品黄色影片导航在线观看| 精品久久不卡| 激情 小说 亚洲 图片: 伦| 国产女人aaa级久久久级| 日本欧美www| 中文字幕精品av| 青青在线精品| 国产麻豆一区二区三区在线观看| 欧美日韩调教| 精品1卡二卡三卡四卡老狼| 亚洲成人av资源| 香蕉人妻av久久久久天天| 69**夜色精品国产69乱| 欧美女优在线视频| 污版视频在线观看| 亚洲视频免费观看| 国产高清第一页| 亚洲97在线观看| 亚洲另类春色校园小说| 欧美伦理片在线观看| 中文字幕一区二区5566日韩| av一级黄色片| 久久琪琪电影院| 国产乱码精品一区二区亚洲| 少妇一级淫免费播放| 亚洲精品高清在线观看| 午夜视频免费看| 国产精品白嫩初高中害羞小美女 | 久久久久99精品久久久久| av成人资源| 国产精品人人妻人人爽人人牛| 中文字幕一区二区三区四区| 精品人妻伦一区二区三区久久| 久久久久中文字幕2018| 国产亚洲第一伦理第一区| 毛片毛片毛片毛片毛| 懂色av一区二区三区| 日本美女在线中文版| 国产精品伊人日日| 日本女人一区二区三区| 免费看一级一片| 国产午夜精品美女视频明星a级| 国产成人免费av一区二区午夜| 水蜜桃色314在线观看| 日本一区二区免费在线| 亚洲伦理在线观看| 国产精品丝袜高跟| 在线精品福利| 极品美妇后花庭翘臀娇吟小说| 亚洲精品国产精品国自产观看浪潮| 日本国产欧美| 久久久久久久久一区二区| 日产欧产美韩系列久久99| 久草网视频在线观看| 在线成人中文字幕| 国产女人18毛片水真多18精品| 日韩av在线中文| 精品欧美国产一区二区三区|