Files
Gitea/web_src/js/features/citation.ts
T
silverwind 2baa5a16f8 enhance(citation): render citations server-side (#39373)
Replace citation-js with a Go port of ruby-cff, which GitHub uses for
"Cite this repository", rendering APA and BibTeX server-side and
dropping about 770KB of JS. Output matches GitHub on 1568 of 1571
real-world files, the rest are improvements over GitHub.

- `CITATION.cff` wins over `CITATION.bib`, matched case-insensitively
and through symlinks
- `CITATION.bib` is offered as-is, without APA

Signed-off-by: silverwind <me@silverwind.io>
2026-10-03 02:28:34 +00:00

28 lines
1.2 KiB
TypeScript

import {localUserSettings} from '../modules/user-settings.ts';
export function initRepoCitationPanel(elPanel: HTMLElement) {
const citationCopyApa = elPanel.querySelector<HTMLButtonElement>('.citation-apa');
const citationCopyBibtex = elPanel.querySelector<HTMLButtonElement>('.citation-bibtex')!;
const inputContent = elPanel.querySelector('input')!;
const clipboardBtn = elPanel.querySelector('.citation-copy')!;
const updateUi = () => {
const isBibtex = !citationCopyApa || localUserSettings.getString('citation-copy-format', 'apa') === 'bibtex';
const text = (isBibtex ? citationCopyBibtex : citationCopyApa).getAttribute('data-text')!;
inputContent.value = text;
inputContent.setSelectionRange(0, 0);
clipboardBtn.setAttribute('data-clipboard-text', text); // the input strips newlines
citationCopyBibtex.classList.toggle('primary', isBibtex);
citationCopyApa?.classList.toggle('primary', !isBibtex);
};
for (const [format, button] of Object.entries({apa: citationCopyApa, bibtex: citationCopyBibtex})) {
button?.addEventListener('click', () => {
localUserSettings.setString('citation-copy-format', format);
updateUi();
});
}
updateUi();
}