{
  "version": 1,
  "updated": "2026-09-11",
  "license": "CC0-1.0",
  "description": "Synthetic Textidy transformation examples. Expected rich-text output is the plain-text alternative; expectedError means conversion must stop. Options override tool defaults.",
  "cases": [
    {
      "id": "ai-natural-prose",
      "tool": "ai-text-cleaner",
      "title": "Chat framing and numbered steps",
      "input": "Sure!\n\n## Update\n\n- The draft is ready.\n- The references are attached.\n\n1. Review the draft.\n2. Approve the release.\n\nI hope this helps!",
      "expected": "Update\n\nThe draft is ready.\n\nThe references are attached.\n\n1. Review the draft.\n2. Approve the release.",
      "options": {
        "naturalLists": true,
        "removeChatFraming": true
      },
      "note": "Natural prose removes recognised boundary chat paragraphs and simple bullet markers. Numbered steps retain their order."
    },
    {
      "id": "ai-protected-code",
      "tool": "ai-text-cleaner",
      "title": "Punctuation with protected code",
      "input": "A useful change—when reviewed.\n\n`a—b`\n\n> A quoted—phrase",
      "expected": "A useful change, when reviewed.\n\na—b\n\nA quoted—phrase",
      "options": {
        "softenDashes": true
      },
      "note": "Em-dash replacement is opt-in. Code and blockquote punctuation remain; Markdown markers are removed. Review whether each comma fits the sentence."
    },
    {
      "id": "pdf-paragraphs",
      "tool": "remove-line-breaks",
      "title": "Wrapped PDF paragraphs",
      "input": "A paragraph copied from a PDF\ncan wrap at every printed line.\n\nKeep the next paragraph\nseparate from the first.",
      "expected": "A paragraph copied from a PDF can wrap at every printed line.\n\nKeep the next paragraph separate from the first.",
      "note": "Blank lines preserve paragraph boundaries. Missing paragraph boundaries cannot be inferred reliably."
    },
    {
      "id": "pdf-hyphenation",
      "tool": "remove-line-breaks",
      "title": "Optional hyphen repair",
      "input": "A docu-\nment contains a well-\nknown example.",
      "expected": "A document contains a wellknown example.",
      "options": {
        "dehyphenate": true
      },
      "note": "This is an intentional counterexample: document is repaired but well-known loses a meaningful hyphen. Review joined words; the option is off by default."
    },
    {
      "id": "pdf-address",
      "tool": "remove-line-breaks",
      "title": "An address is not a paragraph",
      "input": "Alex Example\n12 Sample Street\nSydney",
      "expected": "Alex Example 12 Sample Street Sydney",
      "note": "An address or poem can need every line break. Default line joining cannot identify this intent; keep the original or edit only prose excerpts."
    },
    {
      "id": "table-separator",
      "tool": "markdown-table-formatter",
      "title": "Restore a missing separator",
      "input": "| Name|Count |\n| A|2|",
      "expected": "| Name | Count |\n| ---- | ----- |\n| A    | 2     |",
      "note": "The first row is the header. A missing separator and uneven spacing are repaired without adding cell values."
    },
    {
      "id": "table-extra-cell",
      "tool": "markdown-table-formatter",
      "title": "Extra data must not disappear",
      "input": "| Name | Count |\n| A | 2 | extra |",
      "expectedError": true,
      "note": "Three data cells under two headings stop conversion. Correct the source; extra cells are never discarded."
    },
    {
      "id": "table-code-pipe",
      "tool": "markdown-table-formatter",
      "title": "A pipe inside code",
      "input": "| Value |\n| `a|b` |",
      "expected": "| Value  |\n| ------ |\n| `a\\|b` |",
      "note": "A pipe inside a complete code span is escaped for a GFM table. An unescaped pipe in ordinary text is still a cell boundary."
    },
    {
      "id": "markdown-references",
      "tool": "remove-markdown",
      "title": "Links and code survive",
      "input": "## Notes\n\nRead [the source](https://example.com/source).\n\nKeep `user_id` unchanged.",
      "expected": "Notes\n\nRead the source (https://example.com/source).\n\nKeep user_id unchanged.",
      "note": "Default plain-text conversion keeps link destinations and code contents. It does not validate the source."
    },
    {
      "id": "rich-clipboard",
      "tool": "markdown-to-rich-text",
      "title": "Headings, links and a table",
      "input": "# Textidy paste test\n\nA **bold** note with [a reference](https://example.com).\n\n1. Review\n2. Publish\n\n| Name | Count |\n| --- | --- |\n| A | 2 |",
      "expected": "Textidy paste test\n\nA bold note with a reference (https://example.com).\n\n1. Review\n2. Publish\n\nName\tCount\nA\t2",
      "note": "The shown expected output is the plain-text clipboard alternative. Formatted copying additionally supplies HTML headings, emphasis, links, numbering and a table. Destination appearance must be checked."
    },
    {
      "id": "unicode-spaces",
      "tool": "invisible-character-remover",
      "title": "Hidden space versus non-breaking space",
      "input": "hidden​space and keep together",
      "expected": "hiddenspace and keep together",
      "selected": [
        8203,
        160
      ],
      "note": "Select U+200B to remove zero-width spaces and U+00A0 to replace non-breaking spaces with ordinary spaces. Removal can join words."
    },
    {
      "id": "unicode-emoji",
      "tool": "invisible-character-remover",
      "title": "Keep emoji joiners",
      "input": "Developer: 👩‍💻",
      "expected": "Developer: 👩‍💻",
      "selected": [
        8205
      ],
      "note": "U+200D joins parts of the emoji. It is protected even if requested for removal."
    }
  ]
}