不正なHTML出力をしないようにする。
[fix invalid html]
記法によって不正なHTMLが出力される場合があったのでそれを修正。
下記の点が修正されています。
- 空<p></p>問題
- リストの途中で改行した場合の問題
- <blockquote>問題
- 見出しの次の行に空行を入れなかった場合の問題
- リストの入れ子が不正になる問題(まだ不完全かも?)
- <img>タグのalt属性
さらにブロック要素の入れ子にも対応しました。
↓のような記述が可能になりました。
- リスト
整形済み 整形済み
- リスト
整形済み 整形済み
- リスト
- リスト
back_push()変更
- 2003-08-06 (Wed) 13:16:33 リストの不正な入れ子を修正する為に、処理を変更
- 2003-08-06 (Wed) 16:57:37 エラーになる場合があったので修正
- 2003-08-06 (Wed) 17:42:17 もっとスマートな実装を思いついたので変更
- 2003-08-07 (Thu) 00:04:07 さらに修正
# yakty del [fix invalid html] start #sub back_push { # my ($tag, $level, $savedref, $resultref, $attr) = @_; # while (@$savedref > $level) { # push(@$resultref, shift(@$savedref)); # } # if ($savedref->[0] ne "</$tag>") { # push(@$resultref, splice(@$savedref)); # } # while (@$savedref < $level) { # unshift(@$savedref, "</$tag>"); # push(@$resultref, "<$tag$attr>"); # } #} # yakty del [fix invalid html] end # yakty add [fix invalid html] start sub back_push { #my ($tag, $level, $savedref, $resultref, $attr) = @_; my ($tag, $level, $savedref, $resultref, $attr, $ignoreref) = @_; while(grep(/$tag/, @$savedref) > $level){ push(@$resultref, shift(@$savedref)); } if($savedref->[0] eq "</p>"){ push(@$resultref, shift(@$savedref)); } while($savedref->[0] ne "</$tag>" and $savedref->[0] ne "</li>" and grep(/<\/li>/, @$savedref) > 0){ push(@$resultref, shift(@$savedref)); } #while(@$savedref and $savedref->[0] ne "</$tag>"){ while($savedref->[0] ne "</$tag>" and grep(/<\/$tag>/, @$savedref) >= $level){ push(@$resultref, shift(@$savedref)); } while (grep(/$tag/, @$savedref) < $level) { unshift(@$savedref, "</$tag>"); push(@$resultref, "<$tag$attr>"); } } # yakty add [fix invalid html] end
text_to_html()内の変更
- 2003-08-06 (Wed) 09:21:09 ページの先頭に見出しがあると空<p></p>が生成されるのを抑制
my (@txt) = split(/\n/, $txt); my (@toc); my $tocnum = 0; my (@saved, @result); #unshift(@saved, "</p>"); # yakty del [fix invalid html] #push(@result, "<p>"); # yakty del [fix invalid html] # foreach (@txt) { for (my $line = 0; $line < @txt; $line++) {
- リストの不正な入れ子を修正
- back_push()の処理変更で対応できるようになったので元に戻しました
} elsif (/^(-{1,3})(.*)/) { &back_push('ul', length($1), \@saved, \@result); #push(@result, '<li>' . &inline($2) . '</li>'); # yakty del [fix invalid html] # yakty add [fix invalid html] start if($form{mypage} eq $RecentChanges){ push(@result, '<li>' . &inline($2) . '</li>'); } else { push(@result, shift(@saved)) if($saved[0] eq '</li>'); push(@result, '<li>' . &inline($2)); unshift(@saved,'</li>'); } # yakty add [fix invalid html] end
} elsif (/^(>{1,3})(.*)/) { &back_push('blockquote', length($1), \@saved, \@result); push(@result, '<p>' . &inline($2)); unshift(@saved, '</p>'); # yakty add [fix invalid html]
# } elsif (/^\s*$/) { # Walrus del [convine pre] } elsif (/^[\x0D\x0A]*$/) { # Walrus add [convine pre] push(@result, splice(@saved)); #unshift(@saved, "</p>"); # yakty del [fix invalid html] #push(@result, "<p>"); # yakty del [fix invalid html]
} else { # yakty add [fix invalid html] start if($#saved < 0){ unshift(@saved, "</p>"); push(@result, "<p>"); } # yakty add [fix invalid html] end push(@result, &inline($_)); # yakty add [keep newline] start if($saved[0] eq '</p>'){ push(@result, '<br />'); } # yakty add [keep newline] end }
foreach (@toc) { if (/^(-{1,3})(.*)/) { &back_push('ul', length($1), \@tocsaved, \@tocresult); #push(@tocresult, '<li>' . $2 . '</li>'); # yakty del [fix invalid html] # yakty add [fix invalid html] start push(@tocresult, shift(@tocsaved)) if($tocsaved[0] eq '</li>'); push(@tocresult, '<li>' . $2); unshift(@tocsaved,'</li>'); # yakty add [fix invalid html] end } }
make_link()内の変更
#if ($name =~ /^(https?|ftp):[^\?]+\.(gif|png|jpe?g)$/ and $use_autoimg) { # yakty del [fix invalid html] # $escapedname = qq(<img src="$escapedname">); # yakty del [fix invalid html] if ($name =~ /^(https?|ftp):[^\?]+?([^\/]+\.(gif|png|jpe?g))$/ and $use_autoimg) { # yakty add [fix invalid html] $escapedname = qq(<img src="$escapedname" alt="$2">); # yakty add [fix invalid html] return $escapedname if ($name eq $chunk); }