1. 程式人生 > 其它 >阿里圖示庫自動拉取更新

阿里圖示庫自動拉取更新

const _ = require('lodash')
const path = require('path')
const fs = require('fs')
const extendRequest = require('request');
const wget = require('wget')

const icon = [{  // 自動維護圖示
  aliUrl: '//at.alicdn.com/t/font_2562802_c09nnj8xe7i.css', // 暫時只支援使用阿里巴巴圖示庫
  dir: './public/fonts'  // 公共圖示
}]
 

const postUrl = (_url,fn) => {
  extendRequest(_url, 
function(err, response, body) { if(!err && response.statusCode == 200) { fn(body); } else { console.log(err); } }); } const downIcon = (iconUrl,dir)=> { postUrl('https:'+iconUrl,(chunk)=>{ let form = 0 let to = form let urlList = [] let count
= 0 while (form !== -1 && to !== -1){ count++ if(count > 3000) throw new Error("gen icon failed") form = to + 1 form = chunk.indexOf("url(",form) to = chunk.indexOf(")",form+1) if(form !== -1 && to !== -1){ urlList.push(chunk.substr(form
+5,to - form-6)) } } urlList = _.uniq( urlList.map(_url => _url.split("#")[0]) ) count = urlList.length urlList.forEach(_url => { let __url = _url.split("?")[0] let {ext} = path.parse(__url) let fileName = "iconfont"+ext let filePath = path.join(dir,fileName) fs.existsSync(filePath) && fs.unlinkSync(filePath) if(__url[0] !== '/') return let download = wget.download("https:"+__url, filePath, {}) chunk.split(_url).join("") download.on('error', function(err) { throw err }) }) urlList.forEach(_url => { let strs = _url.split('?')[0].split('.') let type = strs[strs.length - 1] if(_url[0] !== '/') return chunk = chunk.replace(_url, './iconfont.' + type) chunk = chunk.replace(_url, './iconfont.' + type) }) // chunk = chunk.replace('./iconfont', "./public/fonts/iconfont"); //去掉空格 chunk = chunk.replace(/\.\/iconfont/g, "./iconfont"); //去掉空格 console.log(chunk) fs.writeFileSync(path.join('./public/fonts/fonts.css'),chunk) }) } // 刪除檔案方法 const delDir = (path)=>{ let files = []; return new Promise((resolve,rejec)=>{ console.log(fs.existsSync(path),5555) if(fs.existsSync(path)){ files = fs.readdirSync(path); files.forEach((file, index) => { let curPath = path + "/" + file; if(fs.statSync(curPath).isDirectory()){ delDir(curPath); //遞迴刪除資料夾 } else { fs.unlinkSync(curPath); //刪除檔案 } // if(fs.readdirSync(path).length==0){ fs.rmdirSync(path); resolve(true) } }); if(files.length==0){ fs.rmdirSync(path); resolve(true) } }else{ resolve(true); } }) } // 刪除資料夾 delDir(path.resolve(icon[0].dir)).then(r=>{ if(!r) return; // 重新建立資料夾 fs.mkdir('./public/fonts/',function(error){ if(error){ console.log(error); return false; } console.log('建立目錄成功'); // 迴圈獲取檔案 for(let item of icon){ downIcon(item.aliUrl,path.resolve(item.dir)); } }) });


const_=require('lodash') constpath=require('path') constfs=require('fs') constextendRequest=require('request'); constwget=require('wget')
consticon=[{//自動維護圖示 aliUrl:'//at.alicdn.com/t/font_2562802_c09nnj8xe7i.css',//暫時只支援使用阿里巴巴圖示庫 dir:'./public/fonts'//公共圖示 }]
constpostUrl=(_url,fn)=>{ extendRequest(_url,function(err,response,body){ if(!err&&response.statusCode==200){ fn(body); }else{ console.log(err); } }); } constdownIcon=(iconUrl,dir)=>{ postUrl('https:'+iconUrl,(chunk)=>{ letform=0 letto=form leturlList=[] letcount=0 while(form!==-1&&to!==-1){ count++ if(count>3000)thrownewError("geniconfailed") form=to+1 form=chunk.indexOf("url(",form) to=chunk.indexOf(")",form+1) if(form!==-1&&to!==-1){ urlList.push(chunk.substr(form+5,to-form-6)) } } urlList=_.uniq(urlList.map(_url=>_url.split("#")[0])) count=urlList.length urlList.forEach(_url=>{ let__url=_url.split("?")[0] let{ext}=path.parse(__url) letfileName="iconfont"+ext letfilePath=path.join(dir,fileName) fs.existsSync(filePath)&&fs.unlinkSync(filePath) if(__url[0]!=='/')return letdownload=wget.download("https:"+__url,filePath,{}) chunk.split(_url).join("") download.on('error',function(err){ throwerr }) }) urlList.forEach(_url=>{ letstrs=_url.split('?')[0].split('.') lettype=strs[strs.length-1] if(_url[0]!=='/')return chunk=chunk.replace(_url,'./iconfont.'+type) chunk=chunk.replace(_url,'./iconfont.'+type) })
//chunk=chunk.replace('./iconfont',"./public/fonts/iconfont");//去掉空格 chunk=chunk.replace(/\.\/iconfont/g,"./iconfont");//去掉空格 console.log(chunk) fs.writeFileSync(path.join('./public/fonts/fonts.css'),chunk) }) }

//刪除檔案方法 constdelDir=(path)=>{ letfiles=[];
returnnewPromise((resolve,rejec)=>{ console.log(fs.existsSync(path),5555) if(fs.existsSync(path)){ files=fs.readdirSync(path); files.forEach((file,index)=>{ letcurPath=path+"/"+file; if(fs.statSync(curPath).isDirectory()){ delDir(curPath);//遞迴刪除資料夾 }else{ fs.unlinkSync(curPath);//刪除檔案 } // if(fs.readdirSync(path).length==0){ fs.rmdirSync(path); resolve(true) } }); if(files.length==0){ fs.rmdirSync(path); resolve(true) } }else{ resolve(true); } }) }
//刪除資料夾 delDir(path.resolve(icon[0].dir)).then(r=>{ if(!r)return; //重新建立資料夾 fs.mkdir('./public/fonts/',function(error){ if(error){ console.log(error); returnfalse; } console.log('建立目錄成功'); //迴圈獲取檔案 for(letitemoficon){ downIcon(item.aliUrl,path.resolve(item.dir)); } }) });