public inbox archive for pandoc-discuss@googlegroups.com
 help / color / mirror / Atom feed
From: BPJ <melroch-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: pandoc-discuss <pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
Subject: Re: Separate tables of contents for each section
Date: Fri, 31 Jan 2020 21:31:15 +0100	[thread overview]
Message-ID: <CADAJKhBgy0rDop2EXuK_JP6YN6kTtwQ5UpU3HRwonZJh_Wapig@mail.gmail.com> (raw)
In-Reply-To: <3d838861-862c-4b15-8d91-a9b37d671736-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>

[-- Attachment #1: Type: text/plain, Size: 3669 bytes --]

I believe a change has been made so that Lua filters now traverse the
document in linear order. If this is the case in the latest version of
Pandoc it should be doable with a two-pass filter: first a pass which
collects the headings and then a pass which inserts the TsoC. If you want
hierarchical section numbering you probably also need to do a first pandoc
run which inserts the numbering and then a second pandoc run with the
filter to insert the TsoC.  Something like this:

(Warning 1: Untested code!
  Warning 2: Make sure not to overwrite any existing file!
  Warning 3: Assumes that all chapters are heading level 2 — change the
chapter_level and toc_level variables to match!
   Warning 4: Assumes that each section/chapter has a unique identifier!
)

local chapter_level = 2
local toc_level = 3
local headings = {}
local current_chapter = nil

local function collect_headings (head)
  if head.level == chapter_level then
    local id = head.identifier
    current_chapter = {
      chapter = id
      toc = {}
    }
    headings[id] = current_chapter
  elseif head.level = toc_level then
    if current_chapter then
      local toc = current_chapter.toc
      toc[#toc+1] = head
    end
  end
  return nil
end

local function build_toc (heads)
  local toc = {}
  for _,head in ipairs(heads) do
    local entry = {
      pandoc.Plain{
        pandoc.Link(
          head.content:clone(), -- text
          head.identifier, -- target
          "", -- empty title
          pandoc.Attr(
            "", -- empty identifier
            {'local-toc-link'} -- class
          )
        )
      }
    }
    toc[#toc+1] = entry
  end
  return pandoc.Div(
    { pandoc.BulletList(toc) },
    pandoc.Attr( "", {'local-toc'} )
  )
end


local function insert_toc (head)
  if head.level = chapter_level then
    local id = head.identifier
    if headings[id] then
      local toc = build_toc(
        headings[id].toc
      )
      return {head,toc}
    end
  end
  return nil
end

return {
  { Header = collect_headings },
  { Header = insert_toc },
}


Den fre 31 jan. 2020 19:27Szabolcs Horvát <szhorvat-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> skrev:

> Hello everyone,
>
> I am converting a Markdown file to HTML.
>
> I can insert a table of contents at the beginning using the --toc option.
>
> Is it possible to insert additional tables of contents under each
> level-two or level-three heading?
>
> I am looking to create something similar to the organization of this page:
> https://igraph.org/c/doc/igraph-Visitors.html#idm209455316208
>
> Szabolcs
>
> --
> You received this message because you are subscribed to the Google Groups
> "pandoc-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/pandoc-discuss/3d838861-862c-4b15-8d91-a9b37d671736%40googlegroups.com
> <https://groups.google.com/d/msgid/pandoc-discuss/3d838861-862c-4b15-8d91-a9b37d671736%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups "pandoc-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To view this discussion on the web visit https://groups.google.com/d/msgid/pandoc-discuss/CADAJKhBgy0rDop2EXuK_JP6YN6kTtwQ5UpU3HRwonZJh_Wapig%40mail.gmail.com.

[-- Attachment #2: Type: text/html, Size: 6292 bytes --]

  parent reply	other threads:[~2020-01-31 20:31 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-31 18:26 Szabolcs Horvát
     [not found] ` <3d838861-862c-4b15-8d91-a9b37d671736-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2020-01-31 20:31   ` BPJ [this message]
     [not found]     ` <CADAJKhBgy0rDop2EXuK_JP6YN6kTtwQ5UpU3HRwonZJh_Wapig-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2020-02-01  7:58       ` Szabolcs Horvát
     [not found]         ` <2cf07390-db35-422e-887a-bfde62a12a63-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2020-02-01 11:17           ` BPJ
     [not found]             ` <CADAJKhCEvixP6A4yZfmpuvoJj+PaZ=2KRQNdXLwhEveTzV0m9g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2020-02-01 11:42               ` BPJ

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=CADAJKhBgy0rDop2EXuK_JP6YN6kTtwQ5UpU3HRwonZJh_Wapig@mail.gmail.com \
    --to=melroch-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.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.
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 NNTP newsgroup(s).