1const timeEndDay = 6; 2 3function getTodaySchedule(flg) { 4 const formattedToday = getTodayFormatDate(); 5 // äºç´æºäºã§ã¯ãªãã»ã©ãã¹ã 6 const ary1 = shopData.schedules.filter(function (schedule) { 7 return schedule.workDate.length < 1 || (schedule.workDate === formattedToday && schedule.scheduleType !== 'äºç´æºäº'); 8 }); 9 10 // äºç´æºäºã®ã»ã©ãã¹ã 11 const ary2 = shopData.schedules.filter(function (schedule) { 12 return schedule.workDate.length < 1 || (schedule.workDate === formattedToday && schedule.scheduleType === 'äºç´æºäº'); 13 }); 14 15 return handleSchedulesData(arySort(ary1, flg).concat(arySort(ary2, flg))); 16} 17 18// æéã½ã¼ã - æé夿 19function timeToInt(time) { 20 const [hours, minutes] = time.split(':'); 21 return parseInt(hours) < 10 ? parseInt(hours) + 24 : parseInt(hours); 22} 23 24// æéã½ã¼ã - æéé ã«ä¸¦ã¹æ¿ãã 25function arySort(ary, flg){ 26 switch(flg){ 27 case "time1": // æéé ï¼æé ï¼ 28 default: 29 ary.sort((a, b) => timeToInt(a.startTime) - timeToInt(b.startTime)); 30 break; 31 case "time2": // æéé ï¼éé ï¼ 32 ary.sort((a, b) => timeToInt(b.startTime) - timeToInt(a.startTime)); 33 break; 34 case "none": // 夿ãªãï¼IDé ï¼ 35 break; 36 } 37 return ary; 38} 39 40function getTodayFormatDate() { 41 // 仿¥ã®æ¥ä»ãåå¾ãã¦ãã©ã¼ããããåããã 42 const now = new Date(); 43 const today = new Date(now.getTime() - (timeEndDay * 3600000)); 44 const year = today.getFullYear();
45 const month = ("0" + (today.getMonth() + 1)).slice(-2); 46 const day = ("0" + today.getDate()).slice(-2); 47 return year + "/" + month + "/" + day; 48} 49 50function getThisPageSchedule(flg) { 51 const searchDate = getPageTargetDate(); 52 // äºç´æºäºã§ã¯ãªãã»ã©ãã¹ã 53 const ary1 = shopData.schedules.filter(function (schedule) { 54 return schedule.workDate === searchDate && schedule.scheduleType !== 'äºç´æºäº'; 55 }); 56 57 // äºç´æºäºã®ã»ã©ãã¹ã 58 const ary2 = shopData.schedules.filter(function (schedule) { 59 return schedule.workDate === searchDate && schedule.scheduleType === 'äºç´æºäº'; 60 }); 61 return handleSchedulesData(arySort(ary1, flg).concat(arySort(ary2, flg))); 62} 63 64function getPageTargetDate() { 65 const url = new URL(window.location.href); 66 const date = url.searchParams.get("date"); 67 let searchDate = ""; 68 if (date) { 69 searchDate = date.split("-").join("/"); 70 } else { 71 searchDate = getTodayFormatDate(); 72 } 73 return searchDate; 74} 75 76function getThisWeekDaysObj() { 77 const daysOfWeek = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; 78 const today = new Date(getTodayFormatDate()); 79 const next7Days = []; 80 const searchDate = getPageTargetDate(); 81 for (let i = 0; i < 7; i++) { 82 const nextDay = new Date(today); 83 nextDay.setDate(today.getDate() + i); 84 const year = nextDay.getFullYear();
85 const month = nextDay.getMonth() + 1; // æã¯0ããå§ã¾ãã®ã§1ãè¶³ã 86 let fullMonth = month; 87 if (fullMonth < 10) { 88 fullMonth = "0" + fullMonth; 89 } 90 const date = nextDay.getDate(); 91 let fullDate = date; 92 if (fullDate < 10) { 93 fullDate = "0" + fullDate; 94 } 95 const dayOfWeek = daysOfWeek[nextDay.getDay()]; 96 const formattedDate = month + "/" + date + "(" + dayOfWeek + ")"; 97 const fullFormattedDate = year + "/" + fullMonth + "/" + fullDate; 98 const isTargetDate = searchDate === fullFormattedDate; 99 const dateObj = { 100 date: formattedDate, 101 cls: getDayClass(formattedDate, isTargetDate), 102 url: "/schedule?date=" + year + "-" + fullMonth + "-" + fullDate, 103 }; 104 next7Days.push(dateObj); 105 } 106 return next7Days; 107} 108 109function getThisWeekDaysYYYYMMDD() { 110 const now = new Date(); 111 const today = new Date(now.getTime() - (timeEndDay * 3600000)); 112 const next7Days = []; 113 for (let i = 0; i < 7; i++) { 114 const nextDay = new Date(today); 115 nextDay.setDate(today.getDate() + i); 116 const year = nextDay.getFullYear();
117 const month = ("0" + (nextDay.getMonth() + 1)).slice(-2); 118 const date = ("0" + nextDay.getDate()).slice(-2); 119 const formattedDate = year + "/" + month + "/" + date; 120 next7Days.push(formattedDate); 121 } 122 return next7Days; 123} 124 125function getDayClass(date, isTargetDate) { 126 let targetCls = ""; 127 if (isTargetDate) { 128 targetCls = "todays "; 129 } 130 if (date.indexOf("Sat") > 1) { 131 return targetCls + "week6"; 132 } 133 if (date.indexOf("Sun") > 1) { 134 return targetCls + "week0"; 135 } 136 return targetCls + "week1"; 137} 138 139function getScheduleThisPageGirl() { 140 const url = new URL(window.location.href); 141 const id = url.searchParams.get("id"); 142 const schedules = []; 143 const weekDays = getThisWeekDaysYYYYMMDD(); 144 145 for (const date of weekDays) { 146 let val = "ã"; 147 for (const schedule of shopData.schedules) { 148 if (schedule.workDate == date && schedule.therapistId == id) { 149 val = schedule.startTime + "~" + schedule.endTime; 150 break; 151 } 152 } 153 schedules.push(val); 154 } 155 156 return schedules; 157} 158 159function getThisPageGirl() { 160 const url = new URL(window.location.href); 161 const id = url.searchParams.get("id"); 162 for (const therapist of shopData.therapists) { 163 if (therapist.id == id) { 164 return therapist; 165 } 166 } 167 return { 168 id: "0", 169 therapistName: "--", 170 url: "--", 171 img1: "", 172 img2: "", 173 img3: "", 174 img4: "", 175 img5: "", 176 img6: "", 177 age: "--", 178 height: "--", 179 threeSize: "--", 180 bloodType: "--", 181 goodAt: "--", 182 xUrl: "--", 183 pickup: "0", 184 comment: "--", 185 tags: [], 186 }; 187} 188 189function getThisPageArea() { 190 const url = new URL(window.location.href); 191 const pathParts = url.pathname.split('/').filter(p => p !== ''); 192 const rawId = pathParts.slice(1).join('/'); 193 const id = rawId ? decodeURIComponent(rawId) : rawId; 194 195 const fallback = { 196 id: "0", 197 categoryId: "0", 198 categoryName: "--", 199 name: "--", 200 content: "--", 201 tags: [], 202 }; 203 204 if (!id || typeof shopData === "undefined" || !shopData.areas) { 205 return fallback; 206 } 207 208 for (const area of shopData.areas) { 209 if (area.name == id || getEnglishAreaSlug(area.name) == id) { 210 const translatedArea = { ...area }; 211 translatedArea.slug = getEnglishAreaSlug(area.name); 212 213 // Fix bold text for CMS data 214 if (translatedArea.content) { 215 const tempDiv = document.createElement('div'); 216 tempDiv.innerHTML = translatedArea.content; 217 218 // Find leaf block elements 219 const blocks = tempDiv.querySelectorAll('h2, h3, p, div'); 220 blocks.forEach(block => { 221 if (!block.querySelector('h2, h3, p, div')) { 222 const text = block.textContent.trim(); 223 if (text.length === 0) return; 224 225 // Make paragraphs inside headings normal weight. 226 // A reliable way to detect a paragraph vs a title in Japanese is the presence of a full stop 'ã'. 227 if ((block.tagName === 'H2' || block.tagName === 'H3') && text.includes('ã')) { 228 block.style.fontWeight = 'normal'; 229 } 230 231 // Ensure titles starting with 'ã»' or 'ã' are bold (even if they are inside <p>) 232 if (text.startsWith('ã»') || text.startsWith('ã')) { 233 block.style.fontWeight = 'bold'; 234 } 235 } 236 }); 237 238 translatedArea.content = tempDiv.innerHTML; 239 } 240 241 return translatedArea; 242 } 243 } 244 return fallback; 245} 246 247function redirectByAreaId() { 248 const url = new URL(window.location.href); 249 const qid = url.searchParams.get('id'); 250 if (!qid) return false; 251 252 if (typeof shopData === "undefined" || !shopData.areas) { 253 window.location.replace('/areas'); 254 return true; 255 } 256 257 const found = shopData.areas.find(a => a.id == qid); 258 if (found) { 259 window.location.replace('/area/' + getEnglishAreaSlug(found.name)); 260 } else { 261 window.location.replace('/areas'); 262 } 263 return true; 264} 265 266function getThisPageNotice() { 267 const url = new URL(window.location.href); 268 const id = url.searchParams.get("id"); 269 const notices = shopData.notices; 270 for (let i = 0; i < notices.length; i++) { 271 const notice = notices[i]; 272 const prevId = notices[i-1] ? notices[i-1].id : null; 273 const nextId = notices[i+1] ? notices[i+1].id : null; 274 if (notice.id == id) { 275 return { 276 id: notice.id, 277 title: notice.title, 278 detail: notice.detail,
279 noticeAt: notice.noticeAt, 280 hasBefore: i > 0, 281 hasAfter: i < notices.length - 1, 282 prevId: prevId, 283 nextId: nextId, 284 }; 285 } 286 } 287 return { 288 id: "0", 289 title: "", 290 detail: "", 291 noticeAt: "", 292 hasBefore: false, 293 hasAfter: false, 294 prevId: 0, 295 nextId: 0, 296 }; 297} 298 299function recruitFormHandler() { 300 return { 301 name: "", 302 email: "", 303 phone_number: "", 304 inquiry: "", 305 306 saveDataAndRedirect() { 307 localStorage.setItem("recruit_inquiry_name", this.name); 308 localStorage.setItem("recruit_inquiry_email", this.email); 309 localStorage.setItem("recruit_inquiry_phone_number", this.phone_number); 310 localStorage.setItem("recruit_inquiry_inquiry", this.inquiry); 311 312 window.location.href = "/recruit-confirm"; 313 }, 314 315 loadData() { 316 this.name = localStorage.getItem("recruit_inquiry_name") || ""; 317 this.email = localStorage.getItem("recruit_inquiry_email") || ""; 318 this.phone_number = 319 localStorage.getItem("recruit_inquiry_phone_number") || ""; 320 this.inquiry = localStorage.getItem("recruit_inquiry_inquiry") || ""; 321 }, 322 323 async submitForm() { 324 const payload = { 325 name: this.name, 326 email: this.email, 327 phone_number: this.phone_number, 328 inquiry: this.inquiry, 329 }; 330 331 try { 332 const response = await fetch(shopData.recruit.postUrl, { 333 method: "POST", 334 headers: { 335 "Content-Type": "application/json", 336 "api-key": "qSPgj8LOXCNx05MrLawoBhbKQ6GHrUhm", 337 }, 338 body: JSON.stringify(payload), 339 }); 340 341 if (response.ok) { 342 alert("Form submitted successfully!"); 343 344 localStorage.clear(); 345 window.location.href = "/recruit-thanks"; 346 } else { 347 alert("Failed to submit the form. Please try again."); 348 } 349 } catch (error) { 350 console.error("Error:", error); 351 alert("An error occurred. Please try again."); 352 } 353 }, 354 }; 355} 356 357function reservationFormHandler() { 358 return { 359 name: "", 360 email: "", 361 phone_number: "", 362 visit_count: "", 363 coming_at: "", 364 course_name: "", 365 option_name: "", 366 course_menu_name: "", 367 option_menu_name: "", 368 therapist_name: "", 369 inquiry: "", 370 371 selectedCourseMenus: [], 372 selectedOptionMenus: [], 373 therapists: [], 374 375 updateCourseMenu() { 376 const selectedCourse = shopData.courses.find( 377 (course) => course.title === this.course_name 378 ); 379 this.selectedCourseMenus = selectedCourse ? selectedCourse.menu : []; 380 this.course_menu_name = ""; 381 }, 382 383 updateOptionMenu() { 384 const selectedOption = shopData.options.find( 385 (option) => option.title === this.option_name 386 ); 387 this.selectedOptionMenus = selectedOption ? selectedOption.menu : []; 388 this.option_menu_name = ""; 389 }, 390 391 isWithinWorkingHours(selectedTime, startTime, endTime) { 392 const [startHour, startMinute] = startTime.split(":").map(Number); 393 const [endHour, endMinute] = endTime.split(":").map(Number); 394 const [selectedHour, selectedMinute] = selectedTime 395 .split(":") 396 .map(Number); 397 398 const start = startHour * 60 + startMinute; 399 const end = 400 (endHour < startHour ? endHour + 24 : endHour) * 60 + endMinute; 401 const selected = selectedHour * 60 + selectedMinute; 402 403 return selected >= start && selected <= end; 404 }, 405 406 searchTherapists() { 407 if (!this.coming_at) { 408 alert("ãæ¥åºæ¥æãæå®ãã¦ãã ãã"); 409 return; 410 } 411 412 const [selectedDate, selectedTime] = this.coming_at.split("T"); 413 414 this.therapists = shopData.schedules.filter((schedule) => { 415 const scheduleDate = schedule.workDate.replace(/\//g, "-"); 416 417 return ( 418 scheduleDate === selectedDate && 419 this.isWithinWorkingHours( 420 selectedTime, 421 schedule.startTime, 422 schedule.endTime 423 ) 424 ); 425 }); 426 427 this.therapists.unshift({ 428 therapistName: "Free (ããªã¼)", 429 }); 430 }, 431 432 selectTherapist(therapist) { 433 this.therapist_name = therapist.therapistName; 434 }, 435 436 saveDataAndRedirect() { 437 localStorage.setItem("reservation_inquiry_name", this.name); 438 localStorage.setItem("reservation_inquiry_email", this.email); 439 localStorage.setItem( 440 "reservation_inquiry_phone_number", 441 this.phone_number 442 ); 443 localStorage.setItem("reservation_inquiry_visit_count", this.visit_count); 444 localStorage.setItem( 445 "reservation_inquiry_coming_at_date", 446 this.coming_at 447 ); 448 localStorage.setItem("reservation_inquiry_course_name", this.course_name); 449 localStorage.setItem( 450 "reservation_inquiry_course_menu_name", 451 this.course_menu_name 452 ); 453 localStorage.setItem("reservation_inquiry_option_name", this.option_name); 454 localStorage.setItem( 455 "reservation_inquiry_option_menu_name", 456 this.option_menu_name 457 ); 458 localStorage.setItem( 459 "reservation_inquiry_therapist_name", 460 this.therapist_name 461 ); 462 localStorage.setItem("reservation_inquiry_inquiry", this.inquiry); 463 464 window.location.href = "/reservation-confirm"; 465 }, 466
467 loadData() { 468 this.name = localStorage.getItem("reservation_inquiry_name") || ""; 469 this.email = localStorage.getItem("reservation_inquiry_email") || ""; 470 this.phone_number = 471 localStorage.getItem("reservation_inquiry_phone_number") || ""; 472 this.visit_count = 473 localStorage.getItem("reservation_inquiry_visit_count") || ""; 474 this.coming_at = 475 localStorage.getItem("reservation_inquiry_coming_at_date") || ""; 476 this.course_name = 477 localStorage.getItem("reservation_inquiry_course_name") || ""; 478 this.course_menu_name = 479 localStorage.getItem("reservation_inquiry_course_menu_name") || ""; 480 this.option_name = 481 localStorage.getItem("reservation_inquiry_option_name") || ""; 482 this.option_menu_name = 483 localStorage.getItem("reservation_inquiry_option_menu_name") || ""; 484 this.therapist_name = 485 localStorage.getItem("reservation_inquiry_therapist_name") || ""; 486 this.inquiry = localStorage.getItem("reservation_inquiry_inquiry") || ""; 487 }, 488 489 async submitForm() { 490 const payload = { 491 name: this.name, 492 email: this.email, 493 phone_number: this.phone_number, 494 visit_count: this.visit_count, 495 coming_at: this.coming_at, 496 course_name: this.course_name, 497 course_menu_name: this.course_menu_name, 498 option_name: this.option_name, 499 option_menu_name: this.option_menu_name, 500 therapist_name: this.therapist_name, 501 inquiry: this.inquiry, 502 }; 503 504 try { 505 const response = await fetch(shopData.reservation.postUrl, { 506 method: "POST", 507 headers: { 508 "Content-Type": "application/json", 509 "api-key": "qSPgj8LOXCNx05MrLawoBhbKQ6GHrUhm", 510 }, 511 body: JSON.stringify(payload), 512 }); 513 514 if (response.ok) { 515 alert("Form submitted successfully!"); 516 517 localStorage.clear(); 518 window.location.href = "/reservation-thanks"; 519 } else { 520 alert("Failed to submit the form. Please try again."); 521 } 522 } catch (error) { 523 console.error("Error:", error); 524 alert("An error occurred. Please try again."); 525 } 526 }, 527 }; 528} 529 530function getPickupTherapists() { 531 return shopData.therapists.filter((therapist) => therapist.pickup === "True"); 532} 533 534// remove duplicate schedule 535function handleSchedulesData(data) { 536 return data.filter((value, index, self) => 537 index === self.findIndex((t) => ( 538 t.therapistId === value.therapistId && t.workDate === value.workDate 539 )) 540 ); 541} 542 543const AREA_MAPPING = { 544 "é座": "Ginza", "æ±é座": "Higashiginza", "æ¥æ¬æ©": "Nihonbashi", "æ°æ¥æ¬æ©": "Shinnihonbashi", 545 "馬å°çº": "Bakurotyo", "å®çº": "Takaratyo", "京æ©": "Kyoubashi", "å «ä¸å ": "Hattyoubori", 546 "ç¯å°": "Tsukiji", "æå³¶ã»æ´æµ·": "Tukisima/Harumi", "åã©ã": "Katidoki", "è å ´çº": "Kayabatyo", 547 "人形çº": "Ningyoutyo", "å°ä¼é¦¬çº": "Kodenmatyo", "æµçº": "Hamatyo", "水天宮å": "Suitenguumae", 548 "ä¸è¶å": "Mitsukoshimae", "æ°æ©": "Shinbashi", "èãé": "Toranomono", "大é": "Daimon", 549 "ãå°å ´": "Odaiba", "æ±ç": "Shiodome", "赤å": "Akasaka", "表åé": "Omotesandou", 550 "éå±±ä¸ä¸ç®": "Aoyamaittyoume", "éå±±": "Aoyamaittyoume", "å æ¬æ¨": "Ropponngi", "赤åè¦é": "Akasakamitsuke", 551 "ç¥è°·çº": "Kamiyatyo", "麻å¸åçª": "Azabujyuban", "åå·": "Shinagawa", "æµæ¾çº": "Hamamatutyo", 552 "ç°çºã»ä¸ç°": "Tamati/Mita", "竹èã»è浦": "Takeshiba/Sibaura", "æ³å²³å¯º": "Sengakuji", 553 "èå ¬å": "Shibakouen", "æ±äº¬é§ ": "Tokyoeki", "大æçº": "Otemachi", "ææ¥½çºã»æ¥æ¯è°·": "Yurakutyo/Hibiya", 554 "å 幸çº": "Utisaiwaityo", "竹æ©": "Takebashi", "ç¥ç°ã»ãè¶ã®æ°´": "Kanda/Otyanomizu", 555 "ç¥ç°ã»å¾¡è¶ãæ°´": "Kanda/Otyanomizu", 556 "æ°´éæ©ã»é£¯ç°æ©": "Suidoubasi/Idabasi", "ç§èå": "Akihabara", "ç¥ä¿çº": "Jinbotyo", 557 "å¸ã¶è°·ã»åãè°·": "Ichigaya/Yotsuya", "麹çº": "Koujimachi", "æ°¸ç°çº": "Nagatatyo", 558 "åèµéã»ä¹æ®µä¸": "Hanzoumon/Kudanshita", "æºæ± å±±ç": "Tameikesannou", "å°å·çº": "Ogawatyo", 559 "ç®é»": "Meguro", "äºåç°": "Gotanda", "大äºçº": "Oimachi", "大å´": "Osaki", 560 "å¤©çæ´²ã¢ã¤ã«": "Tennouzuairu", "åå·ã·ã¼ãµã¤ã": "Shinagawashisaido", "æ°å®¿": "Shinjyuku", 561 "æ°å®¿ä¸ä¸ç®": "Shinjyukusantyome", "é½åºå": "Totyoumae", "æ°å®¿è¥¿å£": "Shinjyukunishiguchi", 562 "é«ç°é¦¬å ´": "Takadanobaba", "å¤§ä¹ ä¿": "Okubo", "ç¥æ¥½å": "Kagurazaka", "ææ©": "Akebonobashi", 563 "æ¸è°·": "Shibuya", "代å®å±±": "Daikanyama", "æµæ¯å¯¿": "Ebisu", "å宿": "Harajyuku",
564 "ä»£ã æ¨": "Yoyogi", "笹å¡": "Sasaduka", "幡ã¶è°·": "Hatagaya", "幡谷": "Hatagaya", "åå°": "Hatudai", 565 "éå仲çº": "Monzennakatyo", "æ±é½çº": "Touyoutyo", "è±æ´²": "Toyosu", "æ°æ¨å ´": "Shinkiba", 566 "äºæ¸": "Kameido", "大島": "Ooshima", "森ä¸ã»èå·": "Morishita/Kikukawa", "森ä¸/èå·": "Morishita/Kikukawa", "éæµ·": "Aomi", 567 "å½éå±ç¤ºå ´ã»ææ": "Kokusaitenjijyo/Ariake", "æ±äº¬ãã¬ãã¼ã": "Tokyoterepoto", 568 "é¦ç³¸çº": "Kinshityo", "両å½": "Ryogoku", "æ¼ä¸": "Oshiage", "æ³è": "Hikihune", 569 "ã¨ããããã¹ã«ã¤ããªã¼": "Tokyoskytree", "ä¸é": "Ueno", "æµ è": "Asakusa", 570 "御å¾çº": "Okachimachi", "æµ èæ©": "Asakusabashi", "鶯谷": "Uguisudani", "ä¸ã輪": "Minowa", 571 "ä¸ç®é»": "Nakameguro", "èªç±ãä¸": "Jiyugaoka", "徿¥½å": "Kourakuen", "æ¥æ¥": "Kazuga", 572 "åé§æ¨": "Sendagi", "æ± è¢": "Ikebukuro", "大å¡": "Ootsuka", "巣鴨": "Sugamo", 573 "é§è¾¼": "Komagome", "ç®ç½": "Mejiro", "è西": "Kasai", "西è西": "Nishikasai", 574 "浦å®": "Urayasu", "ä¸é": "Nakano", "å ãä¸": "Hikarigaoka", "æ¿æ©": "Itabashi", 575 "ååä½": "Kitasenjyu", "ç¶¾ç¬": "Ayase", "竹ãå¡": "Takenotsuka", "æ°å°å²©": "Shinkoiwa", 576 "大森": "Omori", "大森海岸": "Omorikaigan", "ç¾½ç°ç©ºæ¸¯": "Hanedakukou", 577 "è²ç°": "Kamata", "ç©´å®ç¨²è·": "Anamorinari", "é«å寺": "Kouenji", "é¿ä½ã¶è°·": "Asagaya", 578 "è»çªª": "Ogikubo", "赤羽": "Akabane", "äºåçå·": "Hutakotamagawa", "ä¸è»è¶å±": "Sangentyaya", 579 "ä¸åæ²¢": "Simokitazawa", "çµå ": "Kyodo", "æ¥æ®é": "Nippori", "è¥¿æ¥æ®é": "Nishinippori", 580 "ååä½": "Minamisenjyu", 581 "æ±æ± è¢": "Higashiikebukuro", "åæ± è¢": "Kitaikebukuro", "è¦çº": "Kanamecho", 582 "åå·": "Sengawa", "æ¤åçº": "Shiinachou", "éå¸ã¶è°·": "Zoshigaya", 583 "æ¬é·ä¸ä¸ç®": "Hongosanchome", "èè·è°·": "Myougadani", "è·å½å¯º": "Gokokuji", 584 "ç½å±±": "Hakusan", "æ¬é§è¾¼": "Honkomagome", "æ ¹æ´¥": "Nezu", 585 "湯島": "Yushima", "æ±å¤§å": "Todaimae", "æ±æ¸å·æ©": "Edogawabashi", 586 "ä¸éåä¸": "Nakanosakauye", "æ±ä¸é": "Higashinakano", "æ°ä¸é": "Shinnakano", 587 "ä¸éæ°æ©": "Nakanoshinbashi", "ä¸éå¯å£«è¦çº": "Nakanofujimicho", 588 "ç¥å¤©å¯º": "Yutenji", "å¦è¸å¤§å¦": "Gakugeidaigaku", "é½ç«å¤§å¦": "Toritsudaigaku", 589 "æ±é²": "Shinonome", 590 "西è»çªª": "Nishiogikubo", "æ¹åçº": "Honancho", "æ°¸ç¦çº": "Eifukucho", 591 "çºå±": "Machiya", "䏿²³å³¶": "Mikawashima", 592 "çå": "Oji", "ç°ç«¯": "Tabata", "æ±åæ¡": "Higashijujo", "åæ¡": "Jujo", 593 "練馬": "Nerima", "ç³ç¥äºå ¬å": "Shakujiikoen", "大æ³å¦å": "Oizumigakuen", 594 "æ±å¤ç°": "Ekoda", "è±å³¶å": "Toshimaen", 595 "大山": "Oyama", "æå¢": "Narimasu", "æ¿æ©æ¬çº": "Itabashihoncho", 596 "ã¨ããå°": "Tokiwadai", "é«å³¶å¹³": "Takashimadaira", 597 "åæ³çå±±": "Chitosekarasuyama", "æåå¦åå": "Seijogakuenmae", "ç¨è³": "Yoga", 598 "å¹³åå³¶": "Heiwajima", 599 "éçº": "Kanamachi", "éç ¥": "Aoto", "äºæ": "Kameari", 600 "西æ°äº": "Nishiarai", 601 "å°å²©": "Koiwa", "è¹å ": "Funabori" 602}; 603 604function getEnglishAreaName(jpName) { 605 return AREA_MAPPING[jpName] || jpName; 606} 607 608function getEnglishAreaSlug(jpName) { 609 const enName = getEnglishAreaName(jpName); 610 return enName.toLowerCase().replace(/[ã»\s\.]+/g, '-'); 611}
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.