comparison src/implab/text/format.js @ 0:fc2517695ee1

Initial commit, draft import of existing work
author cin
date Thu, 01 Jun 2017 13:20:03 +0300
parents
children 93fb6c09f2e1
comparison
equal deleted inserted replaced
-1:000000000000 0:fc2517695ee1
1 define([
2 "./safe",
3 "./format-compile",
4 "dojo/number",
5 "dojo/date/locale",
6 "dojo/_base/array" ], function(safe, compile, number, date, array) {
7
8 // {short,medium,full,long}-{date,time}
9 var convert = function(value, pattern) {
10 if (!pattern)
11 return value.toString();
12
13 if (pattern.toLocaleLowerCase() == "json") {
14 var cache = [];
15 return JSON.stringify(value, function(k, v) {
16 if (!safe.isPrimitive(v)) {
17 var id = array.indexOf(cache, v);
18 if (id >= 0)
19 return "@ref-" + id;
20 else
21 return v;
22 } else {
23 return v;
24 }
25 });
26 }
27
28 if (safe.isNumber(value)) {
29 var nopt = {};
30 if (pattern.indexOf("!") === 0) {
31 nopt.round = -1;
32 pattern = pattern.substr(1);
33 }
34 nopt.pattern = pattern;
35 return number.format(value, nopt);
36 } else if (value instanceof Date) {
37 var m = pattern.match(/^(\w+)-(\w+)$/);
38 if (m)
39 return date.format(value, {
40 selector : m[2],
41 formatLength : m[1]
42 });
43 else
44 return date.format(value, {
45 selector : "date",
46 datePattern : pattern
47 });
48 } else {
49 return value.toString(pattern);
50 }
51 };
52
53 function formatter(format) {
54 var data;
55
56 if (arguments.length <= 1)
57 return format;
58
59 data = Array.prototype.slice.call(arguments, 1);
60
61 var template = compile(format);
62
63 return template(function(name, pattern) {
64 var value = data[name];
65 return !safe.isNull(value) ? convert(value, pattern) : "";
66 });
67 }
68
69 formatter.compile = function(format) {
70 var template = compile(format);
71
72 return function() {
73 var data = arguments;
74
75 return template(function(name, pattern) {
76 var value = data[name];
77 return !safe.isNull(value) ? convert(value, pattern) : "";
78 });
79 };
80 };
81
82 formatter.convert = convert;
83
84 return formatter;
85 });