From 1d3727b53759a8dd55297ab72211d9644677431f Mon Sep 17 00:00:00 2001 From: Gaurav Date: Thu, 30 May 2024 21:59:42 +1000 Subject: [PATCH] Handle encoded section IDs --- index.test.js | 36 ++++++++++++++++++- lib/check-file-links.js | 12 +++++-- .../decoded-sections/.decodedTest.yml | 2 ++ .../markdown/decoded-sections/decoded.md | 19 ++++++++++ 4 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/markdown/decoded-sections/.decodedTest.yml create mode 100644 test/fixtures/markdown/decoded-sections/decoded.md diff --git a/index.test.js b/index.test.js index ea72c9b..ea978c3 100644 --- a/index.test.js +++ b/index.test.js @@ -149,7 +149,7 @@ test('linkspector should add back the removed duplicates when returning the resu expect(results[3].status).toBe('error') }) -test(' linkspector should check hyperlinks in AsciiDoc files', async () => { +test('linkspector should check hyperlinks in AsciiDoc files', async () => { let hasErrorLinks = false let currentFile = '' // Variable to store the current file name let results = [] // Array to store the results if json is true @@ -184,3 +184,37 @@ test(' linkspector should check hyperlinks in AsciiDoc files', async () => { expect(results[2].status).toBe('error') expect(results[3].status).toBe('alive') }) + +test('linkspector should check HTML encoded section links', async () => { + let hasErrorLinks = false + let currentFile = '' // Variable to store the current file name + let results = [] // Array to store the results if json is true + + for await (const { file, result } of linkspector( + './test/fixtures/markdown/decoded-sections/.decodedTest.yml', + cmd + )) { + currentFile = file + for (const linkStatusObj of result) { + if (cmd.json) { + results.push({ + file: currentFile, + link: linkStatusObj.link, + status_code: linkStatusObj.status_code, + line_number: linkStatusObj.line_number, + position: linkStatusObj.position, + status: linkStatusObj.status, + error_message: linkStatusObj.error_message, + }) + } + if (linkStatusObj.status === 'error') { + hasErrorLinks = true + } + } + } + + expect(hasErrorLinks).toBe(false) + expect(results.length).toBe(2) + expect(results[0].status).toBe('alive') + expect(results[1].status).toBe('alive') +}) diff --git a/lib/check-file-links.js b/lib/check-file-links.js index 249c08d..63218d5 100644 --- a/lib/check-file-links.js +++ b/lib/check-file-links.js @@ -27,7 +27,7 @@ function checkFileExistence(link, file) { // Determine the file path const filePath = urlWithoutSection.startsWith('/') ? path.join(process.cwd(), urlWithoutSection) - : urlWithoutSection === '' + : urlWithoutSection === '' || urlWithoutSection === path.basename(file) ? file : path.resolve(path.dirname(file), urlWithoutSection) @@ -45,17 +45,23 @@ function checkFileExistence(link, file) { // Use GitHub slugger to generate the heading slug for comparison const headingNodes = new Set() visit(tree, 'heading', (node) => { + const headingText = node.children + .map((child) => child.value || '') + .join('') const headingId = node.children[0].type === 'html' ? node.children[0].value.match(/name="(.+?)"/)?.[1] : node.children[0].value.includes('{#') ? node.children[0].value.match(/{#(.+?)}/)?.[1] - : slugger.slug(node.children[0].value) + : slugger.slug(headingText) headingNodes.add(headingId) }) + // Decode the section ID from the URL + const decodedSectionId = decodeURIComponent(sectionId) + // Check if the section exists - if (!headingNodes.has(sectionId)) { + if (!headingNodes.has(decodedSectionId)) { statusCode = '404' status = 'error' errorMessage = `Cannot find section: #${sectionId} in file: ${filePath}.` diff --git a/test/fixtures/markdown/decoded-sections/.decodedTest.yml b/test/fixtures/markdown/decoded-sections/.decodedTest.yml new file mode 100644 index 0000000..4d71561 --- /dev/null +++ b/test/fixtures/markdown/decoded-sections/.decodedTest.yml @@ -0,0 +1,2 @@ +dirs: + - ./test/fixtures/markdown/decoded-sections diff --git a/test/fixtures/markdown/decoded-sections/decoded.md b/test/fixtures/markdown/decoded-sections/decoded.md new file mode 100644 index 0000000..53d3c73 --- /dev/null +++ b/test/fixtures/markdown/decoded-sections/decoded.md @@ -0,0 +1,19 @@ +A távolsági - lő- és hajítófegyverekkel - végzett harc során a védekező fél nem saját Védő Értékével vesz részt a harcban, ugyanolyan “céltárgynak” minősül, mint egy szalmabábú, vagy egy agyaggalamb. Ugyanakkor a célpont mozgásának jellege (lásd “Mozgás módosító" fejezetet) és a távolság erőteljesen befolyásolják a találat esélyeit. Lásd még: [Szándékos kitérés lövés elől](decoded.md#sz%C3%A1nd%C3%A9kos-kit%C3%A9r%C3%A9s-l%C3%B6v%C3%A9s-el%C5%91l) fejezetet. A támadó a távolsági harcban a **Célzó Értékét** használja, melynek megállapítása több tényezőtől függ. + +Also a link to check [the README Documentation Section](#-documentation) + +## 📖 Documentation + +This is the documentation section. It is a simple markdown file with some links and references to other sections. + +### Szándékos kitérés lövés elől + +Ha valaki látja és van ideje felkészülni a rá leadott lövésre/hajításra, valamint rendelkezik elegendő hellyel a kitérésre és bejelenti, hogy megpróbálja elkerülni végzetét, akkor Gyorsaságpróbát kell dobnia, melynek nehézsége függ a lövést leadó személy távolságától, valamint az általa használt fegyvertől. + +| Gyorsaságpróba célszám | Dobófegyverek,
Mágikus lövedék I. | Íjak,
Mágikus lövedék II. | Nyílpuskák,
Mágikus lövedék III. | +| :--------------------: | -------------------------------------: | -----------------------------: | ------------------------------------: | +| 8 | 1m - 3m | 0m - 5m | 0m - 10m | +| 7 | 4m - 6m | 6m - 10m | 11m - 20m | +| 6 | 7m - 9m | 11m - 15m | 21m - 30m | +| 5 | 10m - 12m | 16m - 20m | 31m - 40m | +| 4 | Testközelben | | |