codewave-openclaw-installer 1.0.2 → 2.1.0

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 (1060) hide show
  1. package/README.md +95 -22
  2. package/bin/check.mjs +623 -0
  3. package/bin/install-lib.mjs +215 -0
  4. package/bin/install.mjs +818 -76
  5. package/index.js +21 -0
  6. package/openclaw.plugin.json +11 -0
  7. package/package.json +28 -5
  8. package/skills/acceptance-doc-entry/SKILL.md +289 -0
  9. package/skills/meeting-to-prd/SKILL.md +210 -0
  10. package/skills/meeting-to-prd/references/meeting-notes-template.md +50 -0
  11. package/skills/meeting-to-prd/references/prd-reference.docx +0 -0
  12. package/skills/meeting-to-prd/references/prd-template.md +67 -0
  13. package/skills/pmo-weekly-report/SKILL.md +536 -0
  14. package/skills/popo-doc/SKILL.md +77 -0
  15. package/skills/popo-robot-api/SKILL.md +232 -0
  16. package/skills/ppt-master/SKILL.md +314 -0
  17. package/skills/ppt-master/projects/.gitkeep +0 -0
  18. package/skills/ppt-master/references/canvas-formats.md +73 -0
  19. package/skills/ppt-master/references/executor-base.md +198 -0
  20. package/skills/ppt-master/references/executor-consultant-top.md +218 -0
  21. package/skills/ppt-master/references/executor-consultant.md +197 -0
  22. package/skills/ppt-master/references/executor-general.md +122 -0
  23. package/skills/ppt-master/references/image-generator.md +444 -0
  24. package/skills/ppt-master/references/image-layout-spec.md +174 -0
  25. package/skills/ppt-master/references/shared-standards.md +442 -0
  26. package/skills/ppt-master/references/strategist.md +391 -0
  27. package/skills/ppt-master/references/svg-image-embedding.md +177 -0
  28. package/skills/ppt-master/references/template-designer.md +175 -0
  29. package/skills/ppt-master/scripts/README.md +78 -0
  30. package/skills/ppt-master/scripts/analyze_images.py +239 -0
  31. package/skills/ppt-master/scripts/assets/bg_48.png +0 -0
  32. package/skills/ppt-master/scripts/assets/bg_96.png +0 -0
  33. package/skills/ppt-master/scripts/batch_validate.py +309 -0
  34. package/skills/ppt-master/scripts/config.py +604 -0
  35. package/skills/ppt-master/scripts/doc_to_md.py +232 -0
  36. package/skills/ppt-master/scripts/docs/conversion.md +89 -0
  37. package/skills/ppt-master/scripts/docs/image.md +96 -0
  38. package/skills/ppt-master/scripts/docs/project.md +84 -0
  39. package/skills/ppt-master/scripts/docs/svg-pipeline.md +161 -0
  40. package/skills/ppt-master/scripts/docs/troubleshooting.md +62 -0
  41. package/skills/ppt-master/scripts/error_helper.py +438 -0
  42. package/skills/ppt-master/scripts/finalize_svg.py +302 -0
  43. package/skills/ppt-master/scripts/gemini_watermark_remover.py +230 -0
  44. package/skills/ppt-master/scripts/generate_examples_index.py +241 -0
  45. package/skills/ppt-master/scripts/image_backends/__init__.py +1 -0
  46. package/skills/ppt-master/scripts/image_backends/backend_aigw_gemini.py +209 -0
  47. package/skills/ppt-master/scripts/image_backends/backend_bfl.py +177 -0
  48. package/skills/ppt-master/scripts/image_backends/backend_common.py +244 -0
  49. package/skills/ppt-master/scripts/image_backends/backend_fal.py +127 -0
  50. package/skills/ppt-master/scripts/image_backends/backend_gemini.py +227 -0
  51. package/skills/ppt-master/scripts/image_backends/backend_ideogram.py +152 -0
  52. package/skills/ppt-master/scripts/image_backends/backend_openai.py +233 -0
  53. package/skills/ppt-master/scripts/image_backends/backend_qwen.py +197 -0
  54. package/skills/ppt-master/scripts/image_backends/backend_replicate.py +173 -0
  55. package/skills/ppt-master/scripts/image_backends/backend_siliconflow.py +180 -0
  56. package/skills/ppt-master/scripts/image_backends/backend_stability.py +143 -0
  57. package/skills/ppt-master/scripts/image_backends/backend_volcengine.py +187 -0
  58. package/skills/ppt-master/scripts/image_backends/backend_zhipu.py +188 -0
  59. package/skills/ppt-master/scripts/image_gen.py +412 -0
  60. package/skills/ppt-master/scripts/pdf_to_md.py +794 -0
  61. package/skills/ppt-master/scripts/pptx_animations.py +268 -0
  62. package/skills/ppt-master/scripts/project_manager.py +661 -0
  63. package/skills/ppt-master/scripts/project_utils.py +475 -0
  64. package/skills/ppt-master/scripts/rotate_images.py +583 -0
  65. package/skills/ppt-master/scripts/svg_finalize/__init__.py +1 -0
  66. package/skills/ppt-master/scripts/svg_finalize/crop_images.py +343 -0
  67. package/skills/ppt-master/scripts/svg_finalize/embed_icons.py +250 -0
  68. package/skills/ppt-master/scripts/svg_finalize/embed_images.py +184 -0
  69. package/skills/ppt-master/scripts/svg_finalize/fix_image_aspect.py +380 -0
  70. package/skills/ppt-master/scripts/svg_finalize/flatten_tspan.py +493 -0
  71. package/skills/ppt-master/scripts/svg_finalize/svg_rect_to_path.py +337 -0
  72. package/skills/ppt-master/scripts/svg_position_calculator.py +1486 -0
  73. package/skills/ppt-master/scripts/svg_quality_checker.py +487 -0
  74. package/skills/ppt-master/scripts/svg_to_pptx/__init__.py +17 -0
  75. package/skills/ppt-master/scripts/svg_to_pptx/drawingml_context.py +102 -0
  76. package/skills/ppt-master/scripts/svg_to_pptx/drawingml_converter.py +269 -0
  77. package/skills/ppt-master/scripts/svg_to_pptx/drawingml_elements.py +848 -0
  78. package/skills/ppt-master/scripts/svg_to_pptx/drawingml_paths.py +429 -0
  79. package/skills/ppt-master/scripts/svg_to_pptx/drawingml_styles.py +359 -0
  80. package/skills/ppt-master/scripts/svg_to_pptx/drawingml_utils.py +310 -0
  81. package/skills/ppt-master/scripts/svg_to_pptx/pptx_builder.py +366 -0
  82. package/skills/ppt-master/scripts/svg_to_pptx/pptx_cli.py +196 -0
  83. package/skills/ppt-master/scripts/svg_to_pptx/pptx_dimensions.py +148 -0
  84. package/skills/ppt-master/scripts/svg_to_pptx/pptx_discovery.py +101 -0
  85. package/skills/ppt-master/scripts/svg_to_pptx/pptx_media.py +86 -0
  86. package/skills/ppt-master/scripts/svg_to_pptx/pptx_notes.py +157 -0
  87. package/skills/ppt-master/scripts/svg_to_pptx/pptx_slide_xml.py +136 -0
  88. package/skills/ppt-master/scripts/svg_to_pptx.py +17 -0
  89. package/skills/ppt-master/scripts/total_md_split.py +367 -0
  90. package/skills/ppt-master/scripts/web_to_md.cjs +850 -0
  91. package/skills/ppt-master/scripts/web_to_md.py +755 -0
  92. package/skills/ppt-master/templates/README.md +48 -0
  93. package/skills/ppt-master/templates/charts/README.md +102 -0
  94. package/skills/ppt-master/templates/charts/area_chart.svg +255 -0
  95. package/skills/ppt-master/templates/charts/bar_chart.svg +185 -0
  96. package/skills/ppt-master/templates/charts/box_plot_chart.svg +308 -0
  97. package/skills/ppt-master/templates/charts/bubble_chart.svg +289 -0
  98. package/skills/ppt-master/templates/charts/bullet_chart.svg +214 -0
  99. package/skills/ppt-master/templates/charts/butterfly_chart.svg +247 -0
  100. package/skills/ppt-master/templates/charts/charts_index.json +286 -0
  101. package/skills/ppt-master/templates/charts/donut_chart.svg +246 -0
  102. package/skills/ppt-master/templates/charts/dual_axis_line_chart.svg +311 -0
  103. package/skills/ppt-master/templates/charts/dumbbell_chart.svg +196 -0
  104. package/skills/ppt-master/templates/charts/funnel_chart.svg +241 -0
  105. package/skills/ppt-master/templates/charts/gantt_chart.svg +315 -0
  106. package/skills/ppt-master/templates/charts/gauge_chart.svg +262 -0
  107. package/skills/ppt-master/templates/charts/grouped_bar_chart.svg +275 -0
  108. package/skills/ppt-master/templates/charts/heatmap_chart.svg +214 -0
  109. package/skills/ppt-master/templates/charts/horizontal_bar_chart.svg +213 -0
  110. package/skills/ppt-master/templates/charts/kpi_cards.svg +215 -0
  111. package/skills/ppt-master/templates/charts/line_chart.svg +218 -0
  112. package/skills/ppt-master/templates/charts/matrix_2x2.svg +334 -0
  113. package/skills/ppt-master/templates/charts/org_chart.svg +316 -0
  114. package/skills/ppt-master/templates/charts/pareto_chart.svg +227 -0
  115. package/skills/ppt-master/templates/charts/pie_chart.svg +215 -0
  116. package/skills/ppt-master/templates/charts/porter_five_forces.svg +246 -0
  117. package/skills/ppt-master/templates/charts/process_flow.svg +333 -0
  118. package/skills/ppt-master/templates/charts/progress_bar_chart.svg +295 -0
  119. package/skills/ppt-master/templates/charts/radar_chart.svg +158 -0
  120. package/skills/ppt-master/templates/charts/sankey_chart.svg +303 -0
  121. package/skills/ppt-master/templates/charts/scatter_chart.svg +235 -0
  122. package/skills/ppt-master/templates/charts/stacked_area_chart.svg +230 -0
  123. package/skills/ppt-master/templates/charts/stacked_bar_chart.svg +199 -0
  124. package/skills/ppt-master/templates/charts/swot_analysis.svg +277 -0
  125. package/skills/ppt-master/templates/charts/timeline.svg +279 -0
  126. package/skills/ppt-master/templates/charts/treemap_chart.svg +226 -0
  127. package/skills/ppt-master/templates/charts/waterfall_chart.svg +265 -0
  128. package/skills/ppt-master/templates/design_spec_reference.md +282 -0
  129. package/skills/ppt-master/templates/icons/FULL_INDEX.md +272 -0
  130. package/skills/ppt-master/templates/icons/README.md +75 -0
  131. package/skills/ppt-master/templates/icons/a.svg +4 -0
  132. package/skills/ppt-master/templates/icons/accessibility.svg +4 -0
  133. package/skills/ppt-master/templates/icons/activity.svg +5 -0
  134. package/skills/ppt-master/templates/icons/address-card.svg +4 -0
  135. package/skills/ppt-master/templates/icons/alarm-clock.svg +6 -0
  136. package/skills/ppt-master/templates/icons/alien.svg +4 -0
  137. package/skills/ppt-master/templates/icons/align-bottom.svg +6 -0
  138. package/skills/ppt-master/templates/icons/align-center-horizontal.svg +5 -0
  139. package/skills/ppt-master/templates/icons/align-center-vertical.svg +5 -0
  140. package/skills/ppt-master/templates/icons/align-left.svg +6 -0
  141. package/skills/ppt-master/templates/icons/align-right.svg +6 -0
  142. package/skills/ppt-master/templates/icons/align-text-center.svg +7 -0
  143. package/skills/ppt-master/templates/icons/align-text-justify.svg +7 -0
  144. package/skills/ppt-master/templates/icons/align-text-left.svg +7 -0
  145. package/skills/ppt-master/templates/icons/align-text-right.svg +7 -0
  146. package/skills/ppt-master/templates/icons/align-top.svg +6 -0
  147. package/skills/ppt-master/templates/icons/anchor.svg +4 -0
  148. package/skills/ppt-master/templates/icons/angle-down.svg +4 -0
  149. package/skills/ppt-master/templates/icons/angle-left.svg +4 -0
  150. package/skills/ppt-master/templates/icons/angle-right.svg +4 -0
  151. package/skills/ppt-master/templates/icons/angle-up.svg +4 -0
  152. package/skills/ppt-master/templates/icons/angles-down.svg +5 -0
  153. package/skills/ppt-master/templates/icons/angles-left.svg +5 -0
  154. package/skills/ppt-master/templates/icons/angles-right.svg +5 -0
  155. package/skills/ppt-master/templates/icons/angles-up.svg +5 -0
  156. package/skills/ppt-master/templates/icons/aperture.svg +9 -0
  157. package/skills/ppt-master/templates/icons/aquarius.svg +6 -0
  158. package/skills/ppt-master/templates/icons/archive-box.svg +5 -0
  159. package/skills/ppt-master/templates/icons/aries.svg +4 -0
  160. package/skills/ppt-master/templates/icons/arrow-down-from-line.svg +5 -0
  161. package/skills/ppt-master/templates/icons/arrow-down-left.svg +4 -0
  162. package/skills/ppt-master/templates/icons/arrow-down-right.svg +4 -0
  163. package/skills/ppt-master/templates/icons/arrow-down-short-wide.svg +7 -0
  164. package/skills/ppt-master/templates/icons/arrow-down-to-bracket.svg +5 -0
  165. package/skills/ppt-master/templates/icons/arrow-down-to-line.svg +5 -0
  166. package/skills/ppt-master/templates/icons/arrow-down-wide-short.svg +7 -0
  167. package/skills/ppt-master/templates/icons/arrow-down.svg +4 -0
  168. package/skills/ppt-master/templates/icons/arrow-left-arrow-right.svg +5 -0
  169. package/skills/ppt-master/templates/icons/arrow-left-from-line.svg +5 -0
  170. package/skills/ppt-master/templates/icons/arrow-left-to-line.svg +5 -0
  171. package/skills/ppt-master/templates/icons/arrow-left.svg +4 -0
  172. package/skills/ppt-master/templates/icons/arrow-right-from-bracket.svg +5 -0
  173. package/skills/ppt-master/templates/icons/arrow-right-from-line.svg +5 -0
  174. package/skills/ppt-master/templates/icons/arrow-right-to-bracket.svg +5 -0
  175. package/skills/ppt-master/templates/icons/arrow-right-to-line.svg +5 -0
  176. package/skills/ppt-master/templates/icons/arrow-right.svg +4 -0
  177. package/skills/ppt-master/templates/icons/arrow-rotate-left.svg +4 -0
  178. package/skills/ppt-master/templates/icons/arrow-rotate-right.svg +4 -0
  179. package/skills/ppt-master/templates/icons/arrow-trend-down.svg +4 -0
  180. package/skills/ppt-master/templates/icons/arrow-trend-up.svg +4 -0
  181. package/skills/ppt-master/templates/icons/arrow-turn-down-left.svg +4 -0
  182. package/skills/ppt-master/templates/icons/arrow-turn-down-right.svg +4 -0
  183. package/skills/ppt-master/templates/icons/arrow-turn-left-down.svg +4 -0
  184. package/skills/ppt-master/templates/icons/arrow-turn-left-up.svg +4 -0
  185. package/skills/ppt-master/templates/icons/arrow-turn-right-down.svg +4 -0
  186. package/skills/ppt-master/templates/icons/arrow-turn-right-up.svg +4 -0
  187. package/skills/ppt-master/templates/icons/arrow-turn-up-left.svg +4 -0
  188. package/skills/ppt-master/templates/icons/arrow-turn-up-right.svg +4 -0
  189. package/skills/ppt-master/templates/icons/arrow-u-down-left.svg +4 -0
  190. package/skills/ppt-master/templates/icons/arrow-u-down-right.svg +4 -0
  191. package/skills/ppt-master/templates/icons/arrow-u-left-down.svg +4 -0
  192. package/skills/ppt-master/templates/icons/arrow-u-left-up.svg +4 -0
  193. package/skills/ppt-master/templates/icons/arrow-u-right-down.svg +4 -0
  194. package/skills/ppt-master/templates/icons/arrow-u-right-up.svg +4 -0
  195. package/skills/ppt-master/templates/icons/arrow-u-up-left.svg +4 -0
  196. package/skills/ppt-master/templates/icons/arrow-u-up-right.svg +4 -0
  197. package/skills/ppt-master/templates/icons/arrow-up-arrow-down.svg +5 -0
  198. package/skills/ppt-master/templates/icons/arrow-up-from-bracket.svg +5 -0
  199. package/skills/ppt-master/templates/icons/arrow-up-from-line.svg +5 -0
  200. package/skills/ppt-master/templates/icons/arrow-up-left.svg +4 -0
  201. package/skills/ppt-master/templates/icons/arrow-up-right-from-square.svg +5 -0
  202. package/skills/ppt-master/templates/icons/arrow-up-right.svg +4 -0
  203. package/skills/ppt-master/templates/icons/arrow-up-short-wide.svg +7 -0
  204. package/skills/ppt-master/templates/icons/arrow-up-to-line.svg +5 -0
  205. package/skills/ppt-master/templates/icons/arrow-up-wide-short.svg +7 -0
  206. package/skills/ppt-master/templates/icons/arrow-up.svg +4 -0
  207. package/skills/ppt-master/templates/icons/arrows-left-right.svg +4 -0
  208. package/skills/ppt-master/templates/icons/arrows-repeat.svg +5 -0
  209. package/skills/ppt-master/templates/icons/arrows-rotate-clockwise.svg +5 -0
  210. package/skills/ppt-master/templates/icons/arrows-rotate-counter-clockwise.svg +5 -0
  211. package/skills/ppt-master/templates/icons/arrows-up-down.svg +4 -0
  212. package/skills/ppt-master/templates/icons/at.svg +4 -0
  213. package/skills/ppt-master/templates/icons/axe.svg +4 -0
  214. package/skills/ppt-master/templates/icons/b.svg +4 -0
  215. package/skills/ppt-master/templates/icons/badge-check.svg +4 -0
  216. package/skills/ppt-master/templates/icons/badge.svg +4 -0
  217. package/skills/ppt-master/templates/icons/ban.svg +4 -0
  218. package/skills/ppt-master/templates/icons/baseball-bat.svg +5 -0
  219. package/skills/ppt-master/templates/icons/baseball.svg +6 -0
  220. package/skills/ppt-master/templates/icons/basketball.svg +9 -0
  221. package/skills/ppt-master/templates/icons/battery-charge.svg +5 -0
  222. package/skills/ppt-master/templates/icons/battery-empty.svg +4 -0
  223. package/skills/ppt-master/templates/icons/battery-full.svg +4 -0
  224. package/skills/ppt-master/templates/icons/battery-half.svg +4 -0
  225. package/skills/ppt-master/templates/icons/battery-slash.svg +5 -0
  226. package/skills/ppt-master/templates/icons/bed.svg +4 -0
  227. package/skills/ppt-master/templates/icons/bee.svg +5 -0
  228. package/skills/ppt-master/templates/icons/bell-slash.svg +6 -0
  229. package/skills/ppt-master/templates/icons/bell.svg +5 -0
  230. package/skills/ppt-master/templates/icons/bicycle.svg +7 -0
  231. package/skills/ppt-master/templates/icons/bishop.svg +4 -0
  232. package/skills/ppt-master/templates/icons/block-quote.svg +8 -0
  233. package/skills/ppt-master/templates/icons/bluetooth.svg +4 -0
  234. package/skills/ppt-master/templates/icons/bold.svg +4 -0
  235. package/skills/ppt-master/templates/icons/bolt.svg +4 -0
  236. package/skills/ppt-master/templates/icons/bomb.svg +6 -0
  237. package/skills/ppt-master/templates/icons/bone.svg +4 -0
  238. package/skills/ppt-master/templates/icons/book-open.svg +4 -0
  239. package/skills/ppt-master/templates/icons/book.svg +4 -0
  240. package/skills/ppt-master/templates/icons/bookmark-plus.svg +4 -0
  241. package/skills/ppt-master/templates/icons/bookmark.svg +4 -0
  242. package/skills/ppt-master/templates/icons/books.svg +6 -0
  243. package/skills/ppt-master/templates/icons/bottle.svg +5 -0
  244. package/skills/ppt-master/templates/icons/bow-and-arrow.svg +4 -0
  245. package/skills/ppt-master/templates/icons/bowl.svg +5 -0
  246. package/skills/ppt-master/templates/icons/box.svg +4 -0
  247. package/skills/ppt-master/templates/icons/bridge.svg +4 -0
  248. package/skills/ppt-master/templates/icons/british-pound.svg +4 -0
  249. package/skills/ppt-master/templates/icons/browser.svg +4 -0
  250. package/skills/ppt-master/templates/icons/brush.svg +5 -0
  251. package/skills/ppt-master/templates/icons/bug.svg +5 -0
  252. package/skills/ppt-master/templates/icons/building.svg +4 -0
  253. package/skills/ppt-master/templates/icons/bullhorn.svg +5 -0
  254. package/skills/ppt-master/templates/icons/burger.svg +6 -0
  255. package/skills/ppt-master/templates/icons/bus.svg +4 -0
  256. package/skills/ppt-master/templates/icons/butterfly.svg +4 -0
  257. package/skills/ppt-master/templates/icons/c.svg +4 -0
  258. package/skills/ppt-master/templates/icons/cake-slice.svg +5 -0
  259. package/skills/ppt-master/templates/icons/cake.svg +8 -0
  260. package/skills/ppt-master/templates/icons/calculator.svg +4 -0
  261. package/skills/ppt-master/templates/icons/calendar.svg +5 -0
  262. package/skills/ppt-master/templates/icons/camera-slash.svg +5 -0
  263. package/skills/ppt-master/templates/icons/camera.svg +4 -0
  264. package/skills/ppt-master/templates/icons/cancer.svg +5 -0
  265. package/skills/ppt-master/templates/icons/capricorn.svg +4 -0
  266. package/skills/ppt-master/templates/icons/car.svg +4 -0
  267. package/skills/ppt-master/templates/icons/card-stack.svg +6 -0
  268. package/skills/ppt-master/templates/icons/caret-down.svg +4 -0
  269. package/skills/ppt-master/templates/icons/caret-left.svg +4 -0
  270. package/skills/ppt-master/templates/icons/caret-right.svg +4 -0
  271. package/skills/ppt-master/templates/icons/caret-up.svg +4 -0
  272. package/skills/ppt-master/templates/icons/castle.svg +4 -0
  273. package/skills/ppt-master/templates/icons/cat.svg +5 -0
  274. package/skills/ppt-master/templates/icons/chair.svg +5 -0
  275. package/skills/ppt-master/templates/icons/chart-bar.svg +6 -0
  276. package/skills/ppt-master/templates/icons/chart-line.svg +5 -0
  277. package/skills/ppt-master/templates/icons/chart-pie.svg +5 -0
  278. package/skills/ppt-master/templates/icons/checkmark.svg +4 -0
  279. package/skills/ppt-master/templates/icons/circle-3-dots-horizontal.svg +4 -0
  280. package/skills/ppt-master/templates/icons/circle-3-dots-vertical.svg +4 -0
  281. package/skills/ppt-master/templates/icons/circle-arrow-down-left.svg +4 -0
  282. package/skills/ppt-master/templates/icons/circle-arrow-down-right.svg +4 -0
  283. package/skills/ppt-master/templates/icons/circle-arrow-down.svg +4 -0
  284. package/skills/ppt-master/templates/icons/circle-arrow-left.svg +4 -0
  285. package/skills/ppt-master/templates/icons/circle-arrow-right.svg +4 -0
  286. package/skills/ppt-master/templates/icons/circle-arrow-up-left.svg +4 -0
  287. package/skills/ppt-master/templates/icons/circle-arrow-up-right.svg +4 -0
  288. package/skills/ppt-master/templates/icons/circle-arrow-up.svg +4 -0
  289. package/skills/ppt-master/templates/icons/circle-checkmark.svg +4 -0
  290. package/skills/ppt-master/templates/icons/circle-divide.svg +4 -0
  291. package/skills/ppt-master/templates/icons/circle-equals.svg +4 -0
  292. package/skills/ppt-master/templates/icons/circle-exclamation.svg +4 -0
  293. package/skills/ppt-master/templates/icons/circle-half.svg +4 -0
  294. package/skills/ppt-master/templates/icons/circle-info.svg +4 -0
  295. package/skills/ppt-master/templates/icons/circle-minus.svg +4 -0
  296. package/skills/ppt-master/templates/icons/circle-number-0.svg +5 -0
  297. package/skills/ppt-master/templates/icons/circle-number-1.svg +4 -0
  298. package/skills/ppt-master/templates/icons/circle-number-2.svg +4 -0
  299. package/skills/ppt-master/templates/icons/circle-number-3.svg +4 -0
  300. package/skills/ppt-master/templates/icons/circle-number-4.svg +4 -0
  301. package/skills/ppt-master/templates/icons/circle-number-5.svg +4 -0
  302. package/skills/ppt-master/templates/icons/circle-number-6.svg +5 -0
  303. package/skills/ppt-master/templates/icons/circle-number-7.svg +4 -0
  304. package/skills/ppt-master/templates/icons/circle-number-8.svg +6 -0
  305. package/skills/ppt-master/templates/icons/circle-number-9.svg +5 -0
  306. package/skills/ppt-master/templates/icons/circle-pause.svg +4 -0
  307. package/skills/ppt-master/templates/icons/circle-play.svg +4 -0
  308. package/skills/ppt-master/templates/icons/circle-plus.svg +4 -0
  309. package/skills/ppt-master/templates/icons/circle-question.svg +4 -0
  310. package/skills/ppt-master/templates/icons/circle-stop.svg +4 -0
  311. package/skills/ppt-master/templates/icons/circle-user.svg +5 -0
  312. package/skills/ppt-master/templates/icons/circle-x.svg +4 -0
  313. package/skills/ppt-master/templates/icons/circle.svg +4 -0
  314. package/skills/ppt-master/templates/icons/citrus-slice.svg +7 -0
  315. package/skills/ppt-master/templates/icons/city.svg +4 -0
  316. package/skills/ppt-master/templates/icons/clipboard.svg +5 -0
  317. package/skills/ppt-master/templates/icons/clock.svg +4 -0
  318. package/skills/ppt-master/templates/icons/closed-captioning.svg +4 -0
  319. package/skills/ppt-master/templates/icons/clothes-hanger.svg +4 -0
  320. package/skills/ppt-master/templates/icons/cloud-arrow-down.svg +4 -0
  321. package/skills/ppt-master/templates/icons/cloud-arrow-up.svg +4 -0
  322. package/skills/ppt-master/templates/icons/cloud-fog.svg +7 -0
  323. package/skills/ppt-master/templates/icons/cloud-lightning.svg +5 -0
  324. package/skills/ppt-master/templates/icons/cloud-rain.svg +7 -0
  325. package/skills/ppt-master/templates/icons/cloud-snow.svg +9 -0
  326. package/skills/ppt-master/templates/icons/cloud.svg +4 -0
  327. package/skills/ppt-master/templates/icons/club.svg +4 -0
  328. package/skills/ppt-master/templates/icons/cocktail.svg +4 -0
  329. package/skills/ppt-master/templates/icons/code-block.svg +4 -0
  330. package/skills/ppt-master/templates/icons/code.svg +6 -0
  331. package/skills/ppt-master/templates/icons/cog.svg +4 -0
  332. package/skills/ppt-master/templates/icons/coin.svg +4 -0
  333. package/skills/ppt-master/templates/icons/columns.svg +5 -0
  334. package/skills/ppt-master/templates/icons/command.svg +4 -0
  335. package/skills/ppt-master/templates/icons/comment-dots.svg +4 -0
  336. package/skills/ppt-master/templates/icons/comment.svg +4 -0
  337. package/skills/ppt-master/templates/icons/comments-slash.svg +5 -0
  338. package/skills/ppt-master/templates/icons/comments.svg +5 -0
  339. package/skills/ppt-master/templates/icons/compact-disc.svg +4 -0
  340. package/skills/ppt-master/templates/icons/compass-drafting.svg +5 -0
  341. package/skills/ppt-master/templates/icons/compass.svg +5 -0
  342. package/skills/ppt-master/templates/icons/component.svg +7 -0
  343. package/skills/ppt-master/templates/icons/copy.svg +5 -0
  344. package/skills/ppt-master/templates/icons/copyright.svg +4 -0
  345. package/skills/ppt-master/templates/icons/credit-card.svg +5 -0
  346. package/skills/ppt-master/templates/icons/crop.svg +5 -0
  347. package/skills/ppt-master/templates/icons/crosshairs.svg +5 -0
  348. package/skills/ppt-master/templates/icons/crown.svg +4 -0
  349. package/skills/ppt-master/templates/icons/crystal-ball.svg +5 -0
  350. package/skills/ppt-master/templates/icons/cube.svg +4 -0
  351. package/skills/ppt-master/templates/icons/cupcake.svg +5 -0
  352. package/skills/ppt-master/templates/icons/curling-stone.svg +5 -0
  353. package/skills/ppt-master/templates/icons/cursor-click.svg +7 -0
  354. package/skills/ppt-master/templates/icons/cursor.svg +4 -0
  355. package/skills/ppt-master/templates/icons/d-pad.svg +7 -0
  356. package/skills/ppt-master/templates/icons/d.svg +4 -0
  357. package/skills/ppt-master/templates/icons/database.svg +6 -0
  358. package/skills/ppt-master/templates/icons/delete.svg +4 -0
  359. package/skills/ppt-master/templates/icons/desktop.svg +4 -0
  360. package/skills/ppt-master/templates/icons/diamond-exclamation.svg +4 -0
  361. package/skills/ppt-master/templates/icons/diamond-half.svg +4 -0
  362. package/skills/ppt-master/templates/icons/diamond-shape.svg +4 -0
  363. package/skills/ppt-master/templates/icons/diamond.svg +4 -0
  364. package/skills/ppt-master/templates/icons/dice.svg +5 -0
  365. package/skills/ppt-master/templates/icons/die-1.svg +4 -0
  366. package/skills/ppt-master/templates/icons/die-2.svg +4 -0
  367. package/skills/ppt-master/templates/icons/die-3.svg +4 -0
  368. package/skills/ppt-master/templates/icons/die-4.svg +4 -0
  369. package/skills/ppt-master/templates/icons/die-5.svg +4 -0
  370. package/skills/ppt-master/templates/icons/die-6.svg +4 -0
  371. package/skills/ppt-master/templates/icons/distribute-horizontal.svg +6 -0
  372. package/skills/ppt-master/templates/icons/distribute-vertical.svg +6 -0
  373. package/skills/ppt-master/templates/icons/divide.svg +6 -0
  374. package/skills/ppt-master/templates/icons/dna.svg +4 -0
  375. package/skills/ppt-master/templates/icons/dog.svg +4 -0
  376. package/skills/ppt-master/templates/icons/dollar.svg +4 -0
  377. package/skills/ppt-master/templates/icons/door-open.svg +4 -0
  378. package/skills/ppt-master/templates/icons/door.svg +4 -0
  379. package/skills/ppt-master/templates/icons/dots-horizontal.svg +6 -0
  380. package/skills/ppt-master/templates/icons/dots-vertical.svg +6 -0
  381. package/skills/ppt-master/templates/icons/droplet.svg +4 -0
  382. package/skills/ppt-master/templates/icons/e.svg +4 -0
  383. package/skills/ppt-master/templates/icons/ear-slash.svg +5 -0
  384. package/skills/ppt-master/templates/icons/ear.svg +4 -0
  385. package/skills/ppt-master/templates/icons/eject.svg +5 -0
  386. package/skills/ppt-master/templates/icons/envelope.svg +5 -0
  387. package/skills/ppt-master/templates/icons/equals.svg +5 -0
  388. package/skills/ppt-master/templates/icons/euro.svg +4 -0
  389. package/skills/ppt-master/templates/icons/exclude.svg +4 -0
  390. package/skills/ppt-master/templates/icons/eye-slash.svg +5 -0
  391. package/skills/ppt-master/templates/icons/eye.svg +4 -0
  392. package/skills/ppt-master/templates/icons/eyedropper.svg +5 -0
  393. package/skills/ppt-master/templates/icons/f.svg +4 -0
  394. package/skills/ppt-master/templates/icons/face-angry.svg +4 -0
  395. package/skills/ppt-master/templates/icons/face-cry.svg +4 -0
  396. package/skills/ppt-master/templates/icons/face-id.svg +10 -0
  397. package/skills/ppt-master/templates/icons/face-laugh.svg +4 -0
  398. package/skills/ppt-master/templates/icons/face-meh.svg +4 -0
  399. package/skills/ppt-master/templates/icons/face-melt.svg +4 -0
  400. package/skills/ppt-master/templates/icons/face-no-mouth.svg +4 -0
  401. package/skills/ppt-master/templates/icons/face-open-mouth.svg +4 -0
  402. package/skills/ppt-master/templates/icons/face-sad.svg +4 -0
  403. package/skills/ppt-master/templates/icons/face-smile.svg +4 -0
  404. package/skills/ppt-master/templates/icons/factory.svg +4 -0
  405. package/skills/ppt-master/templates/icons/fast-forward.svg +4 -0
  406. package/skills/ppt-master/templates/icons/file-plus.svg +4 -0
  407. package/skills/ppt-master/templates/icons/file.svg +5 -0
  408. package/skills/ppt-master/templates/icons/files.svg +5 -0
  409. package/skills/ppt-master/templates/icons/film.svg +4 -0
  410. package/skills/ppt-master/templates/icons/filter.svg +7 -0
  411. package/skills/ppt-master/templates/icons/fire.svg +4 -0
  412. package/skills/ppt-master/templates/icons/fireplace.svg +5 -0
  413. package/skills/ppt-master/templates/icons/fish.svg +4 -0
  414. package/skills/ppt-master/templates/icons/flag.svg +4 -0
  415. package/skills/ppt-master/templates/icons/floppy-disk.svg +5 -0
  416. package/skills/ppt-master/templates/icons/flower.svg +6 -0
  417. package/skills/ppt-master/templates/icons/folder-open.svg +4 -0
  418. package/skills/ppt-master/templates/icons/folder.svg +4 -0
  419. package/skills/ppt-master/templates/icons/folders.svg +5 -0
  420. package/skills/ppt-master/templates/icons/font-case.svg +5 -0
  421. package/skills/ppt-master/templates/icons/football.svg +4 -0
  422. package/skills/ppt-master/templates/icons/frame.svg +4 -0
  423. package/skills/ppt-master/templates/icons/funnel.svg +4 -0
  424. package/skills/ppt-master/templates/icons/g.svg +4 -0
  425. package/skills/ppt-master/templates/icons/game-controller.svg +4 -0
  426. package/skills/ppt-master/templates/icons/gauge-high.svg +4 -0
  427. package/skills/ppt-master/templates/icons/gauge-low.svg +4 -0
  428. package/skills/ppt-master/templates/icons/gauge-medium.svg +4 -0
  429. package/skills/ppt-master/templates/icons/gem.svg +4 -0
  430. package/skills/ppt-master/templates/icons/gemini.svg +4 -0
  431. package/skills/ppt-master/templates/icons/ghost.svg +4 -0
  432. package/skills/ppt-master/templates/icons/gift.svg +6 -0
  433. package/skills/ppt-master/templates/icons/git-branch.svg +4 -0
  434. package/skills/ppt-master/templates/icons/git-commit.svg +4 -0
  435. package/skills/ppt-master/templates/icons/git-compare.svg +5 -0
  436. package/skills/ppt-master/templates/icons/git-fork.svg +4 -0
  437. package/skills/ppt-master/templates/icons/git-merge.svg +4 -0
  438. package/skills/ppt-master/templates/icons/glasses.svg +4 -0
  439. package/skills/ppt-master/templates/icons/globe.svg +7 -0
  440. package/skills/ppt-master/templates/icons/grid-masonry.svg +7 -0
  441. package/skills/ppt-master/templates/icons/grid.svg +4 -0
  442. package/skills/ppt-master/templates/icons/grip-horizontal.svg +9 -0
  443. package/skills/ppt-master/templates/icons/grip-vertical.svg +9 -0
  444. package/skills/ppt-master/templates/icons/group.svg +15 -0
  445. package/skills/ppt-master/templates/icons/h.svg +4 -0
  446. package/skills/ppt-master/templates/icons/hammer.svg +5 -0
  447. package/skills/ppt-master/templates/icons/hand-tap.svg +7 -0
  448. package/skills/ppt-master/templates/icons/hand.svg +4 -0
  449. package/skills/ppt-master/templates/icons/hashtag.svg +4 -0
  450. package/skills/ppt-master/templates/icons/head-side.svg +4 -0
  451. package/skills/ppt-master/templates/icons/headlights.svg +7 -0
  452. package/skills/ppt-master/templates/icons/headphones.svg +4 -0
  453. package/skills/ppt-master/templates/icons/heart-broken.svg +4 -0
  454. package/skills/ppt-master/templates/icons/heart-half.svg +4 -0
  455. package/skills/ppt-master/templates/icons/heart.svg +4 -0
  456. package/skills/ppt-master/templates/icons/hexagon.svg +4 -0
  457. package/skills/ppt-master/templates/icons/hockey.svg +6 -0
  458. package/skills/ppt-master/templates/icons/home-1.svg +4 -0
  459. package/skills/ppt-master/templates/icons/home.svg +4 -0
  460. package/skills/ppt-master/templates/icons/hospital.svg +4 -0
  461. package/skills/ppt-master/templates/icons/hourglass-empty.svg +4 -0
  462. package/skills/ppt-master/templates/icons/hourglass-half-bottom.svg +4 -0
  463. package/skills/ppt-master/templates/icons/hourglass-half-top.svg +4 -0
  464. package/skills/ppt-master/templates/icons/i-cursor.svg +4 -0
  465. package/skills/ppt-master/templates/icons/i.svg +4 -0
  466. package/skills/ppt-master/templates/icons/ice-cream.svg +5 -0
  467. package/skills/ppt-master/templates/icons/icons_index.json +257 -0
  468. package/skills/ppt-master/templates/icons/image.svg +4 -0
  469. package/skills/ppt-master/templates/icons/images.svg +5 -0
  470. package/skills/ppt-master/templates/icons/inbox.svg +4 -0
  471. package/skills/ppt-master/templates/icons/indent.svg +8 -0
  472. package/skills/ppt-master/templates/icons/intersect.svg +4 -0
  473. package/skills/ppt-master/templates/icons/italic.svg +4 -0
  474. package/skills/ppt-master/templates/icons/j.svg +4 -0
  475. package/skills/ppt-master/templates/icons/jersey.svg +5 -0
  476. package/skills/ppt-master/templates/icons/joystick.svg +4 -0
  477. package/skills/ppt-master/templates/icons/k.svg +4 -0
  478. package/skills/ppt-master/templates/icons/key-skeleton.svg +4 -0
  479. package/skills/ppt-master/templates/icons/key.svg +4 -0
  480. package/skills/ppt-master/templates/icons/keyboard.svg +14 -0
  481. package/skills/ppt-master/templates/icons/keyhole.svg +4 -0
  482. package/skills/ppt-master/templates/icons/king.svg +4 -0
  483. package/skills/ppt-master/templates/icons/knight.svg +4 -0
  484. package/skills/ppt-master/templates/icons/l.svg +4 -0
  485. package/skills/ppt-master/templates/icons/label.svg +4 -0
  486. package/skills/ppt-master/templates/icons/ladder.svg +4 -0
  487. package/skills/ppt-master/templates/icons/lamp.svg +5 -0
  488. package/skills/ppt-master/templates/icons/language.svg +4 -0
  489. package/skills/ppt-master/templates/icons/laptop.svg +5 -0
  490. package/skills/ppt-master/templates/icons/laundry-machine.svg +4 -0
  491. package/skills/ppt-master/templates/icons/layers.svg +6 -0
  492. package/skills/ppt-master/templates/icons/leaf.svg +4 -0
  493. package/skills/ppt-master/templates/icons/leo.svg +4 -0
  494. package/skills/ppt-master/templates/icons/libra.svg +5 -0
  495. package/skills/ppt-master/templates/icons/life-ring.svg +4 -0
  496. package/skills/ppt-master/templates/icons/lightbulb.svg +4 -0
  497. package/skills/ppt-master/templates/icons/lines-magnifying-glass.svg +8 -0
  498. package/skills/ppt-master/templates/icons/lines-plus.svg +8 -0
  499. package/skills/ppt-master/templates/icons/lines.svg +7 -0
  500. package/skills/ppt-master/templates/icons/link.svg +6 -0
  501. package/skills/ppt-master/templates/icons/list-ordered.svg +9 -0
  502. package/skills/ppt-master/templates/icons/list.svg +11 -0
  503. package/skills/ppt-master/templates/icons/location-arrow-slash.svg +5 -0
  504. package/skills/ppt-master/templates/icons/location-arrow.svg +4 -0
  505. package/skills/ppt-master/templates/icons/location-target.svg +5 -0
  506. package/skills/ppt-master/templates/icons/lock-closed.svg +4 -0
  507. package/skills/ppt-master/templates/icons/lock-open.svg +4 -0
  508. package/skills/ppt-master/templates/icons/m.svg +4 -0
  509. package/skills/ppt-master/templates/icons/magnet.svg +6 -0
  510. package/skills/ppt-master/templates/icons/magnifying-glass.svg +4 -0
  511. package/skills/ppt-master/templates/icons/mailbox.svg +4 -0
  512. package/skills/ppt-master/templates/icons/map-pin.svg +4 -0
  513. package/skills/ppt-master/templates/icons/map.svg +6 -0
  514. package/skills/ppt-master/templates/icons/maximize.svg +5 -0
  515. package/skills/ppt-master/templates/icons/meeple.svg +4 -0
  516. package/skills/ppt-master/templates/icons/megaphone.svg +4 -0
  517. package/skills/ppt-master/templates/icons/meteor.svg +4 -0
  518. package/skills/ppt-master/templates/icons/microchip.svg +5 -0
  519. package/skills/ppt-master/templates/icons/microphone-slash.svg +6 -0
  520. package/skills/ppt-master/templates/icons/microphone.svg +5 -0
  521. package/skills/ppt-master/templates/icons/minimize.svg +5 -0
  522. package/skills/ppt-master/templates/icons/minus.svg +4 -0
  523. package/skills/ppt-master/templates/icons/mobile.svg +4 -0
  524. package/skills/ppt-master/templates/icons/money.svg +8 -0
  525. package/skills/ppt-master/templates/icons/moon-cloud.svg +6 -0
  526. package/skills/ppt-master/templates/icons/moon-fog.svg +7 -0
  527. package/skills/ppt-master/templates/icons/moon.svg +5 -0
  528. package/skills/ppt-master/templates/icons/mortarboard.svg +5 -0
  529. package/skills/ppt-master/templates/icons/mountains.svg +4 -0
  530. package/skills/ppt-master/templates/icons/mouse.svg +6 -0
  531. package/skills/ppt-master/templates/icons/move-down.svg +6 -0
  532. package/skills/ppt-master/templates/icons/move-up.svg +6 -0
  533. package/skills/ppt-master/templates/icons/mug.svg +7 -0
  534. package/skills/ppt-master/templates/icons/museum.svg +5 -0
  535. package/skills/ppt-master/templates/icons/music.svg +4 -0
  536. package/skills/ppt-master/templates/icons/n.svg +4 -0
  537. package/skills/ppt-master/templates/icons/newspaper.svg +4 -0
  538. package/skills/ppt-master/templates/icons/number-0-alt.svg +4 -0
  539. package/skills/ppt-master/templates/icons/number-0.svg +4 -0
  540. package/skills/ppt-master/templates/icons/number-1-alt.svg +4 -0
  541. package/skills/ppt-master/templates/icons/number-1.svg +4 -0
  542. package/skills/ppt-master/templates/icons/number-2-alt.svg +4 -0
  543. package/skills/ppt-master/templates/icons/number-2.svg +4 -0
  544. package/skills/ppt-master/templates/icons/number-3-alt.svg +4 -0
  545. package/skills/ppt-master/templates/icons/number-3.svg +4 -0
  546. package/skills/ppt-master/templates/icons/number-4-alt.svg +4 -0
  547. package/skills/ppt-master/templates/icons/number-4.svg +4 -0
  548. package/skills/ppt-master/templates/icons/number-5-alt.svg +4 -0
  549. package/skills/ppt-master/templates/icons/number-5.svg +4 -0
  550. package/skills/ppt-master/templates/icons/number-6-alt.svg +4 -0
  551. package/skills/ppt-master/templates/icons/number-6.svg +4 -0
  552. package/skills/ppt-master/templates/icons/number-7-alt.svg +4 -0
  553. package/skills/ppt-master/templates/icons/number-7.svg +4 -0
  554. package/skills/ppt-master/templates/icons/number-8-alt.svg +4 -0
  555. package/skills/ppt-master/templates/icons/number-8.svg +4 -0
  556. package/skills/ppt-master/templates/icons/number-9-alt.svg +4 -0
  557. package/skills/ppt-master/templates/icons/number-9.svg +4 -0
  558. package/skills/ppt-master/templates/icons/nut.svg +4 -0
  559. package/skills/ppt-master/templates/icons/o.svg +4 -0
  560. package/skills/ppt-master/templates/icons/octagon-exclamation.svg +4 -0
  561. package/skills/ppt-master/templates/icons/octagon.svg +4 -0
  562. package/skills/ppt-master/templates/icons/option.svg +5 -0
  563. package/skills/ppt-master/templates/icons/outdent.svg +8 -0
  564. package/skills/ppt-master/templates/icons/outlet.svg +4 -0
  565. package/skills/ppt-master/templates/icons/p.svg +4 -0
  566. package/skills/ppt-master/templates/icons/paint-bucket.svg +5 -0
  567. package/skills/ppt-master/templates/icons/paint-roller.svg +4 -0
  568. package/skills/ppt-master/templates/icons/painting.svg +5 -0
  569. package/skills/ppt-master/templates/icons/palette.svg +4 -0
  570. package/skills/ppt-master/templates/icons/pants.svg +4 -0
  571. package/skills/ppt-master/templates/icons/paper-plane.svg +4 -0
  572. package/skills/ppt-master/templates/icons/paperclip.svg +4 -0
  573. package/skills/ppt-master/templates/icons/pause.svg +5 -0
  574. package/skills/ppt-master/templates/icons/paw.svg +8 -0
  575. package/skills/ppt-master/templates/icons/pawn.svg +4 -0
  576. package/skills/ppt-master/templates/icons/pen-nib.svg +4 -0
  577. package/skills/ppt-master/templates/icons/pencil-square.svg +5 -0
  578. package/skills/ppt-master/templates/icons/pencil.svg +5 -0
  579. package/skills/ppt-master/templates/icons/percent.svg +6 -0
  580. package/skills/ppt-master/templates/icons/person-walking.svg +5 -0
  581. package/skills/ppt-master/templates/icons/person-wave.svg +5 -0
  582. package/skills/ppt-master/templates/icons/person.svg +5 -0
  583. package/skills/ppt-master/templates/icons/phone-slash.svg +5 -0
  584. package/skills/ppt-master/templates/icons/phone.svg +4 -0
  585. package/skills/ppt-master/templates/icons/pills.svg +6 -0
  586. package/skills/ppt-master/templates/icons/pisces.svg +4 -0
  587. package/skills/ppt-master/templates/icons/pizza.svg +5 -0
  588. package/skills/ppt-master/templates/icons/plane.svg +4 -0
  589. package/skills/ppt-master/templates/icons/planet.svg +5 -0
  590. package/skills/ppt-master/templates/icons/play-pause.svg +6 -0
  591. package/skills/ppt-master/templates/icons/play.svg +4 -0
  592. package/skills/ppt-master/templates/icons/playing-card.svg +4 -0
  593. package/skills/ppt-master/templates/icons/plug.svg +4 -0
  594. package/skills/ppt-master/templates/icons/plus.svg +4 -0
  595. package/skills/ppt-master/templates/icons/point-down.svg +4 -0
  596. package/skills/ppt-master/templates/icons/point-left.svg +4 -0
  597. package/skills/ppt-master/templates/icons/point-right.svg +4 -0
  598. package/skills/ppt-master/templates/icons/point-up.svg +4 -0
  599. package/skills/ppt-master/templates/icons/poop.svg +4 -0
  600. package/skills/ppt-master/templates/icons/potion-empty.svg +4 -0
  601. package/skills/ppt-master/templates/icons/potion-full.svg +4 -0
  602. package/skills/ppt-master/templates/icons/potion-half.svg +4 -0
  603. package/skills/ppt-master/templates/icons/power.svg +5 -0
  604. package/skills/ppt-master/templates/icons/printer.svg +5 -0
  605. package/skills/ppt-master/templates/icons/q.svg +4 -0
  606. package/skills/ppt-master/templates/icons/queen.svg +5 -0
  607. package/skills/ppt-master/templates/icons/question-mark.svg +5 -0
  608. package/skills/ppt-master/templates/icons/quote-left.svg +5 -0
  609. package/skills/ppt-master/templates/icons/quote-right.svg +5 -0
  610. package/skills/ppt-master/templates/icons/radar.svg +4 -0
  611. package/skills/ppt-master/templates/icons/radioactive.svg +4 -0
  612. package/skills/ppt-master/templates/icons/rainbow-cloud.svg +6 -0
  613. package/skills/ppt-master/templates/icons/rainbow.svg +5 -0
  614. package/skills/ppt-master/templates/icons/receipt.svg +4 -0
  615. package/skills/ppt-master/templates/icons/recycle.svg +6 -0
  616. package/skills/ppt-master/templates/icons/reflect-horizontal.svg +6 -0
  617. package/skills/ppt-master/templates/icons/reflect-vertical.svg +6 -0
  618. package/skills/ppt-master/templates/icons/rewind.svg +4 -0
  619. package/skills/ppt-master/templates/icons/robot.svg +4 -0
  620. package/skills/ppt-master/templates/icons/rocket.svg +5 -0
  621. package/skills/ppt-master/templates/icons/rook.svg +4 -0
  622. package/skills/ppt-master/templates/icons/route.svg +6 -0
  623. package/skills/ppt-master/templates/icons/rows.svg +5 -0
  624. package/skills/ppt-master/templates/icons/rss.svg +6 -0
  625. package/skills/ppt-master/templates/icons/ruler.svg +4 -0
  626. package/skills/ppt-master/templates/icons/s.svg +4 -0
  627. package/skills/ppt-master/templates/icons/sagittarius.svg +4 -0
  628. package/skills/ppt-master/templates/icons/scissors.svg +5 -0
  629. package/skills/ppt-master/templates/icons/scooter.svg +4 -0
  630. package/skills/ppt-master/templates/icons/scorpio.svg +4 -0
  631. package/skills/ppt-master/templates/icons/screencast.svg +6 -0
  632. package/skills/ppt-master/templates/icons/screw.svg +6 -0
  633. package/skills/ppt-master/templates/icons/screwdriver.svg +5 -0
  634. package/skills/ppt-master/templates/icons/scribble.svg +5 -0
  635. package/skills/ppt-master/templates/icons/seedling.svg +4 -0
  636. package/skills/ppt-master/templates/icons/server.svg +5 -0
  637. package/skills/ppt-master/templates/icons/service-bell.svg +5 -0
  638. package/skills/ppt-master/templates/icons/share-nodes.svg +4 -0
  639. package/skills/ppt-master/templates/icons/shield-check.svg +4 -0
  640. package/skills/ppt-master/templates/icons/shield-half.svg +4 -0
  641. package/skills/ppt-master/templates/icons/shield.svg +4 -0
  642. package/skills/ppt-master/templates/icons/shift.svg +4 -0
  643. package/skills/ppt-master/templates/icons/ship.svg +5 -0
  644. package/skills/ppt-master/templates/icons/shirt.svg +4 -0
  645. package/skills/ppt-master/templates/icons/shoe.svg +5 -0
  646. package/skills/ppt-master/templates/icons/shop.svg +5 -0
  647. package/skills/ppt-master/templates/icons/shopping-bag.svg +5 -0
  648. package/skills/ppt-master/templates/icons/shopping-basket.svg +4 -0
  649. package/skills/ppt-master/templates/icons/shopping-cart.svg +4 -0
  650. package/skills/ppt-master/templates/icons/shuffle.svg +5 -0
  651. package/skills/ppt-master/templates/icons/sidebar-left.svg +5 -0
  652. package/skills/ppt-master/templates/icons/sidebar-right.svg +5 -0
  653. package/skills/ppt-master/templates/icons/signal-fair.svg +5 -0
  654. package/skills/ppt-master/templates/icons/signal-good.svg +6 -0
  655. package/skills/ppt-master/templates/icons/signal-slash.svg +7 -0
  656. package/skills/ppt-master/templates/icons/signal-weak.svg +4 -0
  657. package/skills/ppt-master/templates/icons/signal.svg +7 -0
  658. package/skills/ppt-master/templates/icons/signpost.svg +5 -0
  659. package/skills/ppt-master/templates/icons/sink.svg +5 -0
  660. package/skills/ppt-master/templates/icons/skip-backward.svg +4 -0
  661. package/skills/ppt-master/templates/icons/skip-forward.svg +4 -0
  662. package/skills/ppt-master/templates/icons/skull.svg +4 -0
  663. package/skills/ppt-master/templates/icons/sliders.svg +5 -0
  664. package/skills/ppt-master/templates/icons/smartwatch.svg +4 -0
  665. package/skills/ppt-master/templates/icons/snow.svg +4 -0
  666. package/skills/ppt-master/templates/icons/soccer.svg +9 -0
  667. package/skills/ppt-master/templates/icons/soda.svg +5 -0
  668. package/skills/ppt-master/templates/icons/sort.svg +5 -0
  669. package/skills/ppt-master/templates/icons/spade.svg +4 -0
  670. package/skills/ppt-master/templates/icons/sparkles.svg +8 -0
  671. package/skills/ppt-master/templates/icons/square-checkmark.svg +4 -0
  672. package/skills/ppt-master/templates/icons/square-divide.svg +4 -0
  673. package/skills/ppt-master/templates/icons/square-equals.svg +4 -0
  674. package/skills/ppt-master/templates/icons/square-minus.svg +4 -0
  675. package/skills/ppt-master/templates/icons/square-plus.svg +4 -0
  676. package/skills/ppt-master/templates/icons/square-user.svg +5 -0
  677. package/skills/ppt-master/templates/icons/square-x.svg +4 -0
  678. package/skills/ppt-master/templates/icons/square.svg +4 -0
  679. package/skills/ppt-master/templates/icons/squares-horizontal.svg +6 -0
  680. package/skills/ppt-master/templates/icons/squares-vertical.svg +6 -0
  681. package/skills/ppt-master/templates/icons/star-half.svg +4 -0
  682. package/skills/ppt-master/templates/icons/star.svg +4 -0
  683. package/skills/ppt-master/templates/icons/sticky-note.svg +5 -0
  684. package/skills/ppt-master/templates/icons/stop.svg +4 -0
  685. package/skills/ppt-master/templates/icons/stopwatch.svg +4 -0
  686. package/skills/ppt-master/templates/icons/strikethrough.svg +5 -0
  687. package/skills/ppt-master/templates/icons/subtract.svg +4 -0
  688. package/skills/ppt-master/templates/icons/suitcase.svg +6 -0
  689. package/skills/ppt-master/templates/icons/sun-cloud.svg +9 -0
  690. package/skills/ppt-master/templates/icons/sun-fog.svg +12 -0
  691. package/skills/ppt-master/templates/icons/sun.svg +12 -0
  692. package/skills/ppt-master/templates/icons/sunglasses.svg +4 -0
  693. package/skills/ppt-master/templates/icons/swatches.svg +6 -0
  694. package/skills/ppt-master/templates/icons/sword.svg +4 -0
  695. package/skills/ppt-master/templates/icons/swords-crossed.svg +6 -0
  696. package/skills/ppt-master/templates/icons/t.svg +4 -0
  697. package/skills/ppt-master/templates/icons/table.svg +8 -0
  698. package/skills/ppt-master/templates/icons/tag.svg +4 -0
  699. package/skills/ppt-master/templates/icons/target-arrow.svg +6 -0
  700. package/skills/ppt-master/templates/icons/target.svg +5 -0
  701. package/skills/ppt-master/templates/icons/taurus.svg +4 -0
  702. package/skills/ppt-master/templates/icons/temperature-high.svg +8 -0
  703. package/skills/ppt-master/templates/icons/temperature-low.svg +8 -0
  704. package/skills/ppt-master/templates/icons/temperature-medium.svg +8 -0
  705. package/skills/ppt-master/templates/icons/tennis-ball.svg +6 -0
  706. package/skills/ppt-master/templates/icons/terminal.svg +5 -0
  707. package/skills/ppt-master/templates/icons/text.svg +4 -0
  708. package/skills/ppt-master/templates/icons/thumbs-down.svg +5 -0
  709. package/skills/ppt-master/templates/icons/thumbs-up.svg +5 -0
  710. package/skills/ppt-master/templates/icons/thumbtack.svg +5 -0
  711. package/skills/ppt-master/templates/icons/ticket.svg +4 -0
  712. package/skills/ppt-master/templates/icons/toggle-circle-left.svg +4 -0
  713. package/skills/ppt-master/templates/icons/toggle-circle-right.svg +4 -0
  714. package/skills/ppt-master/templates/icons/toolbox.svg +5 -0
  715. package/skills/ppt-master/templates/icons/traffic-cone.svg +6 -0
  716. package/skills/ppt-master/templates/icons/traffic-light.svg +4 -0
  717. package/skills/ppt-master/templates/icons/train.svg +4 -0
  718. package/skills/ppt-master/templates/icons/trash.svg +5 -0
  719. package/skills/ppt-master/templates/icons/tree-evergreen.svg +4 -0
  720. package/skills/ppt-master/templates/icons/tree.svg +4 -0
  721. package/skills/ppt-master/templates/icons/triangle-exclamation.svg +4 -0
  722. package/skills/ppt-master/templates/icons/triangle.svg +4 -0
  723. package/skills/ppt-master/templates/icons/trophy.svg +4 -0
  724. package/skills/ppt-master/templates/icons/truck.svg +4 -0
  725. package/skills/ppt-master/templates/icons/tv-retro.svg +4 -0
  726. package/skills/ppt-master/templates/icons/tv.svg +5 -0
  727. package/skills/ppt-master/templates/icons/u.svg +4 -0
  728. package/skills/ppt-master/templates/icons/ufo.svg +5 -0
  729. package/skills/ppt-master/templates/icons/umbrella.svg +4 -0
  730. package/skills/ppt-master/templates/icons/underline.svg +5 -0
  731. package/skills/ppt-master/templates/icons/unite.svg +4 -0
  732. package/skills/ppt-master/templates/icons/user.svg +5 -0
  733. package/skills/ppt-master/templates/icons/users.svg +7 -0
  734. package/skills/ppt-master/templates/icons/utensils.svg +5 -0
  735. package/skills/ppt-master/templates/icons/v.svg +4 -0
  736. package/skills/ppt-master/templates/icons/vector-circle.svg +4 -0
  737. package/skills/ppt-master/templates/icons/vector-curve.svg +4 -0
  738. package/skills/ppt-master/templates/icons/vector-line.svg +4 -0
  739. package/skills/ppt-master/templates/icons/vector-square.svg +4 -0
  740. package/skills/ppt-master/templates/icons/video-camera-slash.svg +5 -0
  741. package/skills/ppt-master/templates/icons/video-camera.svg +5 -0
  742. package/skills/ppt-master/templates/icons/video.svg +4 -0
  743. package/skills/ppt-master/templates/icons/virgo.svg +4 -0
  744. package/skills/ppt-master/templates/icons/volume-high.svg +6 -0
  745. package/skills/ppt-master/templates/icons/volume-low.svg +5 -0
  746. package/skills/ppt-master/templates/icons/volume-none.svg +4 -0
  747. package/skills/ppt-master/templates/icons/volume-slash.svg +5 -0
  748. package/skills/ppt-master/templates/icons/volume-x.svg +5 -0
  749. package/skills/ppt-master/templates/icons/vr.svg +4 -0
  750. package/skills/ppt-master/templates/icons/w.svg +4 -0
  751. package/skills/ppt-master/templates/icons/wallet.svg +4 -0
  752. package/skills/ppt-master/templates/icons/wand-with-sparkles.svg +7 -0
  753. package/skills/ppt-master/templates/icons/watch.svg +4 -0
  754. package/skills/ppt-master/templates/icons/water.svg +5 -0
  755. package/skills/ppt-master/templates/icons/waveform.svg +7 -0
  756. package/skills/ppt-master/templates/icons/wheelchair.svg +5 -0
  757. package/skills/ppt-master/templates/icons/wifi-low.svg +4 -0
  758. package/skills/ppt-master/templates/icons/wifi-medium.svg +5 -0
  759. package/skills/ppt-master/templates/icons/wifi-slash.svg +5 -0
  760. package/skills/ppt-master/templates/icons/wifi.svg +6 -0
  761. package/skills/ppt-master/templates/icons/wind.svg +5 -0
  762. package/skills/ppt-master/templates/icons/window.svg +6 -0
  763. package/skills/ppt-master/templates/icons/wine-glass.svg +4 -0
  764. package/skills/ppt-master/templates/icons/wrench.svg +4 -0
  765. package/skills/ppt-master/templates/icons/x-1.svg +4 -0
  766. package/skills/ppt-master/templates/icons/x.svg +4 -0
  767. package/skills/ppt-master/templates/icons/y.svg +4 -0
  768. package/skills/ppt-master/templates/icons/yen.svg +4 -0
  769. package/skills/ppt-master/templates/icons/z.svg +4 -0
  770. package/skills/ppt-master/templates/icons/zoom-in.svg +4 -0
  771. package/skills/ppt-master/templates/icons/zoom-out.svg +4 -0
  772. package/skills/ppt-master/templates/layouts/README.md +257 -0
  773. package/skills/ppt-master/templates/layouts/academic_defense/01_cover.svg +49 -0
  774. package/skills/ppt-master/templates/layouts/academic_defense/02_chapter.svg +36 -0
  775. package/skills/ppt-master/templates/layouts/academic_defense/02_toc.svg +63 -0
  776. package/skills/ppt-master/templates/layouts/academic_defense/03_content.svg +58 -0
  777. package/skills/ppt-master/templates/layouts/academic_defense/04_ending.svg +52 -0
  778. package/skills/ppt-master/templates/layouts/academic_defense/design_spec.md +294 -0
  779. package/skills/ppt-master/templates/layouts/ai_ops/01_cover.svg +65 -0
  780. package/skills/ppt-master/templates/layouts/ai_ops/02_chapter.svg +36 -0
  781. package/skills/ppt-master/templates/layouts/ai_ops/02_toc.svg +51 -0
  782. package/skills/ppt-master/templates/layouts/ai_ops/03_content.svg +37 -0
  783. package/skills/ppt-master/templates/layouts/ai_ops/04_ending.svg +59 -0
  784. package/skills/ppt-master/templates/layouts/ai_ops/design_spec.md +357 -0
  785. package/skills/ppt-master/templates/layouts/ai_ops/reference_style.svg +154 -0
  786. package/skills/ppt-master/templates/layouts/anthropic/01_cover.svg +105 -0
  787. package/skills/ppt-master/templates/layouts/anthropic/02_chapter.svg +75 -0
  788. package/skills/ppt-master/templates/layouts/anthropic/02_toc.svg +120 -0
  789. package/skills/ppt-master/templates/layouts/anthropic/03_content.svg +118 -0
  790. package/skills/ppt-master/templates/layouts/anthropic/04_ending.svg +107 -0
  791. package/skills/ppt-master/templates/layouts/anthropic/design_spec.md +243 -0
  792. package/skills/ppt-master/templates/layouts/exhibit/01_cover.svg +49 -0
  793. package/skills/ppt-master/templates/layouts/exhibit/02_chapter.svg +43 -0
  794. package/skills/ppt-master/templates/layouts/exhibit/02_toc.svg +82 -0
  795. package/skills/ppt-master/templates/layouts/exhibit/03_content.svg +38 -0
  796. package/skills/ppt-master/templates/layouts/exhibit/04_ending.svg +54 -0
  797. package/skills/ppt-master/templates/layouts/exhibit/design_spec.md +244 -0
  798. package/skills/ppt-master/templates/layouts/google_style/01_cover.svg +79 -0
  799. package/skills/ppt-master/templates/layouts/google_style/02_chapter.svg +62 -0
  800. package/skills/ppt-master/templates/layouts/google_style/02_toc.svg +89 -0
  801. package/skills/ppt-master/templates/layouts/google_style/03_content.svg +72 -0
  802. package/skills/ppt-master/templates/layouts/google_style/04_ending.svg +97 -0
  803. package/skills/ppt-master/templates/layouts/google_style/design_spec.md +303 -0
  804. package/skills/ppt-master/templates/layouts/government_blue/01_cover.svg +93 -0
  805. package/skills/ppt-master/templates/layouts/government_blue/02_chapter.svg +82 -0
  806. package/skills/ppt-master/templates/layouts/government_blue/02_toc.svg +107 -0
  807. package/skills/ppt-master/templates/layouts/government_blue/03_content.svg +78 -0
  808. package/skills/ppt-master/templates/layouts/government_blue/04_ending.svg +81 -0
  809. package/skills/ppt-master/templates/layouts/government_blue/design_spec.md +233 -0
  810. package/skills/ppt-master/templates/layouts/government_red/01_cover.svg +73 -0
  811. package/skills/ppt-master/templates/layouts/government_red/02_chapter.svg +66 -0
  812. package/skills/ppt-master/templates/layouts/government_red/02_toc.svg +88 -0
  813. package/skills/ppt-master/templates/layouts/government_red/03_content.svg +66 -0
  814. package/skills/ppt-master/templates/layouts/government_red/04_ending.svg +75 -0
  815. package/skills/ppt-master/templates/layouts/government_red/design_spec.md +227 -0
  816. package/skills/ppt-master/templates/layouts/layouts_index.json +204 -0
  817. package/skills/ppt-master/templates/layouts/mckinsey/01_cover.svg +84 -0
  818. package/skills/ppt-master/templates/layouts/mckinsey/02_chapter.svg +76 -0
  819. package/skills/ppt-master/templates/layouts/mckinsey/02_toc.svg +91 -0
  820. package/skills/ppt-master/templates/layouts/mckinsey/03_content.svg +92 -0
  821. package/skills/ppt-master/templates/layouts/mckinsey/04_ending.svg +87 -0
  822. package/skills/ppt-master/templates/layouts/mckinsey/design_spec.md +265 -0
  823. package/skills/ppt-master/templates/layouts/medical_university/01_cover.svg +71 -0
  824. package/skills/ppt-master/templates/layouts/medical_university/02_chapter.svg +50 -0
  825. package/skills/ppt-master/templates/layouts/medical_university/02_toc.svg +97 -0
  826. package/skills/ppt-master/templates/layouts/medical_university/03_content.svg +78 -0
  827. package/skills/ppt-master/templates/layouts/medical_university/04_ending.svg +79 -0
  828. package/skills/ppt-master/templates/layouts/medical_university/design_spec.md +292 -0
  829. package/skills/ppt-master/templates/layouts/netease_zhiqi/01_cover.svg +36 -0
  830. package/skills/ppt-master/templates/layouts/netease_zhiqi/02_chapter.svg +23 -0
  831. package/skills/ppt-master/templates/layouts/netease_zhiqi/02_toc.svg +42 -0
  832. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content.svg +28 -0
  833. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content_architecture.svg +84 -0
  834. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content_bullet.svg +77 -0
  835. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content_cards.svg +123 -0
  836. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content_comparison.svg +56 -0
  837. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content_data.svg +69 -0
  838. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content_gray.svg +34 -0
  839. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content_image_full.svg +46 -0
  840. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content_image_grid.svg +44 -0
  841. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content_image_left.svg +43 -0
  842. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content_logos.svg +86 -0
  843. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content_table.svg +131 -0
  844. package/skills/ppt-master/templates/layouts/netease_zhiqi/03_content_timeline.svg +82 -0
  845. package/skills/ppt-master/templates/layouts/netease_zhiqi/04_ending.svg +26 -0
  846. package/skills/ppt-master/templates/layouts/netease_zhiqi/content_bg.png +0 -0
  847. package/skills/ppt-master/templates/layouts/netease_zhiqi/cover_bg.png +0 -0
  848. package/skills/ppt-master/templates/layouts/netease_zhiqi/design_spec.md +134 -0
  849. package/skills/ppt-master/templates/layouts/netease_zhiqi/ending_bg.png +0 -0
  850. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_000.svg +3 -0
  851. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_001.svg +3 -0
  852. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_002.svg +3 -0
  853. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_003.svg +3 -0
  854. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_004.svg +3 -0
  855. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_005.svg +3 -0
  856. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_006.svg +3 -0
  857. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_007.svg +3 -0
  858. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_008.svg +3 -0
  859. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_009.svg +3 -0
  860. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_010.svg +3 -0
  861. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_011.svg +3 -0
  862. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_012.svg +3 -0
  863. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_013.svg +3 -0
  864. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_014.svg +3 -0
  865. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_015.svg +3 -0
  866. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_016.svg +3 -0
  867. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_017.svg +3 -0
  868. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_018.svg +3 -0
  869. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_019.svg +3 -0
  870. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_020.svg +3 -0
  871. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_021.svg +3 -0
  872. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_022.svg +3 -0
  873. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_023.svg +3 -0
  874. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_024.svg +3 -0
  875. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_025.svg +3 -0
  876. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_026.svg +3 -0
  877. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_027.svg +3 -0
  878. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_028.svg +3 -0
  879. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_029.svg +3 -0
  880. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_030.svg +3 -0
  881. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_031.svg +3 -0
  882. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_032.svg +3 -0
  883. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_033.svg +3 -0
  884. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_034.svg +3 -0
  885. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_035.svg +3 -0
  886. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_036.svg +3 -0
  887. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_037.svg +3 -0
  888. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_038.svg +3 -0
  889. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_039.svg +3 -0
  890. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_040.svg +3 -0
  891. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_041.svg +3 -0
  892. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_042.svg +3 -0
  893. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_043.svg +3 -0
  894. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_044.svg +3 -0
  895. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_045.svg +3 -0
  896. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_046.svg +3 -0
  897. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_047.svg +3 -0
  898. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_048.svg +3 -0
  899. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_049.svg +3 -0
  900. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_050.svg +3 -0
  901. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_051.svg +3 -0
  902. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_052.svg +3 -0
  903. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_053.svg +3 -0
  904. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_054.svg +3 -0
  905. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_055.svg +3 -0
  906. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_056.svg +3 -0
  907. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_057.svg +3 -0
  908. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_058.svg +3 -0
  909. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_059.svg +3 -0
  910. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_060.svg +3 -0
  911. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_061.svg +3 -0
  912. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_062.svg +3 -0
  913. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_063.svg +3 -0
  914. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_064.svg +3 -0
  915. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_065.svg +3 -0
  916. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_066.svg +3 -0
  917. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_067.svg +3 -0
  918. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_068.svg +3 -0
  919. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_069.svg +3 -0
  920. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_070.svg +3 -0
  921. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_071.svg +3 -0
  922. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_072.svg +3 -0
  923. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_073.svg +3 -0
  924. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_074.svg +3 -0
  925. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_075.svg +3 -0
  926. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_076.svg +3 -0
  927. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_077.svg +3 -0
  928. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_078.svg +3 -0
  929. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_079.svg +3 -0
  930. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_080.svg +3 -0
  931. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_081.svg +3 -0
  932. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_082.svg +3 -0
  933. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_083.svg +3 -0
  934. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_084.svg +3 -0
  935. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_085.svg +3 -0
  936. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_086.svg +3 -0
  937. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_087.svg +3 -0
  938. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_088.svg +3 -0
  939. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_089.svg +3 -0
  940. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_090.svg +3 -0
  941. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_091.svg +3 -0
  942. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_092.svg +3 -0
  943. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_093.svg +3 -0
  944. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_094.svg +3 -0
  945. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_095.svg +3 -0
  946. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_096.svg +3 -0
  947. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_097.svg +3 -0
  948. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_098.svg +3 -0
  949. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_099.svg +3 -0
  950. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_100.svg +3 -0
  951. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_101.svg +3 -0
  952. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_102.svg +3 -0
  953. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_103.svg +3 -0
  954. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_104.svg +3 -0
  955. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_105.svg +3 -0
  956. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_106.svg +3 -0
  957. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_107.svg +3 -0
  958. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_108.svg +3 -0
  959. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_109.svg +3 -0
  960. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_110.svg +3 -0
  961. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_111.svg +3 -0
  962. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_112.svg +3 -0
  963. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_113.svg +3 -0
  964. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_114.svg +3 -0
  965. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_115.svg +3 -0
  966. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_116.svg +3 -0
  967. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_117.svg +3 -0
  968. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_118.svg +3 -0
  969. package/skills/ppt-master/templates/layouts/netease_zhiqi/icons/icon_119.svg +3 -0
  970. package/skills/ppt-master/templates/layouts/netease_zhiqi/logo_full.png +0 -0
  971. package/skills/ppt-master/templates/layouts/netease_zhiqi/logo_zhiqi.png +0 -0
  972. package/skills/ppt-master/templates/layouts/netease_zhiqi/toc_bg.png +0 -0
  973. package/skills/ppt-master/templates/layouts/pixel_retro/01_cover.svg +138 -0
  974. package/skills/ppt-master/templates/layouts/pixel_retro/02_chapter.svg +130 -0
  975. package/skills/ppt-master/templates/layouts/pixel_retro/02_toc.svg +130 -0
  976. package/skills/ppt-master/templates/layouts/pixel_retro/03_content.svg +50 -0
  977. package/skills/ppt-master/templates/layouts/pixel_retro/04_ending.svg +167 -0
  978. package/skills/ppt-master/templates/layouts/pixel_retro/design_spec.md +308 -0
  979. package/skills/ppt-master/templates/layouts/psychology_attachment/01_cover.svg +78 -0
  980. package/skills/ppt-master/templates/layouts/psychology_attachment/02_chapter.svg +82 -0
  981. package/skills/ppt-master/templates/layouts/psychology_attachment/02_toc.svg +115 -0
  982. package/skills/ppt-master/templates/layouts/psychology_attachment/03_content.svg +41 -0
  983. package/skills/ppt-master/templates/layouts/psychology_attachment/04_ending.svg +100 -0
  984. package/skills/ppt-master/templates/layouts/psychology_attachment/design_spec.md +394 -0
  985. package/skills/ppt-master/templates/layouts/smart_red/01_cover.svg +49 -0
  986. package/skills/ppt-master/templates/layouts/smart_red/02_chapter.svg +29 -0
  987. package/skills/ppt-master/templates/layouts/smart_red/02_toc.svg +59 -0
  988. package/skills/ppt-master/templates/layouts/smart_red/03_content.svg +59 -0
  989. package/skills/ppt-master/templates/layouts/smart_red/04_ending.svg +44 -0
  990. package/skills/ppt-master/templates/layouts/smart_red/design_spec.md +208 -0
  991. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204/01_cover.svg +100 -0
  992. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204/02_chapter.svg +81 -0
  993. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204/02_toc.svg +112 -0
  994. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204/03_content.svg +57 -0
  995. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204/04_ending.svg +92 -0
  996. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204/design_spec.md +209 -0
  997. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204//344/270/255/345/233/275/346/260/264/345/212/241logo.png +0 -0
  998. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204//345/215/216/344/270/234/351/231/242logo.png +0 -0
  999. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204//346/260/264/347/224/265/344/270/211/345/261/200logo.png +0 -0
  1000. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204//347/224/265/345/273/272logo.png +0 -0
  1001. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243/01_cover.svg +90 -0
  1002. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243/02_chapter.svg +61 -0
  1003. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243/02_toc.svg +131 -0
  1004. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243/03_content.svg +77 -0
  1005. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243/04_ending.svg +78 -0
  1006. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243/design_spec.md +177 -0
  1007. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243//344/270/255/345/233/275/346/260/264/345/212/241logo.png +0 -0
  1008. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243//345/215/216/344/270/234/351/231/242logo.png +0 -0
  1009. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243//346/260/264/347/224/265/344/270/211/345/261/200logo.png +0 -0
  1010. package/skills/ppt-master/templates/layouts//344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243//347/224/265/345/273/272logo.png +0 -0
  1011. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241/01_cover.svg +83 -0
  1012. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241/02_chapter.svg +55 -0
  1013. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241/02_toc.svg +110 -0
  1014. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241/03_content.svg +62 -0
  1015. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241/04_ending.svg +60 -0
  1016. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241/design_spec.md +166 -0
  1017. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241//345/217/263/344/270/212/350/247/222 logo.png +0 -0
  1018. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241//345/244/247/345/236/213 logo.png +0 -0
  1019. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204/01_cover.svg +49 -0
  1020. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204/02_chapter.svg +47 -0
  1021. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204/02_toc.svg +73 -0
  1022. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204/03_content.svg +57 -0
  1023. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204/04_ending.svg +62 -0
  1024. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204/design_spec.md +214 -0
  1025. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204//345/217/263/344/270/212/350/247/222 logo.png +0 -0
  1026. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204//345/244/247/345/236/213 logo.png +0 -0
  1027. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243/01_cover.svg +89 -0
  1028. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243/02_chapter.svg +55 -0
  1029. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243/02_toc.svg +92 -0
  1030. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243/03_content.svg +56 -0
  1031. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243/04_ending.svg +64 -0
  1032. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243/design_spec.md +170 -0
  1033. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243//345/217/263/344/270/212/350/247/222 logo.png +0 -0
  1034. package/skills/ppt-master/templates/layouts//344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243//345/244/247/345/236/213 logo.png +0 -0
  1035. package/skills/ppt-master/templates/layouts//346/213/233/345/225/206/351/223/266/350/241/214/01_cover.svg +113 -0
  1036. package/skills/ppt-master/templates/layouts//346/213/233/345/225/206/351/223/266/350/241/214/02_chapter.svg +90 -0
  1037. package/skills/ppt-master/templates/layouts//346/213/233/345/225/206/351/223/266/350/241/214/02_toc.svg +108 -0
  1038. package/skills/ppt-master/templates/layouts//346/213/233/345/225/206/351/223/266/350/241/214/03_content.svg +69 -0
  1039. package/skills/ppt-master/templates/layouts//346/213/233/345/225/206/351/223/266/350/241/214/04_ending.svg +120 -0
  1040. package/skills/ppt-master/templates/layouts//346/213/233/345/225/206/351/223/266/350/241/214/design_spec.md +209 -0
  1041. package/skills/ppt-master/templates/layouts//346/213/233/345/225/206/351/223/266/350/241/214//346/213/233/345/225/206/351/223/266/350/241/214/345/205/254/345/217/270/351/207/221/350/236/215.png +0 -0
  1042. package/skills/ppt-master/templates/layouts//347/247/221/346/212/200/350/223/235/345/225/206/345/212/241/01_cover.svg +52 -0
  1043. package/skills/ppt-master/templates/layouts//347/247/221/346/212/200/350/223/235/345/225/206/345/212/241/02_chapter.svg +50 -0
  1044. package/skills/ppt-master/templates/layouts//347/247/221/346/212/200/350/223/235/345/225/206/345/212/241/02_toc.svg +67 -0
  1045. package/skills/ppt-master/templates/layouts//347/247/221/346/212/200/350/223/235/345/225/206/345/212/241/03_content.svg +28 -0
  1046. package/skills/ppt-master/templates/layouts//347/247/221/346/212/200/350/223/235/345/225/206/345/212/241/04_ending.svg +52 -0
  1047. package/skills/ppt-master/templates/layouts//347/247/221/346/212/200/350/223/235/345/225/206/345/212/241/design_spec.md +206 -0
  1048. package/skills/ppt-master/templates/layouts//351/207/215/345/272/206/345/244/247/345/255/246/01_cover.svg +74 -0
  1049. package/skills/ppt-master/templates/layouts//351/207/215/345/272/206/345/244/247/345/255/246/02_chapter.svg +52 -0
  1050. package/skills/ppt-master/templates/layouts//351/207/215/345/272/206/345/244/247/345/255/246/02_toc.svg +80 -0
  1051. package/skills/ppt-master/templates/layouts//351/207/215/345/272/206/345/244/247/345/255/246/03_content.svg +56 -0
  1052. package/skills/ppt-master/templates/layouts//351/207/215/345/272/206/345/244/247/345/255/246/04_ending.svg +62 -0
  1053. package/skills/ppt-master/templates/layouts//351/207/215/345/272/206/345/244/247/345/255/246/design_spec.md +243 -0
  1054. package/skills/ppt-master/templates/layouts//351/207/215/345/272/206/345/244/247/345/255/246//351/207/215/345/272/206/345/244/247/345/255/246logo.png +0 -0
  1055. package/skills/ppt-master/templates/layouts//351/207/215/345/272/206/345/244/247/345/255/246//351/207/215/345/272/206/345/244/247/345/255/246logo2.png +0 -0
  1056. package/skills/ppt-master/workflows/create-template.md +173 -0
  1057. package/skills/speed-to-text/SKILL.md +64 -0
  1058. package/skills/tencent-meeting/SKILL.md +65 -0
  1059. package/skills/yidun-skill-sec/SKILL.md +838 -0
  1060. package/skills/smart-customer-service/docs//344/270/212/347/272/277/350/257/225/350/277/220/350/241/214/346/235/220/346/226/231.zip +0 -0
@@ -0,0 +1,1486 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ PPT Master - SVG Position Calculation and Validation Tool
4
+
5
+ Provides pre-calculation and post-validation of chart coordinates,
6
+ outputting clear coordinate tables.
7
+
8
+ ======================================================================
9
+ Common Commands (can be copied and used directly)
10
+ ======================================================================
11
+
12
+ 1. Analyze all coordinates in an SVG file:
13
+ python scripts/svg_position_calculator.py analyze <svg_file>
14
+
15
+ 2. Interactive calculation mode:
16
+ python scripts/svg_position_calculator.py interactive
17
+
18
+ 3. Calculate from JSON config file:
19
+ python scripts/svg_position_calculator.py from-json <config.json>
20
+
21
+ 4. Quick calculation:
22
+ python scripts/svg_position_calculator.py calc bar --data "East:185,South:142"
23
+ python scripts/svg_position_calculator.py calc pie --data "A:35,B:25,C:20"
24
+ python scripts/svg_position_calculator.py calc line --data "0:50,10:80,20:120"
25
+ python scripts/svg_position_calculator.py calc grid --rows 2 --cols 3
26
+
27
+ ======================================================================
28
+ """
29
+
30
+ import sys
31
+ import re
32
+ import math
33
+ import argparse
34
+ from pathlib import Path
35
+ from typing import Dict, List, Tuple, Optional, Any
36
+ from dataclasses import dataclass
37
+
38
+ # Fix garbled Chinese output on Windows
39
+ if sys.platform == 'win32':
40
+ try:
41
+ sys.stdout.reconfigure(encoding='utf-8')
42
+ sys.stderr.reconfigure(encoding='utf-8')
43
+ except AttributeError:
44
+ # Python < 3.7
45
+ import io
46
+ sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
47
+ sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
48
+
49
+ # Import canvas format configuration
50
+ try:
51
+ from project_utils import CANVAS_FORMATS
52
+ except ImportError:
53
+ # Use built-in definitions if import fails
54
+ CANVAS_FORMATS = {
55
+ 'ppt169': {'name': 'PPT 16:9', 'dimensions': '1280×720', 'viewbox': '0 0 1280 720'},
56
+ 'ppt43': {'name': 'PPT 4:3', 'dimensions': '1024×768', 'viewbox': '0 0 1024 768'},
57
+ 'xiaohongshu': {'name': 'Xiaohongshu (RED)', 'dimensions': '1242×1660', 'viewbox': '0 0 1242 1660'},
58
+ 'moments': {'name': 'WeChat Moments', 'dimensions': '1080×1080', 'viewbox': '0 0 1080 1080'},
59
+ }
60
+
61
+
62
+ # =============================================================================
63
+ # Coordinate System Base Classes
64
+ # =============================================================================
65
+
66
+ @dataclass
67
+ class ChartArea:
68
+ """Chart area definition"""
69
+ x_min: float
70
+ y_min: float
71
+ x_max: float
72
+ y_max: float
73
+
74
+ @property
75
+ def width(self) -> float:
76
+ return self.x_max - self.x_min
77
+
78
+ @property
79
+ def height(self) -> float:
80
+ return self.y_max - self.y_min
81
+
82
+ @property
83
+ def center(self) -> Tuple[float, float]:
84
+ return ((self.x_min + self.x_max) / 2, (self.y_min + self.y_max) / 2)
85
+
86
+
87
+ class CoordinateSystem:
88
+ """Coordinate system - maps data domain to SVG canvas coordinates"""
89
+
90
+ def __init__(self, canvas_format: str = 'ppt169', chart_area: Optional[ChartArea] = None):
91
+ """
92
+ Initialize the coordinate system
93
+
94
+ Args:
95
+ canvas_format: Canvas format (ppt169, ppt43, xiaohongshu, moments, etc.)
96
+ chart_area: Chart area; uses default values if not specified
97
+ """
98
+ self.canvas_format = canvas_format
99
+
100
+ # Parse canvas dimensions
101
+ if canvas_format in CANVAS_FORMATS:
102
+ viewbox = CANVAS_FORMATS[canvas_format]['viewbox']
103
+ parts = viewbox.split()
104
+ self.canvas_width = int(parts[2])
105
+ self.canvas_height = int(parts[3])
106
+ else:
107
+ self.canvas_width = 1280
108
+ self.canvas_height = 720
109
+
110
+ # Set chart area (default with margins)
111
+ if chart_area:
112
+ self.chart_area = chart_area
113
+ else:
114
+ # Default chart area: left/right margin 140px, top/bottom margin 150px
115
+ self.chart_area = ChartArea(
116
+ x_min=140,
117
+ y_min=150,
118
+ x_max=self.canvas_width - 120,
119
+ y_max=self.canvas_height - 120
120
+ )
121
+
122
+ def data_to_svg_x(self, data_x: float, x_range: Tuple[float, float]) -> float:
123
+ """
124
+ Map data X value to SVG X coordinate
125
+
126
+ Args:
127
+ data_x: Data X value
128
+ x_range: X axis data range (min, max)
129
+ """
130
+ x_min, x_max = x_range
131
+ if x_max == x_min:
132
+ return self.chart_area.x_min
133
+
134
+ ratio = (data_x - x_min) / (x_max - x_min)
135
+ return self.chart_area.x_min + ratio * self.chart_area.width
136
+
137
+ def data_to_svg_y(self, data_y: float, y_range: Tuple[float, float]) -> float:
138
+ """
139
+ Map data Y value to SVG Y coordinate (note: SVG Y axis points downward)
140
+
141
+ Args:
142
+ data_y: Data Y value
143
+ y_range: Y axis data range (min, max)
144
+ """
145
+ y_min, y_max = y_range
146
+ if y_max == y_min:
147
+ return self.chart_area.y_max
148
+
149
+ ratio = (data_y - y_min) / (y_max - y_min)
150
+ # SVG Y axis points downward, so invert
151
+ return self.chart_area.y_max - ratio * self.chart_area.height
152
+
153
+ def data_to_svg(self, data_x: float, data_y: float,
154
+ x_range: Tuple[float, float], y_range: Tuple[float, float]) -> Tuple[float, float]:
155
+ """Map data point to SVG coordinates"""
156
+ return (self.data_to_svg_x(data_x, x_range), self.data_to_svg_y(data_y, y_range))
157
+
158
+
159
+ # =============================================================================
160
+ # Bar Chart Calculator
161
+ # =============================================================================
162
+
163
+ @dataclass
164
+ class BarPosition:
165
+ """Bar position information"""
166
+ index: int
167
+ label: str
168
+ value: float
169
+ x: float
170
+ y: float
171
+ width: float
172
+ height: float
173
+ label_x: float # Label X position
174
+ label_y: float # Label Y position (below bar)
175
+ value_x: float # Value X position
176
+ value_y: float # Value Y position (above bar)
177
+
178
+
179
+ class BarChartCalculator:
180
+ """Bar chart coordinate calculator"""
181
+
182
+ def __init__(self, coord_system: CoordinateSystem):
183
+ self.coord = coord_system
184
+
185
+ def calculate(self, data: Dict[str, float],
186
+ bar_width: float = 50,
187
+ gap_ratio: float = 0.3,
188
+ y_min: float = 0,
189
+ y_max: Optional[float] = None,
190
+ horizontal: bool = False) -> List[BarPosition]:
191
+ """
192
+ Calculate bar chart positions
193
+
194
+ Args:
195
+ data: Data dictionary {label: value}
196
+ bar_width: Bar width (auto-calculated if None)
197
+ gap_ratio: Gap ratio between bars (relative to bar width)
198
+ y_min: Y axis minimum value
199
+ y_max: Y axis maximum value (uses data maximum if None)
200
+ horizontal: Whether to use horizontal bar chart
201
+ """
202
+ labels = list(data.keys())
203
+ values = list(data.values())
204
+ n = len(labels)
205
+
206
+ if n == 0:
207
+ return []
208
+
209
+ # Calculate Y axis range
210
+ if y_max is None:
211
+ y_max = max(values) * 1.1 # Leave 10% headroom
212
+
213
+ area = self.coord.chart_area
214
+
215
+ if horizontal:
216
+ # Horizontal bar chart
217
+ return self._calculate_horizontal(labels, values, bar_width, gap_ratio, y_min, y_max)
218
+
219
+ # Calculate bar layout
220
+ total_width = area.width
221
+ if bar_width is None:
222
+ # Auto-calculate bar width: total width / (bar count * (1 + gap ratio))
223
+ bar_width = total_width / (n * (1 + gap_ratio))
224
+
225
+ gap = bar_width * gap_ratio
226
+ total_bars_width = n * bar_width + (n - 1) * gap
227
+ start_x = area.x_min + (area.width - total_bars_width) / 2
228
+
229
+ results = []
230
+ for i, (label, value) in enumerate(zip(labels, values)):
231
+ # Bar X position
232
+ x = start_x + i * (bar_width + gap)
233
+
234
+ # Bar height and Y position
235
+ ratio = (value - y_min) / (y_max - y_min) if y_max > y_min else 0
236
+ height = ratio * area.height
237
+ y = area.y_max - height # SVG Y axis points downward
238
+
239
+ # Label and value positions
240
+ center_x = x + bar_width / 2
241
+
242
+ results.append(BarPosition(
243
+ index=i + 1,
244
+ label=label,
245
+ value=value,
246
+ x=round(x, 1),
247
+ y=round(y, 1),
248
+ width=round(bar_width, 1),
249
+ height=round(height, 1),
250
+ label_x=round(center_x, 1),
251
+ label_y=round(area.y_max + 30, 1),
252
+ value_x=round(center_x, 1),
253
+ value_y=round(y - 15, 1)
254
+ ))
255
+
256
+ return results
257
+
258
+ def _calculate_horizontal(self, labels: List[str], values: List[float],
259
+ bar_height: float, gap_ratio: float,
260
+ x_min: float, x_max: float) -> List[BarPosition]:
261
+ """Calculate horizontal bar chart"""
262
+ n = len(labels)
263
+ area = self.coord.chart_area
264
+
265
+ if bar_height is None:
266
+ bar_height = area.height / (n * (1 + gap_ratio))
267
+
268
+ gap = bar_height * gap_ratio
269
+ total_bars_height = n * bar_height + (n - 1) * gap
270
+ start_y = area.y_min + (area.height - total_bars_height) / 2
271
+
272
+ results = []
273
+ for i, (label, value) in enumerate(zip(labels, values)):
274
+ y = start_y + i * (bar_height + gap)
275
+
276
+ ratio = (value - x_min) / (x_max - x_min) if x_max > x_min else 0
277
+ width = ratio * area.width
278
+ x = area.x_min
279
+
280
+ center_y = y + bar_height / 2
281
+
282
+ results.append(BarPosition(
283
+ index=i + 1,
284
+ label=label,
285
+ value=value,
286
+ x=round(x, 1),
287
+ y=round(y, 1),
288
+ width=round(width, 1),
289
+ height=round(bar_height, 1),
290
+ label_x=round(area.x_min - 10, 1),
291
+ label_y=round(center_y, 1),
292
+ value_x=round(x + width + 10, 1),
293
+ value_y=round(center_y, 1)
294
+ ))
295
+
296
+ return results
297
+
298
+ def format_table(self, positions: List[BarPosition]) -> str:
299
+ """Format as table output"""
300
+ lines = []
301
+ lines.append("Index Label Value X Y Width Height")
302
+ lines.append("---- ---------- -------- ------- ------- ------- -------")
303
+
304
+ for p in positions:
305
+ lines.append(f"{p.index:4d} {p.label:<10s} {p.value:>8.1f} {p.x:>7.1f} {p.y:>7.1f} {p.width:>7.1f} {p.height:>7.1f}")
306
+
307
+ return "\n".join(lines)
308
+
309
+
310
+ # =============================================================================
311
+ # Pie / Donut Chart Calculator
312
+ # =============================================================================
313
+
314
+ @dataclass
315
+ class PieSlice:
316
+ """Pie chart slice information"""
317
+ index: int
318
+ label: str
319
+ value: float
320
+ percentage: float
321
+ start_angle: float # Start angle (degrees)
322
+ end_angle: float # End angle (degrees)
323
+ path_d: str # SVG path d attribute
324
+ label_x: float # Label X position
325
+ label_y: float # Label Y position
326
+ # Arc endpoint coordinates (relative to center)
327
+ start_x: float
328
+ start_y: float
329
+ end_x: float
330
+ end_y: float
331
+
332
+
333
+ class PieChartCalculator:
334
+ """Pie / donut chart calculator"""
335
+
336
+ def __init__(self, center: Tuple[float, float] = (420, 400), radius: float = 200):
337
+ self.cx, self.cy = center
338
+ self.radius = radius
339
+
340
+ def calculate(self, data: Dict[str, float],
341
+ start_angle: float = -90,
342
+ inner_radius: float = 0) -> List[PieSlice]:
343
+ """
344
+ Calculate pie chart slices
345
+
346
+ Args:
347
+ data: Data dictionary {label: value}
348
+ start_angle: Start angle (degrees, -90 means starting from 12 o'clock)
349
+ inner_radius: Inner radius (0 for pie chart, > 0 for donut chart)
350
+ """
351
+ labels = list(data.keys())
352
+ values = list(data.values())
353
+ total = sum(values)
354
+
355
+ if total == 0:
356
+ return []
357
+
358
+ results = []
359
+ current_angle = start_angle
360
+
361
+ for i, (label, value) in enumerate(zip(labels, values)):
362
+ percentage = value / total * 100
363
+ angle_span = value / total * 360
364
+ end_angle = current_angle + angle_span
365
+
366
+ # Calculate arc endpoints
367
+ start_rad = math.radians(current_angle)
368
+ end_rad = math.radians(end_angle)
369
+
370
+ start_x = self.radius * math.cos(start_rad)
371
+ start_y = self.radius * math.sin(start_rad)
372
+ end_x = self.radius * math.cos(end_rad)
373
+ end_y = self.radius * math.sin(end_rad)
374
+
375
+ # Generate path
376
+ large_arc = 1 if angle_span > 180 else 0
377
+
378
+ if inner_radius > 0:
379
+ # Donut chart
380
+ inner_start_x = inner_radius * math.cos(start_rad)
381
+ inner_start_y = inner_radius * math.sin(start_rad)
382
+ inner_end_x = inner_radius * math.cos(end_rad)
383
+ inner_end_y = inner_radius * math.sin(end_rad)
384
+
385
+ path_d = (
386
+ f"M {inner_start_x:.2f},{inner_start_y:.2f} "
387
+ f"L {start_x:.2f},{start_y:.2f} "
388
+ f"A {self.radius},{self.radius} 0 {large_arc},1 {end_x:.2f},{end_y:.2f} "
389
+ f"L {inner_end_x:.2f},{inner_end_y:.2f} "
390
+ f"A {inner_radius},{inner_radius} 0 {large_arc},0 {inner_start_x:.2f},{inner_start_y:.2f} Z"
391
+ )
392
+ else:
393
+ # Pie chart
394
+ path_d = (
395
+ f"M 0,0 "
396
+ f"L {start_x:.2f},{start_y:.2f} "
397
+ f"A {self.radius},{self.radius} 0 {large_arc},1 {end_x:.2f},{end_y:.2f} Z"
398
+ )
399
+
400
+ # Label position (70% of radius in the direction of slice center)
401
+ mid_angle = (current_angle + end_angle) / 2
402
+ mid_rad = math.radians(mid_angle)
403
+ label_distance = self.radius * 0.7
404
+ label_x = self.cx + label_distance * math.cos(mid_rad)
405
+ label_y = self.cy + label_distance * math.sin(mid_rad)
406
+
407
+ results.append(PieSlice(
408
+ index=i + 1,
409
+ label=label,
410
+ value=value,
411
+ percentage=round(percentage, 1),
412
+ start_angle=round(current_angle, 1),
413
+ end_angle=round(end_angle, 1),
414
+ path_d=path_d,
415
+ label_x=round(label_x, 1),
416
+ label_y=round(label_y, 1),
417
+ start_x=round(start_x, 2),
418
+ start_y=round(start_y, 2),
419
+ end_x=round(end_x, 2),
420
+ end_y=round(end_y, 2)
421
+ ))
422
+
423
+ current_angle = end_angle
424
+
425
+ return results
426
+
427
+ def format_table(self, slices: List[PieSlice]) -> str:
428
+ """Format as table output"""
429
+ lines = []
430
+ lines.append(f"Center: ({self.cx}, {self.cy}) | Radius: {self.radius}")
431
+ lines.append("")
432
+ lines.append("Index Label Pct Start End LabelX LabelY")
433
+ lines.append("---- ---------- -------- -------- -------- ------- -------")
434
+
435
+ for s in slices:
436
+ lines.append(
437
+ f"{s.index:4d} {s.label:<10s} {s.percentage:>6.1f}% {s.start_angle:>8.1f} "
438
+ f"{s.end_angle:>8.1f} {s.label_x:>7.1f} {s.label_y:>7.1f}"
439
+ )
440
+
441
+ lines.append("")
442
+ lines.append("=== Arc Endpoint Coordinates (relative to center) ===")
443
+ lines.append("Index StartX StartY EndX EndY")
444
+ lines.append("---- --------- --------- --------- ---------")
445
+
446
+ for s in slices:
447
+ lines.append(
448
+ f"{s.index:4d} {s.start_x:>9.2f} {s.start_y:>9.2f} {s.end_x:>9.2f} {s.end_y:>9.2f}"
449
+ )
450
+
451
+ lines.append("")
452
+ lines.append("=== Path d Attribute ===")
453
+ for s in slices:
454
+ lines.append(f"{s.index}. {s.label}: {s.path_d}")
455
+
456
+ return "\n".join(lines)
457
+
458
+
459
+ # =============================================================================
460
+ # Radar Chart Calculator
461
+ # =============================================================================
462
+
463
+ @dataclass
464
+ class RadarPoint:
465
+ """Radar chart data point"""
466
+ index: int
467
+ label: str
468
+ value: float
469
+ percentage: float # Percentage relative to max value
470
+ angle: float # Angle (degrees)
471
+ x: float # X relative to center
472
+ y: float # Y relative to center
473
+ abs_x: float # Absolute X coordinate
474
+ abs_y: float # Absolute Y coordinate
475
+ label_x: float # Label X position
476
+ label_y: float # Label Y position
477
+
478
+
479
+ class RadarChartCalculator:
480
+ """Radar chart calculator"""
481
+
482
+ def __init__(self, center: Tuple[float, float] = (640, 400), radius: float = 200):
483
+ self.cx, self.cy = center
484
+ self.radius = radius
485
+
486
+ def calculate(self, data: Dict[str, float],
487
+ max_value: Optional[float] = None,
488
+ start_angle: float = -90) -> List[RadarPoint]:
489
+ """
490
+ Calculate radar chart vertex coordinates
491
+
492
+ Args:
493
+ data: Data dictionary {dimension_name: value}
494
+ max_value: Maximum value (for normalization); uses data maximum if None
495
+ start_angle: Start angle (degrees, -90 means starting from 12 o'clock)
496
+ """
497
+ labels = list(data.keys())
498
+ values = list(data.values())
499
+ n = len(labels)
500
+
501
+ if n == 0:
502
+ return []
503
+
504
+ if max_value is None:
505
+ max_value = max(values)
506
+
507
+ angle_step = 360 / n
508
+ results = []
509
+
510
+ for i, (label, value) in enumerate(zip(labels, values)):
511
+ angle = start_angle + i * angle_step
512
+ rad = math.radians(angle)
513
+
514
+ # Calculate normalized radius
515
+ percentage = (value / max_value * 100) if max_value > 0 else 0
516
+ point_radius = self.radius * (value / max_value) if max_value > 0 else 0
517
+
518
+ # Calculate coordinates
519
+ x = point_radius * math.cos(rad)
520
+ y = point_radius * math.sin(rad)
521
+
522
+ # Label position (outside the outermost ring)
523
+ label_distance = self.radius + 30
524
+ label_x = self.cx + label_distance * math.cos(rad)
525
+ label_y = self.cy + label_distance * math.sin(rad)
526
+
527
+ results.append(RadarPoint(
528
+ index=i + 1,
529
+ label=label,
530
+ value=value,
531
+ percentage=round(percentage, 1),
532
+ angle=round(angle, 1),
533
+ x=round(x, 2),
534
+ y=round(y, 2),
535
+ abs_x=round(self.cx + x, 2),
536
+ abs_y=round(self.cy + y, 2),
537
+ label_x=round(label_x, 1),
538
+ label_y=round(label_y, 1)
539
+ ))
540
+
541
+ return results
542
+
543
+ def calculate_grid(self, levels: int = 5) -> List[List[Tuple[float, float]]]:
544
+ """Calculate grid layer coordinates (for drawing background polygons)"""
545
+ n = 6 # Assume 6 dimensions
546
+ grids = []
547
+
548
+ for level in range(1, levels + 1):
549
+ level_radius = self.radius * level / levels
550
+ points = []
551
+
552
+ angle_step = 360 / n
553
+ for i in range(n):
554
+ angle = -90 + i * angle_step
555
+ rad = math.radians(angle)
556
+ x = level_radius * math.cos(rad)
557
+ y = level_radius * math.sin(rad)
558
+ points.append((round(x, 2), round(y, 2)))
559
+
560
+ grids.append(points)
561
+
562
+ return grids
563
+
564
+ def format_table(self, points: List[RadarPoint]) -> str:
565
+ """Format as table output"""
566
+ lines = []
567
+ lines.append(f"Center: ({self.cx}, {self.cy}) | Radius: {self.radius}")
568
+ lines.append("")
569
+ lines.append("Index Dimension Value Pct Angle X Y Abs_X Abs_Y")
570
+ lines.append("---- ---------- ------ -------- ------ ------- ------- ------- -------")
571
+
572
+ for p in points:
573
+ lines.append(
574
+ f"{p.index:4d} {p.label:<10s} {p.value:>6.1f} {p.percentage:>6.1f}% "
575
+ f"{p.angle:>6.1f} {p.x:>7.2f} {p.y:>7.2f} {p.abs_x:>7.1f} {p.abs_y:>7.1f}"
576
+ )
577
+
578
+ # Generate polygon points attribute
579
+ lines.append("")
580
+ lines.append("=== SVG Polygon Points ===")
581
+ points_str = " ".join([f"{p.x},{p.y}" for p in points])
582
+ lines.append(f'points="{points_str}"')
583
+
584
+ return "\n".join(lines)
585
+
586
+
587
+ # =============================================================================
588
+ # Line / Scatter Chart Calculator
589
+ # =============================================================================
590
+
591
+ @dataclass
592
+ class DataPoint:
593
+ """Data point"""
594
+ index: int
595
+ x_value: float
596
+ y_value: float
597
+ svg_x: float
598
+ svg_y: float
599
+ label: Optional[str] = None
600
+
601
+
602
+ class LineChartCalculator:
603
+ """Line / scatter chart calculator"""
604
+
605
+ def __init__(self, coord_system: CoordinateSystem):
606
+ self.coord = coord_system
607
+
608
+ def calculate(self, data: List[Tuple[float, float]],
609
+ x_range: Optional[Tuple[float, float]] = None,
610
+ y_range: Optional[Tuple[float, float]] = None,
611
+ labels: Optional[List[str]] = None) -> List[DataPoint]:
612
+ """
613
+ Calculate data point coordinates
614
+
615
+ Args:
616
+ data: Data point list [(x1, y1), (x2, y2), ...]
617
+ x_range: X axis range; auto-calculated if None
618
+ y_range: Y axis range; auto-calculated if None
619
+ labels: Point label list
620
+ """
621
+ if not data:
622
+ return []
623
+
624
+ x_values = [p[0] for p in data]
625
+ y_values = [p[1] for p in data]
626
+
627
+ if x_range is None:
628
+ x_range = (min(x_values), max(x_values))
629
+ if y_range is None:
630
+ y_min = 0
631
+ y_max = max(y_values) * 1.1
632
+ y_range = (y_min, y_max)
633
+
634
+ results = []
635
+ for i, (x, y) in enumerate(data):
636
+ svg_x, svg_y = self.coord.data_to_svg(x, y, x_range, y_range)
637
+
638
+ results.append(DataPoint(
639
+ index=i + 1,
640
+ x_value=x,
641
+ y_value=y,
642
+ svg_x=round(svg_x, 1),
643
+ svg_y=round(svg_y, 1),
644
+ label=labels[i] if labels and i < len(labels) else None
645
+ ))
646
+
647
+ return results
648
+
649
+ def generate_path(self, points: List[DataPoint], closed: bool = False) -> str:
650
+ """Generate SVG path d attribute"""
651
+ if not points:
652
+ return ""
653
+
654
+ parts = [f"M {points[0].svg_x},{points[0].svg_y}"]
655
+ for p in points[1:]:
656
+ parts.append(f"L {p.svg_x},{p.svg_y}")
657
+
658
+ if closed:
659
+ parts.append("Z")
660
+
661
+ return " ".join(parts)
662
+
663
+ def format_table(self, points: List[DataPoint]) -> str:
664
+ """Format as table output"""
665
+ lines = []
666
+ area = self.coord.chart_area
667
+ lines.append(f"Chart area: ({area.x_min}, {area.y_min}) - ({area.x_max}, {area.y_max})")
668
+ lines.append("")
669
+ lines.append("Index X_Value Y_Value SVG_X SVG_Y")
670
+ lines.append("---- --------- --------- -------- --------")
671
+
672
+ for p in points:
673
+ label_part = f" ({p.label})" if p.label else ""
674
+ lines.append(
675
+ f"{p.index:4d} {p.x_value:>9.2f} {p.y_value:>9.2f} {p.svg_x:>8.1f} {p.svg_y:>8.1f}{label_part}"
676
+ )
677
+
678
+ lines.append("")
679
+ lines.append("=== SVG Path ===")
680
+ lines.append(self.generate_path(points))
681
+
682
+ return "\n".join(lines)
683
+
684
+
685
+ # =============================================================================
686
+ # Grid Layout Calculator
687
+ # =============================================================================
688
+
689
+ @dataclass
690
+ class GridCell:
691
+ """Grid cell"""
692
+ row: int
693
+ col: int
694
+ index: int # 1-based index
695
+ x: float
696
+ y: float
697
+ width: float
698
+ height: float
699
+ center_x: float
700
+ center_y: float
701
+
702
+
703
+ class GridLayoutCalculator:
704
+ """Grid layout calculator"""
705
+
706
+ def __init__(self, coord_system: CoordinateSystem):
707
+ self.coord = coord_system
708
+
709
+ def calculate(self, rows: int, cols: int,
710
+ padding: float = 20,
711
+ gap: float = 20) -> List[GridCell]:
712
+ """
713
+ Calculate grid layout
714
+
715
+ Args:
716
+ rows: Number of rows
717
+ cols: Number of columns
718
+ padding: Chart area inner padding
719
+ gap: Cell spacing
720
+ """
721
+ area = self.coord.chart_area
722
+
723
+ # Calculate available area
724
+ available_width = area.width - 2 * padding - (cols - 1) * gap
725
+ available_height = area.height - 2 * padding - (rows - 1) * gap
726
+
727
+ cell_width = available_width / cols
728
+ cell_height = available_height / rows
729
+
730
+ results = []
731
+ index = 1
732
+
733
+ for row in range(rows):
734
+ for col in range(cols):
735
+ x = area.x_min + padding + col * (cell_width + gap)
736
+ y = area.y_min + padding + row * (cell_height + gap)
737
+
738
+ results.append(GridCell(
739
+ row=row + 1,
740
+ col=col + 1,
741
+ index=index,
742
+ x=round(x, 1),
743
+ y=round(y, 1),
744
+ width=round(cell_width, 1),
745
+ height=round(cell_height, 1),
746
+ center_x=round(x + cell_width / 2, 1),
747
+ center_y=round(y + cell_height / 2, 1)
748
+ ))
749
+ index += 1
750
+
751
+ return results
752
+
753
+ def format_table(self, cells: List[GridCell]) -> str:
754
+ """Format as table output"""
755
+ lines = []
756
+ area = self.coord.chart_area
757
+ lines.append(f"Chart area: ({area.x_min}, {area.y_min}) - ({area.x_max}, {area.y_max})")
758
+ lines.append("")
759
+ lines.append("Index Row Col X Y Width Height CenterX CenterY")
760
+ lines.append("---- ---- ---- ------- ------- ------- ------- ------- -------")
761
+
762
+ for c in cells:
763
+ lines.append(
764
+ f"{c.index:4d} {c.row:4d} {c.col:4d} {c.x:>7.1f} {c.y:>7.1f} "
765
+ f"{c.width:>7.1f} {c.height:>7.1f} {c.center_x:>7.1f} {c.center_y:>7.1f}"
766
+ )
767
+
768
+ return "\n".join(lines)
769
+
770
+
771
+ # =============================================================================
772
+ # SVG Validator
773
+ # =============================================================================
774
+
775
+ @dataclass
776
+ class ValidationResult:
777
+ """Validation result"""
778
+ element_type: str
779
+ element_id: str
780
+ attribute: str
781
+ expected: float
782
+ actual: float
783
+ deviation: float
784
+ passed: bool
785
+
786
+
787
+ class SVGPositionValidator:
788
+ """SVG position validator"""
789
+
790
+ def __init__(self, tolerance: float = 1.0):
791
+ """
792
+ Initialize the validator
793
+
794
+ Args:
795
+ tolerance: Allowed deviation (pixels)
796
+ """
797
+ self.tolerance = tolerance
798
+
799
+ def validate_from_file(self, svg_file: str,
800
+ expected_coords: Dict[str, Dict[str, float]]) -> List[ValidationResult]:
801
+ """
802
+ Validate coordinates from file
803
+
804
+ Args:
805
+ svg_file: SVG file path
806
+ expected_coords: Expected coordinates {element_ID: {attribute: value}}
807
+ """
808
+ svg_path = Path(svg_file)
809
+ if not svg_path.exists():
810
+ raise FileNotFoundError(f"SVG file does not exist: {svg_file}")
811
+
812
+ with open(svg_path, 'r', encoding='utf-8') as f:
813
+ content = f.read()
814
+
815
+ return self.validate_content(content, expected_coords)
816
+
817
+ def validate_content(self, svg_content: str,
818
+ expected_coords: Dict[str, Dict[str, float]]) -> List[ValidationResult]:
819
+ """Validate coordinates in SVG content"""
820
+ results = []
821
+
822
+ for element_id, attrs in expected_coords.items():
823
+ for attr, expected in attrs.items():
824
+ actual = self._extract_attribute(svg_content, element_id, attr)
825
+
826
+ if actual is not None:
827
+ deviation = abs(actual - expected)
828
+ passed = deviation <= self.tolerance
829
+
830
+ results.append(ValidationResult(
831
+ element_type=self._guess_element_type(element_id),
832
+ element_id=element_id,
833
+ attribute=attr,
834
+ expected=expected,
835
+ actual=actual,
836
+ deviation=round(deviation, 2),
837
+ passed=passed
838
+ ))
839
+ else:
840
+ results.append(ValidationResult(
841
+ element_type=self._guess_element_type(element_id),
842
+ element_id=element_id,
843
+ attribute=attr,
844
+ expected=expected,
845
+ actual=float('nan'),
846
+ deviation=float('inf'),
847
+ passed=False
848
+ ))
849
+
850
+ return results
851
+
852
+ def _extract_attribute(self, content: str, element_id: str, attr: str) -> Optional[float]:
853
+ """Extract attribute value from SVG content"""
854
+ # Find element containing the ID
855
+ pattern = rf'id="{element_id}"[^>]*{attr}="([^"]+)"'
856
+ match = re.search(pattern, content)
857
+
858
+ if not match:
859
+ # Try reverse order
860
+ pattern = rf'{attr}="([^"]+)"[^>]*id="{element_id}"'
861
+ match = re.search(pattern, content)
862
+
863
+ if match:
864
+ try:
865
+ return float(match.group(1))
866
+ except ValueError:
867
+ return None
868
+
869
+ return None
870
+
871
+ def _guess_element_type(self, element_id: str) -> str:
872
+ """Guess element type based on ID"""
873
+ id_lower = element_id.lower()
874
+ if 'bar' in id_lower or 'rect' in id_lower:
875
+ return 'rect'
876
+ elif 'circle' in id_lower or 'dot' in id_lower:
877
+ return 'circle'
878
+ elif 'path' in id_lower or 'slice' in id_lower:
879
+ return 'path'
880
+ elif 'line' in id_lower:
881
+ return 'line'
882
+ elif 'text' in id_lower or 'label' in id_lower:
883
+ return 'text'
884
+ return 'unknown'
885
+
886
+ def extract_all_positions(self, svg_content: str) -> Dict[str, Dict[str, float]]:
887
+ """Extract position information of all elements in SVG"""
888
+ positions = {}
889
+
890
+ # Extract rect elements
891
+ rect_pattern = r'<rect[^>]*(?:id="([^"]*)")?[^>]*x="([^"]*)"[^>]*y="([^"]*)"[^>]*(?:width="([^"]*)")?[^>]*(?:height="([^"]*)")?'
892
+ for match in re.finditer(rect_pattern, svg_content):
893
+ id_val = match.group(1) or f"rect_{len(positions)}"
894
+ positions[id_val] = {
895
+ 'x': float(match.group(2)) if match.group(2) else 0,
896
+ 'y': float(match.group(3)) if match.group(3) else 0,
897
+ }
898
+ if match.group(4):
899
+ positions[id_val]['width'] = float(match.group(4))
900
+ if match.group(5):
901
+ positions[id_val]['height'] = float(match.group(5))
902
+
903
+ # Extract circle elements
904
+ circle_pattern = r'<circle[^>]*(?:id="([^"]*)")?[^>]*cx="([^"]*)"[^>]*cy="([^"]*)"'
905
+ for match in re.finditer(circle_pattern, svg_content):
906
+ id_val = match.group(1) or f"circle_{len(positions)}"
907
+ positions[id_val] = {
908
+ 'cx': float(match.group(2)),
909
+ 'cy': float(match.group(3)),
910
+ }
911
+
912
+ return positions
913
+
914
+ def format_results(self, results: List[ValidationResult]) -> str:
915
+ """Format validation results"""
916
+ lines = []
917
+ lines.append("=== SVG Position Validation Results ===")
918
+ lines.append(f"Tolerance: {self.tolerance}px")
919
+ lines.append("")
920
+ lines.append("Status Element_ID Attr Expected Actual Deviation")
921
+ lines.append("---- -------------- ------ -------- -------- ------")
922
+
923
+ passed_count = 0
924
+ for r in results:
925
+ status = "[OK]" if r.passed else "[X]"
926
+ if r.passed:
927
+ passed_count += 1
928
+
929
+ actual_str = f"{r.actual:.1f}" if not math.isnan(r.actual) else "N/A"
930
+ deviation_str = f"{r.deviation:.2f}" if not math.isinf(r.deviation) else "N/A"
931
+
932
+ lines.append(
933
+ f"{status} {r.element_id:<14s} {r.attribute:<6s} "
934
+ f"{r.expected:>8.1f} {actual_str:>8s} {deviation_str:>6s}"
935
+ )
936
+
937
+ lines.append("")
938
+ lines.append(f"Passed: {passed_count}/{len(results)} ({passed_count/len(results)*100:.1f}%)")
939
+
940
+ return "\n".join(lines)
941
+
942
+
943
+ # =============================================================================
944
+ # Command Line Interface
945
+ # =============================================================================
946
+
947
+ def parse_data_string(data_str: str) -> Dict[str, float]:
948
+ """Parse data string in 'label1:value1,label2:value2' format"""
949
+ result = {}
950
+ for item in data_str.split(','):
951
+ item = item.strip()
952
+ if not item:
953
+ continue
954
+ if ':' in item:
955
+ label, value = item.split(':', 1)
956
+ try:
957
+ result[label.strip()] = float(value.strip())
958
+ except ValueError:
959
+ print(f"[Warning] Unable to parse value: '{value.strip()}', skipped")
960
+ else:
961
+ print(f"[Warning] Invalid format (expected 'label:value'): '{item}'")
962
+ return result
963
+
964
+
965
+ def parse_xy_data_string(data_str: str) -> List[Tuple[float, float]]:
966
+ """Parse XY data string in 'x1:y1,x2:y2' format"""
967
+ result = []
968
+ for item in data_str.split(','):
969
+ item = item.strip()
970
+ if not item:
971
+ continue
972
+ if ':' in item:
973
+ x, y = item.split(':', 1)
974
+ try:
975
+ result.append((float(x.strip()), float(y.strip())))
976
+ except ValueError:
977
+ print(f"[Warning] Unable to parse coordinates: '{item}', skipped")
978
+ else:
979
+ print(f"[Warning] Invalid format (expected 'x:y'): '{item}'")
980
+ return result
981
+
982
+
983
+ def parse_tuple(s: str) -> Tuple[float, ...]:
984
+ """Parse comma-separated numeric tuple"""
985
+ return tuple(float(x.strip()) for x in s.split(','))
986
+
987
+
988
+ def extract_attr(element: str, attr_name: str) -> Optional[str]:
989
+ """Extract attribute value from element string (attribute order independent)"""
990
+ pattern = rf'{attr_name}="([^"]*)"'
991
+ match = re.search(pattern, element)
992
+ return match.group(1) if match else None
993
+
994
+
995
+ def analyze_svg_file(svg_file: str) -> None:
996
+ """Analyze all chart elements in an SVG file"""
997
+ svg_path = Path(svg_file)
998
+ if not svg_path.exists():
999
+ print(f"[Error] File does not exist: {svg_file}")
1000
+ return
1001
+
1002
+ with open(svg_path, 'r', encoding='utf-8') as f:
1003
+ content = f.read()
1004
+
1005
+ print(f"\n{'='*70}")
1006
+ print(f"SVG File Analysis: {svg_path.name}")
1007
+ print(f"{'='*70}")
1008
+
1009
+ # Extract viewBox
1010
+ viewbox_match = re.search(r'viewBox="([^"]+)"', content)
1011
+ if viewbox_match:
1012
+ print(f"Canvas viewBox: {viewbox_match.group(1)}")
1013
+
1014
+ # Use more robust element extraction (attribute order independent)
1015
+ # Extract all rect elements
1016
+ rect_elements = re.findall(r'<rect[^>]*/?>', content)
1017
+ rects = []
1018
+ for elem in rect_elements:
1019
+ x = extract_attr(elem, 'x')
1020
+ y = extract_attr(elem, 'y')
1021
+ w = extract_attr(elem, 'width')
1022
+ h = extract_attr(elem, 'height')
1023
+ if x is not None and y is not None:
1024
+ rects.append((x, y, w, h))
1025
+
1026
+ # Extract all circle elements
1027
+ circle_elements = re.findall(r'<circle[^>]*/?>', content)
1028
+ circles = []
1029
+ for elem in circle_elements:
1030
+ cx = extract_attr(elem, 'cx')
1031
+ cy = extract_attr(elem, 'cy')
1032
+ r = extract_attr(elem, 'r')
1033
+ if cx is not None and cy is not None:
1034
+ circles.append((cx, cy, r))
1035
+
1036
+ # Extract all polyline/polygon elements
1037
+ polylines = re.findall(r'<(?:polyline|polygon)[^>]*points="([^"]*)"', content)
1038
+
1039
+ # Extract path elements
1040
+ paths = re.findall(r'<path[^>]*d="([^"]*)"', content)
1041
+
1042
+ print(f"\nElement statistics:")
1043
+ print(f" - rect (rectangle): {len(rects)}")
1044
+ print(f" - circle: {len(circles)}")
1045
+ print(f" - polyline/polygon: {len(polylines)}")
1046
+ print(f" - path: {len(paths)}")
1047
+
1048
+ # List rect elements in detail
1049
+ if rects:
1050
+ print(f"\n=== Rectangle Elements (rect) ===")
1051
+ print(f"{'Index':<6}{'X':<8} {'Y':<8} {'Width':<8} {'Height':<8}")
1052
+ print("-" * 45)
1053
+ for i, (x, y, w, h) in enumerate(rects[:20], 1): # Only show first 20
1054
+ w_str = w if w else '-'
1055
+ h_str = h if h else '-'
1056
+ print(f"{i:<6}{x:<8} {y:<8} {w_str:<8} {h_str:<8}")
1057
+ if len(rects) > 20:
1058
+ print(f"... and {len(rects) - 20} more rectangle(s)")
1059
+
1060
+ # List circle elements in detail
1061
+ if circles:
1062
+ print(f"\n=== Circle Elements (circle) ===")
1063
+ print(f"{'Index':<6}{'CX':<10} {'CY':<10} {'Radius':<8}")
1064
+ print("-" * 40)
1065
+ for i, (cx, cy, r) in enumerate(circles[:20], 1):
1066
+ r_str = r if r else '-'
1067
+ print(f"{i:<6}{cx:<10} {cy:<10} {r_str:<8}")
1068
+ if len(circles) > 20:
1069
+ print(f"... and {len(circles) - 20} more circle(s)")
1070
+
1071
+ # List polyline points
1072
+ if polylines:
1073
+ print(f"\n=== Polyline/Polygon (polyline/polygon) ===")
1074
+ for i, points in enumerate(polylines, 1):
1075
+ point_list = points.strip().split()
1076
+ print(f"\nPolyline {i} ({len(point_list)} points):")
1077
+ # Parse and show first few points
1078
+ parsed_points = []
1079
+ for p in point_list[:5]:
1080
+ if ',' in p:
1081
+ x, y = p.split(',')
1082
+ parsed_points.append(f"({x},{y})")
1083
+ print(f" Start points: {' -> '.join(parsed_points)}")
1084
+ if len(point_list) > 5:
1085
+ print(f" ... {len(point_list)} points total")
1086
+
1087
+ print(f"\n{'='*70}")
1088
+
1089
+
1090
+ def interactive_mode() -> None:
1091
+ """Interactive calculation mode"""
1092
+ print("\n" + "="*60)
1093
+ print("SVG Position Calculator - Interactive Mode")
1094
+ print("="*60)
1095
+ print("\nSelect chart type:")
1096
+ print(" 1. Bar chart (bar)")
1097
+ print(" 2. Pie chart (pie)")
1098
+ print(" 3. Radar chart (radar)")
1099
+ print(" 4. Line chart (line)")
1100
+ print(" 5. Grid layout (grid)")
1101
+ print(" 6. Custom line (custom)")
1102
+ print(" 0. Exit")
1103
+
1104
+ while True:
1105
+ try:
1106
+ choice = input("\nSelect [1-6, 0 to exit]: ").strip()
1107
+
1108
+ if choice == '0':
1109
+ print("Exiting interactive mode")
1110
+ break
1111
+
1112
+ elif choice == '1':
1113
+ print("\n=== Bar Chart Calculation ===")
1114
+ data_str = input("Enter data (format: label1:value1,label2:value2): ").strip()
1115
+ if not data_str:
1116
+ print("Example: East:185,South:142,North:128")
1117
+ continue
1118
+
1119
+ canvas = input("Canvas format [ppt169]: ").strip() or 'ppt169'
1120
+ coord = CoordinateSystem(canvas)
1121
+ calc = BarChartCalculator(coord)
1122
+ data = parse_data_string(data_str)
1123
+ positions = calc.calculate(data)
1124
+ print()
1125
+ print(calc.format_table(positions))
1126
+
1127
+ elif choice == '2':
1128
+ print("\n=== Pie Chart Calculation ===")
1129
+ data_str = input("Enter data (format: label1:value1,label2:value2): ").strip()
1130
+ if not data_str:
1131
+ print("Example: A:35,B:25,C:20,D:12,Other:8")
1132
+ continue
1133
+
1134
+ center_str = input("Center coordinates [420,400]: ").strip() or '420,400'
1135
+ radius = float(input("Radius [200]: ").strip() or '200')
1136
+
1137
+ center = parse_tuple(center_str)
1138
+ calc = PieChartCalculator(center, radius)
1139
+ data = parse_data_string(data_str)
1140
+ slices = calc.calculate(data)
1141
+ print()
1142
+ print(calc.format_table(slices))
1143
+
1144
+ elif choice == '3':
1145
+ print("\n=== Radar Chart Calculation ===")
1146
+ data_str = input("Enter data (format: dim1:value1,dim2:value2): ").strip()
1147
+ if not data_str:
1148
+ print("Example: Performance:90,Security:85,Usability:75,Price:70")
1149
+ continue
1150
+
1151
+ center_str = input("Center coordinates [640,400]: ").strip() or '640,400'
1152
+ radius = float(input("Radius [200]: ").strip() or '200')
1153
+
1154
+ center = parse_tuple(center_str)
1155
+ calc = RadarChartCalculator(center, radius)
1156
+ data = parse_data_string(data_str)
1157
+ points = calc.calculate(data)
1158
+ print()
1159
+ print(calc.format_table(points))
1160
+
1161
+ elif choice == '4':
1162
+ print("\n=== Line Chart Calculation ===")
1163
+ data_str = input("Enter data (format: x1:y1,x2:y2): ").strip()
1164
+ if not data_str:
1165
+ print("Example: 0:50,10:80,20:120,30:95")
1166
+ continue
1167
+
1168
+ canvas = input("Canvas format [ppt169]: ").strip() or 'ppt169'
1169
+ coord = CoordinateSystem(canvas)
1170
+ calc = LineChartCalculator(coord)
1171
+ data = parse_xy_data_string(data_str)
1172
+ points = calc.calculate(data)
1173
+ print()
1174
+ print(calc.format_table(points))
1175
+
1176
+ elif choice == '5':
1177
+ print("\n=== Grid Layout Calculation ===")
1178
+ rows = int(input("Rows: ").strip() or '2')
1179
+ cols = int(input("Columns: ").strip() or '3')
1180
+ canvas = input("Canvas format [ppt169]: ").strip() or 'ppt169'
1181
+
1182
+ coord = CoordinateSystem(canvas)
1183
+ calc = GridLayoutCalculator(coord)
1184
+ cells = calc.calculate(rows, cols)
1185
+ print()
1186
+ print(calc.format_table(cells))
1187
+
1188
+ elif choice == '6':
1189
+ print("\n=== Custom Line Calculation ===")
1190
+ print("For custom formula line charts, such as price index charts")
1191
+
1192
+ base_x = float(input("X start value [170]: ").strip() or '170')
1193
+ step_x = float(input("X step [40]: ").strip() or '40')
1194
+ base_y = float(input("Y baseline [595]: ").strip() or '595')
1195
+ scale_y = float(input("Y scale factor [20]: ").strip() or '20')
1196
+ ref_value = float(input("Reference baseline value [100]: ").strip() or '100')
1197
+
1198
+ print(f"\nFormula: X = {base_x} + index * {step_x}")
1199
+ print(f" Y = {base_y} - (value - {ref_value}) * {scale_y}")
1200
+
1201
+ data_str = input("\nEnter data (comma-separated values): ").strip()
1202
+ if data_str:
1203
+ values = [float(v.strip()) for v in data_str.split(',')]
1204
+ print(f"\n{'Index':<6}{'Value':<10} {'X':<8} {'Y':<8}")
1205
+ print("-" * 35)
1206
+ for i, v in enumerate(values, 1):
1207
+ x = base_x + i * step_x
1208
+ y = base_y - (v - ref_value) * scale_y
1209
+ print(f"{i:<6}{v:<10.1f} {x:<8.0f} {y:<8.0f}")
1210
+
1211
+ # Generate polyline points
1212
+ points_list = []
1213
+ for i, v in enumerate(values, 1):
1214
+ x = base_x + i * step_x
1215
+ y = base_y - (v - ref_value) * scale_y
1216
+ points_list.append(f"{int(x)},{int(y)}")
1217
+ print(f"\npolyline points:")
1218
+ print(" ".join(points_list))
1219
+
1220
+ else:
1221
+ print("Invalid selection, please enter 1-6 or 0")
1222
+
1223
+ except KeyboardInterrupt:
1224
+ print("\nExiting interactive mode")
1225
+ break
1226
+ except Exception as e:
1227
+ print(f"Error: {e}")
1228
+
1229
+
1230
+ def from_json_config(config_file: str) -> None:
1231
+ """Read and calculate from JSON config file"""
1232
+ import json
1233
+
1234
+ config_path = Path(config_file)
1235
+ if not config_path.exists():
1236
+ print(f"[Error] Config file does not exist: {config_file}")
1237
+ return
1238
+
1239
+ with open(config_path, 'r', encoding='utf-8') as f:
1240
+ config = json.load(f)
1241
+
1242
+ chart_type = config.get('type', 'bar')
1243
+ data = config.get('data', {})
1244
+
1245
+ print(f"\nLoaded from config file: {config_path.name}")
1246
+ print(f"Chart type: {chart_type}")
1247
+
1248
+ if chart_type == 'bar':
1249
+ canvas = config.get('canvas', 'ppt169')
1250
+ coord = CoordinateSystem(canvas)
1251
+ calc = BarChartCalculator(coord)
1252
+ positions = calc.calculate(data)
1253
+ print(calc.format_table(positions))
1254
+
1255
+ elif chart_type == 'pie':
1256
+ center = tuple(config.get('center', [420, 400]))
1257
+ radius = config.get('radius', 200)
1258
+ calc = PieChartCalculator(center, radius)
1259
+ slices = calc.calculate(data)
1260
+ print(calc.format_table(slices))
1261
+
1262
+ elif chart_type == 'line':
1263
+ canvas = config.get('canvas', 'ppt169')
1264
+ coord = CoordinateSystem(canvas)
1265
+ calc = LineChartCalculator(coord)
1266
+ # data should be list of [x, y] pairs
1267
+ points_data = [(p[0], p[1]) for p in data]
1268
+ points = calc.calculate(points_data)
1269
+ print(calc.format_table(points))
1270
+
1271
+ elif chart_type == 'custom_line':
1272
+ # Custom line chart
1273
+ base_x = config.get('base_x', 170)
1274
+ step_x = config.get('step_x', 40)
1275
+ base_y = config.get('base_y', 595)
1276
+ scale_y = config.get('scale_y', 20)
1277
+ ref_value = config.get('ref_value', 100)
1278
+ values = config.get('values', [])
1279
+
1280
+ print(f"\nFormula: X = {base_x} + index * {step_x}")
1281
+ print(f" Y = {base_y} - (value - {ref_value}) * {scale_y}")
1282
+ print(f"\n{'Index':<6}{'Value':<10} {'X':<8} {'Y':<8}")
1283
+ print("-" * 35)
1284
+
1285
+ points_list = []
1286
+ for i, v in enumerate(values, 1):
1287
+ x = base_x + i * step_x
1288
+ y = base_y - (v - ref_value) * scale_y
1289
+ print(f"{i:<6}{v:<10.1f} {x:<8.0f} {y:<8.0f}")
1290
+ points_list.append(f"{int(x)},{int(y)}")
1291
+
1292
+ print(f"\npolyline points:")
1293
+ print(" ".join(points_list))
1294
+
1295
+
1296
+ def main() -> None:
1297
+ """Run the CLI entry point."""
1298
+ parser = argparse.ArgumentParser(
1299
+ description='SVG Position Calculation and Validation Tool',
1300
+ formatter_class=argparse.RawDescriptionHelpFormatter,
1301
+ epilog="""
1302
+ Common commands:
1303
+ # Analyze SVG file
1304
+ python svg_position_calculator.py analyze example.svg
1305
+
1306
+ # Interactive mode
1307
+ python svg_position_calculator.py interactive
1308
+
1309
+ # Calculate from JSON config
1310
+ python svg_position_calculator.py from-json config.json
1311
+
1312
+ # Quick calculation
1313
+ python svg_position_calculator.py calc bar --data "East:185,South:142"
1314
+ python svg_position_calculator.py calc pie --data "A:35,B:25,C:20"
1315
+ python svg_position_calculator.py calc line --data "0:50,10:80,20:120"
1316
+ """
1317
+ )
1318
+
1319
+ subparsers = parser.add_subparsers(dest='command', help='Command')
1320
+
1321
+ # calc subcommand
1322
+ calc_parser = subparsers.add_parser('calc', help='Calculate coordinates')
1323
+ calc_subparsers = calc_parser.add_subparsers(dest='chart_type', help='Chart type')
1324
+
1325
+ # Bar chart
1326
+ bar_parser = calc_subparsers.add_parser('bar', help='Bar chart')
1327
+ bar_parser.add_argument('--data', required=True, help='Data "label1:value1,label2:value2"')
1328
+ bar_parser.add_argument('--canvas', default='ppt169', help='Canvas format')
1329
+ bar_parser.add_argument('--area', help='Chart area "x_min,y_min,x_max,y_max"')
1330
+ bar_parser.add_argument('--bar-width', type=float, default=50, help='Bar width')
1331
+ bar_parser.add_argument('--horizontal', action='store_true', help='Horizontal bar chart')
1332
+
1333
+ # Pie chart
1334
+ pie_parser = calc_subparsers.add_parser('pie', help='Pie / donut chart')
1335
+ pie_parser.add_argument('--data', required=True, help='Data "label1:value1,label2:value2"')
1336
+ pie_parser.add_argument('--center', default='420,400', help='Center "x,y"')
1337
+ pie_parser.add_argument('--radius', type=float, default=200, help='Radius')
1338
+ pie_parser.add_argument('--inner-radius', type=float, default=0, help='Inner radius (donut chart)')
1339
+ pie_parser.add_argument('--start-angle', type=float, default=-90, help='Start angle')
1340
+
1341
+ # Radar chart
1342
+ radar_parser = calc_subparsers.add_parser('radar', help='Radar chart')
1343
+ radar_parser.add_argument('--data', required=True, help='Data "dim1:value1,dim2:value2"')
1344
+ radar_parser.add_argument('--center', default='640,400', help='Center "x,y"')
1345
+ radar_parser.add_argument('--radius', type=float, default=200, help='Radius')
1346
+ radar_parser.add_argument('--max-value', type=float, help='Maximum value')
1347
+
1348
+ # Line / scatter chart
1349
+ line_parser = calc_subparsers.add_parser('line', help='Line / scatter chart')
1350
+ line_parser.add_argument('--data', required=True, help='Data "x1:y1,x2:y2"')
1351
+ line_parser.add_argument('--canvas', default='ppt169', help='Canvas format')
1352
+ line_parser.add_argument('--area', help='Chart area "x_min,y_min,x_max,y_max"')
1353
+ line_parser.add_argument('--x-range', help='X axis range "min,max"')
1354
+ line_parser.add_argument('--y-range', help='Y axis range "min,max"')
1355
+
1356
+ # Grid layout
1357
+ grid_parser = calc_subparsers.add_parser('grid', help='Grid layout')
1358
+ grid_parser.add_argument('--rows', type=int, required=True, help='Number of rows')
1359
+ grid_parser.add_argument('--cols', type=int, required=True, help='Number of columns')
1360
+ grid_parser.add_argument('--canvas', default='ppt169', help='Canvas format')
1361
+ grid_parser.add_argument('--area', help='Chart area "x_min,y_min,x_max,y_max"')
1362
+ grid_parser.add_argument('--padding', type=float, default=20, help='Inner padding')
1363
+ grid_parser.add_argument('--gap', type=float, default=20, help='Spacing')
1364
+
1365
+ # validate subcommand
1366
+ validate_parser = subparsers.add_parser('validate', help='Validate SVG')
1367
+ validate_parser.add_argument('svg_file', help='SVG file path')
1368
+ validate_parser.add_argument('--extract', action='store_true', help='Extract all position information')
1369
+ validate_parser.add_argument('--tolerance', type=float, default=1.0, help='Tolerance (pixels)')
1370
+
1371
+ # analyze subcommand - analyze SVG file
1372
+ analyze_parser = subparsers.add_parser('analyze', help='Analyze chart elements in SVG file')
1373
+ analyze_parser.add_argument('svg_file', help='SVG file path')
1374
+
1375
+ # interactive subcommand - interactive mode
1376
+ subparsers.add_parser('interactive', help='Interactive calculation mode')
1377
+
1378
+ # from-json subcommand - read from config file
1379
+ json_parser = subparsers.add_parser('from-json', help='Calculate from JSON config file')
1380
+ json_parser.add_argument('config_file', help='JSON config file path')
1381
+
1382
+ args = parser.parse_args()
1383
+
1384
+ if args.command == 'calc':
1385
+ # Parse chart area
1386
+ chart_area = None
1387
+ if hasattr(args, 'area') and args.area:
1388
+ parts = parse_tuple(args.area)
1389
+ chart_area = ChartArea(parts[0], parts[1], parts[2], parts[3])
1390
+
1391
+ if args.chart_type == 'bar':
1392
+ canvas = args.canvas if hasattr(args, 'canvas') else 'ppt169'
1393
+ coord = CoordinateSystem(canvas, chart_area)
1394
+ calc = BarChartCalculator(coord)
1395
+ data = parse_data_string(args.data)
1396
+ positions = calc.calculate(data, bar_width=args.bar_width, horizontal=args.horizontal)
1397
+
1398
+ print(f"\n=== Bar Chart Coordinate Calculation ===")
1399
+ print(f"Canvas: {CANVAS_FORMATS.get(canvas, {}).get('dimensions', canvas)}")
1400
+ print(f"Chart area: ({coord.chart_area.x_min}, {coord.chart_area.y_min}) - "
1401
+ f"({coord.chart_area.x_max}, {coord.chart_area.y_max})")
1402
+ print()
1403
+ print(calc.format_table(positions))
1404
+
1405
+ elif args.chart_type == 'pie':
1406
+ center = parse_tuple(args.center)
1407
+ calc = PieChartCalculator(center, args.radius)
1408
+ data = parse_data_string(args.data)
1409
+ slices = calc.calculate(data, start_angle=args.start_angle, inner_radius=args.inner_radius)
1410
+
1411
+ print(f"\n=== Pie Chart Slice Calculation ===")
1412
+ print(calc.format_table(slices))
1413
+
1414
+ elif args.chart_type == 'radar':
1415
+ center = parse_tuple(args.center)
1416
+ calc = RadarChartCalculator(center, args.radius)
1417
+ data = parse_data_string(args.data)
1418
+ points = calc.calculate(data, max_value=args.max_value)
1419
+
1420
+ print(f"\n=== Radar Chart Vertex Calculation ===")
1421
+ print(calc.format_table(points))
1422
+
1423
+ elif args.chart_type == 'line':
1424
+ canvas = args.canvas if hasattr(args, 'canvas') else 'ppt169'
1425
+ coord = CoordinateSystem(canvas, chart_area)
1426
+ calc = LineChartCalculator(coord)
1427
+ data = parse_xy_data_string(args.data)
1428
+
1429
+ x_range = parse_tuple(args.x_range) if args.x_range else None
1430
+ y_range = parse_tuple(args.y_range) if args.y_range else None
1431
+
1432
+ points = calc.calculate(data, x_range, y_range)
1433
+
1434
+ print(f"\n=== Line / Scatter Chart Coordinate Calculation ===")
1435
+ print(f"Canvas: {CANVAS_FORMATS.get(canvas, {}).get('dimensions', canvas)}")
1436
+ print(calc.format_table(points))
1437
+
1438
+ elif args.chart_type == 'grid':
1439
+ canvas = args.canvas if hasattr(args, 'canvas') else 'ppt169'
1440
+ coord = CoordinateSystem(canvas, chart_area)
1441
+ calc = GridLayoutCalculator(coord)
1442
+ cells = calc.calculate(args.rows, args.cols, args.padding, args.gap)
1443
+
1444
+ print(f"\n=== Grid Layout Calculation ({args.rows}x{args.cols}) ===")
1445
+ print(f"Canvas: {CANVAS_FORMATS.get(canvas, {}).get('dimensions', canvas)}")
1446
+ print(calc.format_table(cells))
1447
+
1448
+ else:
1449
+ parser.print_help()
1450
+
1451
+ elif args.command == 'validate':
1452
+ validator = SVGPositionValidator(tolerance=args.tolerance)
1453
+
1454
+ if args.extract:
1455
+ # Extract mode
1456
+ with open(args.svg_file, 'r', encoding='utf-8') as f:
1457
+ content = f.read()
1458
+
1459
+ positions = validator.extract_all_positions(content)
1460
+
1461
+ print(f"\n=== Extracted Element Positions ===")
1462
+ print(f"File: {args.svg_file}")
1463
+ print()
1464
+
1465
+ for element_id, attrs in positions.items():
1466
+ print(f"{element_id}:")
1467
+ for attr, value in attrs.items():
1468
+ print(f" {attr}: {value}")
1469
+ else:
1470
+ print("Validation mode requires an expected coordinates file; use --extract to extract coordinates first")
1471
+
1472
+ elif args.command == 'analyze':
1473
+ analyze_svg_file(args.svg_file)
1474
+
1475
+ elif args.command == 'interactive':
1476
+ interactive_mode()
1477
+
1478
+ elif args.command == 'from-json':
1479
+ from_json_config(args.config_file)
1480
+
1481
+ else:
1482
+ parser.print_help()
1483
+
1484
+
1485
+ if __name__ == '__main__':
1486
+ main()