From 57366f385a2f1f35bbe741d7542096db81368c72 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Thu, 17 Mar 2011 11:23:07 +0100 Subject: Big changes, last one before I wipe it all. * Added muse * Added graphviz-dot-mode * Remove all trailing whitespace on save. This is the last commit I'm going to do before throwing it all away again. --- emacs.d/elisp/muse/muse-blosxom.el | 306 +++++++++++++++++++++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 emacs.d/elisp/muse/muse-blosxom.el (limited to 'emacs.d/elisp/muse/muse-blosxom.el') diff --git a/emacs.d/elisp/muse/muse-blosxom.el b/emacs.d/elisp/muse/muse-blosxom.el new file mode 100644 index 0000000..78038d7 --- /dev/null +++ b/emacs.d/elisp/muse/muse-blosxom.el @@ -0,0 +1,306 @@ +;;; muse-blosxom.el --- publish a document tree for serving by (py)Blosxom + +;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 +;; Free Software Foundation, Inc. + +;; Author: Michael Olson +;; Date: Wed, 23 March 2005 + +;; This file is part of Emacs Muse. It is not part of GNU Emacs. + +;; Emacs Muse 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 3, or (at your +;; option) any later version. + +;; Emacs Muse 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 Emacs Muse; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Commentary: + +;; The Blosxom publishing style publishes a tree of categorised files +;; to a mirrored tree of stories to be served by blosxom.cgi or +;; pyblosxom.cgi. +;; +;; Serving entries with (py)blosxom +;; -------------------------------- +;; +;; Each Blosxom file must include `#date yyyy-mm-dd', or optionally +;; the longer `#date yyyy-mm-dd-hh-mm', a title (using the `#title' +;; directive) plus whatever normal content is desired. +;; +;; The date directive is not used directly by (py)blosxom or this +;; program. You need to find two additional items to make use of this +;; feature. +;; +;; 1. A script to gather date directives from the entire blog tree +;; into a single file. The file must associate a blog entry with +;; a date. +;; +;; 2. A plugin for (py)blosxom that reads this file. +;; +;; These 2 things are provided for pyblosxom in the contrib/pyblosxom +;; subdirectory. `getstamps.py' provides the 1st service, while +;; `hardcodedates.py' provides the second service. Eventually it is +;; hoped that a blosxom plugin and script will be found/written. +;; +;; Alternately, the pyblosxom metadate plugin may be used. On the +;; plus side, there is no need to run a script to gather the date. On +;; the downside, each entry is read twice rather than once when the +;; page is rendered. Set the value of muse-blosxom-use-metadate to +;; non-nil to enable adding a #postdate directive to all published +;; files. You can do this by: +;; +;; M-x customize-variable RET muse-blosxom-use-metadate RET +;; +;; With the metadate plugin installed in pyblosxom, the date set in +;; this directive will be used instead of the file's modification +;; time. The plugin is included with Muse at +;; contrib/pyblosxom/metadate.py. +;; +;; Generating a Muse project entry +;; ------------------------------- +;; +;; Muse-blosxom has some helper functions to make specifying +;; muse-blosxom projects a lot easier. An example follows. +;; +;; (setq muse-project-alist +;; `(("blog" +;; (,@(muse-project-alist-dirs "~/path/to/blog-entries") +;; :default "index") +;; ,@(muse-project-alist-styles "~/path/to/blog-entries" +;; "~/public_html/blog" +;; "blosxom-xhtml") +;; ))) +;; +;; Note that we need a backtick instead of a single quote on the +;; second line of this example. +;; +;; Creating new blog entries +;; ------------------------- +;; +;; There is a function called `muse-blosxom-new-entry' that will +;; automate the process of making a new blog entry. To make use of +;; it, do the following. +;; +;; - Customize `muse-blosxom-base-directory' to the location that +;; your blog entries are stored. +;; +;; - Assign the `muse-blosxom-new-entry' function to a key sequence. +;; I use the following code to assign this function to `C-c p l'. +;; +;; (global-set-key "\C-cpl" 'muse-blosxom-new-entry) +;; +;; - You should create your directory structure ahead of time under +;; your base directory. These directories, which correspond with +;; category names, may be nested. +;; +;; - When you enter this key sequence, you will be prompted for the +;; category of your entry and its title. Upon entering this +;; information, a new file will be created that corresponds with +;; the title, but in lowercase letters and having special +;; characters converted to underscores. The title and date +;; directives will be inserted automatically. +;; +;; Using tags +;; ---------- +;; +;; If you wish to keep all of your blog entries in one directory and +;; use tags to classify your entries, set `muse-blosxom-use-tags' to +;; non-nil. +;; +;; For this to work, you will need to be using the PyBlosxom plugin at +;; http://pyblosxom.sourceforge.net/blog/registry/meta/Tags. + +;;; Contributors: + +;; Gary Vaughan (gary AT gnu DOT org) is the original author of +;; `emacs-wiki-blosxom.el', which is the ancestor of this file. + +;; Brad Collins (brad AT chenla DOT org) ported this file to Muse. + +;; Björn Lindström (bkhl AT elektrubadur DOT se) made many valuable +;; suggestions. + +;; Sasha Kovar (sasha AT arcocene DOT org) fixed +;; muse-blosxom-new-entry when using tags and also implemented support +;; for the #postdate directive. + +;;; Code: + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Muse Blosxom Publishing +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(require 'muse-project) +(require 'muse-publish) +(require 'muse-html) + +(defgroup muse-blosxom nil + "Options controlling the behavior of Muse Blosxom publishing. +See `muse-blosxom' for more information." + :group 'muse-publish) + +(defcustom muse-blosxom-extension ".txt" + "Default file extension for publishing Blosxom files." + :type 'string + :group 'muse-blosxom) + +(defcustom muse-blosxom-header + "(concat (muse-publishing-directive \"title\") \"\\n\" + (when muse-blosxom-use-metadate + (let ((date (muse-publishing-directive \"date\"))) + (when date (concat \"#postdate \" + (muse-blosxom-format-date date) \"\\n\")))) + (when muse-blosxom-use-tags + (let ((tags (muse-publishing-directive \"tags\"))) + (when tags (concat \"#tags \" tags \"\\n\")))))" + "Header used for publishing Blosxom files. This may be text or a filename." + :type 'string + :group 'muse-blosxom) + +(defcustom muse-blosxom-footer "" + "Footer used for publishing Blosxom files. This may be text or a filename." + :type 'string + :group 'muse-blosxom) + +(defcustom muse-blosxom-base-directory "~/Blog" + "Base directory of blog entries. +This is the top-level directory where your Muse blog entries may be found." + :type 'directory + :group 'muse-blosxom) + +(defcustom muse-blosxom-use-tags nil + "Determine whether or not to enable use of the #tags directive. + +If you wish to keep all of your blog entries in one directory and +use tags to classify your entries, set `muse-blosxom-use-tags' to +non-nil. + +For this to work, you will need to be using the PyBlosxom plugin +at http://pyblosxom.sourceforge.net/blog/registry/meta/Tags." + :type 'boolean + :group 'muse-blosxom) + +(defcustom muse-blosxom-use-metadate nil + "Determine whether or not to use the #postdate directive. + +If non-nil, published entries include the original date (as specified +in the muse #date line) which can be read by the metadate PyBlosxom +plugin. + +For this to work, you will need to be using the PyBlosxom plugin +at http://pyblosxom.sourceforge.net/blog/registry/date/metadate." + :type 'boolean + :group 'muse-blosxom) + +;; Maintain (published-file . date) alist, which will later be written +;; to a timestamps file; not implemented yet. + +(defvar muse-blosxom-page-date-alist nil) + +(defun muse-blosxom-update-page-date-alist () + "Add a date entry to `muse-blosxom-page-date-alist' for this page." + (when muse-publishing-current-file + ;; Make current file be relative to base directory + (let ((rel-file + (concat + (file-name-as-directory + (or (muse-publishing-directive "category") + (file-relative-name + (file-name-directory + (expand-file-name muse-publishing-current-file)) + (file-truename muse-blosxom-base-directory)))) + (file-name-nondirectory muse-publishing-current-file)))) + ;; Strip the file extension + (when muse-ignored-extensions-regexp + (setq rel-file (save-match-data + (and (string-match muse-ignored-extensions-regexp + rel-file) + (replace-match "" t t rel-file))))) + ;; Add to page-date alist + (add-to-list + 'muse-blosxom-page-date-alist + `(,rel-file . ,(muse-publishing-directive "date")))))) + +;; Enter a new blog entry + +(defun muse-blosxom-title-to-file (title) + "Derive a file name from the given TITLE. + +Feel free to overwrite this if you have a different concept of what +should be allowed in a filename." + (muse-replace-regexp-in-string (concat "[^-." muse-regexp-alnum "]") + "_" (downcase title))) + +(defun muse-blosxom-format-date (date) + "Convert a date string to PyBlosxom metadate plugin format." + (apply #'format "%s-%s-%s %s:%s" (split-string date "-"))) + +;;;###autoload +(defun muse-blosxom-new-entry (category title) + "Start a new blog entry with given CATEGORY. +The filename of the blog entry is derived from TITLE. +The page will be initialized with the current date and TITLE." + (interactive + (list + (if muse-blosxom-use-tags + (let ((tag "foo") + (tags nil)) + (while (progn (setq tag (read-string "Tag (RET to continue): ")) + (not (string= tag ""))) + (add-to-list 'tags tag t)) + tags) + (funcall muse-completing-read-function + "Category: " + (mapcar 'list (muse-project-recurse-directory + muse-blosxom-base-directory)))) + (read-string "Title: "))) + (let ((file (muse-blosxom-title-to-file title))) + (muse-project-find-file + file "blosxom" nil + (if muse-blosxom-use-tags + (directory-file-name muse-blosxom-base-directory) + (concat (directory-file-name muse-blosxom-base-directory) + "/" category)))) + (goto-char (point-min)) + (insert "#date " (format-time-string "%Y-%m-%d-%H-%M") + "\n#title " title) + (if muse-blosxom-use-tags + (if (> (length category) 0) + (insert (concat "\n#tags " (mapconcat #'identity category ",")))) + (unless (string= category "") + (insert (concat "\n#category " category)))) + (insert "\n\n") + (forward-line 2)) + +;;; Register the Muse Blosxom Publisher + +(muse-derive-style "blosxom-html" "html" + :suffix 'muse-blosxom-extension + :link-suffix 'muse-html-extension + :header 'muse-blosxom-header + :footer 'muse-blosxom-footer + :after 'muse-blosxom-update-page-date-alist + :browser 'find-file) + +(muse-derive-style "blosxom-xhtml" "xhtml" + :suffix 'muse-blosxom-extension + :link-suffix 'muse-xhtml-extension + :header 'muse-blosxom-header + :footer 'muse-blosxom-footer + :after 'muse-blosxom-update-page-date-alist + :browser 'find-file) + +(provide 'muse-blosxom) + +;;; muse-blosxom.el ends here -- cgit v1.2.3-54-g00ecf