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

Reply via email to