1. 오에카키 기능 추가
- OekakiBBS 를 사용하여, 화일 업로드와 유사한 방식으로 그림을 그려서 업로드할 수 있게 함
환경설정 파일에 다음 변수를 추가한다.
$OekakiJar = "oekakibbs.jar";
- 이 변수는 oekakibbs.jar 파일의 경로이다. 기본값으로 그냥 두면 wiki.pl이 있는 디렉토리에서 찾는데.
- 만일 CGI WRAP이 설정되어 있는 서버라면 cgi-bin 디렉토리 외부로 꺼내어야 하므로, 이 경우 저 변수의 값을 적절히 지정해준다. (ex: "http://내도메인/어느디렉토리/oekakibbs.jar"
- 페이지를 수정할 때 하단에 "오에카키" 버튼을 클릭하면 오에카키 창이 뜬다.
- 버튼이 제대로 동작하지 않는다면, 브라우저 주소창에 직접 "wiki.pl?action=oekaki" 와 같은 식으로 띄울 수 있다.
- 그림을 그리고 "Send" 버튼을 누르면 해당 그림의 InterLink 의 주소가 나오니 그것을 복사해서 페이지에 적어 주면 된다.
큰 문제는 없어 보이지만..
- 그림을 저장하는 루틴이 다른 액션을 수행할 때와 비교해서 매우 기분 나쁜 방법으로 이뤄진다.. 소스의 일관성을 떨어뜨림
- 그림이 제대로 저장되었는지 여부를 알려주지 못한다. 저장 후에 나오는 화면에서 자신이 올린 그림이 맞는지 확인하는 수밖에 없다
- 오에카키 창을 띄우거나 그림 저장 후에 결과를 볼 때는 사용자의 권한을 검사하여서 사이트 수정 권한이 있어야만 출력이 되도록 했으나, 구조적인 문제점 때문에 그림을 저장하는 순간에는 그 검사를 하지 못한다. 즉, 일단 오에카키 창이 떴다면, 그 상태에서 로그아웃을 한다던가 사이트 관리자가 권한을 변경하여 수정 권한이 없어졌다 하더라도 그림을 업로드 디렉토리에 저장하는 것을 막을 수는 없다.
1.3. config.pl 파일 수정
$OekakiJar = "oekakibbs.jar";
1.4. wiki.pl 수정
환경설정 변수 선언:
use vars qw(
...
$UseLatex $UserHeader $OekakiJar # $OekakiJar 추가
);
- 아래 함수에서 보면 그림을 저장하는 액션 (action=oekaki&mode=save) 로 불렸을 때는 CGI.pm 을 사용한 파라메터 파싱을 하지 않고 곧바로 특정 함수를 불러서 처리를 해 버린다.
sub DoWikiRequest {
...
if (($ENV{'QUERY_STRING'} eq "action=oekaki&mode=save") ||
($ENV{'PATH_INFO'} eq "/action=oekaki&mode=save")) {
&OekakiSave();
return;
}
&InitLinkPatterns();
if (!&DoCacheBrowse()) {
...
}
-
sub DoOtherRequest {
...
} elsif ($action eq "upload") {
&DoUpload();
} 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>
|;
if ($canEdit) {
print T('Editing Help :') . " ";
...
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);
read (STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
my $mark = "Content-type:image/0";
if (!($buffer =~ m|$mark|)) {
die ("Invalid POST data");
}
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;
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>
혹시 도움이 될까 해서 역 컴파일할 수 있는 jad라는 프로그램 첨부합니다. 첨부한 파일 안에 역 컴파일해서 확장자가 .jad라는 파일을 같이 넣어 두었습니다. 확장자를 java로 바꾸면 됩니다. 설명은 Readme에 자세히 되어 있습니다.
jad.zip
- 아이구 그러실것까지야... ^^; 감사합니다.
ext1.42a 에서 소스가 다시 수정되었습니다. 변경사항을 보면서 몇 줄 삭제해 주시면 됩니다.
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 조프
ext1.91 - PaintBBS.jar 대신에 oekakibbs.jar 를 사용하도록 수정했습니다. OekakiSave, OekakiExit, OekakiPaint 세 함수를 고치면 됩니다.
ext1.95b - OekakiExit 함수에서 디렉토리 목록을 읽는 부분 수정.
ext1.107
ext1.109
- CGI-WRAP 설정이 된 서버에서 oekakibbs.jar 파일을 불러올 수 없는 문제 수정. 파일의 경로를 환경 설정 변수에서 지정하도록 함
- 환경 변수가 추가되었고, ext1.107 에서 고친 부분들이 다시 조금씩 바뀌었습니다.
- /SlashLinks를 사용할 때 그림이 저장이 되지 않는 문제 수정
- DoWikiRequest 함수에 한 줄 추가됨
ext2.4 - 저장된 그림 파일의 인터링크 주소를 클립보드에 복사할 수 있는 버튼 추가
ext2.17a - 저장하는 파일명 형식을 oekaki_숫자.png
형태로 수정
위키위키분류