[첫화면으로]UseModWiki소스수정/Comments매크로

마지막으로 [b]

Comments , Long Comments 매크로

wiki.pl 수정

$pageid 전역변수 추가
### 패치를 위해 추가된 내부 전역 변수
use vars qw(%RevisionTs $FS_lt $FS_gt $StartTime $Sec_Revision $Sec_Ts
    $ViewCount $AnchoredFreeLinkPattern %UserInterest %HiddenPage
    $pageid);
###

sub BrowsePage {
    my ($id) = @_;
    my ($fullHtml, $oldId, $allDiff, $showDiff, $openKept);
    my ($revision, $goodRevision, $diffRevision, $newText);

### comments from Jof
    $pageid = $id;
###
...

sub MacroSubst {
    ...
### <comments(숫자)>
    $txt =~ s/(\&__LT__;comments\(([^,]+),([-+]?\d+)\)&__GT__;)/&MacroComments($1,$2,$3)/gei;
### <longcomments(숫자)>
    $txt =~ s/(\&__LT__;longcomments\(([^,]+),([-+]?\d+)\)&__GT__;)/&MacroComments($1,$2,$3,1)/gei;
###
###############
    return $txt;
}

함수 통채로 추가
sub MacroComments {
    my ($itself,$id,$up,$long) = @_;
    my $idvalue;
    my $temp;

    $temp = $id;
    $temp =~ s/,$//;
    $temp = &RemoveLink($temp);
    $temp = &FreeToNormal($temp);
    if (&ValidId($temp) ne "") {
        return $itself;
    }
    $id = "$temp";

    if (($UserID ne "113") && ($UserID ne "112")) {
        $idvalue = "[[$UserID]]";
    }

    my ($hidden_long, $readonly_true, $readonly_style, $readonly_msg);
    my ($name_field, $comment_field);
    my $submit_button = $q->submit(-name=>"Submit",-value=>T("Submit"));

    if ($long) {
        $hidden_long = &GetHiddenValue("long","1") . "<br>";
    }

    if ((!&UserCanEdit($id)) && (abs($up) < 100)) {     # 에디트 불가
        $readonly_true = "true";
        $readonly_style = "background-color: #f0f0f0;";
        $readonly_msg = T('Comment is not allowed');
        $submit_button = "";
        $name_field = $q->textfield(-name=>"name",
                                    -class=>"comments",
                                    -size=>"10",
                                    -maxlength=>"80",
                                    -readonly=>"$readonly_true",
                                    -style=>"$readonly_style",
                                    -default=>"$idvalue");
        if ($long) {        # longcomments
            $comment_field = $q->textarea(-name=>"comment",
                                    -class=>"comments",
                                    -rows=>"10",
                                    -cols=>"80",
                                    -readonly=>"$readonly_true",
                                    -style=>"$readonly_style",
                                    -default=>"$readonly_msg");
        } else {            # comments
            $comment_field = $q->textfield(-name=>"comment",
                                            -class=>"comments",
                                            -size=>"60",
                                            -readonly=>"$readonly_true",
                                            -style=>"$readonly_style",
                                            -default=>"$readonly_msg");
        }
    } else {                                            # 에디트 가능
        $name_field = $q->textfield(-name=>"name",
                                    -class=>"comments",
                                    -size=>"10",
                                    -maxlength=>"80",
                                    -default=>"$idvalue");
        if ($long) {        # longcomments
            $comment_field = $q->textarea(-name=>"comment",
                                    -class=>"comments",
                                    -rows=>"10",
                                    -cols=>"80"
                                    -default=>"");
        } else {            # comments
            $comment_field = $q->textfield(-name=>"comment",
                                            -class=>"comments",
                                            -size=>"60",
                                            -default=>"");
        }
    }

    return
        $q->startform(-name=>"comments",-method=>"POST",-action=>"$ScriptName") .
        &GetHiddenValue("action","comments") .
        &GetHiddenValue("id","$id") .
        &GetHiddenValue("pageid","$pageid") .
        &GetHiddenValue("up","$up") .
        T('Name') . ": " .
        $name_field . "&nbsp;" .
        T('Comment') . ": " .
        $hidden_long .
        $comment_field . "&nbsp;" .
        $submit_button .
        $q->endform;
}

sub ProcessPostMacro {
    # $id 가 추가됨
    my ($string, $id) = @_;
    ...
    ### comments from Jof
    if (length($id) != 0) {
        $string =~ s/(^|\n)<((long)?comments)\(([-+]?\d+)\)>([\r\f]*\n)/$1<$2($id,$4)>$5/gim;
    }
    ###
    return $string;
}

sub DoOtherRequest {
    ...
            &DoPageHide();
### comment from Jof
        } elsif (($action eq "comments") || ($action eq "longcomments")) {
            &DoComments($id) if &ValidIdOrDie($id);
###
###############
        } else {
            # Later improve error reporting
    ...

DoPost 함수를 새로 작성
sub DoPost {
    my $string = &GetParam("text", undef);
    my $id = &GetParam("title", "");
    my $summary = &GetParam("summary", "");
    my $oldtime = &GetParam("oldtime", "");
    my $oldconflict = &GetParam("oldconflict", "");
    DoPostMain($string, $id, $summary, $oldtime, $oldconflict, 0);
    return;
}

기존의 DoPost 함수는 이름을 DoPostMain 으로 변경하고 아래와 같이 수정
# sub DoPost {
#   my ($editDiff, $old, $newAuthor, $pgtime, $oldrev, $preview, $user);
#   my $string = &GetParam("text", undef);
#   my $id = &GetParam("title", "");
#   my $summary = &GetParam("summary", "");
#   my $oldtime = &GetParam("oldtime", "");
#   my $oldconflict = &GetParam("oldconflict", "");
#   my $isEdit = 0;
#   my $editTime = $Now;
#   my $authorAddr = $ENV{REMOTE_ADDR};

sub DoPostMain {
    my ($string, $id, $summary, $oldtime, $oldconflict, $isEdit, $rebrowseid) = @_;
    my ($editDiff, $old, $newAuthor, $pgtime, $oldrev, $preview, $user);
    my $editTime = $Now;
    my $authorAddr = $ENV{REMOTE_ADDR};
###
###############


###############
### replaced by gypark
### comments 기능
#   if (!&UserCanEdit($id, 1)) {
    if (($rebrowseid eq "") && (!&UserCanEdit($id, 1))) {
###
###############
        # This is an internal interface--we don't need to explain
    ...
### <mysign([[Raymundo]],2003-9-6 8:02 am)> 등 글작성 직후 수행할 매크로
### comments 구현을 위해 $id 추가, from Jof
    $string = &ProcessPostMacro($string, $id);
###
    ...
    &ReleaseLock();
###############
### added by gypark
### comments from Jof
    if ($rebrowseid ne "") {
        $id = $rebrowseid;
    }
###
###############
    &ReBrowsePage($id, "", 1);
}

함수 통채로 추가 ==> /액션모듈화가 되면서 아래 코드는 action/comments.pl 로 옮겨짐.
sub DoComments {
    my ($id) = @_;
    my $pageid = &GetParam("pageid", "");
    my $name = &GetParam("name", "");
    my $newcomments = &GetParam("comment", "");
    my $up   = &GetParam("up", "");
    my ($timestamp) = CalcDay($Now) . " " . CalcTime($Now);
    my $string;
    my $long = &GetParam("long", "");

    if ($newcomments =~ /^\s*$/) {
        &ReBrowsePage($pageid, "", 0);
        return;
    }

    $name = &GetRemoteHost(0) if ($name eq "");
    $name =~ s/,/./g;
    $newcomments = &QuoteHtml($newcomments);

    &OpenPage($id);
    &OpenDefaultText();
    $string = $Text{'text'};
    if ($long) {
        $newcomments =~ s/^\s*//g;
        $newcomments =~ s/\s*$//g;
        $newcomments =~ s/(\n)\s*(\r?\n)/$1$2/g;
        $newcomments =~ s/(\r?\n)/ \\\\$1/g;
        if ($up > 0) {
            $string =~ s/(\<longcomments\($id,$up\)\>)/\n$newcomments <mysign($name,$timestamp)>\n$1/;
        } else {
            $string =~ s/(\<longcomments\($id,$up\)\>)/$1\n$newcomments <mysign($name,$timestamp)>\n/;
        }
    } else {
        $newcomments =~ s/(----+)/<nowiki>$1<\/nowiki>/g;
        if ($up > 0) {
            $string =~ s/\<comments\($id,$up\)\>/*''' $name ''' : $newcomments - <small>$timestamp<\/small>\n\<comments\($id,$up\)\>/;
        } else {
            $string =~ s/\<comments\($id,$up\)\>/\<comments\($id,$up\)\>\n*''' $name ''' : $newcomments - <small>$timestamp<\/small>/;
        }
    }

    DoPostMain($string, $id, "*", $Section{'ts'}, 0, 0, $pageid);
    return;
}

translations/korean.pl 수정

다음 항목 추가
Name
이름
Comment
내용
Submit
달기
Comment is not allowed
답글 달기가 허용되지 않습니다

추가 업데이트 내역

ext-1.46a 에서 소스가 수정되었습니다. 숫자의 범위에 따라서 코멘트를 허용/불허할 수 있게 하였습니다.
-- Raymundo 2003-9-1 6:25 pm

ext-1.46d 에서 DoComments 함수에 한 줄 추가되었습니다. 코멘트 안에서 부등호를 자동으로 lt; 와 gt; 로 바꾸어서 html 태그나 매크로 등을 사용하지 못하게 하였습니다.
-- Raymundo 2003-9-4 12:13 pm

ext1.47 - longcomments 매크로가 추가되었습니다.
-- Raymundo 2003-9-5 11:49 am

ext1.47a - longcomments 의 치환방식을 일단 결정지어서 반영하고, MacroComments 함수에서 직접 CGI 태그들을 출력하게 했더니만 위키에서 페이지 수정하기를 할 때 엉망이 되는 문제가 있어서.. Perl 의 CGI 모듈의 함수들을 사용하도록 수정했습니다.
-- Raymundo 2003-9-6 8:06 am

ext1.48b - comments 에서 이름과 내용을 구분하기 힘든 것 같아 이름 부분 앞뒤에 ''' 를 붙여서 굵게 표시되도록 수정했습니다.
-- Raymundo 2003-9-10 4:39 pm

ext1.48c - 수정되었습니다. 매크로 앞뒤에 다른 문자가 없어야 한다는 제한이 추가되었습니다.
-- Raymundo 2003-9-15 9:44 pm

ext1.60a - /변경사항요약 패치가 되었기 때문에 굳이 직전 수정의 summary 를 이어받을 필요가 없다고 생각되어, summary 를 달지 않고 페이지를 수정하는 것처럼 동작하도록 고쳤습니다.
-- Raymundo 2004-3-22 2:00 am

ext1.66 - /Thread매크로와 관련해서 이쪽의 함수들이 좀 바뀌었습니다. /Thread매크로 페이지에서 확인하세요.

ext1.82a - /액션모듈화와 관련하여, DoComments 함수를 별도의 파일로 분리함
-- Raymundo 2005-3-4 12:43 pm

ext1.89 - /Comments와Thread매크로개선에 의해 바뀌었습니다. /Comments와Thread매크로개선에서 확인하세요.
-- Raymundo 2005-11-17 3:28 pm

Notes

음... 잠겨 있거나 기타 이유로 방문자가 에디트 할 수 없는 페이지에 코멘트 창이 있을 경우 문제가 되는군요. 지금 상태에서는 코멘트는 입력할 수 있는데 달기 버튼을 누르면 그때 에러가 납니다. 페이지를 수정할 수 없는 경우에 아예 코멘트도 못 달게 수정하는 것은 간단하긴 한데, 일부러 "페이지 수정은 못 하고 코멘트만 달 수 있게"하고 싶은 경우도 있을 것 같네요. 그렇다고 해서 페이지 수정 권한이 없을 경우에도 코멘트는 허용한다면.. 이번에는 반대로 코멘트까지 막고 싶은 경우에 대책이 없군요. 흐음... 코멘트를 다시 두 종류로 나누기도 그렇고...
-- Raymundo 2003-9-1 5:14 pm


sub BrowsePage 부분은 맨위에도 있고 맨 아래도 있네요. 다른건가요?
-- Nyxity 2003-9-4 9:16 pm

정말이네요. 한 쪽은 삭제했습니다. ^^; 감사
-- Raymundo 2003-9-4 9:19 pm


의견을 구함

구현 및 소스 다듬기는 다 되었는데... longcomments 에 입력한 텍스트를 어떤 방식으로 페이지에 합칠 것인가 하는 문제가 여전히 남아 있습니다. comments 의 경우는 텍스트 앞에 "* " 을 붙여서 list 형태로 만드는 것은 다 아실테고... 현재 제가 생각한 안은 다음과 같습니다.
일단, 어떤 경우던 간에 부등호는 사용하지 못하게 한다. (html 태그나 매크로를 코멘트 안에서 남발하는 것을 막기 위함)
---- 허용 여부는 고민 중.
허용할 경우 - 글 앞에 저걸 붙여서 다른 글과 구분하게 할 수 있다. (물론 사용법을 아는 사용자의 경우) 대신 별 생각없이 저걸 쓴 사람이 당황할 결과가 생긴다. (가끔 쓰는 사람들이 있더라고요.. 우리 다같이 문장부호는 국문법에 있는 대로만 씁시다. :-)
1. 그냥 페이지 안에 코멘트 텍스트를 붙여 넣는다
그러면 페이지를 직접 수정하는 것처럼 "*" "#" ":" 등을 사용한 리스트, {{{ }}} 등을 다 사용할 수 있게 됩니다. 물론 아는 사람이 제대로 사용해야겠죠.
가장 큰 단점은, 코멘트 안의 줄바꿈이 소용이 없다는 겁니다. (페이지 수정할 때 그냥 엔터로 한줄 넘긴 것이 소용없는 것처럼) 그러면 모르는 사람들이 당황하겠죠. 생각할 수 있는 대안은 각 줄 끝에 "\\" 을 자동으로 붙이는 건데.. 이러면 줄바꿈은 되지만 반대로 두번째 줄부터는 "*" 등을 붙여봤자 소용없습니다.
사실 저도 이 방법에 꽤 매력을 느낍니다만.. (달아놓고 나니 당장 저부터도 페이지 직접 수정이 귀찮아지더군요) 완전한 위키페이지 수정도 아니고 완전히 웹보드 같이 "입력한 그대로 표시"도 아닌 아주 애매한 상황
2. 각 라인 앞에 ": " 을 붙여서 한 칸 들여쓰기로 만든다
현재 이렇게 구현되어 있습니다. 장점은 입력한 텍스트의 줄바꿈이 꽤 매끄럽게 처리된다는 점. 실수로 앞에 "*", "#" 등을 넣는다고 해도 그게 치환되지 않는다는 점 등등, 제가 보기에는 '위키에 대해 모른채' 글을 남기기에 제일 적합한 듯 합니다.
물론 줄 처음에 공백이 있어서 무시된다는 등 여전히 ": " 들여쓰기의 특성이 나타납니다.
3. 각 라인 앞에 " " 을 붙여서 라인마다 pre 태그가 붙게 만든다 (내지는 전체 코멘트 앞뒤로 pre 태그를 붙여 버릴 수도..)
pre 태그가 붙기 때문에 역시 줄 앞에 "*" "#" 등은 치환되지 않습니다.
단점은 pre 태그 때문에 글꼴이 고정폭 폰트로 나온다는 점. (pre class=comments 같이 해서 스타일쉬트로 해결할 수는 있는데, 그러자면 전혀 엉뚱한 부분도 수정해야 합니다)
또 하나 단점은 pre 태그 안에서는 wordwrap 이 안 됩니다. 즉, 코멘트 창에 줄바꿈 없이 한 줄을 길게 써서 저장하면, 브라우저 화면에도 그게 한 줄로 나옵니다. (가로 스크롤을 해야 함) 이것을 막으려면 입력폼에 wordwrap=hard 속성을 주어서, 코멘트를 저장하는 그 순간에 강제로 줄바꿈을 넣어버리는 방법이 있습니다. 이 경우는 사용자가 엔터를 치지 않았는데 줄이 바뀌어 버리는 결과가 되고, 코멘트 입력창의 폭 만큼만 텍스트의 폭이 한정되어 버리는 게 단점입니다.
4. 방금 생각난 건데, 코멘트 전체의 앞뒤에 nowiki 태그쌍을 붙여버리고, 그경우 줄바꿈이 안 되니 각 줄의 끝에 "\\" 을 붙이는 방법도 있겠습니다.
이게 제일 속편하고 괜찮은 방법 같기도 하군요. 이걸로 결정하고 싶은 맘이 제일 강합니다. :-)
아뿔싸, 열심히 구현하고 났더니만... 대괄호를 사용한 링크조차 쓸 수가 없군요!!! ㅠ,.ㅠ (그러고보니 3번도 마찬가지네)

셋 다 장단점이 뚜렷해서 결정을 못하겠습니다. 사실 comments 매크로의 가장 큰 취지는 "페이지를 직접 수정해서 글을 쓰는 것에 부담을 느끼는 사람들을 위한 도구 제공"이라고 생각하는데, 그렇게 따진다면 2번이나 3번이 낫겠고.. 위키 사용자가 좀 더 편하게 페이지를 수정할 수 있게 한다면 1번이 낫겠지요. 내일(토요일) 오전쯤에 결정할 생각입니다. 시간이 얼마 남지 않았는데, 이걸 보시면 의견 좀 내어주세요.
-- Raymundo 2003-9-6 1:43 am

크윽... pre 태그 또는 nowiki 태그를 앞뒤로 붙이는 것은 대괄호 링크마저 금지되니 포기. 스페이스를 라인 앞에 두는 것은 매 라인마다 pre 태그가 생기니 페이지 직접 수정시 너무 지저분해서 포기. 그냥 각 라인 끝에 "\\" 만 붙여서 넣어주기로 했습니다. 제일 무난한 것 같네요. 나중에라도 더 좋은 의견이 있으면 알려 주세요
-- Raymundo 2003-9-6 7:19 am

from 게시판
질문이 있습니다. comments나 longcommrnts의 창 폭은 조절할 수 없나요? ^^
-- 거북이 2004-4-26 11:11 pm

위 소스에 보면
        if ($long) {        # longcomments
            $comment_field = $q->textarea(-name=>"comment",
                                    -class=>"comments",
                                    -rows=>"10",                    # long comment 에서의 창 높이
                                    -cols=>"80",                    # 창 폭
                                    -readonly=>"$readonly_true",
                                    -style=>"$readonly_style",
                                    -default=>"$readonly_msg");
        } else {            # comments
            $comment_field = $q->textfield(-name=>"comment",
                                            -class=>"comments",
                                            -size=>"60",             # comment 의 폭
                                            -readonly=>"$readonly_true",
                                            -style=>"$readonly_style",
                                            -default=>"$readonly_msg");
        }
위와 같이 크기가 지정되어 있습니다. 저걸 고쳐 주시면 되고, 브라우저의 크기에 따라서 자동으로 폭이 바뀌는 방법을 묻는 거라면 모르겠습니다. 참, 고칠 때는 저 부분이 두 번 나오니까 (수정 가능한 경우와 불가능한 경우) 두 곳 다 바꿔 주어야 합니다.
-- Raymundo 2004-4-26 11:24 pm

안녕하세요. 0.92K3-ext1.61c 쓰고 있는데요. 코멘트 매크로 사용 방법을 잊어 버리고 숫자를 50자로 주면 권한이 없는 사람들은 쓸 수 없는지 모르고 있다가 한참 지난 후에 알았어요.
그래서 제 위키에 등록하지 않는 사용자들은 댓글을 못 달고 있었는데 스팸 댓글은 꾸준히 달리고 있었거든요.
아예 코멘트 매크로를 없애면 달리지 않았지만요. 스팸봇들은 어떻게 달았을까요?
-- Canday 2007-5-28 11:39 am

안녕하세요 Canday님, 잘 지내시죠?

말씀하신 부분은... 글쎄요 저도 잘 모르겠습니다만 -_-; 1.61c 소스를 풀어서 보니까 그 당시의 소스에서는 숫자가 100미만일 경우 매크로 출력시에만 텍스트 입력이나 submit 버튼을 없앴고, 저장하는 DoComments 서브루틴 쪽에서는 따로 검사를 안 하고 있네요.

스팸봇은 브라우저로 값을 채워넣는게 아니라 자기가 필드값을 넣어서 바로 POST 전송을 해 버리는 것 같습니다.

좀 번거롭겠지만 ext2.* 버전이나, 데이타 변환이 번거로우면 하다못해 ext1의 마지막 버전인 1.111c 정도로 일단 업데이트해보시죠.
-- Raymundo 2007-5-28 12:46 pm

네. 항상 그렇듯이 그럭 저럭 잘 지내고 있어요.
그런데 큰 일 났습니다.
버전을 올려보려고 잘 모르는 명령어를 쓰다가 위키 디렉토리를 옮겼고 그러던 중 그 파일을 일부 지웠는데 지금 운영하는 위키 폴더가 옮겨 졌고 작업 전에 백업한다고 받아 놓기는 했는데 받다가 실패여서 그게 또 완전한게 아닌 것 같아요 -_-;;;; 시간 있을 때 도와 주실 수 있는지요
-- Canday 2007-5-28 1:25 pm

아이구 저런... >.<

gypark쥐메일로 호스트명,계정,비번과 함께 자세한 상황을 알려주시면 들어가서 확인해보겠습니다.
-- Raymundo 2007-5-28 2:06 pm

고맙습니다. 메일 보냈어요.
-- Canday 2007-5-28 2:25 pm
이름:  
Homepage:
내용:
 

위키위키분류

마지막 편집일: 2009-4-21 7:49 am (변경사항 [d])
5156 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기