/** * @file 图搜模块,会被异步加载 * @author wukaifang(wukaifang@baidu.com) **/ /* global s_session swfobject*/ /* eslint-disable fecs-camelcase*/ (function () { // 框升级2.0 图搜升级样式 var samNewBox = bds && bds.comm && bds.comm.samNewBox; var os = navigator.platform.toUpperCase(); var uploadServer = '//graph.baidu.com/upload'; var isMac = os.indexOf('MAC') !== -1; var $input, $namespace; // 区分新旧框的选择器,新框使用main-ipt,旧框使用kw if ($('#main-ipt').length > 0) { $input = $('#main-ipt'); $namespace = $('#main-wrapper').parent(); } else { $input = $('#kw'); $namespace = $('#form').parent(); } // 命中小流量使用抽样样式 var linkUrl = samNewBox ? 'http://pss.bdstatic.com/r/www/cache/static/soutu/css/soutu_new_sam_a6c95ec.css' : 'http://pss.bdstatic.com/r/www/cache/static/soutu/css/soutu_new2_baa2298.css'; var MAXSIZE = 1024 * 1024 * 10; // 10M var compressOpt = { // 压缩后图片的长边 maxLen: 800, // width * height 限制 // 压缩后的图片数据类型,0:二进制, 1:base64 compressType: 0 }; // 反作弊玉门关相关的变量 var sdkPromise = null; var sid = '2033'; var customCode = '601'; var TimeoutMilliseconds = 5000; var instance = null; function debounce(func, delay) { var timer = null; return function (...args) { var context = this; if (timer) { clearTimeout(timer); } timer = setTimeout(function () { func.apply(context, args); }, delay); }; } var ERROR_MSG = { 1: '该格式暂不支持', 2: '图片上传失败', 3: '抱歉,您上传的文件太大' }; var timer = null; var lib = { // 判断是不是动态webp isAnimatedWebp: function (file) { function WebPBuffer(arrayBuffer) { this.data = new Uint8Array(arrayBuffer); } WebPBuffer.prototype.read = function (start, end) { var str = ''; for (var i = start; i < end; i++) { str += String.fromCharCode(this.data[i]); } return str; } return new Promise((resolve, reject) => { try { var reader = new FileReader(); reader.onload = () => { var buffer = new WebPBuffer(reader.result); var result = ['VP8 ', 'VP8X'].includes(buffer.read(12, 16)) && buffer.read(30, 34) === 'ANIM'; resolve(result); }; reader.onerror = () => reject(reader.error); reader.readAsArrayBuffer(file); } catch(e) { reject(e); } }); }, // ubc日志,公共的ubclog模块有很多公参用不到,这里重新声明一个 sendUbcLog: function (type, value, ext) { var baseConfig = { version: '2.0', page: bds.comm.ishome ? 'home' : 'result', from: 'search', queryParams: { appname: 'pcsearch' }, useSendBeacon: 1 }; var ubcid = '19348'; require(['@baidu/ubc-report-sdk/dist/ubc-web-sdk.umd.min'], function (ubc) { var namespace = `${ubcid}.init`; ubc(namespace, ubcid, baseConfig); ubc(ubcid + '.event', { type, value, ext: ext || {} }) }); }, // 检查并转换base64图片 checkForBase64Image: function (text) { try { text = text.trim(); // 检查是否是base64编码的图片 var base64Regex = /^data:image\/(png|jpeg|jpg|gif|webp);base64,([A-Za-z0-9+/=]*)$/; var base64Match = text.match(base64Regex); var isBase64 = base64Match; return !!isBase64; } catch (e) { return false; } }, base64ToFile: function (base64String) { try { var base64Regex = /^data:(.*?);base64,/; var base64Data = base64String.replace(base64Regex, ''); var mimeType = base64String.match(base64Regex)[1]; var byteCharacters = atob(base64Data); // Decode Base64 string var byteNumbers = new Array(byteCharacters.length); for (var i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } var byteArray = new Uint8Array(byteNumbers); var blob = new Blob([byteArray], { type: mimeType }); return new File([blob], 'filename.' + mimeType.replace('image/', ''), { type: mimeType }); } catch(e) { return null; } }, getEnv: function () { if (bds && bds.comm) { if (bds.comm.ishome && bds.comm.newindex) { return 'newindex'; } else if (bds.comm.ishome) { return 'index'; } else if (/^\/imgsearch/.test(location.pathname)) { return 'imgresult'; } } return 'result'; }, // 判断是否支持语音,不支持语音,mac下不出语音icon supportVoice: function () { window.URL = window.URL || window.webkitURL; navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; window.AudioContext = window.AudioContext || window.webkitAudioContext; // 基本上,只支持新版的chrome和ff if (!navigator.getUserMedia || !window.URL) { return false; } if (!window.AudioContext) { return false; } if (!window.Worker) { return false; } if (!swfobject.hasFlashPlayerVersion('11.1.0')) { return false; } return true; }, parseQuery: function () { var queryStr = window.location.search.substr(1); var obj = {}; var params = queryStr.substring(queryStr.indexOf('?') + 1, queryStr.length).split('&'); for (var i = 0; i < params.length; i++) { var param = params[i]; var kv = param.split('='); if (kv[0]) { obj[kv[0]] = decodeURIComponent(kv[1]); } } return obj; }, getQuery: function (name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'); var r = window.location.search.substr(1).match(reg); if (r != null) { return (r[2]); } return null; }, isURL: function (val) { return (/^(((http[s]?:\/\/)|(ftp:\/\/))?([\w-]+\.)+(com|edu|gov|int|mil|net|org|biz|info|pro|name|museum|coop|aero|xxx|idv|al|dz|af|ar|ae|aw|om|az|eg|et|ie|ee|ad|ao|ai|ag|at|au|mo|bb|pg|bs|pk|py|ps|bh|pa|br|by|bm|bg|mp|bj|be|is|pr|ba|pl|bo|bz|bw|bt|bf|bi|bv|kp|gq|dk|de|tl|tp|tg|dm|do|ru|ec|er|fr|fo|pf|gf|tf|va|ph|fj|fi|cv|fk|gm|cg|cd|co|cr|gg|gd|gl|ge|cu|gp|gu|gy|kz|ht|kr|nl|an|hm|hn|ki|dj|kg|gn|gw|ca|gh|ga|kh|cz|zw|cm|qa|ky|km|ci|kw|cc|hr|ke|ck|lv|ls|la|lb|lt|lr|ly|li|re|lu|rw|ro|mg|im|mv|mt|mw|my|ml|mk|mh|mq|yt|mu|mr|us|um|as|vi|mn|ms|bd|pe|fm|mm|md|ma|mc|mz|mx|nr|np|ni|ne|ng|nu|no|nf|na|za|zq|aq|gs|eu|pw|pn|pt|jp|se|ch|sv|ws|yu|sl|sn|cy|sc|sa|cx|st|sh|kn|lc|sm|pm|vc|lk|sk|si|sj|sz|sd|sr|sb|so|tj|tw|th|tz|to|tc|tt|tn|tv|tr|tm|tk|wf|vu|gt|ve|bn|ug|ua|uy|uz|es|eh|gr|hk|sg|nc|nz|hu|sy|jm|am|ac|ye|iq|ir|il|it|in|id|uk|vg|io|jo|vn|zm|je|td|gi|cl|cf|cn)(:\d+)?(\/[^\s]*)?)$/).test(val); }, blobtoBase64: function (blob, callback) { // 使用 FileReader var fr = new FileReader(); fr.onload = function () { callback(this.result); }; fr.onerror = function (err) { callback(); }; fr.readAsDataURL(blob); }, sendLog: function (obj) { var urlMatches = location.href.match(/sign=(\w{32})\b/); var sign = urlMatches && urlMatches[1] || ''; obj.sign = sign; obj.fm = 'inlo'; if (obj.rsv_imageclick) { obj.rsv_imageclick = lib.getEnv() + '_' + obj.rsv_imageclick; } if (window.soutu_mixsearch) { obj.rsv_imagemix = 1; } window.ns_c(obj); }, loadScript: function (src) { var script = document.createElement('script'); script.async = true; script.setAttribute('charset', 'UTF-8'); script.src = src; document.getElementsByTagName('head')[0].appendChild(script); }, loadScriptPromise: function(src) { return new Promise(function (resolve) { var script = document.createElement('script'); script.type = 'text/javascript'; script.onload = script.onreadystatechange = function () { if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') { resolve(); } }; script.onerror = function() { resolve(); }; script.src = src; document.getElementsByTagName('head')[0].appendChild(script); }); } }; var template = { graphIconHtml: function () { return samNewBox ? '' : ''; }, hoverTipHtml: function () { // 框升级2.0 tips样式升级 return samNewBox ? '' : ''; }, wrapHtml: function () { var isNewInput = $('#main-ipt').length > 0; var btnText = isNewInput ? '' : '百度一下'; var soutuLayerStyle = isNewInput ? 'style=width:100%' : '' var uploadHtml = '上传图片'; // 框升级2.0 搜图按钮样式升级 var urlBtnHtml = samNewBox ? '' + btnText + '' : '' + btnText + ''; var closeHtml = ''; var samUrlWrapClass = samNewBox ? 'sam_url_wrap ' : ''; var samUrlKwClass = samNewBox ? 'sam_url_kw ' : ''; var soutuHtml = '' + '
' + '
' + '' + '' + '' + '' + '' + '' + urlBtnHtml + '请输入正确的图片网址' + '
' + '
' + '
' + '拖拽、Ctrl + V 粘贴图片至此' + '' + '
' + '
' + '' + '' + '本地上传图片' + uploadHtml + '
' + '
' + '' + closeHtml + '
'; return soutuHtml; }, newWrapHtml: function (newHeight) { // 新输入框实验,图搜框要适配高度 var uploadHtml = '选择文件'; var urlBtnHtml = ''; var closeHtml = ''; var soutuHtml = '' + '
' + '
' + '' + '