branch: elpa/subed
commit 14ebbbb34909a980800f96f2010c9429b126a88b
Author: Random User <rnd...@posteo.de>
Commit: Random User <rnd...@posteo.de>
subed-srt--subtitle-id-at-msecs: Return nil if no matching subtitle
This fixes a bug which made point jump to the previous subtitle when
adjusting
times.
---
subed/subed-srt.el | 19 ++++++++-----------
tests/test-subed-srt.el | 16 ++++++++--------
2 files changed, 16 insertions(+), 19 deletions(-)
diff --git a/subed/subed-srt.el b/subed/subed-srt.el
index ca98899..83bd2d4 100644
--- a/subed/subed-srt.el
+++ b/subed/subed-srt.el
@@ -77,9 +77,7 @@ Return nil if TIME-STRING doesn't match the pattern."
(defun subed-srt--subtitle-id-at-msecs (msecs)
"Return the ID of the subtitle at MSECS milliseconds.
-If MSECS is between subtitles, return the subtitle that starts
-after MSECS if there is one and its start time is >= MSECS +
-1000. Otherwise return the closest subtitle before MSECS."
+Return nil if there is no subtitle at MSECS."
(save-match-data
(save-excursion
(goto-char (point-min))
@@ -90,17 +88,16 @@ after MSECS if there is one and its start time is >= MSECS +
(when (re-search-forward (format "\\(%s\\|\\`\\)[0-9]+\n%02d:"
subed-srt--regexp-separator only-hours) nil t)
(beginning-of-line)
;; Move to first subtitle in the relevant hour and minute
- (re-search-forward (format "\\(\n\n\\|\\`\\)[0-9]+\n%02d:%02d"
only-hours only-mins) nil t)))
+ (re-search-forward (format "\\(\n\n\\|\\`\\)[0-9]+\n%02d:%02d"
only-hours only-mins) nil t))
;; Move to first subtitle that starts at or after MSECS
- (catch 'last-subtitle-reached
+ (catch 'subtitle-id
(while (<= (or (subed-srt--subtitle-msecs-start) -1) msecs)
+ ;; If stop time is >= MSECS, we found a match
+ (let ((cur-sub-end (subed-srt--subtitle-msecs-stop)))
+ (when (and cur-sub-end (>= cur-sub-end msecs))
+ (throw 'subtitle-id (subed-srt--subtitle-id))))
(unless (subed-srt--forward-subtitle-id)
- (throw 'last-subtitle-reached nil))))
- ;; Move back to previous subtitle if start of current subtitle is in the
- ;; future (i.e. MSECS is between subtitles)
- (when (> (or (subed-srt--subtitle-msecs-start) -1) msecs)
- (subed-srt--backward-subtitle-id))
- (subed-srt--subtitle-id))))
+ (throw 'subtitle-id nil))))))))
(defun subed-srt--subtitle-msecs-start (&optional sub-id)
"Subtitle start time in milliseconds or nil if it can't be found.
diff --git a/tests/test-subed-srt.el b/tests/test-subed-srt.el
index 8585c3a..2ae1832 100644
--- a/tests/test-subed-srt.el
+++ b/tests/test-subed-srt.el
@@ -61,7 +61,7 @@ Baz.
(progn
(subed-srt--jump-to-subtitle-id outset-id)
(expect (subed-srt--subtitle-id-at-msecs msecs)
:to-equal target-id)))))))
- (it "returns first subtitle ID if time is before the first subtitle's
start time."
+ (it "returns nil if time is before the first subtitle's start time."
(with-temp-srt-buffer
(insert mock-srt-data)
(let ((msecs (- (save-excursion
@@ -70,8 +70,8 @@ Baz.
(cl-loop for outset-id from 1 to 3 do
(progn
(subed-srt--jump-to-subtitle-id outset-id)
- (expect (subed-srt--subtitle-id-at-msecs msecs) :to-equal
1))))))
- (it "returns last subtitle ID if time is after the last subtitle's start
time."
+ (expect (subed-srt--subtitle-id-at-msecs msecs) :to-equal
nil))))))
+ (it "returns nil if time is after the last subtitle's start time."
(with-temp-srt-buffer
(insert mock-srt-data)
(let ((msecs (+ (save-excursion
@@ -80,8 +80,8 @@ Baz.
(cl-loop for outset-id from 1 to 3 do
(progn
(subed-srt--jump-to-subtitle-id outset-id)
- (expect (subed-srt--subtitle-id-at-msecs msecs) :to-equal
3))))))
- (it "returns previous subtitle ID when time is between subtitles."
+ (expect (subed-srt--subtitle-id-at-msecs msecs) :to-equal
nil))))))
+ (it "returns nil if time is between subtitles."
(with-temp-srt-buffer
(insert mock-srt-data)
(cl-loop for target-id from 1 to 2 do
@@ -89,13 +89,13 @@ Baz.
(cl-loop for outset-id from 1 to 3 do
(progn
(subed-srt--jump-to-subtitle-id outset-id)
- (expect (subed-srt--subtitle-id-at-msecs msecs)
:to-equal target-id))))
+ (expect (subed-srt--subtitle-id-at-msecs msecs)
:to-equal nil))))
(let ((msecs (- (subed-srt--subtitle-msecs-start (+ target-id
1)) 1)))
(cl-loop for outset-id from 1 to 3 do
(progn
(subed-srt--jump-to-subtitle-id outset-id)
- (expect (subed-srt--subtitle-id-at-msecs msecs)
:to-equal target-id)))))))
- (it "doesn't fail when start time is invalid."
+ (expect (subed-srt--subtitle-id-at-msecs msecs)
:to-equal nil)))))))
+ (it "doesn't fail if start time is invalid."
(with-temp-srt-buffer
(insert mock-srt-data)
(subed-srt--jump-to-subtitle-id 2)