From 59c094fad6fffc5fccee107200ad33daf798e7e5 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Thu, 30 Jul 2015 15:40:18 +0200 Subject: [PATCH] Add jekyll related things --- init.el | 4 +- jekyll.el | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 jekyll.el diff --git a/init.el b/init.el index 84e986b..80ebede 100644 --- a/init.el +++ b/init.el @@ -47,7 +47,8 @@ (files (".#*" "*.so" "*~"))))) '(magit-auto-revert-mode nil) - '(magit-last-seen-setup-instructions "1.4.0")) + '(magit-last-seen-setup-instructions "1.4.0") + '(jekyll-directory "~/Projektek/jekyll/gergely.polonkai.eu")) (custom-set-faces ;; custom-set-faces was added by Custom. @@ -88,6 +89,7 @@ (load (concat user-emacs-directory "transpose-windows.el")) (load (concat user-emacs-directory "zim.el")) (load (concat user-emacs-directory "clearcase.el")) +(load (concat user-emacs-directory "jekyll.el")) (add-hook 'c-mode-hook (lambda () diff --git a/jekyll.el b/jekyll.el new file mode 100644 index 0000000..6b37fcb --- /dev/null +++ b/jekyll.el @@ -0,0 +1,112 @@ +;; Configuration for Jekyll (http://jekyllrb.com/) + +(defun jekyll-timestamp () + "Update existing date: timestamp on a Jekyll page or post." + (interactive) + (save-excursion (goto-char 1) + (re-search-forward "^date:") + (let ((beg (point))) + (end-of-line) + (delete-region beg (point))) + (insert (concat " " (format-time-string "%Y-%m-%d %H:%M:%S %z")))) + ) +;; TODO: Make the function add a date variable if none exists. + +;; (defun jekyll-timestamp () +;; "Insert a time stamp suitable for use in a Jekyll page or post. Replaces current text selection." +;; (interactive) +;; (when (region-active-p) (delete-region (region-beginning) (region-end) ) ) +;; (insert (format-time-string "%Y-%m-%d %H:%M:%S %z"))) + +;; All of the below is taken from http://www.gorgnegre.com/linux/using-emacs-orgmode-to-blog-with-jekyll.html +;; (Later tweaked a bit.) + +(global-set-key (kbd "C-c j n") 'jekyll-draft-post) +(global-set-key (kbd "C-c j p") 'jekyll-publish-post) +(global-set-key (kbd "C-c j t") 'jekyll-timestamp) +(global-set-key (kbd "C-c j o") (lambda () (interactive) (find-file "~/web/"))) + +(defcustom jekyll-directory + "~/web/" + "Path to Jekyll blog. It must end " + :type '(directory) + :group 'jekyll) +(defcustom jekyll-drafts-dir + "_drafts/" + "Path to article drafts. Relative to jekyll-directory." + :type '(string) + :group 'jekyll) +(defcustom jekyll-posts-dir + "_posts/" + "Path to articles. Relative to jekyll-directory." + :type '(string) + :group 'jekyll) +(defcustom jekyll-post-ext + ".md" + "File extension of Jekyll posts." + :type '(string) + :group 'jekyll) +(defcustom jekyll-post-template + "---\nlayout: post\ntitle: %s\ntags:\ndate: %t\n---\n" + "Default template for Jekyll posts. %s will be replace by the post title, %t will be replaced with the current timestamp" + :type '(string) + :group 'jekyll) + +(defun jekyll-make-slug (s) "Turn a string into a slug." + (replace-regexp-in-string " " + "-" + (downcase + (replace-regexp-in-string "[^A-Za-z0-9 ]" + "" s)))) + +(defun jekyll-yaml-escape (s) "Escape a string for YAML." + (if + (or + (string-match ":" s) + (string-match "\"" s)) + (concat "\"" (replace-regexp-in-string "\"" "\\\\\"" s) "\"") s)) + +(defun jekyll-draft-post (title) "Create a new Jekyll blog post." + (interactive "sPost Title: ") + (let ((draft-file (concat + (file-name-as-directory jekyll-directory) + jekyll-drafts-dir + (jekyll-make-slug title) + jekyll-post-ext))) + (if (file-exists-p draft-file) + (find-file draft-file) + (find-file draft-file) + (insert (format jekyll-post-template (jekyll-yaml-escape title)))))) + +(defun jekyll-publish-post () + "Move a draft post to the posts directory, and rename it so that it contains the date." + (interactive) + (cond + ((not (equal + (file-name-directory (buffer-file-name (current-buffer))) + (expand-file-name (concat + (file-name-as-directory jekyll-directory) + jekyll-drafts-dir)))) + (message "This is not a draft post.") + (insert (file-name-directory (buffer-file-name (current-buffer))) "\n" + (concat + (file-name-as-directory jekyll-directory) + jekyll-drafts-dir))) + ((buffer-modified-p) + (message "Can't publish post; buffer has modifications.")) + (t + (let ((filename + (concat + (file-name-as-directory jekyll-directory) + jekyll-posts-dir + (format-time-string "%Y-%m-%d-") + (file-name-nondirectory + (buffer-file-name (current-buffer))))) + (old-point (point))) + (rename-file (buffer-file-name (current-buffer)) + filename) + (kill-buffer nil) + (find-file filename) + (set-window-point (selected-window) old-point))))) + +(provide 'setup-jekyll)