agent-markdown-pdf 0.2.1__tar.gz → 0.2.2__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 (93) hide show
  1. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/PKG-INFO +19 -31
  2. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/README.md +18 -30
  3. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/agent_markdown_pdf.egg-info/PKG-INFO +19 -31
  4. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/core/doctor.py +38 -16
  5. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/core/fonts.py +21 -2
  6. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/skills/SKILL.md +6 -2
  7. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/pyproject.toml +1 -1
  8. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/tests/test_core.py +69 -4
  9. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/LICENSE +0 -0
  10. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/agent_markdown_pdf.egg-info/SOURCES.txt +0 -0
  11. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/agent_markdown_pdf.egg-info/dependency_links.txt +0 -0
  12. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/agent_markdown_pdf.egg-info/entry_points.txt +0 -0
  13. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/agent_markdown_pdf.egg-info/requires.txt +0 -0
  14. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/agent_markdown_pdf.egg-info/top_level.txt +0 -0
  15. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/__init__.py +0 -0
  16. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/__main__.py +0 -0
  17. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/api.py +0 -0
  18. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/core/__init__.py +0 -0
  19. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/core/html.py +0 -0
  20. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/core/inline.py +0 -0
  21. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/core/katex.py +0 -0
  22. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/core/markdown.py +0 -0
  23. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/core/mermaid.py +0 -0
  24. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/core/obsidian.py +0 -0
  25. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/core/pdf.py +0 -0
  26. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/mdtopdf_cli.py +0 -0
  27. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/themes/default.css +0 -0
  28. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/LICENSE +0 -0
  29. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/contrib/mhchem.min.js +0 -0
  30. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
  31. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
  32. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  33. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  34. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  35. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  36. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  37. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  38. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  39. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  40. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  41. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  42. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  43. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  44. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  45. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
  46. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Main-Bold.woff +0 -0
  47. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
  48. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  49. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  50. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  51. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
  52. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Main-Italic.woff +0 -0
  53. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
  54. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
  55. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Main-Regular.woff +0 -0
  56. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
  57. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  58. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  59. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  60. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
  61. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Math-Italic.woff +0 -0
  62. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
  63. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  64. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  65. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  66. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  67. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  68. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  69. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  70. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  71. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  72. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
  73. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Script-Regular.woff +0 -0
  74. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
  75. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
  76. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
  77. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  78. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
  79. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
  80. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  81. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
  82. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
  83. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  84. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
  85. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
  86. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  87. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  88. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  89. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  90. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/katex.min.css +0 -0
  91. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/mdtopdf/vendor/katex/dist/katex.min.js +0 -0
  92. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/setup.cfg +0 -0
  93. {agent_markdown_pdf-0.2.1 → agent_markdown_pdf-0.2.2}/tests/test_full_e2e.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-markdown-pdf
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Agent-friendly Markdown-to-PDF CLI with HTML preview and JSON diagnostics
5
5
  Author: rainp
6
6
  License-Expression: MIT
@@ -326,28 +326,25 @@ and macOS package managers usually provide them through system packages.
326
326
  The default theme uses a PDFium-safe Latin-first font stack. Latin fonts are
327
327
  listed before CJK fonts so ASCII digits, dates, versions, and page numbers are
328
328
  not embedded into CJK font subsets that some Chrome/PDFium renderers handle
329
- poorly. Chinese text still falls back to the CJK side of the stack, where
330
- `Microsoft YaHei` is the first preferred CJK font. If it is missing, the theme
331
- falls back to `PingFang SC`, `Noto Sans SC`, `Noto Sans CJK SC`,
332
- `Source Han Sans SC`, and other available CJK fonts.
329
+ poorly. Chinese text still falls back to the CJK side of the stack.
333
330
 
334
- For Linux containers or agent sandboxes, install fontconfig plus the fonts you
335
- expect the default theme to use. A practical open-font baseline is:
331
+ For Linux containers or agent sandboxes, use open fonts that can be installed
332
+ from the distribution package manager. The recommended baseline is:
336
333
 
337
334
  ```shell
338
335
  sudo apt-get install -y --no-install-recommends \
339
336
  fontconfig \
340
- fonts-noto-cjk \
341
337
  fonts-liberation \
342
- fonts-dejavu-core
338
+ fonts-dejavu-core \
339
+ fonts-noto-cjk \
340
+ fonts-stix
343
341
  fc-cache -f
344
342
  ```
345
343
 
346
- This baseline is a fallback. If you want Linux Chinese typography to match the
347
- default Windows output more closely, provide `Microsoft YaHei` in the runtime
348
- under your own font license. `mdtopdf` names that font in CSS but does not
349
- bundle or download Microsoft font files. Providing Microsoft YaHei improves the
350
- Chinese fallback; the Latin-first order is still kept for PDFium-safe digits.
344
+ With that setup, Linux output uses `Liberation Sans` / `DejaVu Sans` for Latin
345
+ text and digits, `Noto Sans CJK SC` for Chinese, and STIX for math fallback.
346
+ Microsoft YaHei and Segoe UI Emoji are not Linux runtime requirements and are
347
+ not installed or distributed by `mdtopdf`.
351
348
 
352
349
  Code blocks prefer `Cascadia Mono` / `Cascadia Code`, then `Consolas`,
353
350
  `Noto Sans Mono CJK SC`, `Liberation Mono`, and `DejaVu Sans Mono`. On Debian,
@@ -355,20 +352,10 @@ Code blocks prefer `Cascadia Mono` / `Cascadia Code`, then `Consolas`,
355
352
  Cascadia Code yourself or let the theme fall back to the installed monospace
356
353
  fonts.
357
354
 
358
- Emoji are rendered through the system emoji font. The default theme prefers
359
- `Segoe UI Emoji` for emoji spans on every platform, including Linux. Windows
360
- usually provides it; Linux containers only get the same glyphs if the runtime
361
- provides that font. If Segoe UI Emoji is not available, the theme falls back to
362
- `Apple Color Emoji`, `Noto Emoji`, `Noto Color Emoji`, and other installed emoji
363
- fonts. Whether the final PDF keeps color emoji still depends on WeasyPrint,
364
- Pango/Cairo, and the PDF viewer.
365
-
366
- Optional fallback fonts:
367
-
368
- ```shell
369
- sudo apt-get install -y --no-install-recommends fonts-noto-color-emoji fonts-stix
370
- fc-cache -f
371
- ```
355
+ Emoji are rendered through the system emoji font. On Linux, prefer monochrome
356
+ `Noto Emoji` for stable PDF layout. `Noto Color Emoji` is easier to install from
357
+ many distro package managers and is safe to use as a fallback, but color emoji
358
+ often render too small or misaligned in WeasyPrint/Pango/Cairo/PDFium output.
372
359
 
373
360
  On Windows, install the native libraries separately. A common MSYS2 setup is:
374
361
 
@@ -419,6 +406,7 @@ MIT. Bundled KaTeX assets are also distributed under the MIT license; see
419
406
 
420
407
  `mdtopdf` does not bundle CJK body fonts, emoji fonts, or proprietary system
421
408
  fonts. The default theme references local system fonts such as Segoe UI,
422
- Microsoft YaHei, PingFang SC, Segoe UI Emoji, Noto Emoji, Noto Color Emoji,
423
- Cascadia Code, and Consolas, but those font files come from the user's operating
424
- system or runtime environment.
409
+ Microsoft YaHei, PingFang SC, Segoe UI Emoji, Noto Sans CJK SC,
410
+ Noto Emoji, Noto Color Emoji, Cascadia Code, and Consolas, but those font files come from
411
+ the user's operating system or runtime environment. Public Linux images should
412
+ prefer the open-font baseline above.
@@ -285,28 +285,25 @@ and macOS package managers usually provide them through system packages.
285
285
  The default theme uses a PDFium-safe Latin-first font stack. Latin fonts are
286
286
  listed before CJK fonts so ASCII digits, dates, versions, and page numbers are
287
287
  not embedded into CJK font subsets that some Chrome/PDFium renderers handle
288
- poorly. Chinese text still falls back to the CJK side of the stack, where
289
- `Microsoft YaHei` is the first preferred CJK font. If it is missing, the theme
290
- falls back to `PingFang SC`, `Noto Sans SC`, `Noto Sans CJK SC`,
291
- `Source Han Sans SC`, and other available CJK fonts.
288
+ poorly. Chinese text still falls back to the CJK side of the stack.
292
289
 
293
- For Linux containers or agent sandboxes, install fontconfig plus the fonts you
294
- expect the default theme to use. A practical open-font baseline is:
290
+ For Linux containers or agent sandboxes, use open fonts that can be installed
291
+ from the distribution package manager. The recommended baseline is:
295
292
 
296
293
  ```shell
297
294
  sudo apt-get install -y --no-install-recommends \
298
295
  fontconfig \
299
- fonts-noto-cjk \
300
296
  fonts-liberation \
301
- fonts-dejavu-core
297
+ fonts-dejavu-core \
298
+ fonts-noto-cjk \
299
+ fonts-stix
302
300
  fc-cache -f
303
301
  ```
304
302
 
305
- This baseline is a fallback. If you want Linux Chinese typography to match the
306
- default Windows output more closely, provide `Microsoft YaHei` in the runtime
307
- under your own font license. `mdtopdf` names that font in CSS but does not
308
- bundle or download Microsoft font files. Providing Microsoft YaHei improves the
309
- Chinese fallback; the Latin-first order is still kept for PDFium-safe digits.
303
+ With that setup, Linux output uses `Liberation Sans` / `DejaVu Sans` for Latin
304
+ text and digits, `Noto Sans CJK SC` for Chinese, and STIX for math fallback.
305
+ Microsoft YaHei and Segoe UI Emoji are not Linux runtime requirements and are
306
+ not installed or distributed by `mdtopdf`.
310
307
 
311
308
  Code blocks prefer `Cascadia Mono` / `Cascadia Code`, then `Consolas`,
312
309
  `Noto Sans Mono CJK SC`, `Liberation Mono`, and `DejaVu Sans Mono`. On Debian,
@@ -314,20 +311,10 @@ Code blocks prefer `Cascadia Mono` / `Cascadia Code`, then `Consolas`,
314
311
  Cascadia Code yourself or let the theme fall back to the installed monospace
315
312
  fonts.
316
313
 
317
- Emoji are rendered through the system emoji font. The default theme prefers
318
- `Segoe UI Emoji` for emoji spans on every platform, including Linux. Windows
319
- usually provides it; Linux containers only get the same glyphs if the runtime
320
- provides that font. If Segoe UI Emoji is not available, the theme falls back to
321
- `Apple Color Emoji`, `Noto Emoji`, `Noto Color Emoji`, and other installed emoji
322
- fonts. Whether the final PDF keeps color emoji still depends on WeasyPrint,
323
- Pango/Cairo, and the PDF viewer.
324
-
325
- Optional fallback fonts:
326
-
327
- ```shell
328
- sudo apt-get install -y --no-install-recommends fonts-noto-color-emoji fonts-stix
329
- fc-cache -f
330
- ```
314
+ Emoji are rendered through the system emoji font. On Linux, prefer monochrome
315
+ `Noto Emoji` for stable PDF layout. `Noto Color Emoji` is easier to install from
316
+ many distro package managers and is safe to use as a fallback, but color emoji
317
+ often render too small or misaligned in WeasyPrint/Pango/Cairo/PDFium output.
331
318
 
332
319
  On Windows, install the native libraries separately. A common MSYS2 setup is:
333
320
 
@@ -378,6 +365,7 @@ MIT. Bundled KaTeX assets are also distributed under the MIT license; see
378
365
 
379
366
  `mdtopdf` does not bundle CJK body fonts, emoji fonts, or proprietary system
380
367
  fonts. The default theme references local system fonts such as Segoe UI,
381
- Microsoft YaHei, PingFang SC, Segoe UI Emoji, Noto Emoji, Noto Color Emoji,
382
- Cascadia Code, and Consolas, but those font files come from the user's operating
383
- system or runtime environment.
368
+ Microsoft YaHei, PingFang SC, Segoe UI Emoji, Noto Sans CJK SC,
369
+ Noto Emoji, Noto Color Emoji, Cascadia Code, and Consolas, but those font files come from
370
+ the user's operating system or runtime environment. Public Linux images should
371
+ prefer the open-font baseline above.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-markdown-pdf
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Agent-friendly Markdown-to-PDF CLI with HTML preview and JSON diagnostics
5
5
  Author: rainp
6
6
  License-Expression: MIT
@@ -326,28 +326,25 @@ and macOS package managers usually provide them through system packages.
326
326
  The default theme uses a PDFium-safe Latin-first font stack. Latin fonts are
327
327
  listed before CJK fonts so ASCII digits, dates, versions, and page numbers are
328
328
  not embedded into CJK font subsets that some Chrome/PDFium renderers handle
329
- poorly. Chinese text still falls back to the CJK side of the stack, where
330
- `Microsoft YaHei` is the first preferred CJK font. If it is missing, the theme
331
- falls back to `PingFang SC`, `Noto Sans SC`, `Noto Sans CJK SC`,
332
- `Source Han Sans SC`, and other available CJK fonts.
329
+ poorly. Chinese text still falls back to the CJK side of the stack.
333
330
 
334
- For Linux containers or agent sandboxes, install fontconfig plus the fonts you
335
- expect the default theme to use. A practical open-font baseline is:
331
+ For Linux containers or agent sandboxes, use open fonts that can be installed
332
+ from the distribution package manager. The recommended baseline is:
336
333
 
337
334
  ```shell
338
335
  sudo apt-get install -y --no-install-recommends \
339
336
  fontconfig \
340
- fonts-noto-cjk \
341
337
  fonts-liberation \
342
- fonts-dejavu-core
338
+ fonts-dejavu-core \
339
+ fonts-noto-cjk \
340
+ fonts-stix
343
341
  fc-cache -f
344
342
  ```
345
343
 
346
- This baseline is a fallback. If you want Linux Chinese typography to match the
347
- default Windows output more closely, provide `Microsoft YaHei` in the runtime
348
- under your own font license. `mdtopdf` names that font in CSS but does not
349
- bundle or download Microsoft font files. Providing Microsoft YaHei improves the
350
- Chinese fallback; the Latin-first order is still kept for PDFium-safe digits.
344
+ With that setup, Linux output uses `Liberation Sans` / `DejaVu Sans` for Latin
345
+ text and digits, `Noto Sans CJK SC` for Chinese, and STIX for math fallback.
346
+ Microsoft YaHei and Segoe UI Emoji are not Linux runtime requirements and are
347
+ not installed or distributed by `mdtopdf`.
351
348
 
352
349
  Code blocks prefer `Cascadia Mono` / `Cascadia Code`, then `Consolas`,
353
350
  `Noto Sans Mono CJK SC`, `Liberation Mono`, and `DejaVu Sans Mono`. On Debian,
@@ -355,20 +352,10 @@ Code blocks prefer `Cascadia Mono` / `Cascadia Code`, then `Consolas`,
355
352
  Cascadia Code yourself or let the theme fall back to the installed monospace
356
353
  fonts.
357
354
 
358
- Emoji are rendered through the system emoji font. The default theme prefers
359
- `Segoe UI Emoji` for emoji spans on every platform, including Linux. Windows
360
- usually provides it; Linux containers only get the same glyphs if the runtime
361
- provides that font. If Segoe UI Emoji is not available, the theme falls back to
362
- `Apple Color Emoji`, `Noto Emoji`, `Noto Color Emoji`, and other installed emoji
363
- fonts. Whether the final PDF keeps color emoji still depends on WeasyPrint,
364
- Pango/Cairo, and the PDF viewer.
365
-
366
- Optional fallback fonts:
367
-
368
- ```shell
369
- sudo apt-get install -y --no-install-recommends fonts-noto-color-emoji fonts-stix
370
- fc-cache -f
371
- ```
355
+ Emoji are rendered through the system emoji font. On Linux, prefer monochrome
356
+ `Noto Emoji` for stable PDF layout. `Noto Color Emoji` is easier to install from
357
+ many distro package managers and is safe to use as a fallback, but color emoji
358
+ often render too small or misaligned in WeasyPrint/Pango/Cairo/PDFium output.
372
359
 
373
360
  On Windows, install the native libraries separately. A common MSYS2 setup is:
374
361
 
@@ -419,6 +406,7 @@ MIT. Bundled KaTeX assets are also distributed under the MIT license; see
419
406
 
420
407
  `mdtopdf` does not bundle CJK body fonts, emoji fonts, or proprietary system
421
408
  fonts. The default theme references local system fonts such as Segoe UI,
422
- Microsoft YaHei, PingFang SC, Segoe UI Emoji, Noto Emoji, Noto Color Emoji,
423
- Cascadia Code, and Consolas, but those font files come from the user's operating
424
- system or runtime environment.
409
+ Microsoft YaHei, PingFang SC, Segoe UI Emoji, Noto Sans CJK SC,
410
+ Noto Emoji, Noto Color Emoji, Cascadia Code, and Consolas, but those font files come from
411
+ the user's operating system or runtime environment. Public Linux images should
412
+ prefer the open-font baseline above.
@@ -52,10 +52,11 @@ def run_doctor() -> dict[str, Any]:
52
52
 
53
53
  add_weasyprint_dll_directories()
54
54
 
55
+ platform_system = platform.system()
55
56
  result: dict[str, Any] = {
56
57
  "ok": False,
57
58
  "platform": {
58
- "system": platform.system(),
59
+ "system": platform_system,
59
60
  "release": platform.release(),
60
61
  "machine": platform.machine(),
61
62
  },
@@ -69,7 +70,7 @@ def run_doctor() -> dict[str, Any]:
69
70
  "packages": {},
70
71
  "tools": {},
71
72
  "native_libraries": _inspect_native_libraries(),
72
- "fonts": _inspect_fonts(),
73
+ "fonts": _inspect_fonts(platform_system),
73
74
  "recommendations": [],
74
75
  }
75
76
 
@@ -211,8 +212,8 @@ def _env_dll_directories() -> list[str]:
211
212
  return [part.strip() for part in raw.split(os.pathsep) if part.strip()]
212
213
 
213
214
 
214
- def _inspect_fonts() -> dict[str, Any]:
215
- return inspect_recommended_font_groups()
215
+ def _inspect_fonts(platform_system: str | None = None) -> dict[str, Any]:
216
+ return inspect_recommended_font_groups(platform_system)
216
217
 
217
218
 
218
219
  def _inspect_fontconfig() -> dict[str, Any]:
@@ -283,15 +284,15 @@ def _recommendations(result: dict[str, Any]) -> list[str]:
283
284
  "On Debian or Ubuntu, use: sudo apt-get install fonts-liberation fonts-dejavu-core"
284
285
  )
285
286
  if font_groups.get("cjk_sans") and not font_groups["cjk_sans"].get("ok"):
286
- recommendations.append(
287
- "Provide Microsoft YaHei in the runtime to match the default theme's Windows-like Chinese typography. "
288
- "On Debian or Ubuntu, Noto CJK is a supported fallback: sudo apt-get install fonts-noto-cjk"
289
- )
290
- elif is_linux and font_groups.get("cjk_sans") and "Microsoft YaHei" in font_groups["cjk_sans"].get("missing", []):
291
- recommendations.append(
292
- "Optional: provide Microsoft YaHei in the Linux runtime to match the default theme's Windows-like "
293
- "Chinese typography. Without it, output falls back to installed CJK fonts such as Noto CJK."
294
- )
287
+ if is_linux:
288
+ recommendations.append(
289
+ "Install Noto CJK for Chinese text on Linux: sudo apt-get install fonts-noto-cjk"
290
+ )
291
+ else:
292
+ recommendations.append(
293
+ "Install or enable a CJK sans font for Chinese text, such as Microsoft YaHei, "
294
+ "PingFang SC, Noto Sans CJK SC, or Source Han Sans SC."
295
+ )
295
296
  if font_groups.get("monospace") and not font_groups["monospace"].get("ok"):
296
297
  recommendations.append(
297
298
  "Install a monospace font for code blocks. On Debian or Ubuntu, use: "
@@ -314,11 +315,32 @@ def _recommendations(result: dict[str, Any]) -> list[str]:
314
315
  "Optional: install STIX fonts for math fallback, for example: sudo apt-get install fonts-stix"
315
316
  )
316
317
  if font_groups.get("emoji") and not font_groups["emoji"].get("ok"):
318
+ if is_linux:
319
+ recommendations.append(
320
+ "Provide a monochrome emoji font such as Noto Emoji for stable PDF output on Linux. "
321
+ "Noto Color Emoji is widely packaged, but PDF viewers can render color emoji too small "
322
+ "or misaligned."
323
+ )
324
+ else:
325
+ recommendations.append(
326
+ "Install or enable a system emoji font such as Segoe UI Emoji, Apple Color Emoji, "
327
+ "Noto Color Emoji, or Twemoji Mozilla."
328
+ )
329
+ elif (
330
+ is_linux
331
+ and font_groups.get("emoji")
332
+ and "Noto Emoji" in font_groups["emoji"].get("missing", [])
333
+ and "Noto Color Emoji" in font_groups["emoji"].get("found", [])
334
+ ):
317
335
  recommendations.append(
318
- "Provide Segoe UI Emoji in the runtime if you want the default theme's first-choice "
319
- "emoji glyphs. If that is not available, install another emoji font and run fc-cache -f."
336
+ "Noto Color Emoji was found. It provides glyph coverage, but color emoji can render too small "
337
+ "or misaligned in WeasyPrint/PDFium output. Prefer monochrome Noto Emoji if emoji layout matters."
320
338
  )
321
- elif font_groups.get("emoji") and "Segoe UI Emoji" in font_groups["emoji"].get("missing", []):
339
+ elif (
340
+ not is_linux
341
+ and font_groups.get("emoji")
342
+ and "Segoe UI Emoji" in font_groups["emoji"].get("missing", [])
343
+ ):
322
344
  recommendations.append(
323
345
  "Optional: provide Segoe UI Emoji if you want the default theme's preferred emoji glyphs. "
324
346
  "Existing emoji fallback fonts will still be used."
@@ -91,6 +91,14 @@ RECOMMENDED_FONT_GROUPS = {
91
91
  ),
92
92
  },
93
93
  }
94
+ PLATFORM_PREFERRED_FONT_GROUPS = {
95
+ "Linux": {
96
+ "latin_sans": ("Liberation Sans", "DejaVu Sans"),
97
+ "cjk_sans": ("Noto Sans CJK SC", "Noto Sans SC"),
98
+ "math": ("STIXGeneral", "STIX Two Math"),
99
+ "emoji": ("Noto Emoji",),
100
+ },
101
+ }
94
102
  CJK_CAPABLE_FONT_FAMILIES = (
95
103
  "Noto Sans SC",
96
104
  "Noto Sans CJK SC",
@@ -136,7 +144,7 @@ def match_font_name(family: str, available: set[str]) -> str | None:
136
144
  return None
137
145
 
138
146
 
139
- def inspect_recommended_font_groups() -> dict[str, Any]:
147
+ def inspect_recommended_font_groups(platform_system: str | None = None) -> dict[str, Any]:
140
148
  result: dict[str, Any] = {
141
149
  "ok": False,
142
150
  "backend": "matplotlib.font_manager",
@@ -153,7 +161,7 @@ def inspect_recommended_font_groups() -> dict[str, Any]:
153
161
  fontconfig_emoji = _fontconfig_emoji_match()
154
162
  for group_name, group in RECOMMENDED_FONT_GROUPS.items():
155
163
  recommended = list(group["families"])
156
- preferred = list(group.get("preferred", group["families"][:1]))
164
+ preferred = list(_preferred_families(group_name, group, platform_system))
157
165
  found = []
158
166
  for family in recommended:
159
167
  match = match_font_name(family, available)
@@ -180,6 +188,17 @@ def inspect_recommended_font_groups() -> dict[str, Any]:
180
188
  return result
181
189
 
182
190
 
191
+ def _preferred_families(
192
+ group_name: str,
193
+ group: dict[str, Any],
194
+ platform_system: str | None,
195
+ ) -> tuple[str, ...]:
196
+ platform_preferred = PLATFORM_PREFERRED_FONT_GROUPS.get(platform_system or "", {})
197
+ if isinstance(platform_preferred, dict) and group_name in platform_preferred:
198
+ return platform_preferred[group_name]
199
+ return group.get("preferred", group["families"][:1])
200
+
201
+
183
202
  def inspect_css_font_usage(css: str, *, document_text: str | None = None) -> dict[str, Any]:
184
203
  result: dict[str, Any] = {
185
204
  "ok": True,
@@ -75,15 +75,19 @@ apt-get install -y --no-install-recommends \
75
75
  shared-mime-info \
76
76
  fonts-liberation \
77
77
  fonts-dejavu-core \
78
- fonts-noto-cjk
78
+ fonts-noto-cjk \
79
+ fonts-stix
79
80
  fc-cache -f
80
81
  ```
81
82
 
83
+ For emoji-heavy documents on Linux, prefer a monochrome emoji font such as
84
+ Noto Emoji. `fonts-noto-color-emoji` is a fallback, but it can render too small
85
+ or misaligned in PDF viewers.
86
+
82
87
  Install optional support only when needed:
83
88
 
84
89
  ```shell
85
90
  npm install -g @mermaid-js/mermaid-cli
86
- apt-get install -y --no-install-recommends fonts-stix fonts-noto-color-emoji
87
91
  ```
88
92
 
89
93
  Use Cascadia Code for closer default code-block styling when available:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agent-markdown-pdf"
7
- version = "0.2.1"
7
+ version = "0.2.2"
8
8
  description = "Agent-friendly Markdown-to-PDF CLI with HTML preview and JSON diagnostics"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1191,7 +1191,7 @@ def test_doctor_font_groups_match_default_theme_font_fallbacks(monkeypatch):
1191
1191
  lambda: {"ok": False, "families": [], "file": None, "error": "not found"},
1192
1192
  )
1193
1193
 
1194
- result = doctor._inspect_fonts()
1194
+ result = doctor._inspect_fonts("Windows")
1195
1195
 
1196
1196
  assert result["ok"] is True
1197
1197
  assert result["groups"]["latin_sans"]["found"] == ["Arial"]
@@ -1206,7 +1206,37 @@ def test_doctor_font_groups_match_default_theme_font_fallbacks(monkeypatch):
1206
1206
  assert result["groups"]["emoji"]["found"] == ["Segoe UI Emoji"]
1207
1207
 
1208
1208
 
1209
- def test_doctor_linux_recommends_windows_like_preferred_fonts():
1209
+ def test_doctor_linux_font_groups_prefer_open_font_baseline(monkeypatch):
1210
+ monkeypatch.setattr(
1211
+ fonts_core,
1212
+ "available_font_names",
1213
+ lambda: {
1214
+ "Liberation Sans",
1215
+ "DejaVu Sans",
1216
+ "Noto Sans CJK SC",
1217
+ "Cascadia Mono",
1218
+ "STIXGeneral",
1219
+ "Noto Emoji",
1220
+ "Noto Color Emoji",
1221
+ },
1222
+ )
1223
+ monkeypatch.setattr(
1224
+ fonts_core,
1225
+ "_fontconfig_emoji_match",
1226
+ lambda: {"ok": True, "families": ["Noto Color Emoji"], "file": None, "error": None},
1227
+ )
1228
+
1229
+ result = doctor._inspect_fonts("Linux")
1230
+
1231
+ assert result["groups"]["latin_sans"]["preferred"] == ["Liberation Sans", "DejaVu Sans"]
1232
+ assert result["groups"]["cjk_sans"]["preferred"] == ["Noto Sans CJK SC", "Noto Sans SC"]
1233
+ assert result["groups"]["emoji"]["preferred"] == ["Noto Emoji"]
1234
+ assert result["groups"]["latin_sans"]["preferred_found"] is True
1235
+ assert result["groups"]["cjk_sans"]["preferred_found"] is True
1236
+ assert result["groups"]["emoji"]["preferred_found"] is True
1237
+
1238
+
1239
+ def test_doctor_linux_accepts_open_font_baseline_without_microsoft_recommendations():
1210
1240
  result = {
1211
1241
  "ok": True,
1212
1242
  "platform": {"system": "Linux"},
@@ -1238,15 +1268,17 @@ def test_doctor_linux_recommends_windows_like_preferred_fonts():
1238
1268
  "missing": ["Cascadia Mono", "Cascadia Code"],
1239
1269
  },
1240
1270
  "math": {"ok": True, "found": ["STIXGeneral"], "missing": ["Cambria Math"]},
1241
- "emoji": {"ok": True, "found": ["Noto Color Emoji"], "missing": ["Segoe UI Emoji"]},
1271
+ "emoji": {"ok": True, "found": ["Noto Color Emoji"], "missing": ["Segoe UI Emoji", "Noto Emoji"]},
1242
1272
  }
1243
1273
  },
1244
1274
  }
1245
1275
 
1246
1276
  recommendations = doctor._recommendations(result)
1247
1277
 
1248
- assert any("Microsoft YaHei" in item and "Windows-like" in item for item in recommendations)
1278
+ assert not any("Microsoft YaHei" in item for item in recommendations)
1279
+ assert not any("Segoe UI Emoji" in item for item in recommendations)
1249
1280
  assert any("Cascadia Code" in item and "code blocks" in item for item in recommendations)
1281
+ assert any("Noto Color Emoji" in item and "Noto Emoji" in item for item in recommendations)
1250
1282
 
1251
1283
 
1252
1284
  def test_doctor_linux_recommends_fontconfig_when_missing():
@@ -1309,6 +1341,39 @@ def test_doctor_recommends_latin_fonts_when_missing():
1309
1341
  assert any("Latin sans" in item and "digits" in item for item in recommendations)
1310
1342
 
1311
1343
 
1344
+ def test_doctor_linux_recommends_noto_fonts_when_cjk_or_emoji_missing():
1345
+ result = {
1346
+ "ok": True,
1347
+ "platform": {"system": "Linux"},
1348
+ "packages": {
1349
+ "weasyprint": {"ok": True},
1350
+ "mini-racer": {"ok": True},
1351
+ "latex2mathml": {"ok": True},
1352
+ "matplotlib": {"ok": True},
1353
+ },
1354
+ "tools": {
1355
+ "mermaid": {"ok": True},
1356
+ "fontconfig": {"ok": True},
1357
+ },
1358
+ "fonts": {
1359
+ "groups": {
1360
+ "latin_sans": {"ok": True, "found": ["Liberation Sans"], "missing": []},
1361
+ "cjk_sans": {"ok": False, "found": [], "missing": ["Noto Sans CJK SC"]},
1362
+ "monospace": {"ok": True, "found": ["Cascadia Code"], "missing": []},
1363
+ "math": {"ok": True, "found": ["STIXGeneral"], "missing": []},
1364
+ "emoji": {"ok": False, "found": [], "missing": ["Noto Emoji"]},
1365
+ }
1366
+ },
1367
+ }
1368
+
1369
+ recommendations = doctor._recommendations(result)
1370
+
1371
+ assert any("fonts-noto-cjk" in item for item in recommendations)
1372
+ assert any("Noto Emoji" in item and "monochrome" in item for item in recommendations)
1373
+ assert not any("Microsoft YaHei" in item for item in recommendations)
1374
+ assert not any("Segoe UI Emoji" in item for item in recommendations)
1375
+
1376
+
1312
1377
  def test_doctor_reports_missing_mini_racer(monkeypatch):
1313
1378
  real_import = importlib.import_module
1314
1379