asciify-engine 1.0.6 → 1.0.8
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/embed.js +1 -1
- package/dist/index.cjs +21 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +21 -20
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/embed.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(){'use strict';function
|
|
1
|
+
(function(){'use strict';function et(n){let m=atob(n),t=new Uint8Array(m.length);for(let a=0;a<m.length;a++)t[a]=m.charCodeAt(a);return t}function dt(n){return Array.isArray(n)?n.map(et):[et(n)]}function Mt(n,m,t,a){let e=n[0],r=1+(t*a+m)*e;if(e===4){let d=Math.round(.299*n[r]+.587*n[r+1]+.114*n[r+2]);return {r:n[r],g:n[r+1],b:n[r+2],a:n[r+3],l:d}}return {r:n[r],g:n[r],b:n[r],l:n[r],a:n[r+1]}}function gt(n){return n*n*(3-2*n)}function bt(n,m){if(n==="fullcolor")return (t,a,e)=>`rgb(${t},${a},${e})`;if(n==="matrix")return (t,a,e)=>`rgb(0,${Math.floor(.299*t+.587*a+.114*e)},0)`;if(n==="accent"){let t=m.replace("#",""),a=parseInt(t.substring(0,2),16),e=parseInt(t.substring(2,4),16),r=parseInt(t.substring(4,6),16);return (d,y,o)=>{let s=(.299*d+.587*y+.114*o)/255;return `rgb(${Math.floor(a*s)},${Math.floor(e*s)},${Math.floor(r*s)})`}}return (t,a,e)=>{let r=Math.floor(.299*t+.587*a+.114*e);return `rgb(${r},${r},${r})`}}function pt(n,m,t,a,e,r,d){let y=m,o=d*y;switch(n){case "wave":{let s=Math.sin(t/e*Math.PI*4+o*3)*.5+.5,i=Math.sin(a/r*Math.PI*3+o*2)*.5+.5;return .3+.7*(s*.6+i*.4)}case "pulse":{let s=e/2,i=r/2,f=Math.sqrt((t-s)**2+(a-i)**2),l=Math.sqrt(s*s+i*i);return .2+.8*(Math.sin(f/l*Math.PI*6-o*4)*.5+.5)}case "rain":return .1+.9*(Math.sin(a/r*Math.PI*8-o*5+t*.3)*.5+.5)*(Math.sin(t/e*Math.PI*2+o)*.3+.7);case "breathe":return Math.max(.1,Math.min(1,Math.sin(o*2)*.3+.7+Math.sin((t+a)*.1+o)*.1));case "sparkle":{let s=Math.sin(t*127.1+a*311.7+Math.floor(o*8)*43758.5453)*43758.5453,i=s-Math.floor(s);return i>.7?1:.15+i*.4}case "glitch":{let s=Math.floor(a/(r*.05)),i=Math.sin(s*43.23+Math.floor(o*6)*17.89)*43758.5453;if(i-Math.floor(i)>.85){let l=Math.sin(o*30+s)*.5+.5;return l<.3?0:l}return 1}case "spiral":{let s=e/2,i=r/2,f=t-s,l=a-i,M=Math.atan2(l,f),I=Math.sqrt(f*f+l*l),H=Math.sqrt(s*s+i*i);return .15+.85*(Math.sin(M*3+I/H*Math.PI*8-o*3)*.5+.5)}case "typewriter":{let s=e*r,i=a*e+t,f=o*.5%1,l=f*s*1.3,M=i-l;return M>0?0:Math.min(1,Math.max(0,1+M/(s*.15)))}case "scatter":{let s=e/2,i=r/2,f=t-s,l=a-i,M=Math.sqrt(f*f+l*l)/Math.sqrt(s*s+i*i),I=Math.sin(o*1.5)*.5+.5;return M>I?Math.max(0,1-(M-I)*3):.7+.3*Math.sin(M*10-o*2)}default:return 1}}function at(n,m,t){let a=document.getElementById(n);if(!a){console.error(`Asciify: canvas #${n} not found`);return}let e=a.getContext("2d"),{r,c:d,w:y,h:o}=t,s=t.fps??10,i=t.cs??" .:-=+*#%@",f=t.cm??"grayscale",l=t.ac??"#ffffff",M=t.as??"none",I=t.sp??1,H=t.inv??false,h=t.hs??0,st=t.hr??.3,P=t.he??"spotlight",k=t.hc??"#ffffff",it=t.dr??.7,ot=t.dots??false,z=t.anim??false,ct=parseInt(k.slice(1,3),16)||255,lt=parseInt(k.slice(3,5),16)||255,ht=parseInt(k.slice(5,7),16)||255,$=y/d,w=o/r,K=dt(m),ut=bt(f,l),R=h>0,Q=M!=="none"||z,B=-1,U=-1,A=0,D=.5,J=.5,W=0,V=0;R&&(a.addEventListener("mousemove",S=>{let E=a.getBoundingClientRect();B=(S.clientX-E.left)/E.width,U=(S.clientY-E.top)/E.height;}),a.addEventListener("mouseleave",()=>{B=-1,U=-1;}));function N(S){let E=S/1e3;z&&S-V>=1e3/s&&(W=(W+1)%K.length,V=S);let mt=K[W];e.clearRect(0,0,y,o),e.fillStyle="#0a0a0a",e.fillRect(0,0,y,o),R&&(B>=0?(D+=(B-D)*.1,J+=(U-J)*.1,A+=(1-A)*.12):(A*=.96,A<.003&&(A=0)));for(let q=0;q<r;q++)for(let C=0;C<d;C++){let v=Mt(mt,C,q,d);if(v.a<10)continue;let X=pt(M,I,C,q,d,r,E);if(X<.05)continue;let O=1,Y=0,G=0,L=0,x=0;if(R&&A>.003){let u=C/d,g=q/r,b=u-D,p=g-J,tt=Math.sqrt(b*b+p*p),nt=.08+st*.35+h*.04;if(tt<nt){let ft=1-tt/nt,c=gt(ft)*A,T=Math.atan2(p,b);if(P==="spotlight"){O=1+c*h*1.8;let F=c*c*h*.6;Y=Math.cos(T)*F*$,G=Math.sin(T)*F*w,L=c*h*.4,x=c*c*h*.25;}else if(P==="magnify")O=1+c*h*2.5,L=c*h*.15;else if(P==="repel"){O=1+c*h*.3;let F=c*c*h*1.2;Y=Math.cos(T)*F*$,G=Math.sin(T)*F*w;}else P==="glow"?(L=c*h*.8,x=c*h*.4):P==="colorShift"&&(O=1+c*h*.4,L=c*h*.2,x=c*h*.7);}}let Z=C*$+$/2+Y,_=q*w+w/2+G,j=ut(v.r,v.g,v.b);if(x>0){let u=j.match(/rgb\((\d+),(\d+),(\d+)\)/);if(u){let g=+u[1],b=+u[2],p=+u[3];j=`rgb(${Math.min(255,Math.round(g+(ct-g)*x))},${Math.min(255,Math.round(b+(lt-b)*x))},${Math.min(255,Math.round(p+(ht-p)*x))})`;}}if(e.globalAlpha=Math.min(1,v.a/255*X*(1+L)),e.fillStyle=j,ot){let u=v.l/255;if(H&&(u=1-u),u<.02)continue;let g=Math.min($,w)*.5*it*u*X*O;if(g<.3)continue;e.beginPath(),e.arc(Z,_,g,0,Math.PI*2),e.fill();}else {let u=v.l/255;H&&(u=1-u);let g=Math.floor(u*(i.length-1)),b=i[Math.max(0,Math.min(i.length-1,g))];if(b===" ")continue;let p=Math.min($/.55,w)*.9*O;e.font=`${p}px "JetBrains Mono",monospace`,e.textAlign="center",e.textBaseline="middle",e.fillText(b,Z,_);}}e.globalAlpha=1,(Q||R)&&requestAnimationFrame(N);}Q||R?requestAnimationFrame(N):N(0);}window.Asciify=at;function rt(){document.querySelectorAll("canvas[data-asciify-id]").forEach(n=>{let m=n.getAttribute("data-asciify-id"),t=n.getAttribute("data-asciify-src"),a=n.getAttribute("data-asciify-opts");if(!(!t||!a))try{let e=JSON.parse(a),r=JSON.parse(t);at(m,r,e);}catch(e){console.error("Asciify: failed to parse embed data on #"+m,e);}});}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",rt):rt();})();
|
package/dist/index.cjs
CHANGED
|
@@ -719,22 +719,24 @@ function renderFrameToCanvas(ctx, frame, options, canvasWidth, canvasHeight, tim
|
|
|
719
719
|
}
|
|
720
720
|
ctx.globalAlpha = 1;
|
|
721
721
|
}
|
|
722
|
-
function serializeFrame(frame,
|
|
722
|
+
function serializeFrame(frame, fullColor) {
|
|
723
723
|
const rows = frame.length;
|
|
724
724
|
const cols = rows > 0 ? frame[0].length : 0;
|
|
725
|
-
const
|
|
726
|
-
|
|
725
|
+
const stride = fullColor ? 4 : 2;
|
|
726
|
+
const buf = new Uint8Array(1 + rows * cols * stride);
|
|
727
|
+
buf[0] = stride;
|
|
728
|
+
let i = 1;
|
|
727
729
|
for (let y = 0; y < rows; y++) {
|
|
728
730
|
for (let x = 0; x < cols; x++) {
|
|
729
731
|
const cell = frame[y][x];
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
buf[i++] = cell.char.charCodeAt(0) & 255;
|
|
732
|
+
if (fullColor) {
|
|
733
|
+
buf[i++] = cell.r;
|
|
734
|
+
buf[i++] = cell.g;
|
|
735
|
+
buf[i++] = cell.b;
|
|
736
|
+
buf[i++] = cell.a;
|
|
736
737
|
} else {
|
|
737
738
|
buf[i++] = Math.round(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b);
|
|
739
|
+
buf[i++] = cell.a;
|
|
738
740
|
}
|
|
739
741
|
}
|
|
740
742
|
}
|
|
@@ -832,7 +834,7 @@ async function asciifyVideo(source, canvas, { fontSize = 10, style = "classic",
|
|
|
832
834
|
cancelAnimationFrame(animId);
|
|
833
835
|
};
|
|
834
836
|
}
|
|
835
|
-
var EMBED_CDN_VERSION = "1.0.
|
|
837
|
+
var EMBED_CDN_VERSION = "1.0.8";
|
|
836
838
|
function buildEmbedOpts(options, rows, cols, width, height, fps, animated) {
|
|
837
839
|
const o = {
|
|
838
840
|
r: rows,
|
|
@@ -856,32 +858,31 @@ function buildEmbedOpts(options, rows, cols, width, height, fps, animated) {
|
|
|
856
858
|
if (animated) o.anim = true;
|
|
857
859
|
return JSON.stringify(o);
|
|
858
860
|
}
|
|
861
|
+
var CDN_SCRIPT = `<script src="https://cdn.jsdelivr.net/npm/asciify-engine@${EMBED_CDN_VERSION}/dist/embed.js" async></script>`;
|
|
859
862
|
function generateEmbedCode(frame, options, width, height) {
|
|
860
863
|
const rows = frame.length;
|
|
861
864
|
if (rows === 0) return "";
|
|
862
865
|
const cols = frame[0].length;
|
|
863
|
-
const
|
|
864
|
-
const data = serializeFrame(frame,
|
|
866
|
+
const isFullColor = options.colorMode === "fullcolor";
|
|
867
|
+
const data = serializeFrame(frame, isFullColor);
|
|
865
868
|
const id = `ar-${Math.random().toString(36).slice(2, 9)}`;
|
|
866
869
|
const opts = buildEmbedOpts(options, rows, cols, width, height);
|
|
867
870
|
return `<!-- Asciify Embed -->
|
|
868
|
-
<canvas id="${id}" width="${width}" height="${height}"
|
|
869
|
-
|
|
870
|
-
<script>Asciify('${id}','${data}',${opts})</script>
|
|
871
|
+
<canvas data-asciify-id="${id}" data-asciify-src='"${data}"' data-asciify-opts='${opts}' width="${width}" height="${height}"></canvas>
|
|
872
|
+
${CDN_SCRIPT}
|
|
871
873
|
<!-- /Asciify Embed -->`;
|
|
872
874
|
}
|
|
873
875
|
function generateAnimatedEmbedCode(frames, options, fps, width, height) {
|
|
874
876
|
if (frames.length === 0) return "";
|
|
875
877
|
const rows = frames[0].length;
|
|
876
878
|
const cols = frames[0][0].length;
|
|
877
|
-
const
|
|
878
|
-
const allData = frames.map((f) => serializeFrame(f,
|
|
879
|
+
const isFullColor = options.colorMode === "fullcolor";
|
|
880
|
+
const allData = frames.map((f) => serializeFrame(f, isFullColor));
|
|
879
881
|
const id = `ar-${Math.random().toString(36).slice(2, 9)}`;
|
|
880
882
|
const opts = buildEmbedOpts(options, rows, cols, width, height, fps, true);
|
|
881
883
|
return `<!-- Asciify Animated Embed -->
|
|
882
|
-
<canvas id="${id}" width="${width}" height="${height}"
|
|
883
|
-
|
|
884
|
-
<script>Asciify('${id}',${JSON.stringify(allData)},${opts})</script>
|
|
884
|
+
<canvas data-asciify-id="${id}" data-asciify-src='${JSON.stringify(allData)}' data-asciify-opts='${opts}' width="${width}" height="${height}"></canvas>
|
|
885
|
+
${CDN_SCRIPT}
|
|
885
886
|
<!-- /Asciify Animated Embed -->`;
|
|
886
887
|
}
|
|
887
888
|
function _fade(t) {
|