Files
NiceTerms/index.html

113 lines
351 KiB
HTML
Raw Permalink Normal View History

2023-12-25 14:56:06 +08:00
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
2023-12-25 18:09:20 +08:00
<meta name="viewport" content="width=device-width, initial-scale=1.0">
2023-12-25 14:56:06 +08:00
<title>不囉唆的音樂名詞查詢器 by NiceChord</title>
<style>
2023-12-25 18:09:20 +08:00
html {
font-size: 1.2rem; /* Default font size */
}
2023-12-25 14:56:06 +08:00
h3 {
2023-12-25 18:09:20 +08:00
font-size: 1.2rem;
2023-12-25 14:56:06 +08:00
margin-top: 12px;
2023-12-25 15:37:12 +08:00
margin-bottom: 2px;
2023-12-25 14:56:06 +08:00
}
2023-12-25 18:09:20 +08:00
2023-12-25 14:56:06 +08:00
input[type="text"] {
2023-12-25 18:09:20 +08:00
font-size: 1rem;
2023-12-25 14:56:06 +08:00
padding: 5px;
2023-12-25 18:09:20 +08:00
width: 80%;
max-width: 350px;
2023-12-25 14:56:06 +08:00
}
2023-12-25 18:09:20 +08:00
#source {
2023-12-25 15:37:12 +08:00
margin-top: 0px;
margin-bottom: 12px;
2023-12-25 18:09:20 +08:00
font-size: 0.7rem;
2023-12-25 15:37:12 +08:00
}
2023-12-25 18:09:20 +08:00
#results {
width: 90%;
max-width: 600px;
font-size: 1rem;
2023-12-25 14:56:06 +08:00
margin-top: 10px;
}
2023-12-25 18:09:20 +08:00
@media (max-width: 600px) {
h3, input[type="text"], #results {
font-size: 0.9rem;
}
#source {
font-size: 0.7rem;
}
input[type="text"] {
2023-12-25 18:12:45 +08:00
max-width: 80%;
2023-12-25 18:09:20 +08:00
}
}
2023-12-25 14:56:06 +08:00
</style>
<script> /*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).pako={})}(this,(function(e){"use strict";var t=(e,t,i,n)=>{let a=65535&e|0,r=e>>>16&65535|0,o=0;for(;0!==i;){o=i>2e3?2e3:i,i-=o;do{a=a+t[n++]|0,r=r+a|0}while(--o);a%=65521,r%=65521}return a|r<<16|0};const i=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var n=(e,t,n,a)=>{const r=i,o=a+n;e^=-1;for(let i=a;i<o;i++)e=e>>>8^r[255&(e^t[i])];return-1^e};const a=16209;var r=function(e,t){let i,n,r,o,s,l,d,f,c,h,u,w,b,m,k,_,g,p,v,x,y,E,R,A;const Z=e.state;i=e.next_in,R=e.input,n=i+(e.avail_in-5),r=e.next_out,A=e.output,o=r-(t-e.avail_out),s=r+(e.avail_out-257),l=Z.dmax,d=Z.wsize,f=Z.whave,c=Z.wnext,h=Z.window,u=Z.hold,w=Z.bits,b=Z.lencode,m=Z.distcode,k=(1<<Z.lenbits)-1,_=(1<<Z.distbits)-1;e:do{w<15&&(u+=R[i++]<<w,w+=8,u+=R[i++]<<w,w+=8),g=b[u&k];t:for(;;){if(p=g>>>24,u>>>=p,w-=p,p=g>>>16&255,0===p)A[r++]=65535&g;else{if(!(16&p)){if(0==(64&p)){g=b[(65535&g)+(u&(1<<p)-1)];continue t}if(32&p){Z.mode=16191;break e}e.msg="invalid literal/length code",Z.mode=a;break e}v=65535&g,p&=15,p&&(w<p&&(u+=R[i++]<<w,w+=8),v+=u&(1<<p)-1,u>>>=p,w-=p),w<15&&(u+=R[i++]<<w,w+=8,u+=R[i++]<<w,w+=8),g=m[u&_];i:for(;;){if(p=g>>>24,u>>>=p,w-=p,p=g>>>16&255,!(16&p)){if(0==(64&p)){g=m[(65535&g)+(u&(1<<p)-1)];continue i}e.msg="invalid distance code",Z.mode=a;break e}if(x=65535&g,p&=15,w<p&&(u+=R[i++]<<w,w+=8,w<p&&(u+=R[i++]<<w,w+=8)),x+=u&(1<<p)-1,x>l){e.msg="invalid distance too far back",Z.mode=a;break e}if(u>>>=p,w-=p,p=r-o,x>p){if(p=x-p,p>f&&Z.sane){e.msg="invalid distance too far back",Z.mode=a;break e}if(y=0,E=h,0===c){if(y+=d-p,p<v){v-=p;do{A[r++]=h[y++]}while(--p);y=r-x,E=A}}else if(c<p){if(y+=d+c-p,p-=c,p<v){v-=p;do{A[r++]=h[y++]}while(--p);if(y=0,c<v){p=c,v-=p;do{A[r++]=h[y++]}while(--p);y=r-x,E=A}}}else if(y+=c-p,p<v){v-=p;do{A[r++]=h[y++]}while(--p);y=r-x,E=A}for(;v>2;)A[r++]=E[y++],A[r++]=E[y++],A[r++]=E[y++],v-=3;v&&(A[r++]=E[y++],v>1&&(A[r++]=E[y++]))}else{y=r-x;do{A[r++]=A[y++],A[r++]=A[y++],A[r++]=A[y++],v-=3}while(v>2);v&&(A[r++]=A[y++],v>1&&(A[r++]=A[y++]))}break}}break}}while(i<n&&r<s);v=w>>3,i-=v,w-=v<<3,u&=(1<<w)-1,e.next_in=i,e.next_out=r,e.avail_in=i<n?n-i+5:5-(i-n),e.avail_out=r<s?s-r+257:257-(r-s),Z.hold=u,Z.bits=w};const o=15,s=new Uint16Array([3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0]),l=new Uint8Array([16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78]),d=new Uint16Array([1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0]),f=new Uint8Array([16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64]);var c=(e,t,i,n,a,r,c,h)=>{const u=h.bits;let w,b,m,k,_,g,p=0,v=0,x=0,y=0,E=0,R=0,A=0,Z=0,S=0,T=0,O=null;const U=new Uint16Array(16),D=new Uint16Array(16);let I,B,N,C=null;for(p=0;p<=o;p++)U[p]=0;for(v=0;v<n;v++)U[t[i+v]]++;for(E=u,y=o;y>=1&&0===U[y];y--);if(E>y&&(E=y),0===y)return a[r++]=20971520,a[r++]=20971520,h.bits=1,0;for(x=1;x<y&&0===U[x];x++);for(E<x&&(E=x),Z=1,p=1;p<=o;p++)if(Z<<=1,Z-=U[p],Z<0)return-1;if(Z>0&&(0===e||1!==y))return-1;for(D[1]=0,p=1;p<o;p++)D[p+1]=D[p]+U[p];for(v=0;v<n;v++)0!==t[i+v]&&(c[D[t[i+v]]++]=v);if(0===e?(O=C=c,g=20):1===e?(O=s,C=l,g=257):(O=d,C=f,g=0),T=0,v=0,p=x,_=r,R=E,A=0,m=-1,S=1<<E,k=S-1,1===e&&S>852||2===e&&S>592)return 1;for(;;){I=p-A,c[v]+1<g?(B=0,N=c[v]):c[v]>=g?(B=C[c[v]-g],N=O[c[v]-g]):(B=96,N=0),w=1<<p-A,b=1<<R,x=b;do{b-=w,a[_+(T>>A)+b]=I<<24|B<<16|N|0}while(0!==b);for(w=1<<p-1;T&w;)w>>=1;if(0!==w?(T&=w-1,T+=w):T=0,v++,0==--U[p]){if(p===y)break;p=t[i+c[v]]}if(p>E&&(T&k)!==m){for(0===A&&(A=E),_+=x,R=p-A,Z=1<<R;R+A<y&&(Z-=U[R+A],!(Z<=0));)R++,Z<<=1;if(S+=1<<R,1===e&&S>852||2===e&&S>592)return 1;m=T&k,a[m]=E<<24|R<<16|_-r|0}}return 0!==T&&(a[_+T]=p-A<<24|64<<16|0),h.bits=E,0},h={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_F
</script>
2023-12-25 14:56:06 +08:00
<script>
var compressedData = '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
2023-12-25 14:56:06 +08:00
// 移除怪怪看不懂的東西
function removeAccents(str) {
return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
}
// 解碼 base64
var binaryString = atob(compressedData);
// 轉換成 Uint8Array
var charList = binaryString.split('');
var uintArray = new Uint8Array(charList.map(function (char) {
return char.charCodeAt(0);
}));
// 用 pako 解壓縮
var csvData = pako.inflate(uintArray, { to: 'string' });
2023-12-25 14:56:06 +08:00
// CSV 資料預處理
2023-12-27 10:12:19 +08:00
var lines = csvData.split('\n').map(line => {
return [removeAccents(line.toLowerCase()), line];
});
2023-12-25 14:56:06 +08:00
// 文字框改變時 call searchCSV()
2023-12-25 14:56:06 +08:00
function searchCSV() {
var input = removeAccents(document.getElementById('searchInput').value.toLowerCase());
// 空的話就不搜尋了
2023-12-27 11:25:19 +08:00
if (input.trim() === '') {
2023-12-25 15:37:12 +08:00
document.getElementById('results').innerHTML = '喜歡這個工具的話,請多到 <a href="https://nicechord.com" target="_blank">NiceChord.com</a> 逛逛喔!';
2023-12-25 14:56:06 +08:00
return;
}
var matchingLines = '';
// 搜尋每一行
for (var i = 0; i < lines.length; i++) {
2023-12-30 08:34:04 +08:00
if (lines[i][0].includes(input.trim())) {
2023-12-27 10:12:19 +08:00
matchingLines += lines[i][1] + '<br>';
2023-12-25 14:56:06 +08:00
}
}
// 顯示結果
document.getElementById('results').innerHTML = matchingLines;
}
</script>
</head>
<body>
2023-12-25 15:37:12 +08:00
<h3>不囉唆的音樂名詞查詢器 by <a href="https://nicechord.com" target="_blank">NiceChord 好和弦</a></h3>
<p id="source">資料來源:國家教育研究院</p>
2023-12-25 14:56:06 +08:00
<input type="text" id="searchInput" oninput="searchCSV()" placeholder="輸入任何音樂名詞(中文或外文)">
<div id="results"></div>
</body>
</html>