emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Nicolas Goaziou <mail@nicolasgoaziou.fr>
To: "D. C. Toedt" <dc@toedt.com>
Cc: emacs-orgmode@gnu.org
Subject: Re: Configurable prefixes for heading-tree numbering in HTML export? ($)
Date: Sun, 31 Jul 2016 00:06:35 +0200	[thread overview]
Message-ID: <87oa5edbmc.fsf@saiph.selenimh> (raw)
In-Reply-To: <CAGN11+1eLiEQZhKX+C4Qytr+imsf7kTzGO6sy6XktB_uiOC2aw@mail.gmail.com> (D. C. Toedt's message of "Thu, 28 Jul 2016 09:15:19 -0500")

Hello,

"D. C. Toedt" <dc@toedt.com> 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	other threads:[~2016-07-30 22:06 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-28 14:15 Configurable prefixes for heading-tree numbering in HTML export? ($) D. C. Toedt
2016-07-30 22:06 ` Nicolas Goaziou [this message]
2016-07-30 22:48   ` D. C. Toedt

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

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87oa5edbmc.fsf@saiph.selenimh \
    --to=mail@nicolasgoaziou.fr \
    --cc=dc@toedt.com \
    --cc=emacs-orgmode@gnu.org \
    /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 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).