diff options
author | P. J. McDermott <pjm@nac.net> | 2012-08-12 07:23:38 (EDT) |
---|---|---|
committer | P. J. McDermott <pjm@nac.net> | 2012-08-12 07:23:38 (EDT) |
commit | 81910209798d0bb030cd6007286da59c0ea312dd (patch) | |
tree | ba5a7229d2644d8bdf7e042d200befdbbcf0fad2 | |
parent | 2f69e47db3f927d8a5d55a5f86758cad4c0095da (diff) |
Parse Markdown headings.
-rw-r--r-- | scripts/MarkdownBook/Document.pm | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/scripts/MarkdownBook/Document.pm b/scripts/MarkdownBook/Document.pm index 30c6314..6b6b966 100644 --- a/scripts/MarkdownBook/Document.pm +++ b/scripts/MarkdownBook/Document.pm @@ -16,6 +16,7 @@ use strict; use warnings; +use MarkdownBook::Section; use MarkdownBook::HTMLTree; use HTML::TreeBuilder; @@ -130,4 +131,92 @@ sub sections return $self->{'sections'}; } +sub parse +{ + my ($self) = @_; + my $source_fh; + my $source_text; + + open($source_fh, '<', + $self->{'book'}->dir() . '/' . $self->{'file'} . '.mdwn'); + $source_text = join('', <$source_fh>); + close($source_fh); + + if ($self->{'type'} ne 'index') { + $self->{'section_level_numbers'} = [0, 0]; + $self->{'section_level'} = -1; + $source_text =~ s/ + ^ + (.+) # Heading text + [ \t]* # Optional trailing whitespace + \n # Line break + (=+|-+) # Underline + [ \t]* # Optional trailing whitespace + $ + /$self->_do_header($1, $2)/mexg; + } + + $self->{'source_text'} = $source_text; +} + +sub _do_header +{ + my ($self, $text, $underline) = @_; + my $level; + my $levels; + my $section_number; + my $section_title; + my $section_id; + my $section; + + $underline =~ s/^([=-]).*$/$1/; + if ($underline eq '=') { + $level = 1; + } else { + $level = 2; + } + + $levels = $#{$self->{'section_level_numbers'}}; + if ($level != $self->{'section_level'}) { + foreach (@{$self->{'section_level_numbers'}}[$level .. $levels]) { + $_ = 0; + } + } + $self->{'section_level'} = $level; + ++${$self->{'section_level_numbers'}}[$level - 1]; + $section_number = join('.', @{$self->{'section_level_numbers'}}); + $section_number = $self->{'id'} . '.' . $section_number; + $section_number =~ s/(?:\.0)*$//; + + $section_title = $text; + $section_title =~ s/ + ^ + ([^\[]+) # Section title + [ \t]+ # Whitespace + \[ # Left square bracket + [^\]]+ # Section ID + \] # Right square bracket + $ + /$1/x; + + $section_id = $text; + $section_id =~ s/ + ^ + [^\[\]]+ # Section title + [ \t]+ # Whitespace + \[ # Left square bracket + ([^\]]+) # Section ID + \] # Right square bracket + $ + /$1/x; + + $section = MarkdownBook::Section->new($self, + $section_number, $section_id, $section_title); + push(@{$self->{'sections'}}, $section); + + $text = $section_number . ' ' . $section_title; + + return $text . "\n" . $underline x length($text); +} + 1; |