1 ;;; muse-journal.el --- keep and publish a journal
3 ;; Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
5 ;; This file is part of Emacs Muse. It is not part of GNU Emacs.
7 ;; Emacs Muse is free software; you can redistribute it and/or modify
8 ;; it under the terms of the GNU General Public License as published
9 ;; by the Free Software Foundation; either version 3, or (at your
10 ;; option) any later version.
12 ;; Emacs Muse is distributed in the hope that it will be useful, but
13 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 ;; General Public License for more details.
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with Emacs Muse; see the file COPYING. If not, write to the
19 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 ;; Boston, MA 02110-1301, USA.
24 ;; The module facilitates the keeping and publication of a journal.
25 ;; When publishing to HTML, it assumes the form of a web log, or blog.
27 ;; The input format for each entry is as follows:
29 ;; * 20040317: Title of entry
31 ;; Text for the entry.
34 ;; "You know who you are. It comes down to a simple gut check: You
35 ;; either love what you do or you don't. Period." -- P. Bronson
38 ;; The "qotd", or Quote of the Day, is entirely optional. When
39 ;; generated to HTML, this entry is rendered as:
41 ;; <div class="entry">
42 ;; <div class="entry-qotd">
43 ;; <h3>Quote of the Day:</h3>
44 ;; <p>"You know who you are. It comes down to a simple gut
45 ;; check: You either love what you do or you don't. Period."
48 ;; <div class="entry-body">
49 ;; <div class="entry-head">
50 ;; <div class="entry-date">
51 ;; <span class="date">March 17, 2004</span>
53 ;; <div class="entry-title">
54 ;; <h2>Title of entry</h2>
57 ;; <div class="entry-text">
58 ;; <p>Text for the entry.</p>
63 ;; The plurality of "div" tags makes it possible to display the
64 ;; entries in any form you wish, using a CSS style.
66 ;; Also, an .RDF file can be generated from your journal by publishing
67 ;; it with the "rdf" style. It uses the first two sentences of the
68 ;; first paragraph of each entry as its "description", and
69 ;; autogenerates tags for linking to the various entries.
73 ;; René Stadler (mail AT renestadler DOT de) provided a patch that
74 ;; causes dates in RSS feeds to be generated in a format that RSS
79 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
81 ;; Muse Journal Publishing
83 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
85 (require 'muse-publish
)
90 (defgroup muse-journal nil
91 "Rules for transforming a journal into its final form."
94 (defcustom muse-journal-heading-regexp
95 "\\(?:\\([0-9]+\\)\\(?:: \\)?\\)?\\(.+?\\)?"
96 "A regexp that matches a journal heading.
97 Paren group 1 is the ISO date, group 2 is the optional category,
98 and group 3 is the optional heading for the entry."
100 :group
'muse-journal
)
102 (defcustom muse-journal-date-format
"%a, %e %b %Y"
103 "Date format to use for journal entries."
105 :group
'muse-journal
)
107 (defcustom muse-journal-html-heading-regexp
108 (concat "^<h2[^>\n]*>" muse-journal-heading-regexp
"</h2>$")
109 "A regexp that matches a journal heading from an HTML document.
110 Paren group 1 is the ISO date, group 2 is the optional category,
111 and group 3 is the optional heading for the entry."
113 :group
'muse-journal
)
115 (defcustom muse-journal-rss-heading-regexp
116 (concat "^\\* " muse-journal-heading-regexp
"$")
117 "A regexp that matches a journal heading from an HTML document.
118 Paren group 1 is the ISO date, group 2 is the optional category,
119 and group 3 is the optional heading for the entry."
121 :group
'muse-journal
)
123 (defcustom muse-journal-html-entry-template
124 "<div class=\"entry\">
125 <a name=\"%anchor%\" style=\"text-decoration: none\"> </a>
126 <div class=\"entry-body\">
127 <div class=\"entry-head\">
128 <div class=\"entry-date\">
129 <span class=\"date\">%date%</span>
131 <div class=\"entry-title\">
135 <div class=\"entry-text\">
136 <div class=\"entry-qotd\">
143 "Template used to publish individual journal entries as HTML.
144 This may be text or a filename."
146 :group
'muse-journal
)
148 (defcustom muse-journal-latex-section
149 "\\section*{%title% \\hfill {\\normalsize %date%}}
150 \\addcontentsline{toc}{chapter}{%title%}"
151 "Template used to publish a LaTeX section."
153 :group
'muse-journal
)
155 (defcustom muse-journal-latex-subsection
156 "\\subsection*{%title%}
157 \\addcontentsline{toc}{section}{%title%}"
158 "Template used to publish a LaTeX subsection."
160 :group
'muse-journal
)
162 (defcustom muse-journal-markup-tags
163 '(("qotd" t nil nil muse-journal-qotd-tag
))
164 "A list of tag specifications, for specially marking up Journal entries.
165 See `muse-publish-markup-tags' for more info.
167 This is used by journal-latex and its related styles, as well as
168 the journal-rss-entry style, which both journal-rdf and
170 :type
'(repeat (list (string :tag
"Markup tag")
171 (boolean :tag
"Expect closing tag" :value t
)
172 (boolean :tag
"Parse attributes" :value nil
)
173 (boolean :tag
"Nestable" :value nil
)
175 :group
'muse-journal
)
177 ;; FIXME: This doesn't appear to be used.
178 (defun muse-journal-generate-pages ()
179 (let ((output-dir (muse-style-element :path
)))
180 (goto-char (point-min))
181 (while (re-search-forward muse-journal-heading-regexp nil t
)
182 (let* ((date (match-string 1))
183 (category (match-string 1))
184 (category-file (concat output-dir category
"/index.html"))
185 (heading (match-string 1)))
188 (defcustom muse-journal-rdf-extension
".rdf"
189 "Default file extension for publishing RDF (RSS 1.0) files."
191 :group
'muse-journal
)
193 (defcustom muse-journal-rdf-base-url
""
194 "The base URL of the website referenced by the RDF file."
196 :group
'muse-journal
)
198 (defcustom muse-journal-rdf-header
199 "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"
200 xmlns=\"http://purl.org/rss/1.0/\"
201 xmlns:dc=\"http://purl.org/dc/elements/1.1/\">
202 <channel rdf:about=\"<lisp>(concat (muse-style-element :base-url)
203 (muse-publish-link-name))</lisp>\">
204 <title><lisp>(muse-publishing-directive \"title\")</lisp></title>
205 <link><lisp>(concat (muse-style-element :base-url)
206 (concat (muse-page-name)
207 muse-html-extension))</lisp></link>
208 <description><lisp>(muse-publishing-directive \"desc\")</lisp></description>
211 <rdf:li resource=\"<lisp>
212 (concat (muse-style-element :base-url)
213 (concat (muse-page-name)
214 muse-html-extension))</lisp>\"/>
218 "Header used for publishing RDF (RSS 1.0) files.
219 This may be text or a filename."
221 :group
'muse-journal
)
223 (defcustom muse-journal-rdf-footer
225 "Footer used for publishing RDF (RSS 1.0) files.
226 This may be text or a filename."
228 :group
'muse-journal
)
230 (defcustom muse-journal-rdf-date-format
232 "Date format to use for RDF entries."
234 :group
'muse-journal
)
236 (defcustom muse-journal-rdf-entry-template
237 "\n <item rdf:about=\"%link%#%anchor%\">
238 <title>%title%</title>
242 <link>%link%#%anchor%</link>
243 <dc:date>%date%</dc:date>
244 <dc:creator>%maintainer%</dc:creator>
246 "Template used to publish individual journal entries as RDF.
247 This may be text or a filename."
249 :group
'muse-journal
)
251 (defcustom muse-journal-rdf-summarize-entries nil
252 "If non-nil, include only summaries in the RDF file, not the full data.
254 The default is nil, because this annoys some subscribers."
256 :group
'muse-journal
)
258 (defcustom muse-journal-rss-extension
".xml"
259 "Default file extension for publishing RSS 2.0 files."
261 :group
'muse-journal
)
263 (defcustom muse-journal-rss-base-url
""
264 "The base URL of the website referenced by the RSS file."
266 :group
'muse-journal
)
268 (defcustom muse-journal-rss-header
269 "<\?xml version=\"1.0\" encoding=\"<lisp>
270 (muse-html-encoding)</lisp>\"?>
271 <rss version=\"2.0\">
273 <title><lisp>(muse-publishing-directive \"title\")</lisp></title>
274 <link><lisp>(concat (muse-style-element :base-url)
275 (concat (muse-page-name)
276 muse-html-extension))</lisp></link>
277 <description><lisp>(muse-publishing-directive \"desc\")</lisp></description>
278 <language>en-us</language>
279 <generator>Emacs Muse</generator>\n\n"
280 "Header used for publishing RSS 2.0 files. This may be text or a filename."
282 :group
'muse-journal
)
284 (defcustom muse-journal-rss-footer
287 "Footer used for publishing RSS 2.0 files. This may be text or a filename."
289 :group
'muse-journal
)
291 (defcustom muse-journal-rss-date-format
292 "%a, %d %b %Y %H:%M:%S %Z"
293 "Date format to use for RSS 2.0 entries."
295 :group
'muse-journal
)
297 (defcustom muse-journal-rss-entry-template
299 <title>%title%</title>
300 <link>%link%#%anchor%</link>
301 <description>%desc%</description>
302 <author><lisp>(muse-publishing-directive \"author\")</lisp></author>
303 <pubDate>%date%</pubDate>
304 <guid>%link%#%anchor%</guid>
307 "Template used to publish individual journal entries as RSS 2.0.
308 This may be text or a filename."
310 :group
'muse-journal
)
312 (defcustom muse-journal-rss-enclosure-types-alist
313 '(("mp3" .
"audio/mpeg"))
314 "File types that are accepted as RSS enclosures.
315 This is an alist that maps file extension to content type.
316 Useful for podcasting."
317 :type
'(alist :key-type string
:value-type string
)
318 :group
'muse-journal
)
320 (defcustom muse-journal-rss-summarize-entries nil
321 "If non-nil, include only summaries in the RSS file, not the full data.
323 The default is nil, because this annoys some subscribers."
325 :group
'muse-journal
)
327 (defcustom muse-journal-rss-markup-regexps
328 '((10000 muse-explicit-link-regexp
0 "\\2"))
329 "List of markup rules for publishing a Muse journal page to RSS 2.0.
330 For more information on the structure of this list, see
331 `muse-publish-markup-regexps'."
332 :type
'(repeat (choice
333 (list :tag
"Markup rule"
335 (choice regexp symbol
)
337 (choice string function symbol
))
339 :group
'muse-journal
)
341 (defcustom muse-journal-rss-markup-functions
345 "An alist of style types to custom functions for that kind of text.
346 For more on the structure of this list, see
347 `muse-publish-markup-functions'."
348 :type
'(alist :key-type symbol
:value-type function
)
349 :group
'muse-journal
)
351 (defun muse-journal-anchorize-title (title)
353 (if (string-match "(" title
)
354 (setq title
(substring title
0 (match-beginning 0))))
355 (if (string-match "<[^>]+>" title
)
356 (setq title
(replace-match "" nil nil title
)))
357 (downcase (muse-replace-regexp-in-string "[^a-zA-Z0-9_]" "" title
))))
359 (defun muse-journal-sort-entries (&optional direction
)
365 (if (re-search-forward "^\\* [0-9]+" nil t
)
366 (goto-char (match-beginning 0))
367 (goto-char (point-max)))))
370 (if (re-search-forward "^\\* [0-9]+" nil t
)
371 (goto-char (1- (match-beginning 0)))
372 (goto-char (point-max)))))
380 (defun muse-journal-qotd-tag (beg end
)
381 (muse-publish-ensure-block beg end
)
382 (muse-insert-markup (muse-markup-text 'begin-quote
))
383 (muse-insert-markup (muse-markup-text 'begin-quote-item
))
385 (muse-insert-markup (muse-markup-text 'end-quote-item
))
386 (muse-insert-markup (muse-markup-text 'end-quote
)))
388 (defun muse-journal-html-munge-buffer ()
389 (goto-char (point-min))
390 (let ((heading-regexp muse-journal-html-heading-regexp
)
391 (inhibit-read-only t
))
392 (while (re-search-forward heading-regexp nil t
)
393 (let* ((date (match-string 1))
395 (title (match-string 2))
398 (delete-region (match-beginning 0) (match-end 0))
401 (while (string-match "\\(^<[^>]+>\\|<[^>]+>$\\)" clean-title
)
402 (setq clean-title
(replace-match "" nil nil clean-title
)))))
406 (concat "\\`\\([1-9][0-9][0-9][0-9]\\)[./]?"
407 "\\([0-1][0-9]\\)[./]?\\([0-3][0-9]\\)") date
))
411 (string-to-number (match-string 3 date
))
412 (string-to-number (match-string 2 date
))
413 (string-to-number (match-string 1 date
))
415 date
(concat (format-time-string
416 muse-journal-date-format datestamp
)
417 (substring date
(match-end 0))))))
420 (point) (if (re-search-forward
421 (concat "\\(^<hr>$\\|"
422 heading-regexp
"\\)") nil t
)
425 (goto-char (point-max))
426 (while (and (not (bobp))
427 (eq ?\
(char-syntax (char-before))))
429 (goto-char (point-min))
430 (while (and (not (eobp))
431 (eq ?\
(char-syntax (char-after))))
434 (when (search-forward "<qotd>" nil t
)
435 (let ((tag-beg (match-beginning 0))
438 (re-search-forward "</qotd>\n*")
439 (setq end
(point-marker))
441 (narrow-to-region beg
(match-beginning 0))
442 (muse-publish-escape-specials (point-min) (point-max)
444 (setq qotd
(buffer-substring-no-properties
445 (point-min) (point-max))))
446 (delete-region tag-beg end
)
447 (set-marker end nil
))))
448 (setq text
(buffer-string))
449 (delete-region (point-min) (point-max))
450 (let ((entry muse-journal-html-entry-template
))
451 (muse-insert-file-or-string entry
)
452 (muse-publish-mark-read-only (point-min) (point-max))
453 (goto-char (point-min))
454 (while (search-forward "%date%" nil t
)
455 (remove-text-properties (match-beginning 0) (match-end 0)
456 '(read-only nil rear-nonsticky nil
))
457 (replace-match (or date
"") nil t
))
458 (goto-char (point-min))
459 (while (search-forward "%title%" nil t
)
460 (remove-text-properties (match-beginning 0) (match-end 0)
461 '(read-only nil rear-nonsticky nil
))
462 (replace-match (or title
" ") nil t
))
463 (goto-char (point-min))
464 (while (search-forward "%anchor%" nil t
)
465 (replace-match (muse-journal-anchorize-title
466 (or clean-title orig-date
))
468 (goto-char (point-min))
469 (while (search-forward "%qotd%" nil t
)
471 (narrow-to-region (match-beginning 0) (match-end 0))
472 (delete-region (point-min) (point-max))
473 (when qotd
(muse-insert-markup qotd
))))
474 (goto-char (point-min))
475 (while (search-forward "%text%" nil t
)
476 (remove-text-properties (match-beginning 0) (match-end 0)
477 '(read-only nil rear-nonsticky nil
))
478 (replace-match text nil t
))
480 (goto-char (point-min))
481 (when (search-forward "<div class=\"entry-qotd\">" nil t
)
482 (let ((beg (match-beginning 0)))
483 (re-search-forward "</div>\n*" nil t
)
484 (delete-region beg
(point))))))))))
485 ;; indicate that we are to continue the :before-end processing
488 (defun muse-journal-latex-munge-buffer ()
489 (goto-char (point-min))
490 (let ((heading-regexp
491 (concat "^" (regexp-quote (muse-markup-text 'section
))
492 muse-journal-heading-regexp
493 (regexp-quote (muse-markup-text 'section-end
)) "$"))
494 (inhibit-read-only t
))
495 (when (re-search-forward heading-regexp nil t
)
496 (goto-char (match-beginning 0))
500 (if (re-search-forward heading-regexp nil t
)
501 (goto-char (match-beginning 0))
502 (goto-char (point-max)))))
505 (if (re-search-forward heading-regexp nil t
)
506 (goto-char (1- (match-beginning 0)))
507 (goto-char (point-max)))))
514 (while (re-search-forward heading-regexp nil t
)
515 (let ((date (match-string 1))
516 (title (match-string 2))
517 ;; FIXME: Nothing is done with qotd
522 (concat "\\([1-9][0-9][0-9][0-9]\\)[./]?"
523 "\\([0-1][0-9]\\)[./]?\\([0-3][0-9]\\)") date
))
524 (setq date
(encode-time
526 (string-to-number (match-string 3 date
))
527 (string-to-number (match-string 2 date
))
528 (string-to-number (match-string 1 date
))
530 date
(format-time-string
531 muse-journal-date-format date
))))
533 (narrow-to-region (match-beginning 0) (match-end 0))
534 (delete-region (point-min) (point-max))
535 (muse-insert-markup muse-journal-latex-section
)
536 (goto-char (point-min))
537 (while (search-forward "%title%" nil t
)
538 (replace-match (or title
"Untitled") nil t
))
539 (goto-char (point-min))
540 (while (search-forward "%date%" nil t
)
541 (replace-match (or date
"") nil t
))))))
542 (goto-char (point-min))
543 (let ((subheading-regexp
544 (concat "^" (regexp-quote (muse-markup-text 'subsection
))
546 (regexp-quote (muse-markup-text 'subsection-end
)) "$"))
547 (inhibit-read-only t
))
548 (while (re-search-forward subheading-regexp nil t
)
549 (let ((title (match-string 1)))
551 (narrow-to-region (match-beginning 0) (match-end 0))
552 (delete-region (point-min) (point-max))
553 (muse-insert-markup muse-journal-latex-subsection
)
554 (goto-char (point-min))
555 (while (search-forward "%title%" nil t
)
556 (replace-match title nil t
))))))
557 ;; indicate that we are to continue the :before-end processing
560 (defun muse-journal-rss-munge-buffer ()
561 (goto-char (point-min))
562 (let ((heading-regexp muse-journal-rss-heading-regexp
)
563 (inhibit-read-only t
))
564 (while (re-search-forward heading-regexp nil t
)
565 (let* ((date (match-string 1))
567 (title (match-string 2))
568 ;; FIXME: Nothing is done with qotd
572 (if (string-match muse-explicit-link-regexp title
)
573 (setq enclosure
(muse-get-link title
)
574 title
(muse-get-link-desc title
)))))
578 (concat "\\([1-9][0-9][0-9][0-9]\\)[./]?"
579 "\\([0-1][0-9]\\)[./]?\\([0-3][0-9]\\)") date
))
580 (setq date
(encode-time 0 0 0
581 (string-to-number (match-string 3 date
))
582 (string-to-number (match-string 2 date
))
583 (string-to-number (match-string 1 date
))
585 ;; make sure that date is in a format that RSS
586 ;; readers can handle
587 date
(let ((system-time-locale "C"))
589 (muse-style-element :date-format
) date
)))))
593 (if (re-search-forward heading-regexp nil t
)
595 (if (re-search-forward "^Footnotes:" nil t
)
598 (goto-char (point-min))
599 (delete-region (point) (muse-line-end-position))
600 (re-search-forward "</qotd>\n+" nil t
)
601 (while (and (char-after)
602 (eq ?\
(char-syntax (char-after))))
605 (if (muse-style-element :summarize
)
608 (setq desc
(concat (buffer-substring beg
(point)) "...")))
610 (muse-publish-markup-buffer "rss-entry" "journal-rss-entry")
611 (goto-char (point-min))
612 (if (re-search-forward "Page published by Emacs Muse" nil t
)
613 (goto-char (muse-line-end-position))
614 (muse-display-warning
616 "Cannot find 'Page published by Emacs Muse begins here'.\n"
617 "You will probably need this text in your header."))
618 (goto-char (point-min)))
620 (if (re-search-forward "Page published by Emacs Muse" nil t
)
621 (goto-char (muse-line-beginning-position))
622 (muse-display-warning
624 "Cannot find 'Page published by Emacs Muse ends here'.\n"
625 "You will probably need this text in your footer."))
626 (goto-char (point-max)))
627 (setq desc
(concat "<![CDATA[" (buffer-substring beg
(point))
629 (delete-region (point-min) (point-max))
630 (let ((entry (muse-style-element :entry-template
)))
631 (muse-insert-file-or-string entry
)
632 (goto-char (point-min))
633 (while (search-forward "%date%" nil t
)
634 (replace-match (or date
"") nil t
))
635 (goto-char (point-min))
636 (while (search-forward "%title%" nil t
)
639 (narrow-to-region (point) (point))
640 (insert (or title
"Untitled"))
641 (remove-text-properties (match-beginning 0) (match-end 0)
642 '(read-only nil rear-nonsticky nil
))
643 (let ((muse-publishing-current-style (muse-style "html")))
644 (muse-publish-escape-specials (point-min) (point-max)
646 (goto-char (point-min))
647 (while (search-forward "%desc%" nil t
)
648 (replace-match desc nil t
))
649 (goto-char (point-min))
650 (while (search-forward "%enclosure%" nil t
)
656 "<enclosure url=\"%s\" %stype=\"%s\"/>"
657 (if (string-match "//" enclosure
)
659 (concat (muse-style-element :base-url
)
662 (expand-file-name enclosure
663 (muse-style-element :path
))))
664 (if (file-readable-p file
)
665 (format "length=\"%d\" "
666 (nth 7 (file-attributes file
)))
668 (if (string-match "\\.\\([^.]+\\)$" enclosure
)
669 (let* ((ext (match-string 1 enclosure
))
672 ext muse-journal-rss-enclosure-types-alist
)))
675 "application/octet-stream"))))))
677 (goto-char (point-min))
678 (while (search-forward "%link%" nil t
)
680 (concat (muse-style-element :base-url
)
681 (concat (muse-page-name)
682 muse-html-extension
))
684 (goto-char (point-min))
685 (while (search-forward "%anchor%" nil t
)
687 (muse-journal-anchorize-title (or title orig-date
))
689 (goto-char (point-min))
690 (while (search-forward "%maintainer%" nil t
)
692 (or (muse-style-element :maintainer
)
693 (concat "webmaster@" (system-name)))
695 ;; indicate that we are to continue the :before-end processing
699 ;;; Register the Muse Journal Publishers
701 (muse-derive-style "journal-html" "html"
702 :before-end
'muse-journal-html-munge-buffer
)
704 (muse-derive-style "journal-xhtml" "xhtml"
705 :before-end
'muse-journal-html-munge-buffer
)
707 (muse-derive-style "journal-latex" "latex"
708 :tags
'muse-journal-markup-tags
709 :before-end
'muse-journal-latex-munge-buffer
)
711 (muse-derive-style "journal-pdf" "pdf"
712 :tags
'muse-journal-markup-tags
713 :before-end
'muse-journal-latex-munge-buffer
)
715 (muse-derive-style "journal-book-latex" "book-latex"
717 :tags
'muse-journal-markup-tags
718 :before-end
'muse-journal-latex-munge-buffer
)
720 (muse-derive-style "journal-book-pdf" "book-pdf"
722 :tags
'muse-journal-markup-tags
723 :before-end
'muse-journal-latex-munge-buffer
)
725 (muse-define-style "journal-rdf"
726 :suffix
'muse-journal-rdf-extension
727 :regexps
'muse-journal-rss-markup-regexps
728 :functions
'muse-journal-rss-markup-functions
729 :before
'muse-journal-rss-munge-buffer
730 :header
'muse-journal-rdf-header
731 :footer
'muse-journal-rdf-footer
732 :date-format
'muse-journal-rdf-date-format
733 :entry-template
'muse-journal-rdf-entry-template
734 :base-url
'muse-journal-rdf-base-url
735 :summarize
'muse-journal-rdf-summarize-entries
)
737 (muse-define-style "journal-rss"
738 :suffix
'muse-journal-rss-extension
739 :regexps
'muse-journal-rss-markup-regexps
740 :functions
'muse-journal-rss-markup-functions
741 :before
'muse-journal-rss-munge-buffer
742 :header
'muse-journal-rss-header
743 :footer
'muse-journal-rss-footer
744 :date-format
'muse-journal-rss-date-format
745 :entry-template
'muse-journal-rss-entry-template
746 :base-url
'muse-journal-rss-base-url
747 :summarize
'muse-journal-rss-summarize-entries
)
749 ;; Used by `muse-journal-rss-munge-buffer' to mark up individual entries
750 (muse-derive-style "journal-rss-entry" "html"
751 :tags
'muse-journal-markup-tags
)
753 (provide 'muse-journal
)
755 ;;; muse-journal.el ends here