streamtex 0.7.76__tar.gz → 0.7.77__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 (194) hide show
  1. {streamtex-0.7.76/streamtex.egg-info → streamtex-0.7.77}/PKG-INFO +1 -1
  2. {streamtex-0.7.76 → streamtex-0.7.77}/pyproject.toml +1 -1
  3. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/release_cmd.py +4 -2
  4. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/deploy/stx_auth.py +1 -1
  5. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/media.py +14 -1
  6. {streamtex-0.7.76 → streamtex-0.7.77/streamtex.egg-info}/PKG-INFO +1 -1
  7. {streamtex-0.7.76 → streamtex-0.7.77}/LICENSE +0 -0
  8. {streamtex-0.7.76 → streamtex-0.7.77}/MANIFEST.in +0 -0
  9. {streamtex-0.7.76 → streamtex-0.7.77}/README.md +0 -0
  10. {streamtex-0.7.76 → streamtex-0.7.77}/setup.cfg +0 -0
  11. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/__init__.py +0 -0
  12. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/__main__.py +0 -0
  13. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/ai/__init__.py +0 -0
  14. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/ai/config.py +0 -0
  15. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/ai/generate.py +0 -0
  16. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/ai/history.py +0 -0
  17. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/ai/metadata.py +0 -0
  18. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/ai/providers/__init__.py +0 -0
  19. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/ai/providers/base.py +0 -0
  20. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/ai/providers/fal.py +0 -0
  21. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/ai/providers/google.py +0 -0
  22. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/ai/providers/openai.py +0 -0
  23. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/ai/providers/registry.py +0 -0
  24. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/auth.py +0 -0
  25. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/banner.py +0 -0
  26. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/bib.py +0 -0
  27. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/bib_preview.py +0 -0
  28. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/block_helpers.py +0 -0
  29. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/blocks.py +0 -0
  30. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/book.py +0 -0
  31. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/browser.py +0 -0
  32. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/__init__.py +0 -0
  33. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/_claude_files.py +0 -0
  34. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/_divergence.py +0 -0
  35. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/_install_local_packs.py +0 -0
  36. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/_shared.py +0 -0
  37. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/_stx_toml.py +0 -0
  38. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/_toml_helpers.py +0 -0
  39. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/artifact_cmd.py +0 -0
  40. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/bib_cmd.py +0 -0
  41. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/build_check.py +0 -0
  42. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/cache_cmd.py +0 -0
  43. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/claude_cmd.py +0 -0
  44. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/claude_global.py +0 -0
  45. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/claude_project.py +0 -0
  46. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/commands.py +0 -0
  47. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/component_cmd.py +0 -0
  48. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/console.py +0 -0
  49. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/coolify.py +0 -0
  50. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/deploy_auth_cmd.py +0 -0
  51. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/deploy_cmd.py +0 -0
  52. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/dev_cmd.py +0 -0
  53. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/dev_config.py +0 -0
  54. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/ds_cmd.py +0 -0
  55. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/export_cmd.py +0 -0
  56. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/install_cmd.py +0 -0
  57. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/kit_cmd.py +0 -0
  58. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/main.py +0 -0
  59. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/migrations/__init__.py +0 -0
  60. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/migrations/base.py +0 -0
  61. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/migrations/compat.py +0 -0
  62. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/migrations/registry.py +0 -0
  63. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/migrations/v0_4_0.py +0 -0
  64. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/migrations/v0_4_6.py +0 -0
  65. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/pack_cmd.py +0 -0
  66. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/project_cmd.py +0 -0
  67. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/project_rules.py +0 -0
  68. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/publish_cmd.py +0 -0
  69. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/published_check.py +0 -0
  70. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/run_cmd.py +0 -0
  71. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/run_set.py +0 -0
  72. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/screenshot_cmd.py +0 -0
  73. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/shortcuts.py +0 -0
  74. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/status_cmd.py +0 -0
  75. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/sync_cmd.py +0 -0
  76. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/upgrade_cmd.py +0 -0
  77. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/validate_cmd.py +0 -0
  78. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/cli/workspace_cmd.py +0 -0
  79. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/code.py +0 -0
  80. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/collection.py +0 -0
  81. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/constants.py +0 -0
  82. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/container.py +0 -0
  83. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/__init__.py +0 -0
  84. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/__init__.py +0 -0
  85. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/_frontmatter.py +0 -0
  86. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/agent.py +0 -0
  87. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/ai_prompt.py +0 -0
  88. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/archetype.py +0 -0
  89. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/asset.py +0 -0
  90. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/discovery.py +0 -0
  91. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/guideline.py +0 -0
  92. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/install.py +0 -0
  93. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/integration.py +0 -0
  94. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/loaders.py +0 -0
  95. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/palette.py +0 -0
  96. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/skill.py +0 -0
  97. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/spec.py +0 -0
  98. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/artifacts/validation.py +0 -0
  99. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/contracts.py +0 -0
  100. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/discovery.py +0 -0
  101. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/core/validation.py +0 -0
  102. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/countdown.py +0 -0
  103. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/deeplink.py +0 -0
  104. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/deploy/__init__.py +0 -0
  105. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/enums.py +0 -0
  106. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/export.py +0 -0
  107. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/export_enrich.py +0 -0
  108. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/export_paginate.py +0 -0
  109. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/export_widgets.py +0 -0
  110. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/facts.py +0 -0
  111. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/grid.py +0 -0
  112. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/gsheet.py +0 -0
  113. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/hover_tooltip.py +0 -0
  114. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/i18n.py +0 -0
  115. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/image.py +0 -0
  116. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/image_crop.py +0 -0
  117. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/image_editor.py +0 -0
  118. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/image_utils.py +0 -0
  119. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/inspector.py +0 -0
  120. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/kept.py +0 -0
  121. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/latex.py +0 -0
  122. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/latex_utils.py +0 -0
  123. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/link_config.py +0 -0
  124. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/link_preview.py +0 -0
  125. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/list.py +0 -0
  126. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/loading.py +0 -0
  127. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/markdown.py +0 -0
  128. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/marker.py +0 -0
  129. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/marker_runtime.py +0 -0
  130. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/media_overlay.py +0 -0
  131. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/mermaid.py +0 -0
  132. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/overlay.py +0 -0
  133. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/pagewalk.py +0 -0
  134. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/pdf_export.py +0 -0
  135. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/plantuml.py +0 -0
  136. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/presentation.py +0 -0
  137. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/presentation_profile.py +0 -0
  138. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/printing.py +0 -0
  139. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/__init__.py +0 -0
  140. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/build.py +0 -0
  141. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/config.py +0 -0
  142. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/coolify.py +0 -0
  143. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/levels.py +0 -0
  144. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/ops.py +0 -0
  145. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/passwords.py +0 -0
  146. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/state.py +0 -0
  147. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/target.py +0 -0
  148. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/templates/live/Dockerfile +0 -0
  149. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/templates/live/entrypoint.sh +0 -0
  150. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/templates/live/nginx.conf +0 -0
  151. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/templates/live/stx-http.conf +0 -0
  152. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/templates/live/supervisord.conf +0 -0
  153. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/templates/static/10-stx-init.sh +0 -0
  154. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/templates/static/20-stx-auth.sh +0 -0
  155. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/templates/static/Dockerfile +0 -0
  156. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/templates/static/closed.html +0 -0
  157. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/templates/static/nginx.conf +0 -0
  158. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/templates/static/stx-http.conf +0 -0
  159. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/release/templates/static/stx_auth.py +0 -0
  160. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/runtime_flags.py +0 -0
  161. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/scripts/__init__.py +0 -0
  162. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/scripts/migrate_curves_to_relative.py +0 -0
  163. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/search.py +0 -0
  164. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/slide.py +0 -0
  165. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/slide_note.py +0 -0
  166. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/space.py +0 -0
  167. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/spacing.py +0 -0
  168. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/static/css/stx_global.css +0 -0
  169. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/static/default.css +0 -0
  170. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/static/js/stx_countdown.js +0 -0
  171. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/static/js/stx_marker_observer.js +0 -0
  172. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/static/js/stx_scroll_spy.js +0 -0
  173. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/static/js/stx_video.js +0 -0
  174. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/static/logo-stx-tiny.png +0 -0
  175. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/static/logo-stx.png +0 -0
  176. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/styles/__init__.py +0 -0
  177. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/styles/base.py +0 -0
  178. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/styles/container.py +0 -0
  179. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/styles/core.py +0 -0
  180. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/styles/scale.py +0 -0
  181. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/styles/scale_curves.toml +0 -0
  182. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/styles/text.py +0 -0
  183. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/styles/visibility.py +0 -0
  184. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/tikz.py +0 -0
  185. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/toc.py +0 -0
  186. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/utils.py +0 -0
  187. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/watch.py +0 -0
  188. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/write.py +0 -0
  189. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex/zoom.py +0 -0
  190. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex.egg-info/SOURCES.txt +0 -0
  191. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex.egg-info/dependency_links.txt +0 -0
  192. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex.egg-info/entry_points.txt +0 -0
  193. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex.egg-info/requires.txt +0 -0
  194. {streamtex-0.7.76 → streamtex-0.7.77}/streamtex.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: streamtex
3
- Version: 0.7.76
3
+ Version: 0.7.77
4
4
  Summary: AI-powered content framework for Streamlit — create presentations, courses, and web-books with Claude or Cursor, no coding required.
5
5
  Author-email: Nicolas Guelfi <nicolas.guelfi@laposte.net>
6
6
  License-Expression: BUSL-1.1
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "streamtex"
7
- version = "0.7.76"
7
+ version = "0.7.77"
8
8
  description = "AI-powered content framework for Streamlit — create presentations, courses, and web-books with Claude or Cursor, no coding required."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -296,7 +296,8 @@ def media_report_cmd(site, show, html_env):
296
296
  """What SITE's live face would serve with `[release] media_per_site = true` (#142), on this machine.
297
297
 
298
298
  Exports SITE's HTML from the commit, as publish does, then sorts its static folder: the files the
299
- export shows and those media_keep names are kept, the others would no longer be served. Nothing is
299
+ export shows or links to under app/static/ and those media_keep names are kept, the others would no
300
+ longer be served. Nothing is
300
301
  sent: the server is not read nor changed."""
301
302
  import tempfile
302
303
  from pathlib import Path
@@ -316,9 +317,10 @@ def media_report_cmd(site, show, html_env):
316
317
  raise ReleaseError(f"{site}: {s.doc_dir}/static is not a folder — the live face serves no media")
317
318
  kept, dropped = sorted(mp.kept), mp.dropped
318
319
  by_export = sum(1 for why in mp.kept.values() if why == "export")
320
+ by_link = sum(1 for why in mp.kept.values() if why == "export link")
319
321
  click.echo(f"{site} — static folder {mp.static} ({len(mp.files)} files, {md.human(mp.size(mp.files))})")
320
322
  click.echo(f" kept: {len(kept)} file(s), {md.human(mp.size(kept))} — {by_export} shown by the HTML "
321
- f"export, {len(kept) - by_export} named by media_keep")
323
+ f"export, {by_link} linked by it, {len(kept) - by_export - by_link} named by media_keep")
322
324
  click.echo(f" no longer served: {len(dropped)} file(s), {md.human(mp.size(dropped))}")
323
325
  if mp.unmatched:
324
326
  click.echo(f" {mp.unmatched} export file(s) match no static file (inlined or generated: nothing to keep)")
@@ -107,7 +107,7 @@ from pathlib import Path
107
107
  from urllib.parse import parse_qs, urlsplit
108
108
 
109
109
  #: The library release this file ships with, and its interface number (#135).
110
- STX_VERSION = "0.7.76"
110
+ STX_VERSION = "0.7.77"
111
111
  AUTH_INTERFACE = 3
112
112
 
113
113
  DEFAULT_ROOT = "/var/lib/stx-auth"
@@ -7,6 +7,9 @@ document. With ``[release] media_per_site = true``, each release of the code hol
7
7
 
8
8
  * the files its HTML export shows: each file of the export's ``data/`` folders, found again in the
9
9
  static folder by its content (size, then SHA-256) — the export copies a served file unchanged;
10
+ * the files its HTML export links to under ``app/static/`` — a download offered by a link, at the
11
+ site's address or another's (``href='https://<site>…/app/static/downloads/x.zip'``): the export
12
+ leaves such a link as it is, and the live face must serve its file;
10
13
  * the files ``media_keep`` names (``[release]`` and the site's table): glob patterns relative to the
11
14
  static folder, as in ``/app/static/<path>``; ``*`` also crosses ``/``.
12
15
 
@@ -24,6 +27,7 @@ from collections import defaultdict
24
27
  from dataclasses import dataclass, field
25
28
  from fnmatch import fnmatchcase
26
29
  from pathlib import Path
30
+ from urllib.parse import unquote
27
31
 
28
32
  from .config import ReleaseConfig, Site
29
33
 
@@ -31,6 +35,8 @@ SERVED = ".stx-served"
31
35
 
32
36
  #: A path under the static folder named in a site's own files: ``static/…`` or ``app/static/…``.
33
37
  _NAMED_RE = re.compile(r"""(?:app/)?static/([\w.~/-]+)""")
38
+ #: A link of the export to a served file, absolute or not: the path after ``app/static/``.
39
+ _LINKED_RE = re.compile(r"""app/static/([^"'\s()<>?#\\]+)""")
34
40
  _TEXT = {".py", ".md", ".html", ".css", ".js", ".toml", ".json", ".txt", ".yaml", ".yml"}
35
41
 
36
42
 
@@ -40,7 +46,8 @@ class MediaPlan:
40
46
 
41
47
  static: Path | None # the site's static folder, resolved (None: it has none)
42
48
  files: dict[str, int] = field(default_factory=dict) # every file of it → its size
43
- kept: dict[str, str] = field(default_factory=dict) # served → why: "export" or the pattern
49
+ kept: dict[str, str] = field(default_factory=dict) # served → why: "export", "export link",
50
+ # or the media_keep pattern
44
51
  unmatched: int = 0 # export files found in no static file (inlined, generated)
45
52
  named: list[str] = field(default_factory=list) # named in the site's files, not kept
46
53
 
@@ -117,6 +124,12 @@ def _plan(cfg: ReleaseConfig, site: Site, code: Path, html: Path) -> MediaPlan:
117
124
  mp.kept.setdefault(rel, "export")
118
125
  found = True
119
126
  mp.unmatched += not found
127
+ for f in sorted(html.rglob("*")):
128
+ if f.is_file() and f.suffix in (".html", ".css", ".js"):
129
+ for m in _LINKED_RE.findall(f.read_text(encoding="utf-8", errors="replace")):
130
+ rel = unquote(m.replace("&amp;", "&")).rstrip("/")
131
+ if rel in mp.files:
132
+ mp.kept.setdefault(rel, "export link")
120
133
  for pat in keep_patterns(cfg, site):
121
134
  for rel in mp.files:
122
135
  if fnmatchcase(rel, pat):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: streamtex
3
- Version: 0.7.76
3
+ Version: 0.7.77
4
4
  Summary: AI-powered content framework for Streamlit — create presentations, courses, and web-books with Claude or Cursor, no coding required.
5
5
  Author-email: Nicolas Guelfi <nicolas.guelfi@laposte.net>
6
6
  License-Expression: BUSL-1.1
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes