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