This repository has been archived on 2018-10-12. You can view files and clone it, but cannot push or open issues or pull requests.
node-task/node_modules/body-parser/node_modules/iconv-lite/lib/index.js

123 lines
3.9 KiB
JavaScript
Raw Blame History

var iconv = module.exports;
// All codecs and aliases are kept here, keyed by encoding name/alias.
// They are lazy loaded in `iconv.getCodec` from `encodings/index.js`.
iconv.encodings = null;
// Characters emitted in case of error.
iconv.defaultCharUnicode = '<27>';
iconv.defaultCharSingleByte = '?';
// Public API.
iconv.encode = function encode(str, encoding, options) {
str = "" + (str || ""); // Ensure string.
var encoder = iconv.getCodec(encoding).encoder(options);
var res = encoder.write(str);
var trail = encoder.end();
return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res;
}
iconv.decode = function decode(buf, encoding, options) {
if (typeof buf === 'string') {
if (!iconv.skipDecodeWarning) {
console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding');
iconv.skipDecodeWarning = true;
}
buf = new Buffer("" + (buf || ""), "binary"); // Ensure buffer.
}
var decoder = iconv.getCodec(encoding).decoder(options);
var res = decoder.write(buf);
var trail = decoder.end();
return (trail && trail.length > 0) ? (res + trail) : res;
}
iconv.encodingExists = function encodingExists(enc) {
try {
iconv.getCodec(enc);
return true;
} catch (e) {
return false;
}
}
// Legacy aliases to convert functions
iconv.toEncoding = iconv.encode;
iconv.fromEncoding = iconv.decode;
// Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache.
iconv._codecDataCache = {};
iconv.getCodec = function getCodec(encoding) {
if (!iconv.encodings)
iconv.encodings = require("../encodings"); // Lazy load all encoding definitions.
// Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
var enc = (''+encoding).toLowerCase().replace(/[^0-9a-z]|:\d{4}$/g, "");
// Traverse iconv.encodings to find actual codec.
var codecData, codecOptions;
while (true) {
codecData = iconv._codecDataCache[enc];
if (codecData)
return codecData;
var codec = iconv.encodings[enc];
switch (typeof codec) {
case "string": // Direct alias to other encoding.
enc = codec;
break;
case "object": // Alias with options. Can be layered.
if (!codecOptions) {
codecOptions = codec;
codecOptions.encodingName = enc;
}
else {
for (var key in codec)
codecOptions[key] = codec[key];
}
enc = codec.type;
break;
case "function": // Codec itself.
if (!codecOptions)
codecOptions = { encodingName: enc };
codecOptions.iconv = iconv;
// The codec function must load all tables and return object with .encoder and .decoder methods.
// It'll be called only once (for each different options object).
codecData = codec.call(iconv.encodings, codecOptions);
iconv._codecDataCache[codecOptions.encodingName] = codecData; // Save it to be reused later.
return codecData;
default:
throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')");
}
}
}
// Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json.
var nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node;
if (nodeVer) {
// Load streaming support in Node v0.10+
var nodeVerArr = nodeVer.split(".").map(Number);
if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) {
require("./streams")(iconv);
}
// Load Node primitive extensions.
require("./extend-node")(iconv);
}