1/** 2 * è¨å空港 AIãµã¤ãå æ¤ç´¢ ã¦ã£ã¸ã§ãã 3 * 4 * è¨ç½®æ¹æ³: 5 * <div id="ai-search"></div> 6 * <script src="/ai-search/widget.js" defer></script> 7 * 8 * 表示è¨èªã¨æ¤ç´¢å¯¾è±¡è¨èªã¯ãç¾å¨ã®URLã®ãã¹ããèªåå¤å®ãã¾ãã 9 * /en/... â è±èªã®ãã¼ã¸ã®ã¿ãæ¤ç´¢ããè±èªã§åç 10 * /ko/... â éå½èªã®ãã¼ã¸ã®ã¿ 11 * /zh-CN/... â ç°¡ä½åã®ãã¼ã¸ã®ã¿ 12 * /zh-TW/... â ç¹ä½åã®ãã¼ã¸ã®ã¿ 13 * ããä»¥å¤ â æ¥æ¬èªã®ãã¼ã¸ã®ã¿ 14 * 15 * ã¹ã¿ã¤ã«ã¯Shadow DOMå ã«éãã¦ãããããWordPressãã¼ãã®CSSã¨å¹²æ¸ãã¾ããã 16 */ 17(function () { 18 'use strict'; 19 20 var script = document.currentScript; 21 22 var ENDPOINT = (script && script.getAttribute('data-endpoint')) || '/ai-search/api.php'; 23 var MOUNT_ID = (script && script.getAttribute('data-mount')) || 'ai-search'; 24 25 // -------------------------------------------------------------------- 26 // è¨èª 27 // -------------------------------------------------------------------- 28 29 var I18N = { 30 'ja': { 31 placeholder: 'ç¥ããããã¨ãå ¥åãã¦ãã ããï¼ä¾ï¼é§è»å ´ã®æéï¼', 32 button: 'æ¤ç´¢', 33 loading: 'åçã使ãã¦ãã¾ãâ¦', 34 sources: 'åç §ãããã¼ã¸', 35 newTab: 'æ°ããã¿ãã§éãã¾ã', 36 external: 'å¤é¨ãµã¤ã', 37 note: 'ãã®åçã¯AIããµã¤ãå ã®æ å ±ããã¨ã«çæãã¦ãã¾ããææ°ã®æ å ±ã¯åç §ãã¼ã¸ãã確èªãã ããã', 38 error: 'æ¤ç´¢ä¸ã«ã¨ã©ã¼ãçºçãã¾ããããã°ãããã¦ããã試ããã ããã', 39 empty: 'æ¤ç´¢ãããå 容ãå ¥åãã¦ãã ããã' 40 }, 41 'en': { 42 placeholder: 'Ask anything about Ibaraki Airport (e.g. parking fees)', 43 button: 'Search', 44 loading: 'Preparing an answerâ¦', 45 sources: 'Referenced pages', 46 newTab: 'opens in a new tab', 47 external: 'external site', 48 note: 'This answer is generated by AI based on information on this site. Please check the referenced pages for the latest details.', 49 error: 'An error occurred during the search. Please try again later.', 50 empty: 'Please enter what you would like to search for.' 51 }, 52 'ko': { 53 placeholder: 'ê¶ê¸í ì ì ì ë ¥í´ ì£¼ì¸ì (ì: 주차 ìê¸)', 54 button: 'ê²ì', 55 loading: 'ëµë³ì ìì±íê³ ììµëë¤â¦', 56 sources: '참조í íì´ì§', 57 newTab: 'ì íìì ì´ë¦½ëë¤', 58 external: 'ì¸ë¶ ì¬ì´í¸', 59 note: 'ì´ ëµë³ì ì¬ì´í¸ ë´ ì 보를 ë°íì¼ë¡ AIê° ìì±íìµëë¤. ìµì ì ë³´ë 참조 íì´ì§ë¥¼ íì¸í´ 주ì¸ì.', 60 error: 'ê²ì ì¤ ì¤ë¥ê° ë°ìíìµëë¤. ì ì í ë¤ì ìëí´ ì£¼ì¸ì.', 61 empty: 'ê²ìí ë´ì©ì ì ë ¥í´ ì£¼ì¸ì.' 62 }, 63 'zh-CN': { 64 placeholder: '请è¾å ¥æ¨æ³äºè§£çå 容ï¼ä¾å¦ï¼å车费ï¼', 65 button: 'æç´¢', 66 loading: 'æ£å¨çæåçâ¦', 67 sources: 'åè页é¢', 68 newTab: '卿°æ ç¾é¡µä¸æå¼', 69 external: 'å¤é¨ç½ç«', 70 note: 'æ¤åçç±AIæ ¹æ®æ¬ç«ä¿¡æ¯çæãææ°ä¿¡æ¯è¯·æ¥çåè页é¢ã', 71 error: 'æç´¢æ¶åçé误ã请ç¨ååè¯ã', 72 empty: '请è¾å ¥è¦æç´¢çå 容ã' 73 }, 74 'zh-TW': { 75 placeholder: 'è«è¼¸å ¥æ¨æ³äºè§£çå §å®¹ï¼ä¾å¦ï¼åè»è²»ï¼', 76 button: 'æå°', 77 loading: 'æ£å¨ç¢çåçâ¦', 78 sources: 'åèé é¢', 79 newTab: '卿°åé ä¸éå', 80 external: 'å¤é¨ç¶²ç«', 81 note: 'æ¤åçç±AIæ ¹ææ¬ç«è³è¨ç¢çãææ°è³è¨è«æ¥çåèé é¢ã', 82 error: 'æå°æç¼çé¯èª¤ãè«ç¨å¾å試ã', 83 empty: 'è«è¼¸å ¥è¦æå°çå §å®¹ã' 84 } 85 }; 86 87 /** 88 * URLã®ãã¹ããè¨èªãå¤å®ããã 89 * 90 * ãã®ãµã¤ãã¯ãµããã£ã¬ã¯ããªåã®ãã«ããµã¤ããªã®ã§ããã¹ã®å é ã 91 * ãã®ã¾ã¾è¨èªã示ããæ¤ç´¢æååã®è¨èªãæ¨æ¸¬ããå¿ è¦ã¯ãªãã 92 * è±èªãã¼ã¸ã§æ¥æ¬èªãå ¥åãã¦ãè±èªã®çµæãè¿ãã 93 */ 94 function detectLang() { 95 var match = location.pathname.match(/^\/(en|ko|zh-CN|zh-TW)(?:\/|$)/); 96 return match && I18N[match[1]] ? match[1] : 'ja'; 97 } 98 99 var LANG = detectLang(); 100 var T = I18N[LANG]; 101 102 // -------------------------------------------------------------------- 103 // ã¹ã¿ã¤ã« 104 // -------------------------------------------------------------------- 105 106 var STYLE = [ 107 ':host { display: block; }', 108 '* { box-sizing: border-box; }', 109 '.wrap {', 110 ' font-family: -apple-system, BlinkMacSystemFont, "Hiragino Sans", "Noto Sans JP", "Yu Gothic", Meiryo, sans-serif;', 111 ' color: #1a1a1a; line-height: 1.75; max-width: 780px;', 112 '}', 113 '.form { display: flex; gap: 8px; }', 114 '.input {', 115 ' flex: 1 1 auto; min-width: 0; padding: 12px 14px; font-size: 16px;', 116 ' border: 1px solid #c4c9d1; border-radius: 6px; background: #fff; color: inherit;', 117 ' font-family: inherit;', 118 '}', 119 '.input:focus { outline: 2px solid #0b63c5; outline-offset: 1px; border-color: #0b63c5; }', 120 '.button {', 121 ' flex: 0 0 auto; padding: 12px 22px; font-size: 15px; font-weight: 700;', 122 ' color: #fff; background: #0b63c5; border: 0; border-radius: 6px; cursor: pointer;', 123 ' font-family: inherit;', 124 '}', 125 '.button:hover:not(:disabled) { background: #0951a3; }', 126 '.button:disabled { background: #9aa5b1; cursor: default; }', 127 '.panel { margin-top: 20px; }', 128 '.panel[hidden] { display: none; }', 129 '.answer { white-space: pre-wrap; font-size: 16px; }', 130 '.loading { color: #5a6472; font-size: 15px; display: flex; align-items: center; gap: 8px; }', 131 // display ãæç¤ºããè¦ç´ ã«ã¯ [hidden] ç¨ã®æå®ãå¿ é ã 132 // ä½è ã¹ã¿ã¤ã«ã¯ãã©ã¦ã¶æ¨æºã® [hidden] { display: none } ããåªå ãããããã 133 // ãããç¡ã㨠hidden 屿§ãç«ã¦ã¦ãæ¶ããªãã 134 '.loading[hidden] { display: none; }', 135 '.dot {', 136 ' width: 8px; height: 8px; border-radius: 50%; background: #0b63c5;', 137 ' animation: pulse 1.2s ease-in-out infinite;', 138 '}', 139 '@keyframes pulse { 0%, 100% { opacity: 0.3; } 50% { opacity: 1; } }', 140 '@media (prefers-reduced-motion: reduce) { .dot { animation: none; } }', 141 '.sources { margin-top: 20px; padding-top: 16px; border-top: 1px solid #e3e6ea; }', 142 '.sources[hidden] { display: none; }', 143 '.sources-title {', 144 ' margin: 0 0 8px; font-size: 13px; font-weight: 700; color: #5a6472;', 145 ' letter-spacing: .04em;', 146 '}', 147 '.sources ul { margin: 0; padding: 0; list-style: none; }', 148 '.sources li { margin: 0 0 6px; }', 149 '.sources a { color: #0b63c5; text-decoration: underline; font-size: 15px; }', 150 '.sources a:hover { text-decoration: none; }', 151 '.ext {', 152 ' display: inline-block; margin-left: 6px; padding: 1px 6px; border-radius: 3px;', 153 ' background: #eceff3; color: #5a6472; font-size: 11px; vertical-align: middle;', 154 ' white-space: nowrap;', 155 '}', 156 '.note { margin-top: 16px; font-size: 12px; color: #6b7481; line-height: 1.6; }', 157 '.note[hidden] { display: none; }', 158 '.score {', 159 ' margin-left: 6px; color: #6b7481; font-size: 11px;', 160 ' font-family: ui-monospace, SFMono-Regular, Menlo, monospace;', 161 '}', 162 // 以ä¸ã¯ã¹ã³ã¢è¨ºæããã«ãconfig.php ã® expose_scores ã true ã®ã¨ãã ã 163 // ãµã¼ããã event: debug ãå±ãã表示ãããã 164 '.debug {', 165 ' margin-top: 20px; padding: 10px 12px; font-size: 12px;', 166 ' border: 1px dashed #c4c9d1; border-radius: 6px; background: #fafbfc;', 167 '}', 168 '.debug[hidden] { display: none; }', 169 '.debug summary { cursor: pointer; font-weight: 700; color: #5a6472; }', 170 '.dbg-meta {', 171 ' margin: 10px 0; color: #5a6472; line-height: 1.7; word-break: break-all;', 172 ' font-family: ui-monospace, SFMono-Regular, Menlo, monospace;', 173 '}', 174 // è¡¨ã¯æ¨ªã«é·ããªããããã¯ã¿åºãå ´åã¯ãã®ä¸ã ãæ¨ªã¹ã¯ãã¼ã«ããã 175 '.dbg-scroll { overflow-x: auto; }', 176 '.debug table { border-collapse: collapse; width: 100%; font-size: 12px; }', 177 '.debug th, .debug td {', 178 ' padding: 4px 8px; border-bottom: 1px solid #e3e6ea;', 179 ' text-align: left; white-space: nowrap;', 180 '}', 181 '.debug th { color: #6b7481; }', 182 '.debug td.num { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }', 183 '.debug tr.in { background: #eef5ff; }', 184 '.debug a { color: #0b63c5; }', 185 '.error { color: #b3261e; font-size: 15px; }', 186 '@media (prefers-color-scheme: dark) {', 187 ' .wrap { color: #e8eaed; }', 188 ' .input { background: #1f2226; border-color: #464b52; color: #e8eaed; }', 189 ' .sources { border-top-color: #3a3f45; }', 190 ' .sources-title, .loading, .note { color: #9aa5b1; }', 191 ' .ext { background: #33383e; color: #9aa5b1; }', 192 ' .sources a { color: #7cb3f5; }', 193 ' .button { background: #1f6fd0; }', 194 ' .score { color: #8b949e; }', 195 ' .debug { border-color: #464b52;
195 background: #1b1e21; }', 196 ' .debug summary, .debug th, .dbg-meta { color: #9aa5b1; }', 197 ' .debug th, .debug td { border-bottom-color: #3a3f45; }', 198 ' .debug tr.in { background: #232a33; }', 199 ' .debug a { color: #7cb3f5; }', 200 '}' 201 ].join('\n'); 202 203 // -------------------------------------------------------------------- 204 // æç» 205 // -------------------------------------------------------------------- 206 207 function build(host) { 208 var root = host.attachShadow ? host.attachShadow({ mode: 'open' }) : host; 209 210 var style = document.createElement('style'); 211 style.textContent = STYLE; 212 root.appendChild(style); 213 214 var wrap = document.createElement('div'); 215 wrap.className = 'wrap'; 216 wrap.setAttribute('lang', LANG); 217 root.appendChild(wrap); 218 219 var form = document.createElement('form'); 220 form.className = 'form'; 221 wrap.appendChild(form); 222 223 var input = document.createElement('input'); 224 input.className = 'input'; 225 input.type = 'search'; 226 input.placeholder = T.placeholder; 227 input.setAttribute('aria-label', T.placeholder); 228 input.setAttribute('maxlength', '200'); 229 input.setAttribute('autocomplete', 'off'); 230 form.appendChild(input); 231 232 var button = document.createElement('button'); 233 button.className = 'button'; 234 button.type = 'submit'; 235 button.textContent = T.button; 236 form.appendChild(button); 237 238 var panel = document.createElement('div'); 239 panel.className = 'panel'; 240 panel.hidden = true; 241 wrap.appendChild(panel); 242 243 var status = document.createElement('div'); 244 status.className = 'loading'; 245 status.hidden = true; 246 // ã¹ã¯ãªã¼ã³ãªã¼ãã¼ã«èªã¿ä¸ãç¶æ³ãä¼ãã 247 status.setAttribute('role', 'status'); 248 panel.appendChild(status); 249 250 var answer = document.createElement('div'); 251 answer.className = 'answer'; 252 answer.setAttribute('aria-live', 'polite'); 253 panel.appendChild(answer); 254 255 var note = document.createElement('p'); 256 note.className = 'note'; 257 note.textContent = T.note; 258 note.hidden = true; 259 panel.appendChild(note); 260 261 var sources = document.createElement('div'); 262 sources.className = 'sources'; 263 sources.hidden = true; 264 panel.appendChild(sources); 265 266 // ã¹ã³ã¢è¨ºæããã«ãæ¢å®ã§ã¯é表示ã§ããµã¼ãã expose_scores ã 267 // æå¹ã«ãã¦ããã¨ãã ãå 容ãå ¥ããæããããã ç¶æ ã§ç½®ãã 268 var debug = document.createElement('details'); 269 debug.className = 'debug'; 270 debug.hidden = true; 271 panel.appendChild(debug); 272 273 return { 274 form: form, 275 input: input, 276 button: button, 277 panel: panel, 278 status: status, 279 answer: answer, 280 note: note, 281 sources: sources, 282 debug: debug 283 }; 284 } 285 286 function showLoading(ui) { 287 ui.status.hidden = false; 288 ui.status.textContent = ''; 289 290 var dot = document.createElement('span'); 291 dot.className = 'dot'; 292 ui.status.appendChild(dot); 293 ui.status.appendChild(document.createTextNode(T.loading)); 294 } 295
296 function renderSources(ui, list) { 297 ui.sources.textContent = ''; 298 if (!list || !list.length) { 299 ui.sources.hidden = true; 300 return; 301 } 302 303 var heading = document.createElement('p'); 304 heading.className = 'sources-title'; 305 heading.textContent = T.sources; 306 ui.sources.appendChild(heading); 307 308 var ul = document.createElement('ul'); 309 list.forEach(function (item) { 310 if (!item || typeof item.url !== 'string') { 311 return; 312 } 313 314 var url; 315 try { 316 url = new URL(item.url, location.origin); 317 } catch (e) { 318 return; 319 } 320 321 // èªãµã¤ãã®URLãããµã¼ããå¤é¨ãªã³ã¯ã¨ãã¦æç¤ºãããã®ã ãã表示ããã 322 // å¤é¨ãªã³ã¯ã¯ config.php ã«ç»é²ããããã®ã«éãããããã 323 // ä»»æã®URLãç´ãè¾¼ããã¨ã¯ãªãã 324 var isExternal = url.origin !== location.origin; 325 if (isExternal) { 326 if (!item.external) { 327 return; 328 } 329 if (url.protocol !== 'https:' && url.protocol !== 'http:') { 330 return; 331 } 332 } 333 334 var li = document.createElement('li'); 335 var a = document.createElement('a'); 336 a.href = url.href; 337 a.textContent = item.title || url.href; 338 339 // å¥ã¿ãã§éãã 340 // èªãµã¤ãå 㯠noopener ã®ã¿ãnoreferrer ãä»ããã¨ãªãã¡ã©ãéãããã 341 // ã¢ã¯ã»ã¹è§£æã§ãµã¤ãå ã®åéã追ããªããªãããä»ããªãã 342 // å¤é¨ãµã¤ãã¸ã¯ noreferrer ãä»ããé²è¦§å ãã¼ã¸ãä»ç¤¾ã«æ¸¡ããªãã 343 a.target = '_blank'; 344 a.rel = isExternal ? 'noopener noreferrer' : 'noopener'; 345 346 var label = a.textContent; 347 li.appendChild(a); 348 349 if (isExternal) { 350 var badge = document.createElement('span'); 351 badge.className = 'ext'; 352 badge.textContent = T.external; 353 li.appendChild(badge); 354 label += 'ï¼' + T.external + 'ï¼'; 355 } 356 357 // expose_scores ãæå¹ãªã¨ãã ããµã¼ããã score ãå±ã 358 if (typeof item.score === 'number') { 359 var score = document.createElement('span'); 360 score.className = 'score'; 361 score.textContent = item.score.toFixed(4); 362 li.appendChild(score); 363 } 364 365 // å¤é¨ãµã¤ãã§ãããã¨ã»å¥ã¿ãã§éããã¨ãèªã¿ä¸ãã§ä¼ãã 366 a.setAttribute('aria-label', label + 'ï¼' + T.newTab + 'ï¼'); 367 368 ul.appendChild(li); 369 }); 370 371 if (!ul.children.length) { 372 ui.sources.hidden = true; 373 return; 374 } 375 376 ui.sources.appendChild(ul); 377 ui.sources.hidden = false; 378 } 379 380 /** 381 * ã¹ã³ã¢è¨ºæããã«ãæç»ããã 382 * 383 * config.php ã® expose_scores ã true ã®ã¨ãã ããµã¼ããã event: debug ã 384 * å±ããéç¨æ å½è ã精度調æ´ã«ä½¿ããã®ãªã®ã§ããã¼ã¸ã®è¨èªã«é¢ä¿ãªã 385 * æ¥æ¬èªã®ã©ãã«ã§è¡¨ç¤ºããï¼å©ç¨è åãã®æè¨ã§ã¯ãªãï¼ã 386 */ 387 function renderDebug(ui, data) { 388 ui.debug.textContent = ''; 389 390 if (!data || !data.candidates || !data.candidates.length) { 391 ui.debug.hidden = true; 392 return; 393 } 394 395 var summary = document.createElement('summary'); 396 summary.textContent = '診æ: é¡ä¼¼åº¦ã¹ã³ã¢ï¼ä¸ä½ ' + data.candidates.length + ' ä»¶ï¼'; 397 ui.debug.appendChild(summary); 398 399 var settings = data.settings || {}; 400 var meta = document.createElement('p'); 401 meta.className = 'dbg-meta'; 402 meta.textContent = [ 403 'top_k=' + settings.top_k, 404 'max_chunks_per_page=' + settings.max_chunks_per_page, 405 'min_score=' + settings.min_score, 406 'title_match_bonus=' + settings.title_match_bonus, 407 'max_sources=' + settings.max_sources, 408 'source_score_margin=' + settings.source_score_margin, 409 'æé«ã¹ã³ã¢=' + data.topScore, 410 'é¾å¤éé=' + (data.passedMinScore ? 'ã¯ã' : 'ããã') 411 ].join(' / '); 412 ui.debug.appendChild(meta); 413 414 var scroll = document.createElement('div'); 415 scroll.className = 'dbg-scroll'; 416 417 var table = document.createElement('table'); 418 419 var thead = document.createElement('thead'); 420 var headRow = document.createElement('tr'); 421 ['#', 'ã¹ã³ã¢', 'AI', 'ãã¼ã¸ / è¦åºã'].forEach(function (text) { 422 var th = document.createElement('th'); 423 th.textContent = text; 424 headRow.appendChild(th); 425 }); 426 thead.appendChild(headRow); 427 table.appendChild(thead); 428 429 var tbody = document.createElement('tbody');
430 data.candidates.forEach(function (item) { 431 var tr = document.createElement('tr'); 432 // AIã«æ¸¡ã£ããã£ã³ã¯ãè²ã§åºå¥ãã 433 if (item.inContext) { 434 tr.className = 'in'; 435 } 436 437 var rank = document.createElement('td'); 438 rank.className = 'num'; 439 rank.textContent = item.rank; 440 441 var score = document.createElement('td'); 442 score.className = 'num'; 443 score.textContent = item.score; 444 445 var flag = document.createElement('td'); 446 flag.textContent = item.inContext ? 'â' : ''; 447 448 var page = document.createElement('td'); 449 var link = document.createElement('a'); 450 link.href = item.url; 451 link.target = '_blank'; 452 link.rel = 'noopener'; 453 link.textContent = item.title + (item.heading ? ' / ' + item.heading : ''); 454 page.appendChild(link); 455 456 tr.appendChild(rank); 457 tr.appendChild(score); 458 tr.appendChild(flag); 459 tr.appendChild(page); 460 tbody.appendChild(tr); 461 }); 462 table.appendChild(tbody); 463 464 scroll.appendChild(table); 465 ui.debug.appendChild(scroll); 466 467 ui.debug.hidden = false; 468 } 469 470 function showError(ui, message) { 471 ui.status.hidden = true; 472 ui.answer.textContent = ''; 473 474 var p = document.createElement('p'); 475 p.className = 'error'; 476 p.textContent = message; 477 ui.answer.appendChild(p); 478 } 479 480 // -------------------------------------------------------------------- 481 // éä¿¡ 482 // -------------------------------------------------------------------- 483 484 /** 485 * SSEå½¢å¼ã®ããã¹ãããã¤ãã³ããåãåºãã 486 * fetch ã®ã¹ããªã¼ã ãèªåã§èªãããããã¼ã¹ãããã§è¡ãã 487 */ 488 function parseEvents(buffer, onEvent) { 489 var parts = buffer.split('\n\n'); 490 // æå¾ã®è¦ç´ ã¯ä¸å®å ¨ãªå¯è½æ§ããããããå¼ã³åºãå ã¸æ»ã 491 var remainder = parts.pop(); 492 493 parts.forEach(function (block) { 494 var name = 'message'; 495 var data = ''; 496 497 block.split('\n').forEach(function (line) { 498 if (line.indexOf('event:') === 0) { 499 name = line.slice(6).trim(); 500 } else if (line.indexOf('data:') === 0) { 501 data += line.slice(5).trim(); 502 } 503 }); 504 505 if (!data) { 506 return; 507 } 508 try { 509 onEvent(name, JSON.parse(data)); 510 } catch (e) { 511 /* 䏿£ãªJSONã¯ç¡è¦ãã */ 512 } 513 }); 514 515 return remainder; 516 } 517 518 function search(ui, query, controller) { 519 // finished 㯠done ã¤ãã³ããåãåã£ããã©ããã 520 // ãµã¼ããéä¸ã§è½ã¡ã㨠done ãå±ããªããããå¼ã³åºãå ã§å¾å§æ«ã§ãããã 521 // ç¶æ ãè¿ãã 522 var state = { received: false, finished: false }; 523 524 var handleEvent = function (name, data) { 525 if (name === 'sources') { 526 renderSources(ui, data); 527 } else if (name === 'debug') { 528 renderDebug(ui, data); 529 } else if (name === 'delta') { 530 if (!state.received) { 531 state.received = true; 532 ui.status.hidden = true; 533 } 534 ui.answer.appendChild(document.createTextNode(data.t || '')); 535 } else if (name === 'error') { 536 showError(ui, data.message || T.error); 537 } else if (name === 'done') { 538 state.finished = true; 539 ui.status.hidden = true; 540 // 注è¨ã¯ãææ°ã®æ å ±ã¯åç §ãã¼ã¸ãã確èªãã ãããã¨æ¡å ããæè¨ãªã®ã§ã 541 // åºå ¸ã1ä»¶ãç¡ãã¨ãã¯åºããªããåå¨ããªããã¼ã¸ãè¦ãããä¿ãã¦ãã¾ãã 542 // 該å½ãªãã»çæå¤±æã®ã¨ããåæ§ã«åºããªãã 543 ui.note.hidden = !state.received 544 || !!data.noResult 545 || !!data.failed 546 || ui.sources.hidden; 547 } 548 }; 549 550 return fetch(ENDPOINT, { 551 method: 'POST', 552 headers: { 'Content-Type': 'application/json' }, 553 body: JSON.stringify({ q: query, lang: LANG }), 554 signal: controller ? controller.signal : undefined, 555 credentials: 'same-origin' 556 }).then(function (response) { 557 if (!response.ok) { 558 throw new Error('HTTP ' + response.status); 559 } 560 561 // ReadableStreamã使ããªãç°å¢ã§ã¯ãå ¨æãåãåã£ã¦ãã䏿¬ã§å¦çãã 562 if (!response.body || !response.body.getReader) { 563 return response.text().then(function (text) { 564 parseEvents(text + '\n\n', handleEvent); 565 }); 566 } 567 568 var reader = response.body.getReader(); 569 var decoder = new TextDecoder('utf-8'); 570 var buffer = ''; 571 572 var pump = function () { 573 return reader.read().then(function (result) { 574 if (result.done) { 575 parseEvents(buffer + '\n\n', handleEvent); 576 return; 577 } 578 buffer += decoder.decode(result.value, { stream: true }); 579 buffer = parseEvents(buffer, handleEvent); 580 return pump(); 581 }); 582 }; 583 584 return pump(); 585 }).then(function () { 586 return state; 587 }); 588 } 589 590 // -------------------------------------------------------------------- 591 // èµ·å 592 // -------------------------------------------------------------------- 593
594 function init() { 595 var host = document.getElementById(MOUNT_ID); 596 if (!host) { 597 return; 598 } 599 600 var ui = build(host); 601 var inFlight = null; 602 603 ui.form.addEventListener('submit', function (event) { 604 event.preventDefault(); 605 606 var query = ui.input.value.trim(); 607 if (!query) { 608 ui.panel.hidden = false; 609 showError(ui, T.empty); 610 return; 611 } 612 613 // 飿ãããå ´åã¯åã®ãªã¯ã¨ã¹ãã䏿ãã 614 if (inFlight) { 615 inFlight.abort(); 616 } 617 inFlight = typeof AbortController !== 'undefined' ? new AbortController() : null; 618 619 ui.panel.hidden = false; 620 ui.answer.textContent = ''; 621 ui.note.hidden = true; 622 ui.sources.hidden = true; 623 ui.sources.textContent = ''; 624 ui.debug.hidden = true; 625 ui.debug.textContent = ''; 626 ui.button.disabled = true; 627 showLoading(ui); 628 629 search(ui, query, inFlight) 630 .then(function (result) { 631 // done ãå±ããªãã¾ã¾æ¥ç¶ãçµãã£ãå ´åï¼ãµã¼ãå´ã®ç°å¸¸çµäºãªã©ï¼ã 632 // ãããæ¾ããªãã¨ã表示ããåçã使ãã¦ãã¾ãâ¦ãã®ã¾ã¾æ¢ã¾ãã 633 if (result && !result.finished) { 634 ui.status.hidden = true; 635 if (!result.received) { 636 showError(ui, T.error); 637 } 638 } 639 }) 640 .catch(function (error) { 641 if (error && error.name === 'AbortError') { 642 return; 643 } 644 showError(ui, T.error); 645 }) 646 .then(function () { 647 ui.button.disabled = false; 648 inFlight = null; 649 }); 650 }); 651 } 652 653 if (document.readyState === 'loading') { 654 document.addEventListener('DOMContentLoaded', init); 655 } else { 656 init(); 657 } 658})();
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.