diff --git a/README.md b/README.md index af24730..cd0793d 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ are targetting. Note that if no culture files are included, the invariant culture will be used. ```HTML - - - + + + ``` Then you're ready to go. Here are two simple examples using indexes and object diff --git a/dist/license.txt b/dist/license.txt index 893a59e..806c71c 100644 --- a/dist/license.txt +++ b/dist/license.txt @@ -2,9 +2,9 @@ --------------------------------------------------------------------------- String.format for JavaScript -Copyright (c) 2009-2019 Daniel Mester Pirttijärvi +Copyright (c) 2009-2020 Daniel Mester Pirttijärvi -The library core (stringformat-1.16.1.js and stringformat-1.16.1.min.js) is +The library core (stringformat-1.17.0.js and stringformat-1.17.0.min.js) is licensed under the terms of the zlib license. * * * diff --git a/dist/readme.txt b/dist/readme.txt index ceb2aa0..bb2e741 100644 --- a/dist/readme.txt +++ b/dist/readme.txt @@ -1,10 +1,10 @@ -String.format for JavaScript 1.16.1 +String.format for JavaScript 1.17.0 https://github.com/dmester/sffjs -Built: 2019-07-22T15:12:09.052Z +Built: 2020-10-18T11:11:41.809Z -Copyright (c) 2009-2019 Daniel Mester Pirttijärvi +Copyright (c) 2009-2020 Daniel Mester Pirttijärvi DESCRIPTION @@ -18,8 +18,8 @@ FILES You got a number of files when you extracted the script library: -stringformat-1.16.1.min.js - Compressed and obfuscated, to be used in production. -stringformat-1.16.1.js - Commented source file for your reference. +stringformat-1.17.0.min.js - Compressed and obfuscated, to be used in production. +stringformat-1.17.0.js - Commented source file for your reference. stringformat.d.ts - TypeScript definition file. tests.html - Test page that performs unit tests on the library. stringformat.tests.js - Script for tests.html. @@ -33,7 +33,7 @@ are targetting. Note that if no culture files are included, the invariant culture will be used. [CODE] - + diff --git a/dist/stringformat.d.ts b/dist/stringformat.d.ts index 36eaa3c..b7a7dfd 100644 --- a/dist/stringformat.d.ts +++ b/dist/stringformat.d.ts @@ -1,10 +1,10 @@ /* - * String.format for JavaScript 1.16.1 + * String.format for JavaScript 1.17.0 * https://github.com/dmester/sffjs * - * Built: 2019-07-22T15:12:09.052Z + * Built: 2020-10-18T11:11:41.809Z * - * Copyright (c) 2009-2019 Daniel Mester Pirttijärvi + * Copyright (c) 2009-2020 Daniel Mester Pirttijärvi * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -47,13 +47,152 @@ declare namespace sffjs { __Format(formatString?: string): string; } + /** + * Provides date/time and number formatting information about a specific culture. + */ + interface CultureInfo { + /** + * IETF language tag. + * @default "" + */ + name: string; + /** + * Full month names. + * @default ["January","February","March","April","May","June","July","August","September","October","November","December"] + */ + _M: string[]; + /** + * Short month names. + * @default ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"] + */ + _m: string[]; + /** + * Full weekday names starting with Sunday. + * @default ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"] + */ + _D: string[]; + /** + * Short weekday names starting with Sunday. + * @default ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"] + */ + _d: string[]; + /** + * Decimal separator + * @default "." + */ + _r: string; + /** + * Thousands separator + * @default "," + */ + _t: string; + /** + * Currency format string + * @default "¤#,0.00" + */ + _c: string; + /** + * Decimal separator for currency formatting + * @default "." + */ + _cr: string; + /** + * Thousands separator for currency formatting + * @default "," + */ + _ct: string; + /** + * AM (before noon) designator + * @default "AM" + */ + _am: string; + /** + * PM (after noon) designator + * @default "PM" + */ + _pm: string; + /** + * Sortable date/time format + * @default "yyyy-MM-ddTHH:mm:ss" + */ + s: string; + /** + * Short date format + * @default "MM/dd/yyyy" + */ + d: string; + /** + * Long date format + * @default "dddd, dd MMMM yyyy" + */ + D: string; + /** + * Short time format + * @default "HH:mm" + */ + t: string; + /** + * Long time format + * @default "HH:mm:ss" + */ + T: string; + /** + * Long date with short time + * @default "dddd, dd MMMM yyyy HH:mm" + */ + f: string; + /** + * Long date with long time + * @default "dddd, dd MMMM yyyy HH:mm:ss" + */ + F: string; + /** + * Short date with short time + * @default "MM/dd/yyyy HH:mm" + */ + g: string; + /** + * Short date with long time + * @default "MM/dd/yyyy HH:mm:ss" + */ + G: string; + /** + * Month/day format + * @default "MMMM dd" + */ + M: string; + /** + * Year/month format + * @default "yyyy MMMM" + */ + Y: string; + } + + /** + * Registers a culture object and reevaluates which culture to be used. Missing properties + * are filled with information from the invariant culture. + * + * This function is automatically called when a sffjs bundled culture file is loaded. + */ + function registerCulture(culture: Partial): void; + /** * Sets the specified culture. This command has no effect unless you also load the corresponding culture file. * Sffjs does not come with a culture file autoloader. * - * @param culture IETF language code. + * @param culture IETF language tag. */ function setCulture(culture: string): void; + + /** + * Gets a list of all registered cultures. The invariant culture is included with an empty string as name. + */ + function getCultures(): CultureInfo[]; + + /** + * Gets the culture currently in use. + */ + const LC: CultureInfo; } interface StringConstructor { diff --git a/dist/stringformat.js b/dist/stringformat.js index ec91bf9..3e4e77d 100644 --- a/dist/stringformat.js +++ b/dist/stringformat.js @@ -1,10 +1,10 @@ /** - * String.format for JavaScript 1.16.1 + * String.format for JavaScript 1.17.0 * https://github.com/dmester/sffjs * - * Built: 2019-07-22T15:11:55.991Z + * Built: 2020-10-18T11:11:31.521Z * - * Copyright (c) 2009-2019 Daniel Mester Pirttijärvi + * Copyright (c) 2009-2020 Daniel Mester Pirttijärvi * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -35,7 +35,7 @@ var sffjs = (function() { * The version of the library String.Format for JavaScript. * @type string */ - version: "1.16.1", + version: "1.17.0", /** * Sets the current culture, used for culture specific formatting. @@ -55,7 +55,18 @@ var sffjs = (function() { // ...and reevaulate current culture updateCulture(); - } + }, + + /** + * Gets an array of all registered cultures. + */ + getCultures: function () { + var result = [INVARIANT_CULTURE]; + for (var key in cultures) { + result.push(cultures[key]); + } + return result; + }, }, // ***** Shortcuts ***** @@ -96,7 +107,7 @@ var sffjs = (function() { currentCultureId = typeof navigator != "undefined" && (navigator.systemLanguage || navigator.language) || "", // Holds all registered external cultures, i.e. not the invariant culture - cultures = {}; + cultures = Object.create(null); // ***** Private Methods ***** @@ -139,7 +150,9 @@ var sffjs = (function() { function fillGapsInCulture(culture) { // Add missing formats from the culture template for (var key in CULTURE_TEMPLATE) { - culture[key] = culture[key] || CULTURE_TEMPLATE[key]; + if (CULTURE_TEMPLATE.hasOwnProperty(key) && culture[key] == null) { + culture[key] = CULTURE_TEMPLATE[key]; + } } // Construct composite formats if they are not already defined diff --git a/dist/stringformat.min.js b/dist/stringformat.min.js index 670fec1..886f86c 100644 --- a/dist/stringformat.min.js +++ b/dist/stringformat.min.js @@ -1,13 +1,13 @@ -// sffjs 1.16.1 | https://github.com/dmester/sffjs | zlib licensed | (c) 2009-2019 Daniel Mester Pirttijärvi -var sffjs=function(){function p(a,b){for(a=""+a;a.lengthb){for(;0>++b;)a="0"+a;a="0."+a}else for(;b>=a.length;)a+="0";return a}function D(a, -b){a=H(Math.abs(a).toString());var k=a.indexOf(".");0b&&(a=H(Number(a+"1").toFixed(b)),0b?a.length:b}function t(a,b){for(var k=0,d=b.length;ka&&c.push("-");a=D(a,d);d=c.g=I(a);e=a;var g=e.indexOf(".");e=0>g?0:e.length-g-1;for(b-=d;0g;)g*= -10,a--;f=f[1];var h=3;if("G"==e){c=c||15;if(-5b&&(g*=-1);return v(g,1,e,c,k,d)+f+v(a,h,0,0);case "P":return v(100*b,1,u(c,2),u(c,2),k,d)+" %";case "X":b=Math.round(b).toString(16);"X"==f[1]&&(b=b[x]());for(c-=b.length;0m?void 0:m)));if(0>m)break;e=m}else if("\\"==m)q.push(new String(c[++e]));else if(";"==m){if(0b&&1b&&1d&&(d=h)),1==z||n||(f.t=r,z=1),h+=!n):"."===m?n=1:","===m&&!n&&0d?1:h-d;0>b&&f.push("-");b=D(b*z,p);r=I(b);h=r-h;f.g=Math.max(r,d); -for(e=0;e=r-d&&t(f,"0"),g=0):(0=b.length?"0":b[h]),h++):"."===m?(b.length>++h||0r?-r:r;a=a||"G";1==a.length&& -(a=l[a]||a);return a.replace(/^%/,"").replace(/(\\.|'[^']*'|"[^"]*"|d{1,4}|M{1,4}|y+|HH?|hh?|mm?|ss?|[f]{1,7}|[F]{1,7}|z{1,3}|tt?)/g,function(a){var n=a[0];return"dddd"==a?l._D[f]:"ddd"==a?l._d?l._d[f]:l._D[f].substr(0,3):"d"==n?p(d,a.length):"MMMM"==a?l._M[k]:"MMM"==a?l._m?l._m[k]:l._M[k].substr(0,3):"M"==n?p(k+1,a.length):"yy"==a?p(b%100,2):"y"==a?b%100:"y"==n?p(b,a.length):"H"==n?p(e,a.length):"h"==n?p(e%12||12,a.length):"m"==n?p(c,a.length):"s"==n?p(g,a.length):"f"==n?h.toFixed(a.length).substr(2): -"F"==n?D(h,a.length).substr(2):"z"==n?(0>r?"-":"+")+p(0|q/60,"z"==a?1:2)+("zzz"==a?":"+p(q%60,2):""):"tt"==a?12>e?l._am:l._pm:"t"==n?(12>e?l._am:l._pm)[0]:a.substr(1,a.length-1-("\\"!=a[0]))})};String.__Format=function(a,b,k,d){var f=arguments;return a.replace(/\{((\d+|[a-zA-Z_$]\w*(?:\.[a-zA-Z_$]\w*|\[\d+\])*)(?:,(-?\d*))?(?::([^\}]*(?:(?:\}\})+[^\}]+)*))?)\}|(\{\{)|(\}\})/g,function(){var a=arguments;if(a[5])var b="{";else if(a[6])b="}";else{var g=a[2];b=a[3];var h=a[4]&&a[4].replace(/\}\}/g,"}").replace(/\{\{/g, -"{"),d=parseInt(g,10);a="";if(isNaN(d)){d=f[1];if(null!=d){var k=/(\.([a-zA-Z_$]\w*)|\[(\d+)\])/g,l=/^[a-zA-Z_$]\w*/.exec(g);for(d=d[l[0]];null!=d&&(l=k.exec(g));)d=d[l[2]||Number(l[3])]}g=d}else{if(d>f.length-2)throw"Missing argument";g=f[d+1]}g=null!=g?g.__Format?g.__Format(h):""+g:"";b=Number(b)||0;for(h=Math.abs(b)-g.length;0b?g+a:a+g}return b})};for(var A=[Date.prototype,Number.prototype,String],q=0,K=A.length;qb){for(;0>++b;)a="0"+a;a="0."+a}else for(;b>=a.length;)a+= +"0";return a}function E(a,b){a=I(Math.abs(a).toString());var k=a.indexOf(".");0b&&(a=I(Number(a+"1").toFixed(b)),0b?a.length:b}function t(a,b){for(var k=0,d=b.length;ka&&c.push("-");a=E(a,d);d=c.g=J(a);e=a;var g=e.indexOf(".");e=0>g?0:e.length-g-1;for(b-=d;0g;)g*=10,a--;f=f[1];var h=3;if("G"==e){c=c||15;if(-5b&&(g*=-1);return v(g,1,e,c,k,d)+f+v(a,h,0,0);case "P":return v(100*b,1,u(c,2),u(c,2),k,d)+" %";case "X":b=Math.round(b).toString(16);"X"==f[1]&&(b=b[x]());for(c-=b.length;0m?void 0:m)));if(0>m)break;e=m}else if("\\"==m)q.push(new String(c[++e]));else if(";"==m){if(0b&&1b&&1d&&(d=h)),1==A||n||(f.t=r,A=1),h+=!n):"."===m?n=1:","===m&&!n&&0d? +1:h-d;0>b&&f.push("-");b=E(b*A,p);r=J(b);h=r-h;f.g=Math.max(r,d);for(e=0;e=r-d&&t(f,"0"),g=0):(0=b.length?"0":b[h]),h++):"."===m?(b.length>++h||0r?-r:r;a=a||"G";1==a.length&&(a=l[a]||a);return a.replace(/^%/,"").replace(/(\\.|'[^']*'|"[^"]*"|d{1,4}|M{1,4}|y+|HH?|hh?|mm?|ss?|[f]{1,7}|[F]{1,7}|z{1,3}|tt?)/g,function(a){var n=a[0];return"dddd"==a?l._D[f]:"ddd"==a?l._d?l._d[f]:l._D[f].substr(0,3):"d"==n?p(d,a.length):"MMMM"==a?l._M[k]:"MMM"==a?l._m?l._m[k]:l._M[k].substr(0,3):"M"==n?p(k+1,a.length):"yy"==a?p(b%100,2):"y"==a?b%100:"y"==n?p(b,a.length):"H"==n?p(e,a.length):"h"==n?p(e%12||12,a.length):"m"==n?p(c, +a.length):"s"==n?p(g,a.length):"f"==n?h.toFixed(a.length).substr(2):"F"==n?E(h,a.length).substr(2):"z"==n?(0>r?"-":"+")+p(0|q/60,"z"==a?1:2)+("zzz"==a?":"+p(q%60,2):""):"tt"==a?12>e?l._am:l._pm:"t"==n?(12>e?l._am:l._pm)[0]:a.substr(1,a.length-1-("\\"!=a[0]))})};String.__Format=function(a,b,k,d){var f=arguments;return a.replace(/\{((\d+|[a-zA-Z_$]\w*(?:\.[a-zA-Z_$]\w*|\[\d+\])*)(?:,(-?\d*))?(?::([^\}]*(?:(?:\}\})+[^\}]+)*))?)\}|(\{\{)|(\}\})/g,function(){var a=arguments;if(a[5])var b="{";else if(a[6])b= +"}";else{var g=a[2];b=a[3];var h=a[4]&&a[4].replace(/\}\}/g,"}").replace(/\{\{/g,"{"),d=parseInt(g,10);a="";if(isNaN(d)){d=f[1];if(null!=d){var k=/(\.([a-zA-Z_$]\w*)|\[(\d+)\])/g,l=/^[a-zA-Z_$]\w*/.exec(g);for(d=d[l[0]];null!=d&&(l=k.exec(g));)d=d[l[2]||Number(l[3])]}g=d}else{if(d>f.length-2)throw"Missing argument";g=f[d+1]}g=null!=g?g.__Format?g.__Format(h):""+g:"";b=Number(b)||0;for(h=Math.abs(b)-g.length;0b?g+a:a+g}return b})};for(var B=[Date.prototype,Number.prototype,String], +y=0,K=B.length;y