emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/subed 8a9b219706 01/22: Create derived modes for the diffe


From: ELPA Syncer
Subject: [nongnu] elpa/subed 8a9b219706 01/22: Create derived modes for the different types of subtitles.
Date: Tue, 1 Feb 2022 14:05:27 -0500 (EST)

branch: elpa/subed
commit 8a9b219706b148937533501ec83fe0154dea494c
Author: Sacha Chua <sacha@sachachua.com>
Commit: Sacha Chua <sacha@sachachua.com>

    Create derived modes for the different types of subtitles.
    
    This makes it easier to manually set a buffer's mode in case a file
    uses a different extension.
    
    * README.org: Add note about derived modes.
    * subed/subed-ass.el (subed-ass-mode): New derived mode.
    (auto-mode-alist): Handle .ass files.
    * subed/subed-srt.el (subed-srt-mode): New derived mode.
    (auto-mode-alist): Handle .srt files.
    * subed/subed-vtt.el (subed-vtt-mode): New derived mode.
    (auto-mode-alist): Handle .vtt files.
    * subed/subed.el (subed--init): New optional format parameter
    specifies the format to load.
    (subed-auto-find-video-maybe): Moved from subed--init to a function so
    that it can be in a mode hook.
    (subed-set-up-defaults): Moved from subed--init to a function so that
    it can be in a mode hook.
    (subed-mode): Use mode hooks to run code after derived modes have
    initialized.
    (item): Do not add to auto-mode-alist in the main file.
    * tests/test-subed-ass.el (with-temp-ass-buffer): Use subed-ass-mode.
    * tests/test-subed-common.el ("Trimming subtitles"): Use subed-srt-mode.
    * tests/test-subed-srt.el (with-temp-srt-buffer): Use subed-srt-mode.
    * tests/test-subed-vtt.el (with-temp-vtt-buffer): Use subed-vtt-mode.
---
 Makefile                   |  3 ++
 README.org                 |  7 +++-
 subed/subed-ass.el         |  9 +++++
 subed/subed-srt.el         |  9 +++++
 subed/subed-vtt.el         |  9 +++++
 subed/subed.el             | 91 +++++++++++++++++++++++-----------------------
 tests/test-subed-ass.el    |  2 +-
 tests/test-subed-common.el |  2 +-
 tests/test-subed-srt.el    |  2 +-
 tests/test-subed-vtt.el    |  2 +-
 10 files changed, 84 insertions(+), 52 deletions(-)

diff --git a/Makefile b/Makefile
index 5b5873a80f..dfafbb4e48 100644
--- a/Makefile
+++ b/Makefile
@@ -30,3 +30,6 @@ test-compile:
        emacs --quick --batch --eval "(progn (add-to-list 'load-path 
(expand-file-name \"subed\" default-directory)) \
                                             (byte-compile-file 
\"subed/subed-debug.el\"))"
        make clean
+
+test-emacs:
+       emacs -Q -L ./subed --eval "(require 'subed)"
diff --git a/README.org b/README.org
index 005b762d8c..318d1dc5b7 100644
--- a/README.org
+++ b/README.org
@@ -55,7 +55,7 @@ SubRip ( ~.srt~), WebVTT ( ~.vtt~ ), and Advanced SubStation 
Alpha ( ~.ass~, exp
      time is adjusted, and how much time to leave between subtitles.
 
 *** mpv integration (optional)
-   - Open videos with ~C-c C-v~ or automatically when entering subed-mode if 
the
+   - Open videos with ~C-c C-v~ or automatically when opening a subtitle file 
if the
      video file is named like the subtitle file but with a video extension
      (e.g. ~.mkv~ or ~.avi~).
    - Subtitles are automatically reloaded in mpv when the buffer is saved.
@@ -115,7 +115,10 @@ Here's an example setup if you use use-package:
   (add-hook 'subed-mode-hook (lambda () (setq-local fill-column 40))))
 #+END_SRC
 
-~C-h f subed-mode~ should get you started.
+~C-h f subed-mode~ should get you started. This is the parent mode for
+~subed-srt-mode~, ~subed-vtt-mode~, and ~subed-ass-mode~. When
+manually loading a mode, use those specific format modes instead of
+~subed-mode~.
 
 ** Contributions
    Contributions would be really appreciated! subed conforms to the 
[[https://reuse.software/spec/][REUSE
diff --git a/subed/subed-ass.el b/subed/subed-ass.el
index b2b0d9372d..faae396a11 100644
--- a/subed/subed-ass.el
+++ b/subed/subed-ass.el
@@ -457,5 +457,14 @@ Update the end timestamp accordingly."
   (setq-local subed--subtitle-format "ass")
   (setq-local font-lock-defaults '(subed-ass-font-lock-keywords)))
 
+;;;###autoload
+(define-derived-mode subed-ass-mode subed-mode "Subed-ASS"
+  "Major mode for editing Advanced SubStation Alpha subtitle files."
+  (subed--init "ass")
+  (subed-ass--init))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.ass\\'" . subed-ass-mode))
+
 (provide 'subed-ass)
 ;;; subed-ass.el ends here
diff --git a/subed/subed-srt.el b/subed/subed-srt.el
index 3a7989c735..9c27a10216 100644
--- a/subed/subed-srt.el
+++ b/subed/subed-srt.el
@@ -593,5 +593,14 @@ scheduled call is canceled and another call is scheduled in
   (add-hook 'subed-sanitize-functions #'subed-srt--regenerate-ids t t)
   (add-hook 'subed-validate-functions #'subed-srt--validate t t))
 
+;;;###autoload
+(define-derived-mode subed-srt-mode subed-mode "Subed-SRT"
+  "Major mode for editing SubRip subtitle files."
+  (subed--init "srt")
+  (subed-srt--init))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.srt\\'" . subed-srt-mode))
+
 (provide 'subed-srt)
 ;;; subed-srt.el ends here
diff --git a/subed/subed-vtt.el b/subed/subed-vtt.el
index d87fcd09aa..9da409be48 100644
--- a/subed/subed-vtt.el
+++ b/subed/subed-vtt.el
@@ -561,5 +561,14 @@ Update the end timestamp accordingly."
     (add-hook 'subed-sanitize-functions #'subed-vtt--sort nil t)
     (add-hook 'subed-validate-functions #'subed-vtt--validate t t)))
 
+;;;###autoload
+(define-derived-mode subed-vtt-mode subed-mode "Subed-VTT"
+  "Major mode for editing WebVTT subtitle files."
+  (subed--init "vtt")
+  (subed-vtt--init))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.vtt\\'" . subed-vtt-mode))
+
 (provide 'subed-vtt)
 ;;; subed-vtt.el ends here
diff --git a/subed/subed.el b/subed/subed.el
index 3366d08fbc..7701180b24 100644
--- a/subed/subed.el
+++ b/subed/subed.el
@@ -136,13 +136,15 @@
   "Return the format-specific function for the current buffer for FUNC-SUFFIX."
   (intern (concat "subed-" subed--subtitle-format "--" func-suffix)))
 
-(defun subed--init ()
-  "Call subtitle format-specific init function and (re-)alias generic 
functions."
+(defun subed--init (&optional format)
+  "Call subtitle format-specific init function and (re-)alias generic 
functions.
+If FORMAT is specified, use that.  If not, load the format
+specified in `subed--init-alist'."
   ;; Call format-specific init function based on file extension and
   ;; `subed--init-alist'.
   (let* ((file-ext (when (buffer-file-name)
                      (file-name-extension (buffer-file-name))))
-         (init-func (alist-get file-ext subed--init-alist nil nil 'equal)))
+         (init-func (alist-get (or format file-ext) subed--init-alist nil nil 
'equal)))
     (if (functionp init-func)
         (funcall init-func)
       (error "Missing init function: %S" init-func))
@@ -156,24 +158,44 @@
              (unless (functionp specific-func)
                (error "Missing subtitle format-specific function: %s" 
specific-func))
              (if (functionp specific-func)
-               (let* ((argspec (help-function-arglist specific-func))
-                      (argvars (seq-filter (lambda (argvar)
-                                             (let ((first-char (substring 
(symbol-name argvar) 0 1)))
-                                               (not (equal first-char "&"))))
-                                           argspec)))
-                 (defalias generic-func
-                   `(lambda ,argspec
-                      ,(interactive-form specific-func) ;; (interactive ...) 
or nil
-                      (let (;; Get the format-specific function for the current
-                            ;; buffer.  We must do this every time the generic
-                            ;; function is called because the result depends on
-                            ;; the buffer-local variable 
`subed--subtitle-format'.
-                            (specific-func (subed--get-specific-func 
,func-suffix))
-                            ;; Turn the list of variable names into a list of
-                            ;; corresponding values.
-                            (argvals (mapcar 'eval ',argvars)))
-                        (apply specific-func argvals)))
-                   (documentation specific-func t)))))))
+                 (let* ((argspec (help-function-arglist specific-func))
+                        (argvars (seq-filter (lambda (argvar)
+                                               (let ((first-char (substring 
(symbol-name argvar) 0 1)))
+                                                 (not (equal first-char "&"))))
+                                             argspec)))
+                   (defalias generic-func
+                     `(lambda ,argspec
+                        ,(interactive-form specific-func) ;; (interactive ...) 
or nil
+                        (let (;; Get the format-specific function for the 
current
+                              ;; buffer.  We must do this every time the 
generic
+                              ;; function is called because the result depends 
on
+                              ;; the buffer-local variable 
`subed--subtitle-format'.
+                              (specific-func (subed--get-specific-func 
,func-suffix))
+                              ;; Turn the list of variable names into a list of
+                              ;; corresponding values.
+                              (argvals (mapcar 'eval ',argvars)))
+                          (apply specific-func argvals)))
+                     (documentation specific-func t)))))))
+
+(defun subed-auto-find-video-maybe ()
+  "Load video associated with this subtitle file."
+  (let ((video-file (subed-guess-video-file)))
+      (when video-file
+        (subed-debug "Auto-discovered video file: %s" video-file)
+        (condition-case err
+            (subed-mpv-find-video video-file)
+          (error (message "%s -- Set subed-auto-find-video to nil to avoid 
this error."
+                          (car (cdr err))))))))
+
+;; TODO: Make these more configurable.
+(defun subed-set-up-defaults ()
+  "Quietly enable some recommended defaults."
+  (subed-enable-pause-while-typing :quiet)
+  (subed-enable-sync-point-to-player :quiet)
+  (subed-enable-sync-player-to-point :quiet)
+  (subed-enable-replay-adjusted-subtitle :quiet)
+  (subed-enable-loop-over-current-subtitle :quiet)
+  (subed-enable-show-cps :quiet))
 
 ;;;###autoload
 (define-derived-mode subed-mode text-mode "subed"
@@ -191,7 +213,6 @@ Adjust - Increase or decrease start or stop time of a 
subtitle
 Key bindings:
 \\{subed-mode-map}"
   :group 'subed
-  (subed--init)
   (add-hook 'post-command-hook #'subed--post-command-handler :append :local)
   (add-hook 'before-save-hook #'subed-prepare-for-save :append :local)
   (add-hook 'after-save-hook #'subed-mpv-reload-subtitles :append :local)
@@ -199,31 +220,9 @@ Key bindings:
   (add-hook 'kill-emacs-hook #'subed-mpv-kill :append :local)
   (when subed-trim-overlap-check-on-load
     (add-hook 'subed-mode-hook #'subed-trim-overlap-check :append :local))
+  (add-hook 'subed-mode-hook #'subed-set-up-defaults :append :local)
   (when subed-auto-find-video
-    (let ((video-file (subed-guess-video-file)))
-      (when video-file
-        (subed-debug "Auto-discovered video file: %s" video-file)
-        (condition-case err
-            (subed-mpv-find-video video-file)
-          (error (message "%s -- Set subed-auto-find-video to nil to avoid 
this error."
-                          (car (cdr err))))))))
-  (subed-enable-pause-while-typing :quiet)
-  (subed-enable-sync-point-to-player :quiet)
-  (subed-enable-sync-player-to-point :quiet)
-  (subed-enable-replay-adjusted-subtitle :quiet)
-  (subed-enable-loop-over-current-subtitle :quiet)
-  (subed-enable-show-cps :quiet))
-
-;; Internally, supported formats are listed in `subed--init-alist', which
-;; associates file extensions with format-specific init methods (e.g. "srt" ->
-;; subed-srt--init).  Here we map each file extension as a regexp to
-;; `subed-mode-enable', which will call the format-specific init method and do
-;; generic init stuff.
-;;;###autoload
-(dolist (item subed--init-alist)
-  (let ((file-ext-regex (car item)))
-    (add-to-list 'auto-mode-alist (cons (concat "\\." file-ext-regex "\\'")
-                                        'subed-mode))))
+    (add-hook 'subed-mode-hook #'subed-auto-find-video-maybe :append :local)))
 
 (provide 'subed)
 ;;; subed.el ends here
diff --git a/tests/test-subed-ass.el b/tests/test-subed-ass.el
index 8e79522500..10532b0539 100644
--- a/tests/test-subed-ass.el
+++ b/tests/test-subed-ass.el
@@ -25,7 +25,7 @@ Dialogue: 0,0:00:17.00,0:00:19.80,Default,,0,0,0,,I hope it 
works.
 (defmacro with-temp-ass-buffer (&rest body)
   "Call `subed-ass--init' in temporary buffer before running BODY."
   `(with-temp-buffer
-     (subed-ass--init)
+     (subed-ass-mode)
      (progn ,@body)))
 
 (describe "ASS"
diff --git a/tests/test-subed-common.el b/tests/test-subed-common.el
index 83fcb168e4..2fa62d8688 100644
--- a/tests/test-subed-common.el
+++ b/tests/test-subed-common.el
@@ -3094,6 +3094,6 @@ This is another.
         (let ((subed-trim-overlap-check-on-load t)
               (subed-subtitle-spacing 200))
           (spy-on 'subed-trim-overlap-check :and-return-value nil)
-          (subed-mode)
+          (subed-srt-mode)
           (expect subed--subtitle-format :to-equal "srt")
           (expect 'subed-trim-overlap-check :to-have-been-called))))))
diff --git a/tests/test-subed-srt.el b/tests/test-subed-srt.el
index 63a9158ddc..a272af833d 100644
--- a/tests/test-subed-srt.el
+++ b/tests/test-subed-srt.el
@@ -20,7 +20,7 @@ Baz.
 (defmacro with-temp-srt-buffer (&rest body)
   "Call `subed-srt--init' in temporary buffer before running BODY."
   `(with-temp-buffer
-    (subed-srt--init)
+    (subed-srt-mode)
     (progn ,@body)))
 
 (describe "Getting"
diff --git a/tests/test-subed-vtt.el b/tests/test-subed-vtt.el
index a044b8dafa..427b055795 100644
--- a/tests/test-subed-vtt.el
+++ b/tests/test-subed-vtt.el
@@ -19,7 +19,7 @@ Baz.
 (defmacro with-temp-vtt-buffer (&rest body)
   "Call `subed-vtt--init' in temporary buffer before running BODY."
   `(with-temp-buffer
-    (subed-vtt--init)
+    (subed-vtt-mode)
     (progn ,@body)))
 
 (describe "VTT"



reply via email to

[Prev in Thread] Current Thread [Next in Thread]