UNPKG

5.72 kBJavaScriptView Raw
1/**
2 * @copyright Copyright (c) 2019 Maxim Khorin <maksimovichu@gmail.com>
3 */
4'use strict';
5
6const Base = require('../base/Component');
7
8module.exports = class Formatter extends Base {
9
10 static getConstants () {
11 return {
12 KiB: 1024,
13 MiB: 1024 * 1024,
14 GiB: 1024 * 1024 * 1024,
15 TiB: 1024 * 1024 * 1024 * 1024,
16 };
17 }
18
19 static getMethodName (type) {
20 return `as${StringHelper.toFirstUpperCase(type)}`;
21 }
22
23 constructor (config) {
24 super({
25 language: config.i18n ? config.i18n.language : 'en',
26 nullFormat: '<span class="not-set">[not set]</span>',
27 booleanFormat: ['No', 'Yes'],
28 byteFractionalPart: 100,
29 dateFormat: 'L',
30 dateLongFormat: 'LL',
31 timeFormat: 'LT',
32 timeLongFormat: 'LTS',
33 datetimeFormat: 'LLL',
34 timestampFormat: 'L LTS',
35 ...config
36 });
37 }
38
39 format (value, type, params) {
40 if (!type) {
41 return this.asRaw(value, params);
42 }
43 const name = this.constructor.getMethodName(type);
44 if (typeof this[name] === 'function') {
45 return this[name](value, params);
46 }
47 this.log('error', `Unknown type: ${type}`);
48 return this.asRaw(value, params);
49 }
50
51 translate (message, source, language) {
52 return this.i18n
53 ? this.i18n.translate(message, null, source, language || this.language)
54 : message;
55 }
56
57 asRaw (value, params = {}) {
58 return value === null || value === undefined
59 ? this.translate(this.nullFormat, I18n.CORE_SOURCE, params.language)
60 : value;
61 }
62
63 asBoolean (value, params = {}) {
64 if (value === null || value === undefined) {
65 return this.translate(this.nullFormat, I18n.CORE_SOURCE, params.language);
66 }
67 value = this.booleanFormat[value ? 1 : 0];
68 return this.translate(value, I18n.CORE_SOURCE, params.language);
69 }
70
71 asBytes (value, params = {}) {
72 if (value === null || value === undefined) {
73 return this.translate(this.nullFormat, I18n.CORE_SOURCE, params.language);
74 }
75 let unit;
76 if (value < this.KiB) {
77 unit = 'B';
78 } else if (value < this.MiB) {
79 unit = 'KiB';
80 value /= this.KiB;
81 } else if (value < this.GiB) {
82 unit = 'MiB';
83 value /= this.MiB;
84 } else if (value < this.TiB) {
85 unit = 'GiB';
86 value /= this.GiB;
87 } else {
88 unit = 'TiB';
89 value /= this.TiB;
90 }
91 value = Math.round(value * this.byteFractionalPart) / this.byteFractionalPart;
92 unit = this.translate(unit, I18n.CORE_SOURCE, params.language);
93 return `${value} ${unit}`;
94 }
95
96 asUrl (value, params = {}) {
97 return value
98 ? `<a href="${value}" class="${params.className || ''}" target="${params.target || ''}">${params.text || value}</a>`
99 : this.asRaw(value, params);
100 }
101
102 // DATE
103
104 asDate (value, params = {}) {
105 return value
106 ? moment(value).locale(params.language || this.language).format(params.format || this.dateFormat)
107 : this.asRaw(value, params);
108 }
109
110 asDateLong (value, params) {
111 return this.asDate(value, {format: this.dateLongFormat, ...params});
112 }
113
114 asDuration (value, params = {}) {
115 return value || value === 0
116 ? moment.duration(value, params.units).locale(params.language || this.language).humanize(params.suffix)
117 : this.asRaw(value, params);
118 }
119
120 asTime (value, params) {
121 return this.asDate(value, {format: this.timeFormat, ...params});
122 }
123
124 asTimeLong (value, params) {
125 return this.asDate(value, {format: this.timeLongFormat, ...params});
126 }
127
128 asDatetime (value, params) {
129 return this.asDate(value, {format: this.datetimeFormat, ...params});
130 }
131
132 asTimestamp (value, params) {
133 return this.asDate(value, {format: this.timestampFormat, ...params});
134 }
135
136 asFromNow (value, params = {}) {
137 return value
138 ? moment(value).locale(params.language || this.language).fromNow()
139 : this.asRaw(value, params);
140 }
141
142 asToNow (value, params = {}) {
143 return value
144 ? moment(value).locale(params.language || this.language).toNow()
145 : this.asRaw(value, params);
146 }
147
148 asFromDate (value, params = {}) {
149 return value && params.date
150 ? moment(value).locale(params.language || this.language).from(params.date)
151 : this.asRaw(value, params);
152 }
153
154 asToDate (value, params = {}) {
155 return value && params.date
156 ? moment(value).locale(params.language || this.language).to(params.date)
157 : this.asRaw(value, params);
158 }
159
160 asIso (value, params) {
161 return value ? moment(value).toISOString() : this.asRaw(value, params);
162 }
163
164 asClientDate (value, params = {}) {
165 if (!value) {
166 return this.asRaw(value, params);
167 }
168 value = value instanceof Date ? value.toISOString() : moment(value).toISOString();
169 return `<time datetime="${value}" data-format="${params.format || ''}" data-utc="${params.utc || ''}">${value}</time>`;
170 }
171};
172module.exports.init();
173
174const moment = require('moment');
175const I18n = require('./I18n');
176const StringHelper = require('../helper/StringHelper');
\No newline at end of file