1+ function docReady ( fn ) {
2+ // see if DOM is already available
3+ if ( document . readyState === "complete" || document . readyState === "interactive" ) {
4+ // call on next available tick
5+ setTimeout ( fn , 1 ) ;
6+ } else {
7+ document . addEventListener ( "DOMContentLoaded" , fn ) ;
8+ }
9+ }
10+
11+ docReady ( function ( ) {
12+
13+
14+ const reg = {
15+ '000000' : '0' ,
16+ '0000AA' : '1' ,
17+ '00AA00' : '2' ,
18+ '00AAAA' : '3' ,
19+ 'AA0000' : '4' ,
20+ 'AA00AA' : '5' ,
21+ 'FFAA00' : '6' ,
22+ 'AAAAAA' : '7' ,
23+ '555555' : '8' ,
24+ '5555FF' : '9' ,
25+ '55FF55' : 'a' ,
26+ '55FFFF' : 'b' ,
27+ 'FF5555' : 'c' ,
28+ 'FF55FF' : 'd' ,
29+ 'FFFF55' : 'e' ,
30+ 'FFFFFF' : 'f'
31+ } ;
32+ const blend = ( [ a1 , a2 ] , r ) => a1 . map ( ( p , i ) => Math . round ( p * ( 1 - r ) + a2 [ i ] * r ) ) ;
33+ const toHex = rgb => rgb . map ( n => n . toString ( 16 ) . padStart ( 2 , '0' ) ) . join ( '' ) ;
34+ Array . from ( document . getElementsByTagName ( 'i' ) ) . forEach ( i => i . setAttribute ( 'style' , 'background-color:#ffffff' ) ) ;
35+ setInterval ( ( ) => {
36+ let command = '' , preview = '' , last ;
37+ Array . from ( document . getElementsByTagName ( 'li' ) ) . forEach ( li => {
38+ const colors = Array . from ( li . getElementsByTagName ( 'i' ) )
39+ . map ( span => getComputedStyle ( span ) . backgroundColor )
40+ . map ( rgb => Array . from ( rgb . matchAll ( / \d + / g) ) . map ( ( [ c ] ) => Number . parseInt ( c ) ) ) ;
41+ const text = ( li . getElementsByTagName ( 'input' ) [ 0 ] . value || '' ) . trim ( ) . split ( '' ) ;
42+ const coloredText = text . map ( ( c , idx ) => {
43+ const pct = idx / Math . max ( 1 , text . length - 1 ) ;
44+ return { c, rgb : blend ( colors , pct ) } ;
45+ } ) ;
46+ command += coloredText . map ( o => {
47+ const hex = toHex ( o . rgb ) . toUpperCase ( )
48+ const curr = reg [ hex ] || '#' + hex ;
49+ const ret = curr == last ? o . c : `&${ curr } ${ o . c } ` ;
50+ last = curr ;
51+ return ret ;
52+ } ) . join ( '' ) ;
53+
54+ preview += coloredText . map ( o => `<span style='color:#${ toHex ( o . rgb ) } '>${ o . c } </span>` ) . join ( '' ) ;
55+ } ) ;
56+ document . getElementById ( 'command' ) . innerText = command ;
57+ document . getElementById ( 'preview' ) . innerHTML = preview ;
58+ } , 1000 )
59+
60+ } ) ;
0 commit comments