rough-emoji-draw 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -40,21 +40,12 @@ __webpack_require__.r(__webpack_exports__);
40
40
  // EXPORTS
41
41
  __webpack_require__.d(__webpack_exports__, {
42
42
  RoughEmoji: () => (/* reexport */ RoughEmoji),
43
- RoughEmojiApp: () => (/* reexport */ RoughEmojiApp),
44
43
  isFlagEmoji: () => (/* reexport */ isFlagEmoji),
45
44
  resolveFlag: () => (/* reexport */ resolveFlag)
46
45
  });
47
46
 
48
47
  ;// CONCATENATED MODULE: ./src/constant.ts
49
- /** 单页演示入口使用的 DOM 选择器,QA 页面不存在这些节点时只暴露全局 API。 */ const ELEMENT_SELECTORS = {
50
- canvas: "#rough-canvas",
51
- form: "#emoji-form",
52
- input: "#emoji-input",
53
- downloadButton: "#download-button"
54
- };
55
- /** 默认绘制国旗,供首次打开页面、prompt 默认值和非法输入回退共用。 */ const DEFAULT_FLAG = "🇨🇳";
56
- /** 下载文件名前缀,最终文件名会追加当前绘制的国旗 emoji。 */ const DOWNLOAD_FILE_PREFIX = "rough-flag";
57
- /** 首次进入单页演示时提示用户输入国旗的文案。 */ const FLAG_PROMPT_MESSAGE = "请输入要绘制的国旗";
48
+ /** 默认绘制国旗,供非法输入回退共用。 */ const DEFAULT_FLAG = "🇨🇳";
58
49
  /** 已有专门手写模板的国旗 emoji,避免绘制分支散落字面量。 */ const TEMPLATE_FLAGS = {
59
50
  ad: "🇦🇩",
60
51
  ae: "🇦🇪",
@@ -317,19 +308,6 @@ __webpack_require__.d(__webpack_exports__, {
317
308
  shadow: "rgba(36, 49, 44, 0.08)"
318
309
  };
319
310
 
320
- ;// CONCATENATED MODULE: ./src/flag-utils.ts
321
-
322
- /** 把任意输入规范化为可绘制的国旗 emoji;非法输入回退到中国国旗。 */ function resolveFlag(value) {
323
- const input = String(value || "").trim();
324
- return isFlagEmoji(input) ? input : DEFAULT_FLAG;
325
- }
326
- /** 判断字符串是否由两个区域指示符组成,这是 Unicode 国旗 emoji 的编码形式。 */ function isFlagEmoji(value) {
327
- const codePoints = [
328
- ...value
329
- ].map((char)=>char.codePointAt(0));
330
- return codePoints.length === 2 && codePoints.every((codePoint)=>codePoint !== undefined && codePoint >= (/* inlined export .REGION_INDICATOR_MIN_CODE_POINT */127462) && codePoint <= (/* inlined export .REGION_INDICATOR_MAX_CODE_POINT */127487));
331
- }
332
-
333
311
  ;// CONCATENATED MODULE: ./node_modules/.pnpm/roughjs@4.6.6/node_modules/roughjs/bundled/rough.esm.js
334
312
  function rough_esm_t(t,e,s){if(t&&t.length){const[n,o]=e,a=Math.PI/180*s,h=Math.cos(a),r=Math.sin(a);for(const e of t){const[t,s]=e;e[0]=(t-n)*h-(s-o)*r+n,e[1]=(t-n)*r+(s-o)*h+o}}}function rough_esm_e(t,e){return t[0]===e[0]&&t[1]===e[1]}function rough_esm_s(s,n,o,a=1){const h=o,r=Math.max(n,.1),i=s[0]&&s[0][0]&&"number"==typeof s[0][0]?[s]:s,c=[0,0];if(h)for(const e of i)rough_esm_t(e,c,h);const l=function(t,s,n){const o=[];for(const s of t){const t=[...s];rough_esm_e(t[0],t[t.length-1])||t.push([t[0][0],t[0][1]]),t.length>2&&o.push(t)}const a=[];s=Math.max(s,.1);const h=[];for(const t of o)for(let e=0;e<t.length-1;e++){const s=t[e],n=t[e+1];if(s[1]!==n[1]){const t=Math.min(s[1],n[1]);h.push({ymin:t,ymax:Math.max(s[1],n[1]),x:t===s[1]?s[0]:n[0],islope:(n[0]-s[0])/(n[1]-s[1])})}}if(h.sort(((t,e)=>t.ymin<e.ymin?-1:t.ymin>e.ymin?1:t.x<e.x?-1:t.x>e.x?1:t.ymax===e.ymax?0:(t.ymax-e.ymax)/Math.abs(t.ymax-e.ymax))),!h.length)return a;let r=[],i=h[0].ymin,c=0;for(;r.length||h.length;){if(h.length){let t=-1;for(let e=0;e<h.length&&!(h[e].ymin>i);e++)t=e;h.splice(0,t+1).forEach((t=>{r.push({s:i,edge:t})}))}if(r=r.filter((t=>!(t.edge.ymax<=i))),r.sort(((t,e)=>t.edge.x===e.edge.x?0:(t.edge.x-e.edge.x)/Math.abs(t.edge.x-e.edge.x))),(1!==n||c%s==0)&&r.length>1)for(let t=0;t<r.length;t+=2){const e=t+1;if(e>=r.length)break;const s=r[t].edge,n=r[e].edge;a.push([[Math.round(s.x),i],[Math.round(n.x),i]])}i+=n,r.forEach((t=>{t.edge.x=t.edge.x+n*t.edge.islope})),c++}return a}(i,r,a);if(h){for(const e of i)rough_esm_t(e,c,-h);!function(e,s,n){const o=[];e.forEach((t=>o.push(...t))),rough_esm_t(o,s,n)}(l,c,-h)}return l}function rough_esm_n(t,e){var n;const o=e.hachureAngle+90;let a=e.hachureGap;a<0&&(a=4*e.strokeWidth),a=Math.round(Math.max(a,.1));let h=1;return e.roughness>=1&&((null===(n=e.randomizer)||void 0===n?void 0:n.next())||Math.random())>.7&&(h=a),rough_esm_s(t,a,o,h||1)}class rough_esm_o{constructor(t){this.helper=t}fillPolygons(t,e){return this._fillPolygons(t,e)}_fillPolygons(t,e){const s=rough_esm_n(t,e);return{type:"fillSketch",ops:this.renderLines(s,e)}}renderLines(t,e){const s=[];for(const n of t)s.push(...this.helper.doubleLineOps(n[0][0],n[0][1],n[1][0],n[1][1],e));return s}}function rough_esm_a(t){const e=t[0],s=t[1];return Math.sqrt(Math.pow(e[0]-s[0],2)+Math.pow(e[1]-s[1],2))}class rough_esm_h extends rough_esm_o{fillPolygons(t,e){let s=e.hachureGap;s<0&&(s=4*e.strokeWidth),s=Math.max(s,.1);const o=rough_esm_n(t,Object.assign({},e,{hachureGap:s})),h=Math.PI/180*e.hachureAngle,r=[],i=.5*s*Math.cos(h),c=.5*s*Math.sin(h);for(const[t,e]of o)rough_esm_a([t,e])&&r.push([[t[0]-i,t[1]+c],[...e]],[[t[0]+i,t[1]-c],[...e]]);return{type:"fillSketch",ops:this.renderLines(r,e)}}}class rough_esm_r extends rough_esm_o{fillPolygons(t,e){const s=this._fillPolygons(t,e),n=Object.assign({},e,{hachureAngle:e.hachureAngle+90}),o=this._fillPolygons(t,n);return s.ops=s.ops.concat(o.ops),s}}class rough_esm_i{constructor(t){this.helper=t}fillPolygons(t,e){const s=rough_esm_n(t,e=Object.assign({},e,{hachureAngle:0}));return this.dotsOnLines(s,e)}dotsOnLines(t,e){const s=[];let n=e.hachureGap;n<0&&(n=4*e.strokeWidth),n=Math.max(n,.1);let o=e.fillWeight;o<0&&(o=e.strokeWidth/2);const h=n/4;for(const r of t){const t=rough_esm_a(r),i=t/n,c=Math.ceil(i)-1,l=t-c*n,u=(r[0][0]+r[1][0])/2-n/4,p=Math.min(r[0][1],r[1][1]);for(let t=0;t<c;t++){const a=p+l+t*n,r=u-h+2*Math.random()*h,i=a-h+2*Math.random()*h,c=this.helper.ellipse(r,i,o,o,e);s.push(...c.ops)}}return{type:"fillSketch",ops:s}}}class rough_esm_c{constructor(t){this.helper=t}fillPolygons(t,e){const s=rough_esm_n(t,e);return{type:"fillSketch",ops:this.dashedLine(s,e)}}dashedLine(t,e){const s=e.dashOffset<0?e.hachureGap<0?4*e.strokeWidth:e.hachureGap:e.dashOffset,n=e.dashGap<0?e.hachureGap<0?4*e.strokeWidth:e.hachureGap:e.dashGap,o=[];return t.forEach((t=>{const h=rough_esm_a(t),r=Math.floor(h/(s+n)),i=(h+n-r*(s+n))/2;let c=t[0],l=t[1];c[0]>l[0]&&(c=t[1],l=t[0]);const u=Math.atan((l[1]-c[1])/(l[0]-c[0]));for(let t=0;t<r;t++){const a=t*(s+n),h=a+s,r=[c[0]+a*Math.cos(u)+i*Math.cos(u),c[1]+a*Math.sin(u)+i*Math.sin(u)],l=[c[0]+h*Math.cos(u)+i*Math.cos(u),c[1]+h*Math.sin(u)+i*Math.sin(u)];o.push(...this.helper.doubleLineOps(r[0],r[1],l[0],l[1],e))}})),o}}class rough_esm_l{constructor(t){this.helper=t}fillPolygons(t,e){const s=e.hachureGap<0?4*e.strokeWidth:e.hachureGap,o=e.zigzagOffset<0?s:e.zigzagOffset,a=rough_esm_n(t,e=Object.assign({},e,{hachureGap:s+o}));return{type:"fillSketch",ops:this.zigzagLines(a,o,e)}}zigzagLines(t,e,s){const n=[];return t.forEach((t=>{const o=rough_esm_a(t),h=Math.round(o/(2*e));let r=t[0],i=t[1];r[0]>i[0]&&(r=t[1],i=t[0]);const c=Math.atan((i[1]-r[1])/(i[0]-r[0]));for(let t=0;t<h;t++){const o=2*t*e,a=2*(t+1)*e,h=Math.sqrt(2*Math.pow(e,2)),i=[r[0]+o*Math.cos(c),r[1]+o*Math.sin(c)],l=[r[0]+a*Math.cos(c),r[1]+a*Math.sin(c)],u=[i[0]+h*Math.cos(c+Math.PI/4),i[1]+h*Math.sin(c+Math.PI/4)];n.push(...this.helper.doubleLineOps(i[0],i[1],u[0],u[1],s),...this.helper.doubleLineOps(u[0],u[1],l[0],l[1],s))}})),n}}const rough_esm_u={};class rough_esm_p{constructor(t){this.seed=t}next(){return this.seed?(2**31-1&(this.seed=Math.imul(48271,this.seed)))/2**31:Math.random()}}const rough_esm_f=0,rough_esm_d=1,rough_esm_g=2,rough_esm_M={A:7,a:7,C:6,c:6,H:1,h:1,L:2,l:2,M:2,m:2,Q:4,q:4,S:4,s:4,T:2,t:2,V:1,v:1,Z:0,z:0};function rough_esm_k(t,e){return t.type===e}function rough_esm_b(t){const e=[],s=function(t){const e=new Array;for(;""!==t;)if(t.match(/^([ \t\r\n,]+)/))t=t.substr(RegExp.$1.length);else if(t.match(/^([aAcChHlLmMqQsStTvVzZ])/))e[e.length]={type:rough_esm_f,text:RegExp.$1},t=t.substr(RegExp.$1.length);else{if(!t.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/))return[];e[e.length]={type:rough_esm_d,text:`${parseFloat(RegExp.$1)}`},t=t.substr(RegExp.$1.length)}return e[e.length]={type:rough_esm_g,text:""},e}(t);let n="BOD",o=0,a=s[o];for(;!rough_esm_k(a,rough_esm_g);){let h=0;const r=[];if("BOD"===n){if("M"!==a.text&&"m"!==a.text)return rough_esm_b("M0,0"+t);o++,h=rough_esm_M[a.text],n=a.text}else rough_esm_k(a,rough_esm_d)?h=rough_esm_M[n]:(o++,h=rough_esm_M[a.text],n=a.text);if(!(o+h<s.length))throw new Error("Path data ended short");for(let t=o;t<o+h;t++){const e=s[t];if(!rough_esm_k(e,rough_esm_d))throw new Error("Param not a number: "+n+","+e.text);r[r.length]=+e.text}if("number"!=typeof rough_esm_M[n])throw new Error("Bad segment: "+n);{const t={key:n,data:r};e.push(t),o+=h,a=s[o],"M"===n&&(n="L"),"m"===n&&(n="l")}}return e}function rough_esm_y(t){let e=0,s=0,n=0,o=0;const a=[];for(const{key:h,data:r}of t)switch(h){case"M":a.push({key:"M",data:[...r]}),[e,s]=r,[n,o]=r;break;case"m":e+=r[0],s+=r[1],a.push({key:"M",data:[e,s]}),n=e,o=s;break;case"L":a.push({key:"L",data:[...r]}),[e,s]=r;break;case"l":e+=r[0],s+=r[1],a.push({key:"L",data:[e,s]});break;case"C":a.push({key:"C",data:[...r]}),e=r[4],s=r[5];break;case"c":{const t=r.map(((t,n)=>n%2?t+s:t+e));a.push({key:"C",data:t}),e=t[4],s=t[5];break}case"Q":a.push({key:"Q",data:[...r]}),e=r[2],s=r[3];break;case"q":{const t=r.map(((t,n)=>n%2?t+s:t+e));a.push({key:"Q",data:t}),e=t[2],s=t[3];break}case"A":a.push({key:"A",data:[...r]}),e=r[5],s=r[6];break;case"a":e+=r[5],s+=r[6],a.push({key:"A",data:[r[0],r[1],r[2],r[3],r[4],e,s]});break;case"H":a.push({key:"H",data:[...r]}),e=r[0];break;case"h":e+=r[0],a.push({key:"H",data:[e]});break;case"V":a.push({key:"V",data:[...r]}),s=r[0];break;case"v":s+=r[0],a.push({key:"V",data:[s]});break;case"S":a.push({key:"S",data:[...r]}),e=r[2],s=r[3];break;case"s":{const t=r.map(((t,n)=>n%2?t+s:t+e));a.push({key:"S",data:t}),e=t[2],s=t[3];break}case"T":a.push({key:"T",data:[...r]}),e=r[0],s=r[1];break;case"t":e+=r[0],s+=r[1],a.push({key:"T",data:[e,s]});break;case"Z":case"z":a.push({key:"Z",data:[]}),e=n,s=o}return a}function rough_esm_m(t){const e=[];let s="",n=0,o=0,a=0,h=0,r=0,i=0;for(const{key:c,data:l}of t){switch(c){case"M":e.push({key:"M",data:[...l]}),[n,o]=l,[a,h]=l;break;case"C":e.push({key:"C",data:[...l]}),n=l[4],o=l[5],r=l[2],i=l[3];break;case"L":e.push({key:"L",data:[...l]}),[n,o]=l;break;case"H":n=l[0],e.push({key:"L",data:[n,o]});break;case"V":o=l[0],e.push({key:"L",data:[n,o]});break;case"S":{let t=0,a=0;"C"===s||"S"===s?(t=n+(n-r),a=o+(o-i)):(t=n,a=o),e.push({key:"C",data:[t,a,...l]}),r=l[0],i=l[1],n=l[2],o=l[3];break}case"T":{const[t,a]=l;let h=0,c=0;"Q"===s||"T"===s?(h=n+(n-r),c=o+(o-i)):(h=n,c=o);const u=n+2*(h-n)/3,p=o+2*(c-o)/3,f=t+2*(h-t)/3,d=a+2*(c-a)/3;e.push({key:"C",data:[u,p,f,d,t,a]}),r=h,i=c,n=t,o=a;break}case"Q":{const[t,s,a,h]=l,c=n+2*(t-n)/3,u=o+2*(s-o)/3,p=a+2*(t-a)/3,f=h+2*(s-h)/3;e.push({key:"C",data:[c,u,p,f,a,h]}),r=t,i=s,n=a,o=h;break}case"A":{const t=Math.abs(l[0]),s=Math.abs(l[1]),a=l[2],h=l[3],r=l[4],i=l[5],c=l[6];if(0===t||0===s)e.push({key:"C",data:[n,o,i,c,i,c]}),n=i,o=c;else if(n!==i||o!==c){rough_esm_x(n,o,i,c,t,s,a,h,r).forEach((function(t){e.push({key:"C",data:t})})),n=i,o=c}break}case"Z":e.push({key:"Z",data:[]}),n=a,o=h}s=c}return e}function w(t,e,s){return[t*Math.cos(s)-e*Math.sin(s),t*Math.sin(s)+e*Math.cos(s)]}function rough_esm_x(t,e,s,n,o,a,h,r,i,c){const l=(u=h,Math.PI*u/180);var u;let p=[],f=0,d=0,g=0,M=0;if(c)[f,d,g,M]=c;else{[t,e]=w(t,e,-l),[s,n]=w(s,n,-l);const h=(t-s)/2,c=(e-n)/2;let u=h*h/(o*o)+c*c/(a*a);u>1&&(u=Math.sqrt(u),o*=u,a*=u);const p=o*o,k=a*a,b=p*k-p*c*c-k*h*h,y=p*c*c+k*h*h,m=(r===i?-1:1)*Math.sqrt(Math.abs(b/y));g=m*o*c/a+(t+s)/2,M=m*-a*h/o+(e+n)/2,f=Math.asin(parseFloat(((e-M)/a).toFixed(9))),d=Math.asin(parseFloat(((n-M)/a).toFixed(9))),t<g&&(f=Math.PI-f),s<g&&(d=Math.PI-d),f<0&&(f=2*Math.PI+f),d<0&&(d=2*Math.PI+d),i&&f>d&&(f-=2*Math.PI),!i&&d>f&&(d-=2*Math.PI)}let k=d-f;if(Math.abs(k)>120*Math.PI/180){const t=d,e=s,r=n;d=i&&d>f?f+120*Math.PI/180*1:f+120*Math.PI/180*-1,p=rough_esm_x(s=g+o*Math.cos(d),n=M+a*Math.sin(d),e,r,o,a,h,0,i,[d,t,g,M])}k=d-f;const b=Math.cos(f),y=Math.sin(f),m=Math.cos(d),P=Math.sin(d),v=Math.tan(k/4),S=4/3*o*v,O=4/3*a*v,L=[t,e],T=[t+S*y,e-O*b],D=[s+S*P,n-O*m],A=[s,n];if(T[0]=2*L[0]-T[0],T[1]=2*L[1]-T[1],c)return[T,D,A].concat(p);{p=[T,D,A].concat(p);const t=[];for(let e=0;e<p.length;e+=3){const s=w(p[e][0],p[e][1],l),n=w(p[e+1][0],p[e+1][1],l),o=w(p[e+2][0],p[e+2][1],l);t.push([s[0],s[1],n[0],n[1],o[0],o[1]])}return t}}const rough_esm_P={randOffset:function(t,e){return G(t,e)},randOffsetWithRange:function(t,e,s){return E(t,e,s)},ellipse:function(t,e,s,n,o){const a=rough_esm_T(s,n,o);return rough_esm_D(t,e,o,a).opset},doubleLineOps:function(t,e,s,n,o){return $(t,e,s,n,o,!0)}};function rough_esm_v(t,e,s,n,o){return{type:"path",ops:$(t,e,s,n,o)}}function rough_esm_S(t,e,s){const n=(t||[]).length;if(n>2){const o=[];for(let e=0;e<n-1;e++)o.push(...$(t[e][0],t[e][1],t[e+1][0],t[e+1][1],s));return e&&o.push(...$(t[n-1][0],t[n-1][1],t[0][0],t[0][1],s)),{type:"path",ops:o}}return 2===n?rough_esm_v(t[0][0],t[0][1],t[1][0],t[1][1],s):{type:"path",ops:[]}}function rough_esm_O(t,e,s,n,o){return function(t,e){return rough_esm_S(t,!0,e)}([[t,e],[t+s,e],[t+s,e+n],[t,e+n]],o)}function rough_esm_L(t,e){if(t.length){const s="number"==typeof t[0][0]?[t]:t,n=j(s[0],1*(1+.2*e.roughness),e),o=e.disableMultiStroke?[]:j(s[0],1.5*(1+.22*e.roughness),z(e));for(let t=1;t<s.length;t++){const a=s[t];if(a.length){const t=j(a,1*(1+.2*e.roughness),e),s=e.disableMultiStroke?[]:j(a,1.5*(1+.22*e.roughness),z(e));for(const e of t)"move"!==e.op&&n.push(e);for(const t of s)"move"!==t.op&&o.push(t)}}return{type:"path",ops:n.concat(o)}}return{type:"path",ops:[]}}function rough_esm_T(t,e,s){const n=Math.sqrt(2*Math.PI*Math.sqrt((Math.pow(t/2,2)+Math.pow(e/2,2))/2)),o=Math.ceil(Math.max(s.curveStepCount,s.curveStepCount/Math.sqrt(200)*n)),a=2*Math.PI/o;let h=Math.abs(t/2),r=Math.abs(e/2);const i=1-s.curveFitting;return h+=G(h*i,s),r+=G(r*i,s),{increment:a,rx:h,ry:r}}function rough_esm_D(t,e,s,n){const[o,a]=F(n.increment,t,e,n.rx,n.ry,1,n.increment*E(.1,E(.4,1,s),s),s);let h=q(o,null,s);if(!s.disableMultiStroke&&0!==s.roughness){const[o]=F(n.increment,t,e,n.rx,n.ry,1.5,0,s),a=q(o,null,s);h=h.concat(a)}return{estimatedPoints:a,opset:{type:"path",ops:h}}}function rough_esm_A(t,e,s,n,o,a,h,r,i){const c=t,l=e;let u=Math.abs(s/2),p=Math.abs(n/2);u+=G(.01*u,i),p+=G(.01*p,i);let f=o,d=a;for(;f<0;)f+=2*Math.PI,d+=2*Math.PI;d-f>2*Math.PI&&(f=0,d=2*Math.PI);const g=2*Math.PI/i.curveStepCount,M=Math.min(g/2,(d-f)/2),k=V(M,c,l,u,p,f,d,1,i);if(!i.disableMultiStroke){const t=V(M,c,l,u,p,f,d,1.5,i);k.push(...t)}return h&&(r?k.push(...$(c,l,c+u*Math.cos(f),l+p*Math.sin(f),i),...$(c,l,c+u*Math.cos(d),l+p*Math.sin(d),i)):k.push({op:"lineTo",data:[c,l]},{op:"lineTo",data:[c+u*Math.cos(f),l+p*Math.sin(f)]})),{type:"path",ops:k}}function _(t,e){const s=rough_esm_m(rough_esm_y(rough_esm_b(t))),n=[];let o=[0,0],a=[0,0];for(const{key:t,data:h}of s)switch(t){case"M":a=[h[0],h[1]],o=[h[0],h[1]];break;case"L":n.push(...$(a[0],a[1],h[0],h[1],e)),a=[h[0],h[1]];break;case"C":{const[t,s,o,r,i,c]=h;n.push(...Z(t,s,o,r,i,c,a,e)),a=[i,c];break}case"Z":n.push(...$(a[0],a[1],o[0],o[1],e)),a=[o[0],o[1]]}return{type:"path",ops:n}}function I(t,e){const s=[];for(const n of t)if(n.length){const t=e.maxRandomnessOffset||0,o=n.length;if(o>2){s.push({op:"move",data:[n[0][0]+G(t,e),n[0][1]+G(t,e)]});for(let a=1;a<o;a++)s.push({op:"lineTo",data:[n[a][0]+G(t,e),n[a][1]+G(t,e)]})}}return{type:"fillPath",ops:s}}function C(t,e){return function(t,e){let s=t.fillStyle||"hachure";if(!rough_esm_u[s])switch(s){case"zigzag":rough_esm_u[s]||(rough_esm_u[s]=new rough_esm_h(e));break;case"cross-hatch":rough_esm_u[s]||(rough_esm_u[s]=new rough_esm_r(e));break;case"dots":rough_esm_u[s]||(rough_esm_u[s]=new rough_esm_i(e));break;case"dashed":rough_esm_u[s]||(rough_esm_u[s]=new rough_esm_c(e));break;case"zigzag-line":rough_esm_u[s]||(rough_esm_u[s]=new rough_esm_l(e));break;default:s="hachure",rough_esm_u[s]||(rough_esm_u[s]=new rough_esm_o(e))}return rough_esm_u[s]}(e,rough_esm_P).fillPolygons(t,e)}function z(t){const e=Object.assign({},t);return e.randomizer=void 0,t.seed&&(e.seed=t.seed+1),e}function W(t){return t.randomizer||(t.randomizer=new rough_esm_p(t.seed||0)),t.randomizer.next()}function E(t,e,s,n=1){return s.roughness*n*(W(s)*(e-t)+t)}function G(t,e,s=1){return E(-t,t,e,s)}function $(t,e,s,n,o,a=!1){const h=a?o.disableMultiStrokeFill:o.disableMultiStroke,r=R(t,e,s,n,o,!0,!1);if(h)return r;const i=R(t,e,s,n,o,!0,!0);return r.concat(i)}function R(t,e,s,n,o,a,h){const r=Math.pow(t-s,2)+Math.pow(e-n,2),i=Math.sqrt(r);let c=1;c=i<200?1:i>500?.4:-.0016668*i+1.233334;let l=o.maxRandomnessOffset||0;l*l*100>r&&(l=i/10);const u=l/2,p=.2+.2*W(o);let f=o.bowing*o.maxRandomnessOffset*(n-e)/200,d=o.bowing*o.maxRandomnessOffset*(t-s)/200;f=G(f,o,c),d=G(d,o,c);const g=[],M=()=>G(u,o,c),k=()=>G(l,o,c),b=o.preserveVertices;return a&&(h?g.push({op:"move",data:[t+(b?0:M()),e+(b?0:M())]}):g.push({op:"move",data:[t+(b?0:G(l,o,c)),e+(b?0:G(l,o,c))]})),h?g.push({op:"bcurveTo",data:[f+t+(s-t)*p+M(),d+e+(n-e)*p+M(),f+t+2*(s-t)*p+M(),d+e+2*(n-e)*p+M(),s+(b?0:M()),n+(b?0:M())]}):g.push({op:"bcurveTo",data:[f+t+(s-t)*p+k(),d+e+(n-e)*p+k(),f+t+2*(s-t)*p+k(),d+e+2*(n-e)*p+k(),s+(b?0:k()),n+(b?0:k())]}),g}function j(t,e,s){if(!t.length)return[];const n=[];n.push([t[0][0]+G(e,s),t[0][1]+G(e,s)]),n.push([t[0][0]+G(e,s),t[0][1]+G(e,s)]);for(let o=1;o<t.length;o++)n.push([t[o][0]+G(e,s),t[o][1]+G(e,s)]),o===t.length-1&&n.push([t[o][0]+G(e,s),t[o][1]+G(e,s)]);return q(n,null,s)}function q(t,e,s){const n=t.length,o=[];if(n>3){const a=[],h=1-s.curveTightness;o.push({op:"move",data:[t[1][0],t[1][1]]});for(let e=1;e+2<n;e++){const s=t[e];a[0]=[s[0],s[1]],a[1]=[s[0]+(h*t[e+1][0]-h*t[e-1][0])/6,s[1]+(h*t[e+1][1]-h*t[e-1][1])/6],a[2]=[t[e+1][0]+(h*t[e][0]-h*t[e+2][0])/6,t[e+1][1]+(h*t[e][1]-h*t[e+2][1])/6],a[3]=[t[e+1][0],t[e+1][1]],o.push({op:"bcurveTo",data:[a[1][0],a[1][1],a[2][0],a[2][1],a[3][0],a[3][1]]})}if(e&&2===e.length){const t=s.maxRandomnessOffset;o.push({op:"lineTo",data:[e[0]+G(t,s),e[1]+G(t,s)]})}}else 3===n?(o.push({op:"move",data:[t[1][0],t[1][1]]}),o.push({op:"bcurveTo",data:[t[1][0],t[1][1],t[2][0],t[2][1],t[2][0],t[2][1]]})):2===n&&o.push(...R(t[0][0],t[0][1],t[1][0],t[1][1],s,!0,!0));return o}function F(t,e,s,n,o,a,h,r){const i=[],c=[];if(0===r.roughness){t/=4,c.push([e+n*Math.cos(-t),s+o*Math.sin(-t)]);for(let a=0;a<=2*Math.PI;a+=t){const t=[e+n*Math.cos(a),s+o*Math.sin(a)];i.push(t),c.push(t)}c.push([e+n*Math.cos(0),s+o*Math.sin(0)]),c.push([e+n*Math.cos(t),s+o*Math.sin(t)])}else{const l=G(.5,r)-Math.PI/2;c.push([G(a,r)+e+.9*n*Math.cos(l-t),G(a,r)+s+.9*o*Math.sin(l-t)]);const u=2*Math.PI+l-.01;for(let h=l;h<u;h+=t){const t=[G(a,r)+e+n*Math.cos(h),G(a,r)+s+o*Math.sin(h)];i.push(t),c.push(t)}c.push([G(a,r)+e+n*Math.cos(l+2*Math.PI+.5*h),G(a,r)+s+o*Math.sin(l+2*Math.PI+.5*h)]),c.push([G(a,r)+e+.98*n*Math.cos(l+h),G(a,r)+s+.98*o*Math.sin(l+h)]),c.push([G(a,r)+e+.9*n*Math.cos(l+.5*h),G(a,r)+s+.9*o*Math.sin(l+.5*h)])}return[c,i]}function V(t,e,s,n,o,a,h,r,i){const c=a+G(.1,i),l=[];l.push([G(r,i)+e+.9*n*Math.cos(c-t),G(r,i)+s+.9*o*Math.sin(c-t)]);for(let a=c;a<=h;a+=t)l.push([G(r,i)+e+n*Math.cos(a),G(r,i)+s+o*Math.sin(a)]);return l.push([e+n*Math.cos(h),s+o*Math.sin(h)]),l.push([e+n*Math.cos(h),s+o*Math.sin(h)]),q(l,null,i)}function Z(t,e,s,n,o,a,h,r){const i=[],c=[r.maxRandomnessOffset||1,(r.maxRandomnessOffset||1)+.3];let l=[0,0];const u=r.disableMultiStroke?1:2,p=r.preserveVertices;for(let f=0;f<u;f++)0===f?i.push({op:"move",data:[h[0],h[1]]}):i.push({op:"move",data:[h[0]+(p?0:G(c[0],r)),h[1]+(p?0:G(c[0],r))]}),l=p?[o,a]:[o+G(c[f],r),a+G(c[f],r)],i.push({op:"bcurveTo",data:[t+G(c[f],r),e+G(c[f],r),s+G(c[f],r),n+G(c[f],r),l[0],l[1]]});return i}function Q(t){return[...t]}function H(t,e=0){const s=t.length;if(s<3)throw new Error("A curve must have at least three points.");const n=[];if(3===s)n.push(Q(t[0]),Q(t[1]),Q(t[2]),Q(t[2]));else{const s=[];s.push(t[0],t[0]);for(let e=1;e<t.length;e++)s.push(t[e]),e===t.length-1&&s.push(t[e]);const o=[],a=1-e;n.push(Q(s[0]));for(let t=1;t+2<s.length;t++){const e=s[t];o[0]=[e[0],e[1]],o[1]=[e[0]+(a*s[t+1][0]-a*s[t-1][0])/6,e[1]+(a*s[t+1][1]-a*s[t-1][1])/6],o[2]=[s[t+1][0]+(a*s[t][0]-a*s[t+2][0])/6,s[t+1][1]+(a*s[t][1]-a*s[t+2][1])/6],o[3]=[s[t+1][0],s[t+1][1]],n.push(o[1],o[2],o[3])}}return n}function N(t,e){return Math.pow(t[0]-e[0],2)+Math.pow(t[1]-e[1],2)}function B(t,e,s){const n=N(e,s);if(0===n)return N(t,e);let o=((t[0]-e[0])*(s[0]-e[0])+(t[1]-e[1])*(s[1]-e[1]))/n;return o=Math.max(0,Math.min(1,o)),N(t,J(e,s,o))}function J(t,e,s){return[t[0]+(e[0]-t[0])*s,t[1]+(e[1]-t[1])*s]}function K(t,e,s,n){const o=n||[];if(function(t,e){const s=t[e+0],n=t[e+1],o=t[e+2],a=t[e+3];let h=3*n[0]-2*s[0]-a[0];h*=h;let r=3*n[1]-2*s[1]-a[1];r*=r;let i=3*o[0]-2*a[0]-s[0];i*=i;let c=3*o[1]-2*a[1]-s[1];return c*=c,h<i&&(h=i),r<c&&(r=c),h+r}(t,e)<s){const s=t[e+0];if(o.length){(a=o[o.length-1],h=s,Math.sqrt(N(a,h)))>1&&o.push(s)}else o.push(s);o.push(t[e+3])}else{const n=.5,a=t[e+0],h=t[e+1],r=t[e+2],i=t[e+3],c=J(a,h,n),l=J(h,r,n),u=J(r,i,n),p=J(c,l,n),f=J(l,u,n),d=J(p,f,n);K([a,c,p,d],0,s,o),K([d,f,u,i],0,s,o)}var a,h;return o}function U(t,e){return X(t,0,t.length,e)}function X(t,e,s,n,o){const a=o||[],h=t[e],r=t[s-1];let i=0,c=1;for(let n=e+1;n<s-1;++n){const e=B(t[n],h,r);e>i&&(i=e,c=n)}return Math.sqrt(i)>n?(X(t,e,c+1,n,a),X(t,c,s,n,a)):(a.length||a.push(h),a.push(r)),a}function Y(t,e=.15,s){const n=[],o=(t.length-1)/3;for(let s=0;s<o;s++){K(t,3*s,e,n)}return s&&s>0?X(n,0,n.length,s):n}const tt="none";class et{constructor(t){this.defaultOptions={maxRandomnessOffset:2,roughness:1,bowing:1,stroke:"#000",strokeWidth:1,curveTightness:0,curveFitting:.95,curveStepCount:9,fillStyle:"hachure",fillWeight:-1,hachureAngle:-41,hachureGap:-1,dashOffset:-1,dashGap:-1,zigzagOffset:-1,seed:0,disableMultiStroke:!1,disableMultiStrokeFill:!1,preserveVertices:!1,fillShapeRoughnessGain:.8},this.config=t||{},this.config.options&&(this.defaultOptions=this._o(this.config.options))}static newSeed(){return Math.floor(Math.random()*2**31)}_o(t){return t?Object.assign({},this.defaultOptions,t):this.defaultOptions}_d(t,e,s){return{shape:t,sets:e||[],options:s||this.defaultOptions}}line(t,e,s,n,o){const a=this._o(o);return this._d("line",[rough_esm_v(t,e,s,n,a)],a)}rectangle(t,e,s,n,o){const a=this._o(o),h=[],r=rough_esm_O(t,e,s,n,a);if(a.fill){const o=[[t,e],[t+s,e],[t+s,e+n],[t,e+n]];"solid"===a.fillStyle?h.push(I([o],a)):h.push(C([o],a))}return a.stroke!==tt&&h.push(r),this._d("rectangle",h,a)}ellipse(t,e,s,n,o){const a=this._o(o),h=[],r=rough_esm_T(s,n,a),i=rough_esm_D(t,e,a,r);if(a.fill)if("solid"===a.fillStyle){const s=rough_esm_D(t,e,a,r).opset;s.type="fillPath",h.push(s)}else h.push(C([i.estimatedPoints],a));return a.stroke!==tt&&h.push(i.opset),this._d("ellipse",h,a)}circle(t,e,s,n){const o=this.ellipse(t,e,s,s,n);return o.shape="circle",o}linearPath(t,e){const s=this._o(e);return this._d("linearPath",[rough_esm_S(t,!1,s)],s)}arc(t,e,s,n,o,a,h=!1,r){const i=this._o(r),c=[],l=rough_esm_A(t,e,s,n,o,a,h,!0,i);if(h&&i.fill)if("solid"===i.fillStyle){const h=Object.assign({},i);h.disableMultiStroke=!0;const r=rough_esm_A(t,e,s,n,o,a,!0,!1,h);r.type="fillPath",c.push(r)}else c.push(function(t,e,s,n,o,a,h){const r=t,i=e;let c=Math.abs(s/2),l=Math.abs(n/2);c+=G(.01*c,h),l+=G(.01*l,h);let u=o,p=a;for(;u<0;)u+=2*Math.PI,p+=2*Math.PI;p-u>2*Math.PI&&(u=0,p=2*Math.PI);const f=(p-u)/h.curveStepCount,d=[];for(let t=u;t<=p;t+=f)d.push([r+c*Math.cos(t),i+l*Math.sin(t)]);return d.push([r+c*Math.cos(p),i+l*Math.sin(p)]),d.push([r,i]),C([d],h)}(t,e,s,n,o,a,i));return i.stroke!==tt&&c.push(l),this._d("arc",c,i)}curve(t,e){const s=this._o(e),n=[],o=rough_esm_L(t,s);if(s.fill&&s.fill!==tt)if("solid"===s.fillStyle){const e=rough_esm_L(t,Object.assign(Object.assign({},s),{disableMultiStroke:!0,roughness:s.roughness?s.roughness+s.fillShapeRoughnessGain:0}));n.push({type:"fillPath",ops:this._mergedShape(e.ops)})}else{const e=[],o=t;if(o.length){const t="number"==typeof o[0][0]?[o]:o;for(const n of t)n.length<3?e.push(...n):3===n.length?e.push(...Y(H([n[0],n[0],n[1],n[2]]),10,(1+s.roughness)/2)):e.push(...Y(H(n),10,(1+s.roughness)/2))}e.length&&n.push(C([e],s))}return s.stroke!==tt&&n.push(o),this._d("curve",n,s)}polygon(t,e){const s=this._o(e),n=[],o=rough_esm_S(t,!0,s);return s.fill&&("solid"===s.fillStyle?n.push(I([t],s)):n.push(C([t],s))),s.stroke!==tt&&n.push(o),this._d("polygon",n,s)}path(t,e){const s=this._o(e),n=[];if(!t)return this._d("path",n,s);t=(t||"").replace(/\n/g," ").replace(/(-\s)/g,"-").replace("/(ss)/g"," ");const o=s.fill&&"transparent"!==s.fill&&s.fill!==tt,a=s.stroke!==tt,h=!!(s.simplification&&s.simplification<1),r=function(t,e,s){const n=rough_esm_m(rough_esm_y(rough_esm_b(t))),o=[];let a=[],h=[0,0],r=[];const i=()=>{r.length>=4&&a.push(...Y(r,e)),r=[]},c=()=>{i(),a.length&&(o.push(a),a=[])};for(const{key:t,data:e}of n)switch(t){case"M":c(),h=[e[0],e[1]],a.push(h);break;case"L":i(),a.push([e[0],e[1]]);break;case"C":if(!r.length){const t=a.length?a[a.length-1]:h;r.push([t[0],t[1]])}r.push([e[0],e[1]]),r.push([e[2],e[3]]),r.push([e[4],e[5]]);break;case"Z":i(),a.push([h[0],h[1]])}if(c(),!s)return o;const l=[];for(const t of o){const e=U(t,s);e.length&&l.push(e)}return l}(t,1,h?4-4*(s.simplification||1):(1+s.roughness)/2),i=_(t,s);if(o)if("solid"===s.fillStyle)if(1===r.length){const e=_(t,Object.assign(Object.assign({},s),{disableMultiStroke:!0,roughness:s.roughness?s.roughness+s.fillShapeRoughnessGain:0}));n.push({type:"fillPath",ops:this._mergedShape(e.ops)})}else n.push(I(r,s));else n.push(C(r,s));return a&&(h?r.forEach((t=>{n.push(rough_esm_S(t,!1,s))})):n.push(i)),this._d("path",n,s)}opsToPath(t,e){let s="";for(const n of t.ops){const t="number"==typeof e&&e>=0?n.data.map((t=>+t.toFixed(e))):n.data;switch(n.op){case"move":s+=`M${t[0]} ${t[1]} `;break;case"bcurveTo":s+=`C${t[0]} ${t[1]}, ${t[2]} ${t[3]}, ${t[4]} ${t[5]} `;break;case"lineTo":s+=`L${t[0]} ${t[1]} `}}return s.trim()}toPaths(t){const e=t.sets||[],s=t.options||this.defaultOptions,n=[];for(const t of e){let e=null;switch(t.type){case"path":e={d:this.opsToPath(t),stroke:s.stroke,strokeWidth:s.strokeWidth,fill:tt};break;case"fillPath":e={d:this.opsToPath(t),stroke:tt,strokeWidth:0,fill:s.fill||tt};break;case"fillSketch":e=this.fillSketch(t,s)}e&&n.push(e)}return n}fillSketch(t,e){let s=e.fillWeight;return s<0&&(s=e.strokeWidth/2),{d:this.opsToPath(t),stroke:e.fill||tt,strokeWidth:s,fill:tt}}_mergedShape(t){return t.filter(((t,e)=>0===e||"move"!==t.op))}}class st{constructor(t,e){this.canvas=t,this.ctx=this.canvas.getContext("2d"),this.gen=new et(e)}draw(t){const e=t.sets||[],s=t.options||this.getDefaultOptions(),n=this.ctx,o=t.options.fixedDecimalPlaceDigits;for(const a of e)switch(a.type){case"path":n.save(),n.strokeStyle="none"===s.stroke?"transparent":s.stroke,n.lineWidth=s.strokeWidth,s.strokeLineDash&&n.setLineDash(s.strokeLineDash),s.strokeLineDashOffset&&(n.lineDashOffset=s.strokeLineDashOffset),this._drawToContext(n,a,o),n.restore();break;case"fillPath":{n.save(),n.fillStyle=s.fill||"";const e="curve"===t.shape||"polygon"===t.shape||"path"===t.shape?"evenodd":"nonzero";this._drawToContext(n,a,o,e),n.restore();break}case"fillSketch":this.fillSketch(n,a,s)}}fillSketch(t,e,s){let n=s.fillWeight;n<0&&(n=s.strokeWidth/2),t.save(),s.fillLineDash&&t.setLineDash(s.fillLineDash),s.fillLineDashOffset&&(t.lineDashOffset=s.fillLineDashOffset),t.strokeStyle=s.fill||"",t.lineWidth=n,this._drawToContext(t,e,s.fixedDecimalPlaceDigits),t.restore()}_drawToContext(t,e,s,n="nonzero"){t.beginPath();for(const n of e.ops){const e="number"==typeof s&&s>=0?n.data.map((t=>+t.toFixed(s))):n.data;switch(n.op){case"move":t.moveTo(e[0],e[1]);break;case"bcurveTo":t.bezierCurveTo(e[0],e[1],e[2],e[3],e[4],e[5]);break;case"lineTo":t.lineTo(e[0],e[1])}}"fillPath"===e.type?t.fill(n):t.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(t,e,s,n,o){const a=this.gen.line(t,e,s,n,o);return this.draw(a),a}rectangle(t,e,s,n,o){const a=this.gen.rectangle(t,e,s,n,o);return this.draw(a),a}ellipse(t,e,s,n,o){const a=this.gen.ellipse(t,e,s,n,o);return this.draw(a),a}circle(t,e,s,n){const o=this.gen.circle(t,e,s,n);return this.draw(o),o}linearPath(t,e){const s=this.gen.linearPath(t,e);return this.draw(s),s}polygon(t,e){const s=this.gen.polygon(t,e);return this.draw(s),s}arc(t,e,s,n,o,a,h=!1,r){const i=this.gen.arc(t,e,s,n,o,a,h,r);return this.draw(i),i}curve(t,e){const s=this.gen.curve(t,e);return this.draw(s),s}path(t,e){const s=this.gen.path(t,e);return this.draw(s),s}}const nt="http://www.w3.org/2000/svg";class ot{constructor(t,e){this.svg=t,this.gen=new et(e)}draw(t){const e=t.sets||[],s=t.options||this.getDefaultOptions(),n=this.svg.ownerDocument||window.document,o=n.createElementNS(nt,"g"),a=t.options.fixedDecimalPlaceDigits;for(const h of e){let e=null;switch(h.type){case"path":e=n.createElementNS(nt,"path"),e.setAttribute("d",this.opsToPath(h,a)),e.setAttribute("stroke",s.stroke),e.setAttribute("stroke-width",s.strokeWidth+""),e.setAttribute("fill","none"),s.strokeLineDash&&e.setAttribute("stroke-dasharray",s.strokeLineDash.join(" ").trim()),s.strokeLineDashOffset&&e.setAttribute("stroke-dashoffset",`${s.strokeLineDashOffset}`);break;case"fillPath":e=n.createElementNS(nt,"path"),e.setAttribute("d",this.opsToPath(h,a)),e.setAttribute("stroke","none"),e.setAttribute("stroke-width","0"),e.setAttribute("fill",s.fill||""),"curve"!==t.shape&&"polygon"!==t.shape||e.setAttribute("fill-rule","evenodd");break;case"fillSketch":e=this.fillSketch(n,h,s)}e&&o.appendChild(e)}return o}fillSketch(t,e,s){let n=s.fillWeight;n<0&&(n=s.strokeWidth/2);const o=t.createElementNS(nt,"path");return o.setAttribute("d",this.opsToPath(e,s.fixedDecimalPlaceDigits)),o.setAttribute("stroke",s.fill||""),o.setAttribute("stroke-width",n+""),o.setAttribute("fill","none"),s.fillLineDash&&o.setAttribute("stroke-dasharray",s.fillLineDash.join(" ").trim()),s.fillLineDashOffset&&o.setAttribute("stroke-dashoffset",`${s.fillLineDashOffset}`),o}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(t,e){return this.gen.opsToPath(t,e)}line(t,e,s,n,o){const a=this.gen.line(t,e,s,n,o);return this.draw(a)}rectangle(t,e,s,n,o){const a=this.gen.rectangle(t,e,s,n,o);return this.draw(a)}ellipse(t,e,s,n,o){const a=this.gen.ellipse(t,e,s,n,o);return this.draw(a)}circle(t,e,s,n){const o=this.gen.circle(t,e,s,n);return this.draw(o)}linearPath(t,e){const s=this.gen.linearPath(t,e);return this.draw(s)}polygon(t,e){const s=this.gen.polygon(t,e);return this.draw(s)}arc(t,e,s,n,o,a,h=!1,r){const i=this.gen.arc(t,e,s,n,o,a,h,r);return this.draw(i)}curve(t,e){const s=this.gen.curve(t,e);return this.draw(s)}path(t,e){const s=this.gen.path(t,e);return this.draw(s)}}var at={canvas:(t,e)=>new st(t,e),svg:(t,e)=>new ot(t,e),generator:t=>new et(t),newSeed:()=>et.newSeed()};
335
313
 
@@ -362,303 +340,9 @@ function rough_esm_t(t,e,s){if(t&&t.length){const[n,o]=e,a=Math.PI/180*s,h=Math.
362
340
  }
363
341
  }
364
342
 
365
- ;// CONCATENATED MODULE: ./src/rough-emoji.ts
366
-
343
+ ;// CONCATENATED MODULE: ./src/flag-drawers.ts
367
344
 
368
345
 
369
- /** 绘制流程封装实例,外部入口只需要把已解析的国旗交给它。 */ let renderer;
370
- /** 页面和 QA 工具共享的绘制门面:输入 emoji,输出到指定 canvas。 */ const RoughEmoji = {
371
- draw (canvasElement, value) {
372
- withCanvas(canvasElement, ()=>renderer.draw(resolveFlag(value)));
373
- },
374
- isFlagEmoji: isFlagEmoji,
375
- resolveFlag: resolveFlag
376
- };
377
- /** 国旗绘制器:负责清理画布、绘制纸张背景、模板分发和 fallback。 */ class RoughEmojiRenderer {
378
- /** 专门模板分发表:每个标准国旗都有独立绘制入口,避免大量 if 分支。 */ templateDrawers = {
379
- // 独占
380
- [TEMPLATE_FLAGS.australia]: drawAustraliaFlag,
381
- [TEMPLATE_FLAGS.china]: drawChinaFlag,
382
- [TEMPLATE_FLAGS.spain]: drawSpainFlag,
383
- [TEMPLATE_FLAGS.france]: drawFranceFlag,
384
- [TEMPLATE_FLAGS.italy]: drawItalyFlag,
385
- [TEMPLATE_FLAGS.japan]: drawJapanFlag,
386
- [TEMPLATE_FLAGS.thailand]: drawThailandFlag,
387
- [TEMPLATE_FLAGS.unitedStates]: drawUnitedStatesFlag,
388
- [TEMPLATE_FLAGS.vatican]: drawVaticanFlag,
389
- // 待处理
390
- [TEMPLATE_FLAGS.ad]: drawAdFlag,
391
- [TEMPLATE_FLAGS.ae]: drawAeFlag,
392
- [TEMPLATE_FLAGS.af]: drawAfFlag,
393
- [TEMPLATE_FLAGS.ag]: drawAgFlag,
394
- [TEMPLATE_FLAGS.ai]: drawAiFlag,
395
- [TEMPLATE_FLAGS.al]: drawAlFlag,
396
- [TEMPLATE_FLAGS.am]: drawAmFlag,
397
- [TEMPLATE_FLAGS.ao]: drawAoFlag,
398
- [TEMPLATE_FLAGS.aq]: drawAqFlag,
399
- [TEMPLATE_FLAGS.ar]: drawArFlag,
400
- [TEMPLATE_FLAGS.as]: drawAsFlag,
401
- [TEMPLATE_FLAGS.at]: drawAtFlag,
402
- [TEMPLATE_FLAGS.aw]: drawAwFlag,
403
- [TEMPLATE_FLAGS.ax]: drawAxFlag,
404
- [TEMPLATE_FLAGS.az]: drawAzFlag,
405
- [TEMPLATE_FLAGS.ba]: drawBaFlag,
406
- [TEMPLATE_FLAGS.bb]: drawBbFlag,
407
- [TEMPLATE_FLAGS.bd]: drawBdFlag,
408
- [TEMPLATE_FLAGS.be]: drawBeFlag,
409
- [TEMPLATE_FLAGS.bf]: drawBfFlag,
410
- [TEMPLATE_FLAGS.bg]: drawBgFlag,
411
- [TEMPLATE_FLAGS.bh]: drawBhFlag,
412
- [TEMPLATE_FLAGS.bi]: drawBiFlag,
413
- [TEMPLATE_FLAGS.bj]: drawBjFlag,
414
- [TEMPLATE_FLAGS.bl]: drawBlFlag,
415
- [TEMPLATE_FLAGS.bm]: drawBmFlag,
416
- [TEMPLATE_FLAGS.bn]: drawBnFlag,
417
- [TEMPLATE_FLAGS.bo]: drawBoFlag,
418
- [TEMPLATE_FLAGS.bq]: drawBqFlag,
419
- [TEMPLATE_FLAGS.br]: drawBrFlag,
420
- [TEMPLATE_FLAGS.bs]: drawBsFlag,
421
- [TEMPLATE_FLAGS.bt]: drawBtFlag,
422
- [TEMPLATE_FLAGS.bv]: drawBvFlag,
423
- [TEMPLATE_FLAGS.bw]: drawBwFlag,
424
- [TEMPLATE_FLAGS.by]: drawByFlag,
425
- [TEMPLATE_FLAGS.bz]: drawBzFlag,
426
- [TEMPLATE_FLAGS.ca]: drawCaFlag,
427
- [TEMPLATE_FLAGS.cc]: drawCcFlag,
428
- [TEMPLATE_FLAGS.cd]: drawCdFlag,
429
- [TEMPLATE_FLAGS.cf]: drawCfFlag,
430
- [TEMPLATE_FLAGS.cg]: drawCgFlag,
431
- [TEMPLATE_FLAGS.ch]: drawChFlag,
432
- [TEMPLATE_FLAGS.ci]: drawCiFlag,
433
- [TEMPLATE_FLAGS.ck]: drawCkFlag,
434
- [TEMPLATE_FLAGS.cl]: drawClFlag,
435
- [TEMPLATE_FLAGS.cm]: drawCmFlag,
436
- [TEMPLATE_FLAGS.co]: drawCoFlag,
437
- [TEMPLATE_FLAGS.cr]: drawCrFlag,
438
- [TEMPLATE_FLAGS.cu]: drawCuFlag,
439
- [TEMPLATE_FLAGS.cv]: drawCvFlag,
440
- [TEMPLATE_FLAGS.cw]: drawCwFlag,
441
- [TEMPLATE_FLAGS.cx]: drawCxFlag,
442
- [TEMPLATE_FLAGS.cy]: drawCyFlag,
443
- [TEMPLATE_FLAGS.cz]: drawCzFlag,
444
- [TEMPLATE_FLAGS.de]: drawDeFlag,
445
- [TEMPLATE_FLAGS.dj]: drawDjFlag,
446
- [TEMPLATE_FLAGS.dk]: drawDkFlag,
447
- [TEMPLATE_FLAGS.dm]: drawDmFlag,
448
- [TEMPLATE_FLAGS["do"]]: drawDoFlag,
449
- [TEMPLATE_FLAGS.dz]: drawDzFlag,
450
- [TEMPLATE_FLAGS.ec]: drawEcFlag,
451
- [TEMPLATE_FLAGS.ee]: drawEeFlag,
452
- [TEMPLATE_FLAGS.eg]: drawEgFlag,
453
- [TEMPLATE_FLAGS.eh]: drawEhFlag,
454
- [TEMPLATE_FLAGS.er]: drawErFlag,
455
- [TEMPLATE_FLAGS.et]: drawEtFlag,
456
- [TEMPLATE_FLAGS.fi]: drawFiFlag,
457
- [TEMPLATE_FLAGS.fj]: drawFjFlag,
458
- [TEMPLATE_FLAGS.fk]: drawFkFlag,
459
- [TEMPLATE_FLAGS.fm]: drawFmFlag,
460
- [TEMPLATE_FLAGS.fo]: drawFoFlag,
461
- [TEMPLATE_FLAGS.ga]: drawGaFlag,
462
- [TEMPLATE_FLAGS.gb]: drawGbFlag,
463
- [TEMPLATE_FLAGS.gd]: drawGdFlag,
464
- [TEMPLATE_FLAGS.ge]: drawGeFlag,
465
- [TEMPLATE_FLAGS.gf]: drawGfFlag,
466
- [TEMPLATE_FLAGS.gg]: drawGgFlag,
467
- [TEMPLATE_FLAGS.gh]: drawGhFlag,
468
- [TEMPLATE_FLAGS.gi]: drawGiFlag,
469
- [TEMPLATE_FLAGS.gl]: drawGlFlag,
470
- [TEMPLATE_FLAGS.gm]: drawGmFlag,
471
- [TEMPLATE_FLAGS.gn]: drawGnFlag,
472
- [TEMPLATE_FLAGS.gp]: drawGpFlag,
473
- [TEMPLATE_FLAGS.gq]: drawGqFlag,
474
- [TEMPLATE_FLAGS.gr]: drawGrFlag,
475
- [TEMPLATE_FLAGS.gs]: drawGsFlag,
476
- [TEMPLATE_FLAGS.gt]: drawGtFlag,
477
- [TEMPLATE_FLAGS.gu]: drawGuFlag,
478
- [TEMPLATE_FLAGS.gw]: drawGwFlag,
479
- [TEMPLATE_FLAGS.gy]: drawGyFlag,
480
- [TEMPLATE_FLAGS.hk]: drawHkFlag,
481
- [TEMPLATE_FLAGS.hm]: drawHmFlag,
482
- [TEMPLATE_FLAGS.hn]: drawHnFlag,
483
- [TEMPLATE_FLAGS.hr]: drawHrFlag,
484
- [TEMPLATE_FLAGS.ht]: drawHtFlag,
485
- [TEMPLATE_FLAGS.hu]: drawHuFlag,
486
- [TEMPLATE_FLAGS.id]: drawIdFlag,
487
- [TEMPLATE_FLAGS.ie]: drawIeFlag,
488
- [TEMPLATE_FLAGS.il]: drawIlFlag,
489
- [TEMPLATE_FLAGS.im]: drawImFlag,
490
- [TEMPLATE_FLAGS["in"]]: drawInFlag,
491
- [TEMPLATE_FLAGS.io]: drawIoFlag,
492
- [TEMPLATE_FLAGS.iq]: drawIqFlag,
493
- [TEMPLATE_FLAGS.ir]: drawIrFlag,
494
- [TEMPLATE_FLAGS.is]: drawIsFlag,
495
- [TEMPLATE_FLAGS.je]: drawJeFlag,
496
- [TEMPLATE_FLAGS.jm]: drawJmFlag,
497
- [TEMPLATE_FLAGS.jo]: drawJoFlag,
498
- [TEMPLATE_FLAGS.ke]: drawKeFlag,
499
- [TEMPLATE_FLAGS.kg]: drawKgFlag,
500
- [TEMPLATE_FLAGS.kh]: drawKhFlag,
501
- [TEMPLATE_FLAGS.ki]: drawKiFlag,
502
- [TEMPLATE_FLAGS.km]: drawKmFlag,
503
- [TEMPLATE_FLAGS.kn]: drawKnFlag,
504
- [TEMPLATE_FLAGS.kp]: drawKpFlag,
505
- [TEMPLATE_FLAGS.kr]: drawKrFlag,
506
- [TEMPLATE_FLAGS.kw]: drawKwFlag,
507
- [TEMPLATE_FLAGS.ky]: drawKyFlag,
508
- [TEMPLATE_FLAGS.kz]: drawKzFlag,
509
- [TEMPLATE_FLAGS.la]: drawLaFlag,
510
- [TEMPLATE_FLAGS.lb]: drawLbFlag,
511
- [TEMPLATE_FLAGS.lc]: drawLcFlag,
512
- [TEMPLATE_FLAGS.li]: drawLiFlag,
513
- [TEMPLATE_FLAGS.lk]: drawLkFlag,
514
- [TEMPLATE_FLAGS.lr]: drawLrFlag,
515
- [TEMPLATE_FLAGS.ls]: drawLsFlag,
516
- [TEMPLATE_FLAGS.lt]: drawLtFlag,
517
- [TEMPLATE_FLAGS.lu]: drawLuFlag,
518
- [TEMPLATE_FLAGS.lv]: drawLvFlag,
519
- [TEMPLATE_FLAGS.ly]: drawLyFlag,
520
- [TEMPLATE_FLAGS.ma]: drawMaFlag,
521
- [TEMPLATE_FLAGS.mc]: drawMcFlag,
522
- [TEMPLATE_FLAGS.md]: drawMdFlag,
523
- [TEMPLATE_FLAGS.me]: drawMeFlag,
524
- [TEMPLATE_FLAGS.mf]: drawMfFlag,
525
- [TEMPLATE_FLAGS.mg]: drawMgFlag,
526
- [TEMPLATE_FLAGS.mh]: drawMhFlag,
527
- [TEMPLATE_FLAGS.mk]: drawMkFlag,
528
- [TEMPLATE_FLAGS.ml]: drawMlFlag,
529
- [TEMPLATE_FLAGS.mm]: drawMmFlag,
530
- [TEMPLATE_FLAGS.mn]: drawMnFlag,
531
- [TEMPLATE_FLAGS.mo]: drawMoFlag,
532
- [TEMPLATE_FLAGS.mp]: drawMpFlag,
533
- [TEMPLATE_FLAGS.mq]: drawMqFlag,
534
- [TEMPLATE_FLAGS.mr]: drawMrFlag,
535
- [TEMPLATE_FLAGS.ms]: drawMsFlag,
536
- [TEMPLATE_FLAGS.mt]: drawMtFlag,
537
- [TEMPLATE_FLAGS.mu]: drawMuFlag,
538
- [TEMPLATE_FLAGS.mv]: drawMvFlag,
539
- [TEMPLATE_FLAGS.mw]: drawMwFlag,
540
- [TEMPLATE_FLAGS.mx]: drawMxFlag,
541
- [TEMPLATE_FLAGS.my]: drawMyFlag,
542
- [TEMPLATE_FLAGS.mz]: drawMzFlag,
543
- [TEMPLATE_FLAGS.na]: drawNaFlag,
544
- [TEMPLATE_FLAGS.nc]: drawNcFlag,
545
- [TEMPLATE_FLAGS.ne]: drawNeFlag,
546
- [TEMPLATE_FLAGS.nf]: drawNfFlag,
547
- [TEMPLATE_FLAGS.ng]: drawNgFlag,
548
- [TEMPLATE_FLAGS.ni]: drawNiFlag,
549
- [TEMPLATE_FLAGS.nl]: drawNlFlag,
550
- [TEMPLATE_FLAGS.no]: drawNoFlag,
551
- [TEMPLATE_FLAGS.np]: drawNpFlag,
552
- [TEMPLATE_FLAGS.nr]: drawNrFlag,
553
- [TEMPLATE_FLAGS.nu]: drawNuFlag,
554
- [TEMPLATE_FLAGS.nz]: drawNzFlag,
555
- [TEMPLATE_FLAGS.om]: drawOmFlag,
556
- [TEMPLATE_FLAGS.pa]: drawPaFlag,
557
- [TEMPLATE_FLAGS.pe]: drawPeFlag,
558
- [TEMPLATE_FLAGS.pf]: drawPfFlag,
559
- [TEMPLATE_FLAGS.pg]: drawPgFlag,
560
- [TEMPLATE_FLAGS.ph]: drawPhFlag,
561
- [TEMPLATE_FLAGS.pk]: drawPkFlag,
562
- [TEMPLATE_FLAGS.pl]: drawPlFlag,
563
- [TEMPLATE_FLAGS.pm]: drawPmFlag,
564
- [TEMPLATE_FLAGS.pn]: drawPnFlag,
565
- [TEMPLATE_FLAGS.pr]: drawPrFlag,
566
- [TEMPLATE_FLAGS.ps]: drawPsFlag,
567
- [TEMPLATE_FLAGS.pt]: drawPtFlag,
568
- [TEMPLATE_FLAGS.pw]: drawPwFlag,
569
- [TEMPLATE_FLAGS.py]: drawPyFlag,
570
- [TEMPLATE_FLAGS.qa]: drawQaFlag,
571
- [TEMPLATE_FLAGS.re]: drawReFlag,
572
- [TEMPLATE_FLAGS.ro]: drawRoFlag,
573
- [TEMPLATE_FLAGS.rs]: drawRsFlag,
574
- [TEMPLATE_FLAGS.ru]: drawRuFlag,
575
- [TEMPLATE_FLAGS.rw]: drawRwFlag,
576
- [TEMPLATE_FLAGS.sa]: drawSaFlag,
577
- [TEMPLATE_FLAGS.sb]: drawSbFlag,
578
- [TEMPLATE_FLAGS.sc]: drawScFlag,
579
- [TEMPLATE_FLAGS.sd]: drawSdFlag,
580
- [TEMPLATE_FLAGS.se]: drawSeFlag,
581
- [TEMPLATE_FLAGS.sg]: drawSgFlag,
582
- [TEMPLATE_FLAGS.sh]: drawShFlag,
583
- [TEMPLATE_FLAGS.si]: drawSiFlag,
584
- [TEMPLATE_FLAGS.sj]: drawSjFlag,
585
- [TEMPLATE_FLAGS.sk]: drawSkFlag,
586
- [TEMPLATE_FLAGS.sl]: drawSlFlag,
587
- [TEMPLATE_FLAGS.sm]: drawSmFlag,
588
- [TEMPLATE_FLAGS.sn]: drawSnFlag,
589
- [TEMPLATE_FLAGS.so]: drawSoFlag,
590
- [TEMPLATE_FLAGS.sr]: drawSrFlag,
591
- [TEMPLATE_FLAGS.ss]: drawSsFlag,
592
- [TEMPLATE_FLAGS.st]: drawStFlag,
593
- [TEMPLATE_FLAGS.sv]: drawSvFlag,
594
- [TEMPLATE_FLAGS.sx]: drawSxFlag,
595
- [TEMPLATE_FLAGS.sy]: drawSyFlag,
596
- [TEMPLATE_FLAGS.sz]: drawSzFlag,
597
- [TEMPLATE_FLAGS.tc]: drawTcFlag,
598
- [TEMPLATE_FLAGS.td]: drawTdFlag,
599
- [TEMPLATE_FLAGS.tf]: drawTfFlag,
600
- [TEMPLATE_FLAGS.tg]: drawTgFlag,
601
- [TEMPLATE_FLAGS.tj]: drawTjFlag,
602
- [TEMPLATE_FLAGS.tk]: drawTkFlag,
603
- [TEMPLATE_FLAGS.tl]: drawTlFlag,
604
- [TEMPLATE_FLAGS.tm]: drawTmFlag,
605
- [TEMPLATE_FLAGS.tn]: drawTnFlag,
606
- [TEMPLATE_FLAGS.to]: drawToFlag,
607
- [TEMPLATE_FLAGS.tr]: drawTrFlag,
608
- [TEMPLATE_FLAGS.tt]: drawTtFlag,
609
- [TEMPLATE_FLAGS.tv]: drawTvFlag,
610
- [TEMPLATE_FLAGS.tw]: drawChinaFlag,
611
- [TEMPLATE_FLAGS.tz]: drawTzFlag,
612
- [TEMPLATE_FLAGS.ua]: drawUaFlag,
613
- [TEMPLATE_FLAGS.ug]: drawUgFlag,
614
- [TEMPLATE_FLAGS.um]: drawUmFlag,
615
- [TEMPLATE_FLAGS.un]: drawUnFlag,
616
- [TEMPLATE_FLAGS.uy]: drawUyFlag,
617
- [TEMPLATE_FLAGS.uz]: drawUzFlag,
618
- [TEMPLATE_FLAGS.vc]: drawVcFlag,
619
- [TEMPLATE_FLAGS.ve]: drawVeFlag,
620
- [TEMPLATE_FLAGS.vg]: drawVgFlag,
621
- [TEMPLATE_FLAGS.vi]: drawViFlag,
622
- [TEMPLATE_FLAGS.vn]: drawVnFlag,
623
- [TEMPLATE_FLAGS.vu]: drawVuFlag,
624
- [TEMPLATE_FLAGS.wf]: drawWfFlag,
625
- [TEMPLATE_FLAGS.ws]: drawWsFlag,
626
- [TEMPLATE_FLAGS.xk]: drawXkFlag,
627
- [TEMPLATE_FLAGS.ye]: drawYeFlag,
628
- [TEMPLATE_FLAGS.yt]: drawYtFlag,
629
- [TEMPLATE_FLAGS.za]: drawZaFlag,
630
- [TEMPLATE_FLAGS.zm]: drawZmFlag,
631
- [TEMPLATE_FLAGS.zw]: drawZwFlag
632
- };
633
- /** 绘制总入口:先铺纸张背景,再按已知旗帜走专门模板,未知旗帜走像素采样流程。 */ draw(flag) {
634
- this.clearCanvas();
635
- this.drawPaper();
636
- const templateDrawer = this.templateDrawers[flag];
637
- if (templateDrawer) {
638
- templateDrawer();
639
- return;
640
- }
641
- drawGenericFlag(flag);
642
- }
643
- /** 清空当前画布,为下一次完整重绘做准备。 */ clearCanvas() {
644
- ctx.clearRect(0, 0, size, size);
645
- }
646
- /** 绘制统一纸张底色和粗糙边框,给所有旗帜提供一致的手绘载体。 */ drawPaper() {
647
- ctx.fillStyle = PALETTE.paper;
648
- ctx.fillRect(0, 0, size, size);
649
- render_context_roughCanvas.rectangle(46, 46, size - 92, size - 92, {
650
- roughness: 1.4,
651
- bowing: 0.8,
652
- stroke: PALETTE.frame,
653
- strokeWidth: 1.2,
654
- fill: PALETTE.paper,
655
- fillStyle: "hachure",
656
- hachureGap: 24,
657
- fillWeight: 0.28
658
- });
659
- }
660
- }
661
- renderer = new RoughEmojiRenderer();
662
346
  /** 中国国旗模板:红色旗面、布纹、五颗手绘五角星和最终边框。 */ function drawChinaFlag() {
663
347
  const flag = makeSketchRect(118, 174, 486, 342);
664
348
  render_context_roughCanvas.polygon(flag, {
@@ -7489,68 +7173,326 @@ renderer = new RoughEmojiRenderer();
7489
7173
  /** 生成正负范围内的随机偏移,让边缘、点位和线条产生手绘不稳定感。 */ function jitter(amount) {
7490
7174
  return randomBetween(-amount, amount);
7491
7175
  }
7176
+ /** 专门模板分发表:每个标准国旗都有独立绘制入口,避免大量 if 分支。 */ const templateDrawers = {
7177
+ [TEMPLATE_FLAGS.australia]: drawAustraliaFlag,
7178
+ [TEMPLATE_FLAGS.china]: drawChinaFlag,
7179
+ [TEMPLATE_FLAGS.spain]: drawSpainFlag,
7180
+ [TEMPLATE_FLAGS.france]: drawFranceFlag,
7181
+ [TEMPLATE_FLAGS.italy]: drawItalyFlag,
7182
+ [TEMPLATE_FLAGS.japan]: drawJapanFlag,
7183
+ [TEMPLATE_FLAGS.thailand]: drawThailandFlag,
7184
+ [TEMPLATE_FLAGS.unitedStates]: drawUnitedStatesFlag,
7185
+ [TEMPLATE_FLAGS.vatican]: drawVaticanFlag,
7186
+ [TEMPLATE_FLAGS.ad]: drawAdFlag,
7187
+ [TEMPLATE_FLAGS.ae]: drawAeFlag,
7188
+ [TEMPLATE_FLAGS.af]: drawAfFlag,
7189
+ [TEMPLATE_FLAGS.ag]: drawAgFlag,
7190
+ [TEMPLATE_FLAGS.ai]: drawAiFlag,
7191
+ [TEMPLATE_FLAGS.al]: drawAlFlag,
7192
+ [TEMPLATE_FLAGS.am]: drawAmFlag,
7193
+ [TEMPLATE_FLAGS.ao]: drawAoFlag,
7194
+ [TEMPLATE_FLAGS.aq]: drawAqFlag,
7195
+ [TEMPLATE_FLAGS.ar]: drawArFlag,
7196
+ [TEMPLATE_FLAGS.as]: drawAsFlag,
7197
+ [TEMPLATE_FLAGS.at]: drawAtFlag,
7198
+ [TEMPLATE_FLAGS.aw]: drawAwFlag,
7199
+ [TEMPLATE_FLAGS.ax]: drawAxFlag,
7200
+ [TEMPLATE_FLAGS.az]: drawAzFlag,
7201
+ [TEMPLATE_FLAGS.ba]: drawBaFlag,
7202
+ [TEMPLATE_FLAGS.bb]: drawBbFlag,
7203
+ [TEMPLATE_FLAGS.bd]: drawBdFlag,
7204
+ [TEMPLATE_FLAGS.be]: drawBeFlag,
7205
+ [TEMPLATE_FLAGS.bf]: drawBfFlag,
7206
+ [TEMPLATE_FLAGS.bg]: drawBgFlag,
7207
+ [TEMPLATE_FLAGS.bh]: drawBhFlag,
7208
+ [TEMPLATE_FLAGS.bi]: drawBiFlag,
7209
+ [TEMPLATE_FLAGS.bj]: drawBjFlag,
7210
+ [TEMPLATE_FLAGS.bl]: drawBlFlag,
7211
+ [TEMPLATE_FLAGS.bm]: drawBmFlag,
7212
+ [TEMPLATE_FLAGS.bn]: drawBnFlag,
7213
+ [TEMPLATE_FLAGS.bo]: drawBoFlag,
7214
+ [TEMPLATE_FLAGS.bq]: drawBqFlag,
7215
+ [TEMPLATE_FLAGS.br]: drawBrFlag,
7216
+ [TEMPLATE_FLAGS.bs]: drawBsFlag,
7217
+ [TEMPLATE_FLAGS.bt]: drawBtFlag,
7218
+ [TEMPLATE_FLAGS.bv]: drawBvFlag,
7219
+ [TEMPLATE_FLAGS.bw]: drawBwFlag,
7220
+ [TEMPLATE_FLAGS.by]: drawByFlag,
7221
+ [TEMPLATE_FLAGS.bz]: drawBzFlag,
7222
+ [TEMPLATE_FLAGS.ca]: drawCaFlag,
7223
+ [TEMPLATE_FLAGS.cc]: drawCcFlag,
7224
+ [TEMPLATE_FLAGS.cd]: drawCdFlag,
7225
+ [TEMPLATE_FLAGS.cf]: drawCfFlag,
7226
+ [TEMPLATE_FLAGS.cg]: drawCgFlag,
7227
+ [TEMPLATE_FLAGS.ch]: drawChFlag,
7228
+ [TEMPLATE_FLAGS.ci]: drawCiFlag,
7229
+ [TEMPLATE_FLAGS.ck]: drawCkFlag,
7230
+ [TEMPLATE_FLAGS.cl]: drawClFlag,
7231
+ [TEMPLATE_FLAGS.cm]: drawCmFlag,
7232
+ [TEMPLATE_FLAGS.co]: drawCoFlag,
7233
+ [TEMPLATE_FLAGS.cr]: drawCrFlag,
7234
+ [TEMPLATE_FLAGS.cu]: drawCuFlag,
7235
+ [TEMPLATE_FLAGS.cv]: drawCvFlag,
7236
+ [TEMPLATE_FLAGS.cw]: drawCwFlag,
7237
+ [TEMPLATE_FLAGS.cx]: drawCxFlag,
7238
+ [TEMPLATE_FLAGS.cy]: drawCyFlag,
7239
+ [TEMPLATE_FLAGS.cz]: drawCzFlag,
7240
+ [TEMPLATE_FLAGS.de]: drawDeFlag,
7241
+ [TEMPLATE_FLAGS.dj]: drawDjFlag,
7242
+ [TEMPLATE_FLAGS.dk]: drawDkFlag,
7243
+ [TEMPLATE_FLAGS.dm]: drawDmFlag,
7244
+ [TEMPLATE_FLAGS["do"]]: drawDoFlag,
7245
+ [TEMPLATE_FLAGS.dz]: drawDzFlag,
7246
+ [TEMPLATE_FLAGS.ec]: drawEcFlag,
7247
+ [TEMPLATE_FLAGS.ee]: drawEeFlag,
7248
+ [TEMPLATE_FLAGS.eg]: drawEgFlag,
7249
+ [TEMPLATE_FLAGS.eh]: drawEhFlag,
7250
+ [TEMPLATE_FLAGS.er]: drawErFlag,
7251
+ [TEMPLATE_FLAGS.et]: drawEtFlag,
7252
+ [TEMPLATE_FLAGS.fi]: drawFiFlag,
7253
+ [TEMPLATE_FLAGS.fj]: drawFjFlag,
7254
+ [TEMPLATE_FLAGS.fk]: drawFkFlag,
7255
+ [TEMPLATE_FLAGS.fm]: drawFmFlag,
7256
+ [TEMPLATE_FLAGS.fo]: drawFoFlag,
7257
+ [TEMPLATE_FLAGS.ga]: drawGaFlag,
7258
+ [TEMPLATE_FLAGS.gb]: drawGbFlag,
7259
+ [TEMPLATE_FLAGS.gd]: drawGdFlag,
7260
+ [TEMPLATE_FLAGS.ge]: drawGeFlag,
7261
+ [TEMPLATE_FLAGS.gf]: drawGfFlag,
7262
+ [TEMPLATE_FLAGS.gg]: drawGgFlag,
7263
+ [TEMPLATE_FLAGS.gh]: drawGhFlag,
7264
+ [TEMPLATE_FLAGS.gi]: drawGiFlag,
7265
+ [TEMPLATE_FLAGS.gl]: drawGlFlag,
7266
+ [TEMPLATE_FLAGS.gm]: drawGmFlag,
7267
+ [TEMPLATE_FLAGS.gn]: drawGnFlag,
7268
+ [TEMPLATE_FLAGS.gp]: drawGpFlag,
7269
+ [TEMPLATE_FLAGS.gq]: drawGqFlag,
7270
+ [TEMPLATE_FLAGS.gr]: drawGrFlag,
7271
+ [TEMPLATE_FLAGS.gs]: drawGsFlag,
7272
+ [TEMPLATE_FLAGS.gt]: drawGtFlag,
7273
+ [TEMPLATE_FLAGS.gu]: drawGuFlag,
7274
+ [TEMPLATE_FLAGS.gw]: drawGwFlag,
7275
+ [TEMPLATE_FLAGS.gy]: drawGyFlag,
7276
+ [TEMPLATE_FLAGS.hk]: drawHkFlag,
7277
+ [TEMPLATE_FLAGS.hm]: drawHmFlag,
7278
+ [TEMPLATE_FLAGS.hn]: drawHnFlag,
7279
+ [TEMPLATE_FLAGS.hr]: drawHrFlag,
7280
+ [TEMPLATE_FLAGS.ht]: drawHtFlag,
7281
+ [TEMPLATE_FLAGS.hu]: drawHuFlag,
7282
+ [TEMPLATE_FLAGS.id]: drawIdFlag,
7283
+ [TEMPLATE_FLAGS.ie]: drawIeFlag,
7284
+ [TEMPLATE_FLAGS.il]: drawIlFlag,
7285
+ [TEMPLATE_FLAGS.im]: drawImFlag,
7286
+ [TEMPLATE_FLAGS["in"]]: drawInFlag,
7287
+ [TEMPLATE_FLAGS.io]: drawIoFlag,
7288
+ [TEMPLATE_FLAGS.iq]: drawIqFlag,
7289
+ [TEMPLATE_FLAGS.ir]: drawIrFlag,
7290
+ [TEMPLATE_FLAGS.is]: drawIsFlag,
7291
+ [TEMPLATE_FLAGS.je]: drawJeFlag,
7292
+ [TEMPLATE_FLAGS.jm]: drawJmFlag,
7293
+ [TEMPLATE_FLAGS.jo]: drawJoFlag,
7294
+ [TEMPLATE_FLAGS.ke]: drawKeFlag,
7295
+ [TEMPLATE_FLAGS.kg]: drawKgFlag,
7296
+ [TEMPLATE_FLAGS.kh]: drawKhFlag,
7297
+ [TEMPLATE_FLAGS.ki]: drawKiFlag,
7298
+ [TEMPLATE_FLAGS.km]: drawKmFlag,
7299
+ [TEMPLATE_FLAGS.kn]: drawKnFlag,
7300
+ [TEMPLATE_FLAGS.kp]: drawKpFlag,
7301
+ [TEMPLATE_FLAGS.kr]: drawKrFlag,
7302
+ [TEMPLATE_FLAGS.kw]: drawKwFlag,
7303
+ [TEMPLATE_FLAGS.ky]: drawKyFlag,
7304
+ [TEMPLATE_FLAGS.kz]: drawKzFlag,
7305
+ [TEMPLATE_FLAGS.la]: drawLaFlag,
7306
+ [TEMPLATE_FLAGS.lb]: drawLbFlag,
7307
+ [TEMPLATE_FLAGS.lc]: drawLcFlag,
7308
+ [TEMPLATE_FLAGS.li]: drawLiFlag,
7309
+ [TEMPLATE_FLAGS.lk]: drawLkFlag,
7310
+ [TEMPLATE_FLAGS.lr]: drawLrFlag,
7311
+ [TEMPLATE_FLAGS.ls]: drawLsFlag,
7312
+ [TEMPLATE_FLAGS.lt]: drawLtFlag,
7313
+ [TEMPLATE_FLAGS.lu]: drawLuFlag,
7314
+ [TEMPLATE_FLAGS.lv]: drawLvFlag,
7315
+ [TEMPLATE_FLAGS.ly]: drawLyFlag,
7316
+ [TEMPLATE_FLAGS.ma]: drawMaFlag,
7317
+ [TEMPLATE_FLAGS.mc]: drawMcFlag,
7318
+ [TEMPLATE_FLAGS.md]: drawMdFlag,
7319
+ [TEMPLATE_FLAGS.me]: drawMeFlag,
7320
+ [TEMPLATE_FLAGS.mf]: drawMfFlag,
7321
+ [TEMPLATE_FLAGS.mg]: drawMgFlag,
7322
+ [TEMPLATE_FLAGS.mh]: drawMhFlag,
7323
+ [TEMPLATE_FLAGS.mk]: drawMkFlag,
7324
+ [TEMPLATE_FLAGS.ml]: drawMlFlag,
7325
+ [TEMPLATE_FLAGS.mm]: drawMmFlag,
7326
+ [TEMPLATE_FLAGS.mn]: drawMnFlag,
7327
+ [TEMPLATE_FLAGS.mo]: drawMoFlag,
7328
+ [TEMPLATE_FLAGS.mp]: drawMpFlag,
7329
+ [TEMPLATE_FLAGS.mq]: drawMqFlag,
7330
+ [TEMPLATE_FLAGS.mr]: drawMrFlag,
7331
+ [TEMPLATE_FLAGS.ms]: drawMsFlag,
7332
+ [TEMPLATE_FLAGS.mt]: drawMtFlag,
7333
+ [TEMPLATE_FLAGS.mu]: drawMuFlag,
7334
+ [TEMPLATE_FLAGS.mv]: drawMvFlag,
7335
+ [TEMPLATE_FLAGS.mw]: drawMwFlag,
7336
+ [TEMPLATE_FLAGS.mx]: drawMxFlag,
7337
+ [TEMPLATE_FLAGS.my]: drawMyFlag,
7338
+ [TEMPLATE_FLAGS.mz]: drawMzFlag,
7339
+ [TEMPLATE_FLAGS.na]: drawNaFlag,
7340
+ [TEMPLATE_FLAGS.nc]: drawNcFlag,
7341
+ [TEMPLATE_FLAGS.ne]: drawNeFlag,
7342
+ [TEMPLATE_FLAGS.nf]: drawNfFlag,
7343
+ [TEMPLATE_FLAGS.ng]: drawNgFlag,
7344
+ [TEMPLATE_FLAGS.ni]: drawNiFlag,
7345
+ [TEMPLATE_FLAGS.nl]: drawNlFlag,
7346
+ [TEMPLATE_FLAGS.no]: drawNoFlag,
7347
+ [TEMPLATE_FLAGS.np]: drawNpFlag,
7348
+ [TEMPLATE_FLAGS.nr]: drawNrFlag,
7349
+ [TEMPLATE_FLAGS.nu]: drawNuFlag,
7350
+ [TEMPLATE_FLAGS.nz]: drawNzFlag,
7351
+ [TEMPLATE_FLAGS.om]: drawOmFlag,
7352
+ [TEMPLATE_FLAGS.pa]: drawPaFlag,
7353
+ [TEMPLATE_FLAGS.pe]: drawPeFlag,
7354
+ [TEMPLATE_FLAGS.pf]: drawPfFlag,
7355
+ [TEMPLATE_FLAGS.pg]: drawPgFlag,
7356
+ [TEMPLATE_FLAGS.ph]: drawPhFlag,
7357
+ [TEMPLATE_FLAGS.pk]: drawPkFlag,
7358
+ [TEMPLATE_FLAGS.pl]: drawPlFlag,
7359
+ [TEMPLATE_FLAGS.pm]: drawPmFlag,
7360
+ [TEMPLATE_FLAGS.pn]: drawPnFlag,
7361
+ [TEMPLATE_FLAGS.pr]: drawPrFlag,
7362
+ [TEMPLATE_FLAGS.ps]: drawPsFlag,
7363
+ [TEMPLATE_FLAGS.pt]: drawPtFlag,
7364
+ [TEMPLATE_FLAGS.pw]: drawPwFlag,
7365
+ [TEMPLATE_FLAGS.py]: drawPyFlag,
7366
+ [TEMPLATE_FLAGS.qa]: drawQaFlag,
7367
+ [TEMPLATE_FLAGS.re]: drawReFlag,
7368
+ [TEMPLATE_FLAGS.ro]: drawRoFlag,
7369
+ [TEMPLATE_FLAGS.rs]: drawRsFlag,
7370
+ [TEMPLATE_FLAGS.ru]: drawRuFlag,
7371
+ [TEMPLATE_FLAGS.rw]: drawRwFlag,
7372
+ [TEMPLATE_FLAGS.sa]: drawSaFlag,
7373
+ [TEMPLATE_FLAGS.sb]: drawSbFlag,
7374
+ [TEMPLATE_FLAGS.sc]: drawScFlag,
7375
+ [TEMPLATE_FLAGS.sd]: drawSdFlag,
7376
+ [TEMPLATE_FLAGS.se]: drawSeFlag,
7377
+ [TEMPLATE_FLAGS.sg]: drawSgFlag,
7378
+ [TEMPLATE_FLAGS.sh]: drawShFlag,
7379
+ [TEMPLATE_FLAGS.si]: drawSiFlag,
7380
+ [TEMPLATE_FLAGS.sj]: drawSjFlag,
7381
+ [TEMPLATE_FLAGS.sk]: drawSkFlag,
7382
+ [TEMPLATE_FLAGS.sl]: drawSlFlag,
7383
+ [TEMPLATE_FLAGS.sm]: drawSmFlag,
7384
+ [TEMPLATE_FLAGS.sn]: drawSnFlag,
7385
+ [TEMPLATE_FLAGS.so]: drawSoFlag,
7386
+ [TEMPLATE_FLAGS.sr]: drawSrFlag,
7387
+ [TEMPLATE_FLAGS.ss]: drawSsFlag,
7388
+ [TEMPLATE_FLAGS.st]: drawStFlag,
7389
+ [TEMPLATE_FLAGS.sv]: drawSvFlag,
7390
+ [TEMPLATE_FLAGS.sx]: drawSxFlag,
7391
+ [TEMPLATE_FLAGS.sy]: drawSyFlag,
7392
+ [TEMPLATE_FLAGS.sz]: drawSzFlag,
7393
+ [TEMPLATE_FLAGS.tc]: drawTcFlag,
7394
+ [TEMPLATE_FLAGS.td]: drawTdFlag,
7395
+ [TEMPLATE_FLAGS.tf]: drawTfFlag,
7396
+ [TEMPLATE_FLAGS.tg]: drawTgFlag,
7397
+ [TEMPLATE_FLAGS.tj]: drawTjFlag,
7398
+ [TEMPLATE_FLAGS.tk]: drawTkFlag,
7399
+ [TEMPLATE_FLAGS.tl]: drawTlFlag,
7400
+ [TEMPLATE_FLAGS.tm]: drawTmFlag,
7401
+ [TEMPLATE_FLAGS.tn]: drawTnFlag,
7402
+ [TEMPLATE_FLAGS.to]: drawToFlag,
7403
+ [TEMPLATE_FLAGS.tr]: drawTrFlag,
7404
+ [TEMPLATE_FLAGS.tt]: drawTtFlag,
7405
+ [TEMPLATE_FLAGS.tv]: drawTvFlag,
7406
+ [TEMPLATE_FLAGS.tw]: drawChinaFlag,
7407
+ [TEMPLATE_FLAGS.tz]: drawTzFlag,
7408
+ [TEMPLATE_FLAGS.ua]: drawUaFlag,
7409
+ [TEMPLATE_FLAGS.ug]: drawUgFlag,
7410
+ [TEMPLATE_FLAGS.um]: drawUmFlag,
7411
+ [TEMPLATE_FLAGS.un]: drawUnFlag,
7412
+ [TEMPLATE_FLAGS.uy]: drawUyFlag,
7413
+ [TEMPLATE_FLAGS.uz]: drawUzFlag,
7414
+ [TEMPLATE_FLAGS.vc]: drawVcFlag,
7415
+ [TEMPLATE_FLAGS.ve]: drawVeFlag,
7416
+ [TEMPLATE_FLAGS.vg]: drawVgFlag,
7417
+ [TEMPLATE_FLAGS.vi]: drawViFlag,
7418
+ [TEMPLATE_FLAGS.vn]: drawVnFlag,
7419
+ [TEMPLATE_FLAGS.vu]: drawVuFlag,
7420
+ [TEMPLATE_FLAGS.wf]: drawWfFlag,
7421
+ [TEMPLATE_FLAGS.ws]: drawWsFlag,
7422
+ [TEMPLATE_FLAGS.xk]: drawXkFlag,
7423
+ [TEMPLATE_FLAGS.ye]: drawYeFlag,
7424
+ [TEMPLATE_FLAGS.yt]: drawYtFlag,
7425
+ [TEMPLATE_FLAGS.za]: drawZaFlag,
7426
+ [TEMPLATE_FLAGS.zm]: drawZmFlag,
7427
+ [TEMPLATE_FLAGS.zw]: drawZwFlag
7428
+ };
7492
7429
 
7493
- ;// CONCATENATED MODULE: ./src/rough-emoji-app.ts
7430
+ ;// CONCATENATED MODULE: ./src/flag-utils.ts
7494
7431
 
7495
- /** 浏览器单页主流程:发现 DOM、初始化国旗、绑定表单与下载事件。 */ class RoughEmojiApp {
7496
- api;
7497
- doc;
7498
- win;
7499
- constructor(api, doc = document, win = window){
7500
- this.api = api;
7501
- this.doc = doc;
7502
- this.win = win;
7503
- }
7504
- /** 如果当前页面包含交互表单,就自动完成首次绘制和表单事件绑定。 */ mount() {
7505
- const elements = this.queryElements();
7506
- if (!elements) {
7432
+ /** 把任意输入规范化为可绘制的国旗 emoji;非法输入回退到中国国旗。 */ function resolveFlag(value) {
7433
+ const input = String(value || "").trim();
7434
+ return isFlagEmoji(input) ? input : DEFAULT_FLAG;
7435
+ }
7436
+ /** 判断字符串是否由两个区域指示符组成,这是 Unicode 国旗 emoji 的编码形式。 */ function isFlagEmoji(value) {
7437
+ const codePoints = [
7438
+ ...value
7439
+ ].map((char)=>char.codePointAt(0));
7440
+ return codePoints.length === 2 && codePoints.every((codePoint)=>codePoint !== undefined && codePoint >= (/* inlined export .REGION_INDICATOR_MIN_CODE_POINT */127462) && codePoint <= (/* inlined export .REGION_INDICATOR_MAX_CODE_POINT */127487));
7441
+ }
7442
+
7443
+ ;// CONCATENATED MODULE: ./src/rough-emoji.ts
7444
+
7445
+
7446
+
7447
+
7448
+ /** 绘制流程封装实例,外部入口只需要把已解析的国旗交给它。 */ let renderer;
7449
+ /** 页面和 QA 工具共享的绘制门面:输入 emoji,输出到指定 canvas。 */ const RoughEmoji = {
7450
+ draw (canvasElement, value) {
7451
+ withCanvas(canvasElement, ()=>renderer.draw(resolveFlag(value)));
7452
+ },
7453
+ isFlagEmoji: isFlagEmoji,
7454
+ resolveFlag: resolveFlag
7455
+ };
7456
+ /** 国旗绘制器:负责清理画布、绘制纸张背景、模板分发和 fallback。 */ class RoughEmojiRenderer {
7457
+ /** 绘制总入口:先铺纸张背景,再按已知旗帜走专门模板,未知旗帜走像素采样流程。 */ draw(flag) {
7458
+ this.clearCanvas();
7459
+ this.drawPaper();
7460
+ const templateDrawer = templateDrawers[flag];
7461
+ if (templateDrawer) {
7462
+ templateDrawer();
7507
7463
  return;
7508
7464
  }
7509
- const { canvas, form, input, downloadButton } = elements;
7510
- const params = new URLSearchParams(this.win.location.search);
7511
- const initialFlag = params.get("flag") || this.win.prompt(FLAG_PROMPT_MESSAGE, DEFAULT_FLAG) || DEFAULT_FLAG;
7512
- input.value = initialFlag;
7513
- this.api.draw(canvas, initialFlag);
7514
- form.addEventListener("submit", (event)=>{
7515
- event.preventDefault();
7516
- this.api.draw(canvas, input.value);
7517
- });
7518
- downloadButton.addEventListener("click", ()=>{
7519
- const link = this.doc.createElement("a");
7520
- const resolvedFlag = this.api.resolveFlag(input.value);
7521
- link.download = `${DOWNLOAD_FILE_PREFIX}-${resolvedFlag}.png`;
7522
- link.href = canvas.toDataURL("image/png");
7523
- link.click();
7524
- });
7465
+ drawGenericFlag(flag);
7525
7466
  }
7526
- /** 查询单页演示 DOM;QA 页面没有这些节点时返回 null。 */ queryElements() {
7527
- const canvas = this.doc.querySelector(ELEMENT_SELECTORS.canvas);
7528
- const form = this.doc.querySelector(ELEMENT_SELECTORS.form);
7529
- const input = this.doc.querySelector(ELEMENT_SELECTORS.input);
7530
- const downloadButton = this.doc.querySelector(ELEMENT_SELECTORS.downloadButton);
7531
- if (!canvas || !form || !input || !downloadButton) {
7532
- return null;
7533
- }
7534
- return {
7535
- canvas,
7536
- form,
7537
- input,
7538
- downloadButton
7539
- };
7467
+ /** 清空当前画布,为下一次完整重绘做准备。 */ clearCanvas() {
7468
+ ctx.clearRect(0, 0, size, size);
7469
+ }
7470
+ /** 绘制统一纸张底色和粗糙边框,给所有旗帜提供一致的手写载体。 */ drawPaper() {
7471
+ ctx.fillStyle = PALETTE.paper;
7472
+ ctx.fillRect(0, 0, size, size);
7473
+ render_context_roughCanvas.rectangle(46, 46, size - 92, size - 92, {
7474
+ roughness: 1.4,
7475
+ bowing: 0.8,
7476
+ stroke: PALETTE.frame,
7477
+ strokeWidth: 1.2,
7478
+ fill: PALETTE.paper,
7479
+ fillStyle: "hachure",
7480
+ hachureGap: 24,
7481
+ fillWeight: 0.28
7482
+ });
7540
7483
  }
7541
7484
  }
7485
+ renderer = new RoughEmojiRenderer();
7542
7486
 
7543
7487
  ;// CONCATENATED MODULE: ./src/index.ts
7544
7488
 
7545
7489
 
7546
7490
 
7547
-
7548
7491
  exports.RoughEmoji = __webpack_exports__.RoughEmoji;
7549
- exports.RoughEmojiApp = __webpack_exports__.RoughEmojiApp;
7550
7492
  exports.isFlagEmoji = __webpack_exports__.isFlagEmoji;
7551
7493
  exports.resolveFlag = __webpack_exports__.resolveFlag;
7552
7494
  for(var __rspack_i in __webpack_exports__) {
7553
- if(["RoughEmoji","RoughEmojiApp","isFlagEmoji","resolveFlag"].indexOf(__rspack_i) === -1) {
7495
+ if(["RoughEmoji","isFlagEmoji","resolveFlag"].indexOf(__rspack_i) === -1) {
7554
7496
  exports[__rspack_i] = __webpack_exports__[__rspack_i];
7555
7497
  }
7556
7498
  }