1/* ============================================================================ 2 news.js ãã¥ã¼ã¹ï¼ãªãªã¼ã¹ã»åºåæ²è¼æ å ± ç¨ã®è¿½å JSï¼2026-09-28ï¼ 3 ç½®ãå ´æï¼/books/assets/news.jsï¼FTPï¼ãããã¿ã¼ã® Advanced Text ã« 4 script ã¿ã°ï¼?v= ä»ãï¼ã1è¡è¶³ãã¦èªã¿è¾¼ããå ¨ãã¼ã¸ã§èªã¾ããã®ã§ã 5 対象ãã¼ã¸ä»¥å¤ã§ã¯æåã®å¤å®ã§ä½ãããã«çµããã 6 è¦ãç®ã¯è¿½å CSSã22ãï¼news.cssï¼ããã®JS㯠#primary ã« .nw-js ãä»ã㦠7 ã22ãã® 22-9 以éã«æ¸ããå½¢ãçµãã ããJS ãåããªãã¦ãã22ãã®åå°ã§èªããã 8 9 ã»æ¢åãã¼ãã¯ç§»åã¨ã¯ã©ã¹ã»å±æ§ã®ä»ãè¶³ãã ããæåã®æ¸ãæãã»åé¤ã¯ããªãã 10 ä¾å¤ã¯ä»æ§ã§æ±ºãã1ã¤ã ãï¼ä¸è¦§ã§ã...ãã§åããã¿ã¤ãã«ãããªã³ã¯ã® title 屿§ 11 ï¼ãPermanent Link to å ¨æãï¼ã®å ¨æã«æ»ãã 12 ã»æ°ããä½ãã®ã¯å ¥ãç©ã»è¦åºãã¾ããï¼åæ¿ã»è±åã©ãã«ã»è¡¨ã®è¦åºãè¡ï¼ã» 13 æ¥ä»ã®è¡¨ç¤ºç¨ã®åãï¼YYYY.MM.DDï¼ã»ãæ²è¼äºå®ãã»å¯¾è±¡æ¸ç±ã®æ¸åã®åãã» 14 æ¸ç±ã«ã¼ãã»ä¸è¦§ã¸æ»ããã¿ã³ãå ã®ãã¼ãã§ä½¿ããªããã®ã¯ .nw-src ã§é ãã ã 15 ã»åºåã®æ²è¼æ¥ï¼è¨äºã®ã¹ã©ãã° ad{YYYYMMDD}ï¼æ«å°¾ã« b ãªã©ãä»ããã¨ãããï¼ã 16 æ¬æã®ãYYYYå¹´MæDæ¥ã®ãã¨é£ãéãã°æ¬æãåªå ï¼ã¹ã©ãã°ã®å¹´ã®èª¤ããããããï¼ã 17 ã©ã¡ããç¡ããã°æç¨¿æ¥ 18 ã»åºåè¨äºã®æ¸ç±ï¼çå ãããã³ã ã®åãè¾¼ã¿ãåºã¦ããã°ããã®ä¸èº«ãç§»ãã¦ã«ã¼ãã«çµãã 19 åºã¦ããªããã°ï¼ãå¯¾è±¡ã®æ¸ç±ã¯ã¿ã¤ããã¾ãããï¼og:image ã® ISBN ã¨æ¬æã®ããããçµã¿ã 20 /data/books/index.jsonï¼èªç¤¾ã«ç½®ããæ¸èªã®åãï¼ã§å®ä¾¡ã»çºå£²æ¥ãè£ãã 21 åããªããã°æ¸åï¼ãæ¸èªãã¼ã¸ã¸ãã ã 22 ã»æ¸å½±ï¼/data/bookimg/covers.json ã«ããæ¬ã¯èªç¤¾ _250 â çå ãããã³ã ï¼3ç§ã§è¦åãï¼ 23 â 代æ¿è¡¨ç´ï¼ã19ãã® .bd-cover-altï¼ãç¡ãæ¬ã¯çå ãããã³ã â 代æ¿è¡¨ç´ 24 ã»æå 確èªç¨ã« ?nw-today=YYYYMMDD ã§ã仿¥ããå¤ããããï¼ãæ²è¼äºå®ãã®ç¢ºèªç¨ï¼ 25 ============================================================================ */ 26(function () { 27 'use strict'; 28 29 /* ---- è¨å®ï¼ãã¼ãããã©ã°ã¤ã³ã®åºåãå¤ãã£ãããããã ãç´ãï¼ ---- */ 30 var SEL = { 31 primary: '#primary', 32 singleNews: '.content.s-category-news', /* è¨äºï¼body ã«ã«ãã´ãªãåºãªãã®ã§ããã¼ãã®å ¥ãç©ã§è¦åãã */ 33 singleAd: '.content.s-category-adnews', 34 crumbs: 'ul.breadcrumbs', 35 pageTitle: 'h2.page-title', /* ä¸è¦§ã®è¦åºãï¼Â» ä»ãã».hideï¼ */ 36 post: 'div.post.hentry', /* ä¸è¦§ï¼1ä»¶å */ 37 titleLink: 'h2.entry-title > a[rel="bookmark"]', 38 published: '.entry-header .published', /* æç¨¿æ¥ã2026å¹´7æ23æ¥ã */ 39 excerpt: '.entry-content > p', 40 entry: 'div.hentry', /* è¨äºï¼æ¬ä½ */ 41 header: '.entry-header', 42 content: '.entry-content', 43 nav: '.navigation-links.single-page-navigation', 44 navLink: '.nav-previous > a, .nav-next > a', 45 bookList: 'ul.side_by_side', /* åºåè¨äºï¼çå ãããã³ã ã®åãè¾¼ã¿ï¼1åãã¨ã«1ã¤ï¼ */ 46 bookItem: 'li', 47 bookLink: 'a[href*="/bd/isbn/"]', 48 bookTitle: 'strong.h5', 49 bookDate: 'span.h6', 50 bookPrice: 'strong.text-danger', 51 bookTax: 'span.small', 52 ogImage: 'meta[property="og:image"]' 53 }; 54 var URL_NEWS = '/news/'; 55 var URL_ADNEWS = '/adnews/'; 56 var URL_BD = '/bd/isbn/'; 57 var URL_SEARCH_TITLE = '/bd/search/title/'; 58 var OWN_IMG = '/data/bookimg/'; 59 var OWN_SIZE = '_250.jpg'; 60 var COVERS_JSON = '/data/bookimg/covers.json'; 61 var BOOKS_INDEX = '/data/books/index.json'; 62 var HANMOTO_IMG = 'https://www.hanmoto.com/bd/img/'; 63 var HANMOTO_SIZE = '_130.jpg'; 64 var TIMEOUT = 3000; 65 var TITLE_PREFIX = /^\s*Permanent Link to\s*/; 66 var TAX = 1.1; 67 68 var primary = document.querySelector(SEL.primary); 69 if (!primary || /(^| )nw-js( |$)/.test(primary.className)) { return; } 70 71 /* ---- ãã¼ã¸ã®ç¨®é¡ ---- */ 72 var body = document.body; 73 var mode = null; 74 if (/(^| )category-news( |$)/.test(body.className)) { 75 mode = 'news'; 76 } else if (/(^| )category-adnews( |$)/.test(body.className)) { 77 mode = 'adlist'; 78 } else if (document.querySelector(SEL.singleNews + ' ' + SEL.primary)) { 79 mode = 'newsitem'; 80 } else if (document.querySelector(SEL.singleAd + ' ' + SEL.primary)) { 81 mode = 'aditem';
82 } 83 if (!mode) { return; } 84 85 /* ---- å°ããªéå · ---- */ 86 function el(tag, cls, str) { 87 var e = document.createElement(tag); 88 if (cls) { e.className = cls; } 89 if (str) { e.textContent = str; } 90 return e; 91 } 92 function link(href, cls, str) { 93 var a = el('a', cls, str); 94 a.setAttribute('href', href); 95 return a; 96 } 97 function text(e) { 98 return e ? (e.textContent || '').replace(/\s+/g, ' ').trim() : ''; 99 } 100 function addClass(e, c) { 101 if (e && (' ' + e.className + ' ').indexOf(' ' + c + ' ') < 0) { 102 e.className = (e.className ? e.className + ' ' : '') + c; 103 } 104 } 105 function each(list, fn) { 106 for (var i = 0; i < list.length; i++) { fn(list[i], i); } 107 } 108 function after(ref, node) { 109 ref.parentNode.insertBefore(node, ref.nextSibling); 110 } 111 112 /* ---- æ¥ä» ---- */ 113 function mkDate(y, m, d) { 114 y = +y; m = +m; d = +d; 115 if (!y || m < 1 || m > 12 || d < 1 || d > 31) { return null; } 116 return { y: y, m: m, d: d }; 117 } 118 function pad(n) { return (n < 10 ? '0' : '') + n; } 119 function fmt(d) { return d.y + '.' + pad(d.m) + '.' + pad(d.d); } 120 function iso(d) { return d.y + '-' + pad(d.m) + '-' + pad(d.d); } 121 function key(d) { return d.y * 10000 + d.m * 100 + d.d; } 122 function jaDate(s) { 123 var m = (s || '').match(/(\d{4})å¹´(\d{1,2})æ(\d{1,2})æ¥/); 124 return m ? mkDate(m[1], m[2], m[3]) : null; 125 } 126 /* æ¬æã®ã2026å¹´10æ3æ¥ã®æ¯æ¥æ°èãã®æ¥ä» */ 127 function bodyDate(s) { 128 var m = (s || '').match(/(\d{4})å¹´(\d{1,2})æ(\d{1,2})æ¥ã®/); 129 return m ? mkDate(m[1], m[2], m[3]) : null; 130 } 131 /* ã¹ã©ãã° ad20261003ï¼ad20250612b ã®ããã«å¾ãã«æåãä»ããã¨ãããï¼ */ 132 function slugDate(href) { 133 var m = (href || '').match(/\/ad(\d{4})(\d{2})(\d{2})[a-z]?\/?(?:[?#]|$)/); 134 return m ? mkDate(m[1], m[2], m[3]) : null; 135 } 136 function adDate(slug, str, posted) { 137 var b = bodyDate(str); 138 if (slug && b && key(slug) !== key(b)) { return b; } 139 return slug || b || posted; 140 } 141 function todayKey() { 142 var m = location.search.match(/[?&]nw-today=(\d{8})/); 143 if (m) { return +m[1]; } 144 var t = new Date(); 145 return t.getFullYear() * 10000 + (t.getMonth() + 1) * 100 + t.getDate(); 146 } 147 var TODAY = todayKey(); 148 149 function timeEl(d) { 150 var t = el('time', 'nw-date', fmt(d)); 151 t.setAttribute('datetime', iso(d)); 152 return t; 153 } 154 function upcomingTag(d) { 155 return key(d) >= TODAY ? el('span', 'nw-tag', 'æ²è¼äºå®') : null; 156 } 157 /* æ¬æã»æç²ããããã§å²ã¾ããæ¸åãåãåºãï¼éè¤ã¯1ã¤ã«ï¼ */ 158 function bookTitles(str) { 159 var out = []; 160 var re = /ã([^ã]+)ã/g; 161 var m; 162 while ((m = re.exec(str || ''))) { 163 if (out.indexOf(m[1]) < 0) { out.push(m[1]); } 164 } 165 return out; 166 } 167 168 /* ---- ä¸è¦§ï¼è¦åºãï¼ãã³ããï¼è¦åºãï¼2ãã¼ã¸ã®åæ¿ï¼ ---- */ 169 function buildListHead(isAd) { 170 var h = primary.querySelector(SEL.pageTitle); 171 if (!h) { return; } 172 var crumbs = primary.querySelector(SEL.crumbs); 173 var head = el('div', 'nw-head'); 174 var main = el('div', 'nw-head-main'); 175 primary.insertBefore(head, crumbs && crumbs.parentNode === primary ? crumbs : h); 176 if (crumbs) { main.appendChild(crumbs); } 177 main.appendChild(h); 178 head.appendChild(main); 179 180 var seg = el('nav', 'nw-seg'); 181 seg.setAttribute('aria-label', 'ãã¥ã¼ã¹ã®ç¨®é¡'); 182 [['ãã¥ã¼ã¹ï¼ãªãªã¼ã¹', URL_NEWS, !isAd], ['åºåæ²è¼æ å ±', URL_ADNEWS, isAd]].forEach(function (s) { 183 var a = link(s[1], '', s[0]); 184 if (s[2]) { a.setAttribute('aria-current', 'page'); } 185 seg.appendChild(a); 186 }); 187 head.appendChild(seg); 188 } 189 190 /* åããã¿ã¤ãã«ã title 屿§ã®å ¨æã«æ»ã */ 191 function fullTitle(a) { 192 var t = (a.getAttribute('title') || '').replace(TITLE_PREFIX, '').trim(); 193 if (t && text(a) !== t) { a.textContent = t; } 194 } 195 196 /* æç¨¿æ¥ã YYYY.MM.DD ã®åãã«ï¼å ã® span ã¯é ãï¼ */ 197 function copyDate(span) { 198 var d = span && jaDate(text(span)); 199 if (!d) { return null; } 200 addClass(span, 'nw-src'); 201 after(span, timeEl(d)); 202 return d; 203 } 204 205 /* æç²ã®æ«å°¾ã®ã[â¦]ãã span ã«å ãã§é ã */ 206 function hideEllipsis(p) { 207 var n = p && p.lastChild; 208 if (!n || n.nodeType !== 3) { return; } 209 var m = n.nodeValue.match(/\s*\[(?:â¦|\.\.\.)\]\s*$/); 210 if (!m) { return; } 211 var tail = n.splitText(m.index); 212 var s = el('span', 'nw-src'); 213 p.insertBefore(s, tail); 214 s.appendChild(tail); 215 } 216 217 /* ---- A. ãã¥ã¼ã¹ä¸è¦§ï¼1aï¼ ---- */ 218 function buildNewsList() { 219 buildListHead(false); 220 each(primary.querySelectorAll(SEL.post), function (post) { 221 var a = post.querySelector(SEL.titleLink); 222 if (a) { fullTitle(a); } 223 copyDate(post.querySelector(SEL.published)); 224 hideEllipsis(post.querySelector(SEL.excerpt)); 225 }); 226 } 227 228 /* ---- B. åºåä¸è¦§ï¼2bï¼ï¼æ²è¼æ¥ï½æ²è¼ï½å¯¾è±¡æ¸ç±ï½â ã®è¡¨ ---- */ 229 function buildAdList() { 230 buildListHead(true); 231 var posts = primary.querySelectorAll(SEL.post); 232 if (!posts.length) { return; } 233 var thead = el('div', 'nw-thead'); 234 thead.setAttribute('aria-hidden', 'true');
235 ['æ²è¼æ¥', 'æ²è¼', '対象æ¸ç±', ''].forEach(function (s) { thead.appendChild(el('span', '', s)); }); 236 posts[0].parentNode.insertBefore(thead, posts[0]); 237 238 each(posts, function (post) { 239 var a = post.querySelector(SEL.titleLink); 240 if (a) { fullTitle(a); } 241 var ex = text(post.querySelector(SEL.excerpt)); 242 var posted = jaDate(text(post.querySelector(SEL.published))); 243 var d = adDate(slugDate(a && a.getAttribute('href')), ex, posted); 244 245 var cell = el('div', 'nw-ad-date'); 246 if (d) { 247 cell.appendChild(timeEl(d)); 248 var tag = upcomingTag(d); 249 if (tag) { cell.appendChild(tag); } 250 } 251 post.insertBefore(cell, post.firstChild); 252 253 var titles = bookTitles(ex); 254 post.appendChild(el('span', 'nw-ad-books', titles.length ? 'ã' + titles.join('ãã') + 'ã' : '')); 255 addClass(post, 'nw-ad-row'); 256 }); 257 } 258 259 /* ---- æ¸å½±ï¼èªç¤¾ â çå ãããã³ã â 代æ¿è¡¨ç´ï¼booklist.js ã¨åãèãæ¹ï¼ ---- */ 260 var coversPromise = null; 261 function fetchJson(url) { 262 if (!window.fetch || !window.Promise) { return { then: function (f) { f(null); } }; } 263 return Promise.race([ 264 fetch(url).then(function (r) { return r.ok ? r.json() : null; }).catch(function () { return null; }), 265 new Promise(function (res) { setTimeout(function () { res(null); }, TIMEOUT); }) 266 ]); 267 } 268 function ownCovers(done) { 269 if (!coversPromise) { coversPromise = fetchJson(COVERS_JSON); } 270 coversPromise.then(function (d) { 271 var own = {}; 272 each((d && d.isbn) || [], function (s) { own[s] = true; }); 273 done(own); 274 }); 275 } 276 function drawAlt(img, isbn, title) { 277 var box = img.parentNode; 278 if (!box || box.querySelector('.bd-cover-alt')) { return; } 279 var alt = el('div', 'bd-cover-alt'); 280 alt.setAttribute('role', 'img'); 281 alt.setAttribute('aria-label', (title || 'æ¸ç±') + 'ï¼æ¸å½±ãªãï¼'); 282 alt.appendChild(el('div', 'bd-cover-alt-brand', 'STYLENOTE')); 283 var mid = el('div'); 284 mid.appendChild(el('p', 'bd-cover-alt-title', title || '')); 285 alt.appendChild(mid); 286 alt.appendChild(el('div', 'bd-cover-alt-foot', 'ISBN' + isbn)); 287 img.style.display = 'none'; 288 box.appendChild(alt); 289 } 290 function waitImg(img, timeout, ok, ng) { 291 var done = false; 292 var timer = null; 293 function finish(good) { 294 if (done) { return; } 295 done = true; 296 clearTimeout(timer); 297 img.removeEventListener('load', onLoad); 298 img.removeEventListener('error', onError); 299 if (good) { ok(); } else { ng(); } 300 } 301 function onLoad() { finish(img.naturalWidth > 0); } 302 function onError() { finish(false); } 303 if (img.complete && img.getAttribute('src')) { 304 finish(img.naturalWidth > 0); 305 return; 306 } 307 img.addEventListener('load', onLoad); 308 img.addEventListener('error', onError); 309 if (timeout) { 310 timer = setTimeout(function () { finish(img.complete && img.naturalWidth > 0); }, timeout); 311 } 312 } 313 /* img ã® src ã¯çå ãããã³ã ã®ãã®ï¼ç¡ããã°ç©ºï¼ã§æ¸¡ã */ 314 function setCover(img, isbn, title) { 315 var hanmoto = img.getAttribute('src') || HANMOTO_IMG + isbn + HANMOTO_SIZE; 316 function toHanmoto() { 317 img.setAttribute('src', hanmoto); 318 waitImg(img, TIMEOUT, function () {}, function () { drawAlt(img, isbn, title); }); 319 } 320 img.setAttribute('decoding', 'async'); 321 ownCovers(function (own) { 322 if (own[isbn]) { 323 img.setAttribute('src', OWN_IMG + isbn + OWN_SIZE); 324 waitImg(img, 0, function () {}, toHanmoto); 325 } else if (img.getAttribute('src')) { 326 waitImg(img, TIMEOUT, function () {}, function () { drawAlt(img, isbn, title); }); 327 } else { 328 toHanmoto(); 329 } 330 }); 331 } 332 333 /* ---- æ¸ç±ã«ã¼ã ---- */ 334 function bookButton(isbn) { 335 var a = link(URL_BD + isbn + '/', 'nw-book-btn'); 336 a.appendChild(el('span', '', 'æ¸èªãã¼ã¸ã¸')); 337 a.appendChild(el('span', 'nw-arrow', 'â')); 338 return a; 339 } 340 function cardShell() { 341 var card = el('div', 'nw-book'); 342 var cover = el('div', 'nw-book-cover'); 343 var info = el('div', 'nw-book-info'); 344 info.appendChild(el('span', 'nw-book-label', 'åºåæ²è¼æ¸ç±')); 345 card.appendChild(cover); 346 card.appendChild(info); 347 return { card: card, cover: cover, info: info }; 348 } 349 /* çå ãããã³ã ã®åãè¾¼ã¿ï¼liï¼ã®ä¸èº«ãç§»ãã¦çµã */ 350 function cardFromItem(li) { 351 var a = li.querySelector(SEL.bookLink); 352 var m = a && (a.getAttribute('href') || '').match(/(97[89]\d{10})/); 353 if (!m) { return null; } 354 var isbn = m[1]; 355 var c = cardShell(); 356 var img = a.querySelector('img'); 357 addClass(a, 'nw-book-img'); 358 c.cover.appendChild(a); 359 var t = li.querySelector(SEL.bookTitle); 360 if (t) { addClass(t, 'nw-book-title'); c.info.appendChild(t); } 361 var d = li.querySelector(SEL.bookDate); 362 if (d) { addClass(d, 'nw-book-date'); c.info.appendChild(d); } 363 var p = li.querySelector(SEL.bookPrice); 364 if (p) { 365 var row = el('div', 'nw-book-price'); 366 row.appendChild(p); 367 var tax = li.querySelector(SEL.bookTax); 368 if (tax) { row.appendChild(tax); } 369 c.info.appendChild(row); 370 } 371 c.info.appendChild(bookButton(isbn)); 372 if (img) { setCover(img, isbn, img.getAttribute('alt') || text(t)); } 373 return c.card; 374 } 375 /* åãè¾¼ã¿ãç¡ãã¨ãï¼ISBN ã¨æ¸åããçµããdata 㯠index.json ã®1ååï¼ç¡ã
375ãã° nullï¼ */ 376 function cardFromData(isbn, title, data) { 377 var c = cardShell(); 378 var name = (data && data.title) || title || ''; 379 var a = link(URL_BD + isbn + '/', 'nw-book-img'); 380 var img = el('img'); 381 img.setAttribute('alt', name); 382 a.appendChild(img); 383 c.cover.appendChild(a); 384 if (name) { 385 var t = el('strong', 'nw-book-title'); 386 t.appendChild(link(URL_BD + isbn + '/', '', name)); 387 c.info.appendChild(t); 388 } 389 if (data && /^\d{8}$/.test(data.date_release || '')) { 390 var r = data.date_release; 391 c.info.appendChild(el('span', 'nw-book-date', 'æ¸åºçºå£²æ¥ ' + r.slice(0, 4) + '.' + r.slice(4, 6) + '.' + r.slice(6, 8))); 392 } 393 if (data && +data.price > 0) { 394 var row = el('div', 'nw-book-price'); 395 row.appendChild(el('strong', '', Math.round(+data.price * TAX).toLocaleString('ja-JP') + 'å')); 396 row.appendChild(el('span', 'nw-tax', 'ï¼ç¨è¾¼ï¼')); 397 c.info.appendChild(row); 398 } 399 c.info.appendChild(bookButton(isbn)); 400 setCover(img, isbn, name); 401 return c.card; 402 } 403 /* ISBN ãåãããªã2åç®ä»¥éï¼æ¸åã ãã®è¡ï¼æ¸åã®æ¤ç´¢ã¸ï¼ */ 404 function bookLine(title) { 405 var p = el('p', 'nw-book-line'); 406 p.appendChild(link(URL_SEARCH_TITLE + encodeURIComponent(title) + '/', '', 'ã' + title + 'ã')); 407 return p; 408 } 409 function norm(s) { return (s || '').replace(/[\sã]+/g, ''); } 410 /* æ¸åã§ index.json ã®æ¬ãæ¢ããå®å ¨ä¸è´ãåªå ããç¡ããã°ãæ¸åï¼ãâ¦ããªã©ãã®åæ¹ä¸è´ã§ä¸çªé·ããã®ã 411 ãããç¡ãããæ¥æ¬ã®ç¹ç¶ã¨äººâ ã»â ¡ãã®ããã«å·»ãã¾ã¨ããæ¸ãæ¹ãªãããã®å·»ãå ¨é¨ï¼æ¸åé ï¼ */ 412 var VOLS = '[â ⠡⠢⠣⠤⠥⠦⠧⠨⠩ä¸ä¸ä¸0-9ï¼-ï¼]'; 413 function findBooks(books, title) { 414 var one = findBook(books, title); 415 if (one) { return [one]; } 416 var n = norm(title); 417 var m = n.match(new RegExp('^(.{4,}?)' + VOLS + '+(?:[ã»,ãï½ã-]' + VOLS + '+)+$')); 418 if (!m) { return []; } 419 var re = new RegExp('^' + VOLS + '+$'); 420 return books.filter(function (b) { 421 var bt = norm(b.title); 422 return bt.indexOf(m[1]) === 0 && re.test(bt.slice(m[1].length)); 423 }).sort(function (a, b) { return a.title < b.title ? -1 : 1; }); 424 } 425 function findBook(books, title) { 426 var n = norm(title); 427 var hit = null; 428 each(books, function (b) { 429 var bt = norm(b.title); 430 if (!bt) { return; } 431 if (bt === n) { hit = { b: b, len: 1e9 }; } 432 else if (bt.length >= 4 && n.indexOf(bt) === 0 && /^[ãï¼(ãã]/.test(n.slice(bt.length)) && (!hit || bt.length > hit.len)) { 433 hit = { b: b, len: bt.length }; 434 } 435 }); 436 return hit && hit.b; 437 } 438 function byIsbn(books, isbn) { 439 for (var i = 0; i < books.length; i++) { if (books[i].isbn13 === isbn) { return books[i]; } } 440 return null; 441 } 442 443 function buildBooks(content, bodyEl, firstText) { 444 var lists = content.querySelectorAll(SEL.bookList); 445 var box = el('div', 'nw-books'); 446 if (lists.length) { lists[0].parentNode.insertBefore(box, lists[0]); } else { bodyEl.appendChild(box); } 447 448 var items = []; 449 each(lists, function (ul) { 450 each(ul.querySelectorAll(SEL.bookItem), function (li) { items.push(li); }); 451 addClass(ul, 'nw-src'); 452 }); 453 454 /* 1. åãè¾¼ã¿ãåºã¦ããï¼ä¸èº«ãç§»ã */ 455 var made = 0; 456 each(items, function (li) { 457 var card = cardFromItem(li); 458 if (card) { box.appendChild(card); made++; } 459 }); 460 if (made) { return; } 461 462 /* 2. åºã¦ããªãï¼og:image ã® ISBN ã¨æ¬æã®ãããã */ 463 var og = document.querySelector(SEL.ogImage); 464 var m = og && (og.getAttribute('content') || '').match(/\/bd\/img\/(97[89]\d{10})/); 465 var ogIsbn = m ? m[1] : ''; 466 var titles = bookTitles(firstText); 467 if (!ogIsbn && !titles.length) { box.parentNode.removeChild(box); return; } 468 469 var loading = el('p', 'nw-book-loading', 'èªã¿è¾¼ã¿ä¸'); 470 box.appendChild(loading); 471 fetchJson(BOOKS_INDEX).then(function (d) { 472 var books = (d && d.books) || []; 473 box.removeChild(loading); 474 var done = {}; 475 var list = titles.length ? titles : ['']; 476 each(list, function (title, i) { 477 var hits = title ? findBooks(books, title) : []; 478 if (!hits.length && i === 0 && ogIsbn) { hits = [byIsbn(books, ogIsbn) || { isbn13: ogIsbn }]; } 479 var shown = 0; 480 each(hits, function (b) { 481 if (done[b.isbn13]) { return; } 482 done[b.isbn13] = true; 483 box.appendChild(cardFromData(b.isbn13, title, b.title ? b : null)); 484 shown++; 485 }); 486 if (!shown && title && !hits.length) { box.appendChild(bookLine(title)); } 487 }); 488 if (!box.firstChild) { box.parentNode.removeChild(box); } 489 }); 490 } 491 492 /* ---- C/D. è¨äºï¼3aã»3bï¼ ---- */ 493 function buildItem(isAd) { 494 var entry = primary.querySelector(SEL.entry); 495 var header = entry && entry.querySelector(SEL.header); 496 var content = entry && entry.querySelector(SEL.content); 497 if (!entry || !header || !content) { return false; } 498 499 /* è¦åºãã®å·¦ï¼è±åã©ãã«ï¼æ¥ä»ï¼åºåã¯æ²è¼æ¥ã¨ãæ²è¼äºå®ãï¼ */ 500 var span = header.querySelector('.published'); 501 var posted = span ? jaDate(text(span)) : null; 502 header.insertBefore(el('span', 'nw-kicker', isAd ? 'åºåæ²è¼' : 'NEWS'), header.firstChild); 503 if (!isAd) {
504 copyDate(span); 505 } else { 506 var d = adDate(slugDate(location.pathname), text(content), posted); 507 if (span) { addClass(span.parentNode.nodeName === 'A' ? span.parentNode : span, 'nw-src'); } 508 if (d) { 509 header.appendChild(timeEl(d)); 510 var tag = upcomingTag(d); 511 if (tag) { header.appendChild(tag); } 512 } 513 } 514 515 /* æ¬æï¼å·¦ã®åï¼åºåã¯ãæç¨¿ YYYY.MM.DDãï¼ã¨å³ã®æ¬æã«åãã */ 516 var side = el('div', 'nw-side'); 517 var main = el('div', 'nw-body'); 518 while (content.firstChild) { main.appendChild(content.firstChild); } 519 if (isAd && posted) { 520 side.appendChild(el('span', 'nw-posted-label', 'æç¨¿')); 521 side.appendChild(timeEl(posted)); 522 } 523 content.appendChild(side); 524 content.appendChild(main); 525 526 if (isAd) { 527 var first = main.querySelector('p'); 528 buildBooks(main, main, text(first)); 529 } 530 531 /* åå¾ã®è¨äºï¼åºåã¯ã¹ã©ãã°ããæ¥ä»ãåºãï¼åãæ°ããã»æ¬¡ãå¤ããªã©ã並ã³ã¨åããªããã°åºããªãï¼ */ 532 var nav = primary.querySelector(SEL.nav); 533 var here = isAd ? adDate(slugDate(location.pathname), text(content), posted) : posted; 534 if (nav && isAd && here) { 535 each(nav.querySelectorAll(SEL.navLink), function (a) { 536 var nd = slugDate(a.getAttribute('href')); 537 if (!nd) { return; } 538 var isPrev = /nav-previous/.test(a.parentNode.className); 539 if (isPrev ? key(nd) <= key(here) : key(nd) >= key(here)) { 540 a.setAttribute('data-nw-date', fmt(nd)); 541 } 542 }); 543 } 544 545 /* æ«å°¾ï¼ä¸è¦§ã¸æ»ã */ 546 var back = link(isAd ? URL_ADNEWS : URL_NEWS, 'nw-back'); 547 back.appendChild(el('span', '', isAd ? 'åºåæ²è¼æ å ±ä¸è¦§ã¸' : 'ãã¥ã¼ã¹ï¼ãªãªã¼ã¹ä¸è¦§ã¸')); 548 back.appendChild(el('span', 'nw-arrow', 'â')); 549 var wrap = el('div', 'nw-back-wrap'); 550 wrap.appendChild(back); 551 after(nav || entry, wrap); 552 return true; 553 } 554 555 /* ---- å®è¡ ---- */ 556 var ok = true; 557 if (mode === 'news') { buildNewsList(); } 558 else if (mode === 'adlist') { buildAdList(); } 559 else { ok = buildItem(mode === 'aditem'); } 560 if (ok) { 561 addClass(primary, 'nw-js'); 562 addClass(primary, 'nw-' + mode); 563 if (mode === 'newsitem' || mode === 'aditem') { addClass(primary, 'nw-item'); } 564 } 565})();
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.