UseModWiki소스수정/Comments매크로 페이지의 소스 보기
마지막으로 [b]
-- Loading page list... --
내용출력
로그인[l]
Diary
[f]
최근변경내역
[r]
페이지목록[i]
횡설수설[2]
게시판[3]
링크
수정할 수 없습니다: UseModWiki소스수정/Comments매크로 는 읽기 전용 페이지입니다.
== Comments , Long Comments 매크로 == * 페이지 수정 절차를 거치지 않고 간단한 답글을 쉽게 추가할 수 있는 폼을 생성하는 매크로 * [[조프]]님이 Jof:UseModWiki소스수정/Comments 에 만들어 두신 것을 가져와서 수정하여 적용 * 필수 요구 사항: ** [[/전처리매크로]] 패치가 되어 있을 것 (안 되었을 경우도 소스를 별도로 수정해 주면 된다) ** [[/MySign매크로]] 패치가 되어 있을 것 * 선택 요구 사항: 없음 * 사용법 :
,
** 매크로의 앞뒤에는 공백을 비롯한 다른 문자가 오면 안 된다. ** comments 는 한 줄 크기의 텍스트 필드, longcomments 는 여러 줄 크기의 텍스트 영역으로 나타난다. ** 처음 작성시 자동으로 <comments(또는longcomments)(페이지이름,숫자)> 로 확장되니, 신경쓰지 말 것 ***
** 한 페이지 내에 코멘트 입력창을 여러 개 넣을 경우, 숫자를 서로 다르게 하여 구분해 주면 된다. ** 숫자가 양수냐 음수냐에 따라 동작이 달라진다 *** 숫자가 양수일 경우는 댓글이 입력창 위쪽에, 최근글이 아래 오는 순서로 달린다. *** 숫자가 음수일 경우는 댓글이 입력창 아래쪽에, 최근글이 위에 오는 순서로 달린다. ** 숫자의 범위에 따라 페이지 수정 권한의 적용이 달라진다. *** 숫자의 절대값이 100 보다 작을 경우는, 페이지 수정 권한이 없는 경우는 코멘트창에 아예 입력을 할 수 없다. *** 100 이상일 경우는, 수정 권한에 관계 없이 코멘트를 달 수 있다. (심지어 관리자가 잠근 페이지의 경우도 코멘트를 달 수 있다) 따라서 페이지 수정은 금지하고 코멘트 입력창을 이용하여 댓글만 달 수 있게 할 경우는 이 숫자를 100 이상으로 주면 된다. ** 코멘트 안에서 입력한 부등호는 lt; 와 gt; 로 바뀐다. 따라서 html 태그나 위키매크로를 사용할 수 없다. ** 대괄호를 사용한 페이지 링크, URL 링크 등은 사용가능하다. ** comments 의 경우 앞에 "* " 가 붙어서 unordered list 형태로 코멘트가 쌓인다. ** longcomments 의 경우, 입력한 각 라인의 끝에 " \\" 가 자동으로 붙은 상태로 페이지에 삽입된다. === wiki.pl 수정 === $pageid 전역변수 추가 {{{#!vim perl ### 패치를 위해 추가된 내부 전역 변수 use vars qw(%RevisionTs $FS_lt $FS_gt $StartTime $Sec_Revision $Sec_Ts $ViewCount $AnchoredFreeLinkPattern %UserInterest %HiddenPage $pageid); ### }}} {{{#!vim perl sub BrowsePage { my ($id) = @_; my ($fullHtml, $oldId, $allDiff, $showDiff, $openKept); my ($revision, $goodRevision, $diffRevision, $newText); ### comments from Jof $pageid = $id; ### ... }}} {{{#!vim perl 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; } }}} 함수 통채로 추가 {{{#!vim perl 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") . "
"; } 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 . " " . T('Comment') . ": " . $hidden_long . $comment_field . " " . $submit_button . $q->endform; } }}} {{{#!vim perl 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; } }}} {{{#!vim perl sub DoOtherRequest { ... &DoPageHide(); ### comment from Jof } elsif (($action eq "comments") || ($action eq "longcomments")) { &DoComments($id) if &ValidIdOrDie($id); ### ############### } else { # Later improve error reporting ... }}} DoPost 함수를 새로 작성 {{{#!vim perl 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 으로 변경하고 아래와 같이 수정 {{{#!vim perl # 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 ... ###
등 글작성 직후 수행할 매크로 ### 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 로 옮겨짐. {{{#!vim perl 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/(\
)/\n$newcomments
\n$1/; } else { $string =~ s/(\
)/$1\n$newcomments
\n/; } } else { $newcomments =~ s/(----+)/
$1<\/nowiki>/g; if ($up > 0) { $string =~ s/\
/*''' $name ''' : $newcomments -
$timestamp<\/small>\n\
/; } else { $string =~ s/\
/\
\n*''' $name ''' : $newcomments -
$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의 창 폭은 조절할 수 없나요? ^^
: 위 소스에 보면 {{{#!vim perl 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"); } }}} : 위와 같이 크기가 지정되어 있습니다. 저걸 고쳐 주시면 되고, 브라우저의 크기에 따라서 자동으로 폭이 바뀌는 방법을 묻는 거라면 모르겠습니다. 참, 고칠 때는 저 부분이 두 번 나오니까 (수정 가능한 경우와 불가능한 경우) 두 곳 다 바꿔 주어야 합니다.
---- 안녕하세요. 0.92K3-ext1.61c 쓰고 있는데요. 코멘트 매크로 사용 방법을 잊어 버리고 숫자를 50자로 주면 권한이 없는 사람들은 쓸 수 없는지 모르고 있다가 한참 지난 후에 알았어요.\\ 그래서 제 위키에 등록하지 않는 사용자들은 댓글을 못 달고 있었는데 스팸 댓글은 꾸준히 달리고 있었거든요.\\ 아예 코멘트 매크로를 없애면 달리지 않았지만요. 스팸봇들은 어떻게 달았을까요?
: 안녕하세요 Canday님, 잘 지내시죠? \\ \\ 말씀하신 부분은... 글쎄요 저도 잘 모르겠습니다만 -_-; 1.61c 소스를 풀어서 보니까 그 당시의 소스에서는 숫자가 100미만일 경우 매크로 출력시에만 텍스트 입력이나 submit 버튼을 없앴고, 저장하는 DoComments 서브루틴 쪽에서는 따로 검사를 안 하고 있네요. \\ \\ 스팸봇은 브라우저로 값을 채워넣는게 아니라 자기가 필드값을 넣어서 바로 POST 전송을 해 버리는 것 같습니다. \\ \\ 좀 번거롭겠지만 ext2.* 버전이나, 데이타 변환이 번거로우면 하다못해 ext1의 마지막 버전인 1.111c 정도로 일단 업데이트해보시죠.
네. 항상 그렇듯이 그럭 저럭 잘 지내고 있어요. \\ 그런데 큰 일 났습니다. \\ 버전을 올려보려고 잘 모르는 명령어를 쓰다가 위키 디렉토리를 옮겼고 그러던 중 그 파일을 일부 지웠는데 지금 운영하는 위키 폴더가 옮겨 졌고 작업 전에 백업한다고 받아 놓기는 했는데 받다가 실패여서 그게 또 완전한게 아닌 것 같아요 -_-;;;; 시간 있을 때 도와 주실 수 있는지요
: 아이구 저런... >.< \\ \\ gypark쥐메일로 호스트명,계정,비번과 함께 자세한 상황을 알려주시면 들어가서 확인해보겠습니다.
:고맙습니다. 메일 보냈어요.
---- [[위키위키분류]]
UseModWiki소스수정/Comments매크로
페이지로 돌아가기 |
다른 수정본 보기