[![Build Status](https://travis-ci.org/imago-storm/Markdown-TOC.svg?branch=master)](https://travis-ci.org/imago-storm/Markdown-TOC)
# NAME

Markdown::TOC - Create a table of contents from markdown

# SYNOPSIS

   use Markdown::TOC;

   my $toc = Markdown::TOC->new(handler => sub {
       my %params = @_;

       return '+' x $params{level} . ' ' . $params{text};
   });

   my $md = q{
   # header1

   some text

   ## header 2

   some another text

   };

   my $toc_html = $toc->process;

# DESCRIPTION

Markdown::TOC is a simple module for building table of contents of markdown files.
The module itself produces a very simple and rather ugly table of contents, it is
supposed to be used with handlers to provide a nice custom-formatted toc.

# METHODS

## new

   my $toc = Markdown::Toc->new(
       handler => sub { ... },
       order_handler => sub { ... },
       anchor_handler => sub { ... },

       delimeter => "\n"
   )

Creates a new TOC processor.

   delimeter - is used for final strings concatenations, an empty string by default.

All handlers are described below.

## process

Produces formatted TOC from the provided markdown content.

   $toc->process($md);

# HANDLERS

When a header is discovered, an event is fired. So several handlers could be defined to take care
of actual formatting.

## raw\_handler

Takes half-raw data and takes care of all formatting. Accepts `$text` - text content of a header
and `$level` - header level

   my $toc = Markdown::TOC->new(raw_handler => sub {
       my ($text, $level) = @_;
       # Do something about that
   });

## handler

Takes processed data, like text, level, determined order and an anchor for a header.

   my $toc = Markdown::TOC->new(handler => sub{
       my (%param) = @_;

       my $text = $param{text};
       my $anchor = $param{anchor};
       my $order_formatted = $param{order_formatted};
       my $order = $param{order}; # an array like [1, 2, 1], where the first element contains first level number and so on

       # format text and give it away
   });

## anchor\_handler

Takes `$text` and `$level` and returns an anchor for a header link
(If we want the link in toc to point on the header. Or somewhere else)

   my $toc = Markdown::TOC->new(anchor_handler => sub {
       my ($text, $level) = @_;
       my $anchor = $text;
       # getting rid of all spaces..
       $anchor =~ s/\s+/_/g;
       return $anchor;
   });

## order\_handler

Takes `$text` and `$level` and returns a formatted order mark for our future table of contents.

   my $toc = Markdown::TOC->new(sub {
       my ($text, $level) = @_;
       return 42;
   });

If this handler and `handler` were specified, the result from the callback is passed as order\_formatted
parameter.

## listener

Like raw\_handler, but returns nothing.

   my $table = [];
   my $toc = Markdown::TOC->new(listener => sub {
       my ($text, $level) = @_;
       push @$table, {text => $text, level => $level};
   });

# LICENSE

Copyright (C) Polina Shubina.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

# AUTHOR

Polina Shubina <[email protected]>