File Coverage

blib/lib/Text/Livedoor/Wiki/Block.pm
Criterion Covered Total %
statement 90 90 100.0
branch 26 26 100.0
condition 3 3 100.0
subroutine 13 13 100.0
pod 8 8 100.0
total 140 140 100.0


line stmt bran cond sub pod time code
1             package Text::Livedoor::Wiki::Block;
2              
3 10     10   56 use warnings;
  10         22  
  10         319  
4 10     10   55 use strict;
  10         19  
  10         287  
5 10     10   13498 use UNIVERSAL::require;
  10         17774  
  10         107  
6 10     10   283 use Scalar::Util;
  10         23  
  10         11648  
7              
8             sub new {
9 9     9 1 27 my $class = shift;
10 9         24 my $self = shift;
11 9         38 $self = bless $self , $class;
12 9         67 Scalar::Util::weaken($self->{inline});
13 9         54 $self->_load( $self->{block_plugins} );
14 9         52 return $self;
15             }
16 234     234 1 737 sub blocks { shift->{blocks} }
17 92     92 1 487 sub trigger{ shift->{trigger} }
18 83     83 1 430 sub inline { shift->{inline}->parse(@_); }
19 148     148 1 1149 sub on_mobile{ shift->{on_mobile} }
20              
21             #XXX only for footnote plugin for now
22             sub footer_section {
23 90     90 1 190 my $self = shift;
24 90         199 my $res = '';
25 90         210 my $footnotes = $Text::Livedoor::Wiki::scratchpad->{footnotes};
26              
27 90 100       534 if( $footnotes ) {
28 3         10 $res =qq|
29 3         7 my $cnt = 1;
30 3         11 for ( @$footnotes ) {
31 4         25 $res .=qq|
  • *$cnt : $_
  • \n|;
    32 4         11 $cnt++;
    33             }
    34 3         8 $res .="
      \n\n";
    35             }
    36 90         393 return $res;
    37             }
    38              
    39 992     992 1 2651 sub opts { $Text::Livedoor::Wiki::opts }
    40             sub parse {
    41 178     178 1 289 my $self = shift;
    42 178         296 my $text = shift;
    43 178         329 my $nested = shift;
    44 178         412 my $catalog_keeper = $self->opts->{catalog_keeper};
    45 178         872 my $id_keeper = $self->opts->{id_keeper};
    46 178         637 my $skip_catalog = $self->opts->{skip_catalog};
    47              
    48 178         1283 my @lines = split("\n" ,$text , -1 );
    49 178         381 my $html = '';
    50 178         374 my @items = ();
    51 178         304 my $last = scalar @lines;
    52 178         376 my $cnt = 0;
    53 178         278 my $on_processing = 0;
    54 178         226 my $current_block ;
    55              
    56 178         409 $Text::Livedoor::Wiki::scratchpad->{core}{block_uid}++;
    57             LINE :
    58 178         342 for ( @lines ) {
    59 458 100       1354 $Text::Livedoor::Wiki::scratchpad->{core}{current_pos}++ unless $nested;
    60             #warn $Text::Livedoor::Wiki::scratchpad->{core}{current_pos} . ':' . $_ unless $nested;
    61 458         649 $cnt++;
    62 458 100       1617 my $blocks_cache = $on_processing ? [$current_block] : $self->blocks ;
    63 458         1122 my $id = $self->opts->{name} . '_block_' . $Text::Livedoor::Wiki::scratchpad->{core}{block_uid} ;
    64 458         727 for my $block ( @{$blocks_cache} ) {
      458         1081  
    65 2391 100       23771 if( my $res = $block->check($_ , { id => $id , on_next => 0 , inline => $self->{inline} } ) ) {
    66 373         578 $current_block= $block;
    67 373         551 $on_processing = 1;
    68 373         1177 push @items, $res;
    69 373 100       803 if( $last != $cnt ) {
    70 287 100       1755 unless( my $next_res = $block->check($lines[$cnt] , { id => $id , on_next => 1 , inline => $self->{inline} } ) ) {
    71 62 100       193 $html =~ s/
    \n$// unless $Text::Livedoor::Wiki::scratchpad->{skip_ajust_block_break};
    72 62         141 $Text::Livedoor::Wiki::scratchpad->{skip_ajust_block_break} = 0;
    73 62 100       201 $html .= $self->on_mobile ? $block->mobile( $self, $self->{inline} , \@items) : $block->get( $self, $self->{inline} , \@items );
    74 62         202 @items = ();
    75 62         152 $Text::Livedoor::Wiki::scratchpad->{core}{block_uid}++;
    76 62         149 $on_processing = 0;
    77             }
    78             }
    79             else {
    80             #$html =~ s/
    \n$//;
    81 86 100       481 $html =~ s/
    \n$// unless $Text::Livedoor::Wiki::scratchpad->{skip_ajust_block_break};
    82 86 100       277 $html .= $self->on_mobile ? $block->mobile( $self, $self->{inline} , \@items) : $block->get( $self , $self->{inline} , \@items );
    83 86         333 @items = ();
    84 86         381 $Text::Livedoor::Wiki::scratchpad->{core}{block_uid}++;
    85 86         191 $on_processing = 0;
    86             }
    87 373         2177 next LINE;
    88             }
    89             }
    90              
    91 83         431 my $text= $self->inline($_) ;
    92 83 100       253 if( length $text ) {
    93 69         289 $html .= $text . qq|
    \n|;
    94             }
    95             else {
    96 14         41 $html .= qq|
    \n|;
    97             }
    98             }
    99 176         419 $on_processing = 0; # in case
    100              
    101             #hoge
    <- remove this
    102 176         519 $html =~ s/
    \n$//;
    103              
    104 176 100 100     1236 if( $html && !($html =~ /\n$/) ) {
    105 44         153 $html .= "\n";
    106             }
    107              
    108 176         1122 return $html;
    109             }
    110             sub _load {
    111 9     9   20 my $self = shift;
    112 9         28 my $plugins = shift;
    113 9         21 my $trigger = {};
    114              
    115 9         33 for (@$plugins ) {
    116 81         1313 $_->require;
    117 81 100       1688 $trigger->{$_} = $_->trigger if $_->trigger;
    118             }
    119 9         137 $self->{blocks} = $plugins;
    120 9         30 $self->{trigger} = $trigger;
    121            
    122             }
    123              
    124             1;
    125              
    126             =head1 NAME
    127              
    128             Text::Livedoor::Wiki::Block - Block Parser
    129              
    130             =head1 DESCRIPTION
    131              
    132             block parser. supporting block has block :-)
    133              
    134             =head1 METHOD
    135              
    136             =head2 blocks
    137              
    138             =head2 footer_section
    139              
    140             =head2 inline
    141              
    142             =head2 new
    143              
    144             =head2 on_mobile
    145              
    146             =head2 opts
    147              
    148             =head2 parse
    149              
    150             =head2 trigger
    151              
    152             =head1 AUTHOR
    153              
    154             polocky
    155              
    156             =cut