public inbox archive for pandoc-discuss@googlegroups.com
 help / color / mirror / Atom feed
From: BPJ <bpj-J3H7GcXPSITLoDKTGw+V6w@public.gmane.org>
To: pandoc-discuss <pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
Subject: Re: Separate tables of contents for each section
Date: Sat, 1 Feb 2020 12:17:03 +0100	[thread overview]
Message-ID: <CADAJKhCEvixP6A4yZfmpuvoJj+PaZ=2KRQNdXLwhEveTzV0m9g@mail.gmail.com> (raw)
In-Reply-To: <2cf07390-db35-422e-887a-bfde62a12a63-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>

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

Oops, sorry for forgetting to prepend the hash mark to the identifier — a
stupid omission!
I'm glad it worked after that fix.


Den lör 1 feb. 2020 08:59Szabolcs Horvát <szhorvat-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> skrev:

> Thank you, this worked perfectly after a few minor code fixes and after
> prepending # to the identifier.
>
> For the convenience of those, who, like me, don't really know any Lua, I
> attach the fixed code.
>
> 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 },
> }
>
>
> On Friday, 31 January 2020 21:31:31 UTC+1, BP wrote:
>>
>> 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 <szho...-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-...-/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/2cf07390-db35-422e-887a-bfde62a12a63%40googlegroups.com
> <https://groups.google.com/d/msgid/pandoc-discuss/2cf07390-db35-422e-887a-bfde62a12a63%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/CADAJKhCEvixP6A4yZfmpuvoJj%2BPaZ%3D2KRQNdXLwhEveTzV0m9g%40mail.gmail.com.

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

  parent reply	other threads:[~2020-02-01 11:17 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
     [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 [this message]
     [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='CADAJKhCEvixP6A4yZfmpuvoJj+PaZ=2KRQNdXLwhEveTzV0m9g@mail.gmail.com' \
    --to=bpj-j3h7gcxpsitlodktgw+v6w@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).