From 2eb26b4840b15bcb7b218dc48b4e7298a685fa4e Mon Sep 17 00:00:00 2001 From: Lukas Wallrich Date: Mon, 9 Nov 2026 17:45:10 +0000 Subject: [PATCH 1/6] Apply the clusters content decisions and fix two parser bugs The Clusters v4.1 Doc now has title-case names for clusters 5, 6 and 8, corrected descriptions (WEIRD expansion, open access glosses, equity, LGBTQ+, communication barriers and others), a description for Decolonizing Research Practices, no INSERT DESCRIPTION placeholder or editors' notes, and corrected Mozersky (IASSIST Quarterly) and Flynn references. Re-ran parse_clusters_to_sheet.py --json-only and generate_cluster_pages.py. The parser now keeps a description line that cites a year in passing ("Clarke's (2022) piece") as the description, and keeps the Doc's group author when the doi.org APA text starts with the year (Open Science Collaboration, National Academies). Co-Authored-By: Claude Opus 5.5 --- content/clusters/cluster-5/index.md | 14 ++--- content/clusters/cluster-6/index.md | 14 ++--- content/clusters/cluster-8/index.md | 14 ++--- data/clusters_v4.json | 85 ++++++++++++---------------- scripts/parse_clusters_to_sheet.py | 45 +++++++++++++-- scripts/tests/test_parse_clusters.py | 33 +++++++++++ 6 files changed, 130 insertions(+), 75 deletions(-) diff --git a/content/clusters/cluster-5/index.md b/content/clusters/cluster-5/index.md index 5f1baadfe83..a5a312c1b30 100644 --- a/content/clusters/cluster-5/index.md +++ b/content/clusters/cluster-5/index.md @@ -2,14 +2,14 @@ type = "clusters" layout = "cluster" cluster_number = 5 -title = "Cluster 5: Transparency and reproducibility in computation and analysis — FORRT Open Science Taxonomy" -heading_title = "Cluster 5: Transparency and reproducibility in computation and analysis" -summary = "FORRT Cluster 5: Transparency and reproducibility in computation and analysis. Attainment of the how-to basics of reproducible reports and analyses. It requires students to move towards transparent and scripted analysis practices in quantitative research. There are 5 sub-clusters which aim to fur…" -description = "FORRT Cluster 5: Transparency and reproducibility in computation and analysis. Attainment of the how-to basics of reproducible reports and analyses. It requires students to move towards transparent and scripted analysis practices in quantitative research. There are 5 sub-clusters which aim to fur…" -sharing_title = "Cluster 5: Transparency and reproducibility in computation and analysis — FORRT Open Science Taxonomy" -sharing_description = "FORRT Cluster 5: Transparency and reproducibility in computation and analysis. Attainment of the how-to basics of reproducible reports and analyses. It requires students to move towards transparent and scripted analysis practices in quantitative research. There are 5 sub-clusters which aim to fur…" +title = "Cluster 5: Transparency and Reproducibility in Computation and Analysis — FORRT Open Science Taxonomy" +heading_title = "Cluster 5: Transparency and Reproducibility in Computation and Analysis" +summary = "FORRT Cluster 5: Transparency and Reproducibility in Computation and Analysis. Attainment of the how-to basics of reproducible reports and analyses. It requires students to move towards transparent and scripted analysis practices in quantitative research. There are 5 sub-clusters which aim to fur…" +description = "FORRT Cluster 5: Transparency and Reproducibility in Computation and Analysis. Attainment of the how-to basics of reproducible reports and analyses. It requires students to move towards transparent and scripted analysis practices in quantitative research. There are 5 sub-clusters which aim to fur…" +sharing_title = "Cluster 5: Transparency and Reproducibility in Computation and Analysis — FORRT Open Science Taxonomy" +sharing_description = "FORRT Cluster 5: Transparency and Reproducibility in Computation and Analysis. Attainment of the how-to basics of reproducible reports and analyses. It requires students to move towards transparent and scripted analysis practices in quantitative research. There are 5 sub-clusters which aim to fur…" -keywords = [ "FORRT cluster 5", "open science", "reproducible research", "Transparency and reproducibility in computation and analysis" ] +keywords = [ "FORRT cluster 5", "open science", "reproducible research", "Transparency and Reproducibility in Computation and Analysis" ] date = 2024-01-01 draft = false diff --git a/content/clusters/cluster-6/index.md b/content/clusters/cluster-6/index.md index 82d44e1a80b..a510d8e57da 100644 --- a/content/clusters/cluster-6/index.md +++ b/content/clusters/cluster-6/index.md @@ -2,14 +2,14 @@ type = "clusters" layout = "cluster" cluster_number = 6 -title = "Cluster 6: FAIR data and materials — FORRT Open Science Taxonomy" -heading_title = "Cluster 6: FAIR data and materials" -summary = "FORRT Cluster 6: FAIR data and materials. Students will learn about FAIR data (and education/research materials) principles that address Findability, Accessibility, Interoperability, and Reusability; engage with reasons to share data, the initiatives designed to increase scientific openness; as w…" -description = "FORRT Cluster 6: FAIR data and materials. Students will learn about FAIR data (and education/research materials) principles that address Findability, Accessibility, Interoperability, and Reusability; engage with reasons to share data, the initiatives designed to increase scientific openness; as w…" -sharing_title = "Cluster 6: FAIR data and materials — FORRT Open Science Taxonomy" -sharing_description = "FORRT Cluster 6: FAIR data and materials. Students will learn about FAIR data (and education/research materials) principles that address Findability, Accessibility, Interoperability, and Reusability; engage with reasons to share data, the initiatives designed to increase scientific openness; as w…" +title = "Cluster 6: FAIR Data and Materials — FORRT Open Science Taxonomy" +heading_title = "Cluster 6: FAIR Data and Materials" +summary = "FORRT Cluster 6: FAIR Data and Materials. Students will learn about FAIR data (and education/research materials) principles that address Findability, Accessibility, Interoperability, and Reusability; engage with reasons to share data, the initiatives designed to increase scientific openness; as w…" +description = "FORRT Cluster 6: FAIR Data and Materials. Students will learn about FAIR data (and education/research materials) principles that address Findability, Accessibility, Interoperability, and Reusability; engage with reasons to share data, the initiatives designed to increase scientific openness; as w…" +sharing_title = "Cluster 6: FAIR Data and Materials — FORRT Open Science Taxonomy" +sharing_description = "FORRT Cluster 6: FAIR Data and Materials. Students will learn about FAIR data (and education/research materials) principles that address Findability, Accessibility, Interoperability, and Reusability; engage with reasons to share data, the initiatives designed to increase scientific openness; as w…" -keywords = [ "FORRT cluster 6", "open science", "reproducible research", "FAIR data and materials" ] +keywords = [ "FORRT cluster 6", "open science", "reproducible research", "FAIR Data and Materials" ] date = 2024-01-01 draft = false diff --git a/content/clusters/cluster-8/index.md b/content/clusters/cluster-8/index.md index c776d968051..c75bc5c561d 100644 --- a/content/clusters/cluster-8/index.md +++ b/content/clusters/cluster-8/index.md @@ -2,14 +2,14 @@ type = "clusters" layout = "cluster" cluster_number = 8 -title = "Cluster 8: Replication and meta-research — FORRT Open Science Taxonomy" -heading_title = "Cluster 8: Replication and meta-research" -summary = "FORRT Cluster 8: Replication and meta-research. Attainment of a grounding in 'replication research', which takes a variety of forms, each with a different purpose and contribution. Replicable science requires replication research. When teaching, students should understand the purpose and need of …" -description = "FORRT Cluster 8: Replication and meta-research. Attainment of a grounding in 'replication research', which takes a variety of forms, each with a different purpose and contribution. Replicable science requires replication research. When teaching, students should understand the purpose and need of …" -sharing_title = "Cluster 8: Replication and meta-research — FORRT Open Science Taxonomy" -sharing_description = "FORRT Cluster 8: Replication and meta-research. Attainment of a grounding in 'replication research', which takes a variety of forms, each with a different purpose and contribution. Replicable science requires replication research. When teaching, students should understand the purpose and need of …" +title = "Cluster 8: Replication and Meta-Research — FORRT Open Science Taxonomy" +heading_title = "Cluster 8: Replication and Meta-Research" +summary = "FORRT Cluster 8: Replication and Meta-Research. Attainment of a grounding in 'replication research', which takes a variety of forms, each with a different purpose and contribution. Replicable science requires replication research. When teaching, students should understand the purpose and need of …" +description = "FORRT Cluster 8: Replication and Meta-Research. Attainment of a grounding in 'replication research', which takes a variety of forms, each with a different purpose and contribution. Replicable science requires replication research. When teaching, students should understand the purpose and need of …" +sharing_title = "Cluster 8: Replication and Meta-Research — FORRT Open Science Taxonomy" +sharing_description = "FORRT Cluster 8: Replication and Meta-Research. Attainment of a grounding in 'replication research', which takes a variety of forms, each with a different purpose and contribution. Replicable science requires replication research. When teaching, students should understand the purpose and need of …" -keywords = [ "FORRT cluster 8", "open science", "reproducible research", "Replication and meta-research" ] +keywords = [ "FORRT cluster 8", "open science", "reproducible research", "Replication and Meta-Research" ] date = 2024-01-01 draft = false diff --git a/data/clusters_v4.json b/data/clusters_v4.json index 38c4a2eb56f..5536f035e43 100644 --- a/data/clusters_v4.json +++ b/data/clusters_v4.json @@ -204,7 +204,7 @@ }, { "name": "Questionable research practices & their prevalence", - "description": "Questionable research practices are actions which researchers take to increase the probability of their desired result. They can be done consciously and unconsciously, distinguishing them from deliberate scientific misconduct, but still compromise research integrity since they can lead to misleading conclusions. Examples of such behaviors include p-hacking, selective reporting, and HARK-ing (Hypothesizing After the Results are Known). The ways in which researchers engage in behaviors and decision-making that increase the probability of their (consciously or unconsciously) desired result.", + "description": "Questionable research practices are actions which researchers take to increase the probability of their desired result. They can be done consciously and unconsciously, distinguishing them from deliberate scientific misconduct, but still compromise research integrity since they can lead to misleading conclusions. Examples of such behaviors include p-hacking, selective reporting, and HARK-ing (Hypothesizing After the Results are Known).", "publications": [ { "doi": "10.1007/s10670-024-00834-3", @@ -404,12 +404,12 @@ }, { "doi": "10.1177/1745691612462588", - "apa": "(2012). An Open, Large-Scale, Collaborative Effort to Estimate the Reproducibility of Psychological Science. Perspectives on Psychological Science, 7(6), 657–660. https://doi.org/10.1177/1745691612462588", + "apa": "Open Science Collaboration. (2012). An Open, Large-Scale, Collaborative Effort to Estimate the Reproducibility of Psychological Science. Perspectives on Psychological Science, 7(6), 657–660. https://doi.org/10.1177/1745691612462588", "auto_ref": true }, { "doi": "10.1126/science.aac4716", - "apa": "(2015). Estimating the reproducibility of psychological science. Science, 349(6251). https://doi.org/10.1126/science.aac4716", + "apa": "Open Science Collaboration. (2015). Estimating the reproducibility of psychological science. Science, 349(6251). https://doi.org/10.1126/science.aac4716", "auto_ref": true }, { @@ -1151,7 +1151,7 @@ }, { "name": "Research design, sampling methods, & its implications for inferences.", - "description": "How design choices and sampling strategies shape bias, precision, and generalizability. Includes threats to validity (internal/external), power and sample-size planning, selection bias, clustering/design effects, weighting, and transparent reporting/preregistration. Design and sampling decisions determine the credibility and scope of statistical inference. This sub-cluster emphasizes adequate power and sample-size planning (e.g., safeguard power), transparent pre-analysis planning to constrain researcher degrees of freedom, and rigorous, valid methods as prerequisites for meaningful replication—reducing bias, increasing precision, and improving generalizability across lab and field work.", + "description": "How design choices and sampling strategies shape bias, precision, and generalizability. Includes threats to validity (internal/external), power and sample-size planning, selection bias, clustering/design effects, weighting, and transparent reporting/preregistration. Design and sampling decisions determine the credibility and scope of statistical inference. This sub-cluster emphasizes adequate power and sample-size planning (e.g., safeguard power analysis), transparent pre-analysis planning to constrain researcher degrees of freedom, and rigorous, valid methods as prerequisites for meaningful replication—reducing bias, increasing precision, and improving generalizability across lab and field work.", "publications": [ { "doi": "10.1177/1948550615584199", @@ -1177,7 +1177,7 @@ }, { "name": "The logic of null hypothesis testing, p-values, Type I and II errors (and when and why they might happen).", - "description": "Frequentist statistics are typically the default in quantitative research. They come with certain assumptions and implications, as well as often being misinterpreted. Frequentist statistics are typically the default in much quantitative research, but they are often misinterpreted. This sub-cluster clarifies the logic of NHST, the meaning of p-values, and when and why Type I and Type II errors arise, extending to Type S and Type M errors. It links these to design and power choices and outlines practical steps for better inference and reporting.", + "description": "Frequentist statistics are typically the default in quantitative research. They come with certain assumptions and implications, as well as often being misinterpreted. This sub-cluster clarifies the logic of NHST, the meaning of p-values, and when and why Type I and Type II errors arise, extending to Type S and Type M errors. It links these to design and power choices and outlines practical steps for better inference and reporting.", "publications": [ { "doi": "10.4103%2F0972-6748.62274", @@ -2087,7 +2087,7 @@ }, { "name": "Study Design", - "description": "Design elements should be before data collection so that confirmatory claims are credible and deviations are interpretable. This includes choosing appropriate sample sizes, conditions, and measures prior to registration, and planning how to handle deviations", + "description": "Design elements should be specified before data collection so that confirmatory claims are credible and deviations are interpretable. This includes choosing appropriate sample sizes, conditions, and measures prior to registration, and planning how to handle deviations.", "publications": [ { "doi": "10.31234/osf.io/ha29k", @@ -2141,12 +2141,12 @@ }, { "number": 5, - "name": "Transparency and reproducibility in computation and analysis", + "name": "Transparency and Reproducibility in Computation and Analysis", "description": "Attainment of the how-to basics of reproducible reports and analyses. It requires students to move towards transparent and scripted analysis practices in quantitative research. There are 5 sub-clusters which aim to further parse the learning and teaching process:", "sub_clusters": [ { "name": "Analysis and reporting in qualitative research", - "description": "By documenting and reporting research processes in qualitative research, transparency and credibility in qualitative research reports is ensured. Topics include using agreed reporting standards, demonstrating methodological rigor, and recent calls to integrate qualitative methods into the open science movement. The emphasis is on making qualitative research as trustworthy and open as context permits, without forcing inappropriate replication model", + "description": "By documenting and reporting research processes in qualitative research, transparency and credibility in qualitative research reports is ensured. Topics include using agreed reporting standards, demonstrating methodological rigor, and recent calls to integrate qualitative methods into the open science movement. The emphasis is on making qualitative research as trustworthy and open as context permits, without forcing an inappropriate replication model.", "publications": [ { "doi": "", @@ -2453,8 +2453,8 @@ }, { "number": 6, - "name": "FAIR data and materials", - "description": "Students will learn about FAIR data (and education/research materials) principles that address Findability, Accessibility, Interoperability, and Reusability; engage with reasons to share data, the initiatives designed to increase scientific openness; as well as of possible privacy and security considerations together with anonymization procedures. There are 7 sub-clusters which aim to further parse the learning and teaching process:", + "name": "FAIR Data and Materials", + "description": "Students will learn about FAIR data (and education/research materials) principles that address Findability, Accessibility, Interoperability, and Reusability; engage with reasons to share data, the initiatives designed to increase scientific openness; as well as possible privacy and security considerations together with anonymization procedures. There are 7 sub-clusters which aim to further parse the learning and teaching process:", "sub_clusters": [ { "name": "Reasons to share data and materials", @@ -2476,7 +2476,7 @@ "auto_ref": true }, { - "doi": "10.1037%2Fqup0000076", + "doi": "10.1037/qup0000076", "apa": "DuBois, J. M., Strait, M., & Walsh, H. (2018). Is it time to share qualitative research data? Qualitative Psychology, 5(3), 380–393. https://doi.org/10.1037/qup0000076", "auto_ref": true }, @@ -2642,8 +2642,8 @@ "auto_ref": true }, { - "doi": "10.1002/eahr.500044", - "apa": "Mozersky, J., Parsons, M., Walsh, H., Baldwin, K., McIntosh, T., & DuBois, J. M. (2020). Research Participant Views regarding Qualitative Data Sharing. Ethics & Human Research, 42(2), 13–27. https://doi.org/10.1002/eahr.500044", + "doi": "10.29173/iq952", + "apa": "Mozersky, J., Walsh, H., Parsons, M., McIntosh, T., Baldwin, K., & DuBois, J. M. (2020). Are we ready to share qualitative research data? Knowledge and preparedness among qualitative researchers, IRB members, and data repository curators. IASSIST Quarterly, 43(4), 1–23. https://doi.org/10.29173/iq952", "auto_ref": true }, { @@ -2884,7 +2884,7 @@ }, { "name": "FAIR principles applied to Education & Training", - "description": "FAIR isn’t only for datasets, syllabi, slides, and assignments can be findable, accessible, interoperable, and reusable too. This section offers institutional and practical roadmaps to make FAIR-by-design teaching materials the default.", + "description": "FAIR isn’t only for datasets; syllabi, slides, and assignments can be findable, accessible, interoperable, and reusable too. This section offers institutional and practical roadmaps to make FAIR-by-design teaching materials the default.", "publications": [ { "doi": "10.5281/zenodo.8305540", @@ -2989,7 +2989,7 @@ }, { "name": "Different shades of open access", - "description": "We usually hear about GOLD open access (journal archives openly) for hefty fees. There are other options that may better fit your needs (and budget / reluctance to fund for-profit publishers); GREEN (self-archive), DIAMOND (journal archives openly for free), and more.", + "description": "We usually hear about GOLD open access (journal publishes openly) for hefty fees. There are other options that may better fit your needs (and budget / reluctance to fund for-profit publishers); GREEN (self-archive), DIAMOND (journal publishes openly with no fees for authors or readers), and more.", "publications": [ { "doi": "", @@ -3187,7 +3187,7 @@ }, { "name": "Rights retention strategies", - "description": "To whom does the paper belong?", + "description": "To whom does the paper belong? Rights retention strategies help authors keep the right to share their own accepted manuscripts openly, for example by stating at submission that an open licence applies to the accepted manuscript.", "publications": [ { "doi": "", @@ -3210,7 +3210,7 @@ }, { "number": 8, - "name": "Replication and meta-research", + "name": "Replication and Meta-Research", "description": "Attainment of a grounding in 'replication research', which takes a variety of forms, each with a different purpose and contribution. Replicable science requires replication research. When teaching, students should understand the purpose and need of replications in its variety of forms and be able to conduct (and join) replication projects. There are 7 sub-clusters which aim to further parse the learning and teaching process:", "sub_clusters": [ { @@ -3219,7 +3219,7 @@ "publications": [ { "doi": "10.1126/science.aac4716", - "apa": "(2015). Estimating the reproducibility of psychological science. Science, 349(6251). https://doi.org/10.1126/science.aac4716", + "apa": "Anderson, J. E., Aarts, A. A., Anderson, C. J., Attridge, P. R., Attwood, A., Axt, J., Babel, M., Bahník, Š., Baranski, E., Barnett-Cowan, M., Bartmess, E., Beer, J., Bell, R., Bentley, H., Beyan, L., Binion, G., Borsboom, D., Bosch, A., Bosco, F. A., ... Zuni, K. (2015). Estimating the reproducibility of psychological science. Science, 349(6251). https://doi.org/10.1126/science.aac4716", "auto_ref": true }, { @@ -3424,11 +3424,6 @@ "apa": "Lau, J., Ioannidis, J. P. A., Terrin, N., Schmid, C. H., & Olkin, I. (2006). The case of the misleading funnel plot. BMJ, 333(7568), 597–600. https://doi.org/10.1136/bmj.333.7568.597", "auto_ref": true }, - { - "doi": "10.1002/jrsm.1703", - "apa": "Bartoš, F., Maier, M., Wagenmakers, E., Nippold, F., Doucouliagos, H., Ioannidis, J. P. A., Otte, W. M., Sladekova, M., Deresssa, T. K., Bruns, S. B., Fanelli, D., & Stanley, T. D. (2024). Footprint of publication selection bias on meta‐analyses in medicine, environmental sciences, psychology, and economics. Research Synthesis Methods, 15(3), 500–511. https://doi.org/10.1002/jrsm.1703", - "auto_ref": true - }, { "doi": "10.1136/bmjopen-2020-045942", "apa": "Schwab, S., Kreiliger, G., & Held, L. (2021). Assessing treatment effects and publication bias across different specialties in medicine: a meta-epidemiological study. BMJ Open, 11(9), e045942. https://doi.org/10.1136/bmjopen-2020-045942", @@ -3811,7 +3806,7 @@ }, { "name": "Decolonizing Research Practices", - "description": "", + "description": "Examines how (post-)colonial power relations shape whose knowledge counts, who does research and who benefits from it, and introduces decolonial and Indigenous research methodologies and principles for Indigenous data governance.", "publications": [ { "doi": "10.5964/jspp.v3i1.564", @@ -4068,7 +4063,7 @@ }, { "name": "Diversity sample and generalizability", - "description": "Data within Psychology has been primarily from a Western, Educated, Industrious, Rich and Democratic population and generalised the findings to participants across the globe. However, researchers have rarely included Global South or discussed sample diversity in terms of race, ethnicity, gender diversity among other areas. Even when these samples are included, the findings are found to be limited to that specific region.", + "description": "Data within Psychology has been primarily from a Western, Educated, Industrialized, Rich and Democratic population and generalised the findings to participants across the globe. However, researchers have rarely included Global South or discussed sample diversity in terms of race, ethnicity, gender diversity among other areas. Even when these samples are included, the findings are found to be limited to that specific region.", "publications": [ { "doi": "10.1038/s44159-022-00070-y", @@ -4094,7 +4089,7 @@ }, { "name": "Equity", - "description": "Equity is that everyone has access to the same opportunities and that we all have privileges and barriers, thus we do not all start from the same starting position.", + "description": "Equity means ensuring that everyone has access to the same opportunities, recognising that we all have privileges and barriers and therefore do not all start from the same position.", "publications": [ { "doi": "", @@ -4458,7 +4453,7 @@ }, { "name": "Multimodal barriers to communication", - "description": "The way a person communicates can influence how they are perceived and their access to opportunities in academia, including not being a nonnative English speaker, sign-language, or accents.", + "description": "The way a person communicates can influence how they are perceived and their access to opportunities in academia, including being a nonnative English speaker, using sign language, or speaking with an accent.", "publications": [ { "doi": "", @@ -4597,9 +4592,9 @@ "auto_ref": true }, { - "doi": "", - "apa": "To add: https://www.scienceopen.com/hosted-document?doi=10.13169/intljofdissocjus.5.3.0002", - "auto_ref": false + "doi": "10.13169/intljofdissocjus.5.3.0002", + "apa": "Flynn, S. (2025). Neurodiversity, Social Work, and Social Justice: Key Issues and Overlaps. International Journal of Disability and Social Justice, 5(3). https://doi.org/10.13169/intljofdissocjus.5.3.0002", + "auto_ref": true } ] }, @@ -4787,11 +4782,6 @@ "doi": "10.31235/osf.io/xvcf2", "apa": "Wetts, R., & Willer, R. (2022). Antiracism and its Discontents: Opposition to Antiracism is a Widespread and Politically Influential Racial Ideology among White Americans. https://doi.org/10.31235/osf.io/xvcf2", "auto_ref": true - }, - { - "doi": "", - "apa": "https://en.wikipedia.org/wiki/Elsevier (go to \"Scientific Racism” section)", - "auto_ref": false } ] }, @@ -4838,7 +4828,7 @@ }, { "name": "Research assessment, proposals, and reforms", - "description": "Examines how researchers and institutions are evaluated and efforts to reform these systems to better align with open and responsible science. INSERT DESCRIPTION", + "description": "Examines how researchers and institutions are evaluated and efforts to reform these systems to better align with open and responsible science.", "publications": [ { "doi": "10.1093/joc/jqz052", @@ -4894,7 +4884,7 @@ }, { "name": "Sexuality & Gender", - "description": "Sexuality refers to the various aspects of an individual’s being related to their sexual feelings, thoughts, attractions and behaviour. We use “LGBTQ+” as an inclusive term to refer to all sexual identities and orientations which are not heterosexual. This includes but is not limited to lesbian, gay, bisexual, pansexual, asexual, queer, and questioning.", + "description": "Sexuality refers to the various aspects of an individual’s being related to their sexual feelings, thoughts, attractions and behaviour. We use “LGBTQ+” as an inclusive term to refer to all sexual orientations that are not heterosexual and all gender identities that are not cisgender. This includes but is not limited to lesbian, gay, bisexual, transgender, non-binary, pansexual, asexual, queer, and questioning.", "publications": [ { "doi": "10.1126/sciadv.abe0933", @@ -5324,7 +5314,7 @@ "description": "Qualitative research refers to research conducted with non-numeric data, such as interviews, focus groups, ethnographies, photovoice, and others. There are 10 sub-clusters that can help readers understand open science from a qualitative perspective:", "sub_clusters": [ { - "name": "FAIR data and materials: Choosing to share data", + "name": "FAIR Data and Materials: Choosing to share data", "description": "Data sharing may be a particularly useful way for researchers to increase the impact of their research. Readings in this section will highlight what data sharing can look like and why researchers and communities might benefit from these practices.", "publications": [ { @@ -5480,7 +5470,7 @@ ] }, { - "name": "FAIR data and materials: Ethical and legal challenges", + "name": "FAIR Data and Materials: Ethical and legal challenges", "description": "Sharing qualitative data comes with its own challenges. Depending on the nature of the data, it may not be ethical to share data so that anyone can access it. This section outlines some of the common issues in sharing qualitative data and how researchers might respond to these challenges.", "publications": [ { @@ -5609,8 +5599,8 @@ "auto_ref": true }, { - "doi": "10.1002/eahr.500044", - "apa": "Mozersky, J., Parsons, M., Walsh, H., Baldwin, K., McIntosh, T., & DuBois, J. M. (2020). Research Participant Views regarding Qualitative Data Sharing. Ethics & Human Research, 42(2), 13–27. https://doi.org/10.1002/eahr.500044", + "doi": "10.29173/iq952", + "apa": "Mozersky, J., Walsh, H., Parsons, M., McIntosh, T., Baldwin, K., & DuBois, J. M. (2020). Are we ready to share qualitative research data? Knowledge and preparedness among qualitative researchers, IRB members, and data repository curators. IASSIST Quarterly, 43(4), 1–23. https://doi.org/10.29173/iq952", "auto_ref": true }, { @@ -6123,13 +6113,8 @@ }, { "name": "Standards and guidelines for rigorous qualitative research", - "description": "", + "description": "Learn about different standards for reporting qualitative research processes and results. It may be helpful to first read Clarke’s (2022) piece on whether generic reporting standards are helpful in the first place.", "publications": [ - { - "doi": "", - "apa": "Learn about different standards for reporting qualitative research processes and results. It may be helpful to first read Clarke’s (2022) piece on whether generic reporting standards are helpful in the first place.", - "auto_ref": false - }, { "doi": "10.1080/14780887.2020.1769238", "apa": "Braun, V., & Clarke, V. (2020). One size fits all? What counts as quality practice in (reflexive) thematic analysis? Qualitative Research in Psychology, 18(3), 328–352. https://doi.org/10.1080/14780887.2020.1769238", @@ -6292,7 +6277,7 @@ "sub_clusters": [ { "name": "Principles and Frameworks of Research Integrity", - "description": "This sub-cluster covers the core principles, codes, and global frameworks that define research integrity. It introduces the fundamental values (e.g. honesty, rigor, transparency, accountability, respect) that underpin responsible science​. Key international statements and guidelines – such as the Singapore Statement (2010) and ALLEA’s European Code of Conduct (2017) – articulate universal norms and responsibilities for researchers. They emphasize that integrity spans all stages of research, from study design and data collection to authorship and peer review. Foundational documents (e.g. the U.S. National Academies 2017 report) situate RI in a broader context, calling for supportive research environments and institutional policies that foster ethical behavior. By studying these frameworks, one gains insight into how core values (e.g., honesty, transparency, accountability, respect) are operationalized into norms and good research practice across the research cycle. Explicitly articulated in the Netherlands Code of Conduct and agreed upon by the global research community “doing the right thing” means not only avoiding misconduct but proactively promoting openness, accountability, and social responsibility in science with clear links between specific practices and potential breaches or allegations.", + "description": "This sub-cluster covers the core principles, codes, and global frameworks that define research integrity. It introduces the fundamental values (e.g. honesty, rigor, transparency, accountability, respect) that underpin responsible science​. Key international statements and guidelines – such as the Singapore Statement (2010) and ALLEA’s European Code of Conduct (2017) – articulate universal norms and responsibilities for researchers. They emphasize that integrity spans all stages of research, from study design and data collection to authorship and peer review. Foundational documents (e.g. the U.S. National Academies 2017 report) situate RI in a broader context, calling for supportive research environments and institutional policies that foster ethical behavior. By studying these frameworks, one gains insight into how core values (e.g., honesty, transparency, accountability, respect) are operationalized into norms and good research practice across the research cycle. As articulated in the Netherlands Code of Conduct, and agreed upon by the global research community, “doing the right thing” means not only avoiding misconduct but proactively promoting openness, accountability, and social responsibility in science with clear links between specific practices and potential breaches or allegations.", "publications": [ { "doi": "", @@ -6341,7 +6326,7 @@ }, { "doi": "10.17226/21896", - "apa": "(2017). Fostering Integrity in Research. https://doi.org/10.17226/21896", + "apa": "National Academies of Sciences, Engineering, and Medicine. (2017). Fostering Integrity in Research. https://doi.org/10.17226/21896", "auto_ref": true }, { @@ -6711,7 +6696,7 @@ }, { "name": "Publication, Peer Review, and Research Integrity", - "description": "This sub-cluster examines integrity issues in the dissemination phase of science – covering authorship ethics, peer review, and publication practices. It tackles questions like: Who deserves authorship and in what order? How to avoid ghost authorship (uncredited contributors) or gift/guest authorship (undeserved credit)? Students learn about authorship guidelines (e.g., International Committee of Medical Journal Editors (ICMJE) criteria) designed to ensure fair credit and accountability. We also discuss the role of peer review as a quality safeguard and the integrity challenges it faces – from biases in reviewer selection to cases of peer review fraud. The rise of predatory journals (which subvert quality standards for profit) is a contemporary integrity threat, potentially flooding literature with unvetted findings. Additionally, this sub-cluster emphasizes the importance of corrections and retractions as part of the self-correction mechanism of science. We explore whether increasing retraction rates signify improving vigilance or persistent problems​ (Bouter, 2024). Key themes include the responsibilities of journals (via ethics committees like the Committee on Publication Ethics (COPE) and editors in handling misconduct or honest errors, and emerging innovations like open peer review to improve transparency. By engaging with these topics, future researchers learn to navigate the publication process with integrity – ensuring proper attribution, objective review, and willingness to correct the record. Key Readings:", + "description": "This sub-cluster examines integrity issues in the dissemination phase of science – covering authorship ethics, peer review, and publication practices. It tackles questions like: Who deserves authorship and in what order? How to avoid ghost authorship (uncredited contributors) or gift/guest authorship (undeserved credit)? Students learn about authorship guidelines (e.g., International Committee of Medical Journal Editors (ICMJE) criteria) designed to ensure fair credit and accountability. We also discuss the role of peer review as a quality safeguard and the integrity challenges it faces – from biases in reviewer selection to cases of peer review fraud. The rise of predatory journals (which subvert quality standards for profit) is a contemporary integrity threat, potentially flooding literature with unvetted findings. Additionally, this sub-cluster emphasizes the importance of corrections and retractions as part of the self-correction mechanism of science. We explore whether increasing retraction rates signify improving vigilance or persistent problems​ (Bouter, 2024). Key themes include the responsibilities of journals (via ethics committees like the Committee on Publication Ethics (COPE) and editors in handling misconduct or honest errors, and emerging innovations like open peer review to improve transparency. By engaging with these topics, future researchers learn to navigate the publication process with integrity – ensuring proper attribution, objective review, and willingness to correct the record.", "publications": [ { "doi": "10.1038/530027a", diff --git a/scripts/parse_clusters_to_sheet.py b/scripts/parse_clusters_to_sheet.py index fe5afcf04b9..526571d9d72 100644 --- a/scripts/parse_clusters_to_sheet.py +++ b/scripts/parse_clusters_to_sheet.py @@ -234,6 +234,22 @@ def looks_like_citation(text): return False +AUTHOR_START_RE = re.compile(r"^[^\W\d_][^,()]{0,60}, (?:[A-Z]\.|[A-Z][a-z]+(?: [A-Z]\.)+)") + + +def is_description_with_year(text): + """True for prose that mentions a year, as opposed to a reference. + + A reference starts with an author list ('Surname, X.') or carries a DOI or URL. + """ + if not looks_like_citation(text): + return False + lower = text.lower() + if 'doi.org/' in lower or 'http://' in lower or 'https://' in lower: + return False + return not AUTHOR_START_RE.match(text) + + STOP_WORDS = frozenset( 'the a an and or in on of to for is are was were be been its it we they ' 'that this with by as at from not but how when why what which their have ' @@ -397,7 +413,13 @@ def save_current(): i += 1 continue - # 3. If it looks like a citation, treat as citation/continuation + # 3. A description line can cite a work in passing, e.g. "Clarke's (2022) piece" (Cluster 10) + if state == 'in_description' and not current_cites and is_description_with_year(clean_text): + current_desc.append(extract_annotations(stripped)[0]) + i += 1 + continue + + # 4. If it looks like a citation, treat as citation/continuation if looks_like_citation(clean_text): if current_cites: current_cites[-1] += ' ' + stripped @@ -407,7 +429,7 @@ def save_current(): i += 1 continue - # 4. Structural heading: non-indented, non-citation, after blank lines only + # 5. Structural heading: non-indented, non-citation, after blank lines only # FILTER: Reject placeholder text and incomplete citations is_placeholder = clean_text in ('INSERT DESCRIPTION', 'Description') @@ -432,7 +454,7 @@ def save_current(): i += 1 continue - # 5. Description text (after heading, before citations) + # 6. Description text (after heading, before citations) if state == 'in_description': current_desc.append(extract_annotations(stripped)[0]) i += 1 @@ -704,6 +726,20 @@ def tidy_lookup_citation(apa, bibtex=''): return apa +def keep_doc_author(looked_up, doc_citation): + """Restore a group author that the doi.org APA text leaves out. + + doi.org gives e.g. '(2015). Estimating ...' for Open Science Collaboration (2015); + the Doc citation still has the author before its '(YYYY)'. + """ + if not re.match(r'\(\d{4}', looked_up): + return looked_up + m = re.match(r'(.+?)\s*\(\d{4}', doc_citation) + if not m: + return looked_up + return f"{m.group(1).strip()} {looked_up}" + + # --- DOI lookup --- class DOILookup: def __init__(self, cache_file): @@ -1089,7 +1125,8 @@ def main(): continue result = doi_lookup.lookup(pub.doi) if result: - pub.apa_reference = tidy_lookup_citation(result['apa'], result.get('bibtex', '')) + looked_up = tidy_lookup_citation(result['apa'], result.get('bibtex', '')) + pub.apa_reference = keep_doc_author(looked_up, pub.apa_reference) pub.bibtex = result.get('bibtex', '') pub.auto_ref = True if (i + 1) % 100 == 0: diff --git a/scripts/tests/test_parse_clusters.py b/scripts/tests/test_parse_clusters.py index ea08d5464bd..7d2cff584c8 100644 --- a/scripts/tests/test_parse_clusters.py +++ b/scripts/tests/test_parse_clusters.py @@ -10,6 +10,7 @@ SubCluster, build_export, build_publications, + keep_doc_author, parse_cluster_11, parse_document, parse_subclusters_standard, @@ -30,6 +31,25 @@ def test_citation_ending_in_colon_is_not_a_heading(self): ] self.assertEqual(self.names(lines, ["Rights retention strategies"]), ["Rights retention strategies"]) + def test_description_citing_a_year_stays_the_description(self): + heading = "Standards and guidelines for rigorous qualitative research" + description = "It may be helpful to first read Clarke’s (2022) piece on reporting standards." + lines = [ + heading, + description, + "* Braun, V., & Clarke, V. (2021). One size fits all?", + "Clarke, V. (2022). Navigating the messy swamp. https://doi.org/10.1/x", + ] + [sub] = parse_subclusters_standard(lines, 0, len(lines), [heading], "Cluster") + self.assertEqual(sub.description, description) + self.assertEqual(len(sub.raw_citations), 1) + + def test_unbulleted_reference_under_a_heading_stays_a_reference(self): + heading = "Standards" + lines = [heading, "Clarke, V. (2022). Navigating the messy swamp. Qualitative Psychology."] + [sub] = parse_subclusters_standard(lines, 0, len(lines), [heading], "Cluster") + self.assertEqual((sub.description, len(sub.raw_citations)), ("", 1)) + def test_comment_marker_before_indent_is_a_continuation(self): heading = "Questionable measurement practices (QMPs), validity & reliability issues." lines = [ @@ -121,6 +141,19 @@ def test_capitalised_surnames_are_normalised(self): "Piñeiro, R., & Rosenblatt, F. (2016). THE TITLE. https://doi.org/10.1/x", ) + def test_group_author_missing_from_lookup_is_kept_from_the_doc(self): + self.assertEqual( + keep_doc_author( + "(2015). Estimating the reproducibility. Science, 349(6251). https://doi.org/10.1/x", + "Open Science Collaboration. (2015). Estimating the reproducibility. https://doi.org/10.1/x", + ), + "Open Science Collaboration. (2015). Estimating the reproducibility. Science, 349(6251). https://doi.org/10.1/x", + ) + + def test_lookup_with_authors_is_unchanged(self): + apa = "Doe, A. (2015). Title. https://doi.org/10.1/x" + self.assertEqual(keep_doc_author(apa, "Roe, B. (2015). Title."), apa) + def test_organisations_and_suffixes_keep_their_capitals(self): for apa in ("KNAW, NFU, & VSNU. (2018). Title.", "Boum II, Y., & Doe, A. (2021). Title."): self.assertEqual(tidy_lookup_citation(apa), apa) From 2e46dde15016df9ea3b728f87abc69050430ba9e Mon Sep 17 00:00:00 2001 From: Lukas Wallrich Date: Mon, 9 Nov 2026 17:45:10 +0000 Subject: [PATCH 2/6] Decode entities in publication titles and keep their italics build_featured_data.py now decodes HTML entities in titles and APA references (including double-escaped ones), turns into and collapses whitespace, so card titles hold plain text plus / markup for the templates to render. Co-Authored-By: Claude Opus 5.5 --- scripts/build_featured_data.py | 22 ++++++++++++++++++++-- scripts/tests/test_build_featured_data.py | 20 ++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/scripts/build_featured_data.py b/scripts/build_featured_data.py index f7fc92b2a56..1c02acd8370 100644 --- a/scripts/build_featured_data.py +++ b/scripts/build_featured_data.py @@ -14,6 +14,7 @@ import csv import hashlib +import html import io import json import os @@ -100,10 +101,27 @@ def extract_doi(url: str) -> str | None: return None +def clean_markup_text(text: str) -> str: + """Store a title or reference as plain text plus / markup. + + Crossref metadata in the Publications sheet carries HTML entities ('&'), + sometimes escaped twice ('<em>'), and the inline tags , and + . Entities are decoded, becomes , and whitespace is collapsed. + The templates render and and escape everything else. + """ + for _ in range(2): + decoded = html.unescape(text) + if decoded == text: + break + text = decoded + text = re.sub(r'<(/?)em>', r'<\1i>', text, flags=re.IGNORECASE) + return ' '.join(text.split()) + + def clean_apa_reference(apa: str) -> str: """Remove the Portico archive-provider artefact immediately before a DOI URL.""" # Same narrow repair as parse_clusters_to_sheet.tidy_lookup_citation (#984). - return re.sub(r'\. Portico\. (?=https://doi\.org/)', '. ', apa.strip()) + return re.sub(r'\. Portico\. (?=https://doi\.org/)', '. ', clean_markup_text(apa)) def make_short_ref(apa: str) -> str: @@ -284,7 +302,7 @@ def main(): apa = clean_apa_reference(row[COL_APA]) card = { - "title": row[COL_TITLE].strip(), + "title": clean_markup_text(row[COL_TITLE]), "summary": row[COL_SUMMARY].strip(), "focus": row[COL_FOCUS].strip().lower(), "specificity": row[COL_SPECIFICITY].strip(), diff --git a/scripts/tests/test_build_featured_data.py b/scripts/tests/test_build_featured_data.py index 575d143028c..5c912d9ba97 100644 --- a/scripts/tests/test_build_featured_data.py +++ b/scripts/tests/test_build_featured_data.py @@ -32,6 +32,26 @@ def test_preserves_other_portico_mentions(self): with self.subTest(apa=apa): self.assertEqual(featured.clean_apa_reference(apa), apa) + def test_titles_keep_italics_and_small_caps_with_entities_decoded(self): + cases = { + "Celebrating 30 years of Feminism & Psychology": + "Celebrating 30 years of Feminism & Psychology", + "Registered Reports at <em>AIMS Neuroscience</em> and beyond": + "Registered Reports at AIMS Neuroscience and beyond", + "The earth is round (p\u2002<\u2002.05).": "The earth is round (p < .05).", + "Promoting Research Integrity in Africa": "Promoting Research Integrity in Africa", + "psychology departments in the\n UK\n and Ireland": + "psychology departments in the UK and Ireland", + } + for raw, clean in cases.items(): + self.assertEqual(featured.clean_markup_text(raw), clean) + + def test_apa_entities_are_decoded(self): + self.assertEqual( + featured.clean_apa_reference("Doe, A. (2024). Title. Theory & Psychology, 34(5), 1–2."), + "Doe, A. (2024). Title. Theory & Psychology, 34(5), 1–2.", + ) + def test_both_outputs_use_cleaned_publication_reference(self): doi = "10.1002/cpz1.70299" publication = ["Sub-cluster", doi, self.APA] + [""] * 15 From 28e0fed5451b0a71ed158c39dfbc1d0edd56fa82 Mon Sep 17 00:00:00 2001 From: Lukas Wallrich Date: Mon, 9 Nov 2026 17:45:10 +0000 Subject: [PATCH 3/6] Point AGENTS.md to --json-only for the clusters data --export-json on its own also clears and rewrites the Clusters sheet tabs, including the enriched Publications columns. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index 4cab3039b5e..b15466335d1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,7 +26,7 @@ Regenerated on demand; the output is committed: | Glossary terms `content/glossary/{english,german,arabic,chinese,turkish}/*.md` | `content/glossary/_create_glossaries.py`; in CI only via `data-processing.yml` dispatch with `regenerate_glossary`, which opens a PR | Glossary Google Sheet | | `data/disciplines.json` | `scripts/parse_disciplines_to_json.py` (see `content/disciplines/README`) | Disciplines sheet | | `data/disciplines_citation.json` | `scripts/build_disciplines_citation.py` | Tenzing sheet | -| `data/clusters_v4.json` | `scripts/parse_clusters_to_sheet.py --export-json` | Clusters v4.1 Google Doc | +| `data/clusters_v4.json` | `scripts/parse_clusters_to_sheet.py --json-only` (without it, the script also clears and rewrites the Publications sheet) | Clusters v4.1 Google Doc | | `content/clusters/cluster-N/index.md` | `scripts/generate_cluster_pages.py` | `data/clusters_v4.json` | | `content/about/steering-committee/index.md` (rewritten on re-run) | `scripts/generate_sc_profiles.py` | Steering committee sheets | From f84f8d8f996a2724ebf792c2f1604417b745c94f Mon Sep 17 00:00:00 2001 From: Lukas Wallrich Date: Mon, 9 Nov 2026 17:47:29 +0000 Subject: [PATCH 4/6] Drop the full stop after a group author in citation buttons "Open Science Collaboration. (2015)" now gives the button "Open Science Collaboration (2015)". Co-Authored-By: Claude Opus 5.5 --- scripts/build_featured_data.py | 2 +- scripts/tests/test_build_featured_data.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/build_featured_data.py b/scripts/build_featured_data.py index 1c02acd8370..9242a7422c6 100644 --- a/scripts/build_featured_data.py +++ b/scripts/build_featured_data.py @@ -131,7 +131,7 @@ def make_short_ref(apa: str) -> str: m = re.match(r"^(.+?)\((\d{4})\)", apa) if not m: return apa[:60] - authors_part = m.group(1).strip().rstrip(",").strip() + authors_part = m.group(1).strip().rstrip(",.").strip() year = m.group(2) amp_count = authors_part.count("&") if amp_count == 0: diff --git a/scripts/tests/test_build_featured_data.py b/scripts/tests/test_build_featured_data.py index 5c912d9ba97..28bb789800a 100644 --- a/scripts/tests/test_build_featured_data.py +++ b/scripts/tests/test_build_featured_data.py @@ -46,6 +46,12 @@ def test_titles_keep_italics_and_small_caps_with_entities_decoded(self): for raw, clean in cases.items(): self.assertEqual(featured.clean_markup_text(raw), clean) + def test_group_author_short_ref_has_no_stray_full_stop(self): + self.assertEqual( + featured.make_short_ref("Open Science Collaboration. (2015). Estimating the reproducibility."), + "Open Science Collaboration (2015)", + ) + def test_apa_entities_are_decoded(self): self.assertEqual( featured.clean_apa_reference("Doe, A. (2024). Title. Theory & Psychology, 34(5), 1–2."), From 9274f92c495018c2591c468d10386e2111c787c9 Mon Sep 17 00:00:00 2001 From: Lukas Wallrich Date: Mon, 9 Nov 2026 17:55:25 +0000 Subject: [PATCH 5/6] Address review: safer markup, stricter description test, group author - build_featured_data.py keeps any angle bracket other than / encoded, and keeps the full stop in "et al.". - A description line is kept only if it has no "(year)." reference date, so unbulleted references with group or full-name authors stay references. - The Doc's cluster 8 entry for the 2015 Science paper now names Open Science Collaboration, as the cluster 1 entry does. - AGENTS.md names all three sheet tabs that --export-json rewrites. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 2 +- data/clusters_v4.json | 2 +- scripts/build_featured_data.py | 12 +++++++++--- scripts/parse_clusters_to_sheet.py | 8 ++++++-- scripts/tests/test_build_featured_data.py | 6 +++++- scripts/tests/test_parse_clusters.py | 11 ++++++++--- 6 files changed, 30 insertions(+), 11 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index b15466335d1..d4c4adf8a32 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,7 +26,7 @@ Regenerated on demand; the output is committed: | Glossary terms `content/glossary/{english,german,arabic,chinese,turkish}/*.md` | `content/glossary/_create_glossaries.py`; in CI only via `data-processing.yml` dispatch with `regenerate_glossary`, which opens a PR | Glossary Google Sheet | | `data/disciplines.json` | `scripts/parse_disciplines_to_json.py` (see `content/disciplines/README`) | Disciplines sheet | | `data/disciplines_citation.json` | `scripts/build_disciplines_citation.py` | Tenzing sheet | -| `data/clusters_v4.json` | `scripts/parse_clusters_to_sheet.py --json-only` (without it, the script also clears and rewrites the Publications sheet) | Clusters v4.1 Google Doc | +| `data/clusters_v4.json` | `scripts/parse_clusters_to_sheet.py --json-only` (without it, the script also clears and rewrites the Clusters, Sub-Clusters and Publications sheet tabs) | Clusters v4.1 Google Doc | | `content/clusters/cluster-N/index.md` | `scripts/generate_cluster_pages.py` | `data/clusters_v4.json` | | `content/about/steering-committee/index.md` (rewritten on re-run) | `scripts/generate_sc_profiles.py` | Steering committee sheets | diff --git a/data/clusters_v4.json b/data/clusters_v4.json index 5536f035e43..4a800bf315d 100644 --- a/data/clusters_v4.json +++ b/data/clusters_v4.json @@ -3219,7 +3219,7 @@ "publications": [ { "doi": "10.1126/science.aac4716", - "apa": "Anderson, J. E., Aarts, A. A., Anderson, C. J., Attridge, P. R., Attwood, A., Axt, J., Babel, M., Bahník, Š., Baranski, E., Barnett-Cowan, M., Bartmess, E., Beer, J., Bell, R., Bentley, H., Beyan, L., Binion, G., Borsboom, D., Bosch, A., Bosco, F. A., ... Zuni, K. (2015). Estimating the reproducibility of psychological science. Science, 349(6251). https://doi.org/10.1126/science.aac4716", + "apa": "Open Science Collaboration. (2015). Estimating the reproducibility of psychological science. Science, 349(6251). https://doi.org/10.1126/science.aac4716", "auto_ref": true }, { diff --git a/scripts/build_featured_data.py b/scripts/build_featured_data.py index 9242a7422c6..8058dbadce6 100644 --- a/scripts/build_featured_data.py +++ b/scripts/build_featured_data.py @@ -106,8 +106,9 @@ def clean_markup_text(text: str) -> str: Crossref metadata in the Publications sheet carries HTML entities ('&'), sometimes escaped twice ('<em>'), and the inline tags , and - . Entities are decoded, becomes , and whitespace is collapsed. - The templates render and and escape everything else. + . Entities are decoded, becomes , other angle brackets are + re-encoded and whitespace is collapsed. The templates render and + and escape everything else. """ for _ in range(2): decoded = html.unescape(text) @@ -115,6 +116,9 @@ def clean_markup_text(text: str) -> str: break text = decoded text = re.sub(r'<(/?)em>', r'<\1i>', text, flags=re.IGNORECASE) + # Any other angle bracket stays encoded, so only and can ever be markup. + text = text.replace('<', '<').replace('>', '>') + text = re.sub(r'<(/?(?:i|scp))>', r'<\1>', text, flags=re.IGNORECASE) return ' '.join(text.split()) @@ -131,7 +135,9 @@ def make_short_ref(apa: str) -> str: m = re.match(r"^(.+?)\((\d{4})\)", apa) if not m: return apa[:60] - authors_part = m.group(1).strip().rstrip(",.").strip() + authors_part = m.group(1).strip().rstrip(",").strip() + if not authors_part.endswith("et al."): + authors_part = authors_part.rstrip(".").strip() # group author: "Open Science Collaboration." year = m.group(2) amp_count = authors_part.count("&") if amp_count == 0: diff --git a/scripts/parse_clusters_to_sheet.py b/scripts/parse_clusters_to_sheet.py index 526571d9d72..f353f3b176f 100644 --- a/scripts/parse_clusters_to_sheet.py +++ b/scripts/parse_clusters_to_sheet.py @@ -237,17 +237,21 @@ def looks_like_citation(text): AUTHOR_START_RE = re.compile(r"^[^\W\d_][^,()]{0,60}, (?:[A-Z]\.|[A-Z][a-z]+(?: [A-Z]\.)+)") +REFERENCE_DATE_RE = re.compile(r'\((?:\d{4}[a-z]?(?:, [^)]*)?|n\.d\.)\)\.') + + def is_description_with_year(text): """True for prose that mentions a year, as opposed to a reference. - A reference starts with an author list ('Surname, X.') or carries a DOI or URL. + A reference starts with an author list ('Surname, X.'), has a date followed by a + full stop ('(2015).', 'Open Science Collaboration. (2015).'), or carries a DOI or URL. """ if not looks_like_citation(text): return False lower = text.lower() if 'doi.org/' in lower or 'http://' in lower or 'https://' in lower: return False - return not AUTHOR_START_RE.match(text) + return not (AUTHOR_START_RE.match(text) or REFERENCE_DATE_RE.search(text)) STOP_WORDS = frozenset( diff --git a/scripts/tests/test_build_featured_data.py b/scripts/tests/test_build_featured_data.py index 28bb789800a..1a695f91aea 100644 --- a/scripts/tests/test_build_featured_data.py +++ b/scripts/tests/test_build_featured_data.py @@ -38,7 +38,8 @@ def test_titles_keep_italics_and_small_caps_with_entities_decoded(self): "Celebrating 30 years of Feminism & Psychology", "Registered Reports at <em>AIMS Neuroscience</em> and beyond": "Registered Reports at AIMS Neuroscience and beyond", - "The earth is round (p\u2002<\u2002.05).": "The earth is round (p < .05).", + "The earth is round (p\u2002<\u2002.05).": "The earth is round (p < .05).", + "Title <img src=x onerror=alert(1)>": "Title <img src=x onerror=alert(1)>", "Promoting Research Integrity in Africa": "Promoting Research Integrity in Africa", "psychology departments in the\n UK\n and Ireland": "psychology departments in the UK and Ireland", @@ -52,6 +53,9 @@ def test_group_author_short_ref_has_no_stray_full_stop(self): "Open Science Collaboration (2015)", ) + def test_et_al_keeps_its_full_stop(self): + self.assertEqual(featured.make_short_ref("Doe et al. (2020). Title."), "Doe et al. (2020)") + def test_apa_entities_are_decoded(self): self.assertEqual( featured.clean_apa_reference("Doe, A. (2024). Title. Theory & Psychology, 34(5), 1–2."), diff --git a/scripts/tests/test_parse_clusters.py b/scripts/tests/test_parse_clusters.py index 7d2cff584c8..c9b4eb6fede 100644 --- a/scripts/tests/test_parse_clusters.py +++ b/scripts/tests/test_parse_clusters.py @@ -46,9 +46,14 @@ def test_description_citing_a_year_stays_the_description(self): def test_unbulleted_reference_under_a_heading_stays_a_reference(self): heading = "Standards" - lines = [heading, "Clarke, V. (2022). Navigating the messy swamp. Qualitative Psychology."] - [sub] = parse_subclusters_standard(lines, 0, len(lines), [heading], "Cluster") - self.assertEqual((sub.description, len(sub.raw_citations)), ("", 1)) + for reference in ( + "Clarke, V. (2022). Navigating the messy swamp. Qualitative Psychology.", + "Open Science Collaboration. (2015). Estimating the reproducibility. Science.", + "Jane Doe (2020, May). A talk. Conference.", + ): + lines = [heading, reference] + [sub] = parse_subclusters_standard(lines, 0, len(lines), [heading], "Cluster") + self.assertEqual((sub.description, len(sub.raw_citations)), ("", 1), reference) def test_comment_marker_before_indent_is_a_continuation(self): heading = "Questionable measurement practices (QMPs), validity & reliability issues." From dbec563cbd34e625a3fdcbc9a36bf9de25450ef3 Mon Sep 17 00:00:00 2001 From: Lukas Wallrich Date: Mon, 9 Nov 2026 18:00:38 +0000 Subject: [PATCH 6/6] Recommend --json-only in the clusters data error and --help Co-Authored-By: Claude Opus 5.5 --- layouts/partials/clusters/all_clusters.html | 2 +- scripts/parse_clusters_to_sheet.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/layouts/partials/clusters/all_clusters.html b/layouts/partials/clusters/all_clusters.html index 8605f3941d8..d725d2d7e7c 100644 --- a/layouts/partials/clusters/all_clusters.html +++ b/layouts/partials/clusters/all_clusters.html @@ -2,7 +2,7 @@ {{ $data := hugo.Data.clusters_v4 }} {{ if not $data }}
- Data Error: clusters_v4.json data not found. Run python3 scripts/parse_clusters_to_sheet.py --export-json. + Data Error: clusters_v4.json data not found. Run python3 scripts/parse_clusters_to_sheet.py --json-only.
{{ return }} {{ end }} diff --git a/scripts/parse_clusters_to_sheet.py b/scripts/parse_clusters_to_sheet.py index f353f3b176f..00e27aa8ed8 100644 --- a/scripts/parse_clusters_to_sheet.py +++ b/scripts/parse_clusters_to_sheet.py @@ -1086,7 +1086,8 @@ def main(): parser.add_argument('--cache-file', default=DEFAULT_CACHE, help='DOI cache file path') parser.add_argument('--export-json', action='store_true', - help='Export clusters data as JSON for Hugo (data/clusters_v4.json)') + help='Export clusters data as JSON for Hugo (data/clusters_v4.json) and still write ' + 'the sheet; use --json-only to export without touching the sheet') parser.add_argument('--json-only', action='store_true', help='Only export JSON (skip sheet writing)') args = parser.parse_args()