pomo.min.js 11 KB

1
  1. !function(ctx){var noop=function(){},instance;String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")});var sprintf=function(){function d(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}function h(e,t){for(var r=[];0<t;r[--t]=e);return r.join("")}var e=function(){return e.cache.hasOwnProperty(arguments[0])||(e.cache[arguments[0]]=e.parse(arguments[0])),e.format.call(null,e.cache[arguments[0]],arguments)};return e.format=function(e,t){var r,n,s,i,a,o,l,c=1,u=e.length,f="",p=[];for(n=0;n<u;n++)if("string"===(f=d(e[n])))p.push(e[n]);else if("array"===f){if((i=e[n])[2])for(r=t[c],s=0;s<i[2].length;s++){if(!r.hasOwnProperty(i[2][s]))throw sprintf('[sprintf] property "%s" does not exist',i[2][s]);r=r[i[2][s]]}else r=i[1]?t[i[1]]:t[c++];if(/[^s]/.test(i[8])&&"number"!=d(r))throw sprintf("[sprintf] expecting number but found %s",d(r));switch(i[8]){case"b":r=r.toString(2);break;case"c":r=String.fromCharCode(r);break;case"d":r>>=0;break;case"e":r=i[7]?r.toExponential(i[7]):r.toExponential();break;case"f":r=i[7]?parseFloat(r).toFixed(i[7]):parseFloat(r);break;case"o":r=r.toString(8);break;case"s":r=(r=String(r))&&i[7]?r.substring(0,i[7]):r;break;case"u":r=Math.abs(r);break;case"x":r=r.toString(16);break;case"X":r=r.toString(16).toUpperCase()}r=/[def]/.test(i[8])&&i[3]&&0<=r?"+"+r:r,o=i[4]?"0"===i[4]?"0":i[4].charAt(1):" ",l=i[6]-String(r).length,a=i[6]?h(o,l):"",p.push(i[5]?r+a:a+r)}return p.join("")},e.cache={},e.parse=function(e){for(var t=e,r=[],n=[],s=0;t;){if(null!==(r=/^[^\x25]+/.exec(t)))n.push(r[0]);else if(null!==(r=/^\x25{2}/.exec(t)))n.push("%");else{if(null===(r=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(t)))throw"[sprintf] huh?";if(r[2]){s|=1;var i=[],a=r[2],o=[];if(null===(o=/^([a-z_][a-z_\d]*)/i.exec(a)))throw"[sprintf] huh?";for(i.push(o[1]);""!==(a=a.substring(o[0].length));)if(null!==(o=/^\.([a-z_][a-z_\d]*)/i.exec(a)))i.push(o[1]);else{if(null===(o=/^\[(\d+)\]/.exec(a)))throw"[sprintf] huh?";i.push(o[1])}r[2]=i}else s|=2;if(3===s)throw"[sprintf] mixing positional and named placeholders is not (yet) supported";n.push(r)}t=t.substring(r[0].length)}return n},e}(),vsprintf=function(e,t){return t.unshift(e),sprintf.apply(null,t)},isBrowser=function(){return"undefined"!=typeof window&&!!document&&!!document.getElementsByTagName},escapeString=function(e){var t;return e.constructor!=String()&&(t=e),e.replace&&(t=e.replace(/[\"]/g,'\\"').replace(/[\\]/g,"\\").replace(/[\/]/g,"/").replace(/[\b]/g,"\\b").replace(/[\f]/g,"\\f").replace(/[\n]/g,"\\n").replace(/[\r]/g,"\\r").replace(/[\t]/g,"\\t")),t},unescapeString=function(e){var t;return e&&e.replace&&(t=e.replace("\\n","\n").replace("\\r","\r").replace("\\t","\t").replace("\\f","\f").replace("\\b","\b").replace("\\r","\r")),t},waitUntilReady=function(e){var t=setInterval(function(){instance&&!instance.waiting&&(clearInterval(t),e.call(e))},4)},extend=function(e,t){var r,n=this,s=Object.prototype.hasOwnProperty;if(r=e&&s.call(e,"constructor")?e.constructor:function(){return n.apply(this,arguments)},t)for(var i in t)r[i]=t[i];var a=function(){this.constructor=r};if(a.prototype=n.prototype,r.prototype=new a,e)for(var o in e)r.prototype[o]=e[o];return r.extend=extend,r.__super__=n.prototype,r};entryExists=function(e,t,r){return!!(e&&e.contents&&e.contents[t]&&e.contents[t][r])};var Errors={};Errors.Base=extend.call(Error,{toString:function(){return this.name+": "+this.message}}),Errors.CustomError=Errors.Base.extend({constructor:function(e){this.name="CustomError",this.message=e,this.stack=(new Error).stack}}),Errors.CustomError.extend=extend,Errors.UnknownAcquisitionModeError=Errors.CustomError.extend({constructor:function(e){var t;t='PO files acquisition mode: "'+(e=e||"None provided")+'" is not valid.',Errors.CustomError.call(this,t),this.name="UnknownAcquisitionModeError"}});var Parser={Object:function(e){var r=1;for(var t in e)this[t]=e[t];this.setCount=function(e){r=e>>0},this.toString=function(){var e;if(!this.isPlural&&this.plural_forms&&this.plural_forms.push&&!!Parser.Object.calculatePluralIndex){var t=Parser.Object.calculatePluralIndex(r);e=this.plural_forms[t]}else e=this.translation;return e}}};Parser.POFiles={parse:function(text,translation_domain){var getTelltale,extractHeaderInfo,isMultilinePlural,multilineExtract;text=text||"",getTelltale=function(e){return e.substring(0,12).split(" ")[0].trim()},isMultilinePlural=function(e){return!!e&&e.match(/msgstr\[[0-9]\]/)},extractHeaderInfo=function(header){for(var header_lines=header.split("\n"),i=0,j=header_lines.length;i<j;i++){var header_line=header_lines[i];if(0===header_line.indexOf('"Plural-Forms: nplurals')){var plural_form=header_line.substring(14).slice(0,-1);Parser.Object.calculatePluralIndex=function(phrase_count){return eval(unescapeString(plural_form)),"undefined"==typeof plural&&(plural=0),plural}}}},multilineExtract=function(e){for(var t,r=[];t=e.shift();){if(0!==(t=t.trim()).indexOf('"')){e.unshift(t);break}r.push(t.substring(1).slice(0,-1))}return r.join("")};var parsed={},has_header_info,header_info,part,domain=void 0===translation_domain?"messages":translation_domain,counter=0,text=text.replace(/\r\n|\r/g,"\n"),parts;for(parsed[domain]={},parts=text.split(/\n\n/),header_info=parts.shift(),has_header_info=extractHeaderInfo(header_info),has_header_info?Parser.header_info=extractHeaderInfo(has_header_info):parts.unshift(header_info);part=parts.shift();){for(var message={},part_lines=part?part.split(/\n/):[],line="",escaped;line=part_lines.shift();){line=line.trim();var next_line=part_lines.slice(0,-1)[0],line_telltale=getTelltale(line),next_line_telltale=!!next_line&&getTelltale(next_line);switch(line_telltale){case"msgctxt":message.context=line.substring(9).slice(0,-1);break;case"msgid_plural":message.isPlural=!0,message.plural_id=line.substring(14).slice(0,-1);break;case"msgid":if(0===line.indexOf('msgid ""')){var possible=next_line.trim();0===possible.indexOf('"')&&(message.id=multilineExtract(part_lines))}else(next_line_telltale="msgstr")&&(message.id=line.substr(7).slice(0,-1));continue;case"msgstr":0===line.indexOf('msgstr ""')?(possible=next_line.trim(),0===possible.indexOf('"')&&(message.translation=multilineExtract(part_lines))):message.translation=line.substr(8).slice(0,-1);break;case"#:":case"#.":case"#":continue;case"#,":break;default:if(isMultilinePlural(line)){for(var cases=[];isMultilinePlural(line);)cases.push(line.substring(10).slice(0,-1)),line=part_lines.shift();message.plural_forms=cases,message.translation=cases[0]}continue}}message.id&&message.translation&&(message=new Parser.Object(message),escaped=escapeString(message.id),parsed[domain][message.id]?parsed[domain][escaped].push(message):parsed[domain][escaped]=[message]),counter++}return parsed},generate:function(){throw"Feature unimplemented"}};var Providers={Base:function(e){var r=this,n=[],s=Object.prototype.hasOwnProperty;r.domain=e,r.waiting=!0,r.notifyConsumers=function(e){for(var t in n)s.call(n,t)&&n[t].call(n[t],e);r.waiting=!0},r.done=function(e){n.push(e);var t=setInterval(function(){r.waiting||(r.notifyConsumers(r.parsed),clearInterval(t))},4)}}};Providers.Base.prototype={toString:function(){return"[object Adapter]"},getContents:function(){}},Providers.Base.extend=extend,Providers.String=Providers.Base.extend({constructor:function(e,t){Providers.Base.call(this,t),this.parsed=null,this.unparsed=""+e},getContents:function(){var e;if(!(e=Parser.POFiles.parse(this.unparsed,this.domain)))throw new Errors.ParsingError(this.unparsed);this.parsed=e,this.notifyConsumers(this.parsed)}}),isBrowser()?console.log("wat"):Providers.File=Providers.Base.extend({constructor:function(e,t){Providers.Base.call(this,t),this.path=""+e},getContents:function(){var r=this;instance.waiting=!0,r.waiting=!0,require("fs").readFile(this.path,"utf-8",function(e,t){if(e)throw new Errors.FileReaderError(e.path);r.parsed=Parser.POFiles.parse(t,r.domain),r.waiting=!1})}}),isBrowser()&&(Providers.Ajax=Providers.Base.extend({constructor:function(e,t){Providers.Base.call(this,t),this.url=e},doRequest:function(e,t,r){var n=new XMLHttpRequest,s=function(){};n.open("GET",e,!0),t=t||s,r=r||s;try{n.onreadystatechange=function(){var e={error:!0};4===this.readyState&&(200<=this.status&&this.status<400?(e=this.responseText,t.call(t,e)):r.call(r,e))},n.send()}catch(e){r.call(r,{error:!0})}n=null},getContents:function(){var r=this.domain,n=this;n.waiting=!0,this.doRequest(this.url,function(e){var t=new Providers.String(e,r);t.done(function(e){n.parsed=e,n.notifyConsumers(e)}),t.getContents()})}})),isBrowser()&&(Providers.Links=Providers.Ajax.extend({constructor:function(e){Providers.Ajax.call(this,e),this.domain=e},getContents:function(){var e,t=document.getElementsByTagName("link"),r=(Providers.Ajax,this);r.waiting=!0;for(var n=0,s=t.length;n<s;n++)(e=t[n])&&e.getAttribute("type")&&e.getAttribute("href")&&"text/x-gettext-translation"===e.getAttribute("type")&&(r.waiting=!0,this.doRequest(e.href,function(e){var t=new Providers.String(e,r.domain);t.done(function(e){r.parsed=e,r.notifyConsumers(e)}),t.getContents()}))}}));var Pomo=function(){var r,g=this;g.storage={},g.waiting=!0,g.VERSION="0.1.3",g.domain="messages",g.returnStrings=!1,g.unescapeStrings=!1,g.ready=function(e){r=e;var t=setInterval(function(){g.waiting||(clearInterval(t),r.call(r))},2)},g.wipe=function(){g.storage={},g.waiting=!0},g.load=function(e,t){t=t||{},g.waiting=!0;var r,n=!!t.mode&&t.mode,s=t.translation_domain?t.translation_domain:"messages";switch(n){case"literal":r=new Providers.String(e,s);break;case"file":r=new Providers.File(e,s);break;case"link":r=new Providers.Links(s);break;case"ajax":r=new Providers.Ajax(e,s);break;default:throw new Errors.UnknownAcquisitionModeError(n)}return r.done(function(e){g.storage.contents=e,g.waiting=!1}),r.getContents(),this},g.getText=function(e,t){e=e.split(/\n/).join("");var r=(t=t||{}).variables?t.variables:[],n=!!t.context&&t.context,s=t.domain?t.domain:"messages",i=!!t.count&&t.count,a=t.error?t.error:noop,o=escapeString(e);if(s||g.domain?(s&&g.domain,g.domain=s):s=g.domain="messages",entryExists(g.storage,s,o)){var l=g.storage.contents[s][o];if(n)for(var c=0,u=l.length;c<u;c++)if(l[c].context&&l[c].context===n){l=l[c];break}l.unshift&&(l=l[0]),i&&l.setCount(i);var f=l,p=l.constructor===String();if(g.returnStrings&&(f=l.toString()),r){var d=p?f:f.translation,h=vsprintf(d,r);p?f=h:f.translation=h}return p&&g.unescapeStrings?f=unescapeString(f):g.unescapeStrings&&!p&&(f.translation=unescapeString(f.translation)),f}if(a===noop)throw new Errors.UnknownEntryError(e,s);a(a,e,s,g.storage.contents)}};instance=new Pomo,"undefined"!=typeof module?module.exports=instance:window.Pomo=instance}(this);