############################################################################### # AdminEdit.pm # # $Date: 01 Sep 2026 $ # ############################################################################### # YaBB: Yet another Bulletin Board # # Open-Source Community Software for Webmasters # # Version: YaBBForum 3.2 # # Packaged: 01 Sep 2026 # # Distributed by: https://yabbforum.nz # # =========================================================================== # # Copyright (c) 2000-2026 YaBB (yabbforum.nz) - All Rights Reserved. # # Software by: The YaBB Development Team # # with assistance from the YaBB community. # ############################################################################### use CGI::Carp qw(fatalsToBrowser); our $VERSION = '3.2'; $admineditpmver = 'YaBBForum 3.2'; if ( $action eq 'detailedversion' ) { return 1; } LoadLanguage('Register'); sub GmodSettings { is_admin(); LoadLanguage('GModPrivileges'); if ( !-e ("$vardir/gmodsettings.txt") ) { GmodSettings2(); } require "$vardir/gmodsettings.txt"; if ( $gmod_newfile eq q{} ) { GmodSettings2(); } fopen( MODACCESS, "$vardir/gmodsettings.txt" ); @scriptlines = ; fclose(MODACCESS); $startread = 0; $counter = 0; foreach my $scriptline (@scriptlines) { chomp $scriptline; if ( substr( $scriptline, 0, 1 ) eq q{'} ) { $scriptline =~ s/newsettings\;page\=//xsm; if ( $scriptline =~ /\"(.*?)\"/sm ) { $allow = $1; } if ( $scriptline =~ /\'(.*?)\'/sm ) { $actionfound = $1; } push @actfound, $actionfound; push @allowed, $allow; $counter++; } } $column = int( $counter / 2 ); $counter = 0; $aa = 0; foreach my $actfound (@actfound) { $checked = q{}; if ( $allowed[$aa] eq 'on' ) { $checked = ' checked="checked"'; } $dismenu .= qq~\n 
~; $counter++; $aa++; if ( $counter > $column + 1 ) { $dismenu .= q~~; $counter = 0; } } if ($allow_gmod_admin) { $gmod_selected_a = ' checked="checked"'; } if ($allow_gmod_profile) { $gmod_selected_p = ' checked="checked"'; if ($allow_gmod_aprofile) { $gmod_selected_ap = ' checked="checked"'; } } else { $gmod_selected_ap = ' disabled="disabled"'; } $yymain .= qq~
$admin_img{'prefimg'} $gmod_settings{'1'}


$gmod_settings{'4'}
$dismenu
$admin_img{'prefimg'} $admin_txt{'10'}
~; $yytitle = "$gmod_settings{'1'}"; $action_area = 'gmodaccess'; AdminTemplate(); return; } sub EditBots { is_admin_or_gmod(); my ($line); $yymain .= qq~
$admin_img{'xx'} $admin_txt{'18'}
$admin_txt{'19'}
$admin_img{'prefimg'} $admin_txt{'10'}
~; $yytitle = "$admin_txt{'18'}"; $action_area = 'editbots'; AdminTemplate(); return; } sub EditBots2 { is_admin_or_gmod(); fopen( BOTS, ">$vardir/bots.hosts", 1 ); print {BOTS} map { "$_\n"; } sort { ( split /\|/xsm, $a )[1] cmp( split /\|/xsm, $b )[1] } split /[\n\r]+/xsm, $FORM{'bots'} or croak "$croak{'print'} BOTS"; fclose(BOTS); $yySetLocation = qq~$adminurl?action=editbots~; redirectexit(); return; } sub SetCensor { is_admin_or_gmod(); my ( $censorlanguage, $line ); if ( $FORM{'censorlanguage'} ) { $censorlanguage = $FORM{'censorlanguage'} } else { $censorlanguage = $lang; } opendir LNGDIR, $langdir; my @lfilesanddirs = readdir LNGDIR; closedir LNGDIR; foreach my $fld ( sort { lc($a) cmp lc $b } @lfilesanddirs ) { if ( -d "$langdir/$fld" && $fld =~ m{\A[0-9a-zA-Z_\#\%\-\:\+\?\$\&\~\,\@/]+\Z}sm && -e "$langdir/$fld/Main.lng" ) { $displang = $fld; $displang =~ s/(.+?)\_(.+?)$/$1 ($2)/gism; if ( $censorlanguage eq $fld ) { $drawnldirs .= qq~~; } else { $drawnldirs .= qq~~; } } } my ( @censored, $i ); fopen( CENSOR, "$langdir/$censorlanguage/censor.txt" ); @censored = ; fclose(CENSOR); foreach my $i (@censored) { $i =~ tr/\r//d; $i =~ tr/\n//d; } $yymain .= qq~
$admin_img{'banimg'} $admin_txt{'135'}
$templs{'7'}
$admin_img{'prefimg'} $admin_txt{'10'}
~; $yytitle = "$admin_txt{'135'}"; $action_area = 'setcensor'; AdminTemplate(); return; } sub SetCensor2 { # don't use &FromChars() here!!! is_admin_or_gmod(); $FORM{'censored'} =~ tr/\r//d; $FORM{'censored'} =~ s/\A[\s\n]+//xsm; $FORM{'censored'} =~ s/[\s\n]+\Z//xsm; $FORM{'censored'} =~ s/\n\s*\n/\n/gxsm; if ( $FORM{'censorlanguage'} ) { $censorlanguage = $FORM{'censorlanguage'}; } else { $censorlanguage = $lang; } my @lines = split /\n/xsm, $FORM{'censored'}; fopen( CENSOR, ">$langdir/$censorlanguage/censor.txt", 1 ); foreach my $i (@lines) { $i =~ tr/\n//d; if ( !$i || $i !~ m/.+[\=~].+/sm ) { next; } print {CENSOR} "$i\n" or croak "$croak{'print'} CENSOR"; } fclose(CENSOR); $yySetLocation = qq~$adminurl?action=setcensor~; redirectexit(); return; } sub SetReserve { is_admin_or_gmod(); fopen( RESERVE, "$vardir/reserve.txt" ); my @reserved = ; fclose(RESERVE); fopen( RESERVECFG, "$vardir/reservecfg.txt" ); my @reservecfg = ; fclose(RESERVECFG); for my $i ( 0 .. $#reservecfg ) { chomp $reservecfg[$i]; if ( $reservecfg[$i] ) { $reservecheck[$i] = q~ checked="checked"~; } } $yymain .= qq~
$admin_img{'profile'} $admin_txt{'341'}
$admin_txt{'699'}
$admin_txt{'342'}




$admin_img{'prefimg'} $admin_txt{'10'}
~; $yytitle = "$admin_txt{'341'}"; $action_area = 'setreserve'; AdminTemplate(); return; } sub SetReserve2 { is_admin_or_gmod(); $FORM{'reserved'} =~ tr/\r//d; $FORM{'reserved'} =~ s/\A[\s\n]+//xsm; $FORM{'reserved'} =~ s/[\s\n]+\Z//xsm; $FORM{'reserved'} =~ s/\n\s*\n/\n/gxsm; fopen( RESERVE, ">$vardir/reserve.txt", 1 ); my $matchword = $FORM{'matchword'} eq 'checked' ? 'checked' : q{}; my $matchcase = $FORM{'matchcase'} eq 'checked' ? 'checked' : q{}; my $matchuser = $FORM{'matchuser'} eq 'checked' ? 'checked' : q{}; my $matchname = $FORM{'matchname'} eq 'checked' ? 'checked' : q{}; print {RESERVE} $FORM{'reserved'} or croak "$croak{'print'} RESERVE"; fclose(RESERVE); fopen( RESERVECFG, "+>$vardir/reservecfg.txt" ); print {RESERVECFG} "$matchword\n" or croak "$croak{'print'} RESERVECFG"; print {RESERVECFG} "$matchcase\n" or croak "$croak{'print'} RESERVECFG"; print {RESERVECFG} "$matchuser\n" or croak "$croak{'print'} RESERVECFG"; print {RESERVECFG} "$matchname\n" or croak "$croak{'print'} RESERVECFG"; fclose(RESERVECFG); $yySetLocation = qq~$adminurl?action=setreserve~; redirectexit(); return; } sub ModifyAgreement { is_admin_or_gmod(); opendir LNGDIR, $langdir; my @lfilesanddirs = readdir LNGDIR; closedir LNGDIR; my $agreementlanguage = $FORM{'agreementlanguage'} || $INFO{'agreementlanguage'} || $lang; foreach my $fld (sort {lc($a) cmp lc $b} @lfilesanddirs) { if (-e "$langdir/$fld/Main.lng") { $displang = $fld; $displang =~ s/(.+?)\_(.+?)$/$1 ($2)/gism; if ($agreementlanguage eq $fld) { $drawnldirs .= qq~~; } else { $drawnldirs .= qq~~; } } } my ( $fullagreement, $line ); fopen( AGREE, "$langdir/$agreementlanguage/agreement.txt" ); while ( $line = ) { $line =~ tr/[\r\n]//d; FromHTML($line); $fullagreement .= qq~$line\n~; } fclose(AGREE); $yymain .= qq~
$admin_img{'xx'} $admin_txt{'764'}
$templs{'8'}
$admin_img{'prefimg'} $admin_txt{'10'}
~; $yytitle = "$admin_txt{'764'}"; $action_area = 'modagreement'; AdminTemplate(); return; } sub ModifyAgreement2 { is_admin_or_gmod(); if ( $FORM{'agreementlanguage'} ) { $agreementlanguage = $FORM{'agreementlanguage'}; } else { $agreementlanguage = $lang; } $FORM{'agreement'} =~ tr/\r//d; $FORM{'agreement'} =~ s/\A\n+//xsm; $FORM{'agreement'} =~ s/\n+\Z//xsm; fopen( AGREE, ">$langdir/$agreementlanguage/agreement.txt" ); print {AGREE} $FORM{'agreement'} or croak "$croak{'print'} AGREE"; fclose(AGREE); $FORM{'agreement'} =~ s/\n/
\n/gsm; if ( -e "$helpfile/$agreementlanguage/User/user00_agreement.help" ) { fopen( HELPAGREE, ">$helpfile/$agreementlanguage/User/user00_agreement.help" ); $my_regtitle = $register_txt{'764a'}; $my_regtitle =~ s/ /_/gsm; print {HELPAGREE} qq^\$SectionName = "$my_regtitle"; ### Section 1 ############################################# \$SectionSub1 = "{yabb_boardname}_$my_regtitle"; \$SectionBody1 = qq~

$FORM{'agreement'}

~; ############################################# 1;^ or croak "$croak{'print'} HELPAGREE"; fclose(HELPAGREE); } $yySetLocation = $FORM{'destination'} ? qq~$adminurl?action=$FORM{'destination'}~ : qq~$adminurl?action=modagreement;agreementlanguage=$FORM{'agreementlanguage'}~; redirectexit(); return; } sub GmodSettings2 { is_admin(); # modstyle is set the same as modcss as modcss is useless without it. $mynewsettings = $FORM{'main'} || $FORM{'advanced'} || $FORM{'news'} || $FORM{'security'} || $FORM{'antispam'}; if ( $FORM{'deletemultimembers'} eq 'on' || $FORM{'addmember'} eq 'on' ) { $FORM{'viewmembers'} = 'on'; } my $filler = q~ ~; my $setfile = <<"EOF"; ### Gmod Related Settings ### \$allow_gmod_admin = "$FORM{'allow_gmod_admin'}"; # \$allow_gmod_profile = "$FORM{'allow_gmod_profile'}"; # \$allow_gmod_aprofile = "$FORM{'allow_gmod_aprofile'}"; # \$gmod_newfile = 'on'; # ### Areas Gmods can Access ### %gmod_access = ( 'ext_admin',"$FORM{'ext_admin'}", 'newsettings;page=main',"$FORM{'main'}", 'newsettings;page=advanced', "$FORM{'advanced'}", 'editbots',"$FORM{'editbots'}", 'newsettings;page=news',"$FORM{'news'}", 'smilies',"$FORM{'smilies'}", 'setcensor',"$FORM{'setcensor'}", 'modagreement',"$FORM{'modagreement'}", 'eventcal_set',"$FORM{'eventcal_set'}", 'bookmarks',"$FORM{'bookmarks'}", 'referer_control',"$FORM{'referer_control'}", 'newsettings;page=security',"$FORM{'security'}", 'setup_guardian',"$FORM{'setup_guardian'}", 'newsettings;page=antispam',"$FORM{'antispam'}", 'spam_questions',"$FORM{'spam_questions'}", 'honeypot',"$FORM{'honeypot'}", 'managecats',"$FORM{'managecats'}", 'manageboards',"$FORM{'manageboards'}", 'helpadmin',"$FORM{'helpadmin'}", 'editemailtemplates',"$FORM{'editemailtemplates'}", 'addmember',"$FORM{'addmember'}", 'viewmembers',"$FORM{'viewmembers'}", 'deletemultimembers',"$FORM{'deletemultimembers'}", 'modmemgr',"$FORM{'modmemgr'}", 'mailing',"$FORM{'mailing'}", 'ipban',"$FORM{'ipban'}", 'setreserve',"$FORM{'setreserve'}", 'modskin',"$FORM{'modskin'}", 'modcss',"$FORM{'modcss'}", 'modtemp',"$FORM{'modtemp'}", 'clean_log',"$FORM{'clean_log'}", 'boardrecount',"$FORM{'boardrecount'}", 'rebuildmesindex',"$FORM{'rebuildmesindex'}", 'membershiprecount',"$FORM{'membershiprecount'}", 'rebuildmemlist',"$FORM{'rebuildmemlist'}", 'rebuildmemhist',"$FORM{'rebuildmemhist'}", 'rebuildnotifications',"$FORM{'rebuildnotifications'}", 'deleteoldthreads',"$FORM{'deleteoldthreads'}", 'manageattachments',"$FORM{'manageattachments'}", 'backupsettings',"$FORM{'backupsettings'}", 'detailedversion',"$FORM{'detailedversion'}", 'stats',"$FORM{'stats'}", 'showclicks',"$FORM{'showclicks'}", 'errorlog',"$FORM{'errorlog'}", 'view_reglog',"$FORM{'view_reglog'}", 'modlist',"$FORM{'modlist'}", ); %gmod_access2 = ( admin => "$FORM{'allow_gmod_admin'}", newsettings => "$mynewsettings", newsettings2 => "$mynewsettings", eventcal_set2 => "$FORM{'eventcal_set'}", eventcal_set3 => "$FORM{'eventcal_set'}", bookmarks2 => "$FORM{'bookmarks'}", bookmarks_add => "$FORM{'bookmarks'}", bookmarks_add2 => "$FORM{'bookmarks'}", bookmarks_edit => "$FORM{'bookmarks'}", bookmarks_edit2 => "$FORM{'bookmarks'}", bookmarks_delete => "$FORM{'bookmarks'}", bookmarks_delete2 => "$FORM{'bookmarks'}", spam_questions2 => "$FORM{'spam_questions'}", spam_questions_add => "$FORM{'spam_questions'}", spam_questions_add2 => "$FORM{'spam_questions'}", spam_questions_edit => "$FORM{'spam_questions'}", spam_questions_edit2 => "$FORM{'spam_questions'}", spam_questions_delete => "$FORM{'spam_questions'}", spam_questions_delete2 => "$FORM{'spam_questions'}", honeypot2 => "$FORM{'honeypot'}", honeypot_add => "$FORM{'honeypot'}", honeypot_add2 => "$FORM{'honeypot'}", honeypot_edit => "$FORM{'honeypot'}", honeypot_edit2 => "$FORM{'honeypot'}", honeypot_delete => "$FORM{'honeypot'}", honeypot_delete2 => "$FORM{'honeypot'}", deleteattachment => "$FORM{'manageattachments'}", manageattachments2 => "$FORM{'manageattachments'}", removeoldattachments => "$FORM{'manageattachments'}", removebigattachments => "$FORM{'manageattachments'}", rebuildattach => "$FORM{'manageattachments'}", remghostattach => "$FORM{'manageattachments'}", profile => "$FORM{'allow_gmod_profile'}", profile2 => "$FORM{'allow_gmod_profile'}", profileAdmin => "$FORM{'allow_gmod_aprofile'}", profileAdmin2 => "$FORM{'allow_gmod_aprofile'}", profileContacts => "$FORM{'allow_gmod_profile'}", profileContacts2 => "$FORM{'allow_gmod_profile'}", profileIM => "$FORM{'allow_gmod_profile'}", profileIM2 => "$FORM{'allow_gmod_profile'}", profileOptions => "$FORM{'allow_gmod_profile'}", profileOptions2 => "$FORM{'allow_gmod_profile'}", ext_edit => "$FORM{'ext_admin'}", ext_edit2 => "$FORM{'ext_admin'}", ext_create => "$FORM{'ext_admin'}", ext_reorder => "$FORM{'ext_admin'}", ext_convert => "$FORM{'ext_admin'}", myprofileAdmin => "$FORM{'allow_gmod_aprofile'}", myprofileAdmin2 => "$FORM{'allow_gmod_aprofile'}", delgroup => "$FORM{'modmemgr'}", editgroup => "$FORM{'modmemgr'}", editAddGroup2 => "$FORM{'modmemgr'}", modmemgr2 => "$FORM{'modmemgr'}", assigned => "$FORM{'modmemgr'}", assigned2 => "$FORM{'modmemgr'}", reordercats => "$FORM{'managecats'}", reordercats2 => "$FORM{'managecats'}", modifycatorder => "$FORM{'managecats'}", modifycat => "$FORM{'managecats'}", createcat => "$FORM{'managecats'}", catscreen => "$FORM{'managecats'}", addcat => "$FORM{'managecats'}", addcat2 => "$FORM{'managecats'}", modskin => "$FORM{'modskin'}", modskin2 => "$FORM{'modskin'}", modcss => "$FORM{'modcss'}", modcss2 => "$FORM{'modcss'}", modstyle => "$FORM{'modcss'}", modstyle2 => "$FORM{'modcss'}", modtemplate2 => "$FORM{'modtemp'}", modtemp2 => "$FORM{'modtemp'}", modifyboard => "$FORM{'manageboards'}", addboard => "$FORM{'manageboards'}", addboard2 => "$FORM{'manageboards'}", reorderboards => "$FORM{'manageboards'}", reorderboards2 => "$FORM{'manageboards'}", boardscreen => "$FORM{'manageboards'}", smilieput => "$FORM{'smilies'}", smilieindex => "$FORM{'smilies'}", smiliemove => "$FORM{'smilies'}", addsmilies => "$FORM{'smilies'}", addmember => "$FORM{'addmember'}", addmember2 => "$FORM{'addmember'}", ml => "$FORM{'viewmembers'}", deletemultimembers => "$FORM{'deletemultimembers'}", mailmultimembers => "$FORM{'mailing'}", mailing2 => "$FORM{'mailing'}", activate => "$FORM{'view_reglog'}", admin_descision => "$FORM{'view_reglog'}", apr_regentry => "$FORM{'view_reglog'}", del_regentry => "$FORM{'view_reglog'}", rej_regentry => "$FORM{'view_reglog'}", view_regentry => "$FORM{'view_reglog'}", clean_reglog => "$FORM{'view_reglog'}", cleanerrorlog => "$FORM{'errorlog'}", deleteerror => "$FORM{'errorlog'}", modagreement2 => "$FORM{'modagreement'}", advsettings2 => "$FORM{'advsettings'}", referer_control2 => "$FORM{'referer_control'}", removeoldthreads => "$FORM{'deleteoldthreads'}", ipban2 => "$FORM{'ipban'}", setcensor2 => "$FORM{'setcensor'}", setreserve2 => "$FORM{'setreserve'}", editbots2 => "$FORM{'editbots'}", ); 1; EOF $setfile =~ s/(.+\;)\s+(\#.+$)/$1 . substr( $filler, 0, (70-(length $1)) ) . $2 /gesm; $setfile =~ s/(.{64,}\;)\s+(\#.+$)/$1 . "\n " . $2/gesm; $setfile =~ s/^\s\s\s+(\#.+$)/substr( $filler, 0, 70 ) . $1/gesm; fopen( MODACCESS, ">$vardir/gmodsettings.txt" ); print {MODACCESS} $setfile or croak "$croak{'print'} MODACCESS"; fclose(MODACCESS); $yySetLocation = qq~$adminurl?action=gmodaccess~; redirectexit(); return; } sub EditPaths { # Simple output of env variables, for troubleshooting if ( $ENV{'SCRIPT_FILENAME'} ne q{} ) { $support_env_path = $ENV{'SCRIPT_FILENAME'}; # replace \'s with /'s for Windows Servers $support_env_path =~ s/\\/\//gxsm; # Remove Setupl.pl and cgi - and also nph- for buggy IIS. $support_env_path =~ s/(nph-)?AdminIndex.(pl|cgi)//igxsm; } elsif ( $ENV{'PATH_TRANSLATED'} ne q{} ) { $support_env_path = $ENV{'PATH_TRANSLATED'}; # replace \'s with /'s for Windows Servers $support_env_path =~ s/\\/\//gxsm; # Remove Setupl.pl and cgi - and also nph- for buggy IIS. $support_env_path =~ s/(nph-)?AdminIndex.(pl|cgi)//igxsm; } $yymain .= qq~
$edit_paths_txt{'33'}
$edit_paths_txt{'34'}
$support_env_path
$admin_img{'prefimg'} $edit_paths_txt{'1'}
$edit_paths_txt{'2'}














$edit_paths_txt{'21'}




$admin_img{'prefimg'} $admin_txt{'10'}
~; $yytitle = "$edit_paths_txt{'1'}"; $action_area = 'editpaths'; AdminTemplate(); return; } sub EditPaths2 { LoadCookie(); # Load the user's cookie (or set to guest) LoadUserSettings(); if ( !$iamadmin ) { fatal_error('no_access'); } $lastsaved = $FORM{'lastsaved'}; $lastdate = $FORM{'lastdate'}; $boardurl = $FORM{'boardurl'}; $boarddir = $FORM{'boarddir'}; $htmldir = $FORM{'htmldir'}; $uploaddir = $FORM{'uploaddir'}; $uploadurl = $FORM{'uploadurl'}; $pmuploaddir = $FORM{'pmuploaddir'}; $pmuploadurl = $FORM{'pmuploadurl'}; $yyhtml_root = $FORM{'yyhtml_root'}; $datadir = $FORM{'datadir'}; $boardsdir = $FORM{'boardsdir'}; $memberdir = $FORM{'memberdir'}; $sourcedir = $FORM{'sourcedir'}; $admindir = $FORM{'admindir'}; $vardir = $FORM{'vardir'}; $langdir = $FORM{'langdir'}; $helpfile = $FORM{'helpfile'}; $templatesdir = $FORM{'templatesdir'}; $facesdir = $FORM{'facesdir'}; $facesurl = $FORM{'facesurl'}; $modimgdir = $FORM{'modimgdir'}; $modimgurl = $FORM{'modimgurl'}; my $filler = q~ ~; my $setfile = << "EOF"; ############################################################################### # Paths.pm # ############################################################################### # YaBB: Yet another Bulletin Board # # Open-Source Community Software for Webmasters # # Version: YaBBForum 3.2 # # Packaged: 01 Sep 2026 # # Distributed by: https://yabbforum.nz # # =========================================================================== # # Copyright (c) 2000-2026 YaBB (yabbforum.nz) - All Rights Reserved. # # Software by: The YaBB Development Team # # with assistance from the YaBB community. # ############################################################################### \$lastsaved = "$lastsaved"; \$lastdate = "$lastdate"; ########## Directories ########## \$boardurl = "$boardurl"; # URL of your board's folder (without trailing '/') \$boarddir = "$boarddir"; # The server path to the board's folder (usually can be left as '.') \$boardsdir = "$boardsdir"; # Directory with board data files \$datadir = "$datadir"; # Directory with messages \$memberdir = "$memberdir"; # Directory with member files \$sourcedir = "$sourcedir"; # Directory with YaBB source files \$admindir = "$admindir"; # Directory with YaBB admin source files \$vardir = "$vardir"; # Directory with variable files \$langdir = "$langdir"; # Directory with Language files and folders \$helpfile = "$helpfile"; # Directory with Help files and folders \$templatesdir = "$templatesdir"; # Directory with template files and folders \$htmldir = "$htmldir"; # Base Path for all public-html files and folders \$facesdir = "$facesdir"; # Base Path for all avatar files \$uploaddir = "$uploaddir"; # Base Path for all attachment files \$pmuploaddir = "$pmuploaddir"; # Base Path for pm attachment files \$modimgdir = "$modimgdir"; # Base Path for all mod images ########## URLs ########## \$yyhtml_root = "$yyhtml_root"; # Base URL for all html/css files and folders \$facesurl = "$facesurl"; # Base URL for all avatar files \$uploadurl = "$uploadurl"; # Base URL for all attachment files \$pmuploadurl = "$pmuploadurl"; # Base URL for pm attachment files \$modimgurl = "$modimgurl"; # Base URL for all mod images 1; EOF fopen( FILE, '>Paths.pm' ); print {FILE} nicely_aligned_file($setfile) or croak "$croak{'print'} FILE"; fclose(FILE); $yySetLocation = qq~$adminurl?action=editpaths~; redirectexit(); return; } sub nicely_aligned_file { my $filler = q{ } x 70; # Make files look nicely aligned. The comment starts after 70 Col my $setfile = shift; $setfile =~ s/(.+;)[ \t]+(#.+$)/ $1 . substr($filler,(length $1 < 70 ? length $1 : 69)) . $2 /gem; $setfile =~ s/\t+(#.+$)/$filler$1/gsm; *cut_comment = sub { # line break of too long comments my @x = @_; my ( $comment, $length ) = ( q{}, 140 ); # 120 Col is the max width of page my $var_length = length $x[0]; while ( $length < $var_length ) { $length += 140; } foreach ( split / +/sm, $x[1] ) { if ( ( $var_length + length($comment) + length $_ ) > $length ) { $comment =~ s/ $//sm; $comment .= "\n$filler# $_ "; $length += 140; } else { $comment .= "$_ "; } } $comment =~ s/ $//sm; return $comment; }; $setfile =~ s/(.+)(#.+$)/ $1 . cut_comment($1,$2) /gem; return $setfile; } 1;