Merged from mwolson@gnu.org--2006 (patch 41)
[muse-el.git] / examples / johnw / muse-johnw.el
blob694f0c90e0e287aaad48114e1e5fbd13100729bc
1 (require 'muse)
2 (require 'muse-mode)
3 (require 'muse-colors)
4 (require 'muse-project)
5 (require 'muse-book)
7 (require 'muse-html)
8 (require 'muse-latex)
9 (require 'muse-texinfo)
11 (require 'muse-journal)
12 (require 'muse-poem)
13 (require 'muse-message)
15 (require 'muse-http)
17 ;;(require 'muse-arabic)
18 ;;(require 'muse-cite)
20 (eval-after-load "whitespace"
21 '(add-to-list 'whitespace-modes 'muse-mode))
23 (defun muse-maybe-convert-poem ()
24 (if (string-match "/poems/" muse-publishing-current-file)
25 (muse-poem-prepare-buffer)))
27 (defun muse-insert-reset-chapter ()
28 (insert "\n\\setcounter{chapter}{1}\n"))
30 (defun muse-insert-all-poems-header ()
31 (insert "\n\\renewcommand{\\poemtoc}{chapter}
32 \\settocdepth{chapter}\n"))
34 ;; I use my own sectioning commands in conjunction with memoir.cls
35 (setcdr (assq 'chapter muse-latex-markup-strings) "\\mychapter{")
36 (setcdr (assq 'section muse-latex-markup-strings) "\\mysection{")
37 (setcdr (assq 'subsection muse-latex-markup-strings) "\\mysubsection{")
38 (setcdr (assq 'subsubsection muse-latex-markup-strings) "\\mysubsubsection{")
40 ;; Relocate the images directory
41 ;(setcdr (assq 'image-with-desc muse-latex-markup-strings)
42 ; "\\includegraphics[width=\\textwidth]{../%s}")
43 (setcdr (assq 'image-with-desc muse-latex-markup-strings)
44 "\\includegraphics[scale=0.6]{../%s}")
45 (setcdr (assq 'image-link muse-latex-markup-strings)
46 "\\includegraphics[scale=0.6]{../%s}")
47 (setcdr (assq 'url-with-image muse-latex-markup-strings)
48 "%% %s\n\\includegraphics[scale=0.6]{../%s}")
50 (unless (assoc "site-html" muse-publishing-styles)
51 (muse-derive-style "site-html" "html"
52 :maintainer "jwiegley@hotmail.com"
53 :before 'muse-maybe-convert-poem
54 :after 'muse-my-html-finalize-buffer
55 :final 'muse-site-html-set-mode
56 :header "~/Documents/site/header.html"
57 :footer "~/Documents/site/footer.html")
58 (muse-derive-style "site-journal-html" "journal-html"
59 :maintainer "jwiegley@hotmail.com"
60 :before 'muse-my-journal-find-entries
61 :after 'muse-my-journal-insert-contents
62 :final 'muse-site-html-set-mode
63 :header "~/Documents/site/header.html"
64 :footer "~/Documents/site/footer.html")
65 (muse-derive-style "newartisans-html" "html"
66 :maintainer "johnw@newartisans.com"
67 :header "~/Sites/newartisans/header.html"
68 :footer "~/Sites/newartisans/footer.html")
69 (muse-derive-style "newartisans-journal-html" "journal-html"
70 :maintainer "johnw@newartisans.com"
71 :header "~/Sites/newartisans/header.html"
72 :footer "~/Sites/newartisans/footer.html"))
74 (custom-set-variables
75 '(muse-project-alist
76 (quote
77 (("website" ; my various writings
78 (:book-part "Essays"
79 :book-funcall muse-insert-reset-chapter
80 "~/Documents/essays"
81 :book-part "Stories"
82 :book-funcall muse-insert-reset-chapter
83 "~/Documents/stories"
84 :book-part "Journal"
85 :book-style "journal-book-pdf"
86 :book-funcall muse-insert-reset-chapter
87 "~/Documents/journal/early"
88 "~/Documents/journal/summer2003"
89 "~/Documents/journal/j2003"
90 "~/Documents/journal/j2004"
91 "~/Documents/journal/j2005"
92 "~/Documents/journal/journal"
93 "~/Documents/journal/pending"
94 :book-part "Poems"
95 :book-style "chapbook-pdf"
96 :book-funcall muse-insert-all-poems-header
97 :book-funcall muse-insert-reset-chapter
98 :nochapters t ; do automatically add chapters
99 :book-chapter "Mystical"
100 "~/Documents/poems/mystical"
101 :book-chapter "Romance"
102 "~/Documents/poems/romantic"
103 :book-chapter "Nature"
104 "~/Documents/poems/natural"
105 :book-chapter "Melancholoy"
106 "~/Documents/poems/melancholy"
107 :book-chapter "Commentary"
108 "~/Documents/poems/commentary"
109 :book-end t
110 "~/Documents/contents"
111 "~/Documents/notes"
112 :default "journal")
114 (:base "site-html" :path "~/Sites/johnw"
115 :include "/contents/recent")
116 (:base "pdf" :path "~/Sites/johnw/pdf"
117 :include "/\\(essays\\|stories\\)/")
118 (:base "poem-pdf" :path "~/Sites/johnw/pdf"
119 :include "/poems/")
120 (:base "site-html" :path "~/Sites/johnw"
121 :exclude "/journal/")
122 (:base "journal-pdf" :path "~/Sites/johnw/pdf"
123 :include "/journal/")
124 (:base "site-journal-html" :path "~/Sites/johnw"
125 :include "/journal/")
126 (:base "journal-rdf" :path "~/Sites/johnw"
127 :include "/journal/journal"
128 :base-url "http://johnwiegley.com/")
129 (:base "journal-rss" :path "~/Sites/johnw"
130 :include "/journal/journal"
131 :base-url "http://johnwiegley.com/")
132 (:base "journal-rss" :path "~/Sites/johnw"
133 :include "/journal/pending"
134 :base-url "http://johnwiegley.com/"))
135 ("thoughts" ; collected writings
136 (:book-end t
137 "~/Documents/thoughts/thoughts"
138 :default "thoughts")
139 (:base "journal-pdf" :path "~/Sites/johnw/pdf")
140 (:base "site-journal-html" :path "~/Sites/johnw"))
141 ("newartisans" ; my company
142 ("~/Documents/newartisans"
143 :default "index")
144 (:base "newartisans-html" :path "~/Sites/newartisans"
145 :exclude "/news")
146 (:base "newartisans-journal-html" :path "~/Sites/newartisans"
147 :include "/news"))
148 ("planner" ; my company
149 ("~/Private/plan"
150 :default "TaskPool"
151 :major-mode planner-mode)))))
152 '(muse-mode-highlight-p t nil (muse-colors))
153 '(muse-mode-auto-p t nil (muse-project))
154 '(muse-latex-header "~/Documents/site/header.tex")
155 '(muse-latex-footer "~/Documents/site/footer.tex")
156 '(muse-book-latex-header "~/Documents/site/book-header.tex")
157 '(muse-poem-latex-header "~/Documents/site/poem-header.tex")
158 '(muse-poem-latex-footer "~/Documents/site/poem-footer.tex")
159 '(muse-chapbook-latex-header "~/Documents/site/chapbook-header.tex")
160 ;;'(muse-before-publish-hook (quote (muse-cite-munge-footnotes)))
161 '(muse-mode-hook (quote (list footnote-mode turn-on-auto-fill flyspell-mode))))
163 (defun muse-publish-my-books (&optional force)
164 (interactive "P")
165 (muse-book-publish-project
166 '("essays" ("~/Documents/essays"))
167 "essays" "Collected Essays" "book-pdf" "~/Sites/johnw/pdf" force)
168 (muse-book-publish-project
169 '("stories" ("~/Documents/stories"))
170 "stories" "Collected Stories" "book-pdf" "~/Sites/johnw/pdf" force)
171 (muse-book-publish-project
172 '("myjournal"
173 ("~/Documents/journal/early"
174 "~/Documents/journal/summer2003"
175 "~/Documents/journal/j2003"
176 "~/Documents/journal/j2004"
177 "~/Documents/journal/j2005"
178 "~/Documents/journal/journal"
179 :book-end t
180 "~/Documents/poems/mystical"
181 "~/Documents/poems/romantic"
182 "~/Documents/poems/natural"
183 "~/Documents/poems/melancholy"
184 "~/Documents/poems/commentary"))
185 "myjournal" "Thought Journal" "journal-book-pdf" "~/Sites/johnw/pdf" force)
186 (muse-book-publish-project
187 '("poems"
188 (:nochapters t ; do automatically add chapters
189 :book-chapter "Mystical"
190 "~/Documents/poems/mystical"
191 :book-chapter "Romance"
192 "~/Documents/poems/romantic"
193 :book-chapter "Nature"
194 "~/Documents/poems/natural"
195 :book-chapter "Melancholoy"
196 "~/Documents/poems/melancholy"
197 :book-chapter "Commentary"
198 "~/Documents/poems/commentary"))
199 "poems" "Collected Poems" "chapbook-pdf" "~/Sites/johnw/pdf" force)
200 (muse-book-publish-project
201 "website" "writings" "Collected Writings" "book-pdf"
202 "~/Sites/johnw/pdf" force))
204 (defun modules-get-version-and-date (module)
205 (let (version date)
206 (with-temp-buffer
207 (insert-file-contents-literally module nil 0 1000)
208 (if (re-search-forward "Version:\\s-+\\(.*\\)" nil t)
209 (setq version (match-string 1))))
210 (setq date (format-time-string "%Y-%m-%d"
211 (nth 5 (file-attributes module))))
212 (concat (and muse-publishing-p "<span class=\"version\">")
213 (if version
214 (format "%s (%s)" date version)
215 date)
216 (and muse-publishing-p "</span>"))))
218 (defun muse-blog-add-entry ()
219 (interactive)
220 (muse-project-find-file "journal" "website")
221 (goto-char (point-min))
222 (forward-line 3)
223 (insert "* " (format-time-string "%Y%m%d: ")
224 (read-string "Journal entry title: ")
225 "\n\n\n\n")
226 (forward-line -2))
228 (defun muse-my-html-insert-contents (&optional ignore)
229 (let ((index 1)
230 base contents l)
231 (save-excursion
232 (goto-char (point-min))
233 (search-forward "Page published by Emacs Muse begins here" nil t)
234 (catch 'done
235 (while (re-search-forward "^<h\\([0-9]+\\)>\\(.+?\\)</h\\1>" nil t)
236 (unless (get-text-property (point) 'read-only)
237 (setq l (1- (string-to-number (match-string 1))))
238 (if (null base)
239 (setq base l)
240 (if (< l base)
241 (throw 'done t)))
242 (when (<= l 1)
243 (setq contents (cons (cons l (muse-match-string-no-properties 2))
244 contents))
245 (goto-char (match-beginning 2))
246 (muse-html-insert-anchor (concat "sec" (int-to-string index)))
247 (setq index (1+ index)))))))
248 (setq index 1 contents (reverse contents))
249 (when (> (length contents) 0)
250 (goto-char (point-min))
251 (or (search-forward "<h2>Archives</h2>" nil t)
252 (search-forward "#include virtual=\"/sidebar.html\"" nil t))
253 (beginning-of-line)
254 (insert "<h2>Contents</h2>\n\n<ul>\n")
255 (dolist (item contents)
256 (insert "<li><a href=\"" (muse-publish-output-name)
257 "#sec" (int-to-string index) "\">"
258 (muse-publish-strip-tags (cdr item))
259 "</a></li>\n")
260 (setq index (1+ index)))
261 (insert "</ul>\n"))))
263 (defun muse-my-html-finalize-buffer ()
264 (when muse-publish-generate-contents
265 (muse-my-html-insert-contents (cdr muse-publish-generate-contents))
266 (setq muse-publish-generate-contents nil))
267 (when (string= (muse-publish-output-name) "recent.html")
268 (goto-char (point-min))
269 (search-forward "Page published by Emacs Muse")
270 (forward-line 1)
271 (delete-region (point-min) (point))
272 (search-forward "Page published by Emacs Muse")
273 (beginning-of-line)
274 (delete-region (point) (point-max))))
276 (defun muse-site-html-set-mode (file output-path final-target)
277 (set-file-modes output-path ?\755))
279 (defvar muse-my-journal-entries nil)
280 (defvar muse-my-journal-nested t)
282 (defun muse-my-journal-find-entries ()
283 (goto-char (point-min))
284 (let ((heading-regexp (concat "^\\* " muse-journal-heading-regexp "$"))
285 (inhibit-read-only t)
286 entries)
287 (while (re-search-forward heading-regexp nil t)
288 (let ((begin (match-beginning 0))
289 (date (match-string 1))
290 (title (muse-match-string-no-properties 2))
291 enclosure qotd desc)
292 (if title
293 (save-match-data
294 (if (string-match muse-explicit-link-regexp title)
295 (setq enclosure (match-string 1 title)
296 title (match-string 2 title)))))
297 (save-match-data
298 (when (and date
299 (string-match
300 (concat "\\([1-9][0-9][0-9][0-9]\\)[./]?"
301 "\\([0-1][0-9]\\)[./]?\\([0-3][0-9]\\)") date))
302 (setq date (encode-time 0 0 0
303 (string-to-number (match-string 3 date))
304 (string-to-number (match-string 2 date))
305 (string-to-number (match-string 1 date))
306 (current-time-zone)))))
307 (while (string-match "\\*" title)
308 (setq title (replace-match "" nil nil title)))
309 (unless muse-my-journal-nested
310 (let* ((path (muse-style-element :path))
311 (item-path
312 (concat (expand-file-name (format-time-string "%Y/%m")
313 path)
314 "/" (muse-journal-anchorize-title title)))
315 (end
316 (save-excursion
317 (if (re-search-forward heading-regexp nil t)
318 (match-beginning 0)
319 (if (re-search-forward "^Footnotes:" nil t)
320 (match-beginning 0)
321 (point-max)))))
322 (data (buffer-substring begin end))
323 (footnotes
324 (save-excursion
325 (if (re-search-forward "^Footnotes:" nil t)
326 (buffer-substring (match-beginning 0) (point-max)))))
327 (project (muse-project)))
328 (save-excursion
329 (unless (file-directory-p (file-name-directory item-path))
330 (make-directory (file-name-directory item-path) t))
331 (find-file item-path)
332 (erase-buffer)
333 (insert "#title " title ?\n)
334 (insert "#date " (format-time-string "%B %e, %Y" date) ?\n)
335 (insert ?\n)
336 (setq begin (point))
337 (insert data)
338 (goto-char begin)
339 (forward-line 2)
340 (delete-region begin (point))
341 (goto-char (point-max))
342 (if footnotes
343 (insert ?\n footnotes))
344 (save-buffer)
345 (kill-buffer (current-buffer))
346 (let ((muse-my-journal-nested t)
347 (muse-current-project project))
348 (muse-publish-file item-path "journal-pdf"
349 (file-name-directory item-path))
350 (muse-publish-file item-path "site-journal-html"
351 (file-name-directory item-path)))
352 (delete-file item-path))))
353 (set (make-local-variable 'muse-my-journal-entries)
354 (cons (cons title date)
355 muse-my-journal-entries))))))
357 (defun muse-my-journal-insert-contents ()
358 (goto-char (point-min))
359 (or (search-forward "<h2>Archives</h2>" nil t)
360 (search-forward "#include virtual=\"/sidebar.html\"" nil t))
361 (beginning-of-line)
362 (if (string= "journal" (muse-page-name))
363 (insert "<h2>Recent Entries</h2>\n\n<ul>\n")
364 (insert "<h2>Contents</h2>\n\n<ul>\n"))
365 (dolist (entry (nreverse muse-my-journal-entries))
366 ;;(setq date (format-time-string "%m/%d" date))
367 ;;(if (= ?0 (aref date 0))
368 ;; (setq date (substring date 1)))
369 (insert (format "<li><a href=\"%s#%s\">%s</a></li>\n"
370 (muse-publish-output-name)
371 (muse-journal-anchorize-title (car entry))
372 (car entry))))
373 (insert "</ul>\n\n")
374 ;; jww (2005-04-17): a hack to rewrite MP3 titles
375 (goto-char (point-min))
376 (let ((inhibit-read-only t))
377 (while (re-search-forward "<h2><a href=\"\\([^\"]+\\)\">\\(.+?\\)</a></h2>" nil t)
378 (replace-match "<h2><a href=\"\\1\"><img src=\"images/speak.png\"></img></a>&nbsp;\\2</h2>"))))
380 ;; (eval-when-compile
381 ;; (defvar muse-current-project))
383 ;; (defvar muse-ref-tag '("ref" nil t muse-ref-markup-tag))
385 ;; (defun muse-ref-markup-tag (beg end attrs)
386 ;; "This markup tag allows a poem to be included from another project page.
387 ;; The form of usage is:
388 ;; <ref title=\"page.name[#subtitle]\">"
389 ;; (let ((page (cdr (assoc (cdr (assoc "title" attrs))
390 ;; (muse-project-file-alist))))
391 ;; beg start end text)
392 ;; (if (null page)
393 ;; (insert " *Reference to\n unknown page \""
394 ;; (cdr (assoc "title" attrs)) "\".*\n")
395 ;; (setq beg (point))
396 ;; (let (title)
397 ;; (if (string-match "html" muse-publishing-current-style)
398 ;; t
399 ;; (insert
400 ;; (with-temp-buffer
401 ;; (insert-file-contents page)
402 ;; (goto-char (point-min))
403 ;; (forward-paragraph)
404 ;; (forward-line)
405 ;; (buffer-substring-no-properties (point) (point-max)))))))))
407 ;; (add-to-list 'muse-publish-markup-tags muse-ref-tag)
409 (when (and window-system (load "httpd" t))
410 (require 'muse-http)
411 ;;(add-hook 'after-init-hook 'httpd-start)
412 (setq httpd-document-root (expand-file-name "~/Sites/johnw")))
414 ;;(setq
415 ;; muse-cite-titles
416 ;; '(("Bahá'u'lláh"
417 ;; ("Kitáb-i-Íqán"
418 ;; "http://bahai-library.com/?file=bahaullah_kitab_iqan.html"
419 ;; "http://bahai-library.com/?file=bahaullah_kitab_iqan.html#%d"))
420 ;; ("`Abdu'l-Bahá"
421 ;; ("Promulgation of Universal Peace"
422 ;; "http://bahai-library.com/?file=abdulbaha_promulgation_universal_peace.html"
423 ;; "http://www.bahai-library.com/writings/abdulbaha/pup/pup.html#%d"))))
425 (provide 'muse-init)