branch: elpa/datetime commit 5da90e55e408d227c8a6264bb72f6f6afeabb50f Author: Paul Pogonyshev <pogonys...@gmail.com> Commit: Paul Pogonyshev <pogonys...@gmail.com>
Regenerate timezone and locale extmaps using OpenJDK 11.0.4 (build 11.0.4+11-post-Debian-1deb10u1); change internal format of date-time-rule as needed by new data. --- .travis.yml | 2 +- Eldev | 1 + datetime.el | 34 ++++++++++++++++++---------- dev/HarvestData.java | 62 ++++++++++++++++++++++++++++++++++----------------- locale-data.extmap | Bin 245800 -> 261402 bytes timezone-data.extmap | Bin 825067 -> 826350 bytes 6 files changed, 66 insertions(+), 33 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3bf432bb7e..26d6a6fa2e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,7 @@ env: - EVM_EMACS=emacs-26.3-travis jdk: - - oraclejdk9 + - openjdk11 script: - eldev -p -dtT test --expect 20 diff --git a/Eldev b/Eldev index 3a7515269a..f767e3d50c 100644 --- a/Eldev +++ b/Eldev @@ -50,6 +50,7 @@ ;; Before testing we need to compile `test/ProcessTimestamp.java'. (add-hook 'eldev-test-hook (lambda () + (eldev-verbose "Building the tool in `test' target set first...") (let ((eldev-build-sets '(test)) (eldev-verbosity-level 'quiet)) (eldev-build)))) diff --git a/datetime.el b/datetime.el index 6c46b0610e..a33ec9537f 100644 --- a/datetime.el +++ b/datetime.el @@ -1529,20 +1529,30 @@ Returned pattern is always of type \\\='java. This function exists not just for completeness: while in most cases the result is just corresponding date and time patterns -separated by a space, for a few locales it is different." +separated by a space, for quite a few locales it is different." (unless date-variant (setq date-variant :medium)) (unless time-variant (setq time-variant date-variant)) - (let* ((date-time-pattern-rule (or (datetime-locale-field locale :date-time-pattern-rule) '(t . " "))) - (separator (cdr date-time-pattern-rule)) - (date-part (datetime-locale-date-pattern locale date-variant)) - (time-part (datetime-locale-time-pattern locale time-variant))) - (unless (stringp separator) - (setq separator (cdr (assoc (list date-variant time-variant) separator)))) - (if (car date-time-pattern-rule) - (concat date-part separator time-part) - (concat time-part separator date-part)))) + ;; Some ugly parsing of compressed data follows; see the harvesting tool. + (let* ((date-part (datetime-locale-date-pattern locale date-variant)) + (time-part (datetime-locale-time-pattern locale time-variant)) + (date-time-pattern-rule (or (datetime-locale-field locale :date-time-pattern-rule) '(t . " "))) + (date-part-first (car date-time-pattern-rule)) + constant-strings) + (if (consp date-part-first) + (let ((style-data (cdr (assoc (list date-variant time-variant) date-time-pattern-rule)))) + (setq date-part-first (car style-data) + constant-strings (cdr style-data))) + (unless (stringp (setq constant-strings (cdr date-time-pattern-rule))) + (setq constant-strings (cdr (assoc (list date-variant time-variant) constant-strings))))) + (if (stringp constant-strings) + (if date-part-first + (concat date-part constant-strings time-part) + (concat time-part constant-strings date-part)) + (if date-part-first + (concat (nth 0 constant-strings) date-part (nth 1 constant-strings) time-part (nth 2 constant-strings)) + (concat (nth 0 constant-strings) time-part (nth 1 constant-strings) date-part (nth 2 constant-strings)))))) (defconst datetime--english-eras ["BC" "AD"]) @@ -1590,14 +1600,14 @@ Supported fields: This version will be incremented each time locale database of the package is updated. It can be used e.g. to invalidate caches you create based on locales `datetime' knows about." - 2) + 3) (defun datetime-timezone-database-version () "Return timezone database version, a simple integer. This version will be incremented each time timezone database of the package is updated. It can be used e.g. to invalidate caches you create based on timezone `datetime' knows about and their rules." - 2) + 3) (provide 'datetime) diff --git a/dev/HarvestData.java b/dev/HarvestData.java index 67b4451951..5456eeb20d 100644 --- a/dev/HarvestData.java +++ b/dev/HarvestData.java @@ -76,41 +76,63 @@ public class HarvestData map.put (":date-patterns", toLispPlist (date_patterns, true)); map.put (":time-patterns", toLispPlist (time_patterns, true)); - Boolean date_part_first = null; - Map <List <String>, String> separators = new LinkedHashMap <> (); + Map <List <String>, Boolean> date_part_first = new LinkedHashMap <> (); + Map <List <String>, String> constant_strings_per_style = new LinkedHashMap <> (); for (FormatStyle date_style : FormatStyle.values ()) { for (FormatStyle time_style : FormatStyle.values ()) { + List <String> key = new ArrayList <> (); + for (FormatStyle style : new FormatStyle[] { date_style, time_style }) + key.add (style == FormatStyle.SHORT ? ":short" : style == FormatStyle.MEDIUM ? ":medium" : style == FormatStyle.LONG ? ":long" : ":full"); + String date_pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern (date_style, null, chronology, locale); String time_pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern (null, time_style, chronology, locale); String date_time_pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern (date_style, time_style, chronology, locale); + int at_1 = date_time_pattern.indexOf (date_pattern); + int at_2 = date_time_pattern.indexOf (time_pattern); + int length_1 = date_pattern.length (); + int length_2 = time_pattern.length (); - if (date_part_first == null) - date_part_first = date_time_pattern.startsWith (date_pattern); + if (at_1 < 0 || at_2 < 0 || (at_1 <= at_2 && at_1 + date_pattern.length () > at_2) || (at_2 <= at_1 && at_2 + time_pattern.length () > at_1)) { + throw new IllegalStateException (String.format ("cannot rebuild date-time pattern:\n locale: %s\n date-time: %s\n date: %s\n time: %s", + locale.toLanguageTag (), date_time_pattern, date_pattern, time_pattern)); + } - String separator = null; + date_part_first.put (key, at_1 < at_2); - if (date_part_first && date_time_pattern.startsWith (date_pattern) && date_time_pattern.endsWith (time_pattern)) - separator = date_time_pattern.substring (date_pattern.length (), date_time_pattern.length () - time_pattern.length ()); - else if (!date_part_first && date_time_pattern.startsWith (time_pattern) && date_time_pattern.endsWith (date_pattern)) - separator = date_time_pattern.substring (time_pattern.length (), date_time_pattern.length () - date_pattern.length ()); - else { - throw new IllegalStateException (String.format ("cannot determine separator:\n locale: %s\n date-time: %s\n date: %s\n time: %s", - locale.toLanguageTag (), date_time_pattern, date_pattern, time_pattern)); + if (at_1 > at_2) { + int temp = at_1; + at_1 = at_2; + at_2 = temp; + length_1 = time_pattern.length (); + length_2 = date_pattern.length (); } - List <String> key = new ArrayList <> (); - for (FormatStyle style : new FormatStyle[] { date_style, time_style }) - key.add (style == FormatStyle.SHORT ? ":short" : style == FormatStyle.MEDIUM ? ":medium" : style == FormatStyle.LONG ? ":long" : ":full"); + String constant_strings = quoteString (date_time_pattern.substring (at_1 + length_1, at_2)); + + if (at_1 > 0 || at_2 + length_2 < date_time_pattern.length ()) { + constant_strings = toLispList (Arrays.asList (quoteString (date_time_pattern.substring (0, at_1)), + constant_strings, + quoteString (date_time_pattern.substring (at_2 + length_2)))); + } - separators.put (key, separator); + constant_strings_per_style.put (key, constant_strings); } } - if (separators.values ().stream ().distinct ().collect (Collectors.counting ()) == 1) - map.put (":date-time-pattern-rule", String.format ("(%s . %s)", date_part_first ? "t" : "nil", quoteString (separators.values ().stream ().distinct ().findFirst ().get ()))); - else - map.put (":date-time-pattern-rule", String.format ("(%s . %s)", date_part_first ? "t" : "nil", toLispAlist (separators, (key) -> toLispList (key), (value) -> quoteString ((String) value)))); + if (date_part_first.values ().stream ().distinct ().collect (Collectors.counting ()) == 1) { + boolean date_part_always_first = date_part_first.values ().stream ().distinct ().findFirst ().get (); + if (constant_strings_per_style.values ().stream ().distinct ().collect (Collectors.counting ()) == 1) + map.put (":date-time-pattern-rule", String.format ("(%s . %s)", date_part_always_first ? "t" : "nil", constant_strings_per_style.values ().stream ().distinct ().findFirst ().get ())); + else + map.put (":date-time-pattern-rule", String.format ("(%s . %s)", date_part_always_first ? "t" : "nil", toLispAlist (constant_strings_per_style, (key) -> toLispList (key), String::valueOf))); + } + else { + for (List <String> key : date_part_first.keySet ()) + constant_strings_per_style.put (key, String.format ("(%s . %s)", date_part_first.get (key) ? "t" : "nil", constant_strings_per_style.get (key))); + + map.put (":date-time-pattern-rule", toLispAlist (constant_strings_per_style, (key) -> toLispList (key), String::valueOf)); + } } for (Locale locale : locales) { diff --git a/locale-data.extmap b/locale-data.extmap index 19379c297a..2898f8d3c2 100644 Binary files a/locale-data.extmap and b/locale-data.extmap differ diff --git a/timezone-data.extmap b/timezone-data.extmap index d718fd025c..b31789de38 100644 Binary files a/timezone-data.extmap and b/timezone-data.extmap differ