Change -publish-draft to -publish, as it also publishes hidden pages.
--- /dev/null
+#!/usr/bin/make -f
+#
+# This is free and unencumbered software released into the public
+# domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a
+# compiled binary, for any purpose, commercial or non-commercial, and
+# by any means.
+
+EMACS ?= $(firstword $(shell command -v /Applications/Emacs.app/Contents/MacOS/Emacs emacs))
+SRC := pelican-mode.el
+OBJ := $(SRC:.el=.elc)
+DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+TESTS := $(SRC:.el=.test.stamp)
+
+.INTERMEDIATE: $(TESTS)
+
+all: $(OBJ) test
+
+clean:
+ rm -f $(OBJ) $(TESTS)
+
+test: $(TESTS)
+
+%.elc: %.el
+ $(EMACS) -Q -batch -L $(DIR) -f batch-byte-compile $<
+
+%.test.stamp: %-test.elc %.elc
+ $(EMACS) -Q -batch -L $(DIR) -eval "(checkdoc-file \"$*.el\")"
+ $(EMACS) -Q -batch -L $(DIR) -l $< -f ert-run-tests-batch-and-exit
+ touch $@
+
+.PHONY: all clean test
--- /dev/null
+;;; pelican-mode-test.el --- Tests pelican-mode -*- lexical-binding: t; -*-
+;;
+;; Copyright (C) 2017 Joe Wreschnig
+;;
+;; Author: Joe Wreschnig
+;;
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 2 of the License, or
+;; (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+\f
+
+;;; Commentary:
+;;
+;; This file contains test cases for pelican-mode. Unless you're
+;; hacking on it you shouldn't need to edit or run this file.
+
+\f
+
+;;; Code:
+
+(require 'ert)
+(require 'pelican-mode)
+
+(defun pelican-mode-test-article (mode expected1 expected2)
+ "Create an article in MODE and perform some edits.
+
+After the first edits, the buffer should contain EXPECTED1; after
+the second, EXPECTED2."
+ (with-temp-buffer
+ (rename-buffer "pelican-test.rst")
+ (funcall mode)
+ (pelican-mode)
+
+ (should (not (pelican-mode-find-root)))
+ (should (not (pelican-mode-page-p)))
+ (should (equal "pelican-test" (pelican-mode-default-slug)))
+
+ (insert "Not really a Pelican article.")
+ (pelican-mode-insert-article-header "Testing" "a, b, c")
+ (pelican-mode-set-field :test "hello world")
+ (pelican-mode-set-field :date "1111-11-11 11:11:11")
+ (should (equal (buffer-string) expected1))
+
+ (pelican-mode-publish)
+ (pelican-mode-set-fields
+ :title "More Tests"
+ :date "2222-22-22 22:22:22")
+ (pelican-mode-remove-field "test")
+ (should (equal (buffer-string) expected2))))
+
+(ert-deftest pelican-mode-test-rst-mode ()
+ (pelican-mode-test-article
+ #'rst-mode
+ "\
+Testing
+#######
+
+:date: 1111-11-11 11:11:11
+:status: draft
+:slug: pelican-test
+:tags: a, b, c
+:test: hello world
+
+Not really a Pelican article."
+
+ "\
+More Tests
+##########
+
+:date: 2222-22-22 22:22:22
+:slug: pelican-test
+:tags: a, b, c
+
+Not really a Pelican article."))
+
+(ert-deftest pelican-mode-test-org-mode ()
+ (pelican-mode-test-article
+ #'org-mode
+ "\
+#+TITLE: Testing
+#+DATE: 1111-11-11 11:11:11
+#+PROPERTY: STATUS draft
+#+PROPERTY: SLUG pelican-test
+#+PROPERTY: TAGS a, b, c
+#+PROPERTY: TEST hello world
+
+Not really a Pelican article."
+
+ "\
+#+TITLE: More Tests
+#+DATE: 2222-22-22 22:22:22
+#+PROPERTY: SLUG pelican-test
+#+PROPERTY: TAGS a, b, c
+
+Not really a Pelican article."))
+
+;;; pelican-mode-test.el ends here
(,(kbd "C-c P f") . pelican-set-field)
(,(kbd "C-c P h") . pelican-make-html)
(,(kbd "C-c P n") . pelican-mode-insert-header)
- (,(kbd "C-c P p") . pelican-mode-publish-draft)
+ (,(kbd "C-c P p") . pelican-mode-publish)
(,(kbd "C-c P u") . pelican-make-rsync-upload)))
;;;###autoload
(interactive "P")
(pelican-mode-set-field (if original :date :modified) 'now))
-(defun pelican-mode-publish-draft ()
- "Remove draft status from a Pelican article."
+(defun pelican-mode-publish ()
+ "Remove draft or hidden status from a Pelican article."
(interactive)
(pelican-mode-remove-field :status)
(pelican-mode-update-date :date))
-(defun pelican-mode-insert-draft-article-header (title tags)
- "Insert a Pelican header for a draft with a TITLE and TAGS."
+(defun pelican-mode-insert-article-header (title tags)
+ "Insert a Pelican header for an article with a TITLE and TAGS."
(interactive "sArticle title: \nsTags: ")
- (apply #'pelican-mode-set-fields
- `(:title ,title
- ,@pelican-mode-default-article-fields
- :tags ,tags)))
+ (save-excursion
+ (goto-char 0)
+ (insert "\n")
+ (apply #'pelican-mode-set-fields
+ `(:title ,title
+ ,@pelican-mode-default-article-fields
+ :tags ,tags))))
(defun pelican-mode-insert-page-header (title &optional hidden)
"Insert a Pelican header for a page with a TITLE.
If HIDDEN is non-nil, the page is marked hidden; otherwise it
has no status."
(interactive "sPage title: \nP")
- (apply #'pelican-mode-set-fields
- (append
- (list :title title :status (when hidden "hidden"))
- pelican-mode-default-page-fields)))
+ (save-excursion
+ (goto-char 0)
+ (insert "\n")
+ (apply #'pelican-mode-set-fields
+ (append
+ (list :title title :status (when hidden "hidden"))
+ pelican-mode-default-page-fields))))
(defun pelican-mode-insert-header ()
"Insert a Pelican header for a page or article."
(call-interactively
(if (pelican-mode-page-p)
#'pelican-mode-insert-page-header
- #'pelican-mode-insert-draft-article-header)))
+ #'pelican-mode-insert-article-header)))
(defun pelican-make (target)
"Execute TARGET in a Makefile at the root of the site."