double-x-encoding 1.2.0 → 1.2.1
raw patch · 2 files changed
+76/−1 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- double-x-encoding.cabal +3/−1
- readme.md +73/−0
double-x-encoding.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: double-x-encoding-version: 1.2.0+version: 1.2.1 synopsis: Encoding scheme to encode any Unicode string with only [0-9a-zA-Z_] description: Double-X-Encoding is an encoding scheme to encode any Unicode string with only characters from [0-9a-zA-Z_].@@ -19,6 +19,8 @@ maintainer: adrian@feram.io license: ISC build-type: Simple+extra-source-files:+ readme.md source-repository head type: git
+ readme.md view
@@ -0,0 +1,73 @@+# Double X Encoding++Encoding scheme to encode any Unicode string+with only characters from `[0-9a-zA-Z_]`.+Therefore it's quite similar to URL percent-encoding.+It's especially useful for GraphQL ID generation.++Constraints for the encoding scheme:++1. Common IDs like `file_format`, `fileFormat`, `FileFormat`,+ `FILE_FORMAT`, `__file_format__`, … must not be altered+1. Support all Unicode characters+1. Characters of the ASCII range must lead to shorter encodings+1. Optional support for encoding leading digits (like in `1_file_format`)+ to fulfill constraints of some ID schemes (e.g. GraphQL's).+++## Examples++Input | Output+------|-------+`camelCaseId` | `camelCaseId`+`snake_case_id` | `snake_case_id`+`__Schema` | `__Schema`+`doxxing` | `doxxing`+`DOXXING` | `DOXXXXXXING`+`id with spaces` | `idXX0withXX0spaces`+`id-with.special$chars!` | `idXXDwithXXEspecialXX4charsXX1`+`id_with_ümläutß` | `id_with_XXaaapmmlXXaaaoeutXXaaanp`+`Emoji: 😅` | `EmojiXXGXX0XXbpgaf`+`Multi Byte Emoji: 👨🦲` | `MultiXX0ByteXX0EmojiXXGXX0XXbpegiXXacaanXXbpjlc`+`\u{100000}` | `XXYbaaaaa`+`\u{10ffff}` | `XXYbapppp`++With encoding of leading digit and double underscore activated+(necessary for GraphQL ID generation):++Input | Output+------|-------+`1FileFormat` | `XXZ1FileFormat`+`__index__` | `XXRXXRindexXXRXXR`+++## Explanation++The encoding scheme is based on the following rules:++1. All characters in `[0-9A-Za-z_]` except for `XX` are encoded as is+1. `XX` is encoded as `XXXXXX`+1. All other printable characters inside the ASCII range+ are encoded as a sequence of 3 characters: `XX[0-9A-W]`+1. All other Unicode code points until `U+fffff` (e.g. Emojis)+ are encoded as a sequence of 7 characters:+ `XX[a-p]{5}`, where the 5 characters are the hexadecimal representation+ with an alternative hex alphabet ranging from+ `a` to `p` instead of `0` to `f`.+1. All Unicode code points in the Supplementary Private Use Area-B+ (`U+100000` to `U+10ffff`) are encoded as a sequence of 9 characters:+ `XXY[a-p]{6}`++If the optional leading digit encoding is enabled,+a leading digit is encoded as `XXZ[0-9]`.++If the optional double underscore encoding is enabled,+double underscores are encoded as `XXRXXR`.+++## Installation++- Haskell: [Via Hackage](https://hackage.haskell.org/package/double-x-encoding)+- Other languages: \+ The code is not yet available via common package managers.+ Please copy the code into your project for the time being.