emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] Configurable prefixes for heading-tree numbering in HTML export?


From: D. C. Toedt
Subject: Re: [O] Configurable prefixes for heading-tree numbering in HTML export? ($)
Date: Sat, 30 Jul 2016 17:48:33 -0500

Many thanks, Nick -- an interesting approach, but it's not a good fit for what I need. 

Another approach would be possible if org-mode had a way of including arbitrary attribute text in HTML exports of headings.  This would enable use of the CSS attr() functionality, combined with the ::before pseudo-element and counters.   I've tested out the following in HTML; it seems to work for what I need:

==BEGIN HTML SNIPPET==

<style>
body   { counter-reset: section-counter; }
h2      { counter-reset: sub-section-counter; }
h3  { counter-reset: sub-sub-section-counter; }

h2::before {
    counter-increment: section-counter;
    content: attr(CDArticlePrefix) "-" counter(section-counter) " ";
}

h3:before {
    counter-increment: sub-section-counter;
    content: attr(CDArticlePrefix) "-" counter(section-counter) "." counter(sub-section-counter) " ";
}

h4:before {
    counter-increment: sub-sub-section-counter;
    content: attr(CDArticlePrefix) "-" counter(section-counter) "." counter(sub-section-counter) "." counter(sub-sub-section-counter) " ";
}

</style>

<h2 CDArticlePrefix="DEFN">Definitions</h2> <!-- NOTE THE "CDArticlePrefix" ATTRIBUTE -->

<h2 CDArticlePrefix="SERV">Consulting Services</h2>

<h2 CDArticlePrefix="PMT">Payment Terms</h2>

<h2 CDArticlePrefix="GPR">General Provisions</h2>

==END HTML SNIPPET==

Unfortunately, org-mode does not seem to be able to include the CDArticlePrefix="DEFN" attribute text in headings, as opposed to in divs.

I appreciate the response.

Regards,

D. C.





D. C. Toedt III 

(My last name is pronounced "Tate")
Attorney & arbitrator -- tech contracts & IP
O: 
+1 (713) 364-6545   C: +1 (713) 516-8968
​​
  
address@hidden    @dctoedt   
Skype: dctoedt

www.OnContracts.com/About  
​​


Unless expressly stated otherwise,
this message 
is not intended to serve
as
assent to an agreement or other document,
even if 
attached to this message.



On Sat, Jul 30, 2016 at 5:06 PM, Nicolas Goaziou <address@hidden> wrote:
Hello,

"D. C. Toedt" <address@hidden> writes:

> So far as I can tell, org-mode currently allows heading numbering in only
> one style (1, 1.1, 1.1.1, etc.).  For HTML export, I'm interested in having
> the heading numbering be configurable on a per-subtree basis, along
> something like the following lines for a hypothetical consulting-agreement
> contract  (indentation is for convenient reading only).  This is for my Common
> Draft <http://www.CommonDraft.org> contract terms and conditions project
> --- I'd like to be able to arrange the trees in an arbitrary order and have
> the top-level headings start with prefixes and heading numbers instead of
> heading numbers alone.
>
> This can be done in a very kludgy fashion with CSS (see below), but doing
> it in org-mode would be far preferable for several reasons.
>
> I'd be happy to pay an honorarium, or make a donation, of USD$100-$200 for
> the appropriate elisp code that I could include in the relevant file(s).
> I'd want the elisp code to be open-sourced, and at least minimal
> documentation, so that it could be made a candidate for possible inclusion
> in a future org-mode release.
>
> Here's an example of the desired org-mode code:
>
>
> ===BEGIN===
>
>
> * Services
>
>   :PROPERTIES:
>
>   :CUSTOM_ID: SVC
>
>   :CUSTOM_PREFIX: t
>
>   :END:
> # ======== NOTE THE :CUSTOM_PREFIX: property above =========== #
>
>
> ** Statements of Work
>
> [properties and text omitted]
>
>
> *** Written Statements of Work Required
>
> [properties and text omitted]
> # =========== AN ARBITRARY NUMBER OF SUBHEADING LEVELS BENEATH THE TOP
> LEVEL ============= #
>
>
> *** Changes Must Be in Writing
> [properties and text omitted]
>
>
>
> ** Billing Rates
>
> [properties and text omitted]
>
>
> ** IP Ownership
>
> [properties and text omitted]
>
>
> * General Provisions
>
>   :PROPERTIES:
>
>   :CUSTOM_ID: GP
>   :CUSTOM_PREFIX: t
>
>   :END:
>
>
> ** Amendments
>
> [properties and text omitted]
>
>
> ** Notices
>
> [properties and text omitted]
>
> ===END===
>
>
> I'd like for the resulting HTML export to be something like the following:
>
> SVC Services
>
> # ======== NOTE THAT THERE'S NO HEADING /NUMBER/ FOR THE TOP-LEVEL HEADING,
> JUST THE PREFIX ========== #
>
>
> SVC-1 Statements of Work
>
> [properties and text omitted]
>
> # ======== PREFERABLY THE SEPARATOR IN "SVC-1" COULD BE CONFIGURED AS A
> HYPHEN, A PERIOD, A COLON, A FORWARD SLASH, ETC. ============= #
>
>
> SVC-1.1  Written Statements of Work Required
>
> [properties and text omitted]
>
> SVC-1.2  Changes Must Be in Writing
>
> [properties and text omitted]
>
>
> SVC-2 Billing Rates
>
> [properties and text omitted]
>
>
> SVC-3 IP Ownership
>
> [properties and text omitted]
>
>
> GP General Provisions
>
>
> GP-1 Amendments
>
> [properties and text omitted]
>
>
> GP-2 Notices
>
> [properties and text omitted]
>

Possibly not what you're asking but, you can ignore CUSTOM_PREFIX
property altogether and use a headline filter to do what you want.

  (defun my-heading-prefix-filter (heading backend info)
    "Prefix every heading and sub-heading with custom ID.
  Skip one level of numbering."
    (when (org-export-derived-backend-p backend 'html)
      (let ((internal-ref
             (and (string-match "\\`.*id=\"outline-container-\\(.+?\\)\"" heading)
                  (match-string 1 heading)))
            (id (and (string-match "\\`.*\n<h[0-9]+ id=\"\\(.*?\\)\">" heading)
                     (match-string 1 heading))))
        ;; When there is no custom ID, id attribute contains the
        ;; internal reference.  So we check if there is a custom ID which
        ;; is going to become the prefix of all headings.
        (unless (equal internal-ref id)   ;No custom ID
          (let ((s 0))
            (while (string-match
                    "\\(<h.+?>\\)\\(?:.*?<span class=\"section-number-[0-9]+\">\\(.+?\\)</span>\\)?"
                    heading s)
              (setq s (+ (match-end 0) (length id) 1))
              (setq heading
                    (cond
                     ;; Unnumbered heading.
                     ((not (match-end 2))
                      (replace-match (concat "\\1" id " ") nil nil heading 1))
                     ;; Top level heading.  Ignore numbering.
                     ((string-match-p "\\`[0-9]+\\'" (match-string 2 heading))
                      (replace-match id nil nil heading 2))
                     ;; Sub-headings.  Skip first number.
                     (t
                      (let ((numbers
                             (save-match-data
                               (split-string (match-string 2 heading) "\\."))))
                        (replace-match
                         (concat id "-" (mapconcat #'identity (cdr numbers) "."))
                         nil nil heading 2))))))
            heading)))))

  (add-to-list 'org-export-filter-headline-functions
               'my-heading-prefix-filter)

custom ID is used to prefix every heading with its value.  Of course, it
means that every heading with a custom ID is expected to follow this
pattern, so you cannot toggle the feature subtree wise. Anyway that's
a starting point.

Regards,

--
Nicolas Goaziou


reply via email to

[Prev in Thread] Current Thread [Next in Thread]