You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					123 lines
				
				3.6 KiB
			
		
		
			
		
	
	
					123 lines
				
				3.6 KiB
			| 
											3 years ago
										 | const Encodings = require('./encodings'); | ||
|  | const { UTF8Decoder, UTF8Encoder } = require('./implementations/utf8'); | ||
|  | const { UTF16Decoder, UTF16Encoder } = require('./implementations/utf16'); | ||
|  | const { GB18030Decoder, GB18030Encoder } = require('./implementations/gb18030'); | ||
|  | const { Big5Decoder, Big5Encoder } = require('./implementations/big5'); | ||
|  | const { EUCJPDecoder, EUCJPEncoder } = require('./implementations/euc-jp'); | ||
|  | const { EUCKRDecoder, EUCKREncoder } = require('./implementations/euc-kr'); | ||
|  | const { ISO2022JPDecoder, ISO2022JPEncoder } = require('./implementations/iso-2022-jp'); | ||
|  | const { XUserDefinedDecoder, XUserDefinedEncoder } = require('./implementations/x-user-defined'); | ||
|  | const { ShiftJISDecoder, ShiftJISEncoder } = require('./implementations/shift-jis'); | ||
|  | const { SingleByteDecoder, SingleByteEncoder } = require('./implementations/single-byte'); | ||
|  | const index = require('./indexes');; | ||
|  | 
 | ||
|  | // 5.2 Names and labels
 | ||
|  | 
 | ||
|  | // TODO: Define @typedef for Encoding: {name:string,labels:Array.<string>}
 | ||
|  | // https://github.com/google/closure-compiler/issues/247
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // Label to encoding registry.
 | ||
|  | /** @type {Object.<string,{name:string,labels:Array.<string>}>} */ | ||
|  | const label_to_encoding = {} | ||
|  | Encodings.forEach(({ encodings }) => { | ||
|  |   encodings.forEach((encoding) => { | ||
|  |     encoding.labels.forEach((label) => { | ||
|  |       label_to_encoding[label] = encoding | ||
|  |     }) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | // Registry of of encoder/decoder factories, by encoding name.
 | ||
|  | const encoders = { | ||
|  |   'UTF-8'() { // 9.1 utf-8
 | ||
|  |     return new UTF8Encoder() | ||
|  |   }, | ||
|  |   'GBK'(options) { // 11.1.2 gbk encoder;
 | ||
|  |     // gbk's encoder is gb18030's encoder with its gbk flag set.
 | ||
|  |     return new GB18030Encoder(options, true) | ||
|  |   }, | ||
|  |   'gb18030'() { | ||
|  |     return new GB18030Encoder() | ||
|  |   }, | ||
|  |   'Big5'() { | ||
|  |     return new Big5Encoder() | ||
|  |   }, | ||
|  |   'EUC-JP'() { | ||
|  |     return new EUCJPEncoder() | ||
|  |   }, | ||
|  |   'EUC-KR'() { | ||
|  |     return new EUCKREncoder() | ||
|  |   }, | ||
|  |   'ISO-2022-JP'() { | ||
|  |     return new ISO2022JPEncoder() | ||
|  |   }, | ||
|  |   'UTF-16BE'() { // 15.3 utf-16be
 | ||
|  |     return new UTF16Encoder(true) | ||
|  |   }, | ||
|  |   'UTF-16LE'() { // 15.4 utf-16le
 | ||
|  |     return new UTF16Encoder() | ||
|  |   }, | ||
|  |   'x-user-defined'() { | ||
|  |     return new XUserDefinedEncoder() | ||
|  |   }, | ||
|  |   'Shift_JIS'() { | ||
|  |     return new ShiftJISEncoder() | ||
|  |   }, | ||
|  | } | ||
|  | 
 | ||
|  | /** @type {Object.<string, function({fatal:boolean}): Decoder>} */ | ||
|  | const decoders = { | ||
|  |   'UTF-8'(options) { // 9.1.1 utf-8 decoder
 | ||
|  |     return new UTF8Decoder(options) | ||
|  |   }, | ||
|  |   'GBK'(options) { // 11.1.1 gbk decoder;  gbk's decoder is gb18030's decoder.
 | ||
|  |     return new GB18030Decoder(options) | ||
|  |   }, | ||
|  |   'gb18030'(options) { | ||
|  |     return new GB18030Decoder(options) | ||
|  |   }, | ||
|  |   'Big5'(options) { | ||
|  |     return new Big5Decoder(options) | ||
|  |   }, | ||
|  |   'EUC-JP'(options) { | ||
|  |     return new EUCJPDecoder(options) | ||
|  |   }, | ||
|  |   'EUC-KR'(options) { | ||
|  |     return new EUCKRDecoder(options) | ||
|  |   }, | ||
|  |   'ISO-2022-JP'(options) { | ||
|  |     return new ISO2022JPDecoder(options) | ||
|  |   }, | ||
|  |   'UTF-16BE'(options) { // 15.3.1 utf-16be decoder
 | ||
|  |     return new UTF16Decoder(true, options) | ||
|  |   }, | ||
|  |   'UTF-16LE'(options) { // 15.4.1 utf-16le decoder
 | ||
|  |     return new UTF16Decoder(false, options) | ||
|  |   }, | ||
|  |   'x-user-defined'() { | ||
|  |     return new XUserDefinedDecoder() | ||
|  |   }, | ||
|  |   'Shift_JIS'(options) { | ||
|  |     return new ShiftJISDecoder(options) | ||
|  |   }, | ||
|  | } | ||
|  | 
 | ||
|  | Encodings.forEach(({ heading, encodings }) => { | ||
|  |   if (heading != 'Legacy single-byte encodings') | ||
|  |     return | ||
|  |   encodings.forEach((encoding) => { | ||
|  |     const name = encoding.name | ||
|  |     const idx = index(name.toLowerCase()) | ||
|  |     decoders[name] = (options) => { | ||
|  |       return new SingleByteDecoder(idx, options) | ||
|  |     } | ||
|  |     encoders[name] = (options) => { | ||
|  |       return new SingleByteEncoder(idx, options) | ||
|  |     } | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | module.exports.label_to_encoding = label_to_encoding | ||
|  | module.exports.encoders = encoders | ||
|  | module.exports.decoders = decoders |