トップ 新規 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

plugin/code/Code.pm

オリジナルは開始行番号に+/-を許容しないが、これを+1/-1とした場合に、前回の最終行番号+1/-1からの開始とする仕様にしてみる。同様に+/-nの場合最終業番号+/-nからの開始としておく。現在パッチ作成中。今の所作業中。

  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
############################################################
# 
# <p>ソースコードを整形出力するプラグインです。</p>
# <pre>
# {{code コード種別,タブ桁数,開始行番号,WIDTHxHEIGHT]
# ソースコード
# }}
# </pre>
# <p>
#   開始行番号をブランク、もしくは "0" にすれば行番号は表示されません。
# </p>
# 
############################################################
package plugin::code::Code;
use strict;
#===========================================================
# コンストラクタ
#===========================================================
sub new {
        my $class = shift;
        my $self = {};
        return bless $self,$class;
}

グローバル変数宣言と、mod_perl時のためにinitializeフックでの初期化が必要。

use vars qw($maxline $place);
#===========================================================
# フックメソッド(initialize用)
#===========================================================
sub hook {
        $maxline = 1;
        $place = 1;
}
 25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#===========================================================
# ブロックプラグイン
#===========================================================
sub block {
        my $self = shift;
        my $wiki = shift;
        my $source = shift;
        my $type   = shift;
        my $tab    = shift;
        my $line   = shift;
        my $size   = shift;
        
        my ($width,$height) = ("","");
        if ( $size ne "" && $size ne " " && $size =~ /^([0-9]+%?)?x?([0-9]+%?)?$/ ) {
                $width  = "width:$1;"  if ( $1 ne "" );
                $height = "height:$2;" if ( $2 ne "" );
        }
        
        my $html = "";
        my $formatter = "plugin::code::Format::".$type;
        
        $type =~ /\W/ and $@ = "対応していないコード種別です。\"".&Util::escapeHTML($type)."\"" or eval ("use ".$formatter);
        
        # エラーが発生した場合クリーンアップ処理
        if ( $@ ) {
                my $error = $@;
                $html = "<p>".&Util::escapeHTML($formatter)
                       ."の作成に失敗しました。発生したエラーは以下のとおりです。<pre>$error</pre>";
        } else {
                my $cf = $formatter->new($self);
                $html .= "\n<div class=\"code\" style=\"$width$height\">\n<table><tr>\n";
                $source = $cf->format($wiki, $source);
                
                # タブの桁数
                my $tabspace = "";
                for (my $i=0; $i<$tab; $i++) { $tabspace .= " "; };
                

以下から行番号関係の処理。

 62
63
64
                # 行番号表示
                if    ($line eq 'false') {$line='0';}
                elsif ($line eq 'true' || $line =~ /^ *$/ ) {$line='1';}
 65
                if ($line !~ /[^ 0-9]/ && $line !~ /^ *0$/){
  • +-を許容するように変更
 65
                if ($line !~ /[^-+ 0-9]/ && $line !~ /^ *0$/){
  • +/-があれば保存してある最終行を元に開始行を計算
                        if ($line =~ /[+-]/){
                                if ($line < 0 or $line =~ /\+/ and $line == 0){
                                        $line++;
                                }
                                $line = $pre_maxline+$line;
                                $line = " "x($place - length $line) . $line;
                        }
  • 表示幅を$placeに保存しておく
                        $place = length $line;
 66
                        my $maxline = split(/\n/,$source) + $line-1;
  • $maxlineはグローバル変数化してある
 66
                        $maxline = split(/\n/,$source) + $line-1;
 67
68
69
70
71
72
73
                        $html .= "<td class=\"line\"><pre>";
                        for(my $i=$line;$i<=$maxline;$i++){
                                $html .= "$i<br>";
                        }
                        $html .= "</pre></td>\n";
                }
                

以上、行番号処理

 74
75
76
77
78
79
80
81
82
83
84
                # ソース表示
                $source =~ s/\t/$tabspace/g;
                $html .= "<td class=\"source\"><pre>$source</pre></td>\n";
                
                $html .= "</tr></table>\n</div>\n";
        }
        
        return $html;
}

1;

最終更新時間:2005年10月16日 15時11分08秒