[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"
- [nongnu] elpa/subed updated (f69c3e09f2 -> 3e99c6cb6f), ELPA Syncer, 2022/02/01
- [nongnu] elpa/subed 8120fb429f 04/22: Use defalias for non-interactive functions, ELPA Syncer, 2022/02/01
- [nongnu] elpa/subed 7a3eed2acf 14/22: New function subed-subtitle-list returns list, ELPA Syncer, 2022/02/01
- [nongnu] elpa/subed 8a9b219706 01/22: Create derived modes for the different types of subtitles.,
ELPA Syncer <=
- [nongnu] elpa/subed 0264eb4ef1 08/22: Bump version to 0.1.0 and add missing undercover-init.el, ELPA Syncer, 2022/02/01
- [nongnu] elpa/subed a0d633d7ac 09/22: Fix spaces in Makefile, ELPA Syncer, 2022/02/01
- [nongnu] elpa/subed 4cab871f58 03/22: Add undercover support for coverage testing, ELPA Syncer, 2022/02/01
- [nongnu] elpa/subed 3c7ac78393 12/22: Define jump-to-subtitle-text-at-msecs, ELPA Syncer, 2022/02/01
- [nongnu] elpa/subed f1f8e2ad56 13/22: Bugfixes to make VTT editing work, ELPA Syncer, 2022/02/01
- [nongnu] elpa/subed d6b46496f8 11/22: Fix save hook name, ELPA Syncer, 2022/02/01
- [nongnu] elpa/subed e1b24bff31 05/22: Remove duplicate functions, ELPA Syncer, 2022/02/01
- [nongnu] elpa/subed 5c4ac92ddc 07/22: Add NEWS.org file, ELPA Syncer, 2022/02/01
- [nongnu] elpa/subed f3b48e319e 16/22: Use function instead of quote in subed-define-generic-function, ELPA Syncer, 2022/02/01
- [nongnu] elpa/subed 5e9518da77 18/22: Work around direct call of subed-mode by guessing format, ELPA Syncer, 2022/02/01