|
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 == 'utf8' && !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;
- }
|