diff --git a/.github/scripts/baidu-tongji.js b/.github/scripts/baidu-tongji.js index b687b9e99..554d11bf9 100644 --- a/.github/scripts/baidu-tongji.js +++ b/.github/scripts/baidu-tongji.js @@ -157,27 +157,47 @@ async function getPageTitleAndLang(url) { const response = await axios.get(url, { timeout: 10000, headers: { - "User-Agent": - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + 'User-Agent': 'Mozilla/5.0 (compatible; Docusaurus-Doc-Crawler/1.0; +https://github.com/radxa-docs/docs)', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'en-US,en;q=0.5', }, }); const $ = cheerio.load(response.data); - // 获取标题 - let title = ""; - const titleElement = $("title"); - if (titleElement.length > 0) { - title = titleElement.text().trim(); - } else { - const h1Element = $("h1"); - if (h1Element.length > 0) { - title = h1Element.first().text().trim(); - } else { - title = url.split("/").pop() || url; - } + let breadcrumbs = []; + const breadcrumbLinks = $(".breadcrumbs__link"); + + if (breadcrumbLinks.length > 0) { + breadcrumbLinks.each((index, element) => { + const $link = $(element); + + let title = ""; + + const directSpan = $link.children("span").first(); + if (directSpan.length > 0) { + title = directSpan.text().trim(); + } else { + const nestedSpan = $link.find("span").first(); + if (nestedSpan.length > 0) { + title = nestedSpan.text().trim(); + } else { + title = $link.text().trim(); + } + } + + let url = $link.attr("href") || ""; + url = url.trim(); + + breadcrumbs.push({ + title: title, + url: url + }); + }); } + breadcrumbs = breadcrumbs.filter(item => item.title || item.url); + let lang = detectLanguageFromUrl(url); if (!lang) { lang = detectLanguageFromHtml($); @@ -191,7 +211,7 @@ async function getPageTitleAndLang(url) { } } - return { title, lang }; + return { lang, breadcrumbs }; } catch (error) { console.error(`获取页面标题失败 ${url}:`, error.message); let lang = detectLanguageFromUrl(url) || "en"; @@ -229,8 +249,8 @@ async function updateDataWithTitles(data) { for (let i = 0; i < urls.length; i++) { const url = urls[i]; console.log(`正在获取第 ${i + 1}/${urls.length} 个URL的信息: ${url}`); - const { title, lang } = await getPageTitleAndLang(url); - urlInfo[url] = { title, lang }; + const { lang, breadcrumbs } = await getPageTitleAndLang(url); + urlInfo[url] = { lang, breadcrumbs }; await new Promise((resolve) => setTimeout(resolve, 500)); } @@ -239,7 +259,7 @@ async function updateDataWithTitles(data) { for (const itemGroup of items) { for (const item of itemGroup) { if (item.name && urlInfo[item.name]) { - item.title = urlInfo[item.name].title; + item.breadcrumbs = urlInfo[item.name].breadcrumbs; item.lang = urlInfo[item.name].lang; } } diff --git a/.github/scripts/latest-updates.js b/.github/scripts/latest-updates.js index 46ac82e52..f9ade9c61 100644 --- a/.github/scripts/latest-updates.js +++ b/.github/scripts/latest-updates.js @@ -126,6 +126,25 @@ async function getMarkdownCommits(days = 30) { ""; const url = detail.html_url || item.html_url || ""; + let page_url = ""; + const firstMd = files.find((f) => { + const n = (f.filename || "").toLowerCase(); + return exts.some((ext) => n.endsWith(ext)); + }); + if (firstMd && firstMd.filename) { + const raw = String(firstMd.filename).replace(/\\/g, "/"); + const mI18n = raw.match(/^i18n\/([^/]+)\/docusaurus-plugin-content-docs\/current\/(.+)\.(md|mdx)$/i); + if (raw.startsWith("docs/")) { + const docPath = raw.slice(5).replace(/\.(md|mdx)$/i, ""); + page_url = "/" + docPath.replace(/\/index$/i, ""); + } else if (mI18n) { + const locale = mI18n[1]; + const docPath = mI18n[2]; + page_url = `/${locale}/${docPath}`.replace(/\/index$/i, ""); + } + } + + console.log("最近修改的页面:", page_url); result.push({ author: authorName, title, @@ -133,6 +152,7 @@ async function getMarkdownCommits(days = 30) { message, committed_at: committedAt, sha, + page_url, }); } catch (e) { // 忽略单条失败,继续