From ae0818a8e5d7b17310da3ad9fc6c2a5857057303 Mon Sep 17 00:00:00 2001 From: Nikolaos Trogkanis Date: Tue, 23 Apr 2013 19:57:54 +0000 Subject: [PATCH] JS: Add build.xml to compile and lint the code. Updated README with instructions how to compile and use the library. Use demo.js and demo-compiled.js as example. Checking in demo-compiled.html and js to be linked from the project home page. Review URL: https://codereview.appspot.com/8889044 --- javascript/README | 44 +- javascript/build.xml | 137 +++++ javascript/compile.sh | 93 ---- .../i18n/phonenumbers/demo-compiled.html | 53 ++ javascript/i18n/phonenumbers/demo-compiled.js | 507 ++++++++++++++++++ javascript/i18n/phonenumbers/demo.html | 134 +---- javascript/i18n/phonenumbers/demo.js | 161 ++++++ 7 files changed, 899 insertions(+), 230 deletions(-) create mode 100644 javascript/build.xml delete mode 100755 javascript/compile.sh create mode 100644 javascript/i18n/phonenumbers/demo-compiled.html create mode 100644 javascript/i18n/phonenumbers/demo-compiled.js create mode 100644 javascript/i18n/phonenumbers/demo.js diff --git a/javascript/README b/javascript/README index 9809c85301..76b42cb6b0 100644 --- a/javascript/README +++ b/javascript/README @@ -6,14 +6,20 @@ international phone numbers. How to setup: ============= -1. Checkout closure-library next to libphonenumber: +1. Checkout closure-library, closure-compiler, closure-linter and python-gflags + next to libphonenumber: e.g. svn checkout http://libphonenumber.googlecode.com/svn/trunk/ ~/src/libphonenumber svn checkout http://closure-library.googlecode.com/svn/trunk/ ~/src/closure-library +svn checkout http://closure-compiler.googlecode.com/svn/trunk/ ~/src/closure-compiler +svn checkout http://closure-linter.googlecode.com/svn/trunk/ ~/src/closure-linter +svn checkout http://python-gflags.googlecode.com/svn/trunk/ ~/src/python-gflags -(Or change the path of the + + + +

Phone Number Parser Demo

+ +
+

+ Specify a Phone Number: + +

+

+ Specify a Default Country: + + (ISO 3166-1 two-letter country code) +

+

+ Specify a Carrier Code: + + (optional, only valid for some countries) +

+ + +

+ +

+
+ + + diff --git a/javascript/i18n/phonenumbers/demo-compiled.js b/javascript/i18n/phonenumbers/demo-compiled.js new file mode 100644 index 0000000000..e3db7e6208 --- /dev/null +++ b/javascript/i18n/phonenumbers/demo-compiled.js @@ -0,0 +1,507 @@ +(function(){function i(a){throw a;}var j=void 0,k=!0,l=null,m=!1,p=this; +function aa(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null"; +else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function q(a,b){function c(){}c.prototype=b.prototype;a.La=b.prototype;a.prototype=new c;a.prototype.constructor=a};var ba=Array.prototype,ca=ba.indexOf?function(a,b,c){return ba.indexOf.call(a,b,c)}:function(a,b,c){c=c==l?0:0>c?Math.max(0,a.length+c):c;if("string"==typeof a)return"string"!=typeof b||1!=b.length?-1:a.indexOf(b,c);for(;cb?1:aparseFloat(oa)){na=String(ra);break a}}na=oa}var sa={}; +function ta(a){if(!sa[a]){for(var b=0,c=String(na).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),d=String(a).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),e=Math.max(c.length,d.length),f=0;0==b&&f +(0==z[1].length?0:parseInt(z[1],10))?1:0)||((0==r[2].length)<(0==z[2].length)?-1:(0==r[2].length)>(0==z[2].length)?1:0)||(r[2]z[2]?1:0)}while(0==b)}sa[a]=0<=b}}var ua=p.document,va=!ua||!u?j:ma()||("CSS1Compat"==ua.compatMode?parseInt(na,10):5);if(ka||u){var wa;if(wa=u)wa=u&&9<=va;wa||ka&&ta("1.9.1")}u&&ta("9");function xa(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b}function ya(a,b){var c;a:{for(c in a)if(b.call(j,a[c],c,a))break a;c=j}return c&&a[c]};function za(a){return"string"==typeof a?document.getElementById(a):a};function Aa(a){return(new Ba(j)).ca(a)}function Ba(a){this.ga=a}Ba.prototype.ca=function(a){var b=[];Ca(this,a,b);return b.join("")}; +function Ca(a,b,c){switch(typeof b){case "string":Da(b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==l){c.push("null");break}if("array"==aa(b)){var d=b.length;c.push("[");for(var e="",f=0;fb?e+="000":256>b?e+="00":4096>b&&(e+="0");return Ea[a]=e+b.toString(16)}),'"')};function Ga(a,b,c){this.za=a;this.oa=b.name||l;this.Sa=b.$||l;this.sa=b.Ra;this.l={};for(a=0;a=e){a=c;break}d=d.substring(0,e);d=Q(d,N);if(0==d.length){a=c;break}g=Va(g);Ta(g,4);d=[g];g=b.g();c=S(b);g in L?(a=U(a,g,V(g)),e="",e=Cb(d,c),e==l?e=c:(d=Va(e),e=D(e,4),0=e):-1!=Fb(b,e)} +function Gb(a,b){if(b==l)return l;var c=b.g(),c=L[c];if(c==l)c=l;else if(1==c.length)c=c[0];else a:{for(var d=S(b),e,f=c.length,g=0;gc?2:16=f&&f<=e;++f)if(d=parseInt(c.substring(0,f),10),d in L)return b.append(c.substring(f)),d;return 0} +function Kb(a,b,c,d,e){if(0==a.length)return 0;a=new G(a);var f;b!=l&&(f=A(b,11));f==l&&(f="NonMatch");var g=a.toString();if(0==g.length)f=20;else if(O.test(g))g=g.replace(O,""),a.clear(),a.append(P(jb,g)?Q(g,cb):Q(g,N)),f=1;else{g=RegExp(f);tb(a);f=a.toString();if(0==f.search(g)){var g=f.match(g)[0].length,h=f.substring(g).match(fb);h&&(h[1]!=l&&0=a.h.length&&i("Phone number too short after IDD"); +f=Jb(a,c);if(0!=f)return e.da(f),f;i("Invalid country calling code")}if(b!=l&&(f=b.g(),g=""+f,h=a.toString(),0==h.lastIndexOf(g,0))){var n=new G(h.substring(g.length)),h=A(b,1),g=RegExp(D(h,2));Lb(n,b,l);b=n.toString();h=D(h,3);if(!P(g,a.toString())&&P(g,b)||3==(P(h,a.toString())?0:0==a.toString().search(h)?3:2))return c.append(b),d&&B(e,6,10),e.da(f),f}e.da(0);return 0} +function Lb(a,b,c){var d=a.toString(),e=d.length,f=A(b,15);if(!(0==e||f==l||0==f.length))if(f=RegExp("^(?:"+f+")"),e=f.exec(d)){var g=RegExp,h;h=A(b,1);h=D(h,2);g=g(h);h=e.length-1;var n=A(b,16),f=(b=n==l||0==n.length||e[h]==l||0==e[h].length)?d.substring(e[0].length):d.replace(f,n);if(!P(g,d)||P(g,f))(b&&0e.toString().length?0:P(lb,e.toString()))|| +i("The string supplied did not seem to be a phone number");ub(c)||e.toString()!=l&&0b.substring(0,g).length?0:P(lb,b.substring(0,g))))for(var h=b.match(kb),n=h.length,w=1;wg.h.length&&i("The string supplied is too short to be a phone number");b!=l&&(a=new G,Lb(g,b,a),d&&B(f,7,a.toString()));d=g.toString();a=d.length;2>a&&i("The string supplied is too short to be a phone number");16d?(g=D(g,3,d),0==b.search(g)&&c.push(a.i[f])):c.push(a.i[f])}a.i=c}Nb.prototype.clear=function(){this.ja="";this.m.clear();this.w.clear();this.r.clear();this.ba=0;this.ea="";this.d.clear();this.v="";this.b.clear();this.o=k;this.ma=m;this.Ia=this.Ka=0;this.aa=this.u=m;this.i=[];this.ha=m;this.k!=this.Fa&&(this.k=Ob(this,this.ka))};function Wb(a,b){a.ja=Xb(a,b);return a.ja} +function Xb(a,b){a.m.append(b);if(fb.test(b)||1==a.m.h.length&&eb.test(b)){var c=b,d;"+"==c?(d=c,a.w.append(c)):(d=N[c],a.w.append(d),a.b.append(d));b=d}else a.o=m,a.ma=k;if(!a.o){if(!a.ma)if(Yb(a)){if(Zb(a))return $b(a)}else if(0Phone Number Parser Demo + - -

Phone Number Parser Demo

diff --git a/javascript/i18n/phonenumbers/demo.js b/javascript/i18n/phonenumbers/demo.js new file mode 100644 index 0000000000..b5bfaa39ed --- /dev/null +++ b/javascript/i18n/phonenumbers/demo.js @@ -0,0 +1,161 @@ +/** + * @license + * Copyright (C) 2010 The Libphonenumber Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Phone Number Parser Demo. + * + * @author Nikolaos Trogkanis + */ + +goog.require('goog.dom'); +goog.require('goog.json'); +goog.require('goog.proto2.ObjectSerializer'); +goog.require('goog.string.StringBuffer'); +goog.require('i18n.phonenumbers.AsYouTypeFormatter'); +goog.require('i18n.phonenumbers.PhoneNumberFormat'); +goog.require('i18n.phonenumbers.PhoneNumberType'); +goog.require('i18n.phonenumbers.PhoneNumberUtil'); +goog.require('i18n.phonenumbers.PhoneNumberUtil.ValidationResult'); + + +function phoneNumberParser() { + var $ = goog.dom.getElement; + var phoneNumber = $('phoneNumber').value; + var regionCode = $('defaultCountry').value; + var carrierCode = $('carrierCode').value; + var output = new goog.string.StringBuffer(); + try { + var phoneUtil = i18n.phonenumbers.PhoneNumberUtil.getInstance(); + var number = phoneUtil.parseAndKeepRawInput(phoneNumber, regionCode); + output.append('****Parsing Result:****\n'); + output.append(goog.json.serialize(new goog.proto2.ObjectSerializer( + goog.proto2.ObjectSerializer.KeyOption.NAME).serialize(number))); + output.append('\n\n****Validation Results:****'); + var isPossible = phoneUtil.isPossibleNumber(number); + output.append('\nResult from isPossibleNumber(): '); + output.append(isPossible); + if (!isPossible) { + output.append('\nResult from isPossibleNumberWithReason(): '); + var PNV = i18n.phonenumbers.PhoneNumberUtil.ValidationResult; + switch (phoneUtil.isPossibleNumberWithReason(number)) { + case PNV.INVALID_COUNTRY_CODE: + output.append('INVALID_COUNTRY_CODE'); + break; + case PNV.TOO_SHORT: + output.append('TOO_SHORT'); + break; + case PNV.TOO_LONG: + output.append('TOO_LONG'); + break; + } + // IS_POSSIBLE shouldn't happen, since we only call this if _not_ + // possible. + output.append('\nNote: numbers that are not possible have type ' + + 'UNKNOWN, an unknown region, and are considered invalid.'); + } else { + var isNumberValid = phoneUtil.isValidNumber(number); + output.append('\nResult from isValidNumber(): '); + output.append(isNumberValid); + if (isNumberValid && regionCode && regionCode != 'ZZ') { + output.append('\nResult from isValidNumberForRegion(): '); + output.append(phoneUtil.isValidNumberForRegion(number, regionCode)); + } + output.append('\nPhone Number region: '); + output.append(phoneUtil.getRegionCodeForNumber(number)); + output.append('\nResult from getNumberType(): '); + var PNT = i18n.phonenumbers.PhoneNumberType; + switch (phoneUtil.getNumberType(number)) { + case PNT.FIXED_LINE: + output.append('FIXED_LINE'); + break; + case PNT.MOBILE: + output.append('MOBILE'); + break; + case PNT.FIXED_LINE_OR_MOBILE: + output.append('FIXED_LINE_OR_MOBILE'); + break; + case PNT.TOLL_FREE: + output.append('TOLL_FREE'); + break; + case PNT.PREMIUM_RATE: + output.append('PREMIUM_RATE'); + break; + case PNT.SHARED_COST: + output.append('SHARED_COST'); + break; + case PNT.VOIP: + output.append('VOIP'); + break; + case PNT.PERSONAL_NUMBER: + output.append('PERSONAL_NUMBER'); + break; + case PNT.PAGER: + output.append('PAGER'); + break; + case PNT.UAN: + output.append('UAN'); + break; + case PNT.UNKNOWN: + output.append('UNKNOWN'); + break; + } + } + var PNF = i18n.phonenumbers.PhoneNumberFormat; + output.append('\n\n****Formatting Results:**** '); + output.append('\nE164 format: '); + output.append(isNumberValid ? + phoneUtil.format(number, PNF.E164) : + 'invalid'); + output.append('\nOriginal format: '); + output.append(phoneUtil.formatInOriginalFormat(number, regionCode)); + output.append('\nNational format: '); + output.append(phoneUtil.format(number, PNF.NATIONAL)); + output.append('\nInternational format: '); + output.append(isNumberValid ? + phoneUtil.format(number, PNF.INTERNATIONAL) : + 'invalid'); + output.append('\nOut-of-country format from US: '); + output.append(isNumberValid ? + phoneUtil.formatOutOfCountryCallingNumber(number, 'US') : + 'invalid'); + output.append('\nOut-of-country format from Switzerland: '); + output.append(isNumberValid ? + phoneUtil.formatOutOfCountryCallingNumber(number, 'CH') : + 'invalid'); + if (carrierCode.length > 0) { + output.append('\nNational format with carrier code: '); + output.append(phoneUtil.formatNationalNumberWithCarrierCode(number, + carrierCode)); + } + output.append('\n\n****AsYouTypeFormatter Results****'); + var formatter = new i18n.phonenumbers.AsYouTypeFormatter(regionCode); + var phoneNumberLength = phoneNumber.length; + for (var i = 0; i < phoneNumberLength; ++i) { + var inputChar = phoneNumber.charAt(i); + output.append('\nChar entered: '); + output.append(inputChar); + output.append(' Output: '); + output.append(formatter.inputDigit(inputChar)); + } + } catch (e) { + output.append('\n' + e); + } + $('output').value = output.toString(); + return false; +} + +goog.exportSymbol('phoneNumberParser', phoneNumberParser);