yakultpdf 0.7.5__tar.gz

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.
Files changed (203) hide show
  1. yakultpdf-0.7.5/.agent/rules/general.md +6 -0
  2. yakultpdf-0.7.5/.agent/rules/typst.md +6 -0
  3. yakultpdf-0.7.5/.env +1 -0
  4. yakultpdf-0.7.5/.gitignore +28 -0
  5. yakultpdf-0.7.5/AGENTS.md +11 -0
  6. yakultpdf-0.7.5/CHANGELOG.md +6 -0
  7. yakultpdf-0.7.5/Dockerfile +73 -0
  8. yakultpdf-0.7.5/LICENSE +21 -0
  9. yakultpdf-0.7.5/PKG-INFO +97 -0
  10. yakultpdf-0.7.5/README.md +71 -0
  11. yakultpdf-0.7.5/_logs/README.md +27 -0
  12. yakultpdf-0.7.5/_logs/archive/CLI/351/207/215/346/236/204/347/263/273/345/210/227/CLI/345/210/206/346/236/220/346/212/245/345/221/212_postprocess/344/270/216/345/220/210/345/271/266/345/273/272/350/256/256.md +223 -0
  13. yakultpdf-0.7.5/_logs/archive/CLI/351/207/215/346/236/204/347/263/273/345/210/227/mark2pdf_cli/351/207/215/346/236/204/350/256/241/345/210/222.md +73 -0
  14. yakultpdf-0.7.5/_logs/archive//345/212/237/350/203/275/345/256/236/347/216/260/350/256/260/345/275/225/batch/346/250/241/345/274/217-images/350/267/257/345/276/204/344/277/256/345/244/215/346/226/271/346/241/210.md +199 -0
  15. yakultpdf-0.7.5/_logs/archive//345/212/237/350/203/275/345/256/236/347/216/260/350/256/260/345/275/225/batch/346/250/241/345/274/217/345/256/236/347/216/260/346/226/271/346/241/210.md +92 -0
  16. yakultpdf-0.7.5/_logs/archive//345/212/237/350/203/275/345/256/236/347/216/260/350/256/260/345/275/225/core_directory_/351/207/215/346/236/204/346/226/271/346/241/210.md +231 -0
  17. yakultpdf-0.7.5/_logs/archive//345/212/237/350/203/275/345/256/236/347/216/260/350/256/260/345/275/225/explain_toc_pagenumber/344/277/256/346/224/271.md +35 -0
  18. yakultpdf-0.7.5/_logs/archive//345/212/237/350/203/275/345/256/236/347/216/260/350/256/260/345/275/225/hardcoded_working_path/350/260/203/347/240/224.md +37 -0
  19. yakultpdf-0.7.5/_logs/archive//345/212/237/350/203/275/345/256/236/347/216/260/350/256/260/345/275/225/image_clearing_plan.md +98 -0
  20. yakultpdf-0.7.5/_logs/archive//345/212/237/350/203/275/345/256/236/347/216/260/350/256/260/345/275/225/overview-fill-frontmatter.md +20 -0
  21. yakultpdf-0.7.5/_logs/archive//345/212/237/350/203/275/345/256/236/347/216/260/350/256/260/345/275/225/overview-fill-plan.md +65 -0
  22. yakultpdf-0.7.5/_logs/archive//345/212/237/350/203/275/345/256/236/347/216/260/350/256/260/345/275/225/plan_createpdf_open/351/200/211/351/241/271.md +67 -0
  23. yakultpdf-0.7.5/_logs/archive//345/212/237/350/203/275/345/256/236/347/216/260/350/256/260/345/275/225/postprocess_plugin_plan.md +292 -0
  24. yakultpdf-0.7.5/_logs/archive//345/212/237/350/203/275/345/256/236/347/216/260/350/256/260/345/275/225/standalone_mode_plan.md +84 -0
  25. yakultpdf-0.7.5/_logs/archive//345/212/237/350/203/275/345/256/236/347/216/260/350/256/260/345/275/225//346/226/207/346/241/243/345/275/222/346/241/243/346/225/264/347/220/206/346/226/271/346/241/210.md +202 -0
  26. yakultpdf-0.7.5/_logs/archive//345/215/207/347/272/247/350/277/255/344/273/243/350/247/204/345/210/222-202512.md +63 -0
  27. yakultpdf-0.7.5/_logs/archive//350/267/257/345/276/204/345/244/204/347/220/206/350/257/264/346/230/216.md +154 -0
  28. yakultpdf-0.7.5/_logs/archive//350/277/255/344/273/243/346/227/245/345/277/2270.6.0-0.6.10.md +835 -0
  29. yakultpdf-0.7.5/_logs/archive//351/205/215/347/275/256/345/261/202/345/256/236/346/226/275/346/226/271/346/241/210.md +441 -0
  30. yakultpdf-0.7.5/_logs/archive//351/241/271/347/233/256/345/256/241/350/256/241/346/212/245/345/221/212-202512.md +181 -0
  31. yakultpdf-0.7.5/_logs/archive//351/242/204/345/244/204/347/220/206/344/270/216/345/220/216/345/244/204/347/220/206/343/200/201/344/270/215/345/220/214/347/256/241/351/201/223//350/207/252/345/256/232/344/271/211/345/220/216/345/244/204/347/220/206/346/226/271/346/241/210.md +99 -0
  32. yakultpdf-0.7.5/_logs/archive//351/242/204/345/244/204/347/220/206/344/270/216/345/220/216/345/244/204/347/220/206/343/200/201/344/270/215/345/220/214/347/256/241/351/201/223//351/242/204/345/244/204/347/220/206/344/270/216/350/207/252/345/256/232/344/271/211/345/220/216/345/244/204/347/220/206.md +132 -0
  33. yakultpdf-0.7.5/_logs/docs/CLI/344/275/277/347/224/250/350/257/264/346/230/216.md +392 -0
  34. yakultpdf-0.7.5/_logs/docs/docker/347/211/210/344/275/277/347/224/250/350/257/264/346/230/216.md +52 -0
  35. yakultpdf-0.7.5/_logs/docs//345/267/245/344/275/234/345/214/272/344/275/277/347/224/250/346/214/207/345/215/227.md +240 -0
  36. yakultpdf-0.7.5/_logs/docs//351/205/215/347/275/256/346/214/207/345/215/227.md +192 -0
  37. yakultpdf-0.7.5/_logs/docs//351/241/271/347/233/256/350/257/264/346/230/216/346/226/207/346/241/243.md +148 -0
  38. yakultpdf-0.7.5/_logs/mark2pdf/351/207/215/346/236/204/346/226/271/346/241/210.md +153 -0
  39. yakultpdf-0.7.5/_logs/pypi/345/217/221/345/270/203/346/224/271/351/200/240/345/210/206/346/236/220.md +207 -0
  40. yakultpdf-0.7.5/_logs/research/NextJS/351/233/206/346/210/220/345/210/206/346/236/220.md +39 -0
  41. yakultpdf-0.7.5/_logs/research/api_md_to_pdf_plan.md +114 -0
  42. yakultpdf-0.7.5/_logs/research/vscode_extension_proposal.md +64 -0
  43. yakultpdf-0.7.5/_logs/research/zed_plugin_proposal.md +144 -0
  44. yakultpdf-0.7.5/_logs/research//345/217/214/350/257/255/347/277/273/350/257/221/350/260/203/347/240/224/AI/347/277/273/350/257/221/344/271/246/347/261/215/346/226/271/346/241/210.md +161 -0
  45. yakultpdf-0.7.5/_logs/research//345/217/214/350/257/255/347/277/273/350/257/221/350/260/203/347/240/224/AI/347/277/273/350/257/221/350/247/243/345/206/263/346/226/271/346/241/210/347/240/224/347/251/266.md +194 -0
  46. yakultpdf-0.7.5/_logs/research//345/217/214/350/257/255/347/277/273/350/257/221/350/260/203/347/240/224//344/270/211/347/247/215/346/230/276/347/244/272/346/250/241/345/274/217/345/256/236/347/216/260/346/226/271/346/241/210.md +305 -0
  47. yakultpdf-0.7.5/_logs/research//345/217/214/350/257/255/347/277/273/350/257/221/350/260/203/347/240/224//347/277/273/350/257/221/345/255/230/345/202/250/346/240/274/345/274/217/350/256/276/350/256/241.md +224 -0
  48. yakultpdf-0.7.5/_logs/research//345/244/226/351/203/250/350/204/232/346/234/254/350/260/203/347/224/250/sample-run_mark2pdf_md2pdf.py +356 -0
  49. yakultpdf-0.7.5/_logs/research//345/244/226/351/203/250/350/204/232/346/234/254/350/260/203/347/224/250//347/256/200/345/214/226/345/244/226/351/203/250/350/260/203/347/224/250/346/226/271/346/241/210.md +263 -0
  50. yakultpdf-0.7.5/_logs/research//345/244/226/351/203/250/350/204/232/346/234/254/350/260/203/347/224/250//350/204/232/346/234/254/347/274/226/345/206/231/350/257/264/346/230/216.md +272 -0
  51. yakultpdf-0.7.5/_logs/research//345/244/232/345/260/201/351/235/242/347/240/224/347/251/266//347/240/224/347/251/266/346/212/245/345/221/212.md +378 -0
  52. yakultpdf-0.7.5/_logs/research//345/255/227/344/275/223/346/211/223/345/214/205/346/226/271/346/241/210/350/256/250/350/256/272.md +175 -0
  53. yakultpdf-0.7.5/_logs/research//347/273/210/346/236/201/347/233/256/346/240/207/Railway/351/203/250/347/275/262/346/214/207/345/215/227.md +72 -0
  54. yakultpdf-0.7.5/_logs/research//347/273/210/346/236/201/347/233/256/346/240/207/cli/346/234/200/347/273/210/346/226/271/346/241/210/346/200/235/350/200/203.md +497 -0
  55. yakultpdf-0.7.5/_logs/research//347/273/210/346/236/201/347/233/256/346/240/207/cli/346/234/200/347/273/210/346/226/271/346/241/210/346/200/235/350/200/203_v2.md +288 -0
  56. yakultpdf-0.7.5/_logs/research//347/273/210/346/236/201/347/233/256/346/240/207/package/346/234/200/347/273/210/346/226/271/346/241/210/346/200/235/350/200/203.md +420 -0
  57. yakultpdf-0.7.5/_logs/research//347/273/210/346/236/201/347/233/256/346/240/207/pandoc_typst_/345/220/216/347/253/257/346/234/215/345/212/241/345/217/257/350/241/214/346/200/247/350/256/250/350/256/272.md +234 -0
  58. yakultpdf-0.7.5/_logs/research//347/273/210/346/236/201/347/233/256/346/240/207/railway.md +152 -0
  59. yakultpdf-0.7.5/_logs/typst/README_batch_gaozhi.md +65 -0
  60. yakultpdf-0.7.5/_logs/typst/abc-article/346/224/266/351/233/206/345/212/237/350/203/275/350/257/264/346/230/216.md +368 -0
  61. yakultpdf-0.7.5/_logs/typst/nb-lib/351/205/215/347/275/256/351/241/271/346/242/263/347/220/206/344/270/216/346/211/251/345/261/225/346/226/271/346/241/210.md +54 -0
  62. yakultpdf-0.7.5/_logs/typst/state-implementation-status.md +115 -0
  63. yakultpdf-0.7.5/_logs/typst/state-research-summary.md +80 -0
  64. yakultpdf-0.7.5/_logs/typst/typst-review-advice.md +179 -0
  65. yakultpdf-0.7.5/_logs/typst/typst/346/250/241/346/235/277.md +256 -0
  66. yakultpdf-0.7.5/_logs/typst//345/272/267/345/245/210/345/260/224/347/254/224/350/256/260/346/250/241/346/235/277/350/260/203/347/240/224.md +247 -0
  67. yakultpdf-0.7.5/_logs/typst//346/225/264/351/241/265/345/233/276/347/211/207/344/270/216/350/203/214/346/231/257/346/226/271/346/241/210.md +138 -0
  68. yakultpdf-0.7.5/_logs//350/277/255/344/273/243/346/227/245/345/277/227.md +2 -0
  69. yakultpdf-0.7.5/commit +47 -0
  70. yakultpdf-0.7.5/docker-compose.yml +13 -0
  71. yakultpdf-0.7.5/mark2pdf.config.toml +15 -0
  72. yakultpdf-0.7.5/pyproject.toml +64 -0
  73. yakultpdf-0.7.5/scripts/back/clean_x_md.py +302 -0
  74. yakultpdf-0.7.5/scripts/back/drawcover.py +157 -0
  75. yakultpdf-0.7.5/scripts/back/gly_lab.py +380 -0
  76. yakultpdf-0.7.5/scripts/back/make_wensi_fe.py +316 -0
  77. yakultpdf-0.7.5/scripts/back/makenotes.py +210 -0
  78. yakultpdf-0.7.5/scripts/back/md2pdf_original.py +323 -0
  79. yakultpdf-0.7.5/scripts/run_aibench_trans.py +163 -0
  80. yakultpdf-0.7.5/src/mark2pdf/__init__.py +47 -0
  81. yakultpdf-0.7.5/src/mark2pdf/cli.py +209 -0
  82. yakultpdf-0.7.5/src/mark2pdf/commands/__init__.py +24 -0
  83. yakultpdf-0.7.5/src/mark2pdf/commands/clean.py +70 -0
  84. yakultpdf-0.7.5/src/mark2pdf/commands/coverimg.py +154 -0
  85. yakultpdf-0.7.5/src/mark2pdf/commands/fonts.py +323 -0
  86. yakultpdf-0.7.5/src/mark2pdf/commands/gaozhi.py +203 -0
  87. yakultpdf-0.7.5/src/mark2pdf/commands/mdimage.py +71 -0
  88. yakultpdf-0.7.5/src/mark2pdf/commands/version.py +22 -0
  89. yakultpdf-0.7.5/src/mark2pdf/commands/workspace.py +57 -0
  90. yakultpdf-0.7.5/src/mark2pdf/config/__init__.py +30 -0
  91. yakultpdf-0.7.5/src/mark2pdf/config/defaults.py +81 -0
  92. yakultpdf-0.7.5/src/mark2pdf/config/loader.py +200 -0
  93. yakultpdf-0.7.5/src/mark2pdf/config/reporter.py +85 -0
  94. yakultpdf-0.7.5/src/mark2pdf/config/types.py +88 -0
  95. yakultpdf-0.7.5/src/mark2pdf/config/workspace.py +265 -0
  96. yakultpdf-0.7.5/src/mark2pdf/conversion.py +308 -0
  97. yakultpdf-0.7.5/src/mark2pdf/core/__init__.py +30 -0
  98. yakultpdf-0.7.5/src/mark2pdf/core/cli.py +104 -0
  99. yakultpdf-0.7.5/src/mark2pdf/core/core.py +379 -0
  100. yakultpdf-0.7.5/src/mark2pdf/core/defaults.py +54 -0
  101. yakultpdf-0.7.5/src/mark2pdf/core/directory.py +187 -0
  102. yakultpdf-0.7.5/src/mark2pdf/core/options.py +24 -0
  103. yakultpdf-0.7.5/src/mark2pdf/core/postprocess.py +70 -0
  104. yakultpdf-0.7.5/src/mark2pdf/core/tests/test_cli.py +221 -0
  105. yakultpdf-0.7.5/src/mark2pdf/core/tests/test_convert_from_string.py +45 -0
  106. yakultpdf-0.7.5/src/mark2pdf/core/tests/test_core.py +175 -0
  107. yakultpdf-0.7.5/src/mark2pdf/core/tests/test_force_filename.py +51 -0
  108. yakultpdf-0.7.5/src/mark2pdf/core/tests/test_output_format.py +61 -0
  109. yakultpdf-0.7.5/src/mark2pdf/core/utils.py +213 -0
  110. yakultpdf-0.7.5/src/mark2pdf/helper_gaozhi/__init__.py +20 -0
  111. yakultpdf-0.7.5/src/mark2pdf/helper_gaozhi/gaozhi_preprocess.py +115 -0
  112. yakultpdf-0.7.5/src/mark2pdf/helper_gaozhi/tests/test_gaozhi_preprocess.py +252 -0
  113. yakultpdf-0.7.5/src/mark2pdf/helper_interfile/__init__.py +13 -0
  114. yakultpdf-0.7.5/src/mark2pdf/helper_interfile/example_usage.py +54 -0
  115. yakultpdf-0.7.5/src/mark2pdf/helper_interfile/interfile_manager.py +151 -0
  116. yakultpdf-0.7.5/src/mark2pdf/helper_interfile/tests/test_interfile_manager.py +120 -0
  117. yakultpdf-0.7.5/src/mark2pdf/helper_interfile/v0.1.1 +1 -0
  118. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/__init__.py +46 -0
  119. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/md_preprocess.py +1070 -0
  120. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/sample.md +78 -0
  121. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/tests/test_extract_frontmatter.py +202 -0
  122. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/tests/test_pre_add_line_breaks.py +911 -0
  123. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/tests/test_pre_clean_frontmatter.py +78 -0
  124. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/tests/test_pre_dash_to_star.py +85 -0
  125. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/tests/test_pre_for_typst.py +31 -0
  126. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/tests/test_pre_for_typst_at.py +60 -0
  127. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/tests/test_pre_for_typst_dollarmark.py +96 -0
  128. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/tests/test_pre_image_verify.py +160 -0
  129. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/tests/test_pre_remove_links.py +108 -0
  130. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/tests/test_pre_remove_titlestar.py +104 -0
  131. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/tests/test_pre_trim_whitespace.py +73 -0
  132. yakultpdf-0.7.5/src/mark2pdf/helper_markdown/v0.1.6 +5 -0
  133. yakultpdf-0.7.5/src/mark2pdf/helper_mdimage/README.md +55 -0
  134. yakultpdf-0.7.5/src/mark2pdf/helper_mdimage/__init__.py +39 -0
  135. yakultpdf-0.7.5/src/mark2pdf/helper_mdimage/mdimage_assets.py +300 -0
  136. yakultpdf-0.7.5/src/mark2pdf/helper_mdimage/mdimage_cli.py +236 -0
  137. yakultpdf-0.7.5/src/mark2pdf/helper_mdimage/mdimage_migrate.py +377 -0
  138. yakultpdf-0.7.5/src/mark2pdf/helper_mdimage/mdimage_rewrite.py +200 -0
  139. yakultpdf-0.7.5/src/mark2pdf/helper_mdimage/tests/test_mdimage.py +523 -0
  140. yakultpdf-0.7.5/src/mark2pdf/helper_mdimage/tests/test_mdimage_migrate.py +245 -0
  141. yakultpdf-0.7.5/src/mark2pdf/helper_mdimage/v0.1.0 +0 -0
  142. yakultpdf-0.7.5/src/mark2pdf/helper_typst/V0.1.2 +2 -0
  143. yakultpdf-0.7.5/src/mark2pdf/helper_typst/__init__.py +24 -0
  144. yakultpdf-0.7.5/src/mark2pdf/helper_typst/helper_typst.py +457 -0
  145. yakultpdf-0.7.5/src/mark2pdf/helper_typst/tests/test_helper_typst.py +213 -0
  146. yakultpdf-0.7.5/src/mark2pdf/helper_typst/tests/test_run_pandoc_typst.py +350 -0
  147. yakultpdf-0.7.5/src/mark2pdf/helper_workingpath/README.md +341 -0
  148. yakultpdf-0.7.5/src/mark2pdf/helper_workingpath/V0.1 +1 -0
  149. yakultpdf-0.7.5/src/mark2pdf/helper_workingpath/__init__.py +22 -0
  150. yakultpdf-0.7.5/src/mark2pdf/helper_workingpath/helper_working_path.py +342 -0
  151. yakultpdf-0.7.5/src/mark2pdf/helper_workingpath/tests/test_working_path_helper.py +475 -0
  152. yakultpdf-0.7.5/src/mark2pdf/postprocess/__init__.py +11 -0
  153. yakultpdf-0.7.5/src/mark2pdf/postprocess/compile_overview.py +86 -0
  154. yakultpdf-0.7.5/src/mark2pdf/postprocess/remove_links.py +20 -0
  155. yakultpdf-0.7.5/src/mark2pdf/postprocess/tests/test_compile_overview.py +32 -0
  156. yakultpdf-0.7.5/src/mark2pdf/postprocess/to_traditional_chinese.py +20 -0
  157. yakultpdf-0.7.5/src/mark2pdf/process_builder.py +82 -0
  158. yakultpdf-0.7.5/src/mark2pdf/resources/createpdf.py +102 -0
  159. yakultpdf-0.7.5/src/mark2pdf/resources/frontmatter.yaml +22 -0
  160. yakultpdf-0.7.5/src/mark2pdf/resources/index.md +7 -0
  161. yakultpdf-0.7.5/src/mark2pdf/templates/__init__.py +3 -0
  162. yakultpdf-0.7.5/src/mark2pdf/templates/back/article.typ +326 -0
  163. yakultpdf-0.7.5/src/mark2pdf/templates/back/gaozhi-book.typ +137 -0
  164. yakultpdf-0.7.5/src/mark2pdf/templates/back/letter-cover.typ +151 -0
  165. yakultpdf-0.7.5/src/mark2pdf/templates/back/letter-personal-notes-bigfont.typ +220 -0
  166. yakultpdf-0.7.5/src/mark2pdf/templates/back/letter-personal-notes.typ +220 -0
  167. yakultpdf-0.7.5/src/mark2pdf/templates/back/letter.typ +152 -0
  168. yakultpdf-0.7.5/src/mark2pdf/templates/back/math-two.typ +51 -0
  169. yakultpdf-0.7.5/src/mark2pdf/templates/back/math6.typ +161 -0
  170. yakultpdf-0.7.5/src/mark2pdf/templates/back/neilzone.typ +275 -0
  171. yakultpdf-0.7.5/src/mark2pdf/templates/back/newsletter-lib.typ +182 -0
  172. yakultpdf-0.7.5/src/mark2pdf/templates/back/ntarticle.typ +232 -0
  173. yakultpdf-0.7.5/src/mark2pdf/templates/back/pandoc-default.typ +126 -0
  174. yakultpdf-0.7.5/src/mark2pdf/templates/back/pdfwork.typ +316 -0
  175. yakultpdf-0.7.5/src/mark2pdf/templates/back/term-lib.typ +85 -0
  176. yakultpdf-0.7.5/src/mark2pdf/templates/back/term.typ +33 -0
  177. yakultpdf-0.7.5/src/mark2pdf/templates/card.typ +162 -0
  178. yakultpdf-0.7.5/src/mark2pdf/templates/gaozhi-lib.typ +143 -0
  179. yakultpdf-0.7.5/src/mark2pdf/templates/gaozhi.typ +36 -0
  180. yakultpdf-0.7.5/src/mark2pdf/templates/letter/letter-bigfont-alpha.typ +179 -0
  181. yakultpdf-0.7.5/src/mark2pdf/templates/letter/letter-bigfont-oneliner-test.typ +174 -0
  182. yakultpdf-0.7.5/src/mark2pdf/templates/letter/letter-bigfont.typ +161 -0
  183. yakultpdf-0.7.5/src/mark2pdf/templates/letter/letter-cmc-glossary-a5.typ +196 -0
  184. yakultpdf-0.7.5/src/mark2pdf/templates/letter/letter-cmc-glossary-phone.typ +196 -0
  185. yakultpdf-0.7.5/src/mark2pdf/templates/letter/letter-cmc-glossary.typ +196 -0
  186. yakultpdf-0.7.5/src/mark2pdf/templates/letter/letter-oneliner.typ +178 -0
  187. yakultpdf-0.7.5/src/mark2pdf/templates/math-daily.typ +49 -0
  188. yakultpdf-0.7.5/src/mark2pdf/templates/nb-cover-lib.typ +184 -0
  189. yakultpdf-0.7.5/src/mark2pdf/templates/nb-lib.typ +472 -0
  190. yakultpdf-0.7.5/src/mark2pdf/templates/nb.typ +231 -0
  191. yakultpdf-0.7.5/src/mark2pdf/templates/wensi-tpl/star.png +0 -0
  192. yakultpdf-0.7.5/src/mark2pdf/templates/wensi_fe.typ +296 -0
  193. yakultpdf-0.7.5/src/mark2pdf/tests/__init__.py +1 -0
  194. yakultpdf-0.7.5/src/mark2pdf/tests/test_batch_conversion.py +317 -0
  195. yakultpdf-0.7.5/src/mark2pdf/tests/test_clean.py +159 -0
  196. yakultpdf-0.7.5/src/mark2pdf/tests/test_cli.py +202 -0
  197. yakultpdf-0.7.5/src/mark2pdf/tests/test_manager.py +141 -0
  198. yakultpdf-0.7.5/src/mark2pdf/tests/test_workspace_init.py +37 -0
  199. yakultpdf-0.7.5/uv.lock +910 -0
  200. yakultpdf-0.7.5/web_ui/fonts/.gitkeep +0 -0
  201. yakultpdf-0.7.5/web_ui/fonts/FZQingFSJW_Cu.TTF +0 -0
  202. yakultpdf-0.7.5/web_ui/web_home.html +437 -0
  203. yakultpdf-0.7.5/web_ui/web_server.py +331 -0
@@ -0,0 +1,6 @@
1
+ ---
2
+ trigger: always_on
3
+ ---
4
+
5
+ - this is a python project using "uv". always use uv.
6
+ - when asked to write a plan or do research, just plan in ./_logs and DON'T implement.
@@ -0,0 +1,6 @@
1
+ ---
2
+ trigger: model_decision
3
+ description: rules about typst
4
+ ---
5
+
6
+ always check typst reference first: https://typst.app/docs/reference/
yakultpdf-0.7.5/.env ADDED
@@ -0,0 +1 @@
1
+ UV_PUBLISH_TOKEN=pypi-AgEIcHlwaS5vcmcCJDRiOTg1MmM4LTk2YmEtNGRmZS05ZTcxLTY0N2MyNmEzN2I3OAACKlszLCI5ODBjZWQzYS0xYTA3LTQ1ZDMtYWVkNS02ZmFkMjA0ZTJmNjAiXQAABiAIWgPMRzPuBYV8I0jETznnA3h1wMJS0nUGq4UxZzv2ig
@@ -0,0 +1,28 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ .ruff_cache
4
+ *.py[oc]
5
+ build/
6
+ dist/
7
+ wheels/
8
+ *.egg-info
9
+ .pytest_cache
10
+ .DS_Store
11
+ # Virtual environments
12
+ .venv
13
+ .vscode
14
+ .coverage
15
+
16
+ .pandoctemp
17
+
18
+ _working
19
+
20
+ *.pdf
21
+
22
+ .claude
23
+
24
+ # Temporarily ignore uv.lock during frequent updates to avoid noise.
25
+ # This should be removed from .gitignore and tracked again once the project stabilizes.
26
+ #uv.lock
27
+
28
+ moonspace
@@ -0,0 +1,11 @@
1
+ python project with uv, using pandoc + typst to convert markdown to pdf
2
+
3
+ Directory Structure
4
+
5
+ - src
6
+ - scripts
7
+ - templates
8
+ - _logs
9
+
10
+ Rules:
11
+ always run with `uv`
@@ -0,0 +1,6 @@
1
+ # Changelog
2
+
3
+ ## [0.7.0] - 2026-01-03
4
+
5
+ ### Changed
6
+ - Refactored project structure and for `mark2pdf` package publishing.
@@ -0,0 +1,73 @@
1
+ FROM python:3.11-slim
2
+
3
+ RUN apt-get update && apt-get install -y --no-install-recommends \
4
+ wget \
5
+ fontconfig \
6
+ fonts-arphic-ukai \
7
+ fonts-arphic-uming \
8
+ fonts-dejavu-core \
9
+ fonts-freefont-ttf \
10
+ fonts-ipafont-gothic \
11
+ fonts-ipafont-mincho \
12
+ fonts-liberation \
13
+ fonts-noto-cjk \
14
+ fonts-noto-color-emoji \
15
+ fonts-noto-core \
16
+ fonts-noto-extra \
17
+ fonts-urw-base35 \
18
+ fonts-wqy-microhei \
19
+ fonts-wqy-zenhei \
20
+ ca-certificates \
21
+ xz-utils \
22
+ build-essential \
23
+ cmake \
24
+ pkg-config \
25
+ libopencc-dev \
26
+ && rm -rf /var/lib/apt/lists/*
27
+
28
+ RUN set -eux; \
29
+ arch="$(dpkg --print-architecture)"; \
30
+ case "$arch" in \
31
+ amd64) pandoc_arch="amd64" ;; \
32
+ arm64) pandoc_arch="arm64" ;; \
33
+ *) echo "Unsupported architecture: $arch" >&2; exit 1 ;; \
34
+ esac; \
35
+ pandoc_tag="$(python -c "import json,urllib.request; print(json.load(urllib.request.urlopen('https://api.github.com/repos/jgm/pandoc/releases/latest'))['tag_name'])")"; \
36
+ wget -qO- "https://github.com/jgm/pandoc/releases/download/${pandoc_tag}/pandoc-${pandoc_tag}-linux-${pandoc_arch}.tar.gz" \
37
+ | tar xz --strip-components=1 -C /usr/local
38
+
39
+ RUN set -eux; \
40
+ arch="$(dpkg --print-architecture)"; \
41
+ case "$arch" in \
42
+ amd64) typst_arch="x86_64-unknown-linux-musl" ;; \
43
+ arm64) typst_arch="aarch64-unknown-linux-musl" ;; \
44
+ *) echo "Unsupported architecture: $arch" >&2; exit 1 ;; \
45
+ esac; \
46
+ wget -qO- "https://github.com/typst/typst/releases/latest/download/typst-${typst_arch}.tar.xz" \
47
+ | tar xJ --strip-components=1 -C /usr/local/bin
48
+
49
+ RUN pip install --no-cache-dir uv
50
+
51
+ WORKDIR /app
52
+
53
+ COPY pyproject.toml uv.lock ./
54
+ RUN uv sync --frozen --no-dev --extra web --no-install-project
55
+
56
+ COPY . .
57
+ RUN uv sync --frozen --no-dev --extra web
58
+
59
+ # Manual custom fonts (e.g. YouSheBiaoTiHei)
60
+ COPY web_ui/fonts/ /usr/share/fonts/mark2pdf/
61
+
62
+ # Auto-install supported fonts
63
+ RUN uv run mark2pdf fonts install lxgw-wenkai --dir /usr/share/fonts/mark2pdf/
64
+ RUN uv run mark2pdf fonts install source-han-sans --dir /usr/share/fonts/mark2pdf/
65
+ # RUN uv run mark2pdf fonts install yozai --dir /usr/share/fonts/mark2pdf/
66
+
67
+ RUN fc-cache -fv
68
+
69
+ ENV TYPST_FONT_PATHS=/usr/share/fonts/mark2pdf
70
+
71
+ EXPOSE 8000
72
+
73
+ CMD ["uv", "run", "uvicorn", "web_ui.web_server:app", "--host", "0.0.0.0", "--port", "8000"]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 mark2pdf contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,97 @@
1
+ Metadata-Version: 2.4
2
+ Name: yakultpdf
3
+ Version: 0.7.5
4
+ Summary: Markdown to PDF converter using Pandoc and Typst
5
+ Author: mark2pdf contributors
6
+ License-Expression: MIT
7
+ License-File: LICENSE
8
+ Keywords: converter,markdown,pandoc,pdf,typst
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Environment :: Console
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Requires-Python: >=3.11
16
+ Requires-Dist: click>=8.0.0
17
+ Requires-Dist: markdown-it-py
18
+ Requires-Dist: mdit-py-plugins
19
+ Requires-Dist: opencc
20
+ Requires-Dist: pillow
21
+ Requires-Dist: pyyaml
22
+ Provides-Extra: web
23
+ Requires-Dist: fastapi>=0.128.0; extra == 'web'
24
+ Requires-Dist: uvicorn[standard]>=0.40.0; extra == 'web'
25
+ Description-Content-Type: text/markdown
26
+
27
+ # mark2pdf
28
+
29
+ **基于 Pandoc 和 Typst 的 Markdown 转 PDF 工具**
30
+
31
+ 将 Markdown 文件转换为精美的 PDF。支持 Frontmatter 配置、自动化目录管理以及通过 Python 代码调用。
32
+
33
+ ## 安装
34
+
35
+ ```bash
36
+ pip install mark2pdf
37
+ ```
38
+
39
+ > **注意**:使用前请确保已安装 [Pandoc](https://pandoc.org/) 和 [Typst](https://typst.app/)。
40
+
41
+ ## CLI 使用
42
+
43
+ **1. 初始化与配置**
44
+ ```bash
45
+ # 初始化工作区(创建配置和目录结构)
46
+ mark2pdf init
47
+
48
+ # 安装常用中文字体(如 lxgw-wenkai)
49
+ mark2pdf fonts install lxgw-wenkai
50
+ ```
51
+
52
+ **2. 转换文档**
53
+ ```bash
54
+ # 转换单个文件 (默认输出到 out/ 目录)
55
+ mark2pdf convert document.md
56
+
57
+ # 转换单个文件并指定输出文件名
58
+ mark2pdf convert document.md --output my-report
59
+
60
+ # 转换整个目录(自动合并目录内所有 md 文件)
61
+ mark2pdf convert --dir docs/
62
+ ```
63
+
64
+ **3. 更多功能**
65
+ ```bash
66
+ # 复制内置模板到本地 template/ 目录
67
+ mark2pdf template
68
+
69
+ # 查看帮助
70
+ mark2pdf --help
71
+ mark2pdf convert --help
72
+ ```
73
+
74
+ ## Python API 使用
75
+
76
+ ```python
77
+ from mark2pdf import convert_file, convert_directory
78
+
79
+ # 1. 转换单个文件
80
+ # 将 input.md 转换为 output.pdf,使用默认配置
81
+ convert_file("input.md", output_file="output.pdf")
82
+
83
+ # 2. 转换目录
84
+ # 将 docs 目录下的所有 Markdown 合并转换为 merged_report.pdf
85
+ convert_directory("docs", output_file="merged_report.pdf")
86
+ ```
87
+
88
+ ## 开发与全局安装
89
+
90
+ 如果你是开发者或希望从源码进行全系统安装,推荐使用 `uv tool`:
91
+
92
+ ```bash
93
+ # 在项目根目录下运行
94
+ uv tool install . --force
95
+ ```
96
+
97
+ 这会将 `mark2pdf` 安装到隔离环境中并添加到系统 PATH,使你可以在任何目录下直接运行 `mark2pdf` 命令。
@@ -0,0 +1,71 @@
1
+ # mark2pdf
2
+
3
+ **基于 Pandoc 和 Typst 的 Markdown 转 PDF 工具**
4
+
5
+ 将 Markdown 文件转换为精美的 PDF。支持 Frontmatter 配置、自动化目录管理以及通过 Python 代码调用。
6
+
7
+ ## 安装
8
+
9
+ ```bash
10
+ pip install mark2pdf
11
+ ```
12
+
13
+ > **注意**:使用前请确保已安装 [Pandoc](https://pandoc.org/) 和 [Typst](https://typst.app/)。
14
+
15
+ ## CLI 使用
16
+
17
+ **1. 初始化与配置**
18
+ ```bash
19
+ # 初始化工作区(创建配置和目录结构)
20
+ mark2pdf init
21
+
22
+ # 安装常用中文字体(如 lxgw-wenkai)
23
+ mark2pdf fonts install lxgw-wenkai
24
+ ```
25
+
26
+ **2. 转换文档**
27
+ ```bash
28
+ # 转换单个文件 (默认输出到 out/ 目录)
29
+ mark2pdf convert document.md
30
+
31
+ # 转换单个文件并指定输出文件名
32
+ mark2pdf convert document.md --output my-report
33
+
34
+ # 转换整个目录(自动合并目录内所有 md 文件)
35
+ mark2pdf convert --dir docs/
36
+ ```
37
+
38
+ **3. 更多功能**
39
+ ```bash
40
+ # 复制内置模板到本地 template/ 目录
41
+ mark2pdf template
42
+
43
+ # 查看帮助
44
+ mark2pdf --help
45
+ mark2pdf convert --help
46
+ ```
47
+
48
+ ## Python API 使用
49
+
50
+ ```python
51
+ from mark2pdf import convert_file, convert_directory
52
+
53
+ # 1. 转换单个文件
54
+ # 将 input.md 转换为 output.pdf,使用默认配置
55
+ convert_file("input.md", output_file="output.pdf")
56
+
57
+ # 2. 转换目录
58
+ # 将 docs 目录下的所有 Markdown 合并转换为 merged_report.pdf
59
+ convert_directory("docs", output_file="merged_report.pdf")
60
+ ```
61
+
62
+ ## 开发与全局安装
63
+
64
+ 如果你是开发者或希望从源码进行全系统安装,推荐使用 `uv tool`:
65
+
66
+ ```bash
67
+ # 在项目根目录下运行
68
+ uv tool install . --force
69
+ ```
70
+
71
+ 这会将 `mark2pdf` 安装到隔离环境中并添加到系统 PATH,使你可以在任何目录下直接运行 `mark2pdf` 命令。
@@ -0,0 +1,27 @@
1
+ # _logs 目录索引
2
+
3
+ ## 核心文档
4
+ - [迭代日志](./迭代日志.md) - 版本演进与关键变更
5
+
6
+ ## 用户文档 (docs/)
7
+ - [CLI 使用说明](./docs/CLI使用说明.md)
8
+ - [工作区使用指南](./docs/工作区使用指南.md)
9
+ - [项目说明文档](./docs/项目说明文档.md)
10
+
11
+ ## 审查报告 (reports/)
12
+ (暂无,记录已清楚)
13
+
14
+ ## Typst 相关 (typst/)
15
+ - 模板审查与改进建议、版式调研与实现说明
16
+
17
+ ## 调研资料 (research/)
18
+ - 双语翻译调研、多封面研究、外部脚本调用方案
19
+
20
+ ## 历史归档 (archive/)
21
+ - CLI 重构系列、功能实现记录、已完成方案、codex 调研、讨论方案、最终思考
22
+
23
+ ## 待办 (backlog/)
24
+ - NextJS 集成分析
25
+
26
+ ## 待删除临时目录
27
+ - `待删除临时目录/` 用于暂存拟删除文件与空目录
@@ -0,0 +1,223 @@
1
+ # mark2pdf CLI 统一方案 - 全面整合分析
2
+
3
+ 日期:2024-12-31
4
+ **实施状态更新**: 2024-12-31
5
+
6
+ ---
7
+
8
+ ## 一、现状分析
9
+
10
+ ### 1.1 当前架构
11
+
12
+ > ✅ **已变更**: `config_manager` 已重命名为 `mark2pdf`
13
+
14
+ ```
15
+ ┌─────────────────────────────────────────────────────────────────────┐
16
+ │ pyproject.toml │
17
+ │ md2pdf = "markdown2pdf.cli:cli" ← ✅ 已移除 │
18
+ │ mark2pdf = "mark2pdf.cli:main" ← ✅ 已更新 │
19
+ └─────────────────────────────────────────────────────────────────────┘
20
+ │
21
+ ┌──────────────────────┴──────────────────────┐
22
+ │ │
23
+ ▼ ▼
24
+ ┌──────────────────────┐ ┌──────────────────────┐
25
+ │ markdown2pdf/ │ │ mark2pdf/ │
26
+ │ (核心转换) │ │ (CLI + 工作区管理) │
27
+ │ - core.py │ │ - cli.py │
28
+ │ - directory.py │ │ - conversion.py │
29
+ └──────────────────────┘ └──────────────────────┘
30
+ ```
31
+
32
+ ### 1.2 两个 CLI 功能对比
33
+
34
+ | 功能 | `md2pdf` | `mark2pdf` | 状态 |
35
+ |------|----------|-----------|------|
36
+ | 转换单文件 | ✅ | ✅ | ✅ 已实现 |
37
+ | 目录合并转换 | ✅ | ✅ | ✅ 已实现 |
38
+ | 工作区初始化 | ❌ | ✅ | ✅ 已有 |
39
+ | 工作区更新 | ❌ | ✅ | ✅ 已有 |
40
+ | 图片清理 | ❌ | ✅ | ✅ 已有 |
41
+ | 配置文件读取 | ❌ | ✅ | ✅ 已实现 |
42
+
43
+ ### 1.3 createpdf.py 的角色
44
+
45
+ > ✅ **已更新**: import 已从 `config_manager` 改为 `mark2pdf`
46
+
47
+ ---
48
+
49
+ ## 二、目标架构
50
+
51
+ ### 2.1 统一入口
52
+
53
+ > ✅ **已实现**
54
+
55
+ ```
56
+ mark2pdf (唯一 CLI)
57
+ ├── convert <file> # ✅ 已实现
58
+ │ ├── --dir <目录> # ✅ 已实现
59
+ │ ├── --batch <目录> # ✅ 已实现
60
+ │ ├── --postprocess <name> # ✅ 参数已预留(功能待实现)
61
+ │ └── 其他选项... # ✅ 已实现
62
+ ├── init <目录> # ✅ 已有
63
+ ├── update [目录] # ✅ 已有
64
+ ├── version # ✅ 已新增
65
+ └── imageclearing <file> # ✅ 已有
66
+ ```
67
+
68
+ ### 2.2 createpdf.py 新定位
69
+
70
+ > ✅ **已实现**
71
+
72
+ ---
73
+
74
+ ## 三、postprocess 插件机制(预留)
75
+
76
+ ### 3.1 当前实现范围
77
+
78
+ | 项目 | 状态 | 实施状态 |
79
+ |------|------|----------|
80
+ | `--postprocess <name>` CLI 参数 | ✅ 预留 | ✅ 已实现 |
81
+ | 插件加载器 | ❌ 暂不实现 | ✅ 基础框架已建立 |
82
+ | 工作区插件查找 | ❌ 暂不实现 | ⏳ 待实现 |
83
+ | 预定义插件库 | ❌ 暂不实现(仅 `abc-postprocess`)| ✅ abc_postprocess 已创建 |
84
+
85
+ ### 3.2 smoke test 用空处理器
86
+
87
+ > ✅ **已实现**: `src/markdown2pdf/postprocessors/abc_postprocess.py`
88
+
89
+ ### 3.3 后续完整实现(规划)
90
+
91
+ 待需要时再实现:
92
+
93
+ - **按名称查找** - 工作区 > 预定义 ⏳
94
+ - **动态加载** - importlib 加载 .py 文件 ⏳
95
+ - **预定义处理器** - tc_convert、remove_links 等 ⏳
96
+
97
+
98
+ ---
99
+
100
+ ## 四、工作区自动检测
101
+
102
+ ### 4.1 当前问题
103
+
104
+ > ✅ **已解决**
105
+
106
+ ### 4.2 解决方案
107
+
108
+ > ✅ **已实现**: `detect_workspace()` 函数在 `mark2pdf/cli.py`
109
+
110
+ ---
111
+
112
+ ## 五、实现计划
113
+
114
+ ### 5.1 文件变更
115
+
116
+ #### 修改
117
+
118
+ | 文件 | 变更 | 状态 |
119
+ |------|------|------|
120
+ | `pyproject.toml` | 移除 `md2pdf` 入口 | ✅ 已完成 |
121
+ | `mark2pdf/cli.py` | 添加 `convert` 子命令 | ✅ 已完成 |
122
+ | `mark2pdf/conversion.py` | 支持 postprocess 名称参数 | ⏳ 待实现(当前仅函数参数) |
123
+ | `mark2pdf/resources/createpdf.py` | 精简,仅保留自定义逻辑用途 | ✅ 已完成 |
124
+
125
+ #### 新增
126
+
127
+ | 文件 | 用途 | 状态 |
128
+ |------|------|------|
129
+ | `markdown2pdf/postprocessors/__init__.py` | 插件加载器 | ✅ 已创建 |
130
+ | `markdown2pdf/postprocessors/tc_convert.py` | 预定义:繁体转换 | ⏳ 待实现 |
131
+ | `markdown2pdf/postprocessors/remove_links.py` | 预定义:移除链接 | ⏳ 待实现 |
132
+
133
+ #### 可选移除
134
+
135
+ | 文件 | 说明 | 状态 |
136
+ |------|------|------|
137
+ | `markdown2pdf/cli.py` | 保留备用 | ✅ 保留(但入口已移除)|
138
+ | `markdown2pdf/defaults.py` | 合并到 mark2pdf | ✅ 保留(被 mark2pdf 调用)|
139
+
140
+ ### 5.2 内置后处理器清单
141
+
142
+ | 处理器名称 | 对应的 CLI 参数 | 状态 |
143
+ |------------|----------------|------|
144
+ | `tc_convert` | `--tc` | ⏳ 待迁移为插件(当前内联实现)|
145
+ | `remove_links` | `--removelink` | ⏳ 待迁移为插件(当前内联实现)|
146
+
147
+ ### 5.3 新 CLI 结构
148
+
149
+ > ✅ **已实现**(但 `--removelink` 参数声明后未传递给底层函数)
150
+
151
+ ### 5.4 createpdf.py 精简版
152
+
153
+ > ✅ **已实现**
154
+
155
+ ---
156
+
157
+ ## 六、使用场景对照
158
+
159
+ > ✅ **全部已实现**
160
+
161
+ | 场景 | 新方式 | 状态 |
162
+ |------|--------|------|
163
+ | 普通转换 | `mark2pdf convert sample.md` | ✅ |
164
+ | 指定模板 | `mark2pdf convert -t custom.typ` | ✅ |
165
+ | 繁体转换 | `mark2pdf convert --tc` | ✅ |
166
+ | 使用后处理 | `mark2pdf convert -p xxx` | ⏳ 参数预留,功能待实现 |
167
+ | 初始化工作区 | `mark2pdf init .` | ✅ |
168
+
169
+ ---
170
+
171
+ ## 七、功能增强建议
172
+
173
+ ### 7.1 新增命令
174
+
175
+ - `mark2pdf version`: ✅ **已实现**
176
+
177
+ ### 7.2 `convert` 命令增强
178
+
179
+ | 选项 | 状态 |
180
+ |------|------|
181
+ | `--dry-run` | ✅ 已实现 |
182
+ | `--show-config` | ✅ 已实现 |
183
+ | `--verbose` | ✅ 已实现(也会打印配置)|
184
+
185
+ ### 7.3 关键设计决策
186
+
187
+ 1. **createpdf.py 参数支持**: ✅ 已使用 `click` 接管
188
+ 2. **`postprocess` 传参**: ✅ 按计划暂不支持
189
+ 3. **工作区递归检测**: ✅ 按计划暂不支持
190
+
191
+ ### 7.4 技术规范与安全性修正
192
+
193
+ 1. **包名策略**: ⚠️ 偏离计划
194
+ - 计划:保持 `config_manager`
195
+ - 实际:已重命名为 `mark2pdf`(用户要求)
196
+
197
+ 2. **模板文件加载策略**: ✅ 保持现状
198
+
199
+ 3. **依赖安装安全**: ⏳ 待审查
200
+
201
+ ### 7.5 配置打印逻辑与时机
202
+
203
+ > ✅ **已实现**: 按计划顺序执行
204
+
205
+ ---
206
+
207
+ ## 八、总结
208
+
209
+ | 变更项 | 说明 | 状态 |
210
+ |--------|------|------|
211
+ | **移除 `md2pdf`** | 统一使用 `mark2pdf` | ✅ |
212
+ | **新增 `mark2pdf convert`** | 主转换命令 | ✅ |
213
+ | **postprocess 插件化** | 预定义 + 工作区自定义 | ⏳ 框架已建,待完善 |
214
+ | **工作区自动检测** | 在工作区目录直接运行 | ✅ |
215
+ | **精简 `createpdf.py`** | 仅保留复杂自定义场景 | ✅ |
216
+ | **调试增强** | `show-config`, `dry-run` | ✅ |
217
+
218
+ ### 待办事项
219
+
220
+ 1. ⏳ `--removelink` 参数传递给底层函数
221
+ 2. ⏳ `tc_convert` 插件独立实现
222
+ 3. ⏳ `remove_links` 插件独立实现
223
+ 4. ⏳ 插件动态加载机制完善
@@ -0,0 +1,73 @@
1
+
2
+ ### mark2pdf CLI 重构方案(2025-12-31 执行结果)
3
+
4
+ **核心目标**: 降低 `cli.py` 复杂度,实现关注点分离(UI、配置、逻辑构建、执行),并将配置管理职责明确化。
5
+
6
+ #### 1. 模块拆分与职能重定义 (已实施)
7
+
8
+ * **`src/mark2pdf/cli.py` (指挥官)**
9
+ * **职责**: 解析参数 -> 调用 `process_builder` 组装逻辑 -> 调用 `reporter` 显示配置 -> 调用 `conversion` 执行。
10
+ * **保留**: `main`, `convert`, `version` 命令定义。
11
+ * **变更**: `init`, `update`, `imageclearing` 命令已下沉至 `commands/` 子包。
12
+
13
+ * **`src/mark2pdf/config_loader.py` (配置加载)**
14
+ * **来源**: 原 `manager.py` 的重命名与精简。
15
+ * **职责**:
16
+ 1. `ConfigManager.load()`: 加载 `mark2pdf.config.toml`。
17
+ 2. `load_frontmatter_yaml`: 加载默认 frontmatter。
18
+ 3. `resolve_template`: 模板决策逻辑。
19
+ * **状态**: 完成。并未实现单一的 `build_execution_context` 函数,而是保持了灵活的函数调用组合,以适应 Click 的参数处理方式。
20
+
21
+ * **`src/mark2pdf/workspace_manager.py` (工作区管理)**
22
+ * **来源**: 从原 `manager.py` 拆分。
23
+ * **职责**: `init_workspace`, `update_workspace`, `detect_workspace`。
24
+ * **状态**: 完成。
25
+
26
+ * **`src/mark2pdf/process_builder.py` (逻辑组装)**
27
+ * **职责**: 接收插件名称列表,动态组装后处理器链。
28
+ * **API**: `build_postprocessor_chain`, `get_processor_names_from_flags`。
29
+ * **状态**: 完成。
30
+
31
+ * **`src/mark2pdf/reporter.py` (UI展示)**
32
+ * **职责**: 负责 `--show-config`, `--dry-run` 的终端输出。
33
+ * **API**: `print_config_report`, `print_execution_plan`。
34
+ * **状态**: 完成。
35
+
36
+ * **`src/mark2pdf/conversion.py` (执行)**
37
+ * **改进**: 移除内部 `ConfigManager.load()` 调用,改为使用 `config_loader` 提供的工具函数获取配置。
38
+ * **状态**: 完成。
39
+
40
+ * **`src/mark2pdf/commands/` (子命令包)**
41
+ * **新增内容**:
42
+ * `workspace.py`: 包含 `init`, `update` 命令。
43
+ * `image.py`: 包含 `imageclearing` 命令。
44
+ * **状态**: 完成。
45
+
46
+ #### 2. 数据流向图
47
+
48
+ ```text
49
+ CLI Args (cli.py / commands/*.py)
50
+ |
51
+ +---> [process_builder] (组装插件)
52
+ |
53
+ +---> [config_loader] (加载配置)
54
+ |
55
+ v
56
+ [reporter] (显示配置/计划)
57
+ |
58
+ v
59
+ [conversion] (执行转换) --> Output PDF
60
+ ```
61
+
62
+ #### 3. 实施路径回顾
63
+
64
+ 1. **拆分**: `manager.py` -> `config_loader.py` + `workspace_manager.py`。
65
+ 2. **新建**: `process_builder.py`, `reporter.py`, `utils.py`。
66
+ 3. **子命令下沉**: 建立 `commands/` 子包,迁移非核心命令。
67
+ 4. **组装**: `cli.py` 负责串联,`__init__.py` 维护导出接口。
68
+ 5. **验证**: 单元测试覆盖率 100% (34 passed)。
69
+
70
+ #### 4. 优势
71
+ * **关注点分离**: 配置、业务、UI、命令定义彻底解耦。
72
+ * **可扩展性**: 新增命令只需在 `commands/` 下添加并注册。
73
+ * **可维护性**: 每个模块行数适中,职责单一。