1/** 2 * ÐоÑÐ»Ð¾Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ panel/assets/common/qr/qr-svg.js â заÑем код ÑиÑÑÐµÑ Ð±ÑаÑÐ·ÐµÑ Ð¸ оÑкÑда взÑлаÑÑ 3 * геомеÑÑиÑ, напиÑано в Ñапке оÑигинала. 4 * 5 * ÐбÑего каÑалога аÑÑеÑов Ñ Ð¿Ñиложений неÑ, поÑÑÐ¾Ð¼Ñ Ñайл именно копиÑÑÑÑ. ÐеомеÑÑÐ¸Ñ Ð¾Ð±Ñзана 6 * ÑовпадаÑÑ Ñ Ð¿Ð°Ð½ÐµÐ»Ñной: один и ÑÐ¾Ñ Ð¶Ðµ код Ð·Ð°Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð³Ð¾ÑÑÑ Ð²Ð¸Ð´Ð¸Ñ Ð¸ в панели, и в баннеÑе ÑайÑа, 7 * и здеÑÑ, а по панелÑной еÑÑ Ð¸ напеÑаÑÐ°Ð½Ñ Ð½Ð°ÐºÐ»ÐµÐ¹ÐºÐ¸. Совпадение Ñел ÑÑеÑежÑÑ 8 * {@see panel/src/Application/Qr/Test/QrSvgCopyTest.php} â пÑавиÑÑ Ð·Ð´ÐµÑÑ, пÑÐ°Ð²Ñ Ð¸ Ñам. 9 * 10 * ÐÑжен глобалÑнÑй qrcode (vendor/qrcode/qrcode.min.js). ÐеÑка badges ÑÑÑ Ð½Ðµ ÑÑабаÑÑваеÑ: 11 * app.qrStoreBadges не опÑеделÑн, â и оÑÑавлена ÑолÑко Ñади доÑловноÑÑи копии. 12 */ 13(() => { 14 15 const FRAME_WIDTH = 185; 16 const FRAME_HEIGHT = 184; 17 const FRAME_HEIGHT_WITH_BADGES = 275; 18 19 // ÐоÑобка под Ñам код: левÑй веÑÑ Ð½Ð¸Ð¹ Ñгол и ÑÑоÑона в единиÑÐ°Ñ Ñамки. ÐаÑÑÑаб ÑÑиÑаеÑÑÑ 20 // Ð¾Ñ Ð½ÐµÑ, а не задан ÑиÑлом, â Ñогда код Ñ Ð´Ð»Ð¸Ð½Ð½Ð¾Ð¹ ÑÑÑлкой ÑÑÐ°Ð½ÐµÑ Ð¼ÐµÐ»ÑÑе, а не вÑÐ»ÐµÐ·ÐµÑ 21 // за ÑамкÑ. Ðа коÑоÑком адÑеÑе вÑÑ Ð¾Ð´Ð¸Ñ Ñовно ÑÐ¾Ñ Ð¶Ðµ scale(.555), ÑÑо ÑиÑовал ÑеÑвеÑ. 22 const QR_LEFT = 21.5; 23 const QR_TOP = 22; 24 const QR_SIZE = 138.75; 25 26 // СÑоÑона модÑÐ»Ñ Ð² пикÑелÑÑ Ñ Ð³Ð¾Ð»Ð¾Ð³Ð¾ кода â как Ñ ÑеÑвеÑной каÑÑинки, ÑÑÐ¾Ð±Ñ Ð²ÑÑÑÑка не Ð¿Ð¾ÐµÑ Ð°Ð»Ð°. 27 const PLAIN_MODULE_PX = 10; 28 29 /** 30 * Сам код: конÑÑÑ Ð² единиÑÐ°Ñ Ð¼Ð¾Ð´ÑÐ»Ñ (одна клеÑка = единиÑа) и ÑÑоÑона в клеÑÐºÐ°Ñ . 31 * @returns {{path: string, count: number}} 32 */ 33 const drawPath = (text) => { 34 // 0 â веÑÑÐ¸Ñ ÐºÐ¾Ð´Ð° подбиÑаеÑÑÑ Ð¿Ð¾ длине даннÑÑ , 'L' â ÑÑÐ¾Ð²ÐµÐ½Ñ ÐºÐ¾ÑÑекÑии, как на ÑеÑвеÑе. 35 const code = qrcode(0, 'L'); 36 37 code.addData(text); 38 code.make(); 39 40 const count = code.getModuleCount(); 41 let path = ''; 42 43 for (let row = 0; row < count; row++) { 44 for (let col = 0; col < count; col++) { 45 if (code.isDark(row, col)) { 46 path += `M${col} ${row}h1v1h-1z`; 47 } 48 } 49 } 50 51 // ÐÑе ÑÑмнÑе модÑли одним конÑÑÑом. СеÑÐ²ÐµÑ ÑиÑовал каждÑй оÑделÑной ÑигÑÑой, и на ÑÑÑÐºÐ°Ñ 52 // вÑлезали белÑе волоÑки Ð¾Ñ ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ â здеÑÑ Ð¸Ñ Ð½ÐµÑ, а Ñайл вдвое легÑе. 53 return {path, count}; 54 }; 55 56 /** 57 * @param {string} text - ÑÑо заÑиÑо в код, обÑÑно адÑÐµÑ Ð¼ÑлÑÑиÑÑÑлки foodpicasso.com/x/{id} 58 * @param {{badges?: boolean}} [options] - badges: доÑиÑоваÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸ App Store и Google Play 59 * @returns {string} ÑазмеÑка svg Ñеликом, Ð³Ð¾Ð´Ð½Ð°Ñ Ð¸ Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°, и Ð´Ð»Ñ ÑкаÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ñайлом 60 */ 61 const qrSvg = (text, options) => { 62 const withBadges = Boolean(options && options.badges); 63 const height = withBadges ? FRAME_HEIGHT_WITH_BADGES : FRAME_HEIGHT; 64 const {path, count}
64 = drawPath(text); 65 66 return `<svg xmlns="http://www.w3.org/2000/svg" width="${FRAME_WIDTH}px" height="${height}px"` 67 + ` viewBox="0 0 ${FRAME_WIDTH} ${height}">` 68 + `<rect x="0" y="0.5" width="${FRAME_WIDTH}" height="${height - 1}" rx="5" fill="white" stroke="#D0D0D0"/>` 69 + `<g transform="translate(${QR_LEFT}, ${QR_TOP}) scale(${QR_SIZE / count})">` 70 + `<path d="${path}" fill="#000000"/>` 71 + `</g>` 72 + (withBadges ? (window.app && window.app.qrStoreBadges) || '' : '') 73 + `</svg>`; 74 }; 75 76 /** 77 * ÐолÑй код без Ñамки и кнопок â Ñем показÑваÑÑ, напÑимеÑ, код пÑиглаÑениÑ. 78 * ÐÐ¾Ð»Ñ Ð²Ð¾ÐºÑÑг кода не ÑиÑÑем: Ð¸Ñ Ð´Ð°ÑÑ Ð¾ÑÑÑÑп блока, в коÑоÑом каÑÑинка ÑÑоиÑ. 79 * 80 * @param {string} text - ÑÑо заÑиÑо в код 81 * @returns {string} ÑазмеÑка svg Ñеликом 82 */ 83 const qrSvgPlain = (text) => { 84 const {path, count}
84 = drawPath(text); 85 const size = count * PLAIN_MODULE_PX; 86 87 return `<svg xmlns="http://www.w3.org/2000/svg" width="${size}px" height="${size}px"` 88 + ` viewBox="0 0 ${count} ${count}">` 89 + `<rect width="${count}" height="${count}" fill="white"/>` 90 + `<path d="${path}" fill="#000000"/>` 91 + `</svg>`; 92 }; 93 94 window.fpQrSvg = {svg: qrSvg, plain: qrSvgPlain}; 95 96 if (window.app) { 97 window.app.qrSvg = qrSvg; 98 window.app.qrSvgPlain = qrSvgPlain; 99 } 100 101})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.