n8n-nodes-seo-scanner 1.2.5 → 1.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1862,6 +1862,31 @@ function escapeHtml(s) {
1862
1862
  function attrEsc(s) {
1863
1863
  return (s || '').replace(/'/g, ''').replace(/"/g, '"');
1864
1864
  }
1865
+ function extractDomain(url) {
1866
+ try {
1867
+ return new URL(url).hostname.replace(/^www\./, '');
1868
+ }
1869
+ catch {
1870
+ return url;
1871
+ }
1872
+ }
1873
+ function truncateWords(text, limit) {
1874
+ if (!text || text.length <= limit)
1875
+ return text;
1876
+ const truncated = text.slice(0, limit);
1877
+ const lastSpace = truncated.lastIndexOf(' ');
1878
+ if (lastSpace > 0) {
1879
+ return truncated.slice(0, lastSpace) + '...';
1880
+ }
1881
+ return truncated + '...';
1882
+ }
1883
+ function renderResponsiveTitle(text, limit = 40) {
1884
+ const mobileText = truncateWords(text, limit);
1885
+ if (mobileText === text) {
1886
+ return `<span title="${escapeHtml(text)}">${escapeHtml(text)}</span>`;
1887
+ }
1888
+ return `<span class="desktop-only" title="${escapeHtml(text)}">${escapeHtml(text)}</span><span class="mobile-only" title="${escapeHtml(text)}">${escapeHtml(mobileText)}</span>`;
1889
+ }
1865
1890
  function generateSeoReportHtml(main, internalPages) {
1866
1891
  const pb = main.problemsBySeverity ?? { critical: [], important: [], warning: [], info: [] };
1867
1892
  const sv = main.severitySummary ?? { critical: 0, important: 0, warning: 0, info: 0 };
@@ -1973,7 +1998,7 @@ function generateSeoReportHtml(main, internalPages) {
1973
1998
  return 'background:#6b7280';
1974
1999
  };
1975
2000
  const renderIssueRow = (it, rowClass, tagClass, labelText) => {
1976
- let s = `<div class="issue-row ${rowClass}" data-issue-type="${rowClass}"><details><summary><span class="issue-tag ${tagClass}">${labelText}</span><span>${escapeHtml(it.message)}</span>`;
2001
+ let s = `<div class="issue-row ${rowClass}" data-issue-type="${rowClass}"><details><summary><span class="issue-tag ${tagClass}">${labelText}</span><span class="truncate-title" style="flex:1;min-width:0;">${renderResponsiveTitle(it.message, 60)}</span>`;
1977
2002
  if (it.urls && it.urls.length > 1) {
1978
2003
  s += `<span style="margin-left:8px;font-size:0.65rem;color:var(--text3);background:var(--bg3);padding:2px 6px;border-radius:10px;">${it.urls.length} págs</span>`;
1979
2004
  }
@@ -2217,7 +2242,7 @@ ${reportTemplate_1.REPORT_CSS}
2217
2242
  html += `
2218
2243
  <details class="fallos-pagina-details" data-crit="${rcrit.length}" data-imp="${rimp.length}" data-warn="${rwarn.length}" data-info="${rinfo.length}" data-pass="${rpassed.length}">
2219
2244
  <summary class="fallos-pagina-summary">
2220
- <span class="fallos-pagina-label" style="flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="${escapeHtml(label)}">${escapeHtml(shortLabel)}</span>
2245
+ <span class="fallos-pagina-label truncate-title" style="flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="${escapeHtml(label)}">${renderResponsiveTitle(shortLabel, 40)}</span>
2221
2246
  <div style="display:flex; height:6px; width:60px; background:var(--bg3); border-radius:3px; overflow:hidden; flex-shrink:0">
2222
2247
  <div style="width:${pctCrit}%; background:var(--red);"></div>
2223
2248
  <div style="width:${pctImp}%; background:var(--orange);"></div>
@@ -2351,17 +2376,24 @@ ${reportTemplate_1.REPORT_CSS}
2351
2376
  }
2352
2377
  pImgDetails.forEach((img, i) => {
2353
2378
  const altStr = img.alt != null ? escapeHtml(String(img.alt).slice(0, 80)) : '—';
2354
- const srcShort = img.src ? escapeHtml(img.src.replace(/^https?:\/\/[^/]+/, '').slice(0, 60)) : '—';
2379
+ const srcFull = img.src || '';
2380
+ let srcShort = '—';
2381
+ if (srcFull) {
2382
+ const pathSinParams = srcFull.split('?')[0];
2383
+ const parts = pathSinParams.split('/').filter(Boolean);
2384
+ srcShort = parts.length > 0 ? parts[parts.length - 1] : srcFull.replace(/^https?:\/\/[^/]+/, '');
2385
+ srcShort = escapeHtml(srcShort.slice(0, 60));
2386
+ }
2355
2387
  const dims = [img.width, img.height].filter(Boolean).join('×') || '—';
2356
2388
  html += `
2357
2389
  <details class="metric-url-row" style="margin:6px 0;padding:8px 10px;background:var(--bg2);border-radius:4px;min-width:0">
2358
2390
  <summary style="cursor:pointer;font-family:var(--mono);font-size:0.72rem;display:flex;align-items:center;min-width:0">
2359
2391
  <span class="metric-url-idx" style="flex-shrink:0">${String(i + 1).padStart(2, '0')}</span>
2360
2392
  <span class="metric-v ${img.hasAlt ? 'ok' : ''}" style="margin-left:6px;flex-shrink:0">${img.hasAlt ? 'alt ✓' : 'sin alt'}</span>
2361
- <span style="color:var(--text3);margin-left:6px;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${srcShort}${img.src && img.src.length > 60 ? '…' : ''}</span>
2393
+ <span style="color:var(--text3);margin-left:6px;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="${escapeHtml(srcFull)}">${srcShort}${srcShort.length >= 60 ? '…' : ''}</span>
2362
2394
  </summary>
2363
2395
  <div style="margin-top:8px;padding-top:8px;border-top:1px solid var(--line);font-size:0.7rem;color:var(--text2);min-width:0">
2364
- <div class="metric-row"><span class="metric-k" style="flex-shrink:0;margin-right:8px">src</span><span style="word-break:break-all;flex:1;min-width:0">${escapeHtml((img.src || '').slice(0, 120))}${(img.src || '').length > 120 ? '…' : ''}</span></div>
2396
+ <div class="metric-row"><span class="metric-k" style="flex-shrink:0;margin-right:8px">src</span><span style="word-break:break-all;flex:1;min-width:0"><a href="${escapeHtml(srcFull)}" target="_blank" rel="noopener" style="color:var(--blue);text-decoration:none;">${escapeHtml(srcFull)}</a></span></div>
2365
2397
  <div class="metric-row"><span class="metric-k" style="flex-shrink:0;margin-right:8px">alt</span><span style="word-break:break-word;flex:1;min-width:0">${altStr}</span></div>
2366
2398
  <div class="metric-row"><span class="metric-k" style="flex-shrink:0;margin-right:8px">dimensions</span><span style="flex:1;min-width:0">${escapeHtml(dims)}</span></div>
2367
2399
  </div>
@@ -2406,21 +2438,21 @@ ${reportTemplate_1.REPORT_CSS}
2406
2438
  if (hasMeta) {
2407
2439
  const linkItem = item;
2408
2440
  html += `<details class="metric-url-row" style="margin:4px 0;min-width:0">
2409
- <summary style="cursor:pointer;display:flex;align-items:center;gap:6px;min-width:0">
2441
+ <summary style="cursor:pointer;display:flex;align-items:center;gap:6px;min-width:0" title="${escapeHtml(item.url)}">
2410
2442
  <span class="metric-url-idx" style="flex-shrink:0">${String(i + 1).padStart(2, '0')}</span>
2411
- <a class="metric-url" href="${escapeHtml(item.url)}" target="_blank" rel="noopener" onclick="event.stopPropagation()">${escapeHtml(pathPart)}</a>
2443
+ <a class="metric-url truncate-internal" href="${escapeHtml(item.url)}" target="_blank" rel="noopener" onclick="event.stopPropagation()">${escapeHtml(pathPart)}</a>
2412
2444
  <span class="metric-url-type" style="flex-shrink:0">int</span>
2413
2445
  ${(linkItem.statusCode ?? 0) >= 400 ? '<span style="color:var(--red);flex-shrink:0">' + (linkItem.statusCode || '') + '</span>' : ''}
2414
2446
  </summary>
2415
2447
  <div style="margin:6px 0 6px 20px;padding:6px 8px;background:var(--bg2);border-radius:4px;font-size:0.7rem;min-width:0">
2416
2448
  ${linkItem.anchorText ? `<div class="metric-row"><span class="metric-k" style="flex-shrink:0;margin-right:8px">anchor</span><span style="flex:1;min-width:0;word-break:break-word">${escapeHtml(linkItem.anchorText.slice(0, 80))}</span></div>` : ''}
2417
- <div class="metric-row"><span class="metric-k" style="flex-shrink:0;margin-right:8px">title</span><span style="flex:1;min-width:0;word-break:break-word">${linkItem.title ? escapeHtml(linkItem.title.slice(0, 100)) : '—'}</span></div>
2449
+ <div class="metric-row"><span class="metric-k" style="flex-shrink:0;margin-right:8px">title</span><span style="flex:1;min-width:0;word-break:break-word">${linkItem.title ? renderResponsiveTitle(linkItem.title, 60) : '—'}</span></div>
2418
2450
  <div class="metric-row"><span class="metric-k" style="flex-shrink:0;margin-right:8px">meta</span><span style="flex:1;min-width:0;word-break:break-word">${linkItem.metaDescription ? escapeHtml(linkItem.metaDescription.slice(0, 120)) + (linkItem.metaDescription.length > 120 ? '…' : '') : '—'}</span></div>
2419
2451
  </div>
2420
2452
  </details>`;
2421
2453
  }
2422
2454
  else {
2423
- html += `<div class="metric-url-row" style="min-width:0"><span class="metric-url-idx" style="flex-shrink:0">${String(i + 1).padStart(2, '0')}</span><a class="metric-url" href="${escapeHtml(item.url)}" target="_blank" rel="noopener">${escapeHtml(pathPart)}</a><span class="metric-url-type" style="flex-shrink:0">int</span></div>`;
2455
+ html += `<div class="metric-url-row" style="min-width:0" title="${escapeHtml(item.url)}"><span class="metric-url-idx" style="flex-shrink:0">${String(i + 1).padStart(2, '0')}</span><a class="metric-url truncate-internal" href="${escapeHtml(item.url)}" target="_blank" rel="noopener">${escapeHtml(pathPart)}</a><span class="metric-url-type" style="flex-shrink:0">int</span></div>`;
2424
2456
  }
2425
2457
  });
2426
2458
  if (pIntLinks.length > maxShow)
@@ -2456,23 +2488,37 @@ ${reportTemplate_1.REPORT_CSS}
2456
2488
  if (hasMeta) {
2457
2489
  const linkItem = item;
2458
2490
  const urlShort = linkItem.url.length > 50 ? linkItem.url.slice(0, 50) + '…' : linkItem.url;
2491
+ const domain = extractDomain(linkItem.url);
2459
2492
  html += `<details class="metric-url-row" style="margin:4px 0;min-width:0">
2460
- <summary style="cursor:pointer;display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0">
2493
+ <summary style="cursor:pointer;display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0" title="${escapeHtml(linkItem.url)}">
2461
2494
  <span class="metric-url-idx" style="flex-shrink:0">${String(i + 1).padStart(2, '0')}</span>
2462
- <a class="metric-url" href="${escapeHtml(linkItem.url)}" target="_blank" rel="noopener" onclick="event.stopPropagation()">${escapeHtml(urlShort)}</a>
2495
+ <a class="metric-url desktop-only" href="${escapeHtml(linkItem.url)}" target="_blank" rel="noopener" onclick="event.stopPropagation()">${escapeHtml(urlShort)}</a>
2496
+ <span class="metric-url mobile-only" style="color:var(--blue); font-weight: 500;">${escapeHtml(domain)}</span>
2463
2497
  <span class="metric-url-type" style="flex-shrink:0">ext</span>
2464
2498
  ${(linkItem.statusCode ?? 0) >= 400 ? '<span style="color:var(--red);flex-shrink:0">' + (linkItem.statusCode || '') + '</span>' : ''}
2465
2499
  </summary>
2466
2500
  <div style="margin:6px 0 6px 20px;padding:6px 8px;background:var(--bg2);border-radius:4px;font-size:0.7rem;min-width:0">
2501
+ <div class="metric-row mobile-full-url"><span class="metric-k" style="flex-shrink:0;margin-right:8px">url</span><span style="flex:1;min-width:0;word-break:break-all"><a href="${escapeHtml(linkItem.url)}" target="_blank" rel="noopener" style="color:var(--blue);text-decoration:none;">${escapeHtml(linkItem.url)}</a></span></div>
2467
2502
  ${linkItem.anchorText ? `<div class="metric-row"><span class="metric-k" style="flex-shrink:0;margin-right:8px">anchor</span><span style="flex:1;min-width:0;word-break:break-word">${escapeHtml(linkItem.anchorText.slice(0, 80))}</span></div>` : ''}
2468
- <div class="metric-row"><span class="metric-k" style="flex-shrink:0;margin-right:8px">title</span><span style="flex:1;min-width:0;word-break:break-word">${linkItem.title ? escapeHtml(linkItem.title.slice(0, 100)) : '—'}</span></div>
2503
+ <div class="metric-row"><span class="metric-k" style="flex-shrink:0;margin-right:8px">title</span><span style="flex:1;min-width:0;word-break:break-word">${linkItem.title ? renderResponsiveTitle(linkItem.title, 60) : '—'}</span></div>
2469
2504
  <div class="metric-row"><span class="metric-k" style="flex-shrink:0;margin-right:8px">meta</span><span style="flex:1;min-width:0;word-break:break-word">${linkItem.metaDescription ? escapeHtml(linkItem.metaDescription.slice(0, 120)) + (linkItem.metaDescription.length > 120 ? '…' : '') : '—'}</span></div>
2470
2505
  </div>
2471
2506
  </details>`;
2472
2507
  }
2473
2508
  else {
2474
2509
  const u = typeof item === 'object' && item && 'url' in item ? item.url : String(item);
2475
- html += `<div class="metric-url-row" style="min-width:0"><span class="metric-url-idx" style="flex-shrink:0">${String(i + 1).padStart(2, '0')}</span><a class="metric-url" href="${escapeHtml(u)}" target="_blank" rel="noopener">${escapeHtml(String(u).length > 50 ? String(u).slice(0, 50) + '…' : u)}</a><span class="metric-url-type" style="flex-shrink:0">ext</span></div>`;
2510
+ const domain = extractDomain(u);
2511
+ html += `<details class="metric-url-row" style="margin:4px 0;min-width:0">
2512
+ <summary style="cursor:pointer;display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0" title="${escapeHtml(u)}">
2513
+ <span class="metric-url-idx" style="flex-shrink:0">${String(i + 1).padStart(2, '0')}</span>
2514
+ <a class="metric-url desktop-only" href="${escapeHtml(u)}" target="_blank" rel="noopener" onclick="event.stopPropagation()">${escapeHtml(String(u).length > 50 ? String(u).slice(0, 50) + '…' : u)}</a>
2515
+ <span class="metric-url mobile-only" style="color:var(--blue); font-weight: 500;">${escapeHtml(domain)}</span>
2516
+ <span class="metric-url-type" style="flex-shrink:0">ext</span>
2517
+ </summary>
2518
+ <div class="mobile-full-url" style="margin:6px 0 6px 20px;padding:6px 8px;background:var(--bg2);border-radius:4px;font-size:0.7rem;min-width:0">
2519
+ <a href="${escapeHtml(u)}" target="_blank" rel="noopener" style="color:var(--blue);text-decoration:none;word-break:break-all;">${escapeHtml(u)}</a>
2520
+ </div>
2521
+ </details>`;
2476
2522
  }
2477
2523
  });
2478
2524
  if (pExtLinks.length > maxShow)