emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/compat c5b7ee9376 1/2: compat-29: Provide string-lines


From: ELPA Syncer
Subject: [elpa] externals/compat c5b7ee9376 1/2: compat-29: Provide string-lines implementation from Emacs 29
Date: Sun, 22 Jan 2023 07:57:27 -0500 (EST)

branch: externals/compat
commit c5b7ee9376a760db436d6699c5e9de7963892316
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@daniel-mendler.de>

    compat-29: Provide string-lines implementation from Emacs 29
---
 NEWS.org        |  5 +++++
 compat-28.el    |  5 -----
 compat-29.el    | 29 +++++++++++++++++++++++++++++
 compat-tests.el | 42 ++++++++++++++++++++++--------------------
 compat.texi     | 31 ++++++++++++++++++++-----------
 5 files changed, 76 insertions(+), 36 deletions(-)

diff --git a/NEWS.org b/NEWS.org
index 8db740ed87..b4a66b301c 100644
--- a/NEWS.org
+++ b/NEWS.org
@@ -1,5 +1,10 @@
 #+title: compat.el - Changelog
 
+* Development
+
+- compat-29: Replace ~string-lines~ with version from Emacs 29, support 
optional
+  KEEP-NEWLINES argument.
+
 * Release of "Compat" Version 29.1.3.0
 
 - compat-25: Add ~hash-table-empty-p~.
diff --git a/compat-28.el b/compat-28.el
index 76dfe37e3d..f068240d64 100644
--- a/compat-28.el
+++ b/compat-28.el
@@ -390,11 +390,6 @@ removed."
       (fill-region (point-min) (point-max)))
     (buffer-string)))
 
-(compat-defun string-lines (string &optional omit-nulls) ;; 
<compat-tests:string-lines>
-  "Split STRING into a list of lines.
-If OMIT-NULLS, empty lines will be removed from the results."
-  (split-string string "\n" omit-nulls))
-
 (compat-defun string-pad (string length &optional padding start) ;; 
<compat-tests:string-pad>
   "Pad STRING to LENGTH using PADDING.
 If PADDING is nil, the space character is used.  If not nil, it
diff --git a/compat-29.el b/compat-29.el
index 6612612ea3..821d28319c 100644
--- a/compat-29.el
+++ b/compat-29.el
@@ -170,6 +170,35 @@ This function does not move point.  Also see 
`line-end-position'."
 
 ;;;; Defined in subr.el
 
+(compat-defun string-lines (string &optional omit-nulls keep-newlines)
+  "Handle additional KEEP-NEWLINES argument."
+  :extended "28.1"
+  (if (equal string "")
+      (if omit-nulls
+          nil
+        (list ""))
+    (let ((lines nil)
+          (start 0))
+      (while (< start (length string))
+        (let ((newline (string-search "\n" string start)))
+          (if newline
+              (progn
+                (when (or (not omit-nulls)
+                          (not (= start newline)))
+                  (let ((line (substring string start
+                                         (if keep-newlines
+                                             (1+ newline)
+                                           newline))))
+                    (when (not (and keep-newlines omit-nulls
+                                    (equal line "\n")))
+                      (push line lines))))
+                (setq start (1+ newline)))
+            (if (zerop start)
+                (push string lines)
+              (push (substring string start) lines))
+            (setq start (length string)))))
+      (nreverse lines))))
+
 (compat-defun readablep (object) ;; <compat-tests:readablep>
   "Say whether OBJECT has a readable syntax.
 This means that OBJECT can be printed out and then read back
diff --git a/compat-tests.el b/compat-tests.el
index 14f8c79a20..c26c29496f 100644
--- a/compat-tests.el
+++ b/compat-tests.el
@@ -1802,17 +1802,24 @@
 
 (ert-deftest string-lines ()
   (should-equal '("a" "b" "c") (string-lines "a\nb\nc"))
-  ;; FIXME: Behavior changed on Emacs 30
-  (compat-tests--if (< emacs-major-version 29)
+  (should-equal '("a" "b" "c") (string-lines "a\nb\nc\n" t))
+  (should-equal '("a" "b" "c") (string-lines "a\nb\n\nc\n" t))
+  (should-equal '("abc" "bcd" "cde") (string-lines "abc\nbcd\ncde"))
+  (should-equal '(" abc" " bcd " "cde ") (string-lines " abc\n bcd \ncde "))
+
+  ;; NOTE: Behavior for trailing newline was different on Emacs 28
+  (compat-tests--if (= emacs-major-version 28)
       (should-equal '("a" "b" "c" "") (string-lines "a\nb\nc\n"))
     (should-equal '("a" "b" "c") (string-lines "a\nb\nc\n"))
     (should-equal '("a\n" "\n" "b\n" "c\n") (string-lines "a\n\nb\nc\n" nil t))
     (should-equal '("a\n" "b\n" "c\n") (string-lines "a\n\nb\nc\n" t t))
     (should-equal '("a\n" "b\n" "c\n") (string-lines "a\nb\nc\n" nil t)))
-  (should-equal '("a" "b" "c") (string-lines "a\nb\nc\n" t))
-  (should-equal '("a" "b" "c") (string-lines "a\nb\n\nc\n" t))
-  (should-equal '("abc" "bcd" "cde") (string-lines "abc\nbcd\ncde"))
-  (should-equal '(" abc" " bcd " "cde ") (string-lines " abc\n bcd \ncde ")))
+
+  ;; Compatibility function provides the Emacs 29 behavior regarding trailing 
newlines
+  (should-equal '("a" "b" "c") (compat-call string-lines "a\nb\nc\n"))
+  (should-equal '("a\n" "\n" "b\n" "c\n") (compat-call string-lines 
"a\n\nb\nc\n" nil t))
+  (should-equal '("a\n" "b\n" "c\n") (compat-call string-lines "a\n\nb\nc\n" t 
t))
+  (should-equal '("a\n" "b\n" "c\n") (compat-call string-lines "a\nb\nc\n" nil 
t)))
 
 (ert-deftest string-pad ()
   (should-equal "a   " (string-pad "a" 4))
@@ -1984,12 +1991,10 @@
   ;; The `make-string' calls with three arguments have been replaced
   ;; here with the result of their evaluation, to avoid issues with
   ;; older versions of Emacs that only support two arguments.
-  (should-equal 5
-                 (string-search (make-string 2 130)
-                                ;; Per (concat "helló" (make-string 5 130 t) 
"bár")
-                                "hell󂂂‚‚bár"))
-  (should-equal 5
-                  (string-search (make-string 2 127)
+  (should-equal 5 (string-search (make-string 2 130)
+                                 ;; Per (concat "helló" (make-string 5 130 t) 
"bár")
+                                 "hell󂂂‚‚bár"))
+  (should-equal 5 (string-search (make-string 2 127)
                                  ;; Per (concat "helló" (make-string 5 127 t) 
"bár")
                                  "hellóbár"))
   (should-equal 1 (string-search "\377" "a\377ø"))
@@ -2027,15 +2032,13 @@
   (should-not (string-search "\303\270" "\370"))
   (should-not (string-search (compat-tests--string-to-multibyte "\303\270") 
"\370"))
   (should-not (string-search "\303\270" (compat-tests--string-to-multibyte 
"\370")))
-  (should-not
-                  (string-search (compat-tests--string-to-multibyte "\303\270")
-                                 (compat-tests--string-to-multibyte "\370")))
+  (should-not (string-search (compat-tests--string-to-multibyte "\303\270")
+                             (compat-tests--string-to-multibyte "\370")))
   (should-not (string-search "\370" "\303\270"))
   (should-not (string-search (compat-tests--string-to-multibyte "\370") 
"\303\270"))
   (should-not (string-search "\370" (compat-tests--string-to-multibyte 
"\303\270")))
-  (should-not
-                 (string-search (compat-tests--string-to-multibyte "\370")
-                                (compat-tests--string-to-multibyte 
"\303\270")))
+  (should-not (string-search (compat-tests--string-to-multibyte "\370")
+                             (compat-tests--string-to-multibyte "\303\270")))
   (should-equal 3 (string-search "\303\270" "foo\303\270"))
   (when (version<= "27" emacs-version)
     ;; FIXME The commit a1f76adfb03c23bb4242928e8efe6193c301f0c1 in
@@ -2043,8 +2046,7 @@
     ;; raw bytes.  The compatibility functions should updated to
     ;; backport this behaviour.
     (should-equal 2 (string-search (compat-tests--string-to-multibyte "\377") 
"ab\377c"))
-    (should-equal 2
-                    (string-search (compat-tests--string-to-multibyte 
"o\303\270")
+    (should-equal 2 (string-search (compat-tests--string-to-multibyte 
"o\303\270")
                                    "foo\303\270"))))
 
 (ert-deftest string-replace ()
diff --git a/compat.texi b/compat.texi
index b30c234ecf..94508fa3c2 100644
--- a/compat.texi
+++ b/compat.texi
@@ -483,7 +483,7 @@ arguments, @var{objects}.
 
 @subsection Extended Definitions
 These functions must be called explicitly via @code{compat-call},
-since their calling convention or behavior was extended:
+since their calling convention or behavior was extended in Emacs 25.1:
 
 @defun compat-call@ sort sequence predicate
 This function sorts @var{sequence} stably.  Note that this function
@@ -884,7 +884,7 @@ size, modes, inode-number and device-number.
 
 @subsection Extended Definitions
 These functions must be called explicitly via @code{compat-call},
-since their calling convention or behavior was extended:
+since their calling convention or behavior was extended in Emacs 26.1:
 
 @defun compat-call@ assoc key alist &optional testfn
 This function returns the first association for @var{key} in
@@ -1316,7 +1316,7 @@ function signals an error.
 
 @subsection Extended Definitions
 These functions must be called explicitly via @code{compat-call},
-since their calling convention or behavior was extended:
+since their calling convention or behavior was extended in Emacs 27.1:
 
 @c based on lispref/windows.texi
 @defun compat-call@ recenter &optional count redisplay
@@ -1782,14 +1782,12 @@ will not be shortened.
 @end defun
 
 @c copied from lispref/strings.texi
-@defun string-lines string &optional omit-nulls keep-newlines
+@defun string-lines string &optional omit-nulls
 Split @var{string} into a list of strings on newline boundaries.  If
 the optional argument @var{omit-nulls} is non-@code{nil}, remove empty
-lines from the results.  If the optional argument @var{keep-newlines}
-is non-@code{nil}, don't remove the trailing newlines from the result
-strings.
-
-@xref{Creating Strings,,,elisp}.
+lines from the results.  Note that this function returns trailing
+newlines on Emacs 28, use @code{compat-call string-lines} instead if
+you want consistent behavior.
 @end defun
 
 @c copied from lispref/strings.texi
@@ -2023,7 +2021,7 @@ If native compilation is not available, this function 
always returns
 
 @subsection Extended Definitions
 These functions must be called explicitly via @code{compat-call},
-since their calling convention or behavior was extended:
+since their calling convention or behavior was extended in Emacs 28.1:
 
 @defun compat-call@ string-width string &optional from to
 This function returns the width in columns of the string @var{string},
@@ -2809,7 +2807,18 @@ This is comparable to @code{and-let*}.
 
 @subsection Extended Definitions
 These functions must be called explicitly via @code{compat-call},
-since their calling convention or behavior was extended:
+since their calling convention or behavior was extended in Emacs 29.1:
+
+@c copied from lispref/strings.texi
+@defun compat-call@ string-lines string &optional omit-nulls keep-newlines
+Split @var{string} into a list of strings on newline boundaries.  If
+the optional argument @var{omit-nulls} is non-@code{nil}, remove empty
+lines from the results.  If the optional argument @var{keep-newlines}
+is non-@code{nil}, don't remove the trailing newlines from the result
+strings.
+
+@xref{Creating Strings,,,elisp}.
+@end defun
 
 @c copied from lispref/keymaps.texi
 @defun compat-call@ define-key



reply via email to

[Prev in Thread] Current Thread [Next in Thread]