{
  "schema": "leumas.docs.page/1",
  "id": "adapter:domain/a-text",
  "slug": "adapters/domain/a-text",
  "kind": "capabilities",
  "bucket": "package",
  "title": "a-text (adapter system)",
  "name": "a-text",
  "eyebrow": "adapter system",
  "chip": null,
  "summary": "Text/string capability pack: 80 pure string utilities — case conversion, base64, digests (MD5/SHA-1/SHA-256/SHA-512/HMAC/CRC-32), classical ciphers (Caesar/ROT13/Vigenère/Atbash/Morse), extraction...",
  "keywords": [
    "a-text",
    "crc-32",
    "atbash",
    "morse",
    "camel",
    "a text api",
    "leumas a text",
    "pascal"
  ],
  "audience": "both",
  "funnel": {
    "product": null,
    "cta": null
  },
  "body": "# a-text (adapter system)\n\nText/string **capability pack**. Ported from `leumas-middleware/lib/a.text` — the pure core: 80\nstring utilities (69 migrated + 11 added digests/ciphers). Stripped: express `server.mjs`,\n`frontend/`, `scripts/`, `queue.csv`, and the 750-line `hieroglyphics` novelty adapter (glyph\ncipher) which is out of scope for a lightweight port.\n\nEach source utility (`module.exports = (text, options) => …` or `export const commit = …`) is folded\ninto `index.js` as a named function; `adapters[<name>] = (args) => fn(primaryInput, args)` where the\nprimary input is resolved from `args.text ?? args.input ?? args.value ?? args.string ?? args`.\n\nSource note: the port fixes one genuine bug — `UnescapeHTML` had an invalid string literal\n(`.replace(/&#039;/g, ''')`) corrected to replace with a proper apostrophe.\n\n## Tools (`adapters`)\n\n80 utilities, e.g.:\n\n| tool | args | result |\n|------|------|--------|\n| `uppercase` / `lowercase` | `{ text }` | cased string |\n| `Base64Encode` / `Base64Decode` | `{ text }` | encoded/decoded string |\n| `MD5Hash` / `SHA1Hash` / `SHA256Hash` / `SHA512Hash` | `{ text }` | hex digest (uses `node:crypto`) |\n| `HMAC` | `{ text, key, algorithm? }` | hex HMAC (default `sha256`; throws without `key`) |\n| `CRC32` | `{ text, output? }` | CRC-32 as hex (default) or `uint` |\n| `SnakeCase` / `KebabCase` / `CamelCase` / `PascalCase` / `TitleCase` | `{ text }` | recased string |\n| `ExtractEmails` / `ExtractURLs` / `ExtractHashtags` / `ExtractMentions` | `{ text }` | array of matches |\n| `Truncate` | `{ text, length }` | truncated string |\n| `countWords` / `CountCharacters` | `{ text }` | count |\n| `redactSensitiveInfo` / `readabilityScore` / `StemWords` / `RemoveStopWords` | `{ text }` | processed text |\n\n### Classical ciphers\n\n| tool | args | result |\n|------|------|--------|\n| `CaesarCipher` | `{ text, shift? }` | letters shifted by `shift` (default 3), case/non-letters preserved |\n| `Rot13` | `{ text }` | Caesar shift 13 |\n| `VigenereEncode` / `VigenereDecode` | `{ text, key }` | keyword cipher over letters (throws without `key`) |\n| `Atbash` | `{ text }` | mirrored alphabet (a<->z) |\n| `MorseEncode` / `MorseDecode` | `{ text }` | Morse code (` ` between letters, ` / ` between words) |\n\nOthers: capitalizeFirstLetter, codePointAt, concat, correctTypos, endsWith, EscapeHTML, FindAndReplace,\nfromCharCode, fromCodePoint, includes, indexOf, joinLines, JSONParse, JSONStringify, lastIndexOf,\nlength, LevenshteinDistance, localeCompare, normalize, pad/padEnd/padStart, RemoveDuplicates/Emojis/\nNumbers/Punctuation/Whitespace, removeNonAlphanumeric, repeat, replace, reverse, reverseWords,\nShuffleWords, slice, SortLines, splitLines, splitWords, startsWith, StripHTML, substr, substring,\nSwapCase, toNumber, trim/trimEnd/trimStart, UnescapeHTML.\n\nNon-string inputs pass through unchanged (source behavior preserved).\n",
  "source": {
    "path": "shared/engines/adapters/domain/a-text/README.md",
    "blobSha": "",
    "commit": "",
    "committedAt": "",
    "provenance": "no-git",
    "bytes": 3067,
    "hash": "f0d106b48d5d3dc198727e27467402042e3cf085"
  },
  "urls": {
    "html": "/p/adapters/domain/a-text",
    "json": "/docs/adapters/domain/a-text.json",
    "md": "/docs/adapters/domain/a-text.md"
  },
  "links": {
    "composes": [],
    "usedBy": [],
    "product": [],
    "howTo": [],
    "skills": []
  }
}
