diff options
| author | Mistivia <i@mistivia.com> | 2025-02-08 13:55:37 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-02-08 13:55:37 +0800 |
| commit | ea9350a570fcb8011bb2678ad8b60486772e411d (patch) | |
| tree | 81a0655e79cdaaf2dac8806f73bb6d0312ed26c3 /src/utils.js | |
| parent | 86b9e2de76283ac6ee1e7761dcf6ce0730f26e7a (diff) | |
impl ydke share
Diffstat (limited to 'src/utils.js')
| -rw-r--r-- | src/utils.js | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/utils.js b/src/utils.js index 3176400..ba5d905 100644 --- a/src/utils.js +++ b/src/utils.js @@ -55,10 +55,56 @@ function downloadStringAsFile(filename, text) { URL.revokeObjectURL(link.href); } +function ydkeEncode(d) { + let deck = []; + for (let card of d) { + let num = parseInt(card); + if (isNaN(num)) continue; + deck.push(num); + } + const buffer = new ArrayBuffer(deck.length * 4); + const view = new DataView(buffer); + for (let i = 0; i < deck.length; i++) { + // Little-endian + view.setUint32(i * 4, deck[i], true); + } + return btoa(String.fromCharCode(...new Uint8Array(buffer))); +} + +function ydkeDecode(encodedDeck) { + const binaryString = atob(encodedDeck); + const buffer = new ArrayBuffer(binaryString.length); + const view = new DataView(buffer); + for (let i = 0; i < binaryString.length; i++) { + view.setUint8(i, binaryString.charCodeAt(i)); + } + const deck = []; + for (let i = 0; i < buffer.byteLength; i += 4) { + deck.push(String(view.getUint32(i, true))); // Little-endian + } + return deck; +} + +function parseYdke(ydkeString) { + const [mainEncoded, extraEncoded, sideEncoded] = ydkeString.split('!'); + const main = ydkeDecode(mainEncoded); + const extra = ydkeDecode(extraEncoded); + const side = ydkeDecode(sideEncoded); + return { main, extra, side }; +} + +function genYdke(deck) { + const mainEncoded = ydkeEncode(deck.main); + const extraEncoded = ydkeEncode(deck.extra); + const sideEncoded = ydkeEncode(deck.side); + return `${mainEncoded}!${extraEncoded}!${sideEncoded}`; +} export { parseYdk, genYdk, + parseYdke, + genYdke, downloadStringAsFile, }; |
