1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- var iconv,
- inherits = require('util').inherits,
- stream = require('stream');
- var regex = /(?:charset|encoding)\s*=\s*['"]? *([\w\-]+)/i;
- inherits(StreamDecoder, stream.Transform);
- function StreamDecoder(charset) {
- if (!(this instanceof StreamDecoder))
- return new StreamDecoder(charset);
- stream.Transform.call(this, charset);
- this.charset = charset;
- this.parsed_chunk = false;
- }
- StreamDecoder.prototype._transform = function(chunk, encoding, done) {
- var res, found;
- // try get charset from chunk, just once
- if (this.charset == 'iso-8859-1' && !this.parsed_chunk) {
- this.parsed_chunk = true;
- var matches = regex.exec(chunk.toString());
- if (matches) {
- found = matches[1].toLowerCase();
- this.charset = found == 'utf-8' ? 'utf8' : found;
- }
- }
- try {
- res = iconv.decode(chunk, this.charset);
- } catch(e) { // something went wrong, just return original chunk
- res = chunk;
- }
- this.push(res);
- done();
- }
- module.exports = function(charset) {
- try {
- if (!iconv) iconv = require('iconv-lite');
- } catch(e) {
- /* iconv not found */
- }
- if (iconv)
- return new StreamDecoder(charset);
- else
- return new stream.PassThrough;
- }
|