mirror of
https://github.com/jspsych/jsPsych.git
synced 2025-05-10 03:00:54 +00:00
95 lines
2.7 KiB
JavaScript
95 lines
2.7 KiB
JavaScript
import "@citation-js/plugin-bibtex";
|
|
import "@citation-js/plugin-software-formats";
|
|
import "@citation-js/plugin-csl";
|
|
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
|
|
import { Cite } from "@citation-js/core";
|
|
import appRootPath from "app-root-path";
|
|
import yaml from "yaml";
|
|
|
|
/**
|
|
* Generate citation data from CITATION.cff file
|
|
* Currently supported formats: APA, BibTeX
|
|
*
|
|
* @returns {Object} - Object containing APA and BibTeX formatted citation data
|
|
*/
|
|
export default function generateCitations() {
|
|
let preferredCitation = false;
|
|
|
|
// Try to find CITATION.cff file and look for preferred-citation
|
|
const citationCff = (() => {
|
|
let rawCff;
|
|
const getCff = (path) => {
|
|
rawCff = fs.readFileSync(path, "utf-8").toString();
|
|
const cffData = yaml.parse(rawCff);
|
|
if (cffData["preferred-citation"]) {
|
|
preferredCitation = true;
|
|
}
|
|
return yaml.stringify(rawCff);
|
|
};
|
|
|
|
try {
|
|
// look for CITATION.cff in the current directory
|
|
return getCff("./CITATION.cff");
|
|
} catch (error) {
|
|
try {
|
|
// look for CITATION.cff in the root of the repository
|
|
return getCff(path.join(appRootPath.path, "CITATION.cff"));
|
|
} catch (error) {
|
|
console.warn(
|
|
`No CITATION.cff file found: ${error.message}. If you would like to include a citation, please create a CITATION.cff file in the root of your repository.`
|
|
);
|
|
return null;
|
|
}
|
|
}
|
|
})();
|
|
|
|
if (!citationCff) {
|
|
return { apa: "", bibtex: "" };
|
|
}
|
|
|
|
// Convert CITATION.cff to APA string
|
|
const citationApa = (() => {
|
|
try {
|
|
const apaCite = new Cite(citationCff);
|
|
apaCite["data"] = preferredCitation ? apaCite["data"].slice(1) : apaCite["data"];
|
|
const citationApa = apaCite.format("bibliography", {
|
|
format: "text",
|
|
template: "apa",
|
|
lang: "en-us",
|
|
});
|
|
return citationApa;
|
|
} catch (error) {
|
|
console.log(`Error converting CITATION.cff to APA string: ${error.message}`);
|
|
return "";
|
|
}
|
|
})();
|
|
|
|
// Convert CITATION.cff to BibTeX string
|
|
const citationBibtex = (() => {
|
|
try {
|
|
const bibtexCite = new Cite(citationCff);
|
|
bibtexCite["data"] = preferredCitation ? bibtexCite["data"].slice(1) : bibtexCite["data"];
|
|
const citationBibtex = bibtexCite.format("bibtex", {
|
|
format: "text",
|
|
template: "bibtex",
|
|
lang: "en-us",
|
|
});
|
|
return citationBibtex;
|
|
} catch (error) {
|
|
console.log(`Error converting CITATION.cff to BibTeX string: ${error.message}`);
|
|
return null;
|
|
}
|
|
})();
|
|
|
|
// Return formatted citation data
|
|
const citationData = {
|
|
apa: citationApa.replace(/\n/g, " "),
|
|
bibtex: citationBibtex.replace(/\n/g, " "),
|
|
};
|
|
|
|
return citationData;
|
|
}
|