From: Carsten Dominik <dominik@science.uva.nl>
To: Sebastian Rose <sebastian_rose@gmx.de>
Cc: emacs-orgmode Org-Mode <emacs-orgmode@gnu.org>
Subject: Re: Custom XHTML layouts
Date: Tue, 3 Mar 2009 11:53:15 +0100 [thread overview]
Message-ID: <17F84AA5-A075-4DB3-A72D-5A129F5ED897@uva.nl> (raw)
In-Reply-To: <87sklvaqdj.fsf@kassiopeya.MSHEIMNETZ>
This looks interesting. Do you have application examples?
A more template-like structure would be an alist, with contexts as keys,
and then two string values for the code to be inserted. Using
customize, this
could be set up by non-lispers.
- Carsten
On Mar 3, 2009, at 10:48 AM, Sebastian Rose wrote:
>
> The appended patch allows for custom layouts of the exported XHTML. As
> the custom elements are added literally, PHP code could be added too.
>
> Everyone who's informed about my elisp skills will read this with
> appropriate scepticism :)
>
> It's merely a proof of conncept, a suggestion.
> Maybe we could find a more `template' based solution to make this
> easier
> on non-lispers.
>
> I didn't implement all the containers mentioned in the docstring of
> `org-exp-custom-html-function' yet, but it's just adding two lines per
> block.
>
> If you add this patch, you'll be able to do the following:
>
> 1.) Define a function that add custom HTML elements.
>
> This example will produce a table layout with the TOC on the left,
> contents on the right. Title and postamble will span both columns.
>
> (defun sr-org-export-custom-html(which &optional element-start)
> "See the docs of org-exp-custom-html-function"
> (cond
> ((string= which "body")
> (if element-start
> "<div id=\"wrap\">"
> "</div><!-- end of wrap -->"))
> ((string= which "title")
> (if element-start
> "<table width=\"100%\"><tr><td colspan=\"2\">"
> "</td></tr><tr><td>"))
> ((string= which "toc")
> (if element-start
> ""
> "</td><td>"))
> ((string= which "postamble")
> (if element-start
> "</td></tr><tr><td colspan=\"2\">"
> "</td></tr></table>"))
> ))
>
> 2.) Add a line to your `org-publish-project-alist'.
>
>
> ("org-notes"
> ;; ....
> :publishing-directory "~/develop/htdocs/org-notes/"
> ;; Tell org-exp.el to use a custom function:
> :publishing-function org-publish-org-to-html
> ;; ....
>
> 3.) Apply this patch to the current head:
>
> diff --git a/lisp/org-exp.el b/lisp/org-exp.el
> index 95b9ad8..239d387 100644
> --- a/lisp/org-exp.el
> +++ b/lisp/org-exp.el
> @@ -3266,6 +3266,18 @@ in a window. A non-interactive call will
> only return the buffer."
>
> (defvar html-table-tag nil) ; dynamically scoped into this.
> (defvar org-par-open nil)
> +(defun org-exp-custom-html-function (which &optional before)
> + "If before is non nil, we're about to start which. which is one of:
> + - 'head'
> + - 'body'
> + - 'title'
> + - 'toc'
> + - 'contents'
> + - 'lot'
> + - 'postamble'
> +While 'head' and 'body' are called directly after the the starttags
> and directly before the endtags
> +are added, all the others wrap the element/block they are called
> for."
> + "")
> ;;;###autoload
> (defun org-export-as-html (arg &optional hidden ext-plist
> to-buffer body-only pub-dir)
> @@ -3311,6 +3323,8 @@ PUB-DIR is set, use this as the publishing
> directory."
> "\n" org-export-html-scripts))
> (html-extension (plist-get opt-plist :html-extension))
> (link-validate (plist-get opt-plist :link-validation-function))
> + (html-extension (plist-get opt-plist :html-extension))
> + (custom-html-function (or (plist-get opt-plist :custom-html-
> function) 'org-exp-custom-html-function))
> valid thetoc have-headings first-heading-pos
> (odd org-odd-levels-only)
> (region-p (org-region-active-p))
> @@ -3494,12 +3508,14 @@ lang=\"%s\" xml:lang=\"%s\">
> "
> language language (org-html-expand title)
> (or charset "iso-8859-1") date author style))
> -
> + (insert (funcall custom-html-function "body" t))
> (insert (or (plist-get opt-plist :preamble) ""))
>
> (when (plist-get opt-plist :auto-preamble)
> - (if title (insert (format org-export-html-title-format
> - (org-html-expand title))))))
> + (if title (insert (concat
> + (funcall custom-html-function "title" t)
> + (format org-export-html-title-format (org-
> html-expand title))
> + (funcall custom-html-function "title"))))))
>
> (if (and org-export-with-toc (not body-only))
> (progn
> @@ -4047,6 +4063,7 @@ lang=\"%s\" xml:lang=\"%s\">
> "\n"))
> (unless body-only
> (when (plist-get opt-plist :auto-postamble)
> + (insert (funcall custom-html-function "postamble" t))
> (insert "<div id=\"postamble\">")
> (when (and org-export-author-info author)
> (insert "<p class=\"author\"> "
> @@ -4067,11 +4084,13 @@ lang=\"%s\" xml:lang=\"%s\">
> (when org-export-creator-info
> (insert (format "<p class=\"creator\">HTML generated by org-
> mode %s in emacs %s</p>\n"
> org-version emacs-major-version)))
> - (insert "</div>"))
> + (insert "</div>")
> + (insert (funcall custom-html-function "postamble")))
>
> (if org-export-html-with-timestamp
> (insert org-export-html-html-helper-timestamp))
> (insert (or (plist-get opt-plist :postamble) ""))
> + (insert (funcall custom-html-function "body"))
> (insert "</body>\n</html>\n"))
>
> (unless (plist-get opt-plist :buffer-will-be-killed)
> @@ -4092,9 +4111,11 @@ lang=\"%s\" xml:lang=\"%s\">
> (when (looking-at "\\s-*</p>")
> (goto-char (match-end 0))
> (insert "\n")))
> + (insert (funcall custom-html-function "toc" t))
> (insert "<div id=\"table-of-contents\">\n")
> (mapc 'insert thetoc)
> (insert "</div>\n"))
> + (insert (funcall custom-html-function "toc"))
> ;; remove empty paragraphs and lists
> (goto-char (point-min))
> (while (re-search-forward "<p>[ \r\n\t]*</p>" nil t)
>
>
>
> Regards,
>
> --
> Sebastian Rose, EMMA STIL - mediendesign, Niemeyerstr.6, 30449
> Hannover
> Tel.: +49 (0)511 - 36 58 472
> Fax: +49 (0)1805 - 233633 - 11044
> mobil: +49 (0)173 - 83 93 417
> Http: www.emma-stil.de
> _______________________________________________
> Emacs-orgmode mailing list
> Remember: use `Reply All' to send replies to the list.
> Emacs-orgmode@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
next prev parent reply other threads:[~2009-03-03 10:53 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-03 9:48 Custom XHTML layouts Sebastian Rose
2009-03-03 10:53 ` Carsten Dominik [this message]
2009-03-03 11:58 ` Sebastian Rose
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=17F84AA5-A075-4DB3-A72D-5A129F5ED897@uva.nl \
--to=dominik@science.uva.nl \
--cc=emacs-orgmode@gnu.org \
--cc=sebastian_rose@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.