From mboxrd@z Thu Jan 1 00:00:00 1970 From: Carsten Dominik Subject: Re: Custom XHTML layouts Date: Tue, 3 Mar 2009 11:53:15 +0100 Message-ID: <17F84AA5-A075-4DB3-A72D-5A129F5ED897@uva.nl> References: <87sklvaqdj.fsf@kassiopeya.MSHEIMNETZ> Mime-Version: 1.0 (Apple Message framework v930.3) Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LeSFS-0004d3-Sx for emacs-orgmode@gnu.org; Tue, 03 Mar 2009 05:53:18 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LeSFS-0004cr-2b for emacs-orgmode@gnu.org; Tue, 03 Mar 2009 05:53:18 -0500 Received: from [199.232.76.173] (port=37199 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LeSFR-0004cj-UH for emacs-orgmode@gnu.org; Tue, 03 Mar 2009 05:53:17 -0500 Received: from mail-ew0-f179.google.com ([209.85.219.179]:38339) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LeSFR-0005K6-5x for emacs-orgmode@gnu.org; Tue, 03 Mar 2009 05:53:17 -0500 Received: by ewy27 with SMTP id 27so2382875ewy.42 for ; Tue, 03 Mar 2009 02:53:16 -0800 (PST) In-Reply-To: <87sklvaqdj.fsf@kassiopeya.MSHEIMNETZ> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Sebastian Rose Cc: emacs-orgmode Org-Mode 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 > "
" > "
")) > ((string= which "title") > (if element-start > "
" > "
")) > ((string= which "toc") > (if element-start > "" > "")) > ((string= which "postamble") > (if element-start > "
" > "
")) > )) > > 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 "
") > (when (and org-export-author-info author) > (insert "

" > @@ -4067,11 +4084,13 @@ lang=\"%s\" xml:lang=\"%s\"> > (when org-export-creator-info > (insert (format "

HTML generated by org- > mode %s in emacs %s

\n" > org-version emacs-major-version))) > - (insert "
")) > + (insert "") > + (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 "\n\n")) > > (unless (plist-get opt-plist :buffer-will-be-killed) > @@ -4092,9 +4111,11 @@ lang=\"%s\" xml:lang=\"%s\"> > (when (looking-at "\\s-*

") > (goto-char (match-end 0)) > (insert "\n"))) > + (insert (funcall custom-html-function "toc" t)) > (insert "
\n") > (mapc 'insert thetoc) > (insert "
\n")) > + (insert (funcall custom-html-function "toc")) > ;; remove empty paragraphs and lists > (goto-char (point-min)) > (while (re-search-forward "

[ \r\n\t]*

" 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