branch: elpa/subed commit 06851d89734c030ead5ce973e2717ab24be4cba6 Author: Random User <rnd...@posteo.de> Commit: Random User <rnd...@posteo.de>
Prevent overlapping when adjusting subtitle start/stop time --- README.org | 8 ++--- subed/subed-config.el | 4 +-- subed/subed-srt.el | 22 ++++++++++-- tests/test-subed-srt.el | 93 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+), 8 deletions(-) diff --git a/README.org b/README.org index e51c28b..a52dcdc 100644 --- a/README.org +++ b/README.org @@ -12,11 +12,11 @@ subed is still alpha software. Expect it to kill your Emacs session. - Quickly jump to the beginning (~C-M-a~) and end (~C-M-e~) of the current subtitle's text. - Insert (~M-i~) and kill (~M-k~) subtitles. - - Freely adjust subtitle start (~M-[~ / ~M-]~) and stop (~M-{~ / ~M-}~) time. - A prefix argument sets the number of milliseconds for the current session + - Adjust subtitle start (~M-[~ / ~M-]~) and stop (~M-{~ / ~M-}~) time. A + prefix argument sets the number of milliseconds for the current session (e.g. ~C-u 1000 M-[ M-[ M-[~ decreases start time by 3 seconds). - - Freely move the current subtitle or all marked subtitles forward (~C-M-n~) - or backward (~C-M-p~) in time without changing subtitle duration. A prefix + - Move the current subtitle or all marked subtitles forward (~C-M-n~) or + backward (~C-M-p~) in time without changing subtitle duration. A prefix argument sets the number of milliseconds for the current session (e.g. ~C-u 500 C-M-n C-M-n~ moves the current subtitle 1 second forward). - Shift the current subtitle forward (~C-M-f~) or backward (~C-M-b~) together diff --git a/subed/subed-config.el b/subed/subed-config.el index 75c6e23..010f229 100644 --- a/subed/subed-config.el +++ b/subed/subed-config.el @@ -161,8 +161,8 @@ typed something.") (defcustom subed-subtitle-spacing 100 - "How many milliseconds to keep between subtitles when inserting -subtitles." + "How many milliseconds to keep between subtitles when adjusting +or inserting subtitles." :type 'integer :group 'subed) diff --git a/subed/subed-srt.el b/subed/subed-srt.el index 372699e..9f71320 100644 --- a/subed/subed-srt.el +++ b/subed/subed-srt.el @@ -300,8 +300,17 @@ Return point or nil if there is no previous subtitle." "Add MSECS milliseconds to start time (use negative value to subtract)." (subed-disable-sync-point-to-player-temporarily) (let* ((msecs-start (subed-srt--subtitle-msecs-start)) - (msecs-new (when msecs-start (+ msecs-start msecs)))) + (msecs-new (when msecs-start (+ msecs-start msecs))) + (msecs-prev (save-excursion + (when (subed-srt-backward-subtitle-id) + (subed-srt--subtitle-msecs-stop)))) + (msecs-min (if msecs-prev (+ msecs-prev subed-subtitle-spacing) 0)) + (msecs-max (subed-srt--subtitle-msecs-stop))) (when msecs-new + (when (and msecs-min (< msecs-new msecs-min)) + (setq msecs-new msecs-min)) + (when (> msecs-new msecs-max) + (setq msecs-new msecs-max)) (save-excursion (subed-srt-jump-to-subtitle-time-start) (when (looking-at subed-srt--regexp-timestamp) @@ -312,8 +321,17 @@ Return point or nil if there is no previous subtitle." "Add MSECS milliseconds to stop time (use negative value to subtract)." (subed-disable-sync-point-to-player-temporarily) (let* ((msecs-stop (subed-srt--subtitle-msecs-stop)) - (msecs-new (when msecs-stop (+ msecs-stop msecs)))) + (msecs-new (when msecs-stop (+ msecs-stop msecs))) + (msecs-next (save-excursion + (when (subed-srt-forward-subtitle-id) + (subed-srt--subtitle-msecs-start)))) + (msecs-min (subed-srt--subtitle-msecs-start)) + (msecs-max (when msecs-next (- msecs-next subed-subtitle-spacing)))) (when msecs-new + (when (< msecs-new msecs-min) + (setq msecs-new msecs-min)) + (when (and msecs-max (> msecs-new msecs-max)) + (setq msecs-new msecs-max)) (save-excursion (subed-srt-jump-to-subtitle-time-stop) (when (looking-at subed-srt--regexp-timestamp) diff --git a/tests/test-subed-srt.el b/tests/test-subed-srt.el index 76cf623..9e671f8 100644 --- a/tests/test-subed-srt.el +++ b/tests/test-subed-srt.el @@ -678,6 +678,99 @@ Baz. (subed-srt-increase-stop-time) (expect (save-excursion (subed-srt-jump-to-subtitle-time-start) (thing-at-point 'line)) :to-equal "00:01:01,500 --> 00:01:06,123\n"))) + (describe "enforces limits" + (describe "when decreasing start time" + (it "of the first subtitle." + (with-temp-buffer + (insert mock-srt-data) + (subed-srt-jump-to-subtitle-id 1) + (subed-srt-decrease-start-time 60999) + (expect (subed-srt--subtitle-msecs-start) :to-be 1) + (subed-srt-decrease-start-time 1) + (expect (subed-srt--subtitle-msecs-start) :to-be 0) + (subed-srt-decrease-start-time 1) + (expect (subed-srt--subtitle-msecs-start) :to-be 0))) + (it "of a non-first subtitle." + (with-temp-buffer + (insert mock-srt-data) + (subed-srt-jump-to-subtitle-id 2) + (subed-srt-decrease-start-time (- (subed-srt--subtitle-msecs-start 2) + (subed-srt--subtitle-msecs-stop 1) + subed-subtitle-spacing + 1)) + (expect (subed-srt--subtitle-msecs-start) :to-be (+ (subed-srt--subtitle-msecs-stop 1) + subed-subtitle-spacing + 1)) + (subed-srt-decrease-start-time 1) + (expect (subed-srt--subtitle-msecs-start) :to-be (+ (subed-srt--subtitle-msecs-stop 1) + subed-subtitle-spacing)) + (subed-srt-decrease-start-time 1) + (expect (subed-srt--subtitle-msecs-start) :to-be (+ (subed-srt--subtitle-msecs-stop 1) + subed-subtitle-spacing)))) + ) + (it "when increasing start time." + (with-temp-buffer + (insert mock-srt-data) + (subed-srt-jump-to-subtitle-id 2) + (subed-srt-increase-start-time (- (subed-srt--subtitle-msecs-stop 2) + (subed-srt--subtitle-msecs-start 2) + 1)) + (expect (subed-srt--subtitle-msecs-start 2) :to-be (- (subed-srt--subtitle-msecs-stop 2) 1)) + (subed-srt-increase-start-time 1) + (expect (subed-srt--subtitle-msecs-start 2) :to-be (subed-srt--subtitle-msecs-stop 2)) + (subed-srt-increase-start-time 1) + (expect (subed-srt--subtitle-msecs-start 2) :to-be (subed-srt--subtitle-msecs-stop 2)))) + (it "when decreasing stop time." + (with-temp-buffer + (insert mock-srt-data) + (subed-srt-jump-to-subtitle-id 2) + (subed-srt-decrease-stop-time (- (subed-srt--subtitle-msecs-stop 2) + (subed-srt--subtitle-msecs-start 2) + 1)) + (expect (subed-srt--subtitle-msecs-stop 2) :to-be (+ (subed-srt--subtitle-msecs-start 2) 1)) + (subed-srt-decrease-stop-time 1) + (expect (subed-srt--subtitle-msecs-stop 2) :to-be (subed-srt--subtitle-msecs-start 2)) + (subed-srt-decrease-stop-time 1) + (expect (subed-srt--subtitle-msecs-stop 2) :to-be (subed-srt--subtitle-msecs-start 2)))) + (describe "when increasing stop time" + (it "of the last subtitle." + (with-temp-buffer + (insert mock-srt-data) + (subed-srt-jump-to-subtitle-id 3) + (subed-srt-increase-stop-time (- (* 99 3600000) + (subed-srt--subtitle-msecs-stop 3))) + (expect (subed-srt--subtitle-msecs-stop 3) :to-be (* 99 3600000)) + (subed-srt-increase-stop-time (* 59 60000)) + (expect (subed-srt--subtitle-msecs-stop 3) :to-be (+ (* 99 3600000) + (* 59 60000))) + (subed-srt-increase-stop-time (* 59 1000)) + (expect (subed-srt--subtitle-msecs-stop 3) :to-be (+ (* 99 3600000) + (* 59 60000) + (* 59 1000))) + (subed-srt-increase-stop-time 999) + (expect (subed-srt--subtitle-msecs-stop 3) :to-be (+ (* 99 3600000) + (* 59 60000) + (* 59 1000) + 999)))) + (it "of a non-last subtitle." + (with-temp-buffer + (insert mock-srt-data) + (subed-srt-jump-to-subtitle-id 2) + (subed-srt-increase-stop-time (- (subed-srt--subtitle-msecs-start 3) + (subed-srt--subtitle-msecs-stop 2) + subed-subtitle-spacing + 1)) + (expect (subed-srt--subtitle-msecs-stop 2) :to-be (- (subed-srt--subtitle-msecs-start 3) + subed-subtitle-spacing + 1)) + (subed-srt-increase-stop-time 1) + (expect (subed-srt--subtitle-msecs-stop 2) :to-be (- (subed-srt--subtitle-msecs-start 3) + subed-subtitle-spacing)) + (subed-srt-increase-stop-time 1) + (expect (subed-srt--subtitle-msecs-stop 2) :to-be (- (subed-srt--subtitle-msecs-start 3) + subed-subtitle-spacing)))) + ) + ) (it "does nothing if no timestamp can be found." (with-temp-buffer (insert "foo")