emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Fully featured Web publishing
@ 2009-03-18 16:04 Sébastien Vauban
  2009-03-18 16:57 ` Sebastian Rose
  0 siblings, 1 reply; 17+ messages in thread
From: Sébastien Vauban @ 2009-03-18 16:04 UTC (permalink / raw)
  To: emacs-orgmode-mXXj517/zsQ

Hello,

I'd like to use Org exclusively for composing and then publishing my Web site.
I've done it so far with Emacs Muse, but I have a strong deepish attraction to
go the Org way, for many different reasons you must be aware of -- more than I
am...

The features I need are:

- Conditional CSS [if IE]
- Favicon
- JavaScript for Google Analytics
- Date in the copyright
- Contextual navigation menu

I'll come back into more details to these.

All of these were coded in the header or footer of each page with Muse. What
was good, is that I could write:

--8<---------------cut here---------------start------------->8---
(setq muse-project-alist
      `(
        ("My-Muse-Public-Website"
         ("~/Public/Websites/Muse/source/" :default "index")
         (:base "xhtml"
                :path   "~/Public/Websites/Muse/publish/"
                :header "~/Public/Websites/Muse/source/header.html"
                :footer "~/Public/Websites/Muse/source/footer.html"))))
--8<---------------cut here---------------end--------------->8---

Hence, specifying file names instead of file contents for both the header and
footer. This is good, as I don't have to change my .emacs file every time I
wanna change the way my pages have to look like. Such a feature would be nice
for Org as well. Is it scheduled?  Can we achieve the same result otherwise?

Regarding the above features:

- Conditional CSS [if IE]

  Can be coded in the common header string. OK.

- Favicon

  Can be coded in the common header string -- if it's a common one for all my
  Web site. How can we specify on a per page basis?  This more or less comes
  down to the recent addition of the `keywords' and `description' meta tags
  (thanks Carsten).

- JavaScript for Google Analytics

  Can be coded in the common header string. OK.

- Date in the copyright

  Can be coded in the common footer string. Well, it would be nice if it could
  be computed somehow, and be for example (depending of user prefs) the date
  when the file (or page) has been changed.

  Hence, it's not specifically a data that's common to every page of my Web
  site. How can we do this?

  This is what I did with Emacs Muse, embedding Emacs Lisp in the footer:

--8<---------------cut here---------------start------------->8---
  Last Updated:
      <lisp>
          (format-time-string muse-footer-date-format
                              (nth 5 (file-attributes (muse-current-file))))
      </lisp>
--8<---------------cut here---------------end--------------->8---

  but I think this is not currently possible with Org, right?  Is there some
  other solution?

- Contextual navigation menu

  Finally, the only real problem that I see (the above being nice-to-have's)
  is the following: I want to have a common navigation menu, but whose current
  page is highlighted. To do so, I just have to add the class `current' to
  the current entry, but this means the navigation menu is not constant
  between pages!

  I did that with Muse doing so:

--8<---------------cut here---------------start------------->8---
  (setq nav-menu '((\"Home\" .            \"index.html\")
                   (\"About Me\" .        ( (\"CV\"             . \"curriculum-vitae.html\")
                                          (\"PGP Public Key\" . \"pgp-public-key.html\")
                                          (\"Contact Me\"     . \"contact-me.html\")))
                   (\"Resources\" .       ( (\"Ubuntu\"         . \"ubuntu.html\")
                                          (\"Emacs\"          . \"dot-emacs.html\")))))
--8<---------------cut here---------------end--------------->8---

  and in the footer file:

--8<---------------cut here---------------start------------->8---
            <div id=\"navigation\">
                <h2>Navigation</h2>
                <lisp>(my-muse-generate-nav-menu)</lisp>
            </div>
--8<---------------cut here---------------end--------------->8---

  with the following (ugly -- caus' it should be written in a recursive way!)
  definition for `my-muse-generate-nav-menu':

--8<---------------cut here---------------start------------->8---
        (defun my-muse-generate-nav-menu ()
          (let* ((html-menu "")
                 (cur-path-muse (muse-current-file))
                 (cur-path-html
                  (replace-regexp-in-string "\\.muse" ".html" cur-path-muse)))
            (setq html-menu "<ul>\n")
            (while nav-menu
              (progn
                (if (not (listp (cdr (car nav-menu))))
                    (setq html-menu
                          (concat html-menu
                                  "<li><a href=\"" (cdr (car nav-menu))
                                  "\" title=\"" (caar nav-menu) "\""
                                  (if (string-match
                                       (concat ".*" (cdr (car nav-menu)) "$")
                                       cur-path-html)
                                      " class=\"current\""
                                    "")
                                  ">" (caar nav-menu) "</a></li>\n"))
                  (progn
                    (setq html-menu
                          (concat html-menu
                                  "<li>" (caar nav-menu) "\n" "<ul>\n"))

                    (setq nav-submenu (cdr (car nav-menu)))
                    (while nav-submenu
                      (setq html-menu
                            (concat html-menu
                                    "<li><a href=\"" (cdr (car nav-submenu))
                                    "\" title=\"" (caar nav-submenu) "\""
                                    (if (string-match
                                         (concat ".*" (cdr (car nav-submenu)) "$")
                                         cur-path-html)
                                        " class=\"current\""
                                      "")
                                    ">" (caar nav-submenu) "</a></li>\n"))
                      (setq nav-submenu (cdr nav-submenu)))

                    (setq html-menu (concat html-menu "</ul>\n</li>\n"))))
                (setq nav-menu (cdr nav-menu))))
            (setq html-menu (concat html-menu "</ul>"))
            html-menu))
--8<---------------cut here---------------end--------------->8---

  How can I do such a thing in Org?

THANK YOU VERY MUCH for all the hints or help you can provide me with!

I really want to go the Org way for all my composed stuff...

Best regards,
  Seb

-- 
Sébastien Vauban


_______________________________________________
Emacs-orgmode mailing list
Remember: use `Reply All' to send replies to the list.
Emacs-orgmode-mXXj517/zsQ@public.gmane.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode

^ permalink raw reply	[flat|nested] 17+ messages in thread
* Re: Re: Fully featured Web publishing
@ 2009-04-18  9:23 Tomas Hlavaty
  2009-04-18 11:04 ` Carsten Dominik
  0 siblings, 1 reply; 17+ messages in thread
From: Tomas Hlavaty @ 2009-04-18  9:23 UTC (permalink / raw)
  To: emacs-orgmode

Hi all,

thanks for the excelent org-mode;-)

> Automatical computing of navigations is not possible (yet).

There is a way of achieving this:

1. define and use function my-org-publish-org-to-html which determines
   what directory level we are on and then calls the original
   org-publish-org-to-html function

2. define and use my-org-preamble which inserts the preamble based on
   the directory level computed above

3. patch org-export-as-html so that the config parameters :style and
   :preamble can be functions as well as strings.

Here is rough code.

Configuration:

         :publishing-function my-org-publish-org-to-html
         :style my-org-style
         :preamble my-org-preamble

The "user" code:

(defun my-org-publish-org-to-html (plist filename pubdir)
  (let* ((dir (file-name-as-directory
               (file-truename (plist-get plist :base-directory))))
         (fname (file-truename filename))
         (rel (substring fname (length dir)))
         (*org-publish-level*
            (loop for x in (split-string rel "")
               count (and (stringp x) (string= "/" x)))))
    (org-publish-org-to-html plist filename pubdir)))

(defun my-org-preamble ()
  (let ((pre (apply 'concat
                (loop for i from 1 upto *org-publish-level* collect "../"))))
    (insert "
<div id=\"menu\">
<a href=\"" pre "index.html\">Home</a>
| <a href=\"" pre "sw/index.html\">Software</a>
| <a href=\"" pre "blog/index.html\">Blog</a>
| <a href=\"" pre "contact.html\">Contact</a>
| <a href=\"" pre "sitemap.html\">Site Map</a>
</div>
<div>
")))

(defun my-org-style ()
  (let ((pre (apply 'concat
                (loop for i from 1 upto *org-publish-level* collect "../"))))
    (concat "
<link rel=\"stylesheet\" href=\"" pre "style.css\" type=\"text/css\"/>
<link rel=\"icon\" href=\"" pre "favicon.ico\" type=\"image/x-icon\"/>
<link rel=\"shortcut icon\" href=\"" pre "favicon.ico\" type=\"image/x-icon\"/>")))

The "patched" code in org-export-as-html:

@@ -465,7 +465,12 @@ PUB-DIR is set, use this as the publishing directory."
 			       (org-infile-export-plist))))
 	 (style (concat (if (plist-get opt-plist :style-include-default)
 			    org-export-html-style-default)
-			(plist-get opt-plist :style)
+            ;;; THL Changed !!!
+			(let ((s (plist-get opt-plist :style)))
+              (cond
+               ((and s (stringp s)) s)
+               (s (funcall s))))
+            ;;;(plist-get opt-plist :style)
 			(plist-get opt-plist :style-extra)
 			"\n"
 			(if (plist-get opt-plist :style-include-scripts)
@@ -664,7 +669,12 @@ lang=\"%s\" xml:lang=\"%s\">
 		 date author description keywords
 		 style))
 
-	(insert (or (plist-get opt-plist :preamble) ""))
+    ;; THL Changed !!!
+    (let ((preamble (plist-get opt-plist :preamble)))
+      (cond
+       ((and preamble (stringp preamble)) (insert preamble))
+       (preamble (funcall preamble))))
+	;;(insert (or (plist-get opt-plist :preamble) ""))
 
 	(when (plist-get opt-plist :auto-preamble)
 	  (if title (insert (format org-export-html-title-format

I think that in general, the org-mode configuration
(org-publish-project-alist) would be more flexible/user programable if
the config parameters could also be functions (i.e. not limited to
strings only).  Any ideas whether and how to improve and make the
above functionality available in the official release?

Thank you,

Tomas

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2009-04-18 11:04 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-03-18 16:04 Fully featured Web publishing Sébastien Vauban
2009-03-18 16:57 ` Sebastian Rose
2009-03-18 21:20   ` Sébastien Vauban
2009-03-18 22:38     ` Sebastian Rose
2009-03-18 22:56       ` Rasmus Pank Roulund
2009-03-18 23:19         ` Richard Riley
2009-03-19  7:46           ` Rasmus Pank Roulund
2009-03-19  8:28             ` Richard Riley
2009-03-19  9:43             ` Sébastien Vauban
2009-03-23 11:36               ` Sébastien Vauban
2009-03-23 13:50                 ` Taru Karttunen
2009-03-19 10:37           ` Sebastian Rose
2009-03-19 13:38             ` Richard Riley
2009-03-19 15:03               ` Sebastian Rose
2009-03-19 16:12               ` Matthew Lundin
  -- strict thread matches above, loose matches on Subject: below --
2009-04-18  9:23 Tomas Hlavaty
2009-04-18 11:04 ` Carsten Dominik

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).