From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nicolas Goaziou Subject: Re: [patch][ox-html] Support for level based containers Date: Sun, 16 Mar 2014 14:10:43 +0100 Message-ID: <87vbveqofg.fsf@gmail.com> References: <87ha6z3vbi.fsf@gmx.us> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:56729) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WPApZ-00010I-Uy for emacs-orgmode@gnu.org; Sun, 16 Mar 2014 09:10:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WPApU-0004Ez-4U for emacs-orgmode@gnu.org; Sun, 16 Mar 2014 09:10:21 -0400 Received: from mail-we0-x22f.google.com ([2a00:1450:400c:c03::22f]:36991) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WPApT-0004Et-Tq for emacs-orgmode@gnu.org; Sun, 16 Mar 2014 09:10:16 -0400 Received: by mail-we0-f175.google.com with SMTP id q58so3586141wes.6 for ; Sun, 16 Mar 2014 06:10:15 -0700 (PDT) In-Reply-To: <87ha6z3vbi.fsf@gmx.us> (rasmus@gmx.us's message of "Sun, 16 Mar 2014 00:18:09 +0100") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Rasmus Cc: emacs-orgmode@gnu.org Hello, Rasmus writes: > This patch allows different containers in ox-html.el depending on the > level of the heading. For example, it is possible to get a container > structure like this (level . container): > > * . section > ** . article > *** . div > > This is good for HTML5 at least, and I suspect also for ox-publish > projects. I don't know if this additional semantics is useful for > "HTML4". Thank you for the patch. > Let me know if you find you'd be willing to merge something like this I don't know enough HTML to have an opinion here. > and what changes are necessary, if any. Some comments follow. > +(defcustom org-html-container-element '(("div" . "section") > + ("div" . "article") > + ("div" . "div")) > + "HTML elements to use for wrapping sections. > Can be set with the in-buffer HTML_CONTAINER property or for > publishing, with :html-container. > > -Note that changing the default will prevent you from using > -org-info.js for your website." > +Should be a list of cons cells with positions corresponding to a A "list of cons cells" is an "alist". > +section. If `org-html-html5-fancy' is t the cdr is used > +otherwise the car. "is non-nil" is better than "is t". Also, you shouldn't use `org-html-html5-fancy': see below. > +Note that changing the default will prevent you from > +using org-info.js for your website." > :group 'org-export-html > :version "24.4" > :package-version '(Org . "8.0") > - :type 'string) > + :type '(repeat (cons string string))) There is an `alist' type. See (info "(elisp) Composite Types") > + (let* ((hc (plist-get info :html-container)) > + (n (org-export-get-relative-level headline info))) You don't need a starred `let' here. Also, I suggest to not use short variable names. IMO "container-alist" is better than "hc" and "level" better than "n". > + (cond ((listp hc) > + (or (funcall (if org-html-html5-fancy 'cdr-safe 'car-safe) > + (nth (1- (min n (length hc))) hc)) "div")) You shouldn't use directly the variable `org-html-html5-fancy' since its value can be overridden with external properties (e.g., during a publishing process, with a specific setup). Instead, it should be: (plist-get info :html-html5-fancy) As a rule of thumb, don't use variables when there's a property in INFO for them. Also, I don't think you need to use `car-safe' instead of `car' and `cdr-safe' instead of `cdr'. Eventually, due to the (min n (length hc)) (which should be documented in the docstring) and the fact that the alist cannot be empty, the `funcall' never evaluates to nil. Therefore, the `or' is not necessary. > + ((and (stringp hc) (= 1 n)) > + (plist-get info :html-container)) Note that this branch is always false since HC shouldn't be a string, per the defcustom type, but an alist. > + (t "div"))))) Given the recommendations above, the whole `cond' could be rewritten: (funcall (if (plist-get info :html-html5-fancy) #'cdr #'car) (nth (1- (min level (length container-alist))) container-alist)) Regards, -- Nicolas Goaziou