branch: elpa/subed commit 14d52d734351d114dc60f98305ad6abe8264ee43 Author: Random User <rnd...@posteo.de> Commit: Random User <rnd...@posteo.de>
Add subed--for-each-subtitle --- subed/subed.el | 20 ++++++++++++++++++++ tests/test-subed.el | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/subed/subed.el b/subed/subed.el index cd4e76c..4b31c41 100644 --- a/subed/subed.el +++ b/subed/subed.el @@ -376,6 +376,26 @@ subtitles) as long the subtitle IDs don't change." ('beginning-of-buffer nil) ('end-of-buffer nil))))) +(defmacro subed--for-each-subtitle (&optional beg end &rest body) + "Run BODY for each subtitle between the region specified by BEG and END. +If END is nil, it defaults to `point-max'. +If BEG and END are both nil, run BODY only on the subtitle at point. +Before BODY is run, point is placed on the subtitle's ID." + (declare (indent defun)) + `(if (not ,beg) + ;; Run body on subtitle at point + (progn (save-excursion (subed-jump-to-subtitle-id) + ,@body)) + (progn + ;; Run body on multiple subtitles + (save-excursion + (goto-char ,beg) + (subed-jump-to-subtitle-id) + (progn ,@body) + (while (and (<= (point) (or ,end (point-max))) + (subed-forward-subtitle-id)) + (progn ,@body)))))) + (defun subed-guess-video-file () "Return path to video if replacing the buffer file name's extension with members of `subed-video-extensions' yields an diff --git a/tests/test-subed.el b/tests/test-subed.el index 438693e..00b45f8 100644 --- a/tests/test-subed.el +++ b/tests/test-subed.el @@ -1,5 +1,56 @@ (add-to-list 'load-path "./subed") (require 'subed) +(require 'subed-srt) + +(describe "Iterating over subtitles" + (it "without beginning and end." + (with-temp-buffer + (insert mock-srt-data) + (subed-jump-to-subtitle-time-stop 1) + (subed--for-each-subtitle nil nil + (forward-line 2) + (kill-line) + (insert "Hello.")) + (expect (point) :to-equal 20) + (expect (subed--subtitle-text 1) :to-equal "Hello.") + (subed-jump-to-subtitle-time-stop 2) + (subed--for-each-subtitle nil nil + (forward-line 2) + (kill-line) + (insert "HEllo.")) + (expect (point) :to-equal 60) + (expect (subed--subtitle-text 2) :to-equal "HEllo.") + (subed-jump-to-subtitle-time-stop 3) + (subed--for-each-subtitle nil nil + (forward-line 2) + (kill-line) + (insert "HELlo.")) + (expect (point) :to-equal 100) + (expect (subed--subtitle-text 3) :to-equal "HELlo."))) + (it "with only the beginning." + (with-temp-buffer + (insert mock-srt-data) + (subed-jump-to-subtitle-time-start 1) + (expect (point) :to-equal 3) + (subed--for-each-subtitle 71 nil + (forward-line 2) + (kill-line) + (insert "Hello.")) + (expect (point) :to-equal 3) + (expect (subed--subtitle-text 2) :to-equal "Hello.") + (expect (subed--subtitle-text 3) :to-equal "Hello."))) + (it "with beginning and end." + (with-temp-buffer + (insert mock-srt-data) + (subed-jump-to-subtitle-time-stop 1) + (subed--for-each-subtitle 71 79 + (forward-line 2) + (kill-line) + (insert "Hello.")) + (expect (point) :to-equal 20) + (expect (subed--subtitle-text 2) :to-equal "Hello.") + (expect (subed--subtitle-text 3) :to-equal "Hello."))) + ) (describe "Syncing player to point" :var (subed-mpv-playback-position)