From e6abbcf5555d6e936277b65ea7df7c65400e9a0c Mon Sep 17 00:00:00 2001 From: EnixCoda Date: Wed, 17 May 2023 23:53:43 +0800 Subject: [PATCH] fix: update selectors --- src/platforms/GitHub/DOMHelper.ts | 66 ++++++++++++++++++++----------- src/platforms/GitHub/index.ts | 3 ++ src/platforms/Gitee/DOMHelper.ts | 11 ------ 3 files changed, 47 insertions(+), 33 deletions(-) diff --git a/src/platforms/GitHub/DOMHelper.ts b/src/platforms/GitHub/DOMHelper.ts index c14b099..8145b75 100644 --- a/src/platforms/GitHub/DOMHelper.ts +++ b/src/platforms/GitHub/DOMHelper.ts @@ -17,10 +17,43 @@ const selectors = { repositoryName: 'nav[role="navigation"] ul[role="list"] li:nth-child(2) .AppHeader-context-item', }, + branchSelector: 'button[id^="branch-picker-"]', }, } +export function resolveMetaFromDOMJSON(): { defaultBranch: string; metaData: MetaData } | void { + // in code page, there is a JSON script tag in DOM with meta data + const json = $('script[type="application/json"][data-target="react-app.embeddedData"]', e => { + try { + return JSON.parse(e.textContent || '') + } catch (error) { + return null + } + }) + if (!json) return + + const { payload } = json + if (!payload) return + + const { repo, refInfo } = payload + if (!repo || !refInfo) return + + const { defaultBranch, name: repoName, ownerLogin: userName } = repo + const { name: branchName } = refInfo + return { + defaultBranch, + metaData: { + userName, + repoName, + branchName, + }, + } +} + export function resolveMeta(): Partial { + const dataFromJSON = resolveMetaFromDOMJSON() + if (dataFromJSON) return dataFromJSON.metaData + const metaData = { userName: $( @@ -57,7 +90,11 @@ export function isInRepoPage() { } export function isInCodePage() { - const branchListSelector = ['#branch-select-menu', '.branch-select-menu', 'button[id^=branch-picker]'].join() + const branchListSelector = [ + '#branch-select-menu', + '.branch-select-menu', + selectors.globalNavigation.branchSelector, + ].join() // The element may still exist in DOM for PR pages, but not visible return Boolean($(branchListSelector, e => e.offsetWidth > 0 && e.offsetHeight > 0)) } @@ -80,12 +117,13 @@ export function getCurrentBranch(passive = false) { const selectedBranchButtonSelector = [ 'main #branch-select-menu summary', 'main .branch-select-menu summary', + selectors.globalNavigation.branchSelector, ].join() const branchButtonElement = $(selectedBranchButtonSelector) if (branchButtonElement) { const branchNameSpanElement = branchButtonElement.querySelector('span') if (branchNameSpanElement) { - const partialBranchNameFromInnerText = branchNameSpanElement.textContent || '' + const partialBranchNameFromInnerText = branchNameSpanElement.textContent?.trim() || '' if (partialBranchNameFromInnerText && !partialBranchNameFromInnerText.includes('…')) return partialBranchNameFromInnerText } @@ -134,33 +172,17 @@ const PAGE_TYPES = { * TODO: distinguish type 'preview' */ function getCurrentPageType() { - const blobPathSelector = '#blob-path' // path next to branch switcher - const blobWrapperSelector = 'main .blob-wrapper table' - const readmeSelector = 'main .readme' - const searchResultSelector = '.codesearch-results' + const searchResultSelector = '.search-sub-header' + const blobPathSelector = '[aria-label="file content"]' + const readmeSelector = 'main #readme' return ( $(searchResultSelector, () => PAGE_TYPES.SEARCH) || - $(blobWrapperSelector, () => $(blobPathSelector, () => PAGE_TYPES.RAW_TEXT)) || + $(blobPathSelector, () => PAGE_TYPES.RAW_TEXT) || $(readmeSelector, () => PAGE_TYPES.RENDERED) || PAGE_TYPES.OTHERS ) } -const REPO_TYPE_PRIVATE = 'private' as const -const REPO_TYPE_PUBLIC = 'public' as const -export function getRepoPageType() { - const headerSelector = `main .pagehead.repohead h1` - return $(headerSelector, header => { - const repoPageTypes = [REPO_TYPE_PRIVATE, REPO_TYPE_PUBLIC] - for (const repoPageType of repoPageTypes) { - if (header.classList.contains(repoPageType)) { - return repoPageType - } - } - raiseError(new Error('cannot get repo page type')) - }) -} - /** * get text content of raw text content */ diff --git a/src/platforms/GitHub/index.ts b/src/platforms/GitHub/index.ts index 2b37de3..834417f 100644 --- a/src/platforms/GitHub/index.ts +++ b/src/platforms/GitHub/index.ts @@ -131,6 +131,9 @@ export const GitHub: Platform = { return metaData }, async getDefaultBranchName({ userName, repoName }, accessToken) { + const dataFromJSON = DOMHelper.resolveMetaFromDOMJSON() + if (dataFromJSON?.defaultBranch) return dataFromJSON.defaultBranch + return (await API.getRepoMeta(userName, repoName, accessToken)).default_branch }, resolveUrlFromMetaData({ userName, repoName, branchName }) { diff --git a/src/platforms/Gitee/DOMHelper.ts b/src/platforms/Gitee/DOMHelper.ts index 13dacb3..ca771e9 100644 --- a/src/platforms/Gitee/DOMHelper.ts +++ b/src/platforms/Gitee/DOMHelper.ts @@ -26,17 +26,6 @@ export function getCurrentBranch() { raiseError(new Error('cannot get current branch')) } -const REPO_TYPE_PRIVATE = 'private' as const -const REPO_TYPE_PUBLIC = 'public' as const -export function getRepoPageType() { - const headerSelector = `.git-project-title .icon-lock` - return $( - headerSelector, - () => REPO_TYPE_PRIVATE, - () => REPO_TYPE_PUBLIC, - ) -} - export function attachCopySnippet() { const readmeSelector = '.file_content.markdown-body' return $(readmeSelector, () => {