Simplify slug generation and page detection.
[pelican-mode.git] / pelican-mode.el
index 85d2be9..60089cd 100644 (file)
 ;; process a variety of text file formats.  For more information, see
 ;; URL https://blog.getpelican.com/.
 ;;
-;; It's intended to be used alongside `markdown-mode' or `rst-mode'.
-;; It also assumes you've set up Pelican with ``pelican-quickstart''
-;; or something like it.  In particular it assumes:
+;; It's intended to be used alongside a major mode for the Pelican
+;; document.  Currently supported formats are Markdown,
+;; reStructuredText, AsciiDoc, and Org.  It also assumes you've set up
+;; Pelican with ``pelican-quickstart'' or something like it.  In
+;; particular it expects:
 ;;
 ;;  * The existence of ``pelicanconf.py'' and ``Makefile'' in some
 ;;    ancestor directory.
@@ -170,7 +172,7 @@ When called from Lisp, VALUE may be any value; except for the
 following special values, the unquoted printed representation of
 it is used:
 
-- `now' means the current time; see `pelican-mode-timestamp'.
+- `now' means the current time.
 
 - `slug' means the file's path relative to the document root sans
   extension; see `pelican-mode-default-slug'.
@@ -181,7 +183,7 @@ The buffer must be in a format listed in `pelican-mode-formats'
 for this function to work correctly."
   (interactive "sField: \nsValue: ")
   (setq value (pcase value
-                ('now (pelican-mode-timestamp))
+                ('now (format-time-string "%Y-%m-%d %H:%M"))
                 ('slug (pelican-mode-default-slug))
                 ('"" nil)
                 (_ value)))
@@ -266,10 +268,6 @@ has no status."
 
 \f
 
-(defun pelican-mode-timestamp (&optional time)
-  "Generate a pelican-mode-compatible timestamp for TIME."
-  (format-time-string "%Y-%m-%d %H:%M" time))
-
 (defun pelican-mode-set-fields (&rest fields)
   "Insert a Pelican header for an article with metadata FIELDS."
   (mapc (apply-partially #'apply #'pelican-mode-set-field)
@@ -343,22 +341,20 @@ has no status."
 
 (defun pelican-mode-page-p ()
   "Return non-nil the current buffer is a Pelican page."
-  (when-let (pelican-mode-base (pelican-mode-find-root))
-    (let* ((relative (file-relative-name buffer-file-name pelican-mode-base))
-           (components (split-string relative "/")))
-      (equal "pages" (cadr components)))))
+  (string-match-p
+   "^[^/]+/pages/"
+   (file-relative-name
+    (abbreviate-file-name (or (buffer-file-name) (buffer-name)))
+    (pelican-mode-find-root))))
 
 (defun pelican-mode-default-slug ()
-  "Generate a Pelican article/page slug for the current buffer."
-  (if-let ((pelican-mode-base (pelican-mode-find-root))
-           (file-name (file-name-sans-extension buffer-file-name)))
-      (let* ((relative (file-relative-name file-name pelican-mode-base))
-             (components (cdr (split-string relative "/")))
-             (components (if (string= "pages" (car components))
-                             (cdr components) components)))
-        (mapconcat 'identity components "/"))
-    (when-let (file-name (file-name-sans-extension buffer-file-name))
-      (file-name-base file-name))))
+  "Generate a Pelican slug for the current buffer."
+  (file-name-sans-extension
+   (replace-regexp-in-string
+    "^[^/]+/\\(?:pages/\\)?" ""
+    (file-relative-name
+     (abbreviate-file-name (or (buffer-file-name) (buffer-name)))
+     (pelican-mode-find-root)))))
 
 (defun pelican-mode-find-root ()
   "Return the root of the buffer's Pelican site, or nil."