Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Convert a Markdown file written in the user's slide-authoring format (with Hebrew or mixed Hebrew/English) into a basic, RTL-aware PowerPoint .pptx skeleton. Use whenever the user wants to turn slide-Markdown (blocks separated by `---`, content/notes separated by `===`, section/slide labels and presenter instructions in [brackets]) into an editable deck, or complains that pasting such Markdown into PowerPoint breaks right-to-left alignment, flips the punctuation around English, or flags every He
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-12 | ✗→✓ | ▲ Improved | 14% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 29% | 0% |
Converts a Markdown deck written in the slide-authoring format into a clean, RTL-aware .pptx skeleton. This is the slide counterpart of the hebrew-md-to-docx skill, and the inverse of pptx-to-slide-md (so a deck can round-trip: PPTX → slide-Markdown → PPTX).
Pasting slide-Markdown into PowerPoint forces the user to right-align every Hebrew paragraph by hand, and still leaves bugs: punctuation and brackets around English (ו-CTO., [^]) drift to the wrong side, and every Hebrew word is underlined as a spelling mistake because the runs carry no Hebrew language tag. This skill fixes all of that at the OOXML level and lays out one slide per block with the title, body, and speaker notes in the right places.
The converter is md_to_pptx_he.py (Python 3; needs python-pptx, mistune, and Pillow):
bashpip install python-pptx mistune Pillow --break-system-packages # if needed python md_to_pptx_he.py INPUT.md -o OUTPUT.pptx
Options:
--template DECK.pptx – build on a template so the output inherits a specifictheme, fonts, and slide layouts (see below). Without it, python-pptx's plain default theme is used.
--overrides overrides.json – pin the base direction of ambiguous paragraphs({ "3": "rtl", "12": "ltr" }, keyed by the index printed to stderr).
--code-font Consolas – monospace font for code spans/blocks. DefaultConsolas.
Slide size: without a template the deck is 16:9 widescreen (13.33"×7.5"), and the title/body placeholders are widened to fill it. With --template, the template's own slide size and layouts are kept as-is.
By default, run the converter without --template — it uses python-pptx's plain default theme, since the output is meant to be styled afterwards anyway. Only use --template DECK.pptx if the user explicitly asks for a specific template, theme, fonts, or layouts to be applied.
The document is a sequence of slide blocks. --- on its own line separates slides; === separates a slide's body from its speaker notes.
markdown# [Section 1: Section Name (~time)] <- starts a native PowerPoint section ## [Slide 1: Brief Description] <- scaffolding label, dropped from the slide # Slide Title <- the real slide title Body markdown: bullets, numbered lists, tables, **bold**, *italic*, `code`, [links](url). [presenter instruction] <- moved to the speaker notes [image: path/to/pic.png — "alt"] <- embedded onto the slide [^] <- a click marker; also moved to notes === **Speaker Notes:** Notes in markdown. Single line breaks are preserved. --- ## [Slide 2: ...] # Next Slide Title ...
Key rules:
# [Section N: Name] start a native PowerPoint section. Thelabel Section N: is stripped; only the name (everything after the colon, e.g. Section Name (~time)) is used. Every following slide belongs to that section until the next section label.
## [Slide N: ...] are scaffolding for the author and aredropped. A lone [Slide N] line (as produced by pptx-to-slide-md) is also recognised as a slide label and dropped, so an extracted deck round-trips.
# Heading inside the body. # (untitled) (and# (Slide N — untitled)) is treated as an empty title.
[brackets] inside the body — animations, demos,[^] click markers, etc. — are removed from the slide and appended to the speaker notes under a "Presenter instructions:" heading. ([text](url) is a link, not an instruction, and is kept.)
[image: path — "alt"] are embedded onto the slide(path resolved relative to the input .md). The alt text is ignored.
[hidden slide] markers are dropped (the converter does not re-hide slides).Unlike Word, PowerPoint sets text direction per paragraph, and there is no per-run RTL flag. So:
directional characters (Hebrew vs Latin), and written as a:pPr/@rtl plus a matching @algn (right for RTL, left for LTR).
with a language (a:rPr/@lang = he-IL or en-US). This does two jobs: the spell-checker uses the Hebrew dictionary for Hebrew runs (no more everything-is-a-typo), and PowerPoint resolves bidi per run so neutral punctuation (dash, dot, brackets) around English joins the Hebrew side instead of drifting LTR. Digits stay LTR so numbers like 1920 never reverse.
--overrides keyed by the printed index.
(a:tbl @rtl).
| Markdown | PowerPoint | | --- | --- | | # Title (first heading in body) | slide title placeholder | | paragraphs, ##+ headings | body placeholder paragraphs (headings bold) | | - / 1. lists | bulleted / auto-numbered paragraphs with hanging indent | | **bold**, *italic*, ~~strike~~ | run formatting | | code / blocks | monospace runs (LTR) | | text | hyperlinked runs | | tables | a table shape (RTL column order when Hebrew) | | image: ...] | embedded picture | | body brackets], ^] | appended to speaker notes | | speaker notes | notes pane; single line breaks preserved |
Notes keep the author's line structure: a single newline becomes a real line break (Markdown would otherwise collapse it to a space). Bulleted/numbered notes get a hanging indent so the marker is spaced from the text even though the notes text frame defines no list styles.
fonts, layouts — is a deliberate later step.
advance), so a slide that mixes a lot of body text with a table/image may need manual repositioning.
hand afterwards.
Other measured skills in the registry, with their headline benchmark lift.