It's online now. Also, here's the code:

#!/usr/bin/env tclsh

package require Tcl 8.6

# Link back to table of contents.
set top {<a href="#table_of_contents" style="font-size: small">[top]</a>}

# Process each named file.
foreach file $argv {
    # Read Markdown file.
    set chan [open $file]
    set data [chan read $chan]
    chan close $chan

    # Check if the Markdown file contains a TOC.
    if {[string first <!--TOC--> $data] >= 0} {
        # If so, build the TOC to contain all first- and second-level
headings.
        # Consider only headings using "#" and "##" marks, not underlines.
        set start 0
        set toc <!--TOC-->
        append toc "\n<a name=\"table_of_contents\"></a>"
        append toc " Table of Contents\n" [string repeat = 50]
        while {[regexp -indices -line -start $start {^##?[^#].*} $data
match]} {
            # Get line from input.
            set line [string range $data {*}$match]

            # Get heading level.
            regexp {^(#*)(.*)} $line _ heading line

            # Strip the anchor tag if present.
            regsub {^ <a name=".*"></a>} $line {} line

            # Strip the link to the TOC if present.
            regsub { <a href="#.*".*} $line {} line

            # Extract the title.
            set title [string trim $line]

            # Compute the anchor name and markup.
            regsub -all {\W} [string tolower $title] _ name
            set anchor "<a name=\"$name\"></a>"

            # Build table of contents.
            append toc \n
            if {$heading eq "##"} {
                append toc " "
            }
            append toc "* \[$title\](#$name)"

            # Replace the section header line.
            set line "$heading $anchor $title $top"
            set data [string replace $data {*}$match $line]

            # Update the start index.
            set start [expr {[lindex $match 0] + [string length $line]}]
        }
        append toc \n

        # Write Markdown file with the table of contents inserted.
        set chan [open $file w]
        chan puts -nonewline $chan [regsub -line
{^<!--TOC-->$(?:\n.+$)*\n$}\
                $data [string map {& \& \\ \\\\} $toc]]
        chan close $chan
    }
}

# vim: set sts=4 sw=4 tw=80 et ft=tcl:

On Aug 21, 2017 09:47, "jungle Boogie" <jungleboog...@gmail.com> wrote:

> On 20 August 2017 at 10:24, Andy Goth <andrew.m.g...@gmail.com> wrote:
> > On 08/18/17 07:38, Dewey Hylton wrote:
> >>
> >> I predict this to be the best email I receive today.
> >>
> >> My first thought was "This is like paid support!"
> >> My second thought was "Wait ... paid support has *never* been this good
> >> ..."
> >>
> >> Thanks for your work!
> >
> >
> > Since you seem to be really interested, have one more improvement.  Now
> > there's no need for an <!--END--> marker.  The table of contents extends
> > from <!--TOC--> to the first blank line.  Aside from looking cleaner
> > overall, this works around a Markdown rendering oddity which required me
> to
> > put a blank line between the last line of the TOC list and the <!--END-->
> > line.
> >
> >
> > https://chiselapp.com/user/andy/repository/brush/file/doc/toc.tcl
> >
>
>
> Any chance of using something like https://www.pastiebin.com to show the
> code?
> chiselapp.com is offline, and it looks like that's been the case of a
> few days now.
> _______________________________________________
> fossil-users mailing list
> fossil-users@lists.fossil-scm.org
> http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users
>
_______________________________________________
fossil-users mailing list
fossil-users@lists.fossil-scm.org
http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users

Reply via email to