1/** 2 * ããã²ã¼ã·ã§ã³å®æ° 3 */ 4const FESS_NAVIGATION_PREV = -1; 5const FESS_NAVIGATION_NEXT = 1; 6const FESS_NAVIGATION_FIRST = 0; 7const FESS_NAVIGATION_EXACT = "e"; 8 9/** 10 * FESS URL 11 */ 12const BASE_URL = "https://www.accea.co.jp/search/api/v1/documents?q="; 13 14$(function(){ 15 $('#container') 16 // åãã¼ã¸ãªã³ã¯ãæ¼ãããã¨ãã®å¦ç 17 .on('click', '#prevPageLink', { navi: FESS_NAVIGATION_PREV }, doSearch) 18 // 次ãã¼ã¸ãªã³ã¯ãæ¼ãããã¨ãã®å¦ç 19 .on('click', '#nextPageLink', { navi: FESS_NAVIGATION_NEXT }, doSearch) 20 // æå®ãã¼ã¸ãªã³ã¯ãæ¼ãããã¨ãã®å¦ç 21 .on('click', '.pagerLink', { navi: FESS_NAVIGATION_EXACT }, doSearch); 22 // ã¯ã¨ãªãã©ã¡ã¼ã¿ã®è§£æ 23 const search = location.search; 24 const params = new URLSearchParams(search); 25 const query = params.get('query') || ''; 26 if (query !== null && query.length > 0) { 27 // æ¤ç´¢ã¯ã¨ãªãåå¨ããå ´åããã¼ã¸èªã¿è¾¼ã¿æã«æ¤ç´¢ãå®è¡ 28 $('#searchQuery').val(query); 29 doSearch({data:{navi: FESS_NAVIGATION_FIRST}}); 30 } 31}); 32 33/** 34 * ãã¼ã¸ãã¼ã·ã§ã³ã®éå§ä½ç½®ãè¨ç® 35 * 36 * @param {number} start ç¾å¨ã®éå§ä½ç½® 37 * @param {number} num 1ãã¼ã¸ãããã®ä»¶æ° 38 * @param {number|string} navi ãã¼ã¸ç§»åã¿ã¤ã (-1: å, 1: 次, "e": æå®ãã¼ã¸, 0: æå) 39 * @param {number|undefined} targetPageNum æå®ãã¼ã¸çªå· (naviã"e"ã®å ´åã«ä½¿ç¨) 40 * 41 * @returns {number} æ°ããéå§ä½ç½® 42 */ 43function getPageOffset(start, num, navi, targetPageNum) { 44 switch (navi) { 45 case FESS_NAVIGATION_PREV: 46 return Math.max(0, start - num); 47 case FESS_NAVIGATION_NEXT: 48 return start + num; 49 case FESS_NAVIGATION_EXACT: 50 if (targetPageNum !== undefined && targetPageNum > 0) { 51 return num * (targetPageNum - 1); 52 } 53 return start; 54 case FESS_NAVIGATION_FIRST: 55 default: 56 return 0; 57 } 58} 59 60/** 61 * URLã«å¯¾ãã¦æ¤ç´¢ãªã¯ã¨ã¹ããéä¿¡ 62 * 63 * @param {String} url ãªã¯ã¨ã¹ãå URL 64 * @param {Function} successHandler æåæãã³ãã© 65 * @param {Function} errorHandler 失ææãã³ãã© 66 * @param {Function} completeHandler å®äºæãã³ãã©(æåã»å¤±æåããå¼ã³åºã) 67 * @returns {void} 68 */ 69function sendSearchRequest(url, successHandler, errorHandler, completeHandler) { 70 $.ajax({ 71 url: url, 72 complete: completeHandler, 73 }).then( 74 successHandler, 75 errorHandler, 76 ); 77} 78 79/** 80 * æ¤ç´¢å¦ç 81 * 82 * @param {*} event ã¤ãã³ããªãã¸ã§ã¯ã 83 * @returns {void} 84 */ 85function doSearch(event) { 86 // æ¤ç´¢ãã¿ã³ã®jQueryãªãã¸ã§ã¯ã 87 const $searchButton = $('#searchButton'); 88 // 表示éå§ä½ç½®ã表示件æ°ã®åå¾ 89 let start = parseInt($('#searchStart').val()) 90 let num = parseInt($('#searchNum').val()); 91 92 // 表示éå§ä½ç½®ã®ãã§ã㯠93 if(start < 0) { 94 start = 0; 95 } 96 // 表示件æ°ã®ãã§ã㯠97 if(num < 1 || num > 100) { 98 num = 20; 99 } 100 101 // æå®ãã¼ã¸çªå·ã®åå¾ 102 let targetPageNum = parseInt($(event.target).data("page")); 103 targetPageNum = isNaN(targetPageNum) ? undefined : targetPageNum; 104 start = getPageOffset(start, num, event.data.navi, targetPageNum); 105 106 // æ¤ç´¢ãã£ã¼ã«ãã®å¤ãããªã ãã¦æ ¼ç´ 107 const searchQuery = $('#searchQuery').val().trim(); 108 109 // ãã©ã¦ã¶ã®å±¥æ´ãæ´æ° 110 const historyURL = new URL(location.pathname, location.origin); 111 historyURL.searchParams.set('query', searchQuery); 112 historyURL.searchParams.set('start', start); 113 window.history.pushState(null,null,historyURL.toString()); 114 115 // æ¤ç´¢ãã©ã¼ã ã空æåãã§ã㯠116 if (searchQuery.length === 0) { 117 // ãµããããããªãã®ã§ false ãè¿ã 118 return false; 119 } 120 121 // æ¤ç´¢ãã¿ã³ãç¡å¹ã«ãã 122 $searchButton.attr('disabled', true); 123 124 // æ¤ç´¢æåæãã³ãã© 125 const searchSuccessHandler = (dataResponse) => { 126 const $subheader = $('#subheader'); 127 const $result = $('#result'); 128 129 const recordCount = dataResponse.record_count; 130 let offset = 0; 131
132 // æ¤ç´¢çµæããªãå ´å 133 if(recordCount === 0) { // æ¤ç´¢çµæããªãå ´å 134 $subheader.empty(); 135 136 // çµæé åã«åºå 137 const $b = $('<b>').text(unescapeLucene(dataResponse.q)); 138 $result.empty().append($b).append(' ã«ä¸è´ããæ å ±ã¯è¦ã¤ããã¾ããã§ããã'); 139 140 updatePageInfomation(offset, num); 141 $(document).scrollTop(0); 142 return; 143 } 144 145 // æ¤ç´¢çµæãããå ´å 146 147 const pageNumber = dataResponse.page_number; 148 const pageSize = dataResponse.page_size; 149 const pageCount = dataResponse.page_count; 150 const startRange = (pageNumber - 1) * pageSize + 1; 151 const endRange = Math.min(pageNumber * pageSize, recordCount); 152 153 offset = startRange - 1; 154 155 const $b = $('<b>').text(unescapeLucene(dataResponse.q)); 156 $subheader.empty().append($b).append(' ã®æ¤ç´¢çµæ ' + recordCount + ' ä»¶ä¸ ' + startRange + ' - ' + endRange + ' ä»¶ç® (' + dataResponse.exec_time + ' ç§)'); 157 158 // æ¤ç´¢çµæé åã®ã¯ãªã¢ 159 $result.empty(); 160 161 // æ¤ç´¢çµæã®åºå 162 const $resultBody = $("<ol>", { 163 id: 'searchResultList', 164 class: 'searchResultList', 165 }); 166 167 const results = dataResponse.data; 168 169 for(let i = 0; i < results.length; i++) { 170 const $searchResultItem = createResultItem(results[i]); 171 $resultBody.append($searchResultItem); 172 } 173 174 $result.append($resultBody); 175 176 // ãã¼ã¸çªå·æ å ±ã®åºå 177 178 const $pageInfo = $('<div>', { 179 id: 'pageInfo', 180 class: 'mb40', 181 }); 182 183 // åã®ãã¼ã¸ã¸ã®ãªã³ã¯ 184 if(pageNumber > 1) { 185 const $prevPageLink = createPrevPageLink(); 186 $pageInfo.append($prevPageLink); 187 } 188 189 let omissionPt1 = false; // ç¾å¨ããåã®ãã¼ã¸çªå·ã®çç¥ã®ç¹ã ã表示ãããã®ãã©ã° 190 let omissionPt2 = false; // ç¾å¨ããå¾ã®ãã¼ã¸çªå·ã®çç¥ã®ç¹ã ã表示ãããã®ãã©ã° 191 192 // åãã¼ã¸ã¸ã®ãªã³ã¯ 193 for (let page = 1; page <= pageCount; page++) { 194 const pageItem = createPageItem(page, pageNumber, pageCount, omissionPt1, omissionPt2); 195 $pageInfo.append(pageItem.$dom); 196 omissionPt1 = pageItem.omissionPt1; 197 omissionPt2 = pageItem.omissionPt2; 198 } 199 200 // 次ã®ãã¼ã¸ã¸ã®ãªã³ã¯ 201 if(pageNumber < pageCount) { 202 const $nextPageLink = createNextPageLink(); 203 $pageInfo.append($nextPageLink); 204 } 205 206 $result.append($pageInfo); 207 208 // ãã¼ã¸æ å ±ã®æ´æ° 209 updatePageInfomation(offset, num); 210 // ãã¼ã¸è¡¨ç¤ºãä¸é¨ã«ç§»å 211 $(document).scrollTop(0); 212 }; 213 214 // æ¤ç´¢å¤±ææãã³ãã© 215 const searchErrorHandler = (error) => { 216 alert("æ¤ç´¢ä¸ã«åé¡ãçºçãã¾ããã管çè ã«ãç¸è«ãã ããã"); 217 console.error('Search API ERROR:', error); 218 }; 219 220 // æ¤ç´¢å®äºæãã³ãã© 221 const searchCompleteHandler = () => { 222 // æ¤ç´¢ãã¿ã³ãæå¹ã«ãã 223 $searchButton.attr('disabled', false); 224 } 225 226 const searchUrl = BASE_URL + encodeURIComponent(escapeLuceneSpecialChars(searchQuery)) + '&start=' + start + '&num=' + num; 227 228 // æ¤ç´¢ãªã¯ã¨ã¹ãéä¿¡ 229 sendSearchRequest(searchUrl, 230 // æåæãã³ãã© 231 searchSuccessHandler, 232 // 失ææãã³ãã© 233 searchErrorHandler, 234 // å®äºæãã³ãã© 235 searchCompleteHandler 236 ); 237 238 // ãµããããããªãã®ã§ false ãè¿ã 239 return false; 240}; 241 242/** 243 * ãã¼ã¸æ å ±ã®æ´æ° 244 * 245 * @param {number} start éå§ä½ç½® 246 * @param {number} num ä»¶æ° 247 */ 248function updatePageInfomation(start, num) { 249 $('#searchStart').val(start); 250 $('#searchNum').val(num); 251} 252 253/** 254 * åã®ãã¼ã¸ã«æ»ããªã³ã¯ã®ä½æ 255 * 256 * @returns {jQuery<HTMLAnchorElement>} 257 */ 258function createPrevPageLink() { 259 const $prevPageLink = $('<a>', { 260 id: 'prevPageLink', 261 class: 'now_result_page', 262 href: '#', 263 }); 264 265 const $acIcon = $('<i>', { 266 class: 'acIcon acIcon--arrow_p_left', 267 }); 268 $prevPageLink.append($acIcon); 269 270 return $prevPageLink; 271} 272 273/** 274 * 次ã®ãã¼ã¸ã«é²ããªã³ã¯ã®ä½æ 275 * 276 * @returns {jQuery<HTMLAnchorElement>} 277 */ 278function createNextPageLink() { 279 const $nextPageLink = $('<a>', { 280 id: 'nextPageLink', 281 class: 'now_result_page', 282 href: '#', 283 }); 284 285 const $acIcon = $('<i>', { 286 class: 'acIcon acIcon--arrow_p_right', 287 }); 288 $nextPageLink.append($acIcon); 289 290 return $nextPageLink; 291} 292 293/** 294 * æå®ãã¼ã¸ãªã³ã¯ã®ä½æ 295 * 296 * @param {number} page ãã¼ã¸çªå· 297 * @returns {jQuery<HTMLAnchorElement>} 298 */ 299function createPageLink(page) { 300 return $('<a>', { 301 href: '#', 302 class: 'now_result_page pagerLink', 303 'data-page': page, 304 text: page, 305 }); 306} 307 308/** 309 * ç¾å¨ã®ãã¼ã¸ã¢ã¤ãã ã®ä½æ 310 * 311 * @param {number} page ãã¼ã¸çªå· 312 * @returns {jQuery<HTMLSpanElement>} 313 */ 314function createCurrentPage(page) { 315 return $('<span>', { 316 class: 'now_result_page', 317 text: page, 318 }); 319} 320 321/** 322 * çç¥ç¹ã®ä½æ 323 * 324 * @returns {jQuery<HTMLSpanElement>} 325 */ 326function createEllipsis() { 327 return $('<span>', { 328 class: 'omissionPt', 329 text: '...', 330 }); 331} 332 333/** 334 * æ¤ç´¢çµæã¢ã¤ãã ã®ä½æ 335 * 336 * @param {{ 337 * url_link: string, 338 * title: string, 339 * content_description: string, 340 * site: string, 341 * }} result 342 * @returns {jQuery<HTMLLIElement>} 343 */ 344function createResultItem(result) { 345 const $searchResultItem = $('<li>', { 346 class: 'searchResultItem', 347 }); 348 349 const $link = $('<a>', { 350 href: result.url_link, 351 class: 'searchResultItem__link', 352 }); 353 354 const $title = $('<h3>', { 355 class: 'searchResultItem__title', 356 text: result.title, 357 }); 358 359 $link.append($title); 360 361 const $description = $('<div>', { 362 class: 'searchResultItem__body', 363 html: result.content_description // FESSã®ãã¤ã©ã¤ãã¿ã°ãå«ã¾ãããã text ã§ã¯ãªã html ãä½¿ç¨ 364 }); 365 366 const $site = $('<cite>', { 367 class: 'searchResultItem__url', 368 text: result.site 369 }); 370 371 $description 372 .append('<br/>') 373 .append($site); 374 375 $link.append($description); 376 377 $searchResultItem 378 .append($link); 379 380 return $searchResultItem; 381} 382 383/** 384 * ãã¼ã¸ç§»åã¢ã¤ãã ã®ä½æ 385 * 386 * @param {number} page ãã¼ã¸çªå· 387 * @param {number} pageNumber ç¾å¨ã®ãã¼ã¸çªå· 388 * @param {number} pageCount ç·ãã¼ã¸æ° 389 * @param {boolean} omissionPt1 390 * @param {boolean} omissionPt2 391 * @returns {{ $dom: jQuery<HTMLElement>, omissionPt1: boolean, omissionPt2: boolean }} 392 */ 393function createPageItem(page, pageNumber, pageCount, omissionPt1, omissionPt2) { 394 let $dom; 395 // ç¾å¨ã®ãã¼ã¸ 396 if (page === pageNumber) { 397 $dom = createCurrentPage(page); 398 } 399 400 // å é ã¨æ«å°¾ã®ãã¼ã¸ 401 else if (page === 1 || page === pageCount) { 402 $dom = createPageLink(page); 403 } 404 405 // ç¾å¨ã®ãã¼ã¸ã4以ä¸ã®å ´åãæåã®6ãã¼ã¸ã表示 406 else if (pageNumber < 4 && page < 6) { 407 $dom = createPageLink(page); 408 } 409 410 // ç¾å¨ãã¼ã¸-2ãããåã®ãã¼ã¸ 411 // ç¾å¨ã5ãã¼ã¸ã®ã¨ãã2ãã¼ã¸ä»¥å 412 else if (page < (pageNumber - 2)) { 413 // çç¥ç¹ã表示 414 if (!omissionPt1) { 415 omissionPt1 = true; 416 $dom = createEllipsis(); 417 } 418 } 419 420 // ç¾å¨ãã¼ã¸ + 2ãããå¾ã®ãã¼ã¸ 421 // ç¾å¨ã5ãã¼ã¸ã®ã¨ãã8ãã¼ã¸ä»¥é 422 else if (page > (pageNumber + 2)) { 423 // çç¥ç¹ã表示 424 if (!omissionPt2) { 425 omissionPt2 = true; 426 $dom = createEllipsis(); 427 } 428 } 429 430 else { 431 $dom = createPageLink(page); 432 } 433 434 return { 435 $dom: $dom, 436 omissionPt1: omissionPt1, 437 omissionPt2: omissionPt2, 438 }; 439} 440 441/** 442 * FESSå é¨ã§ä½¿ãããã®Luceneç¹æ®æåãã¨ã¹ã±ã¼ããã 443 * 444 * @param {string} str 445 * @returns {string} 446 */ 447function escapeLuceneSpecialChars(str) { 448 return str.replace(/([+\-!(){}\[\]^"~*?:\\/])/g, "\\$1"); 449} 450 451function unescapeLucene(str) { 452 // ããã¯ã¹ã©ãã·ã¥ã§ã¨ã¹ã±ã¼ãããã¦ããæåãå ã«æ»ã 453 return str.replace(/\\([+\-!(){}\[\]^"~*?:\\/])/g, '$1'); 454}
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.