[첫화면으로]UseModWiki소스수정/오에카키

마지막으로 [b]

1. 에카키 기능 추가

1.1. 사용법

환경설정 파일에 다음 변수를 추가한다.
### Oekaki .jar 파일
$OekakiJar   = "oekakibbs.jar"; # URL for oekaki *.jar file

1.2. 부작용

큰 문제는 없어 보이지만..

1.3. config.pl 파일 수정

### Oekaki .jar 파일
$OekakiJar   = "oekakibbs.jar"; # URL for oekaki *.jar file

1.4. wiki.pl 수정

환경설정 변수 선언:
### 패치를 위해 추가된 환경설정 변수
use vars qw(
    ...
    $UseLatex $UserHeader $OekakiJar                 # $OekakiJar 추가
    );

아래 함수에서 보면 그림을 저장하는 액션 (action=oekaki&mode=save) 로 불렸을 때는 CGI.pm 을 사용한 파라메터 파싱을 하지 않고 곧바로 특정 함수를 불러서 처리를 해 버린다.
sub DoWikiRequest {
    ...

###############
### added by gypark
### oekaki
    if (($ENV{'QUERY_STRING'} eq "action=oekaki&mode=save") ||
            ($ENV{'PATH_INFO'} eq "/action=oekaki&mode=save")) {
        &OekakiSave();
        return;
    }
###
###############

    &InitLinkPatterns();
    if (!&DoCacheBrowse()) {
    ...
}

sub DoOtherRequest {
    ...
### file upload
        } elsif ($action eq "upload") {
            &DoUpload();
### oekaki 이 단락 추가
        } elsif ($action eq "oekaki") {
            &DoOekaki();
###
    ...
}

sub DoEdit {
    ...
function upload()
{
    var w = window.open("$ScriptName${\(&ScriptLinkChar())}action=upload", "upload", "width=640,height=250,resizable=1,statusbar=1,scrollbars=1");
    w.focus();
}
### 여기서 부터가 추가할 부분인데, 지금 이 주석문은 같이 복사하면 안 된다...
function oekaki()
{
    var w = window.open("$ScriptName${\(&ScriptLinkChar())}action=oekaki&mode=paint", "oekaki", "width=900,height=750,resizable=1,statusbar=1,scrollbars=1");
    w.focus();
}
//-->
### 여기까지... 이 주석문 역시 실제 소스에는 들어가면 안 된다...
</script>
|;
###
###############

###############
### added by gypark
### view action 추가
    if ($canEdit) {
###
###############
        print T('Editing Help :') . "&nbsp;";
    ...
###############
### replaced by gypark
### 미리보기 버튼에 번역함수 적용
    # print q(<input type="button" name="prev1" value="Popup Preview" onclick="javascript:preview();">); # luke added
        print q(<input type="button" name="prev1" value=").
            T('Popup Preview') .
            q(" onclick="javascript:preview();">); # luke added
###
###############

###############
### added by gypark
### file upload
        print " ".q(<input type="button" name="prev1" value=").
            T('Upload File') .
            q(" onclick="javascript:upload();">);
### oekaki 이 단락 추가
        print " ".q(<input type="button" name="prev1" value=").
            T('Oekaki') .
            q(" onclick="javascript:oekaki();">);
### 여기까지
###############
        if ($isConflict) {
            print "\n<br><hr noshade size=1><p><strong>", T('This is the text you submitted:'),
                    "</strong><p>",
                    &GetTextArea('newtext', $newText, $editRows, $editCols),
                    "<p>\n";
    ...
}

다음 함수들은 통채로 추가한다
sub DoOekaki {
    my $mode = &GetParam('mode','paint');

    print &GetHttpHeader();
    print &GetHtmlHeader("$SiteName : ". T("Oekaki $mode"), "");
    print $q->h2(T('Oekaki')) . "\n";
    if (!(&UserCanEdit("",1))) {
        print T('Oekaki is not allowed');
        print $q->end_html;
        return;
    }
    if ($mode eq "exit") {
        &OekakiExit();
    } elsif ($mode eq "save") {
        &OekakiSave();
    } elsif ($mode eq "paint") {
        &OekakiPaint();
    } else {
        print Ts('Invalid action parameter %s', ": $mode");
    }

    print $q->end_html;
}

sub OekakiExit {
    my $filename_pattern = qr/^oekaki(_\d+)?.png$/;

    my (@allfiles, @files, %filemtime);

    opendir (DIR, "$UploadDir") || die Ts('cant opening %s', $UploadDir) . ": $!";
    @allfiles = grep { !/^\.\.?$/ } readdir(DIR);
    close(DIR);

    foreach (@allfiles) {
        if ($_ =~ $filename_pattern) {
            push (@files, $_);
            $filemtime{$_} = ($Now - (-M "$UploadDir/$_") * 86400);
        }
    }

    @files = sort {
        $filemtime{$b} <=> $filemtime{$a}
                ||
                $a cmp $b
    } @files;

    print T('If saving oekaki was done successfully')."<br>\n";
    print T('Following is the Interlink of your file') . "<br>\n";
    print "<div style='text-align:center; font-size:larger; font-weight:bold;'>\n";
    print "Upload:$files[0] ";
    print $q->button(
                -name=>T("Copy"),
                -onClick=>"copy_clip('','Upload:$files[0]')"
                );
    print "<br>";
    print "<img style='border: solid 1 gray;' src='$UploadUrl/$files[0]'>\n";
    print "</div>\n";

    print "<hr size='1'>";
    print T('If you want to paint a new picture')."<br>\n";

    print qq|
<div align="center">
<form action="$ScriptName" method="POST">
<input type="hidden" name="action" value="oekaki">
width [1000-40]<input type="text" name="width" size="4" maxlength="4" value="300">
height [1000-40]<input type="text" name="height" size="4" maxlength="4" value="300">
<input type="submit" value="OK">
</form>
</div>
|;

    print "<hr size='1'>";
    print T('If the picture above is not what you had painted, find your picture from the follwing list')."<br>\n";
    print "<UL>\n";
    foreach (@files) {
        print "<LI>";
        print "<a href='$UploadUrl/$_' target='OekakiPreview'>Upload:$_</a>";
        print " (".&TimeToText($filemtime{$_}).")</LI>\n";
    }
    print "</UL>\n";

}

sub OekakiSave {
    my ($buffer, $target_full);

# POST 데이타 읽음
    read (STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

# 데이터 검사
    my $mark = "Content-type:image/0";
    if (!($buffer =~ m|$mark|)) {
        die ("Invalid POST data");
    }

# png 데이터의 처음 부분의 index 결정
    my $start = index($buffer, $mark);
    $start = index($buffer, "\r\n", $start+1);
    $start = index($buffer, "\r\n", $start+1);
    if ($start < 0) {
        die ("Can't find PNG data");
    }
    $start += 2;

# png 데이터 결정
    my $png_data = substr($buffer, $start);

# 락을 획득
    if (!(&RequestLockDir('oekaki', 4, 3, 0))) {
        die("can not get lock");
    }

# 저장할 화일명 결정
    $target_full = $UploadDir."/".GetUniqueUploadFilename($UploadDir, 'oekaki.png');

# 저장
    &CreateDir($UploadDir);
    &WriteBinaryToFile($target_full, $png_data);

# 락을 해제
    &ReleaseLockDir('oekaki');
    chmod(0644, "$target_full");

# 종료
    print "Content-type: text/plain\n\n";
    print "success\n";
}

sub OekakiPaint {
    my ($imageWidth, $imageHeight) = (
        &GetParam('width','300'),
        &GetParam('height','300')
    );

    $imageWidth = 40 if ($imageWidth < 40);
    $imageWidth = 1000 if ($imageWidth > 1000);
    $imageHeight = 40 if ($imageHeight < 40);
    $imageHeight = 1000 if ($imageHeight > 1000);

    my ($appletWidth, $appletHeight) = (
        (($imageWidth < 300)?700:($imageWidth+400)),
        (($imageHeight < 300)?600:($imageHeight+300))
    );

    print qq|
<script Language="JavaScript">
<!--
function getColors(){
colors=document.paintbbs.getColors();
}
//-->
</script>

<div align="center">
<form action="$ScriptName" method="POST">
<input type="hidden" name="action" value="oekaki">
width [1000-40]<input type="text" name="width" size="4" maxlength="4" value="$imageWidth">
height [1000-40]<input type="text" name="height" size="4" maxlength="4" value="$imageHeight">
<input type="submit" value="OK">
</form>
</div>

<p align="center">

<applet name="oekakibbs" codebase="./" code="a.p.class" archive="$OekakiJar" width="$appletWidth" height="$appletHeight" mayscript>
<param name="cgi" value="$ScriptName${\(&ScriptLinkChar())}action=oekaki&mode=save">
<param name="url" value="$ScriptName${\(&ScriptLinkChar())}action=oekaki&mode=exit">

<param name="popup" value="0">
<param name="tooltype" value="full">
<param name="anime" value="0">
<param name="animesimple" value="1">
<param name="tooljpgpng" value="0">
<param name="tooljpg" value="0">
<param name="picw" value="$imageWidth">
<param name="pich" value="$imageHeight">
<param name="baseC" value="888888">
<param name="brightC" value="aaaaaa">
<param name="darkC" value="666666">
<param name="backC" value="000000">
<param name="mask" value="12">
<param name="toolpaintmode" value="1">
<param name="toolmask" value="1">
<param name="toollayer" value="1">
<param name="toolalpha" value="1">
<param name="toolwidth" value="200">
<param name="target" value="_self">
<param name="catalog" value="0">
<param name="catalogwidth" value="100">
<param name="catalogheight" value="100">
</applet>

</p>
|;
}

다음 함수를 통채로 추가
sub WriteBinaryToFile {
    my ($file, $string) = @_;

    open (OUT, ">$file") or die(Ts('cant write %s', $file) . ": $!");
    binmode(OUT);
    print OUT  $string;
    close(OUT);
}

1.5. translations/korean.pl 수정

Oekaki
오에카키
Oekaki is not allowed
오에카키를 사용하는 것이 허용되지 않습니다
If saving oekaki was done successfully
그림이 제대로 저장되었다면
If you want to paint a new picture
또다른 그림을 그리고 싶다면
If the picture above is not what you had painted, find your picture from the follwing list
위에 있는 그림이 귀하가 그린 것이 아니라면, 아래의 목록에서 그림을 찾아 보세요
Oekaki Save
오에카키 저장

1.6. 추가 업데이트 내역

이상하게도.. 동작은 잘 하는데 제일 처음 오에카키 창을 띄울 때쯤 (어떤 경우 발생하는 지 파악하지 못했음) 아파치에서 에러를 내더군요.
[Mon Mar 24 23:23:42 2003] [error] [client 211.215.61.254] File does not exist: /home/gypark/public_html/cgi-bin/wiki/pbbs/PaintBBSBeanInfo.class
[Mon Mar 24 23:23:42 2003] [error] [client 211.215.61.254] File does not exist: /home/gypark/public_html/cgi-bin/wiki/pbbs/PaintBBS$COMClassObject.class
PaintBBS.jar 화일 내에 있는 class 를 찾다가 에러를 내는가본데... 동작에 문제는 없지만 매우 기분 나쁘군요. 저 에러 안 나게 하는 방법 아시면 알려 주세요~ 아마도 애플릿을 띄우는 태그에서 문제가 있는 듯 한데, 해당 부분의 html 은 다음과 같습니다.
<applet codebase="./" code="pbbs.PaintBBS.class" archive="./PaintBBS.jar" name="paintbbs" width="400" height="420">
<param name="jp" value="false">
<param name="image_width" value="300">
<param name="image_height" value="300">

<param name="image_bkcolor" value="#ffffff">

<param name="undo" value="60">
<param name="undo_in_mg" value="12">

<param name="color_text" value="#505078">
<param name="color_bk" value="#9999bb">
<param name="color_bk2" value="#8888aa">

<param name="color_icon" value="#ccccff">
<param name="color_iconselect" value="#202030">

<param name="url_save" value="wiki.pl?action=oekaki&mode=save">
<param name="url_exit" value="wiki.pl?action=oekaki&mode=exit">

<param name="poo" value="true">
<param name="target" value="_self">
</applet>

-- Raymundo 2003-3-24 11:47 pm

혹시 도움이 될까 해서 역 컴파일할 수 있는 jad라는 프로그램 첨부합니다. 첨부한 파일 안에 역 컴파일해서 확장자가 .jad라는 파일을 같이 넣어 두었습니다. 확장자를 java로 바꾸면 됩니다. 설명은 Readme에 자세히 되어 있습니다. Upload:jad.zip
-- Canday 2003-3-25 9:59 am

아이구 그러실것까지야... ^^; 감사합니다.
-- Raymundo 2003-3-25 5:48 pm

ext1.42a 에서 소스가 다시 수정되었습니다. 변경사항을 보면서 몇 줄 삭제해 주시면 됩니다.
-- Raymundo 2003-3-25 5:48 pm


ext1.42b 에서 두 라인이 변경되었습니다. /화일업로드를 꼭 읽어보세요.
7512c7517
<   print "<img style='border: solid 1 gray;' src='$UploadDir/$files[0]'>\n";
---
>   print "<img style='border: solid 1 gray;' src='$UploadUrl/$files[0]'>\n";
7534c7539
<       print "<a href='$UploadDir/$_' target='OekakiPreview'>Upload:$_</a>";
---
>       print "<a href='$UploadUrl/$_' target='OekakiPreview'>Upload:$_</a>";


ext1.44b 에서 WriteBinaryToFile 함수가 추가되고, OekakiSave 함수의 한 줄이 수정되었습니다. thanks to 조프
-- Raymundo 2003-7-11 3:25 pm


ext1.91 - PaintBBS.jar 대신에 oekakibbs.jar 를 사용하도록 수정했습니다. OekakiSave, OekakiExit, OekakiPaint 세 함수를 고치면 됩니다.
-- Raymundo 2006-1-15 11:46 pm

ext1.95b - OekakiExit 함수에서 디렉토리 목록을 읽는 부분 수정.
-- Raymundo 2006-3-30 12:00 am

ext1.107

ext1.109

ext2.4 - 저장된 그림 파일의 인터링크 주소를 클립보드에 복사할 수 있는 버튼 추가

ext2.17a - 저장하는 파일명 형식을 oekaki_숫자.png 형태로 수정
-- Raymundo 2012-1-29 11:32 pm

1.7. 사용자 의견

이름:  
Homepage:
내용:
 


위키위키분류

마지막 편집일: 2012-1-29 11:32 pm (변경사항 [d])
3733 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기