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)