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 = '�'; 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); }