diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 768c6cc..2994a2e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: run: npm run lint - name: Run Prettier Check - run: npm run prettier + run: npm run format test: name: Run Tests diff --git a/LICENSE b/LICENSE index 36c3f03..c5df8ad 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 Robo Loop +Copyright (c) 2025 roboloop Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/package.json b/package.json index 6d77768..4778056 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,8 @@ "build": "tsc && vite build && cp appsscript.json dist/", "deploy": "npm run build && clasp push", "test": "vitest run", - "lint": "eslint .", - "lint:fix": "eslint . --fix", - "prettier": "prettier . --check", - "prettier:fix": "prettier . --write" + "lint": "eslint . --fix", + "format": "prettier . --write" }, "devDependencies": { "@eslint/js": "^9.22.0", diff --git a/src/handlers/handlers.ts b/src/handlers/handlers.ts index 51cf377..96e00c2 100644 --- a/src/handlers/handlers.ts +++ b/src/handlers/handlers.ts @@ -95,8 +95,12 @@ export function loadSection( const headers = new thing.ThingBuilder().headers() sheet.getRange(1, 1, 1, headers.length).setValues([headers]) - for (const { name, url, desc } of things) { + for (const { name, url, desc, additionalUrls } of things) { try { + const supportedUrl = utils.isSupportedUrl(url) + ? url + : (additionalUrls.find(u => utils.isSupportedUrl(u)) ?? url) + const { repository, lastCommit, @@ -106,7 +110,7 @@ export function loadSection( totalReleases, issueStats, pullRequestStats, - } = github.metaByUrl(url) + } = github.metaByUrl(supportedUrl) const line = new thing.ThingBuilder() .setAvatar(repository.avatar) .setName(repository.name) diff --git a/src/parser/parser.ts b/src/parser/parser.ts index af79da5..5fb0ad5 100644 --- a/src/parser/parser.ts +++ b/src/parser/parser.ts @@ -4,6 +4,7 @@ export interface Thing { name: string desc: string url: string + additionalUrls: string[] } export interface TableOfContents { @@ -30,6 +31,16 @@ function extractRawSection(content: string, section: string): string | null { return content.slice(startIndex, endIndex).trim() } +const matchAdditionalUrls = /\[[^\]]+\]\((?[^)]+)\)/g + +function extractAdditionalUrls(desc: string): string[] { + const urls = [] + for (const match of desc.matchAll(matchAdditionalUrls)) { + urls.push(match.groups!.url) + } + return urls +} + const matchThing = /\s\[(?[^\]]+)\]\((?[^)]+)\)\s*[-–—]\s*(?.+)$/ export function extractThings(content: string, section: string): Thing[] { @@ -47,6 +58,7 @@ export function extractThings(content: string, section: string): Thing[] { name: m.groups!.name, desc: m.groups!.desc, url: m.groups!.url, + additionalUrls: extractAdditionalUrls(m.groups!.desc), })) } diff --git a/tests/parser/__mocks__/dummy.md b/tests/parser/__mocks__/dummy.md index 088f774..a0309a8 100644 --- a/tests/parser/__mocks__/dummy.md +++ b/tests/parser/__mocks__/dummy.md @@ -82,8 +82,8 @@ Per vel "Nobis si Dominium" urna ex dis est-etiam haeres mi maiores hic ille. - [@martii/domini-sensim](zzril://florem.hac/laesit/wisi/sunt/sunt/accessum/israel-paucis) - Parcam decessu scomata. - [nisi-fronte-nam](minim://minaci.sem/zzril/wisi-platea-eos) - Eros-tractu CUM. -- [odit-capiat-impiorum](totam://dantis.per/magister/ullo-pungit-potiorue) - Ullam NAM ingeminabit. -- [ullo-victum-modo](liber://lectus.mus/eum-ad/nisi-victor-quod) - Experientia nisl Esse.id gaudere orandum. +- [odit-capiat-impiorum](totam://dantis.per/magister/ullo-pungit-potiorue) - Ullam [NAM](uepo://quis.velit/id-justo/tempus-lacinia) ingeminabit. +- [ullo-victum-modo](liber://lectus.mus/eum-ad/nisi-victor-quod) - Experientia [nisl](feugiat://in.enim.in/malesuada/aliquet-ex) Esse.id gaudere [orandum](ac://nunc.vel/sem-venenatis/bibendum-id). #### Header 1-5-1-2 diff --git a/tests/parser/parser.test.ts b/tests/parser/parser.test.ts index d8810e1..efe6457 100644 --- a/tests/parser/parser.test.ts +++ b/tests/parser/parser.test.ts @@ -25,21 +25,28 @@ const data: TestCase[] = [ name: '@martii/domini-sensim', desc: 'Parcam decessu scomata.', url: 'zzril://florem.hac/laesit/wisi/sunt/sunt/accessum/israel-paucis', + additionalUrls: [], }, { name: 'nisi-fronte-nam', desc: 'Eros-tractu CUM.', url: 'minim://minaci.sem/zzril/wisi-platea-eos', + additionalUrls: [], }, { name: 'odit-capiat-impiorum', - desc: 'Ullam NAM ingeminabit.', + desc: 'Ullam [NAM](uepo://quis.velit/id-justo/tempus-lacinia) ingeminabit.', url: 'totam://dantis.per/magister/ullo-pungit-potiorue', + additionalUrls: ['uepo://quis.velit/id-justo/tempus-lacinia'], }, { name: 'ullo-victum-modo', - desc: 'Experientia nisl Esse.id gaudere orandum.', + desc: 'Experientia [nisl](feugiat://in.enim.in/malesuada/aliquet-ex) Esse.id gaudere [orandum](ac://nunc.vel/sem-venenatis/bibendum-id).', url: 'liber://lectus.mus/eum-ad/nisi-victor-quod', + additionalUrls: [ + 'feugiat://in.enim.in/malesuada/aliquet-ex', + 'ac://nunc.vel/sem-venenatis/bibendum-id', + ], }, ], }, @@ -54,6 +61,7 @@ const data: TestCase[] = [ name: 'ullo-tortor-massa', desc: 'Sint lucern neque netus adiurando.', url: 'optio://secuti.quo/pygmaeus/nisi-hostis-porro', + additionalUrls: [], }, ], },