branch: elpa/subed commit 77107906872205695a7e87d771d25be966086c49 Author: Random User <rnd...@posteo.de> Commit: Random User <rnd...@posteo.de>
Add subed-move-subtitle-forward/backward --- subed/subed.el | 41 +++++++++++++++++++++++++++++++++++++++++ tests/test-subed.el | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/subed/subed.el b/subed/subed.el index 4b31c41..92f2b56 100644 --- a/subed/subed.el +++ b/subed/subed.el @@ -119,6 +119,47 @@ (set-window-point debug-window (goto-char (point-max)))))))) +;;; Moving subtitles + +(defun subed-move-subtitle-forward (&optional arg beg end) + "Move subtitle `subed-seconds-move' forward in time while +preserving its duration, i.e. increase start and stop time by the +same amount. + +If the region is active, all subtitles that are fully or +partially in it are moved. + +The first step is to set `subed-seconds-move' to the value of the +prefix argument if it is provided and if it is a number. If the +prefix argument is provided but not numerical, +`subed-seconds-move' is reset to its default value. + +Example usage: + \\[universal-argument] 1000 \\[subed-move-subtitle-forward] Move subtitle 1000ms forward in time + \\[subed-move-subtitle-forward] Move subtitle 1000ms forward in time again + \\[universal-argument] 500 \\[subed-move-subtitle-forward] Move subtitle 500ms forward in time + \\[subed-move-subtitle-forward] Move subtitle 500ms forward in time again + \\[universal-argument] \\[subed-move-subtitle-forward] Move subtitle 100ms (the default) forward in time + \\[subed-move-subtitle-forward] Move subtitle 100ms (the default) forward in time again" + (interactive "P" (if (use-region-p) (list (region-beginning) (region-end)))) + (let ((secs (subed--get-seconds-move arg))) + (subed--for-each-subtitle beg end + (subed--adjust-subtitle-start-relative secs) + (subed--adjust-subtitle-stop-relative secs)))) + +(defun subed-move-subtitle-backward (&optional arg beg end) + "Move subtitle `subed-seconds-move' backward in time while +preserving its duration, i.e. decrease start and stop time by the +same amount. + +See `subed-move-subtitle-forward'." + (interactive "P" (if (use-region-p) (list (region-beginning) (region-end)))) + (let ((secs (* -1 (subed--get-seconds-move arg)))) + (subed--for-each-subtitle beg end + (subed--adjust-subtitle-start-relative secs) + (subed--adjust-subtitle-stop-relative secs)))) + + ;;; Replay time-adjusted subtitle (defun subed-replay-adjusted-subtitle-p () "Whether adjusting a subtitle's start/stop time causes the diff --git a/tests/test-subed.el b/tests/test-subed.el index 00b45f8..b84eacb 100644 --- a/tests/test-subed.el +++ b/tests/test-subed.el @@ -52,6 +52,47 @@ (expect (subed--subtitle-text 3) :to-equal "Hello."))) ) +(describe "Moving" + (it "adjusts start and stop time by the same amount." + (with-temp-buffer + (insert mock-srt-data) + (cl-loop for sub-id in '(1 2 3) do + (subed-jump-to-subtitle-id sub-id) + (let ((orig-start (subed--subtitle-msecs-start)) + (orig-stop (subed--subtitle-msecs-stop))) + (subed-move-subtitle-forward 100) + (expect (subed--subtitle-msecs-start) :to-equal (+ orig-start 100)) + (expect (subed--subtitle-msecs-stop) :to-equal (+ orig-stop 100)) + (subed-move-subtitle-backward 100) + (expect (subed--subtitle-msecs-start) :to-equal orig-start) + (expect (subed--subtitle-msecs-stop) :to-equal orig-stop))))) + (it "adjusts subtitles in the active region." + (with-temp-buffer + (insert mock-srt-data) + (let ((beg (subed-jump-to-subtitle-text 2)) + (end (subed-jump-to-subtitle-time-start 3)) + (orig-start-1 (subed--subtitle-msecs-start 1)) + (orig-stop-1 (subed--subtitle-msecs-stop 1)) + (orig-start-2 (subed--subtitle-msecs-start 2)) + (orig-stop-2 (subed--subtitle-msecs-stop 2)) + (orig-start-3 (subed--subtitle-msecs-start 3)) + (orig-stop-3 (subed--subtitle-msecs-stop 3))) + (subed-move-subtitle-forward 100 beg end) + (expect (subed--subtitle-msecs-start 1) :to-equal orig-start-1) + (expect (subed--subtitle-msecs-stop 1) :to-equal orig-stop-1) + (expect (subed--subtitle-msecs-start 2) :to-equal (+ orig-start-2 100)) + (expect (subed--subtitle-msecs-stop 2) :to-equal (+ orig-stop-2 100)) + (expect (subed--subtitle-msecs-start 3) :to-equal (+ orig-start-3 100)) + (expect (subed--subtitle-msecs-stop 3) :to-equal (+ orig-stop-3 100)) + (subed-move-subtitle-backward 100 beg end) + (expect (subed--subtitle-msecs-start 1) :to-equal orig-start-1) + (expect (subed--subtitle-msecs-stop 1) :to-equal orig-stop-1) + (expect (subed--subtitle-msecs-start 2) :to-equal orig-start-2) + (expect (subed--subtitle-msecs-stop 2) :to-equal orig-stop-2) + (expect (subed--subtitle-msecs-start 3) :to-equal orig-start-3) + (expect (subed--subtitle-msecs-stop 3) :to-equal orig-stop-3)))) + ) + (describe "Syncing player to point" :var (subed-mpv-playback-position) (before-each