Blame view

天文台pc/tianwentai-ui/node_modules/date-fns/lightFormat.js 5.84 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
  "use strict";
  exports.lightFormat = lightFormat;
  Object.defineProperty(exports, "lightFormatters", {
    enumerable: true,
    get: function () {
      return _index3.lightFormatters;
    },
  });
  var _index = require("./isValid.js");
  var _index2 = require("./toDate.js");
  var _index3 = require("./_lib/format/lightFormatters.js");
  
  // Rexports of internal for libraries to use.
  // See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874
  
  // This RegExp consists of three parts separated by `|`:
  // - (\w)\1* matches any sequences of the same letter
  // - '' matches two quote characters in a row
  // - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),
  //   except a single quote symbol, which ends the sequence.
  //   Two quote characters do not end the sequence.
  //   If there is no matching single quote
  //   then the sequence will continue until the end of the string.
  // - . matches any single character unmatched by previous parts of the RegExps
  const formattingTokensRegExp = /(\w)\1*|''|'(''|[^'])+('|$)|./g;
  
  const escapedStringRegExp = /^'([^]*?)'?$/;
  const doubleQuoteRegExp = /''/g;
  const unescapedLatinCharacterRegExp = /[a-zA-Z]/;
  
  /**
   * @private
   */
  
  /**
   * @name lightFormat
   * @category Common Helpers
   * @summary Format the date.
   *
   * @description
   * Return the formatted date string in the given format. Unlike `format`,
   * `lightFormat` doesn't use locales and outputs date using the most popular tokens.
   *
   * > ⚠️ Please note that the `lightFormat` tokens differ from Moment.js and other libraries.
   * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
   *
   * The characters wrapped between two single quotes characters (') are escaped.
   * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.
   *
   * Format of the string is based on Unicode Technical Standard #35:
   * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
   *
   * Accepted patterns:
   * | Unit                            | Pattern | Result examples                   |
   * |---------------------------------|---------|-----------------------------------|
   * | AM, PM                          | a..aaa  | AM, PM                            |
   * |                                 | aaaa    | a.m., p.m.                        |
   * |                                 | aaaaa   | a, p                              |
   * | Calendar year                   | y       | 44, 1, 1900, 2017                 |
   * |                                 | yy      | 44, 01, 00, 17                    |
   * |                                 | yyy     | 044, 001, 000, 017                |
   * |                                 | yyyy    | 0044, 0001, 1900, 2017            |
   * | Month (formatting)              | M       | 1, 2, ..., 12                     |
   * |                                 | MM      | 01, 02, ..., 12                   |
   * | Day of month                    | d       | 1, 2, ..., 31                     |
   * |                                 | dd      | 01, 02, ..., 31                   |
   * | Hour [1-12]                     | h       | 1, 2, ..., 11, 12                 |
   * |                                 | hh      | 01, 02, ..., 11, 12               |
   * | Hour [0-23]                     | H       | 0, 1, 2, ..., 23                  |
   * |                                 | HH      | 00, 01, 02, ..., 23               |
   * | Minute                          | m       | 0, 1, ..., 59                     |
   * |                                 | mm      | 00, 01, ..., 59                   |
   * | Second                          | s       | 0, 1, ..., 59                     |
   * |                                 | ss      | 00, 01, ..., 59                   |
   * | Fraction of second              | S       | 0, 1, ..., 9                      |
   * |                                 | SS      | 00, 01, ..., 99                   |
   * |                                 | SSS     | 000, 001, ..., 999                |
   * |                                 | SSSS    | ...                               |
   *
   * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
   *
   * @param date - The original date
   * @param format - The string of tokens
   *
   * @returns The formatted date string
   *
   * @throws `Invalid time value` if the date is invalid
   * @throws format string contains an unescaped latin alphabet character
   *
   * @example
   * const result = lightFormat(new Date(2014, 1, 11), 'yyyy-MM-dd')
   * //=> '2014-02-11'
   */
  function lightFormat(date, formatStr) {
    const _date = (0, _index2.toDate)(date);
  
    if (!(0, _index.isValid)(_date)) {
      throw new RangeError("Invalid time value");
    }
  
    const tokens = formatStr.match(formattingTokensRegExp);
  
    // The only case when formattingTokensRegExp doesn't match the string is when it's empty
    if (!tokens) return "";
  
    const result = tokens
      .map((substring) => {
        // Replace two single quote characters with one single quote character
        if (substring === "''") {
          return "'";
        }
  
        const firstCharacter = substring[0];
        if (firstCharacter === "'") {
          return cleanEscapedString(substring);
        }
  
        const formatter = _index3.lightFormatters[firstCharacter];
        if (formatter) {
          return formatter(_date, substring);
        }
  
        if (firstCharacter.match(unescapedLatinCharacterRegExp)) {
          throw new RangeError(
            "Format string contains an unescaped latin alphabet character `" +
              firstCharacter +
              "`",
          );
        }
  
        return substring;
      })
      .join("");
  
    return result;
  }
  
  function cleanEscapedString(input) {
    const matches = input.match(escapedStringRegExp);
  
    if (!matches) {
      return input;
    }
  
    return matches[1].replace(doubleQuoteRegExp, "'");
  }