Jelajahi Sumber

basics of moment range formatting

Adam Shaw 7 tahun lalu
induk
melakukan
f03bdc4334
2 mengubah file dengan 76 tambahan dan 5 penghapusan
  1. 75 4
      plugins/moment/main.ts
  2. 1 1
      tests/automated/datelib/moment.js

+ 75 - 4
plugins/moment/main.ts

@@ -18,18 +18,38 @@ import * as fc from 'fullcalendar'
 
 }
 
-// TODO: what about range!!??
-
 fc.registerCmdFormatter('moment', function(cmdStr: string, arg: fc.VerboseFormattingArg) {
+  let cmd = parseCmdStr(cmdStr)
+
+  if (arg.end) {
+    let startMom = convertToMoment(
+      arg.start.array,
+      arg.timeZone,
+      arg.start.timeZoneOffset,
+      arg.localeCodes[0]
+    )
+    let endMom = convertToMoment(
+      arg.end.array,
+      arg.timeZone,
+      arg.end.timeZoneOffset,
+      arg.localeCodes[0]
+    )
+    return formatRange(
+      cmd,
+      startMom.format.bind(startMom),
+      endMom.format.bind(endMom),
+      arg.separator // TODO: test separator
+    )
+  }
+
   return convertToMoment(
     arg.date.array,
     arg.timeZone,
     arg.date.timeZoneOffset,
     arg.localeCodes[0]
-  ).format(cmdStr)
+  ).format(cmd.whole) // TODO: test for this
 })
 
-
 function convertToMoment(input: any, timeZone: string, timeZoneOffset: number | null, locale: string): moment.Moment {
   let mom: moment.Moment
 
@@ -54,3 +74,54 @@ function convertToMoment(input: any, timeZone: string, timeZoneOffset: number |
 
   return mom
 }
+
+
+/* Range Formatting (duplicate code as other date plugins)
+----------------------------------------------------------------------------------------------------*/
+
+interface CmdParts {
+  head: string | null
+  middle: string | null
+  tail: string | null
+  whole: string
+}
+
+function parseCmdStr(cmdStr: string): CmdParts {
+  let parts = cmdStr.match(/^(.*?)\{(.*?)\}(.*)$/)
+
+  if (parts) {
+    return {
+      head: parts[1],
+      middle: parts[2],
+      tail: parts[3],
+      whole: parts[1] + parts[2] + parts[3]
+    }
+  } else {
+    return {
+      head: null,
+      middle: null,
+      tail: null,
+      whole: cmdStr
+    }
+  }
+}
+
+function formatRange(cmd: CmdParts, formatStart: (cmdStr: string) => string, formatEnd: (cmdStr: string) => string, separator: string): string {
+  if (cmd.head) {
+    let startHead = formatStart(cmd.head)
+    let startMiddle = formatStart(cmd.middle)
+    let startTail = formatStart(cmd.tail)
+
+    let endHead = formatEnd(cmd.head)
+    let endMiddle = formatEnd(cmd.middle)
+    let endTail = formatEnd(cmd.tail)
+
+    if (startHead === endHead && startTail === endTail) {
+      return startHead +
+        (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
+        startTail
+    }
+  }
+
+  return formatStart(cmd.whole) + separator + formatEnd(cmd.whole)
+}

+ 1 - 1
tests/automated/datelib/moment.js

@@ -80,7 +80,7 @@ describe('moment plugin', function() {
       expect(getEventElTimeText(getSingleEl())).toBe('13:30:20!')
     })
 
-    xit('produces title with titleRangeSeparator', function() {
+    it('produces title with titleRangeSeparator', function() {
       initCalendar({ // need to render the calendar to get view.title :(
         defaultView: 'basicWeek',
         now: '2018-09-06',