PHP's convert_uuencode in TypeScript

How to use

Install via yarn add locutus and import: import { convert_uuencode } from 'locutus/php/strings/convert_uuencode'.

Or with CommonJS: const { convert_uuencode } = require('locutus/php/strings/convert_uuencode')

Use a bundler that supports tree-shaking so you only ship the functions you actually use. Vite, webpack, Rollup, and Parcel all handle this. For server-side use this is less of a concern.

Examples

These examples are extracted from test cases that automatically verify our functions against their native counterparts.

#codeexpected result
1convert_uuencode("test\ntext text\r\n")"0=&5S=`IT97AT('1E>'0-\"@\n`\n"

Dependencies

This function uses the following Locutus functions:

Here's what our current TypeScript equivalent to PHP's convert_uuencode looks like.

import type { PhpRuntimeValue } from '../_helpers/_phpTypes.ts'
import { is_scalar as isScalar } from '../var/is_scalar.ts'

type UUEncodeInput = PhpRuntimeValue

export function convert_uuencode(str: UUEncodeInput): string | false {
// discuss at: https://locutus.io/php/convert_uuencode/
// original by: Ole Vrijenhoek
// bugfixed by: Kevin van Zonneveld (https://kvz.io)
// bugfixed by: Brett Zamir (https://brett-zamir.me)
// reimplemented by: Ole Vrijenhoek
// example 1: convert_uuencode("test\ntext text\r\n")
// returns 1: "0=&5S=`IT97AT('1E>'0-\"@\n`\n"

const chr = function (c: number): string {
return String.fromCharCode(c)
}

if (!str || str === '') {
return chr(0)
} else if (!isScalar(str)) {
return false
}
const source = String(str)

let c = 0
let u = 0
let a = 0
let encoded = ''
let tmp1 = ''
let tmp2 = ''
let bytes: number[] = []

// divide string into chunks of 45 characters
const chunk = function () {
bytes = source
.substr(u, 45)
.split('')
.map((char) => char.charCodeAt(0))
return bytes.length || 0
}

while ((c = chunk()) !== 0) {
u += 45

// New line encoded data starts with number of bytes encoded.
encoded += chr(c + 32)

// Convert each char in bytes[] to a byte
for (const byte of bytes) {
tmp1 = byte.toString(2)
while (tmp1.length < 8) {
tmp1 = '0' + tmp1
}
tmp2 += tmp1
}

while (tmp2.length % 6) {
tmp2 = tmp2 + '0'
}

for (let i = 0; i <= tmp2.length / 6 - 1; i++) {
tmp1 = tmp2.substr(a, 6)
if (tmp1 === '000000') {
encoded += chr(96)
} else {
encoded += chr(parseInt(tmp1, 2) + 32)
}
a += 6
}
a = 0
tmp2 = ''
encoded += '\n'
}

// Add termination characters
encoded += chr(96) + '\n'

return encoded
}

Improve this function

Locutus is a community effort following The McDonald's Theory: we ship first iterations, hoping others will improve them. If you see something that could be better, we'd love your contribution.

View on GitHub · Edit on GitHub · View Raw


« More PHP strings functions


Star