scientific-writer 2.2.1__py3-none-any.whl → 2.2.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of scientific-writer might be problematic. Click here for more details.

Files changed (311) hide show
  1. scientific_writer/.claude/WRITER.md +748 -0
  2. scientific_writer/.claude/settings.local.json +30 -0
  3. scientific_writer/.claude/skills/citation-management/SKILL.md +1046 -0
  4. scientific_writer/.claude/skills/citation-management/assets/bibtex_template.bib +264 -0
  5. scientific_writer/.claude/skills/citation-management/assets/citation_checklist.md +386 -0
  6. scientific_writer/.claude/skills/citation-management/references/bibtex_formatting.md +908 -0
  7. scientific_writer/.claude/skills/citation-management/references/citation_validation.md +794 -0
  8. scientific_writer/.claude/skills/citation-management/references/google_scholar_search.md +725 -0
  9. scientific_writer/.claude/skills/citation-management/references/metadata_extraction.md +870 -0
  10. scientific_writer/.claude/skills/citation-management/references/pubmed_search.md +839 -0
  11. scientific_writer/.claude/skills/citation-management/scripts/doi_to_bibtex.py +204 -0
  12. scientific_writer/.claude/skills/citation-management/scripts/extract_metadata.py +569 -0
  13. scientific_writer/.claude/skills/citation-management/scripts/format_bibtex.py +349 -0
  14. scientific_writer/.claude/skills/citation-management/scripts/search_google_scholar.py +282 -0
  15. scientific_writer/.claude/skills/citation-management/scripts/search_pubmed.py +398 -0
  16. scientific_writer/.claude/skills/citation-management/scripts/validate_citations.py +497 -0
  17. scientific_writer/.claude/skills/clinical-reports/IMPLEMENTATION_SUMMARY.md +641 -0
  18. scientific_writer/.claude/skills/clinical-reports/README.md +236 -0
  19. scientific_writer/.claude/skills/clinical-reports/SKILL.md +1088 -0
  20. scientific_writer/.claude/skills/clinical-reports/assets/case_report_template.md +352 -0
  21. scientific_writer/.claude/skills/clinical-reports/assets/clinical_trial_csr_template.md +353 -0
  22. scientific_writer/.claude/skills/clinical-reports/assets/clinical_trial_sae_template.md +359 -0
  23. scientific_writer/.claude/skills/clinical-reports/assets/consult_note_template.md +305 -0
  24. scientific_writer/.claude/skills/clinical-reports/assets/discharge_summary_template.md +453 -0
  25. scientific_writer/.claude/skills/clinical-reports/assets/hipaa_compliance_checklist.md +395 -0
  26. scientific_writer/.claude/skills/clinical-reports/assets/history_physical_template.md +305 -0
  27. scientific_writer/.claude/skills/clinical-reports/assets/lab_report_template.md +309 -0
  28. scientific_writer/.claude/skills/clinical-reports/assets/pathology_report_template.md +249 -0
  29. scientific_writer/.claude/skills/clinical-reports/assets/quality_checklist.md +338 -0
  30. scientific_writer/.claude/skills/clinical-reports/assets/radiology_report_template.md +318 -0
  31. scientific_writer/.claude/skills/clinical-reports/assets/soap_note_template.md +253 -0
  32. scientific_writer/.claude/skills/clinical-reports/references/case_report_guidelines.md +570 -0
  33. scientific_writer/.claude/skills/clinical-reports/references/clinical_trial_reporting.md +693 -0
  34. scientific_writer/.claude/skills/clinical-reports/references/data_presentation.md +530 -0
  35. scientific_writer/.claude/skills/clinical-reports/references/diagnostic_reports_standards.md +629 -0
  36. scientific_writer/.claude/skills/clinical-reports/references/medical_terminology.md +588 -0
  37. scientific_writer/.claude/skills/clinical-reports/references/patient_documentation.md +744 -0
  38. scientific_writer/.claude/skills/clinical-reports/references/peer_review_standards.md +585 -0
  39. scientific_writer/.claude/skills/clinical-reports/references/regulatory_compliance.md +577 -0
  40. scientific_writer/.claude/skills/clinical-reports/scripts/check_deidentification.py +346 -0
  41. scientific_writer/.claude/skills/clinical-reports/scripts/compliance_checker.py +78 -0
  42. scientific_writer/.claude/skills/clinical-reports/scripts/extract_clinical_data.py +102 -0
  43. scientific_writer/.claude/skills/clinical-reports/scripts/format_adverse_events.py +103 -0
  44. scientific_writer/.claude/skills/clinical-reports/scripts/generate_report_template.py +163 -0
  45. scientific_writer/.claude/skills/clinical-reports/scripts/terminology_validator.py +133 -0
  46. scientific_writer/.claude/skills/clinical-reports/scripts/validate_case_report.py +334 -0
  47. scientific_writer/.claude/skills/clinical-reports/scripts/validate_trial_report.py +89 -0
  48. scientific_writer/.claude/skills/document-skills/docx/LICENSE.txt +30 -0
  49. scientific_writer/.claude/skills/document-skills/docx/SKILL.md +197 -0
  50. scientific_writer/.claude/skills/document-skills/docx/docx-js.md +350 -0
  51. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  52. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  53. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  54. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  55. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  56. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  57. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  58. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  59. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  60. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  61. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  62. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  63. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  64. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  65. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  66. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  67. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  68. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  69. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  70. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  71. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  72. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  73. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  74. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  75. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  76. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  77. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  78. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  79. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  80. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  81. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  82. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  83. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  84. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  85. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  86. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  87. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  88. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  89. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  90. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/pack.py +159 -0
  91. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/unpack.py +29 -0
  92. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validate.py +69 -0
  93. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  94. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/base.py +951 -0
  95. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/docx.py +274 -0
  96. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  97. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  98. scientific_writer/.claude/skills/document-skills/docx/ooxml.md +610 -0
  99. scientific_writer/.claude/skills/document-skills/docx/scripts/__init__.py +1 -0
  100. scientific_writer/.claude/skills/document-skills/docx/scripts/document.py +1276 -0
  101. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/comments.xml +3 -0
  102. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsExtended.xml +3 -0
  103. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  104. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsIds.xml +3 -0
  105. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/people.xml +3 -0
  106. scientific_writer/.claude/skills/document-skills/docx/scripts/utilities.py +374 -0
  107. scientific_writer/.claude/skills/document-skills/pdf/LICENSE.txt +30 -0
  108. scientific_writer/.claude/skills/document-skills/pdf/SKILL.md +294 -0
  109. scientific_writer/.claude/skills/document-skills/pdf/forms.md +205 -0
  110. scientific_writer/.claude/skills/document-skills/pdf/reference.md +612 -0
  111. scientific_writer/.claude/skills/document-skills/pdf/scripts/check_bounding_boxes.py +70 -0
  112. scientific_writer/.claude/skills/document-skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  113. scientific_writer/.claude/skills/document-skills/pdf/scripts/check_fillable_fields.py +12 -0
  114. scientific_writer/.claude/skills/document-skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  115. scientific_writer/.claude/skills/document-skills/pdf/scripts/create_validation_image.py +41 -0
  116. scientific_writer/.claude/skills/document-skills/pdf/scripts/extract_form_field_info.py +152 -0
  117. scientific_writer/.claude/skills/document-skills/pdf/scripts/fill_fillable_fields.py +114 -0
  118. scientific_writer/.claude/skills/document-skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  119. scientific_writer/.claude/skills/document-skills/pptx/LICENSE.txt +30 -0
  120. scientific_writer/.claude/skills/document-skills/pptx/SKILL.md +484 -0
  121. scientific_writer/.claude/skills/document-skills/pptx/html2pptx.md +625 -0
  122. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  123. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  124. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  125. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  126. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  127. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  128. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  129. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  130. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  131. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  132. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  133. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  134. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  135. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  136. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  137. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  138. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  139. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  140. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  141. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  142. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  143. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  144. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  145. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  146. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  147. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  148. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  149. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  150. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  151. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  152. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  153. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  154. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  155. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  156. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  157. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  158. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  159. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  160. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  161. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/pack.py +159 -0
  162. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/unpack.py +29 -0
  163. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validate.py +69 -0
  164. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  165. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/base.py +951 -0
  166. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  167. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  168. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  169. scientific_writer/.claude/skills/document-skills/pptx/ooxml.md +427 -0
  170. scientific_writer/.claude/skills/document-skills/pptx/scripts/html2pptx.js +979 -0
  171. scientific_writer/.claude/skills/document-skills/pptx/scripts/inventory.py +1020 -0
  172. scientific_writer/.claude/skills/document-skills/pptx/scripts/rearrange.py +231 -0
  173. scientific_writer/.claude/skills/document-skills/pptx/scripts/replace.py +385 -0
  174. scientific_writer/.claude/skills/document-skills/pptx/scripts/thumbnail.py +450 -0
  175. scientific_writer/.claude/skills/document-skills/xlsx/LICENSE.txt +30 -0
  176. scientific_writer/.claude/skills/document-skills/xlsx/SKILL.md +289 -0
  177. scientific_writer/.claude/skills/document-skills/xlsx/recalc.py +178 -0
  178. scientific_writer/.claude/skills/hypothesis-generation/SKILL.md +155 -0
  179. scientific_writer/.claude/skills/hypothesis-generation/assets/hypothesis_output_template.md +302 -0
  180. scientific_writer/.claude/skills/hypothesis-generation/references/experimental_design_patterns.md +327 -0
  181. scientific_writer/.claude/skills/hypothesis-generation/references/hypothesis_quality_criteria.md +196 -0
  182. scientific_writer/.claude/skills/hypothesis-generation/references/literature_search_strategies.md +505 -0
  183. scientific_writer/.claude/skills/latex-posters/README.md +417 -0
  184. scientific_writer/.claude/skills/latex-posters/SKILL.md +919 -0
  185. scientific_writer/.claude/skills/latex-posters/assets/baposter_template.tex +257 -0
  186. scientific_writer/.claude/skills/latex-posters/assets/beamerposter_template.tex +244 -0
  187. scientific_writer/.claude/skills/latex-posters/assets/poster_quality_checklist.md +358 -0
  188. scientific_writer/.claude/skills/latex-posters/assets/tikzposter_template.tex +251 -0
  189. scientific_writer/.claude/skills/latex-posters/references/latex_poster_packages.md +745 -0
  190. scientific_writer/.claude/skills/latex-posters/references/poster_content_guide.md +748 -0
  191. scientific_writer/.claude/skills/latex-posters/references/poster_design_principles.md +806 -0
  192. scientific_writer/.claude/skills/latex-posters/references/poster_layout_design.md +900 -0
  193. scientific_writer/.claude/skills/latex-posters/scripts/review_poster.sh +214 -0
  194. scientific_writer/.claude/skills/literature-review/SKILL.md +546 -0
  195. scientific_writer/.claude/skills/literature-review/assets/review_template.md +412 -0
  196. scientific_writer/.claude/skills/literature-review/references/citation_styles.md +166 -0
  197. scientific_writer/.claude/skills/literature-review/references/database_strategies.md +381 -0
  198. scientific_writer/.claude/skills/literature-review/scripts/generate_pdf.py +176 -0
  199. scientific_writer/.claude/skills/literature-review/scripts/search_databases.py +303 -0
  200. scientific_writer/.claude/skills/literature-review/scripts/verify_citations.py +222 -0
  201. scientific_writer/.claude/skills/markitdown/INSTALLATION_GUIDE.md +318 -0
  202. scientific_writer/.claude/skills/markitdown/LICENSE.txt +22 -0
  203. scientific_writer/.claude/skills/markitdown/OPENROUTER_INTEGRATION.md +359 -0
  204. scientific_writer/.claude/skills/markitdown/QUICK_REFERENCE.md +309 -0
  205. scientific_writer/.claude/skills/markitdown/README.md +184 -0
  206. scientific_writer/.claude/skills/markitdown/SKILL.md +450 -0
  207. scientific_writer/.claude/skills/markitdown/SKILL_SUMMARY.md +307 -0
  208. scientific_writer/.claude/skills/markitdown/assets/example_usage.md +463 -0
  209. scientific_writer/.claude/skills/markitdown/references/api_reference.md +399 -0
  210. scientific_writer/.claude/skills/markitdown/references/file_formats.md +542 -0
  211. scientific_writer/.claude/skills/markitdown/scripts/batch_convert.py +228 -0
  212. scientific_writer/.claude/skills/markitdown/scripts/convert_literature.py +283 -0
  213. scientific_writer/.claude/skills/markitdown/scripts/convert_with_ai.py +243 -0
  214. scientific_writer/.claude/skills/paper-2-web/SKILL.md +455 -0
  215. scientific_writer/.claude/skills/paper-2-web/references/installation.md +141 -0
  216. scientific_writer/.claude/skills/paper-2-web/references/paper2poster.md +346 -0
  217. scientific_writer/.claude/skills/paper-2-web/references/paper2video.md +305 -0
  218. scientific_writer/.claude/skills/paper-2-web/references/paper2web.md +187 -0
  219. scientific_writer/.claude/skills/paper-2-web/references/usage_examples.md +436 -0
  220. scientific_writer/.claude/skills/peer-review/SKILL.md +375 -0
  221. scientific_writer/.claude/skills/peer-review/references/common_issues.md +552 -0
  222. scientific_writer/.claude/skills/peer-review/references/reporting_standards.md +290 -0
  223. scientific_writer/.claude/skills/research-grants/README.md +285 -0
  224. scientific_writer/.claude/skills/research-grants/SKILL.md +896 -0
  225. scientific_writer/.claude/skills/research-grants/assets/budget_justification_template.md +453 -0
  226. scientific_writer/.claude/skills/research-grants/assets/nih_specific_aims_template.md +166 -0
  227. scientific_writer/.claude/skills/research-grants/assets/nsf_project_summary_template.md +92 -0
  228. scientific_writer/.claude/skills/research-grants/references/broader_impacts.md +392 -0
  229. scientific_writer/.claude/skills/research-grants/references/darpa_guidelines.md +636 -0
  230. scientific_writer/.claude/skills/research-grants/references/doe_guidelines.md +586 -0
  231. scientific_writer/.claude/skills/research-grants/references/nih_guidelines.md +851 -0
  232. scientific_writer/.claude/skills/research-grants/references/nsf_guidelines.md +570 -0
  233. scientific_writer/.claude/skills/research-grants/references/specific_aims_guide.md +458 -0
  234. scientific_writer/.claude/skills/research-lookup/README.md +116 -0
  235. scientific_writer/.claude/skills/research-lookup/SKILL.md +443 -0
  236. scientific_writer/.claude/skills/research-lookup/examples.py +174 -0
  237. scientific_writer/.claude/skills/research-lookup/lookup.py +93 -0
  238. scientific_writer/.claude/skills/research-lookup/research_lookup.py +335 -0
  239. scientific_writer/.claude/skills/research-lookup/scripts/research_lookup.py +261 -0
  240. scientific_writer/.claude/skills/scholar-evaluation/SKILL.md +254 -0
  241. scientific_writer/.claude/skills/scholar-evaluation/references/evaluation_framework.md +663 -0
  242. scientific_writer/.claude/skills/scholar-evaluation/scripts/calculate_scores.py +378 -0
  243. scientific_writer/.claude/skills/scientific-critical-thinking/SKILL.md +530 -0
  244. scientific_writer/.claude/skills/scientific-critical-thinking/references/common_biases.md +364 -0
  245. scientific_writer/.claude/skills/scientific-critical-thinking/references/evidence_hierarchy.md +484 -0
  246. scientific_writer/.claude/skills/scientific-critical-thinking/references/experimental_design.md +496 -0
  247. scientific_writer/.claude/skills/scientific-critical-thinking/references/logical_fallacies.md +478 -0
  248. scientific_writer/.claude/skills/scientific-critical-thinking/references/scientific_method.md +169 -0
  249. scientific_writer/.claude/skills/scientific-critical-thinking/references/statistical_pitfalls.md +506 -0
  250. scientific_writer/.claude/skills/scientific-schematics/SKILL.md +2035 -0
  251. scientific_writer/.claude/skills/scientific-schematics/assets/block_diagram_template.tex +199 -0
  252. scientific_writer/.claude/skills/scientific-schematics/assets/circuit_template.tex +159 -0
  253. scientific_writer/.claude/skills/scientific-schematics/assets/flowchart_template.tex +161 -0
  254. scientific_writer/.claude/skills/scientific-schematics/assets/pathway_template.tex +162 -0
  255. scientific_writer/.claude/skills/scientific-schematics/assets/tikz_styles.tex +422 -0
  256. scientific_writer/.claude/skills/scientific-schematics/references/best_practices.md +562 -0
  257. scientific_writer/.claude/skills/scientific-schematics/references/diagram_types.md +637 -0
  258. scientific_writer/.claude/skills/scientific-schematics/references/python_libraries.md +791 -0
  259. scientific_writer/.claude/skills/scientific-schematics/references/tikz_guide.md +734 -0
  260. scientific_writer/.claude/skills/scientific-schematics/scripts/circuit_generator.py +307 -0
  261. scientific_writer/.claude/skills/scientific-schematics/scripts/compile_tikz.py +292 -0
  262. scientific_writer/.claude/skills/scientific-schematics/scripts/generate_flowchart.py +281 -0
  263. scientific_writer/.claude/skills/scientific-schematics/scripts/pathway_diagram.py +406 -0
  264. scientific_writer/.claude/skills/scientific-writing/SKILL.md +443 -0
  265. scientific_writer/.claude/skills/scientific-writing/references/citation_styles.md +720 -0
  266. scientific_writer/.claude/skills/scientific-writing/references/figures_tables.md +806 -0
  267. scientific_writer/.claude/skills/scientific-writing/references/imrad_structure.md +658 -0
  268. scientific_writer/.claude/skills/scientific-writing/references/reporting_guidelines.md +748 -0
  269. scientific_writer/.claude/skills/scientific-writing/references/writing_principles.md +824 -0
  270. scientific_writer/.claude/skills/treatment-plans/README.md +483 -0
  271. scientific_writer/.claude/skills/treatment-plans/SKILL.md +817 -0
  272. scientific_writer/.claude/skills/treatment-plans/assets/chronic_disease_management_plan.tex +636 -0
  273. scientific_writer/.claude/skills/treatment-plans/assets/general_medical_treatment_plan.tex +616 -0
  274. scientific_writer/.claude/skills/treatment-plans/assets/mental_health_treatment_plan.tex +745 -0
  275. scientific_writer/.claude/skills/treatment-plans/assets/pain_management_plan.tex +770 -0
  276. scientific_writer/.claude/skills/treatment-plans/assets/perioperative_care_plan.tex +724 -0
  277. scientific_writer/.claude/skills/treatment-plans/assets/quality_checklist.md +471 -0
  278. scientific_writer/.claude/skills/treatment-plans/assets/rehabilitation_treatment_plan.tex +727 -0
  279. scientific_writer/.claude/skills/treatment-plans/references/goal_setting_frameworks.md +411 -0
  280. scientific_writer/.claude/skills/treatment-plans/references/intervention_guidelines.md +507 -0
  281. scientific_writer/.claude/skills/treatment-plans/references/regulatory_compliance.md +476 -0
  282. scientific_writer/.claude/skills/treatment-plans/references/specialty_specific_guidelines.md +607 -0
  283. scientific_writer/.claude/skills/treatment-plans/references/treatment_plan_standards.md +456 -0
  284. scientific_writer/.claude/skills/treatment-plans/scripts/check_completeness.py +318 -0
  285. scientific_writer/.claude/skills/treatment-plans/scripts/generate_template.py +244 -0
  286. scientific_writer/.claude/skills/treatment-plans/scripts/timeline_generator.py +369 -0
  287. scientific_writer/.claude/skills/treatment-plans/scripts/validate_treatment_plan.py +367 -0
  288. scientific_writer/.claude/skills/venue-templates/SKILL.md +590 -0
  289. scientific_writer/.claude/skills/venue-templates/assets/grants/nih_specific_aims.tex +235 -0
  290. scientific_writer/.claude/skills/venue-templates/assets/grants/nsf_proposal_template.tex +375 -0
  291. scientific_writer/.claude/skills/venue-templates/assets/journals/nature_article.tex +171 -0
  292. scientific_writer/.claude/skills/venue-templates/assets/journals/neurips_article.tex +283 -0
  293. scientific_writer/.claude/skills/venue-templates/assets/journals/plos_one.tex +317 -0
  294. scientific_writer/.claude/skills/venue-templates/assets/posters/beamerposter_academic.tex +311 -0
  295. scientific_writer/.claude/skills/venue-templates/references/conferences_formatting.md +564 -0
  296. scientific_writer/.claude/skills/venue-templates/references/grants_requirements.md +787 -0
  297. scientific_writer/.claude/skills/venue-templates/references/journals_formatting.md +486 -0
  298. scientific_writer/.claude/skills/venue-templates/references/posters_guidelines.md +628 -0
  299. scientific_writer/.claude/skills/venue-templates/scripts/customize_template.py +206 -0
  300. scientific_writer/.claude/skills/venue-templates/scripts/query_template.py +260 -0
  301. scientific_writer/.claude/skills/venue-templates/scripts/validate_format.py +255 -0
  302. scientific_writer/__init__.py +1 -1
  303. scientific_writer/api.py +9 -5
  304. scientific_writer/cli.py +9 -5
  305. scientific_writer/core.py +28 -5
  306. {scientific_writer-2.2.1.dist-info → scientific_writer-2.2.3.dist-info}/METADATA +1 -1
  307. scientific_writer-2.2.3.dist-info/RECORD +312 -0
  308. scientific_writer-2.2.1.dist-info/RECORD +0 -11
  309. {scientific_writer-2.2.1.dist-info → scientific_writer-2.2.3.dist-info}/WHEEL +0 -0
  310. {scientific_writer-2.2.1.dist-info → scientific_writer-2.2.3.dist-info}/entry_points.txt +0 -0
  311. {scientific_writer-2.2.1.dist-info → scientific_writer-2.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,303 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Literature Database Search Script
4
+ Searches multiple literature databases and aggregates results.
5
+ """
6
+
7
+ import json
8
+ import sys
9
+ from typing import Dict, List
10
+ from datetime import datetime
11
+
12
+ def format_search_results(results: List[Dict], output_format: str = 'json') -> str:
13
+ """
14
+ Format search results for output.
15
+
16
+ Args:
17
+ results: List of search results
18
+ output_format: Format (json, markdown, or bibtex)
19
+
20
+ Returns:
21
+ Formatted string
22
+ """
23
+ if output_format == 'json':
24
+ return json.dumps(results, indent=2)
25
+
26
+ elif output_format == 'markdown':
27
+ md = f"# Literature Search Results\n\n"
28
+ md += f"**Search Date**: {datetime.now().strftime('%Y-%m-%d %H:%M')}\n"
29
+ md += f"**Total Results**: {len(results)}\n\n"
30
+
31
+ for i, result in enumerate(results, 1):
32
+ md += f"## {i}. {result.get('title', 'Untitled')}\n\n"
33
+ md += f"**Authors**: {result.get('authors', 'Unknown')}\n\n"
34
+ md += f"**Year**: {result.get('year', 'N/A')}\n\n"
35
+ md += f"**Source**: {result.get('source', 'Unknown')}\n\n"
36
+
37
+ if result.get('abstract'):
38
+ md += f"**Abstract**: {result['abstract']}\n\n"
39
+
40
+ if result.get('doi'):
41
+ md += f"**DOI**: [{result['doi']}](https://doi.org/{result['doi']})\n\n"
42
+
43
+ if result.get('url'):
44
+ md += f"**URL**: {result['url']}\n\n"
45
+
46
+ if result.get('citations'):
47
+ md += f"**Citations**: {result['citations']}\n\n"
48
+
49
+ md += "---\n\n"
50
+
51
+ return md
52
+
53
+ elif output_format == 'bibtex':
54
+ bibtex = ""
55
+ for i, result in enumerate(results, 1):
56
+ entry_type = result.get('type', 'article')
57
+ cite_key = f"{result.get('first_author', 'unknown')}{result.get('year', '0000')}"
58
+
59
+ bibtex += f"@{entry_type}{{{cite_key},\n"
60
+ bibtex += f" title = {{{result.get('title', '')}}},\n"
61
+ bibtex += f" author = {{{result.get('authors', '')}}},\n"
62
+ bibtex += f" year = {{{result.get('year', '')}}},\n"
63
+
64
+ if result.get('journal'):
65
+ bibtex += f" journal = {{{result['journal']}}},\n"
66
+
67
+ if result.get('volume'):
68
+ bibtex += f" volume = {{{result['volume']}}},\n"
69
+
70
+ if result.get('pages'):
71
+ bibtex += f" pages = {{{result['pages']}}},\n"
72
+
73
+ if result.get('doi'):
74
+ bibtex += f" doi = {{{result['doi']}}},\n"
75
+
76
+ bibtex += "}\n\n"
77
+
78
+ return bibtex
79
+
80
+ else:
81
+ raise ValueError(f"Unknown format: {output_format}")
82
+
83
+ def deduplicate_results(results: List[Dict]) -> List[Dict]:
84
+ """
85
+ Remove duplicate results based on DOI or title.
86
+
87
+ Args:
88
+ results: List of search results
89
+
90
+ Returns:
91
+ Deduplicated list
92
+ """
93
+ seen_dois = set()
94
+ seen_titles = set()
95
+ unique_results = []
96
+
97
+ for result in results:
98
+ doi = result.get('doi', '').lower().strip()
99
+ title = result.get('title', '').lower().strip()
100
+
101
+ # Check DOI first (more reliable)
102
+ if doi and doi in seen_dois:
103
+ continue
104
+
105
+ # Check title as fallback
106
+ if not doi and title in seen_titles:
107
+ continue
108
+
109
+ # Add to results
110
+ if doi:
111
+ seen_dois.add(doi)
112
+ if title:
113
+ seen_titles.add(title)
114
+
115
+ unique_results.append(result)
116
+
117
+ return unique_results
118
+
119
+ def rank_results(results: List[Dict], criteria: str = 'citations') -> List[Dict]:
120
+ """
121
+ Rank results by specified criteria.
122
+
123
+ Args:
124
+ results: List of search results
125
+ criteria: Ranking criteria (citations, year, relevance)
126
+
127
+ Returns:
128
+ Ranked list
129
+ """
130
+ if criteria == 'citations':
131
+ return sorted(results, key=lambda x: x.get('citations', 0), reverse=True)
132
+ elif criteria == 'year':
133
+ return sorted(results, key=lambda x: x.get('year', '0'), reverse=True)
134
+ elif criteria == 'relevance':
135
+ return sorted(results, key=lambda x: x.get('relevance_score', 0), reverse=True)
136
+ else:
137
+ return results
138
+
139
+ def filter_by_year(results: List[Dict], start_year: int = None, end_year: int = None) -> List[Dict]:
140
+ """
141
+ Filter results by publication year range.
142
+
143
+ Args:
144
+ results: List of search results
145
+ start_year: Minimum year (inclusive)
146
+ end_year: Maximum year (inclusive)
147
+
148
+ Returns:
149
+ Filtered list
150
+ """
151
+ filtered = []
152
+
153
+ for result in results:
154
+ try:
155
+ year = int(result.get('year', 0))
156
+ if start_year and year < start_year:
157
+ continue
158
+ if end_year and year > end_year:
159
+ continue
160
+ filtered.append(result)
161
+ except (ValueError, TypeError):
162
+ # Include if year parsing fails
163
+ filtered.append(result)
164
+
165
+ return filtered
166
+
167
+ def generate_search_summary(results: List[Dict]) -> Dict:
168
+ """
169
+ Generate summary statistics for search results.
170
+
171
+ Args:
172
+ results: List of search results
173
+
174
+ Returns:
175
+ Summary dictionary
176
+ """
177
+ summary = {
178
+ 'total_results': len(results),
179
+ 'sources': {},
180
+ 'year_distribution': {},
181
+ 'avg_citations': 0,
182
+ 'total_citations': 0
183
+ }
184
+
185
+ citations = []
186
+
187
+ for result in results:
188
+ # Count by source
189
+ source = result.get('source', 'Unknown')
190
+ summary['sources'][source] = summary['sources'].get(source, 0) + 1
191
+
192
+ # Count by year
193
+ year = result.get('year', 'Unknown')
194
+ summary['year_distribution'][year] = summary['year_distribution'].get(year, 0) + 1
195
+
196
+ # Collect citations
197
+ if result.get('citations'):
198
+ try:
199
+ citations.append(int(result['citations']))
200
+ except (ValueError, TypeError):
201
+ pass
202
+
203
+ if citations:
204
+ summary['avg_citations'] = sum(citations) / len(citations)
205
+ summary['total_citations'] = sum(citations)
206
+
207
+ return summary
208
+
209
+ def main():
210
+ """Command-line interface for search result processing."""
211
+ if len(sys.argv) < 2:
212
+ print("Usage: python search_databases.py <results.json> [options]")
213
+ print("\nOptions:")
214
+ print(" --format FORMAT Output format (json, markdown, bibtex)")
215
+ print(" --output FILE Output file (default: stdout)")
216
+ print(" --rank CRITERIA Rank by (citations, year, relevance)")
217
+ print(" --year-start YEAR Filter by start year")
218
+ print(" --year-end YEAR Filter by end year")
219
+ print(" --deduplicate Remove duplicates")
220
+ print(" --summary Show summary statistics")
221
+ sys.exit(1)
222
+
223
+ # Load results
224
+ results_file = sys.argv[1]
225
+ try:
226
+ with open(results_file, 'r', encoding='utf-8') as f:
227
+ results = json.load(f)
228
+ except Exception as e:
229
+ print(f"Error loading results: {e}")
230
+ sys.exit(1)
231
+
232
+ # Parse options
233
+ output_format = 'markdown'
234
+ output_file = None
235
+ rank_criteria = None
236
+ year_start = None
237
+ year_end = None
238
+ do_dedup = False
239
+ show_summary = False
240
+
241
+ i = 2
242
+ while i < len(sys.argv):
243
+ arg = sys.argv[i]
244
+
245
+ if arg == '--format' and i + 1 < len(sys.argv):
246
+ output_format = sys.argv[i + 1]
247
+ i += 2
248
+ elif arg == '--output' and i + 1 < len(sys.argv):
249
+ output_file = sys.argv[i + 1]
250
+ i += 2
251
+ elif arg == '--rank' and i + 1 < len(sys.argv):
252
+ rank_criteria = sys.argv[i + 1]
253
+ i += 2
254
+ elif arg == '--year-start' and i + 1 < len(sys.argv):
255
+ year_start = int(sys.argv[i + 1])
256
+ i += 2
257
+ elif arg == '--year-end' and i + 1 < len(sys.argv):
258
+ year_end = int(sys.argv[i + 1])
259
+ i += 2
260
+ elif arg == '--deduplicate':
261
+ do_dedup = True
262
+ i += 1
263
+ elif arg == '--summary':
264
+ show_summary = True
265
+ i += 1
266
+ else:
267
+ i += 1
268
+
269
+ # Process results
270
+ if do_dedup:
271
+ results = deduplicate_results(results)
272
+ print(f"After deduplication: {len(results)} results")
273
+
274
+ if year_start or year_end:
275
+ results = filter_by_year(results, year_start, year_end)
276
+ print(f"After year filter: {len(results)} results")
277
+
278
+ if rank_criteria:
279
+ results = rank_results(results, rank_criteria)
280
+ print(f"Ranked by: {rank_criteria}")
281
+
282
+ # Show summary
283
+ if show_summary:
284
+ summary = generate_search_summary(results)
285
+ print("\n" + "="*60)
286
+ print("SEARCH SUMMARY")
287
+ print("="*60)
288
+ print(json.dumps(summary, indent=2))
289
+ print()
290
+
291
+ # Format output
292
+ output = format_search_results(results, output_format)
293
+
294
+ # Write output
295
+ if output_file:
296
+ with open(output_file, 'w', encoding='utf-8') as f:
297
+ f.write(output)
298
+ print(f"✓ Results saved to: {output_file}")
299
+ else:
300
+ print(output)
301
+
302
+ if __name__ == "__main__":
303
+ main()
@@ -0,0 +1,222 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Citation Verification Script
4
+ Verifies DOIs, URLs, and citation metadata for accuracy.
5
+ """
6
+
7
+ import re
8
+ import requests
9
+ import json
10
+ from typing import Dict, List, Tuple
11
+ from urllib.parse import urlparse
12
+ import time
13
+
14
+ class CitationVerifier:
15
+ def __init__(self):
16
+ self.session = requests.Session()
17
+ self.session.headers.update({
18
+ 'User-Agent': 'CitationVerifier/1.0 (Literature Review Tool)'
19
+ })
20
+
21
+ def extract_dois(self, text: str) -> List[str]:
22
+ """Extract all DOIs from text."""
23
+ doi_pattern = r'10\.\d{4,}/[^\s\]\)"]+'
24
+ return re.findall(doi_pattern, text)
25
+
26
+ def verify_doi(self, doi: str) -> Tuple[bool, Dict]:
27
+ """
28
+ Verify a DOI and retrieve metadata.
29
+ Returns (is_valid, metadata)
30
+ """
31
+ try:
32
+ url = f"https://doi.org/api/handles/{doi}"
33
+ response = self.session.get(url, timeout=10)
34
+
35
+ if response.status_code == 200:
36
+ # DOI exists, now get metadata from CrossRef
37
+ metadata = self._get_crossref_metadata(doi)
38
+ return True, metadata
39
+ else:
40
+ return False, {}
41
+ except Exception as e:
42
+ return False, {"error": str(e)}
43
+
44
+ def _get_crossref_metadata(self, doi: str) -> Dict:
45
+ """Get metadata from CrossRef API."""
46
+ try:
47
+ url = f"https://api.crossref.org/works/{doi}"
48
+ response = self.session.get(url, timeout=10)
49
+
50
+ if response.status_code == 200:
51
+ data = response.json()
52
+ message = data.get('message', {})
53
+
54
+ # Extract key metadata
55
+ metadata = {
56
+ 'title': message.get('title', [''])[0],
57
+ 'authors': self._format_authors(message.get('author', [])),
58
+ 'year': self._extract_year(message),
59
+ 'journal': message.get('container-title', [''])[0],
60
+ 'volume': message.get('volume', ''),
61
+ 'pages': message.get('page', ''),
62
+ 'doi': doi
63
+ }
64
+ return metadata
65
+ return {}
66
+ except Exception as e:
67
+ return {"error": str(e)}
68
+
69
+ def _format_authors(self, authors: List[Dict]) -> str:
70
+ """Format author list."""
71
+ if not authors:
72
+ return ""
73
+
74
+ formatted = []
75
+ for author in authors[:3]: # First 3 authors
76
+ given = author.get('given', '')
77
+ family = author.get('family', '')
78
+ if family:
79
+ formatted.append(f"{family}, {given[0]}." if given else family)
80
+
81
+ if len(authors) > 3:
82
+ formatted.append("et al.")
83
+
84
+ return ", ".join(formatted)
85
+
86
+ def _extract_year(self, message: Dict) -> str:
87
+ """Extract publication year."""
88
+ date_parts = message.get('published-print', {}).get('date-parts', [[]])
89
+ if not date_parts or not date_parts[0]:
90
+ date_parts = message.get('published-online', {}).get('date-parts', [[]])
91
+
92
+ if date_parts and date_parts[0]:
93
+ return str(date_parts[0][0])
94
+ return ""
95
+
96
+ def verify_url(self, url: str) -> Tuple[bool, int]:
97
+ """
98
+ Verify a URL is accessible.
99
+ Returns (is_accessible, status_code)
100
+ """
101
+ try:
102
+ response = self.session.head(url, timeout=10, allow_redirects=True)
103
+ is_accessible = response.status_code < 400
104
+ return is_accessible, response.status_code
105
+ except Exception as e:
106
+ return False, 0
107
+
108
+ def verify_citations_in_file(self, filepath: str) -> Dict:
109
+ """
110
+ Verify all citations in a markdown file.
111
+ Returns a report of verification results.
112
+ """
113
+ with open(filepath, 'r', encoding='utf-8') as f:
114
+ content = f.read()
115
+
116
+ dois = self.extract_dois(content)
117
+
118
+ report = {
119
+ 'total_dois': len(dois),
120
+ 'verified': [],
121
+ 'failed': [],
122
+ 'metadata': {}
123
+ }
124
+
125
+ for doi in dois:
126
+ print(f"Verifying DOI: {doi}")
127
+ is_valid, metadata = self.verify_doi(doi)
128
+
129
+ if is_valid:
130
+ report['verified'].append(doi)
131
+ report['metadata'][doi] = metadata
132
+ else:
133
+ report['failed'].append(doi)
134
+
135
+ time.sleep(0.5) # Rate limiting
136
+
137
+ return report
138
+
139
+ def format_citation_apa(self, metadata: Dict) -> str:
140
+ """Format citation in APA style."""
141
+ authors = metadata.get('authors', '')
142
+ year = metadata.get('year', 'n.d.')
143
+ title = metadata.get('title', '')
144
+ journal = metadata.get('journal', '')
145
+ volume = metadata.get('volume', '')
146
+ pages = metadata.get('pages', '')
147
+ doi = metadata.get('doi', '')
148
+
149
+ citation = f"{authors} ({year}). {title}. "
150
+ if journal:
151
+ citation += f"*{journal}*"
152
+ if volume:
153
+ citation += f", *{volume}*"
154
+ if pages:
155
+ citation += f", {pages}"
156
+ if doi:
157
+ citation += f". https://doi.org/{doi}"
158
+
159
+ return citation
160
+
161
+ def format_citation_nature(self, metadata: Dict) -> str:
162
+ """Format citation in Nature style."""
163
+ authors = metadata.get('authors', '')
164
+ title = metadata.get('title', '')
165
+ journal = metadata.get('journal', '')
166
+ volume = metadata.get('volume', '')
167
+ pages = metadata.get('pages', '')
168
+ year = metadata.get('year', '')
169
+
170
+ citation = f"{authors} {title}. "
171
+ if journal:
172
+ citation += f"*{journal}* "
173
+ if volume:
174
+ citation += f"**{volume}**, "
175
+ if pages:
176
+ citation += f"{pages} "
177
+ if year:
178
+ citation += f"({year})"
179
+
180
+ return citation
181
+
182
+ def main():
183
+ """Example usage."""
184
+ import sys
185
+
186
+ if len(sys.argv) < 2:
187
+ print("Usage: python verify_citations.py <markdown_file>")
188
+ sys.exit(1)
189
+
190
+ filepath = sys.argv[1]
191
+ verifier = CitationVerifier()
192
+
193
+ print(f"Verifying citations in: {filepath}")
194
+ report = verifier.verify_citations_in_file(filepath)
195
+
196
+ print("\n" + "="*60)
197
+ print("CITATION VERIFICATION REPORT")
198
+ print("="*60)
199
+ print(f"\nTotal DOIs found: {report['total_dois']}")
200
+ print(f"Verified: {len(report['verified'])}")
201
+ print(f"Failed: {len(report['failed'])}")
202
+
203
+ if report['failed']:
204
+ print("\nFailed DOIs:")
205
+ for doi in report['failed']:
206
+ print(f" - {doi}")
207
+
208
+ if report['metadata']:
209
+ print("\n\nVerified Citations (APA format):")
210
+ for doi, metadata in report['metadata'].items():
211
+ citation = verifier.format_citation_apa(metadata)
212
+ print(f"\n{citation}")
213
+
214
+ # Save detailed report
215
+ output_file = filepath.replace('.md', '_citation_report.json')
216
+ with open(output_file, 'w', encoding='utf-8') as f:
217
+ json.dump(report, f, indent=2)
218
+
219
+ print(f"\n\nDetailed report saved to: {output_file}")
220
+
221
+ if __name__ == "__main__":
222
+ main()