表紙 | 新規 | 編集 | 編集 | 差分 | 一覧 | RSS | 検索 | 閲覧履歴 | 作成履歴 | 更新履歴

do_write関数 - YukiWikiベースのPonyWikiのソースを読んでみる その07

YukiWikiベースのPonyWikiのソースを読んでみる その07

自動リンク・自動アンリンク・ページ作成・ページ削除・ページ更新を行っている関数。ちょっと大きすぎるのでもっと綺麗に書き直したい。

処理の流れとしては以下の通りです。

以下削除時の動作。差分作成までは同じです。
if ($form{mymsg}) {で内容が空であれば削除として動作します。

sub do_write {
	my $mtime;

	if (&frozen_reject()) {
		return;
	}

	if (not &is_editable($form{mypage})) {
		&print_header($form{mypage});
		&print_message($resource{cantchange});
		&print_footer($form{mypage});
		return;
	}

	# Walrus add [part edit] start
	if ($form{mypart} =~ /^\d+$/ and $form{mypart}) {
		$form{mymsg} =~ s/\x0D\x0A|\x0D|\x0A/\n/g;
		$form{mymsg} =~ s/\n*$/\n\n/ if ($form{mymsg});
		my @parts = &read_by_part($form{mypage});
		$parts[$form{mypart} - 1] = $form{mymsg};
		$form{mymsg} = join('', @parts);
	}
	# Walrus add [part edit] end

# 自動リンク処理
	&open_autolink_index;
	for (my $i=0; $i < @autolink_index; $i++){
		my $pagename = $autolink_index[$i];
		chomp $pagename;
		next if $pagename =~ /^\Q$form{mypage}\E$/o;
		$form{mymsg} =~ s|(?<![\[\[])(\Q$pagename\E)(?![\]\]])|[[$1]]|g;
	}
	&close_autolink_index;

	# ネストしている[[WikiName]]対策
	while($form{mymsg} =~ s|\[\[([^\]]*)\[\[([^\]]*)\]\]([^\[]*)\]\]|\[\[$1$2$3\]\]|go){}

	# プラグイン用[[ ]]消し込み
	while($form{mymsg} =~ s|\&([a-z]*)\[\[([a-z]*)\]\]([a-z]*)\(|\&$1$2$3\(|g){}
	while($form{mymsg} =~ s|\&([a-z]*)\(([^)^\n]*)\[\[([^)]*)\]\]([^)^\n]*)\)|\&$1\($2$3$4\)|g){}
	while($form{mymsg} =~ s|\#([a-z]*)\[\[([a-z]*)\]\]([a-z]*)\(|\#$1$2$3\(|g){}
	while($form{mymsg} =~ s|\#([a-z]*)\(([^)^\n]*)\[\[([^)]*)\]\]([^)^\n]*)\)|\#$1\($2$3$4\)|g){}

	# URI用消し込み
	while($form{mymsg} =~ s/(mailto|http|https|ftp):([^\]\s]*)\[\[([^\]\s]*)\]\]([^\[\W]*)/$1:$2$3$4/g){}

	# 新規ページの場合は、既存ページへの自動リンク更新処理
	if(!exists $database{$form{mypage}} and &str_length($form{mypage}) >= $autolink_length){ 
		&open_search_index;
		for (my $i=0; $i < @search_index; $i++) {
			my $index_data = $search_index[$i];
			chomp $index_data;
			next if not $index_data =~ /\Q$form{mypage}\E/o;
			next if $index_data =~ /^$RecentChanges\t/o;
			next if $index_data =~ /^$RecentCreates\t/o;
			my ($pagename) = split(/\t/,$index_data);
			
			if (length($pagename) < 1) { next; }
			if($database{$pagename} =~ /\Q$form{mypage}\E/o){
				$database{$pagename} =~ s|(?<![\[\[])(\Q$form{mypage}\E)(?![\]\]])|[[$1]]|g;
				
				# ネストしている[[WikiName]]対策
				while ($database{$pagename} =~ s|\[\[([^\]]*)\[\[(\Q$form{mypage}\E)\]\]([^\[]*)\]\]|\[\[$1$2$3\]\]|go) {next;}
				
				# プラグイン用[[ ]]消し込み
				$database{$pagename} =~ s|\&([a-z]*)\[\[([a-z]*)\]\]([a-z]*)\(|\&$1$2$3\(|g;
				$database{$pagename} =~ s|\&([a-z]*)\(([^)^\n]*)\[\[([^)]*)\]\]([^)^\n]*)\)|\&$1\($2$3$4\)|g;
				$database{$pagename} =~ s|\#([a-z]*)\[\[([a-z]*)\]\]([a-z]*)\(|\#$1$2$3\(|g;
				$database{$pagename} =~ s|\#([a-z]*)\(([^)^\n]*)\[\[([^)]*)\]\]([^)^\n]*)\)|\#$1\($2$3$4\)|g;
				
				$database{$pagename} =~ s/(mailto|http|https|ftp):([^\[\S]*)\[\[\Q$form{mypage}\E\]\]([^\[\S]*)/$1:$2$form{mypage}$3/go;
			}
		}
		&close_search_index;
		
		# 自動リンク用インデックスの更新
		&open_autolink_index;
		unshift(@autolink_index,$form{mypage});
		&autolink_index_sort;
		&close_autolink_index;
	}
	
	
	if (&conflict($form{mypage}, $form{mymsg})) {
		return;
	}
	
	# Making diff
	if (1) {
		&open_diff;
		my @msg1 = split(/\r?\n/, $database{$form{mypage}});
		my @msg2 = split(/\r?\n/, $form{mymsg});
		$diffbase{$form{mypage}} = &difftext(\@msg1, \@msg2);
		&close_diff;
	}

	$mtime = localtime;
	&update_search_index($form{mypage},$form{mymsg},$mtime);
	
	if ($form{mymsg}) {
		if(!exists $database{$form{mypage}}){
			&update_recent_creates;
		}

		$database{$form{mypage}} = $form{mymsg};
		&send_mail_to_admin($form{mypage}, "Modify");
		&set_info($form{mypage}, $info_ConflictChecker, '' . $mtime);
		if ($form{mytouch}) {
			&set_info($form{mypage}, $info_LastModified, '' . $mtime);
			&update_recent_changes;
		}
		&set_info($form{mypage}, $info_IsFrozen, 0 + $form{myfrozen});
		&print_header($CompletedSuccessfully);
		&print_message($resource{saved});
		&print_content("$resource{continuereading} @{[&armor_name($form{mypage})]}");
		&print_footer($CompletedSuccessfully);

	} else {
		&send_mail_to_admin($form{mypage}, "Delete");
		
		&update_recent_creates;
		delete $database{$form{mypage}};
		delete $infobase{$form{mypage}};
		&update_recent_changes;
		
		while ( my $pagename = each(%database) ){
			if (length($pagename) < 1) { next; }
			$database{$pagename} =~ s|\[\[(\Q$form{mypage}\E)\]\]|$1|g;
		}
		
		# 自動リンク用インデックスの更新
		&open_autolink_index;
		my @tmp = sort @autolink_index;
		my $index_point = &bsearch($form{mypage},\@tmp);
		$autolink_index[$index_point] = undef;
		@autolink_index = (@tmp);
		&autolink_index_sort;
		&close_autolink_index;
		
		&print_header($form{mypage});
		&print_message($resource{deleted});
		&print_footer($form{mypage});
	}
}

''TrackBack'' - http://you-like.to/cgi-bin/ponytail/yukiwiki/wiki.cgi/do_write%b4%d8%bf%f4

先頭へ