Adam Shaw 7 лет назад
Родитель
Сommit
8a82bb11e5
3 измененных файлов с 50 добавлено и 31 удалено
  1. 1 1
      src/Calendar.ts
  2. 17 30
      src/datelib/formatting-native.ts
  3. 32 0
      tests/automated/datelib/main.js

+ 1 - 1
src/Calendar.ts

@@ -313,7 +313,7 @@ export default class Calendar {
     return dateEnv.formatRange(
     return dateEnv.formatRange(
       dateEnv.createMarker(d0),
       dateEnv.createMarker(d0),
       dateEnv.createMarker(d1),
       dateEnv.createMarker(d1),
-      formatter,
+      createFormatter(formatter),
       { isEndExclusive }
       { isEndExclusive }
     )
     )
   }
   }

+ 17 - 30
src/datelib/formatting-native.ts

@@ -8,36 +8,30 @@ import { DateFormatter, DateFormattingContext, ZonedMarker, formatTimeZoneOffset
 const STANDARD_DATE_PROP_RE = /^(weekday|era|year|month|day|hour|minute|second|timeZoneName)$/
 const STANDARD_DATE_PROP_RE = /^(weekday|era|year|month|day|hour|minute|second|timeZoneName)$/
 const DEFAULT_SEPARATOR = ' - '
 const DEFAULT_SEPARATOR = ' - '
 const EXTENDED_SETTINGS = {
 const EXTENDED_SETTINGS = {
-  separator: null,
-  fake: function(s) {
-    return s.toLowerCase() + ' --- test'
-  }
+  week: true,
+  separator: true
 }
 }
 
 
 
 
 export class NativeFormatter implements DateFormatter {
 export class NativeFormatter implements DateFormatter {
 
 
   standardSettings: any
   standardSettings: any
+  standardDatePropCnt: number
   extendedSettings: any
   extendedSettings: any
-  transformations: any
-  datePropCnt: number
 
 
   constructor(formatSettings) {
   constructor(formatSettings) {
     let standardSettings: any = {}
     let standardSettings: any = {}
     let extendedSettings: any = {}
     let extendedSettings: any = {}
-    let transformations = []
-    let datePropCnt = 0
+    let standardDatePropCnt = 0
 
 
     for (let name in formatSettings) {
     for (let name in formatSettings) {
-      if (typeof EXTENDED_SETTINGS[name] === 'function') {
-        transformations.push(formatSettings[name])
-      } else if (EXTENDED_SETTINGS[name]) {
+      if (EXTENDED_SETTINGS[name]) {
         extendedSettings[name] = formatSettings[name]
         extendedSettings[name] = formatSettings[name]
       } else {
       } else {
         standardSettings[name] = formatSettings[name]
         standardSettings[name] = formatSettings[name]
 
 
         if (STANDARD_DATE_PROP_RE.test(name)) {
         if (STANDARD_DATE_PROP_RE.test(name)) {
-          datePropCnt++
+          standardDatePropCnt++
         }
         }
       }
       }
     }
     }
@@ -45,26 +39,23 @@ export class NativeFormatter implements DateFormatter {
     standardSettings.timeZone = 'UTC'
     standardSettings.timeZone = 'UTC'
 
 
     this.standardSettings = standardSettings
     this.standardSettings = standardSettings
+    this.standardDatePropCnt = standardDatePropCnt
     this.extendedSettings = extendedSettings
     this.extendedSettings = extendedSettings
-    this.transformations = transformations
-    this.datePropCnt = datePropCnt
   }
   }
 
 
   format(date: ZonedMarker, context: DateFormattingContext, standardOverrides?) {
   format(date: ZonedMarker, context: DateFormattingContext, standardOverrides?) {
     let standardSettings = standardOverrides || this.standardSettings
     let standardSettings = standardOverrides || this.standardSettings
-    let { extendedSettings, transformations } = this
+    let { extendedSettings } = this
 
 
-    if (this.datePropCnt === 1) {
-      if (standardSettings.timeZoneName === 'short') {
-        return formatTimeZoneOffset(date.timeZoneOffset)
-      }
-      if (extendedSettings.week) {
-        return formatWeekNumber(
-          context.computeWeekNumber(date.marker),
-          context.locale,
-          extendedSettings.week
-        )
-      }
+    if (this.standardDatePropCnt === 1 && standardSettings.timeZoneName === 'short') {
+      return formatTimeZoneOffset(date.timeZoneOffset)
+    }
+    if (this.standardDatePropCnt === 0 && extendedSettings.week) {
+      return formatWeekNumber(
+        context.computeWeekNumber(date.marker),
+        context.locale,
+        extendedSettings.week
+      )
     }
     }
 
 
     // if trying to display a timezone but don't have enough information, don't try
     // if trying to display a timezone but don't have enough information, don't try
@@ -88,10 +79,6 @@ export class NativeFormatter implements DateFormatter {
       s = s.replace(/UTC|GMT/, formatTimeZoneOffset(date.timeZoneOffset))
       s = s.replace(/UTC|GMT/, formatTimeZoneOffset(date.timeZoneOffset))
     }
     }
 
 
-    transformations.forEach(function(transformation) {
-      s = transformation(s)
-    })
-
     return s
     return s
   }
   }
 
 

+ 32 - 0
tests/automated/datelib/main.js

@@ -180,6 +180,31 @@ fdescribe('datelib', function() {
     })
     })
 
 
 
 
+    describe('week number formatting', function() {
+
+      it('can output only number', function() {
+        var marker = env.createMarker('2018-06-08')
+        var formatter = createFormatter({ week: 'numeric' })
+        var s = env.format(marker, formatter)
+        expect(s).toBe('23')
+      })
+
+      it('can output narrow', function() {
+        var marker = env.createMarker('2018-06-08')
+        var formatter = createFormatter({ week: 'narrow' })
+        var s = env.format(marker, formatter)
+        expect(s).toBe('Wk23')
+      })
+
+      it('can output short', function() {
+        var marker = env.createMarker('2018-06-08')
+        var formatter = createFormatter({ week: 'short' })
+        var s = env.format(marker, formatter)
+        expect(s).toBe('Wk 23')
+      })
+    })
+
+
     describe('range formatting', function() {
     describe('range formatting', function() {
       var formatter = createFormatter({
       var formatter = createFormatter({
         day: 'numeric',
         day: 'numeric',
@@ -515,6 +540,13 @@ fdescribe('datelib', function() {
       expect(s).toBe('Friday, June 8, 2018, ' + getFormattedTimzoneOffset2(new Date(2018, 5, 8)))
       expect(s).toBe('Friday, June 8, 2018, ' + getFormattedTimzoneOffset2(new Date(2018, 5, 8)))
     })
     })
 
 
+    it('can output a timezone only', function() {
+      var marker = env.createMarker('2018-06-08')
+      var formatter = createFormatter({ timeZoneName: 'short' })
+      var s = env.format(marker, formatter)
+      expect(s).toBe(getFormattedTimzoneOffset2(new Date(2018, 5, 8)))
+    })
+
 
 
     // because `new Date(year)` is error-prone
     // because `new Date(year)` is error-prone
     it('startOfYear', function() {
     it('startOfYear', function() {