# Paragraph Formatting Showcase

Exercises the docx **paragraph** property surface. Three files:

- **paragraph-formatting.sh** — builds the document with `officecli` (155 lines, ~55 commands).
- **paragraph-formatting.docx** — generated output, one paragraph per property group.
- **paragraph-formatting.md** — this file.

## Regenerate

```bash
cd examples/word
bash paragraph-formatting.sh
# → paragraph-formatting.docx
```

## Alignment

The four standard paragraph alignment values.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Left aligned (default)" --prop align=left
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Center aligned" --prop align=center
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Right aligned" --prop align=right
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Justified text stretched edge to edge..." --prop align=both
```

**Features:** `align` (left/center/right/both/distribute/thai/mediumKashida/highKashida/lowKashida)

## Indentation

Left, right, first-line, and hanging indent — all accepting twips, cm, or in.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Left indent 1cm" --prop indent=1cm
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Right indent 2cm..." --prop rightIndent=2cm
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=First-line indent — only the first line is pushed in." \
  --prop firstLineIndent=1cm
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Hanging indent — first line hangs left." \
  --prop indent=1cm --prop hangingIndent=1cm
```

**Features:** `indent` (left indent; twips, cm, in, pt), `rightIndent`, `firstLineIndent` (positive → indent first line extra), `hangingIndent` (positive → all-but-first lines indented; combine with `indent` of equal value)

## Spacing

Space before/after in points, and line spacing as a multiplier or fixed value.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Space before 18pt, after 6pt" \
  --prop spaceBefore=18pt --prop spaceAfter=6pt
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Line spacing 1.5x across a longer paragraph..." \
  --prop lineSpacing=1.5x
```

**Features:** `spaceBefore` (space above; accepts `18pt`, `0.5cm`, `360` twips), `spaceAfter`, `lineSpacing` (1.5x/150%/18pt/bare number; normalised via `SpacingConverter`)

## Pagination Flags

Control how Word breaks pages around this paragraph.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=keepNext — stays with the following paragraph" \
  --prop keepNext=true
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=keepLines — lines stay together, never split across pages" \
  --prop keepLines=true
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=widowControl on" --prop widowControl=true
```

**Features:** `keepNext` (force this paragraph and the next onto the same page), `keepLines` (prevent page break within the paragraph), `widowControl` (prevent single-line orphans/widows)

## Paragraph-Level Run Formatting

Properties set at the paragraph level apply to **every run** in the paragraph (equivalent to selecting all and formatting).

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Whole paragraph bold + red + 13pt" \
  --prop bold=true --prop color=C00000 --prop size=13
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Whole paragraph italic + highlighted" \
  --prop italic=true --prop highlight=yellow
```

**Features:** `bold`, `italic`, `color`, `size`, `highlight` — when set on `--type paragraph` these become paragraph-level run defaults (`w:pPr/w:rPr`), not inline run properties.

## Shading

Paragraph background fill color, with optional pattern.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Light gray paragraph shading" --prop shading.fill=D9D9D9
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Pale blue shading" --prop shading.fill=DDEBF7
```

**Features:** `shading.fill` (solid fill hex color; writer defaults `w:shd/@val` to `clear`), `shd` (shorthand alias for `shading.fill`), `shading.val` (pattern type: pct15/pct25/pct50/…), `shading.color` (pattern foreground color)

## Paragraph-Mark Formatting (markRPr)

The paragraph mark (¶ pilcrow) has its own run properties, distinct from the paragraph's run defaults. This controls what formatting a newly typed run at the end of the paragraph inherits.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=The mark glyph is bold+red (distinct from run text)" \
  --prop markRPr.bold=true --prop markRPr.color=C00000

# Full markRPr set
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=mark: italic/strike/underline/size/highlight/fonts" \
  --prop markRPr.italic=true --prop markRPr.strike=true \
  --prop markRPr.underline=single --prop markRPr.size=14pt \
  --prop markRPr.highlight=yellow \
  --prop markRPr.font.latin=Georgia \
  --prop markRPr.font.ea=SimSun --prop markRPr.font.cs=Arial
```

**Features:** `markRPr.bold`, `markRPr.italic`, `markRPr.strike`, `markRPr.underline`, `markRPr.size`, `markRPr.color`, `markRPr.highlight`, `markRPr.font.latin`, `markRPr.font.ea`, `markRPr.font.cs`

> Setting `bold=true` on a paragraph makes every run bold. Setting `markRPr.bold=true` formats only the ¶ mark — they are independent and both settable/gettable.

## Outline Level

Assign a paragraph to the document outline (affects navigation pane, table of contents, heading styles).

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Outline level 1 (shows in document map)" --prop outlineLvl=1
```

**Features:** `outlineLvl` (0–8; 0 = body text, 1–8 = heading levels; 9 = no outline level)

## Paragraph Strike & Underline

Strike-through and underline can also be applied at the paragraph level (to all runs).

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Whole paragraph struck out" --prop strike=true
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Underlined paragraph (red wave)" \
  --prop underline=wave --prop underline.color=#FF0000
```

**Features:** `strike` (paragraph-level single strikethrough), `underline` (paragraph-level underline style), `underline.color` (accepts leading `#` — stripped before storage)

## Complex-Script (cs) Properties

Separate formatting for complex-script (bidirectional, Arabic, Hebrew) glyph runs.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=cs bold/italic/14pt + RTL" \
  --prop bold.cs=true --prop italic.cs=true \
  --prop size.cs=14pt --prop direction=rtl
```

**Features:** `bold.cs`, `italic.cs`, `size.cs` (complex-script weight/style/size), `direction` (rtl sets `w:bidi` on the paragraph)

## Spacing & Pagination Extras

Additional spacing and pagination controls beyond the basic set.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=contextualSpacing (collapse between same-style paras)" \
  --prop contextualSpacing=true
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=lineSpacing 14pt, lineRule=atLeast" \
  --prop lineSpacing=14pt --prop lineRule=atLeast
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=pageBreakBefore" --prop pageBreakBefore=true
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=wordWrap off (break long URLs anywhere)" --prop wordWrap=false
```

**Features:** `contextualSpacing` (suppress space-before/after between paragraphs of the same style), `lineRule` (atLeast/exactly/auto), `pageBreakBefore` (force a page break before this paragraph), `wordWrap` (false = break at any character, not just word boundaries)

## Chars-Based Indent

CJK-friendly indentation in 1/100-character units (avoids relying on absolute twip values).

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=first-line 200 chars, hanging 100 chars" \
  --prop firstLineChars=200 --prop hangingChars=100
```

**Features:** `firstLineChars` (first-line indent in 1/100-char units; 200 = 2 characters), `hangingChars`

## Fonts (Explicit & Theme)

Per-script font families and theme font slots.

```bash
# Shorthand — sets all scripts
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=font shorthand Times New Roman" \
  --prop font="Times New Roman"

# Explicit per-script
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=per-script latin/ea/cs" \
  --prop font.latin=Calibri --prop font.ea=SimSun --prop font.cs=Arial

# Theme references
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=theme fonts" \
  --prop font.asciiTheme=minorHAnsi --prop font.hAnsiTheme=minorHAnsi \
  --prop font.eaTheme=minorEastAsia --prop font.csTheme=minorBidi
```

**Features:** `font` (all-scripts shorthand), `font.latin`, `font.ea`, `font.cs`, `font.asciiTheme` (majorHAnsi/minorHAnsi), `font.hAnsiTheme`, `font.eaTheme`, `font.csTheme`

## Styles

Apply a named paragraph style or a character style to all runs.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Paragraph style Heading1" --prop style=Heading1
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Character style on the run" --prop rStyle=Emphasis
```

**Features:** `style` (paragraph style ID; e.g. `Heading1`, `Normal`, `ListBullet`), `rStyle` (character style ID applied to the paragraph's default run properties)

## Shading Variants

Different ways to express paragraph background shading.

```bash
# Shorthand alias
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=shd shorthand (yellow)" --prop shd=FFFF00

# Decomposed: pattern + fill color + pattern foreground color
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=pct15 pattern, blue fill, red pattern color" \
  --prop shading.val=pct15 --prop shading.fill=DDEBF7 --prop shading.color=C00000
```

**Features:** `shd` (shorthand alias for `shading.fill`), `shading.val` (pattern: clear/pct5/pct10/pct15/pct25/pct50/solid/…), `shading.fill` (fill color hex), `shading.color` (pattern foreground hex)

## Tab Stops

Declare tab stop positions in twips.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Tabs at 720 and 1440 twips" --prop tabs=720,1440
```

**Features:** `tabs` (comma-separated list of tab positions in twips; 720 = 0.5in, 1440 = 1in)

## Text Frame (framePr)

A framed paragraph floats in its own positioned box, with body text optionally wrapping around it. Dimensions use twips.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Framed paragraph — floats in a 3-inch box with text wrapping." \
  --prop framePr.w=4320 --prop framePr.h=720 --prop framePr.wrap=around \
  --prop framePr.hAnchor=margin --prop framePr.vAnchor=text \
  --prop framePr.hSpace=180 --prop framePr.vSpace=180
```

**Features:** `framePr.w` (frame width in twips; 4320 = 3in), `framePr.h` (height), `framePr.wrap` (around/notBeside/none/tight/through), `framePr.hAnchor` (margin/page/text), `framePr.vAnchor`, `framePr.hSpace` (horizontal clearance), `framePr.vSpace`

## Paragraph Borders (pBdr)

Whole-box shorthand (`border=`) sets all four sides at once, accepting `style`, `style;size;color`, or `style;size;color;space`. Per-side keys (`border.top`, `border.bottom`, `border.left`, `border.right`) take the same value and can be mixed for a partial box (e.g. a rule above and below only).

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Box border, all sides (single)" --prop border=single
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Red 1pt box (style;size;color)" \
  --prop "border=single;8;FF0000"
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Per-side: top + bottom only (rule above and below)" \
  --prop "border.top=single;8;0070C0" --prop "border.bottom=single;8;0070C0"
```

**Features:** `border` (whole-box paragraph border; format `style` or `style;size;color` or `style;size;color;space`; style values: single/double/thick/dotted/dashed/dotDash/…), `border.top`/`border.bottom`/`border.left`/`border.right` (per-side, same value format)

## Vertical Text Alignment

Control how glyphs align vertically within the line box (distinct from cell vertical alignment).

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=textAlignment=center (glyphs centered on the line box)" \
  --prop textAlignment=center
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=textAlignment=top" --prop textAlignment=top
```

**Features:** `textAlignment` (top/center/baseline/bottom/auto)

## EastAsian Typography

CJK line-breaking and spacing rules.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=kinsoku off — permit breaks at forbidden CJK chars" \
  --prop kinsoku=false
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=autoSpace off — no auto gap between CJK and Latin/digits" \
  --prop autoSpaceDE=false --prop autoSpaceDN=false
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=overflowPunct + topLinePunct on" \
  --prop overflowPunct=true --prop topLinePunct=true
```

**Features:** `kinsoku` (Japanese line-break constraint; false = allow breaks at forbidden positions), `autoSpaceDE` (auto spacing between CJK and Latin), `autoSpaceDN` (auto spacing between CJK and digits), `overflowPunct` (allow punctuation to hang outside margin), `topLinePunct` (compress leading punctuation to top of line)

## Line & Indent Flags

Miscellaneous line-number, hyphenation, and indent behaviour toggles.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=suppressLineNumbers + suppressAutoHyphens" \
  --prop suppressLineNumbers=true --prop suppressAutoHyphens=true
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=mirrorIndents on, adjustRightInd off, snapToGrid off" \
  --prop mirrorIndents=true --prop adjustRightInd=false --prop snapToGrid=false
```

**Features:** `suppressLineNumbers` (exclude from line number count), `suppressAutoHyphens` (disable hyphenation), `mirrorIndents` (swap left/right indent on alternate pages for book layout), `adjustRightInd` (auto-adjust right indent for document grid), `snapToGrid` (snap paragraph to the document character grid)

## Web / Textbox Hints

Layout hints for web view and textbox flow.

```bash
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=divId (web division id) + textboxTightWrap=allLines" \
  --prop divId=123456 --prop textboxTightWrap=allLines
```

**Features:** `divId` (integer web-division ID for HTML round-trip), `textboxTightWrap` (none/allLines/firstAndLastLine/firstLineOnly/lastLineOnly)

## List Numbering

Attach a paragraph to a list via a high-level style shorthand or direct numPr references.

```bash
# High-level shorthand
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Bulleted item" --prop listStyle=bullet
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Ordered item starting at 5" \
  --prop listStyle=ordered --prop start=5

# Direct numPr reference
officecli add paragraph-formatting.docx /body --type paragraph \
  --prop "text=Explicit numId=1 level 0" --prop numId=1 --prop numLevel=0
```

**Features:** `listStyle` (bullet/ordered — creates or reuses a numbering definition automatically), `start` (override starting counter for this instance), `numId` (direct reference to a `w:num` element by id), `numLevel` (alias: `ilvl`; 0-based indent level)

## Complete Feature Coverage

| Feature | Section |
|---------|---------|
| `align` (left/center/right/both) | Alignment |
| `indent`, `rightIndent`, `firstLineIndent`, `hangingIndent` | Indentation |
| `spaceBefore`, `spaceAfter`, `lineSpacing` | Spacing |
| `keepNext`, `keepLines`, `widowControl` | Pagination Flags |
| `bold`, `italic`, `color`, `size`, `highlight` (paragraph-level) | Paragraph-Level Run Formatting |
| `shading.fill`, `shd` | Shading |
| `markRPr.*` (full set) | Paragraph-Mark Formatting |
| `outlineLvl` | Outline Level |
| `strike`, `underline`, `underline.color` (paragraph-level) | Paragraph Strike & Underline |
| `bold.cs`, `italic.cs`, `size.cs`, `direction` | Complex-Script |
| `contextualSpacing`, `lineRule`, `pageBreakBefore`, `wordWrap` | Spacing & Pagination Extras |
| `firstLineChars`, `hangingChars` | Chars-Based Indent |
| `font`, `font.latin/ea/cs`, theme fonts | Fonts |
| `style`, `rStyle` | Styles |
| `shading.val`, `shading.fill`, `shading.color` | Shading Variants |
| `tabs` | Tab Stops |
| `framePr.*` (w/h/wrap/hAnchor/vAnchor/hSpace/vSpace) | Text Frame |
| `border` (whole-box pBdr) | Paragraph Borders |
| `textAlignment` | Vertical Text Alignment |
| `kinsoku`, `autoSpaceDE`, `autoSpaceDN`, `overflowPunct`, `topLinePunct` | EastAsian Typography |
| `suppressLineNumbers`, `suppressAutoHyphens`, `mirrorIndents`, `adjustRightInd`, `snapToGrid` | Line & Indent Flags |
| `divId`, `textboxTightWrap` | Web / Textbox Hints |
| `listStyle`, `start`, `numId`, `numLevel` | List Numbering |

## Inspect the Generated File

```bash
# List every paragraph path
officecli query paragraph-formatting.docx paragraph

# Inspect a paragraph's full property set
officecli get paragraph-formatting.docx "/body/p[5]"

# Check the paragraph-mark formatting of a specific paragraph
officecli get paragraph-formatting.docx "/body/p[20]"

# Find all paragraphs with a shading fill set
officecli query paragraph-formatting.docx paragraph --find shading.fill
```
