ilib
Version:
iLib is a cross-engine library of internationalization (i18n) classes written in pure JS
2 lines • 3.46 kB
JavaScript
// !data ccc nfc ctype_m
var ilib=require("../index.js"),Utils=require("./Utils.js"),JSUtils=require("./JSUtils.js"),IString=require("./IString.js"),CType=require("./CType.js"),GlyphString=function(str,options){options&&options.noinstance||(IString.call(this,str),options=options||{sync:!0},CType._load("ctype_m",options.sync,options.loadParams,ilib.bind(this,function(){!ilib.data.ccc||JSUtils.isEmpty(ilib.data.ccc)?Utils.loadData({object:"GlyphString",locale:"-",name:"ccc.json",nonlocale:!0,sync:options.sync,loadParams:options.loadParams,callback:ilib.bind(this,function(norm){ilib.data.ccc=norm,!ilib.data.norm.nfc||JSUtils.isEmpty(ilib.data.norm.nfc)?Utils.loadData({object:"GlyphString",locale:"-",name:"nfc/all.json",nonlocale:!0,sync:options.sync,loadParams:options.loadParams,callback:ilib.bind(this,function(norm){ilib.data.norm.nfc=norm,options&&"function"==typeof options.onLoad&&options.onLoad(this)})}):options&&"function"==typeof options.onLoad&&options.onLoad(this)})}):options&&"function"==typeof options.onLoad&&options.onLoad(this)})))};GlyphString.prototype=new IString(void 0),GlyphString.prototype.parent=IString,(GlyphString.prototype.constructor=GlyphString)._isJamoL=function(n){return 4352<=n&&n<=4370},GlyphString._isJamoV=function(n){return 4449<=n&&n<=4469},GlyphString._isJamoT=function(n){return 4520<=n&&n<=4546},GlyphString._isJamoLV=function(n){n-=44032;return 0<=n&&n<11172&&n%28==0},GlyphString._isHangul=function(n){return 44032<=n&&n<=55203},GlyphString._composeJamoLV=function(lead,trail){return IString.fromCodePoint(44032+28*(21*(lead-4352)+(trail-4449)))},GlyphString._composeJamoLVT=function(lead,trail){return IString.fromCodePoint(lead+(trail-4519))},GlyphString._compose=function(lead,trail){var first=lead.charCodeAt(0),last=trail.charCodeAt(0);return GlyphString._isJamoLV(first)&&GlyphString._isJamoT(last)?GlyphString._composeJamoLVT(first,last):GlyphString._isJamoL(first)&&GlyphString._isJamoV(last)?GlyphString._composeJamoLV(first,last):ilib.data.norm.nfc&&ilib.data.norm.nfc[lead+trail]},GlyphString.prototype.charIterator=function(){var it=IString.prototype.charIterator.call(this);return new function _chiterator(istring){this.index=0,this.spacingCombining=!1,this.hasNext=function(){return!!this.nextChar||it.hasNext()},this.next=function(){var ch=this.nextChar||it.next(),prevCcc=ilib.data.ccc[ch],composed=ch;if(this.nextChar=void 0,this.spacingCombining=!1,ilib.data.ccc&&(void 0===ilib.data.ccc[ch]||0===ilib.data.ccc[ch]))for(var notdone=!0;it.hasNext()&¬done;){this.nextChar=it.next();var nextCcc=ilib.data.ccc[this.nextChar],codePoint=IString.toCodePoint(this.nextChar,0),isMn=CType._inRange(codePoint,"Mn",ilib.data.ctype_m),codePoint=CType._inRange(codePoint,"Mc",ilib.data.ctype_m);isMn||codePoint||void 0!==nextCcc&&0!==nextCcc?(codePoint&&(this.spacingCombining=!0),ch+=this.nextChar,this.nextChar=void 0):(isMn=GlyphString._compose(composed,this.nextChar),0===prevCcc&&void 0!==isMn?(composed=isMn,ch+=this.nextChar,this.nextChar=void 0):notdone=!1),prevCcc=nextCcc}return ch},this.wasSpacingCombining=function(){return this.spacingCombining}}},GlyphString.prototype.truncate=function(length){for(var c,it=this.charIterator(),tr="",i=0;i<length-1&&it.hasNext();i++)tr+=it.next();return i<length&&it.hasNext()&&(c=it.next(),it.wasSpacingCombining()||(tr+=c)),tr},GlyphString.prototype.ellipsize=function(length){return this.truncate(0<length?length-1:0)+"…"},module.exports=GlyphString;