OSDN Git Service

見出しの表示レベルを指定した場合にスキップした見出しをカウントアップするのをわすれていた。
[fswiki/sandbox.git] / takezoe / plugin / book / TocParser.pm
1 ###############################################################################
2 #
3 # book¥×¥é¥°¥¤¥ó¤ËÂбþ¤·¤¿¥¢¥¦¥È¥é¥¤¥ó¥Ñ¡¼¥µ
4 #
5 ###############################################################################
6 package plugin::book::TocParser;
7 use strict;
8 use vars qw(@ISA);
9 use Wiki::HTMLParser;
10
11 @ISA = qw(Wiki::HTMLParser);
12
13 #==============================================================================
14 # ¥³¥ó¥¹¥È¥é¥¯¥¿
15 #==============================================================================
16 sub new {
17         my $class = shift;
18         my $self  = Wiki::HTMLParser->new(shift);
19         my $page  = shift;
20         my $level = shift;
21         
22         if($level ne ""){
23                 $self->{'display_level'} = $level;
24         } else {
25                 $self->{'display_level'} = 3;
26         }
27         
28         $self->{'outline_html'}  = "";
29         $self->{'outline_level'} =  0;
30         $self->{'outline_cnt'}   =  0;
31         $self->{'pagename'}      = $page;
32         return bless $self,$class;
33 }
34
35 #==============================================================================
36 # ¥Ø¥Ã¥É¥é¥¤¥ó¤Î¤ßÃê½Ð
37 #==============================================================================
38 sub l_headline {
39         my $self  = shift;
40         my $level = shift;
41         my $obj   = shift;
42         
43         if($level > $self->{'display_level'}){
44                 $self->{outline_cnt}++;
45                 return;
46         }
47         
48         my $text = &Util::delete_tag(join("",@$obj));
49         
50         if($level > $self->{outline_level}){
51                 while($level!=$self->{outline_level}){
52                         if($self->{'outline_close_'.($self->{outline_level})} == 1){\r
53                                 $self->{outline_html} .= "</li>\n";\r
54                                 $self->{'outline_close_'.($self->{outline_level})} = 0;\r
55                         }
56                         $self->{outline_html} .= "<ul class=\"outline\">\n";
57                         $self->{outline_level}++;
58                 }
59         } elsif($level <= $self->{outline_level}){
60                 while($level-1  != $self->{outline_level}){
61                         if($self->{'outline_close_'.($self->{outline_level})} == 1){
62                                 $self->{outline_html} .= "</li>\n";
63                                 $self->{'outline_close_'.($self->{outline_level})} = 0;
64                         }
65                         if($level == $self->{outline_level}){
66                                 last;
67                         }
68                         $self->{outline_html} .= "</ul>\n";
69                         $self->{outline_level}--;
70                 }
71         } else {
72                 $self->{outline_html} .= "</li>\n";
73         }
74         
75         $self->{'outline_close_'.$level} = 1;
76         $self->{outline_html} .= "<li><a href=\"?page=".Util::url_encode($self->{pagename})."#p".$self->{outline_cnt}."\">$text</a>";
77         $self->{outline_cnt}++;
78 }
79
80 #==============================================================================
81 # ¥¢¥¦¥È¥é¥¤¥óɽ¼¨ÍÑHTML¤Î¼èÆÀ
82 #==============================================================================
83 sub outline {
84         my $self   = shift;
85         my $source = shift;
86         $self->parse($source);
87         
88         while($self->{outline_level} != 0){
89                 if($self->{'outline_close_'.($self->{outline_level})} == 1){
90                         $self->{outline_html} .= "</li>\n";
91                 }
92                 $self->{outline_html} .= "</ul>\n";
93                 $self->{outline_level}--;
94         }
95         
96         return $self->{outline_html};
97 }
98
99 #==============================================================================
100 # ¥×¥é¥°¥¤¥ó¤Î²òÀϤò¹Ô¤¦¤È̵¸Â¥ë¡¼¥×¤·¤Æ¤·¤Þ¤¦¤¿¤á
101 #==============================================================================
102 sub plugin{
103         my $self   = shift;
104         my $plugin = shift;
105         
106         if($plugin->{'command'} eq 'title1'){
107                 $self->{'title1'}++;
108                 $self->{'title2'} = 0;
109                 $self->{'title3'} = 0;
110                 return $self->{'chapter'}.'-'.$self->{'title1'}.'. ';
111                 
112         } elsif($plugin->{'command'} eq 'title2'){
113                 $self->{'title2'}++;
114                 $self->{'title3'} = 0;
115                 return $self->{'chapter'}.'-'.$self->{'title1'}.'-'.$self->{'title2'}.'. ';
116                 
117         } elsif($plugin->{'command'} eq 'title3'){
118                 $self->{'title3'}++;
119                 return $self->{'chapter'}.'-'.$self->{'title1'}.'-'.$self->{'title2'}.'-'.$self->{'title3'}.'. ';
120                 
121         }
122         return undef;
123 }
124
125 #==============================================================================
126 # ¥×¥é¥°¥¤¥ó¤Î²òÀϤò¹Ô¤¦¤È̵¸Â¥ë¡¼¥×¤·¤Æ¤·¤Þ¤¦¤¿¤á
127 #==============================================================================
128 sub l_plugin{
129         my $self   = shift;
130         my $plugin = shift;
131         
132         if($plugin->{'command'} eq 'chapter'){
133                 $self->{'chapter'} = $plugin->{'args'}->[0];
134                 return undef;
135         }
136         
137         # outline°Ê³°¤Î¾ì¹ç¤Î¤ß½èÍý¤ò¹Ô¤¦
138         if($plugin->{command} ne "outline"){
139                 my $info = $self->{wiki}->get_plugin_info($plugin->{command});
140                 if($info->{FORMAT} eq "WIKI"){
141                         return $self->SUPER::l_plugin($plugin);
142                 }
143         } else {
144                 return undef;
145         }
146 }
147
148 1;