Merge pull request #33 from mrordinaire/sitemap
Added sitemap generation.
This commit is contained in:
commit
e6c6bcbe26
6 changed files with 68 additions and 16 deletions
|
@ -55,3 +55,9 @@
|
||||||
**Description**: Import blog posts from Wordpress using their export tool. Blog entries will be read from the XML and converted into .post files. Afterwards the XML file will be deleted to prevent reimporting. Optionally an ```:output``` argument may be supplied to the plugin. If provided, it should be a directory in which to store the .post files. Otherwise, the value of ```:repo``` in your .coleslawrc will be used.
|
**Description**: Import blog posts from Wordpress using their export tool. Blog entries will be read from the XML and converted into .post files. Afterwards the XML file will be deleted to prevent reimporting. Optionally an ```:output``` argument may be supplied to the plugin. If provided, it should be a directory in which to store the .post files. Otherwise, the value of ```:repo``` in your .coleslawrc will be used.
|
||||||
|
|
||||||
**Example**: ```(import :filepath "/home/redline/redlinernotes-export.timestamp.xml" :output "/home/redlinernotes/blog/")```
|
**Example**: ```(import :filepath "/home/redline/redlinernotes-export.timestamp.xml" :output "/home/redlinernotes/blog/")```
|
||||||
|
|
||||||
|
## Sitemap generator
|
||||||
|
|
||||||
|
**Description**: this plugin generates a sitemap.xml under the page root, which is useful if you want google to crawl your site.
|
||||||
|
|
||||||
|
**Example**: ```(sitemap)```
|
||||||
|
|
29
plugins/sitemap.lisp
Normal file
29
plugins/sitemap.lisp
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
(defpackage :coleslaw-sitemap
|
||||||
|
(:use :cl)
|
||||||
|
(:import-from :coleslaw
|
||||||
|
#:*config*
|
||||||
|
#:deploy
|
||||||
|
#:domain
|
||||||
|
#:find-all
|
||||||
|
#:page-url
|
||||||
|
#:rel-path
|
||||||
|
#:staging-dir
|
||||||
|
#:theme-fn
|
||||||
|
#:write-page)
|
||||||
|
(:export #:enable))
|
||||||
|
|
||||||
|
(in-package :coleslaw-sitemap)
|
||||||
|
|
||||||
|
(defmethod deploy :before (staging)
|
||||||
|
"Render sitemap.xml under document root"
|
||||||
|
(let* ((urls (append '("" "sitemap.xml") ; empty string is for root url
|
||||||
|
(mapcar #'page-url (find-all 'coleslaw:post)))))
|
||||||
|
(write-page (rel-path (staging-dir *config*) "sitemap.xml")
|
||||||
|
(funcall (theme-fn :sitemap "feeds")
|
||||||
|
(list :domain (domain *config*)
|
||||||
|
:urls urls
|
||||||
|
:pubdate (local-time:format-rfc3339-timestring
|
||||||
|
nil
|
||||||
|
(local-time:now)))))))
|
||||||
|
|
||||||
|
(defun enable ())
|
|
@ -12,14 +12,18 @@
|
||||||
(with-output-to-string (str)
|
(with-output-to-string (str)
|
||||||
(3bmd:parse-string-and-print-to-stream text str)))))
|
(3bmd:parse-string-and-print-to-stream text str)))))
|
||||||
|
|
||||||
(defgeneric page-path (object)
|
(defgeneric page-url (object)
|
||||||
(:documentation "The path to store OBJECT at once rendered."))
|
(:documentation "The url to the object, without the domain"))
|
||||||
|
|
||||||
(defmethod page-path :around ((object t))
|
(defmethod page-url :around ((object t))
|
||||||
(let ((result (call-next-method)))
|
(let ((result (call-next-method)))
|
||||||
(if (pathname-type result)
|
(namestring (if (pathname-type result)
|
||||||
result
|
result
|
||||||
(make-pathname :type "html" :defaults result))))
|
(make-pathname :type "html" :defaults result)))))
|
||||||
|
|
||||||
|
(defun page-path (object)
|
||||||
|
"The path to store OBJECT at once rendered."
|
||||||
|
(rel-path (staging-dir *config*) (page-url object)))
|
||||||
|
|
||||||
(defun render-page (content &optional theme-fn &rest render-args)
|
(defun render-page (content &optional theme-fn &rest render-args)
|
||||||
"Render the given CONTENT to disk using THEME-FN if supplied.
|
"Render the given CONTENT to disk using THEME-FN if supplied.
|
||||||
|
|
|
@ -17,14 +17,14 @@
|
||||||
(defclass date-index (index) ())
|
(defclass date-index (index) ())
|
||||||
(defclass int-index (index) ())
|
(defclass int-index (index) ())
|
||||||
|
|
||||||
(defmethod page-path ((object index))
|
(defmethod page-url ((object index))
|
||||||
(rel-path (staging-dir *config*) (index-id object)))
|
(index-id object))
|
||||||
(defmethod page-path ((object tag-index))
|
(defmethod page-url ((object tag-index))
|
||||||
(rel-path (staging-dir *config*) "tag/~a" (index-id object)))
|
(format nil "tag/~a" (index-id object)))
|
||||||
(defmethod page-path ((object date-index))
|
(defmethod page-url ((object date-index))
|
||||||
(rel-path (staging-dir *config*) "date/~a" (index-id object)))
|
(format nil "date/~a" (index-id object)))
|
||||||
(defmethod page-path ((object int-index))
|
(defmethod page-url ((object int-index))
|
||||||
(rel-path (staging-dir *config*) "~d" (index-id object)))
|
(format nil "~d" (index-id object)))
|
||||||
|
|
||||||
(defun all-months ()
|
(defun all-months ()
|
||||||
"Retrieve a list of all months with published content."
|
"Retrieve a list of all months with published content."
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
:prev prev
|
:prev prev
|
||||||
:next next)))
|
:next next)))
|
||||||
|
|
||||||
(defmethod page-path ((object post))
|
(defmethod page-url ((object post))
|
||||||
(rel-path (staging-dir *config*) "posts/~a" (content-slug object)))
|
(format nil "posts/~a" (content-slug object)))
|
||||||
|
|
||||||
(defmethod initialize-instance :after ((object post) &key)
|
(defmethod initialize-instance :after ((object post) &key)
|
||||||
(with-accessors ((title post-title)
|
(with-accessors ((title post-title)
|
||||||
|
|
13
themes/sitemap.tmpl
Normal file
13
themes/sitemap.tmpl
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{namespace coleslaw.theme.feeds}
|
||||||
|
|
||||||
|
{template sitemap}
|
||||||
|
<?xml version="1.0"?>{\n}
|
||||||
|
<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>
|
||||||
|
{foreach $url in $urls}
|
||||||
|
<url>
|
||||||
|
<loc>{$domain}/{$url}</loc>
|
||||||
|
<lastmod>{$pubdate}</lastmod>
|
||||||
|
</url>
|
||||||
|
{/foreach}
|
||||||
|
</urlset>
|
||||||
|
{/template}
|
Loading…
Add table
Reference in a new issue