倭人速報_倭国の「今」の話題をXランキングと記事で紹介! 倭人速報はポストデータを元に「今」No.1の倭国の話題、流行をランキングと記事でお届けします!ドラマ、テレビ、芸能情報、映画、コミックなどエンタメ情報から時事ネタまでみんなの感想や評判、評価をまとめてチェック! 2025-11-21T09:30:00+09:00 https://www.mayuer.com/image/social.png 角川アスキー総合研究所 Copyright (c) 2015, KADOKAWA ASCII Research Laboratories, Inc. urn:uuid:d83bf175-291f-3c59-61c0-2b77b58c178f 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:10c5e4a2-a444-8bfc-de65-7da91589b5fc 2025-10-15T12:12:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:56cd0889-f00e-1387-be82-5680f72ecc3e 2025-10-10T11:00:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index;             const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1);                          // 週タイトルと順位ガイドを描画             const defs = document.createElementNS(svgNS, 'defs');             const style = document.createElementNS(svgNS, 'style');             style.textContent = `                 .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; }                 .week-title { font-size: 13px; font-weight: bold; }                 .rank-guide { stroke: #eee; }             `;             defs.appendChild(style);             svg.appendChild(defs);             weeks.forEach((week, i) => {                 const x = getX(i);                 const title = document.createElementNS(svgNS, 'text');                 title.setAttribute('x', x);                 title.setAttribute('y', 20);                 title.setAttribute('text-anchor', 'middle');                 title.setAttribute('class', 'week-title');                 title.textContent = week;                 svg.appendChild(title);             });             for(let i=1; i {                 const color = colors[i % colors.length];                 const points = [];                 anime.ranks.forEach((rank, weekIndex) => {                     if (rank !== null) {                         points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex });                     }                 });                 if (points.length === 0) return;                 // 線を描画                 for (let j = 0; j < points.length - 1; j++) {                     if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か                          const line = document.createElementNS(svgNS, 'path');                          line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`);                          line.setAttribute('class', 'line');                          line.setAttribute('style', `stroke: ${color};`);                          svg.appendChild(line);                     }                 }                 // 点とラベルを描画                 points.forEach((p, k) => {                     const dot = document.createElementNS(svgNS, 'circle');                     dot.setAttribute('cx', p.x);                     dot.setAttribute('cy', p.y);                     dot.setAttribute('r', 5);                     dot.setAttribute('class', 'dot');                     dot.setAttribute('style', `fill:${color};`);                     svg.appendChild(dot);                                          // 最初と最後の点にだけラベルを表示                     if (k === 0) {                         const label = document.createElementNS(svgNS, 'text');                         label.setAttribute('x', p.x - 10);                         label.setAttribute('y', p.y);                         label.setAttribute('dy', '.3em');                         label.setAttribute('text-anchor', 'end');                         label.setAttribute('class', 'label-text');                         label.textContent = anime.name;                         svg.appendChild(label);                     }                     if (k === points.length - 1 && points.length > 1) {                          const label = document.createElementNS(svgNS, 'text');                         label.setAttribute('x', p.x + 10);                         label.setAttribute('y', p.y);                         label.setAttribute('dy', '.3em');                         label.setAttribute('text-anchor', 'start');                         label.setAttribute('class', 'label-text');                         label.textContent = anime.name;                         svg.appendChild(label);                     }                 });             });         })();     -----]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:28186187-37ab-f62a-4c4e-5b3e1a09ec8d 2025-10-09T11:10:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:a513e0fb-a5a2-3974-1ac9-65c61bfbac64 2025-10-08T16:18:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:b29ef7b2-23c0-0ce1-8a39-e27c505c3f37 2025-10-07T12:37:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index;             const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1);                          // 週タイトルと順位ガイドを描画             const defs = document.createElementNS(svgNS, 'defs');             const style = document.createElementNS(svgNS, 'style');             style.textContent = `                 .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; }                 .week-title { font-size: 13px; font-weight: bold; }                 .rank-guide { stroke: #eee; }             `;             defs.appendChild(style);             svg.appendChild(defs);             weeks.forEach((week, i) => {                 const x = getX(i);                 const title = document.createElementNS(svgNS, 'text');                 title.setAttribute('x', x);                 title.setAttribute('y', 20);                 title.setAttribute('text-anchor', 'middle');                 title.setAttribute('class', 'week-title');                 title.textContent = week;                 svg.appendChild(title);             });             for(let i=1; i {                 const color = colors[i % colors.length];                 const points = [];                 anime.ranks.forEach((rank, weekIndex) => {                     if (rank !== null) {                         points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex });                     }                 });                 if (points.length === 0) return;                 // 線を描画                 for (let j = 0; j < points.length - 1; j++) {                     if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か                          const line = document.createElementNS(svgNS, 'path');                          line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`);                          line.setAttribute('class', 'line');                          line.setAttribute('style', `stroke: ${color};`);                          svg.appendChild(line);                     }                 }                 // 点とラベルを描画                 points.forEach((p, k) => {                     const dot = document.createElementNS(svgNS, 'circle');                     dot.setAttribute('cx', p.x);                     dot.setAttribute('cy', p.y);                     dot.setAttribute('r', 5);                     dot.setAttribute('class', 'dot');                     dot.setAttribute('style', `fill:${color};`);                     svg.appendChild(dot);                                          // 最初と最後の点にだけラベルを表示                     if (k === 0) {                         const label = document.createElementNS(svgNS, 'text');                         label.setAttribute('x', p.x - 10);                         label.setAttribute('y', p.y);                         label.setAttribute('dy', '.3em');                         label.setAttribute('text-anchor', 'end');                         label.setAttribute('class', 'label-text');                         label.textContent = anime.name;                         svg.appendChild(label);                     }                     if (k === points.length - 1 && points.length > 1) {                          const label = document.createElementNS(svgNS, 'text');                         label.setAttribute('x', p.x + 10);                         label.setAttribute('y', p.y);                         label.setAttribute('dy', '.3em');                         label.setAttribute('text-anchor', 'start');                         label.setAttribute('class', 'label-text');                         label.textContent = anime.name;                         svg.appendChild(label);                     }                 });             });         })();    ]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:9b5b8719-559a-2e62-a763-99dc382fa0ec 2025-10-06T15:10:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index;             const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1);                          // 週タイトルと順位ガイドを描画             const defs = document.createElementNS(svgNS, 'defs');             const style = document.createElementNS(svgNS, 'style');             style.textContent = `                 .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; }                 .week-title { font-size: 13px; font-weight: bold; }                 .rank-guide { stroke: #eee; }             `;             defs.appendChild(style);             svg.appendChild(defs);             weeks.forEach((week, i) => {                 const x = getX(i);                 const title = document.createElementNS(svgNS, 'text');                 title.setAttribute('x', x);                 title.setAttribute('y', 20);                 title.setAttribute('text-anchor', 'middle');                 title.setAttribute('class', 'week-title');                 title.textContent = week;                 svg.appendChild(title);             });             for(let i=1; i {                 const color = colors[i % colors.length];                 const points = [];                 anime.ranks.forEach((rank, weekIndex) => {                     if (rank !== null) {                         points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex });                     }                 });                 if (points.length === 0) return;                 // 線を描画                 for (let j = 0; j < points.length - 1; j++) {                     if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か                          const line = document.createElementNS(svgNS, 'path');                          line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`);                          line.setAttribute('class', 'line');                          line.setAttribute('style', `stroke: ${color};`);                          svg.appendChild(line);                     }                 }                 // 点とラベルを描画                 points.forEach((p, k) => {                     const dot = document.createElementNS(svgNS, 'circle');                     dot.setAttribute('cx', p.x);                     dot.setAttribute('cy', p.y);                     dot.setAttribute('r', 5);                     dot.setAttribute('class', 'dot');                     dot.setAttribute('style', `fill:${color};`);                     svg.appendChild(dot);                                          // 最初と最後の点にだけラベルを表示                     if (k === 0) {                         const label = document.createElementNS(svgNS, 'text');                         label.setAttribute('x', p.x - 10);                         label.setAttribute('y', p.y);                         label.setAttribute('dy', '.3em');                         label.setAttribute('text-anchor', 'end');                         label.setAttribute('class', 'label-text');                         label.textContent = anime.name;                         svg.appendChild(label);                     }                     if (k === points.length - 1 && points.length > 1) {                          const label = document.createElementNS(svgNS, 'text');                         label.setAttribute('x', p.x + 10);                         label.setAttribute('y', p.y);                         label.setAttribute('dy', '.3em');                         label.setAttribute('text-anchor', 'start');                         label.setAttribute('class', 'label-text');                         label.textContent = anime.name;                         svg.appendChild(label);                     }                 });             });         })();    ]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:f5fb234e-1cbf-c82b-b875-8833255956c4 2025-10-03T13:14:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index;             const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1);                          // 週タイトルと順位ガイドを描画             const defs = document.createElementNS(svgNS, 'defs');             const style = document.createElementNS(svgNS, 'style');             style.textContent = `                 .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; }                 .week-title { font-size: 13px; font-weight: bold; }                 .rank-guide { stroke: #eee; }             `;             defs.appendChild(style);             svg.appendChild(defs);             weeks.forEach((week, i) => {                 const x = getX(i);                 const title = document.createElementNS(svgNS, 'text');                 title.setAttribute('x', x);                 title.setAttribute('y', 20);                 title.setAttribute('text-anchor', 'middle');                 title.setAttribute('class', 'week-title');                 title.textContent = week;                 svg.appendChild(title);             });             for(let i=1; i {                 const color = colors[i % colors.length];                 const points = [];                 anime.ranks.forEach((rank, weekIndex) => {                     if (rank !== null) {                         points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex });                     }                 });                 if (points.length === 0) return;                 // 線を描画                 for (let j = 0; j < points.length - 1; j++) {                     if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か                          const line = document.createElementNS(svgNS, 'path');                          line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`);                          line.setAttribute('class', 'line');                          line.setAttribute('style', `stroke: ${color};`);                          svg.appendChild(line);                     }                 }                 // 点とラベルを描画                 points.forEach((p, k) => {                     const dot = document.createElementNS(svgNS, 'circle');                     dot.setAttribute('cx', p.x);                     dot.setAttribute('cy', p.y);                     dot.setAttribute('r', 5);                     dot.setAttribute('class', 'dot');                     dot.setAttribute('style', `fill:${color};`);                     svg.appendChild(dot);                                          // 最初と最後の点にだけラベルを表示                     if (k === 0) {                         const label = document.createElementNS(svgNS, 'text');                         label.setAttribute('x', p.x - 10);                         label.setAttribute('y', p.y);                         label.setAttribute('dy', '.3em');                         label.setAttribute('text-anchor', 'end');                         label.setAttribute('class', 'label-text');                         label.textContent = anime.name;                         svg.appendChild(label);                     }                     if (k === points.length - 1 && points.length > 1) {                          const label = document.createElementNS(svgNS, 'text');                         label.setAttribute('x', p.x + 10);                         label.setAttribute('y', p.y);                         label.setAttribute('dy', '.3em');                         label.setAttribute('text-anchor', 'start');                         label.setAttribute('class', 'label-text');                         label.textContent = anime.name;                         svg.appendChild(label);                     }                 });             });         })();     -----]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:8a00eb37-9501-2e94-5d72-165462e28a35 2025-10-02T17:27:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:fffa30ae-e219-8623-b380-77fbdce9d424 2025-10-01T13:14:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } .rank-text-number { font-size: 8px; fill: #fff; font-weight: bold; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); // 週タイトルのフォーマットを調整 title.textContent = week.replace('年', '/').replace('日週', '').replace('月', '/'); svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), rank: rank, weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { // 点 const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 順位テキスト (点の中) const rankText = document.createElementNS(svgNS, 'text'); rankText.setAttribute('x', p.x); rankText.setAttribute('y', p.y); rankText.setAttribute('dy', '.3em'); rankText.setAttribute('text-anchor', 'middle'); rankText.setAttribute('class', 'rank-text-number'); rankText.textContent = p.rank; svg.appendChild(rankText); // 最初と最後の点にだけラベルを表示 // 最初の週、またはその映画が最初に登場した週のラベル (左) if (k === 0 || p.weekIndex === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } // 最後の週、またはその映画が最後に登場した週のラベル (右) if (k === points.length - 1 || p.weekIndex === weeks.length - 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:1adf1940-9a02-10d8-b07f-79dd512cff73 2025-10-01T12:34:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 // (省略: スタイル設定はタグに移動) const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); // 週タイトルのフォーマットを調整 title.textContent = week.replace('年', '/').replace('日週', '').replace('月', '/'); svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), rank: rank, weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 順位テキスト const rankText = document.createElementNS(svgNS, 'text'); rankText.setAttribute('x', p.x); rankText.setAttribute('y', p.y); rankText.setAttribute('dy', '.3em'); rankText.setAttribute('text-anchor', 'middle'); rankText.setAttribute('class', 'rank-text'); // 既存のrank-textクラスを流用 rankText.setAttribute('style', `fill: #fff; font-weight: bold; font-size: 8px;`); rankText.textContent = p.rank; svg.appendChild(rankText); // 最初と最後の点にだけラベルを表示 if (k === 0 || p.weekIndex === 0) { // 最初の週、またはそのアニメが最初に登場した週のラベル const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 || p.weekIndex === weeks.length - 1) { // 最後の週、またはそのアニメが最後に登場した週のラベル const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:eecaf779-3354-00d9-29d1-bdc4681bc4b3 2025-09-30T18:08:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:765d9c6c-61f7-a390-40c9-578f5bfd595f 2025-09-26T12:36:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:91e6bc4d-0493-5cd8-a1ec-dc80a81c4425 2025-09-25T13:20:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), rank: rank, weekIndex: weekIndex, name: anime.name }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 順位テキストを表示 (点の上または下に表示) const rankText = document.createElementNS(svgNS, 'text'); rankText.setAttribute('x', p.x); rankText.setAttribute('y', p.y + (p.rank = 1) { // 1回のみ登場の場合も表示 const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = p.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:59b275f7-2641-d9c0-6a8a-e5a8fc43aeb5 2025-09-25T11:45:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), rank: rank, weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 順位テキストを表示 (点の上または下に表示) const rankText = document.createElementNS(svgNS, 'text'); rankText.setAttribute('x', p.x); rankText.setAttribute('y', p.y + (p.rank = 1) { // 1回のみ登場の場合も表示 const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:33b19c57-ec84-08a3-84d5-2522a8780357 2025-09-24T13:21:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:8d04bcf9-b0b8-0d2a-f039-883295c5bef8 2025-09-24T11:37:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:4bbd3317-4ebb-76ae-df39-a51c40b81aea 2025-09-19T10:30:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:3f12305d-0a6f-ca5d-0ee5-3e73c2f7a2f8 2025-09-18T12:10:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:249110e7-5cc7-5e93-2c98-aaead160f801 2025-09-18T11:14:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:a9229f28-4542-2b0b-6ca0-573c2c868cc3 2025-09-17T12:06:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:04f23b67-845c-2f99-582c-3fe1c8263761 2025-09-16T19:00:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:3a1a9445-0097-e208-50fb-b99a4d142ebf 2025-09-12T18:13:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:05b517da-f74c-12aa-dc09-68611a65d947 2025-09-12T12:45:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:07ce63e7-06b4-6ebb-6cd3-902db666c98b 2025-09-12T12:11:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:5da70969-8369-b7df-290d-e6a765400785 2025-09-11T18:33:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for (let i = 1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画(連続週のみ接続) for (let j = 0; j < points.length - 1; j++) { if (points[j + 1].weekIndex - points[j].weekIndex === 1) { const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j + 1].x} ${points[j + 1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画(端点のみラベル) points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:50e8ce2e-4baa-fff6-5bd6-5cf8df812285 2025-09-11T17:42:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画(連続週のみ接続) for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画(端点のみラベル) points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:1d990935-f1fb-d30b-942b-44f39dd34941 2025-09-04T17:35:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:9cdca144-199d-94d9-1c18-dea3656ceb65 2025-09-04T12:39:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:d1b86239-da2c-20e7-2906-4e5ee2e6c6f8 2025-09-03T17:50:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:160d2df8-1700-414a-0d19-646fc011616a 2025-09-03T13:41:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:dca5f4ab-439e-8041-d8eb-deb76ea4b8c4 2025-09-02T18:33:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:8d48b983-e05a-7c45-8f53-466c78906e24 2025-08-29T14:26:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; celeb.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = celeb.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = celeb.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:5a0c9f26-db32-cbb0-a3a5-df17b97040a3 2025-08-28T16:47:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; series.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex }); } }); if (points.length === 0) return; // 連続した週のみ線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベル(最初と最後のみ) points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); if (k === 0) { const labelL = document.createElementNS(svgNS, 'text'); labelL.setAttribute('x', p.x - 10); labelL.setAttribute('y', p.y); labelL.setAttribute('dy', '.3em'); labelL.setAttribute('text-anchor', 'end'); labelL.setAttribute('class', 'label-text'); labelL.textContent = series.name; svg.appendChild(labelL); } if (k === points.length - 1 && points.length > 1) { const labelR = document.createElementNS(svgNS, 'text'); labelR.setAttribute('x', p.x + 10); labelR.setAttribute('y', p.y); labelR.setAttribute('dy', '.3em'); labelR.setAttribute('text-anchor', 'start'); labelR.setAttribute('class', 'label-text'); labelR.textContent = series.name; svg.appendChild(labelR); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:cd540fc6-7741-7346-2451-3118ed504655 2025-08-28T14:35:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:bea2977c-57e3-c75a-ddff-4b332ca9f5f3 2025-08-28T13:09:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for (let i = 1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) points.push({ x: getX(weekIndex), y: getY(rank), weekIndex }); }); if (points.length === 0) return; // 線を描画(連続週のみ) for (let j = 0; j < points.length - 1; j++) { if (points[j + 1].weekIndex - points[j].weekIndex === 1) { const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j + 1].x} ${points[j + 1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベル points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にラベル if (k === 0) { const labelL = document.createElementNS(svgNS, 'text'); labelL.setAttribute('x', p.x - 10); labelL.setAttribute('y', p.y); labelL.setAttribute('dy', '.3em'); labelL.setAttribute('text-anchor', 'end'); labelL.setAttribute('class', 'label-text'); labelL.textContent = anime.name; svg.appendChild(labelL); } if (k === points.length - 1 && points.length > 1) { const labelR = document.createElementNS(svgNS, 'text'); labelR.setAttribute('x', p.x + 10); labelR.setAttribute('y', p.y); labelR.setAttribute('dy', '.3em'); labelR.setAttribute('text-anchor', 'start'); labelR.setAttribute('class', 'label-text'); labelR.textContent = anime.name; svg.appendChild(labelR); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:67f38bca-1159-6f8f-5014-8e0c6845c41a 2025-08-26T19:56:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for (let i = 1; i { const color = colors[i % colors.length]; const points = []; item.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex }); } }); if (points.length === 0) return; // 線を描画(連続週のみ結ぶ) for (let j = 0; j < points.length - 1; j++) { if (points[j + 1].weekIndex - points[j].weekIndex === 1) { const path = document.createElementNS(svgNS, 'path'); path.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j + 1].x} ${points[j + 1].y}`); path.setAttribute('class', 'line'); path.setAttribute('style', `stroke: ${color};`); svg.appendChild(path); } } // 点とラベル points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点のみラベル表示 if (k === 0) { const labelL = document.createElementNS(svgNS, 'text'); labelL.setAttribute('x', p.x - 10); labelL.setAttribute('y', p.y); labelL.setAttribute('dy', '.3em'); labelL.setAttribute('text-anchor', 'end'); labelL.setAttribute('class', 'label-text'); labelL.textContent = item.name; svg.appendChild(labelL); } if (k === points.length - 1 && points.length > 1) { const labelR = document.createElementNS(svgNS, 'text'); labelR.setAttribute('x', p.x + 10); labelR.setAttribute('y', p.y); labelR.setAttribute('dy', '.3em'); labelR.setAttribute('text-anchor', 'start'); labelR.setAttribute('class', 'label-text'); labelR.textContent = item.name; svg.appendChild(labelR); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:c3e15738-41be-383a-a03b-b493dbd5df7f 2025-08-22T11:19:00+09:00 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:637b2208-86ef-aad8-10ce-1552e3dc2ee0 2025-08-21T13:53:00+09:00 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:f62c1160-a579-e7e3-d86a-0ecace15cdaf 2025-08-21T11:49:00+09:00 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:efb62e14-8067-15b4-254c-8c01fa29ed73 2025-08-20T17:55:00+09:00 PADDING.left + (chartWidth / (weeks.length - 1)) * index; const getY = (rank) => PADDING.top + (chartHeight / (RANK_COUNT - 1)) * (rank - 1); // 週タイトルと順位ガイドを描画 const defs = document.createElementNS(svgNS, 'defs'); const style = document.createElementNS(svgNS, 'style'); style.textContent = ` .label-text { font-size: 11px; fill: #333; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linecap: butt; stroke-linejoin: miter; } .week-title { font-size: 13px; font-weight: bold; } .rank-guide { stroke: #eee; } `; defs.appendChild(style); svg.appendChild(defs); weeks.forEach((week, i) => { const x = getX(i); const title = document.createElementNS(svgNS, 'text'); title.setAttribute('x', x); title.setAttribute('y', 20); title.setAttribute('text-anchor', 'middle'); title.setAttribute('class', 'week-title'); title.textContent = week; svg.appendChild(title); }); for(let i=1; i { const color = colors[i % colors.length]; const points = []; anime.ranks.forEach((rank, weekIndex) => { if (rank !== null) { points.push({ x: getX(weekIndex), y: getY(rank), weekIndex: weekIndex }); } }); if (points.length === 0) return; // 線を描画 for (let j = 0; j < points.length - 1; j++) { if (points[j+1].weekIndex - points[j].weekIndex === 1) { //連続した週か const line = document.createElementNS(svgNS, 'path'); line.setAttribute('d', `M ${points[j].x} ${points[j].y} L ${points[j+1].x} ${points[j+1].y}`); line.setAttribute('class', 'line'); line.setAttribute('style', `stroke: ${color};`); svg.appendChild(line); } } // 点とラベルを描画 points.forEach((p, k) => { const dot = document.createElementNS(svgNS, 'circle'); dot.setAttribute('cx', p.x); dot.setAttribute('cy', p.y); dot.setAttribute('r', 5); dot.setAttribute('class', 'dot'); dot.setAttribute('style', `fill:${color};`); svg.appendChild(dot); // 最初と最後の点にだけラベルを表示 if (k === 0) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x - 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'end'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } if (k === points.length - 1 && points.length > 1) { const label = document.createElementNS(svgNS, 'text'); label.setAttribute('x', p.x + 10); label.setAttribute('y', p.y); label.setAttribute('dy', '.3em'); label.setAttribute('text-anchor', 'start'); label.setAttribute('class', 'label-text'); label.textContent = anime.name; svg.appendChild(label); } }); }); })();]]> 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:776fadcd-e655-00e1-8d99-bcf2eb95efb1 2025-08-20T12:03:00+09:00 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:721302a6-65c8-e4ca-6e4d-77fc1554a04f 2025-08-15T13:03:00+09:00 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:f2106652-bd96-7efa-c228-22adf1e15ec3 2025-08-15T11:45:00+09:00 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:34f078a8-b23f-ab3e-7f6f-03b4f1a24a7a 2025-08-14T11:08:00+09:00 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:d7ac4baf-7054-9a8d-6f5a-d05cdaa82259 2025-08-13T11:36:00+09:00 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:ef97b02c-6d85-d784-0673-db6a14df27d9 2025-08-12T16:47:00+09:00 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:32f0a051-0633-2eb4-60ff-871a47fa998b 2025-08-07T15:46:00+09:00 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:b656f39a-aeb5-e822-7421-82371908967f 2025-08-07T12:42:00+09:00 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:7d5a08b0-f1f4-03b1-f864-f091d4e8e4b7 2025-08-06T13:12:00+09:00 倭人速報_倭国の「今」の話題をXランキングと記事で紹介! urn:uuid:ed6023c2-1ba6-ca3f-fab9-72715fc5afe0 2025-08-05T13:46:00+09:00