#!/usr/bin/perl
################################################
#      Генерация топиков в HTML архив. v1.0
#       Автор - Rick (rickdrumer@mail.ru)
#
# Главную страницу форума, которая выводится при заходе
# на ikonboard.cgi Вам придется сделать своими руками.
#
# Этот скрипт генерирует из БД IkonBoard HTML версию
# всех топиков. Вывод производится в формате
# папка_форума+№форума+/topics/topic№топика_страницатопика.html
# Иначе говоря:
# forum1/topics/topic10_1.html forum1/topics/topic1_12.html
#
# Для использования скрипта, закачайте его в папку, где у Вас хранится форум IkonBoard, проставьте CHMOD 755.
# Введите имя папки в которой будет лежать архив
$ibarch = "ibarch"; #Папка в которой будут располагаться файлы архива + графика и прочее
# Запускаем скрипт и получаем архив страниц форума.
################################################
&parse_form;
print "Content-type: text/html\n\n";
$maxthreads=20;
if ($FORM{'action'} eq "print") {&print_forum;}
else {
print <<EOF;
<html>
<head>
<title>Форум Rage</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<form action="topic_arch.cgi" method="post">
<input type="hidden" name="action" value="print">
<input type="submit" value="Перевести">
</form>
EOF
}

print <<EOF;
</body></html>
EOF

sub print_forum {
use CGI::Carp "fatalsToBrowser";
use CGI qw(:standard);
$CGI::POST_MAX=1024 * 150;
$CGI::DISABLE_UPLOADS = 1;
eval {
($0 =~ m,(.*)/[^/]+,)   && unshift (@INC, "$1");
($0 =~ m,(.*)\\[^\\]+,) && unshift (@INC, "$1");
require "ikon.lib";
require "data/progs.cgi";
require "data/boardinfo.cgi";
require "data/styles.cgi";
require "data/membertitles.cgi";
require "data/pollstyles.cgi";
};

open(FILE, "data/allforums.cgi") or die "$ibtxt{'5010'} allforums.cgi!";
flock(FILE, 2);
@forums = <FILE>;
close(FILE);

foreach $tmsp (@forums) {
@line=split(/\|/,$tmsp);
push (@ff,$line[0]);
}

&forumjump;

foreach $forum_tmp (@ff) { ###Выбираем поочередно форум и

open(FILE,"forum".$forum_tmp."/list.cgi") or die print "Error"; ###Берем список топиков из файла list.cgi
@lists=<FILE>;
close(FILE);
@tt=();
foreach (@lists) {
@tlist=split(/\|/,$_);
push (@tt,$tlist[0]);
}

foreach $toptt (@tt) { ###Каждый топик обрабатываем

&getforum("$forum_tmp");

open(FILE,"forum".$forum_tmp."/".$toptt.".thd") or die print "Error не могу открыть $forum_tmp - $toptt.thd";
@topic=<FILE>;
close(FILE);

$numberofitems = @topic;
$nofp = $numberofitems / 20;
	($integer,$decimal) = split(/\./,$nofp);
	$lasti = $numberofitems - 20*$integer;
$i=1;
$p=1;
foreach (@topic) { # start topic foreach

($membername, $topictitle, $postipaddress, $showemoticons, $showsignature, $postdate, $post, $editered) = split(/\|/,$_);
if (!$need_topic_name) {$need_topic_name=$topictitle}

###ВЫВОДИМ ШАПКУ ТАБЛИЦЫ###
if ($i==1) {

###БЛОК СОЗДАНИЯ ДИНАМИЧЕСКИХ СТРАНИЦ ТОПИКА###
$topicpages="<b>Страницы</b> [ ";
($integer,$decimal) = split(/\./,$nofp);
if ($decimal > 0) { $nofp = $integer + 1; }
for ($j=1;$j<=$nofp;$j++) {
if ($j==$p) {$topicpages .= "".$j." ";}
else {$topicpages .= "<a href=\"/$ibarch/forum".$forum_tmp."/topics/topic".$toptt."_".$j."".$filterpart.".html\"><b>".$j."</b></a> ";}
}
$topicpages .= " ]";
$need_page = $topicpages;
###///БЛОК СОЗДАНИЯ ДИНАМИЧЕСКИХ СТРАНИЦ ТОПИКА///###

$output .= <<EOF;
<p>
<table width=730 align=center cellspacing=0 cellpadding=0 border=0><tr><td class=small-text-color>$topicpages</td></tr></table>
<table cellpadding=0 cellspacing=0 border=0 width=730 bgcolor=#999999 align=center>
<tr>
	<td>
<table cellpadding=3 cellspacing=1 border=0 width=100%>
<tr>
	<td bgcolor=#003333>&nbsp;</td>
</tr>
</table>

<table cellpadding=3 cellspacing=1 border=0 width=100%>
EOF
}
###///ВЫВОДИМ ШАПКУ ТАБЛИЦЫ///###


$postdate = $postdate + ($timedifferencevalue*3600) + ($timezone*3600);
$postdate = &dateformat("$postdate");

###ОПЕРАЦИИ С ИМЕНЕМ И ВРЕМЕНЕМ РЕГИСТРАЦИИ###
&getmember("$membername");
$mname=$membername;  
$m_membername = $membername;
$memberfilename = $membername;
$memberfilename =~ y/ /_/;
$m_membername =~ y! !_!; &set_up_guest() unless (-e $ikondir . 'members/'.$m_membername.'.cgi');
if ($membername eq "$ibtxt{'0043'}") { undef $datareg;}
else {
$joineddate = $joineddate + ($timedifferencevalue*3600) + ($timezone*3600);
$joineddate = &joineddate("$joineddate");
$datareg=qq(Зарегистр.: <b>$joineddate</b>&#160;|);
}

###///МАНИПУЛЯЦИИ С ИМЕНЕМ И ВРЕМЕНЕМ РЕГИСТРАЦИИ///###

###ПРОЧИЕ ОПЕРАЦИИ###
if (!$numberofposts) {$numberofposts = "Не писал";undef $kolvomes;}
else{$kolvomes="Всего записей: <b>$numberofposts</b>&#160;|";}
if ($membername eq "Гость") { undef $kolvomes; }

$post = &ikoncode("$post");

if ($post =~ /:(.+?):/) {
$post = &doemoticons("$post");
}

$post =~ s/\:\)/<img src=\"$imagesurl\/emoticons\/smile.gif\" border=\"0\">/g;
$post =~ s/\;\)/<img src=\"$imagesurl\/emoticons\/wink.gif\" border=\"0\">/g;
$post =~ s/\:\(/<img src=\"$imagesurl\/emoticons\/sad.gif\" border=\"0\">/g;
$post =~ s/\:o/<img src=\"$imagesurl\/emoticons\/shocked.gif\" border=\"0\">/g;

if ($signature) {
$signature =~ s/</&lt;/g; $signature =~ s/>/&gt;/g;
$signature =~ s/\&amp;/\&/isg;
$signature =~ s/\[b\]/<b>/isg;
$signature =~ s/\[\/b\]/<\/b>/isg;
$signature =~ s/\[i\]/<i>/isg;
$signature =~ s/\[\/i\]/<\/i>/isg;
$signature =~ s/\[url=\s*(.*?)\s*\]\s*(.*?)\s*\[\/url\]/<a href=\"$1\" target=\"_blank\">$2<\/a>/isg; 
$signature =~ s/\[url\]\s*http:\/\/(.*?)\s*\[\/url\]/<a href=\"http:\/\/$1\" target=\"_blank\">http:\/\/$1<\/a>/isg;
$signature =~ s/\[url\]\s*(.*?)\s*\[\/url\]/<a href=\"http:\/\/$1\" target=\"_blank\">$1<\/a>/isg;
$signature =~ s/\[br\]/\<br\>/isg;
$signature =~ s/\\(\S+?)\@(\S+)/<a href="mailto:$1\@$2\"\>$1\@$2<\/a>/ig; 	    
$signature =~ s/\[email=(\S+?)\]/<a href=\"mailto:$1\">/isg; 	    
$signature =~ s/\[\/email\]/<\/a>/isg;
$post = qq($post<br><br>-----<br>$signature);
}

if ($avatars eq "on") {
$persavatar = "$imagesdir" . "avatars/personal_"."$m_membername".".gif";
if (($useravatar =~ m/personal_/) && (-e $persavatar)) { $useravatarout = $useravatar; }
elsif (($useravatar =~ m/personal_/) && (!-e $persavatar)) { $useravatarout = ""; }
else { $useravatarout = $useravatar; }
if (($useravatar) && ($useravatarout) && ($useravatarout ne "noavatar")) { $useravatarout = qq(<p><img src="$imagesurl/avatars/$useravatarout.gif" border=0 width="32" height="32">); }
else { undef $useravatarout; }
} else { undef $useravatarout; }
$useravatar = $useravatarout;

$memberfilename = $membername;
$memberfilename =~ y/ /_/;

if ($membertitle eq "member" || $membertitle eq "$ibtxt{'0136'}") { $membertitle = $mtitle; } 
$membertitle =~ s/&lt;/</g; $membertitle =~ s/&gt;/>/g; $membertitle =~ s/&quot;/"/g;
$post =~ s/\($ibtxt{'1537'}(.+?)\)/\<font size=$dfontsize1>\($ibtxt{'1537'}$1\)\<\/font\>/isg;
$post = &Truncate("$post");
###///ПРОЧИЕ ОПЕРАЦИИ///###

$output .= qq~
<tr>
	<td bgcolor="#333333">
			
<table width=100% cellpadding=4 cellspacing=0 bgcolor="$postbackcolor">
<tr>
	<td valign="top" width=20% rowspan=2 class=color-text><b>$membername</b><br>$useravatar</td>
	<td valign=top width=80% height=100% class=small-text>&nbsp;<hr size=1>
<div class=big>$post</div></td>
</tr>
<tr>
	<td class="small-text" bgcolor="$postbackcolor"><hr size=1>$kolvomes $datareg $ibtxt{'0319'}: <b>$postdate</b>$view_ip | $editered</td>
</tr>
</table>

	</td>
</tr>
~;
if ($i==20 or ($p == $nofp && $i == $lasti)) {$output .="</table></td></tr></table>";
open(FILE,">$imagesdir/forum".$forum_tmp."/topics/topic".$toptt."_".$p.".html");
print FILE <<EOF;
<!--#set var="TITLE" value="$forumname - $need_topic_name" -->
<!--#include virtual="/$ibarch/head.html" -->
<table cellpadding=1 cellspacing=1 border=0 width=730 align=center>
<tr>
	<td valign=top bgcolor=#999999>

<table cellpadding=0 cellspacing=0 border=0 width=100% align=center>
<tr bgcolor=#333333>
	<td valign=top class=middle-text-color>&nbsp;<a href="/$ibarch/">Форум Rage</a> &raquo; <a href=/$ibarch/forum$forum_tmp/index_1.html>$forumname</a> &raquo; $need_topic_name</td>

</tr>
</table>

	</td>
</tr>
</table>

EOF

print FILE $output;

print FILE <<EOF;
</table>
</td></tr></table>
<br>
<table width=730 align=center cellspacing=0 cellpadding=0 border=0><tr><td class=small-text-color>$need_page</td><td align=right>$jumphtml</td></tr></table>
<!--#include virtual="/$ibarch/foot.html" -->
EOF
close(FILE);
$output = undef;
$need_topic_name = undef;
$i=1;$p++;next;}
$i++;
}

}
}

print "Все топики сгенерированны, все ок!";
}

sub parse_form {

read(STDIN, $FORM_DATA, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $FORM_DATA);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   $value =~ s/<!--(.|\n)*-->//g;
   $value =~ s/<([^>]|\n)*>//g;
   $FORM{$name} = $value;
}
}