slidemark 0.1.0__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.
- slidemark-0.1.0/.coverage +0 -0
- slidemark-0.1.0/.github/workflows/ci.yml +27 -0
- slidemark-0.1.0/.github/workflows/publish.yml +41 -0
- slidemark-0.1.0/.gitignore +10 -0
- slidemark-0.1.0/CHANGELOG.md +57 -0
- slidemark-0.1.0/CLAUDE.md +55 -0
- slidemark-0.1.0/PKG-INFO +384 -0
- slidemark-0.1.0/README.md +357 -0
- slidemark-0.1.0/docs/AGENT_COST.md +325 -0
- slidemark-0.1.0/docs/AGENT_TIPS.md +51 -0
- slidemark-0.1.0/docs/COMPARE.md +1776 -0
- slidemark-0.1.0/docs/DAILY_LOG.md +151 -0
- slidemark-0.1.0/docs/DESIGN_COVERAGE.md +222 -0
- slidemark-0.1.0/docs/DESIGN_FREEDOM.md +116 -0
- slidemark-0.1.0/docs/DESIGN_REQUIRED.md +68 -0
- slidemark-0.1.0/docs/FEATURES.md +115 -0
- slidemark-0.1.0/docs/LESSONS.md +309 -0
- slidemark-0.1.0/docs/PLAN.md +728 -0
- slidemark-0.1.0/docs/PROPOSAL.md +260 -0
- slidemark-0.1.0/docs/RENDERING.md +72 -0
- slidemark-0.1.0/docs/SYNTAX.md +1041 -0
- slidemark-0.1.0/docs/TARGETS.md +180 -0
- slidemark-0.1.0/docs/TOKEN_FLOOR.md +33 -0
- slidemark-0.1.0/examples/01-basics.md +44 -0
- slidemark-0.1.0/examples/02-jp-dense.md +49 -0
- slidemark-0.1.0/examples/03-vi-report.md +26 -0
- slidemark-0.1.0/examples/04-jp-kpi.md +47 -0
- slidemark-0.1.0/examples/05-jp-process.md +47 -0
- slidemark-0.1.0/examples/06-jp-market.md +41 -0
- slidemark-0.1.0/examples/07-jp-org.md +44 -0
- slidemark-0.1.0/examples/08-jp-roadmap.md +51 -0
- slidemark-0.1.0/examples/09-midnight-tech.md +70 -0
- slidemark-0.1.0/examples/10-template.md +28 -0
- slidemark-0.1.0/examples/11-jp-consulting.md +164 -0
- slidemark-0.1.0/examples/12-html-svg-math.md +28 -0
- slidemark-0.1.0/examples/13-brand-aurora.md +45 -0
- slidemark-0.1.0/examples/14-brand-terracotta.md +22 -0
- slidemark-0.1.0/examples/15-html-mixed.md +37 -0
- slidemark-0.1.0/examples/16-jp-strategy.md +177 -0
- slidemark-0.1.0/examples/17-editorial-css.md +69 -0
- slidemark-0.1.0/examples/18-brand-lime.md +41 -0
- slidemark-0.1.0/examples/19-vi-consulting-brand.md +58 -0
- slidemark-0.1.0/examples/20-jp-retail-dense.md +204 -0
- slidemark-0.1.0/examples/21-jp-dark-pitch.md +69 -0
- slidemark-0.1.0/examples/22-en-launch-plan.md +112 -0
- slidemark-0.1.0/examples/23-vocabulary.md +115 -0
- slidemark-0.1.0/examples/24-vocabulary-2.md +77 -0
- slidemark-0.1.0/examples/25-roundtrip-forms.md +88 -0
- slidemark-0.1.0/pyproject.toml +53 -0
- slidemark-0.1.0/scripts/gallery.py +88 -0
- slidemark-0.1.0/scripts/gen_metrics.py +94 -0
- slidemark-0.1.0/scripts/make_example_assets.py +60 -0
- slidemark-0.1.0/src/slidemark/__init__.py +8 -0
- slidemark-0.1.0/src/slidemark/build.py +60 -0
- slidemark-0.1.0/src/slidemark/cli.py +755 -0
- slidemark-0.1.0/src/slidemark/contrast.py +95 -0
- slidemark-0.1.0/src/slidemark/critique.py +341 -0
- slidemark-0.1.0/src/slidemark/design.py +333 -0
- slidemark-0.1.0/src/slidemark/fit.py +459 -0
- slidemark-0.1.0/src/slidemark/fix.py +377 -0
- slidemark-0.1.0/src/slidemark/fonts/fonts.conf +110 -0
- slidemark-0.1.0/src/slidemark/forms.py +184 -0
- slidemark-0.1.0/src/slidemark/forms2.py +283 -0
- slidemark-0.1.0/src/slidemark/forms3.py +175 -0
- slidemark-0.1.0/src/slidemark/honour.py +627 -0
- slidemark-0.1.0/src/slidemark/htmlnative.py +950 -0
- slidemark-0.1.0/src/slidemark/icons/__init__.py +349 -0
- slidemark-0.1.0/src/slidemark/icons/glyphs.py +237 -0
- slidemark-0.1.0/src/slidemark/icons/svgfile.py +257 -0
- slidemark-0.1.0/src/slidemark/importer/__init__.py +702 -0
- slidemark-0.1.0/src/slidemark/importer/design.py +370 -0
- slidemark-0.1.0/src/slidemark/importer/diet.py +792 -0
- slidemark-0.1.0/src/slidemark/importer/emit.py +467 -0
- slidemark-0.1.0/src/slidemark/importer/forms2.py +358 -0
- slidemark-0.1.0/src/slidemark/importer/links.py +424 -0
- slidemark-0.1.0/src/slidemark/importer/look.py +341 -0
- slidemark-0.1.0/src/slidemark/importer/mathml.py +194 -0
- slidemark-0.1.0/src/slidemark/importer/read.py +1085 -0
- slidemark-0.1.0/src/slidemark/importer/recognise.py +801 -0
- slidemark-0.1.0/src/slidemark/importer/recognise2.py +947 -0
- slidemark-0.1.0/src/slidemark/importer/recognise3.py +622 -0
- slidemark-0.1.0/src/slidemark/importer/runs.py +243 -0
- slidemark-0.1.0/src/slidemark/importer/shadows.py +44 -0
- slidemark-0.1.0/src/slidemark/importer/structure.py +1603 -0
- slidemark-0.1.0/src/slidemark/importer/vocab.py +266 -0
- slidemark-0.1.0/src/slidemark/ir.py +415 -0
- slidemark-0.1.0/src/slidemark/jsonio.py +53 -0
- slidemark-0.1.0/src/slidemark/layout/__init__.py +7 -0
- slidemark-0.1.0/src/slidemark/layout/boxpin.py +133 -0
- slidemark-0.1.0/src/slidemark/layout/cardlook.py +143 -0
- slidemark-0.1.0/src/slidemark/layout/chartnote.py +689 -0
- slidemark-0.1.0/src/slidemark/layout/css.py +736 -0
- slidemark-0.1.0/src/slidemark/layout/diagram.py +1003 -0
- slidemark-0.1.0/src/slidemark/layout/engine.py +5240 -0
- slidemark-0.1.0/src/slidemark/layout/forms2.py +1668 -0
- slidemark-0.1.0/src/slidemark/layout/gantt.py +397 -0
- slidemark-0.1.0/src/slidemark/layout/grid.py +300 -0
- slidemark-0.1.0/src/slidemark/layout/htmlslide.py +83 -0
- slidemark-0.1.0/src/slidemark/layout/jbreak.py +217 -0
- slidemark-0.1.0/src/slidemark/layout/kpirow.py +84 -0
- slidemark-0.1.0/src/slidemark/layout/kpirule.py +135 -0
- slidemark-0.1.0/src/slidemark/layout/kpiunit.py +77 -0
- slidemark-0.1.0/src/slidemark/layout/l3fill.py +1884 -0
- slidemark-0.1.0/src/slidemark/layout/measure.py +733 -0
- slidemark-0.1.0/src/slidemark/layout/metrics/widths.json +1 -0
- slidemark-0.1.0/src/slidemark/layout/pills.py +207 -0
- slidemark-0.1.0/src/slidemark/layout/score.py +176 -0
- slidemark-0.1.0/src/slidemark/layout/search.py +83 -0
- slidemark-0.1.0/src/slidemark/layout/sparsefill.py +221 -0
- slidemark-0.1.0/src/slidemark/layout/stepspin.py +116 -0
- slidemark-0.1.0/src/slidemark/layout/tablehl.py +103 -0
- slidemark-0.1.0/src/slidemark/layout/tables.py +352 -0
- slidemark-0.1.0/src/slidemark/layout/vfill.py +478 -0
- slidemark-0.1.0/src/slidemark/layout/vocab.py +1171 -0
- slidemark-0.1.0/src/slidemark/lint.py +731 -0
- slidemark-0.1.0/src/slidemark/parser/__init__.py +34 -0
- slidemark-0.1.0/src/slidemark/parser/attrs.py +463 -0
- slidemark-0.1.0/src/slidemark/parser/blocks.py +528 -0
- slidemark-0.1.0/src/slidemark/parser/core.py +1183 -0
- slidemark-0.1.0/src/slidemark/parser/css.py +1114 -0
- slidemark-0.1.0/src/slidemark/parser/ctx.py +46 -0
- slidemark-0.1.0/src/slidemark/parser/html.py +1105 -0
- slidemark-0.1.0/src/slidemark/parser/inline.py +307 -0
- slidemark-0.1.0/src/slidemark/parser/lenient.py +250 -0
- slidemark-0.1.0/src/slidemark/parser/mermaid.py +346 -0
- slidemark-0.1.0/src/slidemark/parser/tabular.py +761 -0
- slidemark-0.1.0/src/slidemark/parser/tokens.py +399 -0
- slidemark-0.1.0/src/slidemark/presets/default.yaml +26 -0
- slidemark-0.1.0/src/slidemark/presets/jp-business.yaml +57 -0
- slidemark-0.1.0/src/slidemark/presets/midnight.yaml +23 -0
- slidemark-0.1.0/src/slidemark/preview.py +175 -0
- slidemark-0.1.0/src/slidemark/redesign.py +685 -0
- slidemark-0.1.0/src/slidemark/render/__init__.py +982 -0
- slidemark-0.1.0/src/slidemark/render/anim.py +213 -0
- slidemark-0.1.0/src/slidemark/render/axis.py +295 -0
- slidemark-0.1.0/src/slidemark/render/charthl.py +114 -0
- slidemark-0.1.0/src/slidemark/render/design_part.py +337 -0
- slidemark-0.1.0/src/slidemark/render/effects.py +308 -0
- slidemark-0.1.0/src/slidemark/render/htmlimg.py +262 -0
- slidemark-0.1.0/src/slidemark/render/icons.py +101 -0
- slidemark-0.1.0/src/slidemark/render/math.py +419 -0
- slidemark-0.1.0/src/slidemark/render/media.py +199 -0
- slidemark-0.1.0/src/slidemark/render/objects.py +1308 -0
- slidemark-0.1.0/src/slidemark/render/svg.py +236 -0
- slidemark-0.1.0/src/slidemark/render/text.py +300 -0
- slidemark-0.1.0/src/slidemark/render/util.py +155 -0
- slidemark-0.1.0/src/slidemark/render/vocabshapes.py +79 -0
- slidemark-0.1.0/src/slidemark/render/waterfall.py +137 -0
- slidemark-0.1.0/src/slidemark/selfreview.py +514 -0
- slidemark-0.1.0/src/slidemark/shapes.py +147 -0
- slidemark-0.1.0/src/slidemark/skill/SKILL.md +287 -0
- slidemark-0.1.0/src/slidemark/skill/reference/charts-tables.md +52 -0
- slidemark-0.1.0/src/slidemark/skill/reference/components.md +65 -0
- slidemark-0.1.0/src/slidemark/skill/reference/design.md +55 -0
- slidemark-0.1.0/src/slidemark/skill/reference/diagnostics.md +36 -0
- slidemark-0.1.0/src/slidemark/skill/reference/icons.md +12 -0
- slidemark-0.1.0/src/slidemark/skill/reference/jp-dense.md +29 -0
- slidemark-0.1.0/src/slidemark/skill/reference/review.md +16 -0
- slidemark-0.1.0/src/slidemark/skill/reference/syntax.md +42 -0
- slidemark-0.1.0/src/slidemark/template.py +391 -0
- slidemark-0.1.0/src/slidemark/theme.py +2077 -0
- slidemark-0.1.0/src/slidemark/units.py +55 -0
- slidemark-0.1.0/src/slidemark/xsd.py +149 -0
- slidemark-0.1.0/tests/__init__.py +0 -0
- slidemark-0.1.0/tests/data/charts_math.md +66 -0
- slidemark-0.1.0/tests/data/sparse_ja_dense.md +59 -0
- slidemark-0.1.0/tests/data/sparse_ja_short.md +29 -0
- slidemark-0.1.0/tests/data/sparse_vi_brand.md +79 -0
- slidemark-0.1.0/tests/helpers.py +16 -0
- slidemark-0.1.0/tests/test_badge_clip.py +28 -0
- slidemark-0.1.0/tests/test_badge_table.py +57 -0
- slidemark-0.1.0/tests/test_brand_gaps.py +140 -0
- slidemark-0.1.0/tests/test_card_rules.py +238 -0
- slidemark-0.1.0/tests/test_chart_axis.py +130 -0
- slidemark-0.1.0/tests/test_chart_decisions.py +362 -0
- slidemark-0.1.0/tests/test_chart_defaults.py +199 -0
- slidemark-0.1.0/tests/test_chart_grouped.py +60 -0
- slidemark-0.1.0/tests/test_chart_label_ink.py +62 -0
- slidemark-0.1.0/tests/test_chart_note.py +387 -0
- slidemark-0.1.0/tests/test_chart_sparse.py +121 -0
- slidemark-0.1.0/tests/test_chart_text_scale.py +64 -0
- slidemark-0.1.0/tests/test_chevron_five.py +117 -0
- slidemark-0.1.0/tests/test_cjk_squeeze.py +156 -0
- slidemark-0.1.0/tests/test_cjk_unit_join.py +98 -0
- slidemark-0.1.0/tests/test_cli.py +192 -0
- slidemark-0.1.0/tests/test_cli_build.py +231 -0
- slidemark-0.1.0/tests/test_conclusion_size.py +42 -0
- slidemark-0.1.0/tests/test_contrast.py +54 -0
- slidemark-0.1.0/tests/test_contrast_derived.py +156 -0
- slidemark-0.1.0/tests/test_cover_anchored.py +110 -0
- slidemark-0.1.0/tests/test_critique.py +162 -0
- slidemark-0.1.0/tests/test_css_apply.py +813 -0
- slidemark-0.1.0/tests/test_css_parse.py +504 -0
- slidemark-0.1.0/tests/test_design_coverage.py +325 -0
- slidemark-0.1.0/tests/test_design_coverage2.py +491 -0
- slidemark-0.1.0/tests/test_design_dl2f.py +546 -0
- slidemark-0.1.0/tests/test_design_dl2g.py +343 -0
- slidemark-0.1.0/tests/test_design_feedback.py +623 -0
- slidemark-0.1.0/tests/test_design_native.py +266 -0
- slidemark-0.1.0/tests/test_design_roundtrip.py +229 -0
- slidemark-0.1.0/tests/test_dl3d_forms.py +569 -0
- slidemark-0.1.0/tests/test_dl3d_part2_forms.py +455 -0
- slidemark-0.1.0/tests/test_dl3d_part2_geometry.py +410 -0
- slidemark-0.1.0/tests/test_e2e.py +21 -0
- slidemark-0.1.0/tests/test_element_control.py +656 -0
- slidemark-0.1.0/tests/test_eval.py +133 -0
- slidemark-0.1.0/tests/test_fit_map.py +199 -0
- slidemark-0.1.0/tests/test_fix.py +195 -0
- slidemark-0.1.0/tests/test_forms2.py +534 -0
- slidemark-0.1.0/tests/test_gantt.py +270 -0
- slidemark-0.1.0/tests/test_gantt_pill.py +76 -0
- slidemark-0.1.0/tests/test_golden.py +46 -0
- slidemark-0.1.0/tests/test_grow_max.py +241 -0
- slidemark-0.1.0/tests/test_honour.py +481 -0
- slidemark-0.1.0/tests/test_html_slide.py +239 -0
- slidemark-0.1.0/tests/test_html_zoom.py +125 -0
- slidemark-0.1.0/tests/test_htmlnative.py +222 -0
- slidemark-0.1.0/tests/test_icons.py +321 -0
- slidemark-0.1.0/tests/test_import.py +314 -0
- slidemark-0.1.0/tests/test_import_css.py +152 -0
- slidemark-0.1.0/tests/test_import_foreign.py +218 -0
- slidemark-0.1.0/tests/test_import_header_rows.py +35 -0
- slidemark-0.1.0/tests/test_import_links.py +152 -0
- slidemark-0.1.0/tests/test_import_recognise.py +300 -0
- slidemark-0.1.0/tests/test_import_recognise2.py +530 -0
- slidemark-0.1.0/tests/test_import_recognise3.py +342 -0
- slidemark-0.1.0/tests/test_import_runs.py +56 -0
- slidemark-0.1.0/tests/test_import_tokens.py +328 -0
- slidemark-0.1.0/tests/test_ir.py +27 -0
- slidemark-0.1.0/tests/test_jbreak.py +196 -0
- slidemark-0.1.0/tests/test_jsonio.py +19 -0
- slidemark-0.1.0/tests/test_kpi_hero.py +283 -0
- slidemark-0.1.0/tests/test_l3_bar.py +220 -0
- slidemark-0.1.0/tests/test_l3_chevron.py +167 -0
- slidemark-0.1.0/tests/test_l3_diagram_tree.py +196 -0
- slidemark-0.1.0/tests/test_l3_hollow_spread.py +70 -0
- slidemark-0.1.0/tests/test_l3_kpi_lone.py +121 -0
- slidemark-0.1.0/tests/test_l3_org_grid.py +65 -0
- slidemark-0.1.0/tests/test_l3_panel_follow.py +43 -0
- slidemark-0.1.0/tests/test_l3_table_header.py +81 -0
- slidemark-0.1.0/tests/test_l3_table_text.py +104 -0
- slidemark-0.1.0/tests/test_l3_w2a.py +164 -0
- slidemark-0.1.0/tests/test_l3_w4_cover.py +65 -0
- slidemark-0.1.0/tests/test_layout.py +443 -0
- slidemark-0.1.0/tests/test_layout_auto.py +192 -0
- slidemark-0.1.0/tests/test_layout_balance.py +150 -0
- slidemark-0.1.0/tests/test_layout_band.py +96 -0
- slidemark-0.1.0/tests/test_layout_card_table_plot.py +77 -0
- slidemark-0.1.0/tests/test_layout_components.py +388 -0
- slidemark-0.1.0/tests/test_layout_consulting.py +433 -0
- slidemark-0.1.0/tests/test_layout_diagram.py +333 -0
- slidemark-0.1.0/tests/test_layout_fill_policy.py +122 -0
- slidemark-0.1.0/tests/test_layout_free.py +97 -0
- slidemark-0.1.0/tests/test_layout_l3_fill.py +351 -0
- slidemark-0.1.0/tests/test_layout_policies.py +541 -0
- slidemark-0.1.0/tests/test_layout_review3.py +218 -0
- slidemark-0.1.0/tests/test_layout_search.py +292 -0
- slidemark-0.1.0/tests/test_layout_sparse_fill.py +55 -0
- slidemark-0.1.0/tests/test_layout_sparse_step.py +106 -0
- slidemark-0.1.0/tests/test_layout_tokens.py +73 -0
- slidemark-0.1.0/tests/test_layout_vfill.py +188 -0
- slidemark-0.1.0/tests/test_lint.py +119 -0
- slidemark-0.1.0/tests/test_lint_chart_contrast.py +99 -0
- slidemark-0.1.0/tests/test_lint_table_contrast.py +105 -0
- slidemark-0.1.0/tests/test_look_accent.py +23 -0
- slidemark-0.1.0/tests/test_measure.py +70 -0
- slidemark-0.1.0/tests/test_media.py +252 -0
- slidemark-0.1.0/tests/test_no_hardcoded.py +114 -0
- slidemark-0.1.0/tests/test_orphan_muted.py +122 -0
- slidemark-0.1.0/tests/test_parser.py +584 -0
- slidemark-0.1.0/tests/test_parser_fuzz.py +434 -0
- slidemark-0.1.0/tests/test_parser_html.py +230 -0
- slidemark-0.1.0/tests/test_parser_lenient.py +214 -0
- slidemark-0.1.0/tests/test_parser_mermaid.py +178 -0
- slidemark-0.1.0/tests/test_parser_tabular.py +172 -0
- slidemark-0.1.0/tests/test_pills.py +150 -0
- slidemark-0.1.0/tests/test_preview.py +17 -0
- slidemark-0.1.0/tests/test_preview_cmd.py +55 -0
- slidemark-0.1.0/tests/test_preview_fonts.py +44 -0
- slidemark-0.1.0/tests/test_preview_locale.py +33 -0
- slidemark-0.1.0/tests/test_render.py +360 -0
- slidemark-0.1.0/tests/test_render_anim.py +192 -0
- slidemark-0.1.0/tests/test_render_chart_colors.py +65 -0
- slidemark-0.1.0/tests/test_render_charts.py +212 -0
- slidemark-0.1.0/tests/test_render_components.py +284 -0
- slidemark-0.1.0/tests/test_render_effects.py +275 -0
- slidemark-0.1.0/tests/test_render_html.py +104 -0
- slidemark-0.1.0/tests/test_render_math.py +110 -0
- slidemark-0.1.0/tests/test_render_tables.py +152 -0
- slidemark-0.1.0/tests/test_roundtrip.py +206 -0
- slidemark-0.1.0/tests/test_roundtrip_compare.py +172 -0
- slidemark-0.1.0/tests/test_rowgroups.py +109 -0
- slidemark-0.1.0/tests/test_selfreview.py +381 -0
- slidemark-0.1.0/tests/test_silent_defects.py +231 -0
- slidemark-0.1.0/tests/test_skill.py +44 -0
- slidemark-0.1.0/tests/test_slide_ink.py +176 -0
- slidemark-0.1.0/tests/test_sparse_lead.py +53 -0
- slidemark-0.1.0/tests/test_sparse_slides.py +251 -0
- slidemark-0.1.0/tests/test_sparse_wave2.py +313 -0
- slidemark-0.1.0/tests/test_steps.py +200 -0
- slidemark-0.1.0/tests/test_svg.py +187 -0
- slidemark-0.1.0/tests/test_table_card_balance.py +135 -0
- slidemark-0.1.0/tests/test_table_fit.py +71 -0
- slidemark-0.1.0/tests/test_table_fit_beside.py +31 -0
- slidemark-0.1.0/tests/test_table_growth.py +79 -0
- slidemark-0.1.0/tests/test_table_hl.py +164 -0
- slidemark-0.1.0/tests/test_template.py +194 -0
- slidemark-0.1.0/tests/test_token_gate.py +19 -0
- slidemark-0.1.0/tests/test_tokens_contract.py +79 -0
- slidemark-0.1.0/tests/test_tokens_header.py +207 -0
- slidemark-0.1.0/tests/test_tokens_values.py +261 -0
- slidemark-0.1.0/tests/test_vocabulary.py +868 -0
- slidemark-0.1.0/tests/test_waterfall.py +96 -0
- slidemark-0.1.0/tests/test_wrap_dash.py +46 -0
- slidemark-0.1.0/tests/test_xsd.py +30 -0
|
Binary file
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
# GitHub Actions minutes are limited on this private repo. The daily routine already runs ruff + the full
|
|
3
|
+
# pytest suite locally before every push, so CI runs once a day on the latest main (and on demand),
|
|
4
|
+
# not on every push. Re-add `push:` only if the repo becomes public or gets more minutes.
|
|
5
|
+
on:
|
|
6
|
+
schedule:
|
|
7
|
+
- cron: "0 23 * * *" # 08:00 JST, after the 02:45 JST routine run
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ci-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
jobs:
|
|
13
|
+
test:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
timeout-minutes: 30
|
|
16
|
+
strategy:
|
|
17
|
+
matrix:
|
|
18
|
+
python: ["3.10", "3.12"]
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
- uses: astral-sh/setup-uv@v3
|
|
22
|
+
- run: uv venv --python ${{ matrix.python }} .venv
|
|
23
|
+
- run: uv pip install -e ".[dev,html]" --python .venv
|
|
24
|
+
- run: .venv/bin/playwright install --with-deps chromium
|
|
25
|
+
- run: .venv/bin/ruff check .
|
|
26
|
+
- run: .venv/bin/ruff format --check .
|
|
27
|
+
- run: .venv/bin/pytest -q --cov=slidemark --cov-report=term:skip-covered
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
name: publish
|
|
2
|
+
# Publishes the package to PyPI through Trusted Publishing (OpenID Connect): no API token is stored.
|
|
3
|
+
# PyPI side: project `slidemark`, owner `LeDat98`, repository `SlideMark`, workflow `publish.yml`,
|
|
4
|
+
# environment `pypi`. GitHub side: Settings > Environments > `pypi` (add the owner as a required reviewer
|
|
5
|
+
# so a release is approved by hand). Runs on a published GitHub release or on demand; the version comes
|
|
6
|
+
# from `pyproject.toml`, so bump it and tag `vX.Y.Z` first.
|
|
7
|
+
on:
|
|
8
|
+
release:
|
|
9
|
+
types: [published]
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
jobs:
|
|
12
|
+
build:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 15
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- uses: astral-sh/setup-uv@v3
|
|
18
|
+
- run: uv build
|
|
19
|
+
- run: uv venv .venv && uv pip install --python .venv dist/*.whl
|
|
20
|
+
- run: .venv/bin/slidemark version
|
|
21
|
+
- run: printf '# Hello\n- one\n- two\n' | .venv/bin/slidemark build - -o /tmp/smoke.pptx
|
|
22
|
+
- uses: actions/upload-artifact@v4
|
|
23
|
+
with:
|
|
24
|
+
name: dist
|
|
25
|
+
path: dist/
|
|
26
|
+
publish:
|
|
27
|
+
needs: build
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
timeout-minutes: 10
|
|
30
|
+
environment:
|
|
31
|
+
name: pypi
|
|
32
|
+
url: https://pypi.org/p/slidemark
|
|
33
|
+
permissions:
|
|
34
|
+
id-token: write # the OIDC token PyPI trusts
|
|
35
|
+
contents: read
|
|
36
|
+
steps:
|
|
37
|
+
- uses: actions/download-artifact@v4
|
|
38
|
+
with:
|
|
39
|
+
name: dist
|
|
40
|
+
path: dist/
|
|
41
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes. Versions follow semver once 0.1.0 is published.
|
|
4
|
+
|
|
5
|
+
## 0.1.0 (2026-10-07)
|
|
6
|
+
|
|
7
|
+
### Design freedom
|
|
8
|
+
- DL3d lane A (foreign-deck round trip): span attributes `[420億円]{size=28 bold=true color=primary}` (exact pt, mixed sizes / colours in one line: paragraphs, list items, `@rows`, table cells, headings, KPI values; the importer writes them back, `importer/runs.py`), per-card stripe colours `box.stripe=a,b,c` / `item.stripe` / `kpi.stripe` + `.stripe_h` / `.stripe.side` / `{stripe=teal}`, number headings `@4 num=text` / `## 01 {.num}` / `box.num.color=a,b,c`, number tiles `@kpi tile`, `cover.bottom.bar`, readable ink on a box with its own `{fill=}`, `<br>` in table cells without a warning; `examples/25-roundtrip-forms.md`.
|
|
9
|
+
- DL2 lane G: `kpi.band=<color>` (`kpi.band.color`, `kpi.band.size`: a header band behind the label of every `.kpi` card) and `kpi.unit.size=22` (`kpi.unit.color`: the trailing unit of a KPI value in its own run size, `Run.size`); `sizes: kpi=NN` now sets the KPI number size (it was a silent no-op) and counts as an explicit size; KPI value width estimates measure the unit at its own size; t2 / t3 ports re-done with every form that exists.
|
|
10
|
+
- DL3b part 1 (composition vocabulary): `@timeline` (h / v, marks), `@vs` (verdict, winner), `@matrix` (axis labels + arrows), `@funnel`, `@pyramid`, `@cycle`, `@agenda`, `@statement`, each one `@word` line with secondary keys (`dir=` `marks=` `x=` `y=` `align=` `valign=` + `size=` `fill=` `gap=`) and `<form>.*` tokens; native custom-geometry stages and arc arrows; importer round trip; `examples/23-vocabulary.md`.
|
|
11
|
+
- DL2 lane F: `@items` / `box.items=cards` (item cards), `@num` (numbered heading badges), `heading.rule`, `title.rule2`, `@rows plain` with `rows.glyph` / `rows.stripe`, cover `bar@edge` / `rule_w` / `rule_pos` / `stripes`, `render.chevron_shape` as a list, `table.num_pad`, `kpi.fill` / `kpi.line`; lint reads a KPI label against a tall stripe.
|
|
12
|
+
- No fixed look: every color, font, size, spacing, band, card style and layout constant is a token
|
|
13
|
+
(`slidemark tokens`); built-in themes are YAML presets (`src/slidemark/presets/`); `theme: none` is a neutral canvas.
|
|
14
|
+
- Header token lines `colors:` `fonts:` `sizes:` `style:` (new classes such as `hero.fill=` too), validated with
|
|
15
|
+
did-you-mean hints; shorthands `border="0.75pt solid #B08D57"`, `fill=none`, `shadow=none`.
|
|
16
|
+
- ` ```css ` fences (deck or slide): 34 CSS properties mapped to native PowerPoint (gradients, shadows, per-side
|
|
17
|
+
borders, letter-spacing, text-transform, rotation, grid templates, table cell styles), selector matching.
|
|
18
|
+
- `@html` slides and `slidemark build deck.html`: Chromium layout converted to native shapes (gradients, shadows,
|
|
19
|
+
rotation, ellipses, pills, simple inline SVG); theme tokens as CSS custom properties.
|
|
20
|
+
- `@free` slides: explicit `{x y w h}` positions, no automatic arrangement.
|
|
21
|
+
- The design source (tokens, CSS, HTML) survives `slidemark import` (customXml part).
|
|
22
|
+
|
|
23
|
+
### Syntax
|
|
24
|
+
- Headings as structure (`#` slide, `##` box), one `@` grid line (`@3`, `@2x2`, `@1:2`, `@aab/aac`), `@end`.
|
|
25
|
+
- Components: `.kpi` boxes, callouts `> [!note|tip|warn|caution]`, badges `[x]{.badge}`, connectors `@ a>b a-b`,
|
|
26
|
+
`flow` arrows, `chevron` steps.
|
|
27
|
+
- Charts as CSV fences (10 kinds) with options `legend labels fmt min max colors axis`; tables with merges and
|
|
28
|
+
options `widths align header hcol .zebra`; CSV edge cases (quotes, `1,240`, `12%`, full-width digits, `▲`).
|
|
29
|
+
- SVG images (``, ` ```svg `): native Office SVG with a PNG fallback, sanitized.
|
|
30
|
+
- Video/audio: `` / `.mp3` embed native media (poster, `autoplay`, `loop`).
|
|
31
|
+
- ` ```html {render=native} `: any HTML/CSS laid out in Chromium and converted to native shapes.
|
|
32
|
+
- ` ```math ` → native OMML equations; ` ```mermaid ` flowcharts → native shapes + connectors; HTML subset input.
|
|
33
|
+
- Lenient input: Marp/Slidev/Markdown variants accepted with warnings and did-you-mean hints.
|
|
34
|
+
|
|
35
|
+
### Layout and rendering
|
|
36
|
+
- Auto arrangement, 12-column tracks, full-width rows below a grid, sparse-slide growth and vertical balance.
|
|
37
|
+
- Consulting-grade layout: top-anchored body, content-sized cards/chevrons/trees/table columns, distinct chart
|
|
38
|
+
palettes with contrast-aware data labels.
|
|
39
|
+
- Bounded layout search (≤ 6 candidates scored like the design critic; rule choice wins ties).
|
|
40
|
+
- Real font metrics, autofit with `min_font_size`, CJK measurement and kinsoku line breaking.
|
|
41
|
+
- Themes `default`, `midnight`, `jp-business`; user `.pptx`/`.potx`/`.yaml` themes with native footer and
|
|
42
|
+
slide-number placeholders.
|
|
43
|
+
|
|
44
|
+
### Tooling
|
|
45
|
+
- CLI: `build`, `check` (`--format json`, layout linter), `preview`, `docs [topic]`, `schema`, `skill install`,
|
|
46
|
+
JSON and HTML deck input.
|
|
47
|
+
- Linter: overflow, off-slide, overlap, contrast, tiny-text, alt, connector-crosses, missing-end.
|
|
48
|
+
- Skill: `SKILL.md` (≤ 1,500 tokens) + 5 reference pages (≤ 800 tokens each).
|
|
49
|
+
- Bench: token corpus + gate, layout-inference metric, agent eval harness.
|
|
50
|
+
- `slidemark review` (design critique + score), `slidemark check --fix` (mechanical source repairs).
|
|
51
|
+
- `.pptx` import round trip: 98% of 111 decks lossless (OMML → LaTeX, transitions, build, sections, code
|
|
52
|
+
language); foreign python-pptx decks import at 0.975 fidelity.
|
|
53
|
+
- `python -m slidemark.xsd deck.pptx`: ECMA-376 schema validation (markup compatibility resolved to the
|
|
54
|
+
fallback); `bench/xsd_fuzz.py` validates fuzzed decks. CI on Python 3.10–3.12 with a coverage report.
|
|
55
|
+
- `build` prints one fit line per slide (form used, text size asked->reached, free space, attributes that took or
|
|
56
|
+
were ignored; `--quiet` / `fit: off`) and warns `attr-ignored` for attributes and `style:` tokens the layout does
|
|
57
|
+
not honour, with the form that works. `{.kpi h= y=}` on a lone KPI row pins the whole row.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# SlideMark: notes for coding sessions
|
|
2
|
+
|
|
3
|
+
Python library: token-efficient Markdown/HTML → native, editable .pptx for AI agents.
|
|
4
|
+
Design: `docs/PROPOSAL.md`. Plan: `docs/PLAN.md`. Syntax: `docs/SYNTAX.md`.
|
|
5
|
+
|
|
6
|
+
## Before you start
|
|
7
|
+
1. Read `docs/LESSONS.md` (known bugs, pitfalls, fixes). It is short on purpose.
|
|
8
|
+
2. Check today's tasks in `docs/PLAN.md`.
|
|
9
|
+
3. Read `docs/AGENT_COST.md`: what to optimize (model calls first, then output tokens, then input).
|
|
10
|
+
|
|
11
|
+
## Setup and commands
|
|
12
|
+
```bash
|
|
13
|
+
uv venv .venv && uv pip install -e ".[dev,html]" --python .venv # html = Playwright; Chromium is pre-installed in the cloud env
|
|
14
|
+
.venv/bin/pytest -q # all tests
|
|
15
|
+
.venv/bin/ruff check . && .venv/bin/ruff format --check .
|
|
16
|
+
.venv/bin/python bench/count_tokens.py --record # token metrics, append to bench/history.jsonl
|
|
17
|
+
.venv/bin/python scripts/gallery.py # rebuild examples -> docs/gallery PNGs + README section
|
|
18
|
+
```
|
|
19
|
+
Previews use the repo's `src/slidemark/fonts/fonts.conf` (Meiryo / Yu Gothic -> IPAPGothic, Arial / Inter -> Liberation
|
|
20
|
+
Sans, Georgia -> Liberation Serif) so renders and goldens are the same everywhere: `docs/RENDERING.md`. Optional:
|
|
21
|
+
`apt-get install fonts-noto-cjk` (~60 MB) gives a real bold CJK face, but goldens are made without it.
|
|
22
|
+
|
|
23
|
+
## Architecture (contract: `src/slidemark/ir.py`)
|
|
24
|
+
`parser/` Markdown → `Deck` · `layout/` `Slide` → `list[Placed]` (absolute EMU) · `render/` → .pptx ·
|
|
25
|
+
`theme.py` design tokens · `units.py` lengths. The renderer never decides positions; layout never touches pptx.
|
|
26
|
+
Changing `ir.py` affects every module: keep changes additive and update all users in the same commit.
|
|
27
|
+
|
|
28
|
+
## Definition of Done (every feature)
|
|
29
|
+
docs entry with shortest example → parser test → fuzz-safe (no crash, diagnostic instead) → render test
|
|
30
|
+
(reopen the .pptx and assert) → opens in LibreOffice → golden/gallery image looks right → lint rule if it can
|
|
31
|
+
break the visual → bench has no token regression. Mark progress in `docs/FEATURES.md`.
|
|
32
|
+
|
|
33
|
+
## Workflow
|
|
34
|
+
- **Language: everything in the repo is English** (code, comments, docs, commit messages, logs) **except
|
|
35
|
+
`README.md`, which is Vietnamese.** `scripts/gallery.py` must keep the README text Vietnamese.
|
|
36
|
+
Slide *content* in `examples/` and `bench/corpus/` may be Japanese/Vietnamese on purpose (test data).
|
|
37
|
+
- Push straight to `main` (allowed by the owner). No pull requests needed.
|
|
38
|
+
- GitHub Actions minutes are limited (private repo): CI runs once a day (08:00 JST) and on demand, not on push.
|
|
39
|
+
Always run ruff + the full pytest suite locally before pushing; push once per wave, not per commit.
|
|
40
|
+
- Runs are led by an Opus orchestrator, last ≥ 2 hours, and use at most 2 Sonnet subagents at a time
|
|
41
|
+
(lane A front, lane B back), in waves; see "Run routine" in `docs/PLAN.md`.
|
|
42
|
+
|
|
43
|
+
## Rules
|
|
44
|
+
- **Design freedom first (`docs/DESIGN_FREEDOM.md`).** Never hard-code a visual decision: colors, fonts, sizes,
|
|
45
|
+
spacing, bands, card looks and layout constants are tokens an agent can override from the deck (tokens, CSS or
|
|
46
|
+
HTML). Built-in themes are YAML presets in the public token schema, with no theme-specific code paths.
|
|
47
|
+
- Token cost is the main product metric, and it means the cost of the whole agent run to an accepted deck
|
|
48
|
+
(`docs/AGENT_COST.md`): model calls first, then output tokens, then input. SKILL.md must be all an agent
|
|
49
|
+
reads. New syntax must be the shortest unambiguous form that adds no lookup and no decision; measure it.
|
|
50
|
+
- Never raise on bad user input: append a `Diagnostic` with a one-line, actionable `hint`.
|
|
51
|
+
- Dense Japanese business slides (many boxes, 10–12pt text, tables, arrows, footnotes) are a first-class
|
|
52
|
+
target. Always test CJK text (`<a:ea>` font, full-width width ≈ 1em).
|
|
53
|
+
- When you hit a bug, pitfall or non-obvious fix, add one line to `docs/LESSONS.md`.
|
|
54
|
+
- When you verify a usage pattern that saves agents tokens or retries, add it to `docs/AGENT_TIPS.md`.
|
|
55
|
+
- Every working day ends with: tests green, `scripts/gallery.py` run, README gallery updated, bench recorded.
|
slidemark-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: slidemark
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Token-efficient Markdown/HTML to native, editable PowerPoint for AI agents
|
|
5
|
+
License: MIT
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Requires-Dist: budoux>=0.7
|
|
8
|
+
Requires-Dist: markdown-it-py>=3.0
|
|
9
|
+
Requires-Dist: mdit-py-plugins>=0.4
|
|
10
|
+
Requires-Dist: pillow>=10.0
|
|
11
|
+
Requires-Dist: pydantic>=2.6
|
|
12
|
+
Requires-Dist: pygments>=2.17
|
|
13
|
+
Requires-Dist: python-pptx>=1.0
|
|
14
|
+
Requires-Dist: pyyaml>=6.0
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: hypothesis>=6; extra == 'dev'
|
|
17
|
+
Requires-Dist: pypdfium2>=4.20; extra == 'dev'
|
|
18
|
+
Requires-Dist: pytest-cov>=5; extra == 'dev'
|
|
19
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
20
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
21
|
+
Requires-Dist: tiktoken>=0.7; extra == 'dev'
|
|
22
|
+
Provides-Extra: html
|
|
23
|
+
Requires-Dist: playwright>=1.40; extra == 'html'
|
|
24
|
+
Provides-Extra: preview
|
|
25
|
+
Requires-Dist: pypdfium2>=4.20; extra == 'preview'
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
|
|
28
|
+
# SlideMark
|
|
29
|
+
|
|
30
|
+
Thư viện Python giúp AI Agent tạo file PowerPoint (.pptx) **native, chỉnh sửa được** chỉ bằng cách viết văn bản
|
|
31
|
+
theo cú pháp riêng của SlideMark: ngắn gọn, tốn ít token và hỗ trợ cả slide dày đặc kiểu Nhật.
|
|
32
|
+
|
|
33
|
+
> Trạng thái: đang phát triển (đã xong 7 ngày nền móng, đang leo các cấp L2 → L4). Mục tiêu từng cấp L1 → L7: [docs/TARGETS.md](docs/TARGETS.md).
|
|
34
|
+
|
|
35
|
+
## Cài đặt
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
pip install slidemark # thư viện + CLI `slidemark`
|
|
39
|
+
pip install "slidemark[html]" # thêm Playwright nếu dùng khối HTML (cần `playwright install chromium`)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Dùng nhanh: viết `deck.md` theo cú pháp bên dưới rồi chạy `slidemark build deck.md -o deck.pptx`.
|
|
43
|
+
Xem trước ảnh PNG (`slidemark preview`) cần LibreOffice cài sẵn trên máy.
|
|
44
|
+
|
|
45
|
+
## Ví dụ
|
|
46
|
+
|
|
47
|
+
```markdown
|
|
48
|
+
theme: jp-business
|
|
49
|
+
lang: ja
|
|
50
|
+
|
|
51
|
+
# 新規事業の検討状況と今後の方針
|
|
52
|
+
> 3つの課題を解決し、2027年度の黒字化を目指す
|
|
53
|
+
@aab/aac
|
|
54
|
+
## 現状
|
|
55
|
+
- 売上:12.4億円(前年比 +8%)
|
|
56
|
+
## 課題
|
|
57
|
+
- 解約率が ==2.1%== に上昇
|
|
58
|
+
## 施策
|
|
59
|
+
1. 導入テンプレートの整備
|
|
60
|
+
※ 出所:社内CRMデータ
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
- `#` mở slide mới, mỗi `##` là một box, các box tự sắp xếp.
|
|
64
|
+
- `@aab/aac` là layout lưới viết trong 1 dòng.
|
|
65
|
+
- `>` dưới tiêu đề là thông điệp chính, dòng `※` là chú thích nguồn.
|
|
66
|
+
|
|
67
|
+
Cú pháp đầy đủ: [docs/SYNTAX.md](docs/SYNTAX.md).
|
|
68
|
+
|
|
69
|
+
## Tính năng chính
|
|
70
|
+
|
|
71
|
+
- Box, lưới `@`, KPI `{.kpi}`, callout `> [!warn]`, badge `[x]{.badge}`, mũi tên nối `@ a>b`, chevron/flow.
|
|
72
|
+
- 10 loại biểu đồ native từ CSV (nhãn, legend, định dạng số), bảng có gộp ô, công thức toán (OMML),
|
|
73
|
+
sơ đồ Mermaid → shape native, HTML → native (hoặc ảnh dự phòng qua Chromium).
|
|
74
|
+
- Theme `default`, `midnight`, `jp-business` hoặc template `.pptx/.potx` của bạn; hiệu ứng xuất hiện, chuyển slide, section.
|
|
75
|
+
- **Thiết kế tự do:** không có giao diện cố định. Theme chỉ là preset token (YAML); agent tự khai báo màu, font,
|
|
76
|
+
cỡ chữ, bo góc, gradient, bóng đổ bằng vài dòng `colors:` / `fonts:` / `sizes:` / `style:`, bằng khối ` ```css `
|
|
77
|
+
(34 thuộc tính CSS → shape gốc), hoặc viết cả slide bằng HTML (`@html`, `build deck.html`) và vẫn ra shape sửa được.
|
|
78
|
+
- `slidemark check` kiểm tra tràn chữ, chồng lấn, tương phản, alt ảnh… và gợi ý cách sửa trên 1 dòng (JSON được).
|
|
79
|
+
- `slidemark docs` / `skill install`: tài liệu cho agent, SKILL.md ≤ 1.500 token.
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
pip install -e .
|
|
83
|
+
slidemark check deck.md && slidemark build deck.md -o deck.pptx
|
|
84
|
+
slidemark skill install # cài skill cho Claude Code
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Windows: `slidemark preview` / `review --png` tự tìm LibreOffice trong `C:\Program Files\LibreOffice`; nếu cài chỗ khác,
|
|
88
|
+
đặt biến môi trường `SLIDEMARK_SOFFICE` trỏ tới `soffice.exe`. Build .pptx không cần LibreOffice.
|
|
89
|
+
|
|
90
|
+
## So sánh với python-pptx (cùng đề, 5 / 15 / 25 slide)
|
|
91
|
+
|
|
92
|
+
Cùng một agent (Sonnet), cùng đề bài, mỗi bên chạy 1 lần, đo từ lúc nhận yêu cầu đến lúc có file .pptx đạt yêu cầu
|
|
93
|
+
(2026-10-06). Chi tiết, mã nguồn hai bên đặt cạnh nhau và ảnh slide: [docs/COMPARE.md](docs/COMPARE.md).
|
|
94
|
+
|
|
95
|
+
| Số slide | Lần gọi model (SlideMark / python-pptx) | Thời gian | Token output | Chi phí |
|
|
96
|
+
|---|---|---|---|---|
|
|
97
|
+
| 5 | 4 / 8 | 18 s / 86 s | 1,4k / 10,1k | 32% |
|
|
98
|
+
| 15 | 5 / 11 | 40 s / 140 s | 6,7k / 18,2k | 40% |
|
|
99
|
+
| 25 | 7 / 10 | 70 s / 198 s | 7,5k / 41,5k | 32% |
|
|
100
|
+
|
|
101
|
+
### Thiết kế là quyết định của agent (2026-10-07)
|
|
102
|
+
|
|
103
|
+
SlideMark hỗ trợ quyết định thiết kế chứ không thay agent quyết định. Từ wave 3, SKILL.md yêu cầu agent nêu rõ
|
|
104
|
+
lựa chọn của mình cho cả deck (`colors:` `fonts:` `sizes:` `style:` `footer:`) và từng slide (dạng, một điểm
|
|
105
|
+
nhấn, ghi đè vị trí/cỡ/màu khi cần); `build` cảnh báo `design-none` / `design-slide` và in dòng
|
|
106
|
+
`design: colors fonts sizes style footer; 14/14 slides decided form+emphasis+values`. Không có lựa chọn nào được coi là "đúng"
|
|
107
|
+
(`docs/DESIGN_REQUIRED.md`, `docs/DESIGN_FREEDOM.md`).
|
|
108
|
+
|
|
109
|
+
Cùng đề 15 slide, giám khảo thiết kế chấm mù (Opus, cùng một vòng):
|
|
110
|
+
|
|
111
|
+
| Deck | Điểm | Lần gọi | Thời gian | Chi phí | Token mã nguồn |
|
|
112
|
+
|---|---|---|---|---|---|
|
|
113
|
+
| SlideMark sau AC7 (nêu quyết định, build in bản đồ fit từng slide) | **3,5** / 3,0 (2 lần chạy) | 4 / 5 | 29 s / 39 s | 29% / 35% | 1,5k / 1,4k |
|
|
114
|
+
| SlideMark wave 3 (nêu quyết định, chưa có bản đồ fit) | 3,5 | 9 | 90 s | 61% | 1,6k |
|
|
115
|
+
| SlideMark wave 2 (chỉ nội dung) | 3,0 | 5 | 36 s | 34% | 1,3k |
|
|
116
|
+
| python-pptx | 2,5 / 3,0 | 11 | 140 s | 100% | 5,3k |
|
|
117
|
+
|
|
118
|
+
Bản đồ fit: `build` in một dòng cho mỗi slide (`slide 2: lead + 4 kpi cards 72% of body, value 48->29pt (shrunk to
|
|
119
|
+
fit), free 16% below`) nên agent biết quyết định của mình có hiệu lực không mà không cần mở ảnh; thuộc tính bị bỏ qua
|
|
120
|
+
báo `attr-ignored` kèm dạng đúng. Mục tiêu AC7–AC9 (≤ 5 lần gọi, chi phí và thời gian ≤ 50% python-pptx) đã đạt.
|
|
121
|
+
|
|
122
|
+
Toàn bộ thiết kế mà agent python-pptx tự viết (64 quyết định) nêu lại được trong SlideMark với 43% token
|
|
123
|
+
(`bench/lengthbench/t2/slidemark-ported/REPORT.md`, `docs/DESIGN_COVERAGE.md`).
|
|
124
|
+
|
|
125
|
+
## Ảnh slide mẫu (cập nhật hằng ngày)
|
|
126
|
+
|
|
127
|
+
<!-- gallery:start -->
|
|
128
|
+
Cập nhật: 2026-10-07 · commit `2d3e402` · tạo tự động bởi `scripts/gallery.py`.
|
|
129
|
+
|
|
130
|
+
### Cơ bản: tiêu đề, danh sách, box, bảng, biểu đồ
|
|
131
|
+
|
|
132
|
+
Nguồn: [`examples/01-basics.md`](examples/01-basics.md)
|
|
133
|
+
|
|
134
|
+

|
|
135
|
+

|
|
136
|
+

|
|
137
|
+

|
|
138
|
+
|
|
139
|
+
### Slide dày đặc kiểu Nhật (jp-business)
|
|
140
|
+
|
|
141
|
+
Nguồn: [`examples/02-jp-dense.md`](examples/02-jp-dense.md)
|
|
142
|
+
|
|
143
|
+

|
|
144
|
+

|
|
145
|
+
|
|
146
|
+
### Báo cáo tiếng Việt
|
|
147
|
+
|
|
148
|
+
Nguồn: [`examples/03-vi-report.md`](examples/03-vi-report.md)
|
|
149
|
+
|
|
150
|
+

|
|
151
|
+

|
|
152
|
+

|
|
153
|
+
|
|
154
|
+
### Tiếng Nhật: KPI, badge, bảng kết quả, mũi tên nối
|
|
155
|
+
|
|
156
|
+
Nguồn: [`examples/04-jp-kpi.md`](examples/04-jp-kpi.md)
|
|
157
|
+
|
|
158
|
+

|
|
159
|
+

|
|
160
|
+
|
|
161
|
+
### Tiếng Nhật: quy trình chevron + bảng, luồng phê duyệt
|
|
162
|
+
|
|
163
|
+
Nguồn: [`examples/05-jp-process.md`](examples/05-jp-process.md)
|
|
164
|
+
|
|
165
|
+

|
|
166
|
+

|
|
167
|
+
|
|
168
|
+
### Tiếng Nhật: biểu đồ thị trường, bảng so sánh đối thủ
|
|
169
|
+
|
|
170
|
+
Nguồn: [`examples/06-jp-market.md`](examples/06-jp-market.md)
|
|
171
|
+
|
|
172
|
+

|
|
173
|
+

|
|
174
|
+
|
|
175
|
+
### Tiếng Nhật: sơ đồ tổ chức, ma trận rủi ro
|
|
176
|
+
|
|
177
|
+
Nguồn: [`examples/07-jp-org.md`](examples/07-jp-org.md)
|
|
178
|
+
|
|
179
|
+

|
|
180
|
+

|
|
181
|
+
|
|
182
|
+
### Tiếng Nhật: kế hoạch trung hạn, lộ trình
|
|
183
|
+
|
|
184
|
+
Nguồn: [`examples/08-jp-roadmap.md`](examples/08-jp-roadmap.md)
|
|
185
|
+
|
|
186
|
+

|
|
187
|
+

|
|
188
|
+

|
|
189
|
+
|
|
190
|
+
### Theme tối (midnight): KPI, biểu đồ, Mermaid, công thức, code
|
|
191
|
+
|
|
192
|
+
Nguồn: [`examples/09-midnight-tech.md`](examples/09-midnight-tech.md)
|
|
193
|
+
|
|
194
|
+

|
|
195
|
+

|
|
196
|
+

|
|
197
|
+

|
|
198
|
+

|
|
199
|
+

|
|
200
|
+
|
|
201
|
+
### Template .pptx của người dùng, ảnh (cover crop), biểu đồ, callout
|
|
202
|
+
|
|
203
|
+
Nguồn: [`examples/10-template.md`](examples/10-template.md)
|
|
204
|
+
|
|
205
|
+

|
|
206
|
+

|
|
207
|
+

|
|
208
|
+
|
|
209
|
+
### Tiếng Nhật: bộ 9 slide tư vấn dày đặc (tóm tắt, KPI, tổ chức, lộ trình, rủi ro)
|
|
210
|
+
|
|
211
|
+
Nguồn: [`examples/11-jp-consulting.md`](examples/11-jp-consulting.md)
|
|
212
|
+
|
|
213
|
+

|
|
214
|
+

|
|
215
|
+

|
|
216
|
+

|
|
217
|
+

|
|
218
|
+

|
|
219
|
+

|
|
220
|
+

|
|
221
|
+

|
|
222
|
+
|
|
223
|
+
### HTML/CSS → shape gốc (đo bằng Chromium), logo SVG, công thức
|
|
224
|
+
|
|
225
|
+
Nguồn: [`examples/12-html-svg-math.md`](examples/12-html-svg-math.md)
|
|
226
|
+
|
|
227
|
+

|
|
228
|
+

|
|
229
|
+
|
|
230
|
+
### Thiết kế tự do: thương hiệu tối, gradient, bóng đổ (theme: none + token)
|
|
231
|
+
|
|
232
|
+
Nguồn: [`examples/13-brand-aurora.md`](examples/13-brand-aurora.md)
|
|
233
|
+
|
|
234
|
+

|
|
235
|
+

|
|
236
|
+

|
|
237
|
+
|
|
238
|
+
### Thiết kế tự do: thương hiệu sáng, font serif, màu đất nung (token)
|
|
239
|
+
|
|
240
|
+
Nguồn: [`examples/14-brand-terracotta.md`](examples/14-brand-terracotta.md)
|
|
241
|
+
|
|
242
|
+

|
|
243
|
+
|
|
244
|
+
### Slide HTML toàn trang (@html) + slide SlideMark dùng chung token
|
|
245
|
+
|
|
246
|
+
Nguồn: [`examples/15-html-mixed.md`](examples/15-html-mixed.md)
|
|
247
|
+
|
|
248
|
+

|
|
249
|
+

|
|
250
|
+

|
|
251
|
+
|
|
252
|
+
### Tiếng Nhật: chiến lược dịch vụ, Gantt, quyết định
|
|
253
|
+
|
|
254
|
+
Nguồn: [`examples/16-jp-strategy.md`](examples/16-jp-strategy.md)
|
|
255
|
+
|
|
256
|
+

|
|
257
|
+

|
|
258
|
+

|
|
259
|
+

|
|
260
|
+

|
|
261
|
+

|
|
262
|
+

|
|
263
|
+

|
|
264
|
+

|
|
265
|
+

|
|
266
|
+
|
|
267
|
+
### Thiết kế tự do bằng CSS fence: phong cách tạp chí
|
|
268
|
+
|
|
269
|
+
Nguồn: [`examples/17-editorial-css.md`](examples/17-editorial-css.md)
|
|
270
|
+
|
|
271
|
+

|
|
272
|
+

|
|
273
|
+

|
|
274
|
+

|
|
275
|
+

|
|
276
|
+
|
|
277
|
+
### Thiết kế tự do: thương hiệu xanh chanh
|
|
278
|
+
|
|
279
|
+
Nguồn: [`examples/18-brand-lime.md`](examples/18-brand-lime.md)
|
|
280
|
+
|
|
281
|
+

|
|
282
|
+

|
|
283
|
+

|
|
284
|
+

|
|
285
|
+
|
|
286
|
+
### Tiếng Việt: bộ tư vấn theo thương hiệu (theme: none)
|
|
287
|
+
|
|
288
|
+
Nguồn: [`examples/19-vi-consulting-brand.md`](examples/19-vi-consulting-brand.md)
|
|
289
|
+
|
|
290
|
+

|
|
291
|
+

|
|
292
|
+

|
|
293
|
+

|
|
294
|
+

|
|
295
|
+
|
|
296
|
+
### Tiếng Nhật: bộ 11 slide dày đặc (biểu đồ cầu, Gantt, ghi chú biểu đồ)
|
|
297
|
+
|
|
298
|
+
Nguồn: [`examples/20-jp-retail-dense.md`](examples/20-jp-retail-dense.md)
|
|
299
|
+
|
|
300
|
+

|
|
301
|
+

|
|
302
|
+

|
|
303
|
+

|
|
304
|
+

|
|
305
|
+

|
|
306
|
+

|
|
307
|
+

|
|
308
|
+

|
|
309
|
+

|
|
310
|
+

|
|
311
|
+
|
|
312
|
+
### Tiếng Nhật: pitch tối thiết kế bằng CSS/HTML
|
|
313
|
+
|
|
314
|
+
Nguồn: [`examples/21-jp-dark-pitch.md`](examples/21-jp-dark-pitch.md)
|
|
315
|
+
|
|
316
|
+

|
|
317
|
+

|
|
318
|
+

|
|
319
|
+

|
|
320
|
+
|
|
321
|
+
### Tiếng Anh: kế hoạch ra mắt, chevron khớp cột bảng, ghi chú biểu đồ (hl=, note=)
|
|
322
|
+
|
|
323
|
+
Nguồn: [`examples/22-en-launch-plan.md`](examples/22-en-launch-plan.md)
|
|
324
|
+
|
|
325
|
+

|
|
326
|
+

|
|
327
|
+

|
|
328
|
+

|
|
329
|
+

|
|
330
|
+

|
|
331
|
+

|
|
332
|
+
|
|
333
|
+
### Từ vựng bố cục: @timeline, @vs, @matrix, @funnel, @pyramid, @cycle, @agenda, @statement
|
|
334
|
+
|
|
335
|
+
Nguồn: [`examples/23-vocabulary.md`](examples/23-vocabulary.md)
|
|
336
|
+
|
|
337
|
+

|
|
338
|
+

|
|
339
|
+

|
|
340
|
+

|
|
341
|
+

|
|
342
|
+

|
|
343
|
+

|
|
344
|
+

|
|
345
|
+

|
|
346
|
+

|
|
347
|
+
|
|
348
|
+
### Từ vựng bố cục 2: iconlist, quote, split, proscons, progress, harvey, heatmap, pins
|
|
349
|
+
|
|
350
|
+
Nguồn: [`examples/24-vocabulary-2.md`](examples/24-vocabulary-2.md)
|
|
351
|
+
|
|
352
|
+

|
|
353
|
+

|
|
354
|
+

|
|
355
|
+

|
|
356
|
+

|
|
357
|
+

|
|
358
|
+

|
|
359
|
+

|
|
360
|
+

|
|
361
|
+
|
|
362
|
+
### 25-roundtrip-forms
|
|
363
|
+
|
|
364
|
+
Nguồn: [`examples/25-roundtrip-forms.md`](examples/25-roundtrip-forms.md)
|
|
365
|
+
|
|
366
|
+

|
|
367
|
+

|
|
368
|
+

|
|
369
|
+

|
|
370
|
+

|
|
371
|
+

|
|
372
|
+

|
|
373
|
+
<!-- gallery:end -->
|
|
374
|
+
|
|
375
|
+
## Tài liệu
|
|
376
|
+
|
|
377
|
+
| File | Nội dung |
|
|
378
|
+
|---|---|
|
|
379
|
+
| [docs/SYNTAX.md](docs/SYNTAX.md) | Cú pháp |
|
|
380
|
+
| [docs/PLAN.md](docs/PLAN.md) | Kế hoạch 7 ngày và quy trình chạy hằng ngày |
|
|
381
|
+
| [docs/TARGETS.md](docs/TARGETS.md) | Mục tiêu L1–L7 |
|
|
382
|
+
| [docs/AGENT_TIPS.md](docs/AGENT_TIPS.md) | Mẹo cho Agent khi dùng thư viện |
|
|
383
|
+
| [docs/LESSONS.md](docs/LESSONS.md) | Lỗi đã gặp và cách giải quyết |
|
|
384
|
+
| [docs/DAILY_LOG.md](docs/DAILY_LOG.md) | Nhật ký hằng ngày |
|