Comments , Long Comments 매크로
- 사용법 : <comments(숫자)> , <longcomments(숫자)>
- 매크로의 앞뒤에는 공백을 비롯한 다른 문자가 오면 안 된다.
- comments 는 한 줄 크기의 텍스트 필드, longcomments 는 여러 줄 크기의 텍스트 영역으로 나타난다.
- 처음 작성시 자동으로 <comments(또는longcomments)(페이지이름,숫자)> 로 확장되니, 신경쓰지 말 것
- 한 페이지 내에 코멘트 입력창을 여러 개 넣을 경우, 숫자를 서로 다르게 하여 구분해 주면 된다.
- 숫자가 양수냐 음수냐에 따라 동작이 달라진다
- 숫자가 양수일 경우는 댓글이 입력창 위쪽에, 최근글이 아래 오는 순서로 달린다.
- 숫자가 음수일 경우는 댓글이 입력창 아래쪽에, 최근글이 위에 오는 순서로 달린다.
- 숫자의 범위에 따라 페이지 수정 권한의 적용이 달라진다.
- 숫자의 절대값이 100 보다 작을 경우는, 페이지 수정 권한이 없는 경우는 코멘트창에 아예 입력을 할 수 없다.
- 100 이상일 경우는, 수정 권한에 관계 없이 코멘트를 달 수 있다. (심지어 관리자가 잠근 페이지의 경우도 코멘트를 달 수 있다) 따라서 페이지 수정은 금지하고 코멘트 입력창을 이용하여 댓글만 달 수 있게 할 경우는 이 숫자를 100 이상으로 주면 된다.
- 코멘트 안에서 입력한 부등호는 lt; 와 gt; 로 바뀐다. 따라서 html 태그나 위키매크로를 사용할 수 없다.
- 대괄호를 사용한 페이지 링크, URL 링크 등은 사용가능하다.
- comments 의 경우 앞에 "* " 가 붙어서 unordered list 형태로 코멘트가 쌓인다.
- longcomments 의 경우, 입력한 각 라인의 끝에 " \\" 가 자동으로 붙은 상태로 페이지에 삽입된다.
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);
$pageid = $id;
...
sub MacroSubst {
...
$txt =~ s/(\&__LT__;comments\(([^,]+),([-+]?\d+)\)&__GT__;)/&MacroComments($1,$2,$3)/gei;
$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) {
$comment_field = $q->textarea(-name=>"comment",
-class=>"comments",
-rows=>"10",
-cols=>"80",
-readonly=>"$readonly_true",
-style=>"$readonly_style",
-default=>"$readonly_msg");
} else {
$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) {
$comment_field = $q->textarea(-name=>"comment",
-class=>"comments",
-rows=>"10",
-cols=>"80"
-default=>"");
} else {
$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 . " " .
T('Comment') . ": " .
$hidden_long .
$comment_field . " " .
$submit_button .
$q->endform;
}
sub ProcessPostMacro {
my ($string, $id) = @_;
...
if (length($id) != 0) {
$string =~ s/(^|\n)<((long)?comments)\(([-+]?\d+)\)>([\r\f]*\n)/$1<$2($id,$4)>$5/gim;
}
return $string;
}
sub DoOtherRequest {
...
&DoPageHide();
} elsif (($action eq "comments") || ($action eq "longcomments")) {
&DoComments($id) if &ValidIdOrDie($id);
} else {
...
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 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};
if (($rebrowseid eq "") && (!&UserCanEdit($id, 1))) {
...
$string = &ProcessPostMacro($string, $id);
...
&ReleaseLock();
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 에서 소스가 수정되었습니다. 숫자의 범위에 따라서 코멘트를 허용/불허할 수 있게 하였습니다.
ext-1.46d 에서 DoComments 함수에 한 줄 추가되었습니다. 코멘트 안에서 부등호를 자동으로 lt; 와 gt; 로 바꾸어서 html 태그나 매크로 등을 사용하지 못하게 하였습니다.
ext1.47 - longcomments 매크로가 추가되었습니다.
ext1.47a - longcomments 의 치환방식을 일단 결정지어서 반영하고, MacroComments 함수에서 직접 CGI 태그들을 출력하게 했더니만 위키에서 페이지 수정하기를 할 때 엉망이 되는 문제가 있어서.. Perl 의 CGI 모듈의 함수들을 사용하도록 수정했습니다.
ext1.48b - comments 에서 이름과 내용을 구분하기 힘든 것 같아 이름 부분 앞뒤에 ''' 를 붙여서 굵게 표시되도록 수정했습니다.
ext1.48c - 수정되었습니다. 매크로 앞뒤에 다른 문자가 없어야 한다는 제한이 추가되었습니다.
ext1.60a - /변경사항요약 패치가 되었기 때문에 굳이 직전 수정의 summary 를 이어받을 필요가 없다고 생각되어, summary 를 달지 않고 페이지를 수정하는 것처럼 동작하도록 고쳤습니다.
ext1.66 - /Thread매크로와 관련해서 이쪽의 함수들이 좀 바뀌었습니다. /Thread매크로 페이지에서 확인하세요.
ext1.82a - /액션모듈화와 관련하여, DoComments 함수를 별도의 파일로 분리함
ext1.89 - /Comments와Thread매크로개선에 의해 바뀌었습니다. /Comments와Thread매크로개선에서 확인하세요.
Notes
음... 잠겨 있거나 기타 이유로 방문자가 에디트 할 수 없는 페이지에 코멘트 창이 있을 경우 문제가 되는군요. 지금 상태에서는 코멘트는 입력할 수 있는데 달기 버튼을 누르면 그때 에러가 납니다. 페이지를 수정할 수 없는 경우에 아예 코멘트도 못 달게 수정하는 것은 간단하긴 한데, 일부러 "페이지 수정은 못 하고 코멘트만 달 수 있게"하고 싶은 경우도 있을 것 같네요. 그렇다고 해서 페이지 수정 권한이 없을 경우에도 코멘트는 허용한다면.. 이번에는 반대로 코멘트까지 막고 싶은 경우에 대책이 없군요. 흐음... 코멘트를 다시 두 종류로 나누기도 그렇고...
sub BrowsePage 부분은 맨위에도 있고 맨 아래도 있네요. 다른건가요?
- 정말이네요. 한 쪽은 삭제했습니다. ^^; 감사
의견을 구함
구현 및 소스 다듬기는 다 되었는데... 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번이 낫겠지요. 내일(토요일) 오전쯤에 결정할 생각입니다. 시간이 얼마 남지 않았는데, 이걸 보시면 의견 좀 내어주세요.
크윽... pre 태그 또는 nowiki 태그를 앞뒤로 붙이는 것은 대괄호 링크마저 금지되니 포기. 스페이스를 라인 앞에 두는 것은 매 라인마다 pre 태그가 생기니 페이지 직접 수정시 너무 지저분해서 포기. 그냥 각 라인 끝에 "\\" 만 붙여서 넣어주기로 했습니다. 제일 무난한 것 같네요. 나중에라도 더 좋은 의견이 있으면 알려 주세요
from 게시판
질문이 있습니다. comments나 longcommrnts의 창 폭은 조절할 수 없나요? ^^ --
거북이 2004-4-26 11:11 pm
- 위 소스에 보면
if ($long) {
$comment_field = $q->textarea(-name=>"comment",
-class=>"comments",
-rows=>"10",
-cols=>"80",
-readonly=>"$readonly_true",
-style=>"$readonly_style",
-default=>"$readonly_msg");
} else {
$comment_field = $q->textfield(-name=>"comment",
-class=>"comments",
-size=>"60",
-readonly=>"$readonly_true",
-style=>"$readonly_style",
-default=>"$readonly_msg");
}
- 위와 같이 크기가 지정되어 있습니다. 저걸 고쳐 주시면 되고, 브라우저의 크기에 따라서 자동으로 폭이 바뀌는 방법을 묻는 거라면 모르겠습니다. 참, 고칠 때는 저 부분이 두 번 나오니까 (수정 가능한 경우와 불가능한 경우) 두 곳 다 바꿔 주어야 합니다.
안녕하세요.
0.92K3-ext1.61c 쓰고 있는데요. 코멘트 매크로 사용 방법을 잊어 버리고 숫자를 50자로 주면 권한이 없는 사람들은 쓸 수 없는지 모르고 있다가 한참 지난 후에 알았어요.
그래서 제 위키에 등록하지 않는 사용자들은 댓글을 못 달고 있었는데 스팸 댓글은 꾸준히 달리고 있었거든요.
아예 코멘트 매크로를 없애면 달리지 않았지만요. 스팸봇들은 어떻게 달았을까요?
- 안녕하세요 Canday님, 잘 지내시죠?
말씀하신 부분은... 글쎄요 저도 잘 모르겠습니다만 -_-; 1.61c 소스를 풀어서 보니까 그 당시의 소스에서는 숫자가 100미만일 경우 매크로 출력시에만 텍스트 입력이나 submit 버튼을 없앴고, 저장하는 DoComments 서브루틴 쪽에서는 따로 검사를 안 하고 있네요.
스팸봇은 브라우저로 값을 채워넣는게 아니라 자기가 필드값을 넣어서 바로 POST 전송을 해 버리는 것 같습니다.
좀 번거롭겠지만 ext2.* 버전이나, 데이타 변환이 번거로우면 하다못해 ext1의 마지막 버전인 1.111c 정도로 일단 업데이트해보시죠.
네. 항상 그렇듯이 그럭 저럭 잘 지내고 있어요.
그런데 큰 일 났습니다.
버전을 올려보려고 잘 모르는 명령어를 쓰다가 위키 디렉토리를 옮겼고 그러던 중 그 파일을 일부 지웠는데 지금 운영하는 위키 폴더가 옮겨 졌고 작업 전에 백업한다고 받아 놓기는 했는데 받다가 실패여서 그게 또 완전한게 아닌 것 같아요 -_-;;;; 시간 있을 때 도와 주실 수 있는지요
- 아이구 저런... >.<
gypark쥐메일로 호스트명,계정,비번과 함께 자세한 상황을 알려주시면 들어가서 확인해보겠습니다.
- 고맙습니다. 메일 보냈어요.
위키위키분류