{"id":13468443,"url":"https://github.com/dhondta/python-codext","last_synced_at":"2025-05-15T13:06:41.423Z","repository":{"id":39257831,"uuid":"236679865","full_name":"dhondta/python-codext","owner":"dhondta","description":"Python codecs extension featuring CLI tools for encoding/decoding anything","archived":false,"fork":false,"pushed_at":"2025-01-06T23:11:04.000Z","size":5060,"stargazers_count":282,"open_issues_count":0,"forks_count":25,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-04-15T02:11:20.267Z","etag":null,"topics":["alphabet","base","base36","base45","base58","base62","braille","cli-tools","codecs","cryptography","cryptography-tools","ctf","ctf-tools","decode-strings","decoder","encoder-decoder","encoding","encodings","infosec","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dhondta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-01-28T07:24:23.000Z","updated_at":"2025-03-29T18:29:32.000Z","dependencies_parsed_at":"2024-01-03T08:26:07.167Z","dependency_job_id":"f5930fcb-eb92-4b6d-b8a9-a6ce658f2b2b","html_url":"https://github.com/dhondta/python-codext","commit_stats":{"total_commits":299,"total_committers":4,"mean_commits":74.75,"dds":0.03678929765886285,"last_synced_commit":"8a902fa6aa1768e33c649d51633703087e486e39"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhondta%2Fpython-codext","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhondta%2Fpython-codext/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhondta%2Fpython-codext/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhondta%2Fpython-codext/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dhondta","download_url":"https://codeload.github.com/dhondta/python-codext/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254346624,"owners_count":22055808,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alphabet","base","base36","base45","base58","base62","braille","cli-tools","codecs","cryptography","cryptography-tools","ctf","ctf-tools","decode-strings","decoder","encoder-decoder","encoding","encodings","infosec","python"],"created_at":"2024-07-31T15:01:10.881Z","updated_at":"2025-05-15T13:06:36.412Z","avatar_url":"https://github.com/dhondta.png","language":"Python","readme":"\u003cp align=\"center\"\u003e\u003cimg src=\"https://github.com/dhondta/python-codext/raw/main/docs/pages/img/logo.png\"\u003e\u003c/p\u003e\n\u003ch1 align=\"center\"\u003eCodExt \u003ca href=\"https://twitter.com/intent/tweet?text=CodExt%20-%20Encoding%2Fdecoding%20anything.%0D%0APython%20library%20extending%20the%20native%20codecs%20library%20with%20many%20new%20encodings%20and%20providing%20CLI%20tools%20with%20a%20guess%20feature%20based%20on%20AI.%0D%0Ahttps%3a%2f%2fgithub%2ecom%2fdhondta%2fpython-codext%0D%0A\u0026hashtags=python,programming,encodings,codecs,cryptography,morse,base,ctftools\"\u003e\u003cimg src=\"https://img.shields.io/badge/Tweet--lightgrey?logo=twitter\u0026style=social\" alt=\"Tweet\" height=\"20\"/\u003e\u003c/a\u003e\u003c/h1\u003e\n\u003ch3 align=\"center\"\u003eEncode/decode anything.\u003c/h3\u003e\n\n[![PyPi](https://img.shields.io/pypi/v/codext.svg)](https://pypi.python.org/pypi/codext/)\n[![Read The Docs](https://readthedocs.org/projects/python-codext/badge/?version=latest)](https://python-codext.readthedocs.io/en/latest/?badge=latest)\n[![Build Status](https://github.com/dhondta/python-codext/actions/workflows/python-package.yml/badge.svg)](https://github.com/dhondta/python-codext/actions/workflows/python-package.yml)\n[![Coverage Status](https://raw.githubusercontent.com/dhondta/python-codext/main/docs/coverage.svg)](#)\n[![Python Versions](https://img.shields.io/pypi/pyversions/codext.svg)](https://pypi.python.org/pypi/codext/)\n[![Known Vulnerabilities](https://snyk.io/test/github/dhondta/python-codext/badge.svg?targetFile=requirements.txt)](https://snyk.io/test/github/dhondta/python-codext?targetFile=requirements.txt)\n[![DOI](https://zenodo.org/badge/236679865.svg)](https://zenodo.org/badge/latestdoi/236679865)\n[![License](https://img.shields.io/pypi/l/codext.svg)](https://pypi.python.org/pypi/codext/)\n\n[**CodExt**](https://github.com/dhondta/python-codext) is a (Python2-3 compatible) library that extends the native [`codecs`](https://docs.python.org/3/library/codecs.html) library (namely for adding new custom encodings and character mappings) and provides **120+ new codecs**, hence its name combining *CODecs EXTension*. It also features a **guess mode** for decoding multiple layers of encoding and **CLI tools** for convenience.\n\n```sh\n$ pip install codext\n```\n\nWant to contribute a new codec ?    |     Want to contribute a new macro ?\n:----------------------------------:|:------------------------------------:\nCheck the [documentation](https://python-codext.readthedocs.io/en/latest/howto.html) first\u003cbr\u003eThen [PR](https://github.com/dhondta/python-codext/pulls) your new codec | [PR](https://github.com/dhondta/python-codext/pulls) your updated version of [`macros.json`](https://github.com/dhondta/python-codext/blob/main/codext/macros.json)\n\n## :mag: Demonstrations\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/dhondta/python-codext/main/docs/pages/demos/using-codext.gif\" alt=\"Using CodExt from the command line\"\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/dhondta/python-codext/main/docs/pages/demos/using-bases.gif\" alt=\"Using base tools from the command line\"\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/dhondta/python-codext/main/docs/pages/demos/using-unbase.gif\" alt=\"Using the unbase command line tool\"\u003e\u003c/p\u003e\n\n## :computer: Usage (main CLI tool) \u003ca href=\"https://twitter.com/intent/tweet?text=CodExt%20-%20Encode%2Fdecode%20anything.%0D%0APython%20tool%20for%20encoding%20and%20decoding%20almost%20anything,%20including%20a%20guess%20feature%20based%20on%20AI.%0D%0Ahttps%3a%2f%2fgithub%2ecom%2fdhondta%2fpython-codext%0D%0A\u0026hashtags=python,encodings,codecs,cryptography,morse,base,stegano,steganography,ctftools\"\u003e\u003cimg src=\"https://img.shields.io/badge/Tweet%20(codext)--lightgrey?logo=twitter\u0026style=social\" alt=\"Tweet on codext\" height=\"20\"/\u003e\u003c/a\u003e\n\n```session\n$ codext -i test.txt encode dna-1\nGTGAGCGGGTATGTGA\n\n$ echo -en \"test\" | codext encode morse\n- . ... -\n\n$ echo -en \"test\" | codext encode braille\n⠞⠑⠎⠞\n\n$ echo -en \"test\" | codext encode base100\n👫👜👪👫\n```\n\n### Chaining codecs\n\n```sh\n$ echo -en \"Test string\" | codext encode reverse\ngnirts tseT\n\n$ echo -en \"Test string\" | codext encode reverse morse\n--. -. .. .-. - ... / - ... . -\n\n$ echo -en \"Test string\" | codext encode reverse morse dna-2\nAGTCAGTCAGTGAGAAAGTCAGTGAGAAAGTGAGTGAGAAAGTGAGTCAGTGAGAAAGTCAGAAAGTGAGTGAGTGAGAAAGTTAGAAAGTCAGAAAGTGAGTGAGTGAGAAAGTGAGAAAGTC\n\n$ echo -en \"Test string\" | codext encode reverse morse dna-2 octal\n101107124103101107124103101107124107101107101101101107124103101107124107101107101101101107124107101107124107101107101101101107124107101107124103101107124107101107101101101107124103101107101101101107124107101107124107101107124107101107101101101107124124101107101101101107124103101107101101101107124107101107124107101107124107101107101101101107124107101107101101101107124103\n\n$ echo -en \"AGTCAGTCAGTGAGAAAGTCAGTGAGAAAGTGAGTGAGAAAGTGAGTCAGTGAGAAAGTCAGAAAGTGAGTGAGTGAGAAAGTTAGAAAGTCAGAAAGTGAGTGAGTGAGAAAGTGAGAAAGTC\" | codext -d dna-2 morse reverse\ntest string\n```\n\n### Using macros\n\n```sh\n$ codext add-macro my-encoding-chain gzip base63 lzma base64\n\n$ codext list macros\nexample-macro, my-encoding-chain\n\n$ echo -en \"Test string\" | codext encode my-encoding-chain\nCQQFAF0AAIAAABuTgySPa7WaZC5Sunt6FS0ko71BdrYE8zHqg91qaqadZIR2LafUzpeYDBalvE///ug4AA==\n\n$ codext remove-macro my-encoding-chain\n\n$ codext list macros\nexample-macro\n```\n\n## :computer: Usage (base CLI tool) \u003ca href=\"https://twitter.com/intent/tweet?text=UnBase%20-%20Decode%20any%20multi-layer%20base-encoded%20string.%0D%0APython%20tool%20for%20decoding%20any%20base-encoded%20string,%20even%20when%20encoded%20with%20multiple%20layers.%0D%0Ahttps%3a%2f%2fgithub%2ecom%2fdhondta%2fpython-codext%0D%0A\u0026hashtags=python,base,encodings,codecs,cryptography,stegano,steganography,ctftools\"\u003e\u003cimg src=\"https://img.shields.io/badge/Tweet%20(unbase)--lightgrey?logo=twitter\u0026style=social\" alt=\"Tweet on unbase\" height=\"20\"/\u003e\u003c/a\u003e\n\n```session\n$ echo \"Test string !\" | base122\n*.7!ft9�-f9Â\n\n$ echo \"Test string !\" | base91 \n\"ONK;WDZM%Z%xE7L\n\n$ echo \"Test string !\" | base91 | base85\nB2P|BJ6A+nO(j|-cttl%\n\n$ echo \"Test string !\" | base91 | base85 | base36 | base58-flickr\nQVx5tvgjvCAkXaMSuKoQmCnjeCV1YyyR3WErUUErFf\n\n$ echo \"Test string !\" | base91 | base85 | base36 | base58-flickr | base58-flickr -d | base36 -d | base85 -d | base91 -d\nTest string !\n```\n\n```session\n$ echo \"Test string !\" | base91 | base85 | base36 | base58-flickr | unbase -m 3\nTest string !\n\n$ echo \"Test string !\" | base91 | base85 | base36 | base58-flickr | unbase -f Test\nTest string !\n```\n\n## :computer: Usage (Python)\n\nGetting the list of available codecs:\n\n```python\n\u003e\u003e\u003e import codext\n\n\u003e\u003e\u003e codext.list()\n['ascii85', 'base85', 'base100', 'base122', ..., 'tomtom', 'dna', 'html', 'markdown', 'url', 'resistor', 'sms', 'whitespace', 'whitespace-after-before']\n\n\u003e\u003e\u003e codext.encode(\"this is a test\", \"base58-bitcoin\")\n'jo91waLQA1NNeBmZKUF'\n\n\u003e\u003e\u003e codext.encode(\"this is a test\", \"base58-ripple\")\n'jo9rA2LQwr44eBmZK7E'\n\n\u003e\u003e\u003e codext.encode(\"this is a test\", \"base58-url\")\n'JN91Wzkpa1nnDbLyjtf'\n\n\u003e\u003e\u003e codecs.encode(\"this is a test\", \"base100\")\n'👫👟👠👪🐗👠👪🐗👘🐗👫👜👪👫'\n\n\u003e\u003e\u003e codecs.decode(\"👫👟👠👪🐗👠👪🐗👘🐗👫👜👪👫\", \"base100\")\n'this is a test'\n\n\u003e\u003e\u003e for i in range(8):\n        print(codext.encode(\"this is a test\", \"dna-%d\" % (i + 1)))\nGTGAGCCAGCCGGTATACAAGCCGGTATACAAGCAGACAAGTGAGCGGGTATGTGA\nCTCACGGACGGCCTATAGAACGGCCTATAGAACGACAGAACTCACGCCCTATCTCA\nACAGATTGATTAACGCGTGGATTAACGCGTGGATGAGTGGACAGATAAACGCACAG\nAGACATTCATTAAGCGCTCCATTAAGCGCTCCATCACTCCAGACATAAAGCGAGAC\nTCTGTAAGTAATTCGCGAGGTAATTCGCGAGGTAGTGAGGTCTGTATTTCGCTCTG\nTGTCTAACTAATTGCGCACCTAATTGCGCACCTACTCACCTGTCTATTTGCGTGTC\nGAGTGCCTGCCGGATATCTTGCCGGATATCTTGCTGTCTTGAGTGCGGGATAGAGT\nCACTCGGTCGGCCATATGTTCGGCCATATGTTCGTCTGTTCACTCGCCCATACACT\n\u003e\u003e\u003e codext.decode(\"GTGAGCCAGCCGGTATACAAGCCGGTATACAAGCAGACAAGTGAGCGGGTATGTGA\", \"dna-1\")\n'this is a test'\n\n\u003e\u003e\u003e codecs.encode(\"this is a test\", \"morse\")\n'- .... .. ... / .. ... / .- / - . ... -'\n\n\u003e\u003e\u003e codecs.decode(\"- .... .. ... / .. ... / .- / - . ... -\", \"morse\")\n'this is a test'\n\n\u003e\u003e\u003e with open(\"morse.txt\", 'w', encoding=\"morse\") as f:\n\tf.write(\"this is a test\")\n14\n\n\u003e\u003e\u003e with open(\"morse.txt\",encoding=\"morse\") as f:\n\tf.read()\n'this is a test'\n\n\u003e\u003e\u003e codext.decode(\"\"\"\n      =            \n              X         \n   :            \n      x         \n  n  \n    r \n        y   \n      Y            \n              y        \n     p    \n         a       \n `          \n            n            \n          |    \n  a          \no    \n       h        \n          `            \n          g               \n           o \n   z      \"\"\", \"whitespace-after+before\")\n'CSC{not_so_invisible}'\n\n\u003e\u003e\u003e print(codext.encode(\"An example test string\", \"baudot-tape\"))\n***.**\n   . *\n***.* \n*  .  \n   .* \n*  .* \n   . *\n** .* \n***.**\n** .**\n   .* \n*  .  \n* *. *\n   .* \n* *.  \n* *. *\n*  .  \n* *.  \n* *. *\n***.  \n  *.* \n***.* \n * .* \n```\n\n## :page_with_curl: List of codecs\n\n#### [BaseXX](https://python-codext.readthedocs.io/en/latest/enc/base.html)\n\n- [X] `base1`: useless, but for the sake of completeness\n- [X] `base2`: simple conversion to binary (with a variant with a reversed alphabet)\n- [X] `base3`: conversion to ternary (with a variant with a reversed alphabet)\n- [X] `base4`: conversion to quarternary (with a variant with a reversed alphabet)\n- [X] `base8`: simple conversion to octal (with a variant with a reversed alphabet)\n- [X] `base10`: simple conversion to decimal\n- [X] `base11`: conversion to digits with a \"*a*\"\n- [X] `base16`: simple conversion to hexadecimal (with a variant holding an alphabet with digits and letters inverted)\n- [X] `base26`: conversion to alphabet letters\n- [X] `base32`: classical conversion according to the RFC4648 with all its variants ([zbase32](https://philzimmermann.com/docs/human-oriented-base-32-encoding.txt), extended hexadecimal, [geohash](https://en.wikipedia.org/wiki/Geohash), [Crockford](https://www.crockford.com/base32.html))\n- [X] `base36`: [Base36](https://en.wikipedia.org/wiki/Base36) conversion to letters and digits (with a variant inverting both groups)\n- [X] `base45`: [Base45](https://datatracker.ietf.org/doc/html/draft-faltstrom-base45-04.txt) DRAFT algorithm (with a variant inverting letters and digits)\n- [X] `base58`: multiple versions of [Base58](https://en.bitcoinwiki.org/wiki/Base58) (bitcoin, flickr, ripple)\n- [X] `base62`: [Base62](https://en.wikipedia.org/wiki/Base62) conversion to lower- and uppercase letters and digits (with a variant with letters and digits inverted)\n- [X] `base63`: similar to `base62` with the \"`_`\" added\n- [X] `base64`: classical conversion according to RFC4648 with its variant URL (or *file*) (it also holds a variant with letters and digits inverted)\n- [X] `base67`: custom conversion using some more special characters (also with a variant with letters and digits inverted)\n- [X] `base85`: all variants of Base85 ([Ascii85](https://fr.wikipedia.org/wiki/Ascii85), [z85](https://rfc.zeromq.org/spec/32), [Adobe](https://dencode.com/string/ascii85), [(x)btoa](https://dencode.com/string/ascii85), [RFC1924](https://datatracker.ietf.org/doc/html/rfc1924), [XML](https://datatracker.ietf.org/doc/html/draft-kwiatkowski-base85-for-xml-00))\n- [X] `base91`: [Base91](http://base91.sourceforge.net) custom conversion\n- [X] `base100` (or *emoji*): [Base100](https://github.com/AdamNiederer/base100) custom conversion\n- [X] `base122`: [Base100](http://blog.kevinalbs.com/base122) custom conversion\n- [X] `base-genericN`: see [base encodings](https://python-codext.readthedocs.io/en/latest/enc/base.html) ; supports any possible base\n\nThis category also contains `ascii85`, `adobe`, `[x]btoa`, `zeromq` with the `base85` codec.\n\n#### [Binary](https://python-codext.readthedocs.io/en/latest/enc/binary.html)\n\n- [X] `baudot`: supports CCITT-1, CCITT-2, EU/FR, ITA1, ITA2, MTK-2 (Python3 only), UK, ...\n- [X] `baudot-spaced`: variant of `baudot` ; groups of 5 bits are whitespace-separated\n- [X] `baudot-tape`: variant of `baudot` ; outputs a string that looks like a perforated tape\n- [X] `bcd`: _Binary Coded Decimal_, encodes characters from their (zero-left-padded) ordinals\n- [X] `bcd-extended0`: variant of `bcd` ; encodes characters from their (zero-left-padded) ordinals using prefix bits `0000`\n- [X] `bcd-extended1`: variant of `bcd` ; encodes characters from their (zero-left-padded) ordinals using prefix bits `1111`\n- [X] `excess3`: uses Excess-3 (aka Stibitz code) binary encoding to convert characters from their ordinals\n- [X] `gray`: aka reflected binary code\n- [X] `manchester`: XORes each bit of the input with `01`\n- [X] `manchester-inverted`: variant of `manchester` ; XORes each bit of the input with `10`\n- [X] `rotateN`: rotates characters by the specified number of bits (*N* belongs to [1, 7] ; Python 3 only)\n\n#### [Common](https://python-codext.readthedocs.io/en/latest/enc/common.html)\n\n- [X] `a1z26`: keeps words whitespace-separated and uses a custom character separator\n- [X] `cases`: set of case-related encodings (including camel-, kebab-, lower-, pascal-, upper-, snake- and swap-case, slugify, capitalize, title)\n- [X] `dummy`: set of simple encodings (including integer, replace, reverse, word-reverse, substite and strip-spaces)\n- [X] `octal`: dummy octal conversion (converts to 3-digits groups)\n- [X] `octal-spaced`: variant of `octal` ; dummy octal conversion, handling whitespace separators\n- [X] `ordinal`: dummy character ordinals conversion (converts to 3-digits groups)\n- [X] `ordinal-spaced`: variant of `ordinal` ; dummy character ordinals conversion, handling whitespace separators\n\n#### [Compression](https://python-codext.readthedocs.io/en/latest/enc/compressions.html)\n\n- [X] `gzip`: standard Gzip compression/decompression\n- [X] `lz77`: compresses the given data with the algorithm of Lempel and Ziv of 1977\n- [X] `lz78`: compresses the given data with the algorithm of Lempel and Ziv of 1978\n- [X] `pkzip_deflate`: standard Zip-deflate compression/decompression\n- [X] `pkzip_bzip2`: standard BZip2 compression/decompression\n- [X] `pkzip_lzma`: standard LZMA compression/decompression\n\n\u003e :warning: Compression functions are of course definitely **NOT** encoding functions ; they are implemented for leveraging the `.encode(...)` API from `codecs`.\n\n#### [Cryptography](https://python-codext.readthedocs.io/en/latest/enc/crypto.html)\n\n- [X] `affine`: aka Affine Cipher\n- [X] `atbash`: aka Atbash Cipher\n- [X] `bacon`: aka Baconian Cipher\n- [X] `barbie-N`: aka Barbie Typewriter (*N* belongs to [1, 4])\n- [X] `citrix`: aka Citrix CTX1 password encoding\n- [X] `railfence`: aka Rail Fence Cipher \n- [X] `rotN`: aka Caesar cipher (*N* belongs to [1,25])\n- [X] `scytaleN`: encrypts using the number of letters on the rod (*N* belongs to [1,[)\n- [X] `shiftN`: shift ordinals (*N* belongs to [1,255])\n- [X] `xorN`: XOR with a single byte (*N* belongs to [1,255])\n\n\u003e :warning: Crypto functions are of course definitely **NOT** encoding functions ; they are implemented for leveraging the `.encode(...)` API from `codecs`.\n\n#### [Hashing](https://python-codext.readthedocs.io/en/latest/enc/hashing.html)\n\n- [X] `blake`: includes BLAKE2b and BLAKE2s (Python 3 only ; relies on `hashlib`)\n- [X] `checksums`: includes Adler32 and CRC32 (relies on `zlib`)\n- [X] `crypt`: Unix's crypt hash for passwords (Python 3 and Unix only ; relies on `crypt`)\n- [X] `md`: aka Message Digest ; includes MD4 and MD5 (relies on `hashlib`)\n- [X] `sha`: aka Secure Hash Algorithms ; includes SHA1, 224, 256, 384, 512 (Python2/3) but also SHA3-224, -256, -384 and -512 (Python 3 only ; relies on `hashlib`)\n- [X] `shake`: aka SHAKE hashing (Python 3 only ; relies on `hashlib`)\n\n\u003e :warning: Hash functions are of course definitely **NOT** encoding functions ; they are implemented for convenience with the `.encode(...)` API from `codecs` and useful for chaning codecs.\n\n#### [Languages](https://python-codext.readthedocs.io/en/latest/enc/languages.html)\n\n- [X] `braille`: well-known braille language (Python 3 only)\n- [X] `ipsum`: aka lorem ipsum\n- [X] `galactic`: aka galactic alphabet or Minecraft enchantment language (Python 3 only)\n- [X] `leetspeak`: based on minimalistic elite speaking rules\n- [X] `morse`: uses whitespace as a separator\n- [X] `navajo`: only handles letters (not full words from the Navajo dictionary)\n- [X] `radio`: aka NATO or radio phonetic alphabet\n- [X] `southpark`: converts letters to Kenny's language from Southpark (whitespace is also handled)\n- [X] `southpark-icase`: case insensitive variant of `southpark`\n- [X] `tap`: converts text to tap/knock code, commonly used by prisoners\n- [X] `tomtom`: similar to `morse`, using slashes and backslashes\n\n#### [Others](https://python-codext.readthedocs.io/en/latest/enc/others.html)\n\n- [X] `dna`: implements the 8 rules of DNA sequences (N belongs to [1,8])\n- [X] `letter-indices`: encodes consonants and/or vowels with their corresponding indices\n- [X] `markdown`: unidirectional encoding from Markdown to HTML\n\n#### [Steganography](https://python-codext.readthedocs.io/en/latest/enc/stegano.html)\n\n- [X] `hexagram`: uses Base64 and encodes the result to a charset of [I Ching hexagrams](https://en.wikipedia.org/wiki/Hexagram_%28I_Ching%29) (as implemented [here](https://github.com/qntm/hexagram-encode))\n- [X] `klopf`: aka Klopf code ; Polybius square with trivial alphabetical distribution\n- [X] `resistor`: aka resistor color codes\n- [X] `rick`: aka Rick cipher (in reference to Rick Astley's song \"*Never gonna give you up*\")\n- [X] `sms`: also called _T9 code_ ; uses \"`-`\" as a separator for encoding, \"`-`\" or \"`_`\" or whitespace for decoding\n- [X] `whitespace`: replaces bits with whitespaces and tabs\n- [X] `whitespace_after_before`: variant of `whitespace` ; encodes characters as new characters with whitespaces before and after according to an equation described in the codec name (e.g. \"`whitespace+2*after-3*before`\")\n\n#### [Web](https://python-codext.readthedocs.io/en/latest/enc/web.html)\n\n- [X] `html`: implements entities according to [this reference](https://dev.w3.org/html5/html-author/charref)\n- [X] `url`: aka URL encoding\n\n\n## :clap:  Supporters\n\n[![Stargazers repo roster for @dhondta/python-codext](https://reporoster.com/stars/dark/dhondta/python-codext)](https://github.com/dhondta/python-codext/stargazers)\n\n[![Forkers repo roster for @dhondta/python-codext](https://reporoster.com/forks/dark/dhondta/python-codext)](https://github.com/dhondta/python-codext/network/members)\n\n\u003cp align=\"center\"\u003e\u003ca href=\"#\"\u003e\u003cimg src=\"https://img.shields.io/badge/Back%20to%20top--lightgrey?style=social\" alt=\"Back to top\" height=\"20\"/\u003e\u003c/a\u003e\u003c/p\u003e\n","funding_links":[],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdhondta%2Fpython-codext","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdhondta%2Fpython-codext","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdhondta%2Fpython-codext/lists"}