Initial backup 2026-02-17

This commit is contained in:
Krilly
2026-02-17 15:50:53 +00:00
commit 8902a93add
941 changed files with 131420 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
Copyright Mathias Bynens <https://mathiasbynens.be/>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -0,0 +1,151 @@
# quoted-printable [![Build status](https://travis-ci.org/mathiasbynens/quoted-printable.svg?branch=master)](https://travis-ci.org/mathiasbynens/quoted-printable) [![Code coverage status](https://coveralls.io/repos/mathiasbynens/quoted-printable/badge.svg)](https://coveralls.io/r/mathiasbynens/quoted-printable) [![Dependency status](https://gemnasium.com/mathiasbynens/quoted-printable.svg)](https://gemnasium.com/mathiasbynens/quoted-printable)
_quoted-printable_ is a character encodingagnostic JavaScript implementation of [the `Quoted-Printable` content transfer encoding as defined by RFC 2045](https://tools.ietf.org/html/rfc2045#section-6.7). It can be used to encode plaintext to its `Quoted-Printable` encoding, or the other way around (i.e. decoding). [Heres an online demo using the UTF-8 character encoding.](https://mothereff.in/quoted-printable)
## Installation
Via [npm](https://www.npmjs.com/):
```bash
npm install quoted-printable
```
Via [Bower](http://bower.io/):
```bash
bower install quoted-printable
```
Via [Component](https://github.com/component/component):
```bash
component install mathiasbynens/quoted-printable
```
In a browser:
```html
<script src="quoted-printable.js"></script>
```
In [Node.js](https://nodejs.org/), [io.js](https://iojs.org/), [Narwhal](http://narwhaljs.org/), and [RingoJS](http://ringojs.org/):
```js
var quotedPrintable = require('quoted-printable');
```
In [Rhino](http://www.mozilla.org/rhino/):
```js
load('quoted-printable.js');
```
Using an AMD loader like [RequireJS](http://requirejs.org/):
```js
require(
{
'paths': {
'quoted-printable': 'path/to/quoted-printable'
}
},
['quoted-printable'],
function(quotedPrintable) {
console.log(quotedPrintable);
}
);
```
## API
### `quotedPrintable.version`
A string representing the semantic version number.
### `quotedPrintable.encode(input)`
This function takes an encoded byte string (the `input` parameter) and `Quoted-Printable`-encodes it. Each item in the input string represents an octet as per the desired character encoding. Heres an example that uses UTF-8:
```js
var utf8 = require('utf8');
quotedPrintable.encode(utf8.encode('foo=bar'));
// → 'foo=3Dbar'
quotedPrintable.encode(utf8.encode('Iñtërnâtiônàlizætiøn☃💩'));
// → 'I=C3=B1t=C3=ABrn=C3=A2ti=C3=B4n=C3=A0liz=C3=A6ti=C3=B8n=E2=98=83=F0=9F=92=\r\n=A9'
```
### `quotedPrintable.decode(text)`
This function takes a string of text (the `text` parameter) and `Quoted-Printable`-decodes it. The return value is a byte string, i.e. a string of which each item represents an octet as per the character encoding thats being used. Heres an example that uses UTF-8:
```js
var utf8 = require('utf8');
utf8.decode(quotedPrintable.decode('foo=3Dbar'));
// → 'foo=bar'
utf8.decode(quotedPrintable.decode('I=C3=B1t=C3=ABrn=C3=A2ti=C3=B4n=C3=A0liz=C3=A6ti=C3=B8n=E2=98=83=F0=9F=92=\r\n=A9'));
// → 'Iñtërnâtiônàlizætiøn☃💩'
```
### Using the `quoted-printable` binary
To use the `quoted-printable` binary in your shell, simply install _quoted-printable_ globally using npm:
```bash
npm install -g quoted-printable
```
After that, youll be able to use `quoted-printable` on the command line. Note that while the _quoted-printable_ library itself is character encodingagnostic, the command-line tool applies the UTF-8 character encoding on all input.
```bash
$ quoted-printable --encode 'foo=bar'
foo=3Dbar
$ quoted-printable --decode 'foo=3Dbar'
foo=bar
```
Read a local text file, `Quoted-Printable`-encode it, and save the result to a new file:
```bash
$ quoted-printable --encode < foo.txt > foo-quoted-printable.txt
```
Or do the same with an online text file:
```bash
$ curl -sL 'https://mths.be/brh' | quoted-printable --encode > quoted-printable.txt
```
Or, the opposite — read a local file containing a `Quoted-Printable`-encoded message, decode it back to plain text, and save the result to a new file:
```bash
$ quoted-printable --decode < quoted-printable.txt > original.txt
```
See `quoted-printable --help` for the full list of options.
## Support
_quoted-printable_ is designed to work in at least Node.js v0.10.0, io.js v1.0.0, Narwhal 0.3.2, RingoJS 0.8-0.11, PhantomJS 1.9.0, Rhino 1.7RC4, as well as old and modern versions of Chrome, Firefox, Safari, Opera, and Internet Explorer.
## Unit tests & code coverage
After cloning this repository, run `npm install` to install the dependencies needed for development and testing. You may want to install Istanbul _globally_ using `npm install istanbul -g`.
Once thats done, you can run the unit tests in Node using `npm test` or `node tests/tests.js`. To run the tests in Rhino, Ringo, Narwhal, and web browsers as well, use `grunt test`.
To generate the code coverage report, use `grunt cover`.
## Author
| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") |
|---|
| [Mathias Bynens](https://mathiasbynens.be/) |
## License
_quoted-printable_ is available under the [MIT](https://mths.be/mit) license.

View File

@@ -0,0 +1,116 @@
#!/usr/bin/env node
(function() {
var fs = require('fs');
var utf8 = require('utf8');
var quotedPrintable = require('../quoted-printable.js');
var strings = process.argv.splice(2);
var stdin = process.stdin;
var data;
var timeout;
var action;
var options = {};
var log = console.log;
var main = function() {
var option = strings[0];
var count = 0;
if (/^(?:-h|--help|undefined)$/.test(option)) {
log(
'quoted-printable v%s - https://mths.be/quoted-printable',
quotedPrintable.version
);
log([
'\nEncode or decode messages using the `Quoted-Printable` encoding (and UTF-8).',
'\nUsage:\n',
'\tquoted-printable [-e | --encode] string',
'\tquoted-printable [-d | --decode] string',
'\tquoted-printable [-v | --version]',
'\tquoted-printable [-h | --help]',
'\nExamples:\n',
'\tquoted-printable --encode \'foo = bar ©\'',
'\techo \'foo =3D bar =C2=A9\' | quoted-printable --decode',
].join('\n'));
return process.exit(1);
}
if (/^(?:-v|--version)$/.test(option)) {
log('v%s', quotedPrintable.version);
return process.exit(1);
}
strings.forEach(function(string) {
// Process options
if (string == '-e' || string == '--encode') {
action = 'encode';
return;
}
if (string == '-d' || string == '--decode') {
action = 'decode';
return;
}
// Process string(s)
var result;
if (!action) {
log('Error: quoted-printable requires at least one option and a string argument.');
log('Try `quoted-printable --help` for more information.');
return process.exit(1);
}
try {
if (action == 'encode') {
result = quotedPrintable.encode(utf8.encode(string, options));
} else if (action == 'decode') {
result = utf8.decode(quotedPrintable.decode(string, options));
}
log(result);
count++;
} catch (exception) {
log(exception.message + '\n');
log('Error: failed to %s.', action);
log('If you think this is a bug in quoted-printable, please report it:');
log('https://github.com/mathiasbynens/quoted-printable/issues/new');
log('\nStack trace using quoted-printable@%s:\n', quotedPrintable.version);
log(exception.stack);
return process.exit(1);
}
});
if (!count) {
log('Error: quoted-printable requires a string argument.');
log('Try `quoted-printable --help` for more information.');
return process.exit(1);
}
// Return with exit status 0 outside of the `forEach` loop, in case
// multiple strings were passed in.
return process.exit(0);
};
if (stdin.isTTY) {
// handle shell arguments
main();
} else {
// Either the script is called from within a non-TTY context, or `stdin`
// content is being piped in.
if (!process.stdout.isTTY) {
// The script was called from a non-TTY context. This is a rather uncommon
// use case we dont actively support. However, we dont want the script
// to wait forever in such cases, so…
timeout = setTimeout(function() {
// …if no piped data arrived after a whole minute, handle shell
// arguments instead.
main();
}, 60000);
}
data = '';
stdin.on('data', function(chunk) {
clearTimeout(timeout);
data += chunk;
});
stdin.on('end', function() {
strings.push(data.trim());
main();
});
stdin.resume();
}
}());

View File

@@ -0,0 +1,58 @@
.Dd May 4, 2014
.Dt quoted-printable 1
.Sh NAME
.Nm quoted-printable
.Nd encode or decode messages using the `Quoted-Printable` content transfer encoding
.Sh SYNOPSIS
.Nm
.Op Fl e | -encode Ar string
.br
.Op Fl d | -decode Ar string
.br
.Op Fl v | -version
.br
.Op Fl h | -help
.Sh DESCRIPTION
.Nm
encode or decode messages using the `Quoted-Printable` content transfer encoding.
.Sh OPTIONS
.Bl -ohang -offset
.It Sy "--encode"
Encode a string of text using the `Quoted-Printable` content transfer encoding.
.It Sy "--decode"
Decode a string of text using the `Quoted-Printable` content transfer encoding.
.It Sy "-v, --version"
Print quoted-printable's version.
.It Sy "-h, --help"
Show the help screen.
.El
.Sh EXIT STATUS
The
.Nm quoted-printable
utility exits with one of the following values:
.Pp
.Bl -tag -width flag -compact
.It Li 0
.Nm
successfully encoded/decoded the input and printed the result.
.It Li 1
.Nm
wasn't instructed to encode/decode anything (for example, the
.Ar --help
flag was set); or, an error occurred.
.El
.Sh EXAMPLES
.Bl -ohang -offset
.It Sy "quoted-printable --encode 'foo = bar'"
Print an encoded version of the given string.
.It Sy "quoted-printable --decode 'foo=3Dbar'"
Print the decoded version of the given `Quoted-Printable`-encoded message.
.It Sy "echo\ 'foo = bar'\ |\ quoted-printable --encode"
Print the encoded version of the string that gets piped in.
.El
.Sh BUGS
quoted-printable's bug tracker is located at <https://github.com/mathiasbynens/quoted-printable/issues>.
.Sh AUTHOR
Mathias Bynens <https://mathiasbynens.be/>
.Sh WWW
<https://mths.be/quoted-printable>

View File

@@ -0,0 +1,57 @@
{
"name": "quoted-printable",
"version": "1.0.1",
"description": "A robust & character encodingagnostic JavaScript implementation of the `Quoted-Printable` content transfer encoding as defined by RFC 2045.",
"homepage": "https://mths.be/quoted-printable",
"main": "quoted-printable.js",
"bin": "bin/quoted-printable",
"man": "man/quoted-printable.1",
"keywords": [
"decode",
"decoding",
"encode",
"encoding",
"quoted-printable",
"string"
],
"license": "MIT",
"author": {
"name": "Mathias Bynens",
"url": "https://mathiasbynens.be/"
},
"repository": {
"type": "git",
"url": "https://github.com/mathiasbynens/quoted-printable.git"
},
"bugs": "https://github.com/mathiasbynens/quoted-printable/issues",
"files": [
"LICENSE-MIT.txt",
"quoted-printable.js",
"bin/",
"man/"
],
"directories": {
"bin": "bin",
"man": "man",
"test": "tests"
},
"scripts": {
"test": "node tests/tests.js"
},
"dependencies": {
"utf8": "^2.1.0"
},
"devDependencies": {
"coveralls": "^2.11.1",
"grunt": "^0.4.5",
"grunt-shell": "^1.1.1",
"grunt-template": "^0.2.3",
"istanbul": "^0.3.5",
"jsesc": "^0.5.0",
"qunit-extras": "^1.4.0",
"qunitjs": "~1.11.0",
"regenerate": "^1.2.1",
"requirejs": "^2.1.15",
"string.fromcodepoint": "^0.2.1"
}
}

View File

@@ -0,0 +1,153 @@
/*! https://mths.be/quoted-printable v1.0.1 by @mathias | MIT license */
;(function(root) {
// Detect free variables `exports`.
var freeExports = typeof exports == 'object' && exports;
// Detect free variable `module`.
var freeModule = typeof module == 'object' && module &&
module.exports == freeExports && module;
// Detect free variable `global`, from Node.js or Browserified code, and use
// it as `root`.
var freeGlobal = typeof global == 'object' && global;
if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
root = freeGlobal;
}
/*--------------------------------------------------------------------------*/
var stringFromCharCode = String.fromCharCode;
var decode = function(input) {
return input
// https://tools.ietf.org/html/rfc2045#section-6.7, rule 3:
// “Therefore, when decoding a `Quoted-Printable` body, any trailing white
// space on a line must be deleted, as it will necessarily have been added
// by intermediate transport agents.”
.replace(/[\t\x20]$/gm, '')
// Remove hard line breaks preceded by `=`. Proper `Quoted-Printable`-
// encoded data only contains CRLF line endings, but for compatibility
// reasons we support separate CR and LF too.
.replace(/=(?:\r\n?|\n|$)/g, '')
// Decode escape sequences of the form `=XX` where `XX` is any
// combination of two hexidecimal digits. For optimal compatibility,
// lowercase hexadecimal digits are supported as well. See
// https://tools.ietf.org/html/rfc2045#section-6.7, note 1.
.replace(/=([a-fA-F0-9]{2})/g, function($0, $1) {
var codePoint = parseInt($1, 16);
return stringFromCharCode(codePoint);
});
};
var handleTrailingCharacters = function(string) {
return string
.replace(/\x20$/, '=20') // Handle trailing space.
.replace(/\t$/, '=09') // Handle trailing tab.
};
var regexUnsafeSymbols = /[\0-\x08\n-\x1F=\x7F-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
var encode = function(string) {
// Encode symbols that are definitely unsafe (i.e. unsafe in any context).
var encoded = string.replace(regexUnsafeSymbols, function(symbol) {
if (symbol > '\xFF') {
throw RangeError(
'`quotedPrintable.encode()` expects extended ASCII input only. ' +
'Don\u2019t forget to encode the input first using a character ' +
'encoding like UTF-8.'
);
}
var codePoint = symbol.charCodeAt(0);
var hexadecimal = codePoint.toString(16).toUpperCase();
return '=' + ('0' + hexadecimal).slice(-2);
});
// Limit lines to 76 characters (not counting the CRLF line endings).
var lines = encoded.split(/\r\n?|\n/g);
var lineIndex = -1;
var lineCount = lines.length;
var result = [];
while (++lineIndex < lineCount) {
var line = lines[lineIndex];
// Leave room for the trailing `=` for soft line breaks.
var LINE_LENGTH = 75;
var index = 0;
var length = line.length;
while (index < length) {
var buffer = encoded.slice(index, index + LINE_LENGTH);
// If this line ends with `=`, optionally followed by a single uppercase
// hexadecimal digit, we broke an escape sequence in half. Fix it by
// moving these characters to the next line.
if (/=$/.test(buffer)) {
buffer = buffer.slice(0, LINE_LENGTH - 1);
index += LINE_LENGTH - 1;
} else if (/=[A-F0-9]$/.test(buffer)) {
buffer = buffer.slice(0, LINE_LENGTH - 2);
index += LINE_LENGTH - 2;
} else {
index += LINE_LENGTH;
}
result.push(buffer);
}
}
// Encode space and tab characters at the end of encoded lines. Note that
// with the current implementation, this can only occur at the very end of
// the encoded string — every other line ends with `=` anyway.
var lastLineLength = buffer.length;
if (/[\t\x20]$/.test(buffer)) {
// Theres a space or a tab at the end of the last encoded line. Remove
// this line from the `result` array, as it needs to change.
result.pop();
if (lastLineLength + 2 <= LINE_LENGTH + 1) {
// Its possible to encode the character without exceeding the line
// length limit.
result.push(
handleTrailingCharacters(buffer)
);
} else {
// Its not possible to encode the character without exceeding the line
// length limit. Remvoe the character from the line, and insert a new
// line that contains only the encoded character.
result.push(
buffer.slice(0, lastLineLength - 1),
handleTrailingCharacters(
buffer.slice(lastLineLength - 1, lastLineLength)
)
);
}
}
// `Quoted-Printable` uses CRLF.
return result.join('=\r\n');
};
var quotedPrintable = {
'encode': encode,
'decode': decode,
'version': '1.0.1'
};
// Some AMD build optimizers, like r.js, check for specific condition patterns
// like the following:
if (
typeof define == 'function' &&
typeof define.amd == 'object' &&
define.amd
) {
define(function() {
return quotedPrintable;
});
} else if (freeExports && !freeExports.nodeType) {
if (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+
freeModule.exports = quotedPrintable;
} else { // in Narwhal or RingoJS v0.7.0-
for (var key in quotedPrintable) {
quotedPrintable.hasOwnProperty(key) && (freeExports[key] = quotedPrintable[key]);
}
}
} else { // in Rhino or a web browser
root.quotedPrintable = quotedPrintable;
}
}(this));