{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/programmes-net/json-schema/programmes-net-text-cleanup-clean-schema.json",
  "title": "text-cleanup.clean",
  "description": "Apply clean-ups and return the text plus counts of every change.",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/programmes-net-openapi.json#/components/schemas/text-cleanup.clean",
  "type": "object",
  "properties": {
    "operation": {
      "const": "clean"
    },
    "input": {
      "type": "string",
      "description": "The text to clean.",
      "maxLength": 32768
    },
    "options": {
      "type": "object",
      "properties": {
        "lineEndings": {
          "type": "string",
          "description": "Line-ending style.",
          "enum": [
            "lf",
            "crlf",
            "cr",
            "keep"
          ],
          "default": "lf"
        },
        "normalize": {
          "type": "string",
          "description": "Unicode normalisation form.",
          "enum": [
            "NFC",
            "NFD",
            "NFKC",
            "NFKD",
            "none"
          ],
          "default": "NFC"
        },
        "smartQuotes": {
          "type": "boolean",
          "description": "Curly quotes → straight.",
          "default": true
        },
        "dashes": {
          "type": "boolean",
          "description": "En/em dashes → - / --.",
          "default": false
        },
        "trimTrailing": {
          "type": "boolean",
          "description": "Trim trailing whitespace.",
          "default": true
        },
        "tabs": {
          "type": "string",
          "description": "Convert tabs and spaces.",
          "enum": [
            "keep",
            "to-spaces",
            "to-tabs"
          ],
          "default": "keep"
        },
        "tabWidth": {
          "type": "integer",
          "description": "Tab stop width.",
          "minimum": 1,
          "maximum": 8,
          "default": 4
        },
        "keepEmoji": {
          "type": "boolean",
          "description": "Keep joiners inside emoji and non-Latin scripts.",
          "default": true
        }
      }
    }
  },
  "required": [
    "operation"
  ]
}