txt2html.pl

を作った。複雑な形式には対応してません。

# txt2html.pl
# Last Modified:Sun, 07 Dec 2003 23:28:47 +0900
#
#
#
#
use strict;

my $flag = 0;                   # 0ならばブロック、1ならばインライン
# タグ
my $blocktag;
my %out_tag = (
  '\>'     => 'blockquote',
  '\ '     => 'pre',
  '\-'     => 'ul',
  '\+'     => 'ol',
  ''       => 'p',
  '□'     => 'h1',
  '■'     => 'h2',
  '◇'     => 'h3',
  '◆'     => 'h4',
  '△'     => 'h5',
  '▲'     => 'h6',
  );
my %inline_tag = (
  '\-'     => 'li',
  '\+'     => 'li',
  '\・'    => 'li',
  );

BEGIN {
  print '',"\n";
  print '',"\n";
  print '',"\n";
  print '',"\n";
  print '',"\n";
  print '',"\n";
  print '',"\n";
  print '',"\n";
  print '',"\n";
  print '',"\n";
}

END {
  print '',"\n";
  print '',"\n";
}

# 開始
my $current_line = "\n";
while (my $next_line = ) {
  $current_line = &decode_tag($current_line);
  if ($flag == 0) {
    if($current_line =~ /^\n$/ && $next_line =~ /^[^\n]/) {
      $current_line = &add_block_tag($current_line, $next_line);
      $flag = 1;
    }
  } else {
    $current_line = &add_inline_tag($current_line);
  }
  if ($current_line =~ /^[^\n]/ && $next_line =~ /^\n$/) {
    $current_line = &add_block_tag($current_line, $next_line);
    $flag = 0;
  }
  print "$current_line";
  $current_line = $next_line;
}

# サブルーチン
sub add_inline_tag {
  my ($current_line) = @_;
  # a, strong blockquote の部分
  $current_line =~ s~\'{2}([^\'{2}].*)\'{2}~$1~g;
  $current_line =~ s~^(>.*)~$1
~g; $current_line =~ s~h?(ttps?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)~h$1~g; # li foreach (reverse sort %inline_tag) { $current_line =~ s~^$_(.*)~<$inline_tag{$_}>$1~g; } return ("$current_line"); } sub add_block_tag { my ($current_line, $next_line) = @_; my $tag; if ($flag == 0) { # ブロックタグの外だったら $tag = &check_block_tag($next_line); $blocktag = $tag; return ("$current_line<$out_tag{$tag}>\n"); } else { $tag = $blocktag; return ("$current_line\n"); } } sub check_block_tag { my($current_line) = @_; foreach $_ (reverse sort keys %out_tag) { if ($current_line =~ /^$_/) { return "$_"; } } } sub decode_tag { ($_) = @_; s/\&/&/g; s/\>/>/g; s/\

はてなの記法とバッティングするところがあるのでちょっと手直し。うまく動くかどうか不明。