diff --git a/.changeset/forty-turtles-drive.md b/.changeset/forty-turtles-drive.md new file mode 100644 index 000000000..8ccbac0d5 --- /dev/null +++ b/.changeset/forty-turtles-drive.md @@ -0,0 +1,5 @@ +--- +"citation-js-utils": patch +--- + +Avoid repeated `https://doi.org/https://doi.org/...` diff --git a/packages/citation-js-utils/src/index.ts b/packages/citation-js-utils/src/index.ts index d4e496a2b..d32c7042d 100644 --- a/packages/citation-js-utils/src/index.ts +++ b/packages/citation-js-utils/src/index.ts @@ -1,4 +1,5 @@ import { Cite } from '@citation-js/core'; +import { doi as doiUtils } from 'doi-utils'; import { clean as cleanCSL } from '@citation-js/core/lib/plugins/input/csl.js'; import sanitizeHtml from 'sanitize-html'; @@ -121,7 +122,7 @@ export type CitationRenderer = Record< >; function doiUrl(doi?: string) { - return doi ? `https://doi.org/${doi}` : undefined; + return doi ? doiUtils.buildUrl(doi) : undefined; } function wrapWithAnchorTag(url: string, text?: string) { diff --git a/packages/citation-js-utils/tests/basic.spec.ts b/packages/citation-js-utils/tests/basic.spec.ts index a1fccb717..359eea267 100644 --- a/packages/citation-js-utils/tests/basic.spec.ts +++ b/packages/citation-js-utils/tests/basic.spec.ts @@ -40,6 +40,7 @@ describe('Test reference rendering', () => { const data = parseBibTeX(src); const citations = await getCitationRenderers(data); expect(citations['cury2020sparse'].getDOI()).toBe(TEST_DOI_IN_OTHER_FIELD); + expect(citations['cury2020sparse'].getURL()).toBe(`https://doi.org/${TEST_DOI_IN_OTHER_FIELD}`); }); }); diff --git a/packages/myst-transforms/src/links/doi.ts b/packages/myst-transforms/src/links/doi.ts index 324325d26..61d02ec47 100644 --- a/packages/myst-transforms/src/links/doi.ts +++ b/packages/myst-transforms/src/links/doi.ts @@ -4,7 +4,6 @@ import type { VFile } from 'vfile'; import type { Link, LinkTransformer } from './types.js'; import { updateLinkTextIfEmpty } from './utils.js'; -const DOI_ORG = 'https://doi.org/'; const TRANSFORM_SOURCE = 'LinkTransform:DOITransformer'; export class DOITransformer implements LinkTransformer { @@ -21,8 +20,8 @@ export class DOITransformer implements LinkTransformer { transform(link: Link, file: VFile): boolean { const urlSource = link.urlSource || link.url; - const doiString = doi.normalize(urlSource); - if (!doiString) { + const doiUrl = doi.buildUrl(urlSource); + if (!doiUrl) { fileError(file, `DOI is not valid: ${urlSource}`, { node: link, source: TRANSFORM_SOURCE, @@ -30,8 +29,8 @@ export class DOITransformer implements LinkTransformer { }); return false; } - link.url = `${DOI_ORG}${doiString}`; - link.data = { doi: doiString }; + link.url = doiUrl; + link.data = { doi: doi.normalize(doiUrl) }; link.internal = false; updateLinkTextIfEmpty(link, ''); return true;