ilib
Version:
iLib is a cross-engine library of internationalization (i18n) classes written in pure JS
2 lines • 2.72 kB
JavaScript
// !data charmaps charset/US-ASCII charset/ISO-10646-UCS-2 charset/ISO-8859-1 charset/ISO-8859-15 charmaps/ISO-8859-15 charmaps/ISO-8859-1 charset/ISO-8859-1
var ilib=require("./ilib.js"),JSUtils=require("./JSUtils.js"),IString=require("./IString.js"),Charmap=function(options){if((!options||!options.noinstance)&&(this.missing="placeholder",this.placeholder="?",this.escapeStyle="js",this.expansionFactor=1,options)){void 0!==options.placeholder&&(this.placeholder=options.placeholder);var escapes={html:"html",js:"js","c#":"js",c:"c","c++":"c",java:"java",ruby:"java",perl:"perl"};void 0!==options.escapeStyle&&void 0!==escapes[options.escapeStyle]&&(this.escapeStyle=escapes[options.escapeStyle]),void 0!==options.missing&&("skip"!==options.missing&&"placeholder"!==options.missing&&"escape"!==options.missing||(this.missing=options.missing))}};Charmap._algorithms={},Charmap.prototype={getName:function(){return this.charset.getName()},writeNative:function(array,start,value){if(ilib.isArray(value)){for(var i=0;i<value.length;i++)array[start+i]=value[i];return value.length}return array[start]=value,1},writeNativeString:function(array,start,string){for(var i=0;i<string.length;i++)array[start+i]=string.charCodeAt(i);return string.length},_calcExpansionFactor:function(){var factor=1;switch(factor=Math.max(factor,this.charset.getMaxCharWidth()),this.missing){case"placeholder":this.placeholder&&(factor=Math.max(factor,this.placeholder.length));break;case"escape":switch(this.escapeStyle){case"html":factor=Math.max(factor,8);break;case"c":factor=Math.max(factor,6);break;case"perl":factor=Math.max(factor,10);break;default:factor=Math.max(factor,6)}}this.expansionFactor=factor},dealWithMissingChar:function(c){var seq="";switch(this.missing){case"skip":break;case"escape":var num="string"==typeof c?c.charCodeAt(0):c,bigc=JSUtils.pad(num.toString(16),4).toUpperCase();switch(this.escapeStyle){case"html":seq="&#x"+bigc+";";break;case"c":seq="\\x"+bigc;break;case"java":seq="\\\\u"+bigc;break;case"perl":seq="\\N{U+"+bigc+"}";break;default:case"js":seq="\\u"+bigc}break;default:case"placeholder":seq=this.placeholder}return seq},mapToNative:function(string){if(!string)return new Uint8Array(0);if(this.algorithm)return this.algorithm.mapToNative(string);for(var c,str=string instanceof IString?string:new IString(string),i=0,it=str.iterator(),ret=new Uint8Array(str.length*this.expansionFactor);it.hasNext()&&i<ret.length;)(c=it.next())<127?ret[i++]=c:i+=this.writeNativeString(ret,i,this.dealWithMissingChar(c));return ret},mapToUnicode:function(bytes){for(var c,ret="",i=0;i<bytes.length;)ret+=(c=bytes[i])<128?String.fromCharCode(c):this.dealWithMissingChar(bytes[i++]);return ret}},module.exports=Charmap;