0475town.com

Note

webなネタ

perl シンプルなCMS (お勉強用)

2016/04/15(Fri) 17:16

というわけで、ファイル入出力のサブルーチンを使ってシンプルなCMSを作ってみました。
ログイン機能は無しで、誰でも更新できるタイプですが、とりあえずはお勉強用ということで。
100行未満で作れる!ってのが素敵ポイント。

ファイルのダウンロード:cmsbase

#!/usr/bin/perl

use strict;

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use Fcntl qw(:flock);
use Time::HiRes qw (time);

$CGI::POST_MAX=1024 * 100;  # max 100K posts
$CGI::DISABLE_UPLOADS = 1;  # no uploads

require 'r-io02.pl';
require 'r-lib.pl';
my $date_s = time;
my $q = CGI->new();

my $act = &escape_tag($q->param('act'));
my $q_pg = &escape_tag($q->param('pg'));
my $w_subtitle = &escape_tag($q->param('subtitle'));
my $w_section = &escape_tag($q->param('section'));

if ( $act eq 'edit_page' ) { &edit_page; }
elsif ( $act eq 'edit_write' ) { &edit_write; }
elsif ( $q_pg ne '' ) { &contents; }
else { &top_page; }

sub top_page {
    my @data = &read_array ('data.cgi');    #ファイルの読み込み

    my $contents = qq(<div id="edit_btn"><a href="?act=edit_page">NewPage</a></div><h2>LIST</h2><ul>);
    for (@data) {
        my ($pg,$subtitle,$section,$host,$date) = split(/\t/);
        $contents .= qq(<li><a href="./?pg=$pg">$subtitle</a> [$host] [$date]</li>);
    }
    $contents .= '</ul></div>';

    &html_out ('_template.html', 'TopPage', $contents);
}

sub contents {
    my $line = &read_line ('data.cgi',$q_pg);    #ファイルの読み込み

    my ($pg,$subtitle,$section,$host,$date) = split(/\t/, $line);
    $section =~ s/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1<a href=\"$2\" target=\"_blank\">$2<\/a>/g;#URLリンク
    $section = qq(<div id="edit_btn"><a href="?act=edit_page&pg=$q_pg">Edit</a></div><div id="date">$date</div><div id="section">$section</div></div>);
    &html_out ('_template.html', $subtitle, $section);
}

sub edit_page {
    my $line = &read_line ('data.cgi',$q_pg);    #ファイルの読み込み

    my ($pg,$subtitle,$section,$host,$date) = split(/\t/, $line);
    $section =~ s/<br>/\n/g;
    &html_out ('_template_form.html', $subtitle, $section);
}

sub edit_write {
    if ($w_subtitle eq '' && $w_section eq '' && $q_pg eq ''){ &top_page; }

    # 空なら削除
    if ($w_subtitle eq '' && $w_section eq '') { 
        &del_file ('data.cgi',$q_pg); 
        &top_page;
    }

    my $host = &get_host;
    my $date = &get_time;

    if ($q_pg eq '') { &write_new_line ('data.cgi', "$w_subtitle\t$w_section\t$host\t$date\t\n"); } # 新規ページの場合
    my $data = "$q_pg\t$w_subtitle\t$w_section\t$host\t$date\t\n";
    &write_line ('data.cgi',$q_pg,$data); # データの書込み
    &top_page;
}

sub html_out {
    my ($temp,$title,$contents) = @_;
    my @template = &read_array ($temp);    # テンプレート読み込み

    # ページ生成時間
    my $vtime = time - $date_s;
    $vtime = sprintf("%3f",$vtime);

    # 出力
    print "Content-type: text/html\n\n";
    for my $line (@template) {
        $line =~ s/<!--title-->/$title/i;
        $line =~ s/<!--contents-->/$contents/i;
        $line =~ s/<!--pg-->/$q_pg/i;
        $line =~ s/<!--vtime-->/$vtime/i;
        print $line;
    }
    exit;
}


■ コメント

お名前:
コメント: