아이디어는 UseModWiki소스수정/Threads에서 시작되었고, 실제 디자인과 구현은 좀 다르다. 사용자 의견에 자세히 썼으니 참조할 것.
원글-+ +- 답글3 <= 답글1, 답글2, 답글3의 순서대로 작성되었을 때 답글3이 제일 위에 옴 +- 답글2 -+ | +- 답글2의 답글2 | +- 답글2의 답글1 +- 답글1
sub MacroComments { my ($itself,$id,$up,$long,$threadindent) = @_; # 이 줄 수정 my $idvalue; my $temp; my $txt; # 이하 세 줄 추가 my $abs_up = abs($up); my ($threshold1, $threshold2) = (100000000, 1000000000); ... if ($long) { $hidden_long = &GetHiddenValue("long","1") . "<br>"; } if (((!&UserCanEdit($id,1)) && (($abs_up < 100) || ($abs_up > $threshold2))) || (&UserIsBanned())) { # 이 줄 수정 ... $txt = # return 이었던 줄을 이렇게 바꾸고, $q->startform(-name=>"comments",-method=>"POST",-action=>"$ScriptName") . &GetHiddenValue("action","comments") . &GetHiddenValue("id","$id") . &GetHiddenValue("pageid","$pageid") . &GetHiddenValue("up","$up") . (($threadindent ne '')?&GetHiddenValue("threadindent",$threadindent):"") . # 이 줄 추가 T('Name') . ": " . $name_field . " " . T('Comment') . ": " . $hidden_long . $comment_field . " " . $submit_button . $q->endform; # 이하의 내용 추가 if ($threadindent ne '') { if ($threadindent >= 1) { # "새글쓰기" 부분도 감추고 싶다면 1 대신 0으로 할 것 my $memotitle = ($threadindent == 0)?T('Write New Thread'):T('Write Comment'); $txt = &MacroMemo("", $memotitle, $txt, "threadmemo"); } else { $txt = T('Write New Thread') . $txt; } } return $txt; }
sub DoComments { ... my $string; my $long = &GetParam("long", ""); # 아래 세 줄 추가 my $threadindent = &GetParam("threadindent", ""); my $abs_up = abs($up); my ($threshold1, $threshold2) = (100000000, 1000000000); if ($newcomments =~ /^\s*$/) { ... # if ($long) { # 이 줄을 주석처리하고 if ($threadindent ne '') { # 이하 단락을 추가 $newcomments =~ s/^\s*//g; $newcomments =~ s/\s*$//g; $newcomments =~ s/(\n)\s*(\r?\n)/$1$2/g; $newcomments =~ s/(\r?\n)/ \\\\$1/g; my ($comment_head, $comment_tail) = ("", ""); my $newup; if (($abs_up >= 100) && ($abs_up <= $threshold2)) { # 커멘트 권한 상속 $newup = $Now - $threshold2; } else { $newup = $Now; } $comment_tail = "<thread($id,$newup," . ($threadindent+1) . ")>"; if ($threadindent >= 1) { for (1 .. $threadindent) { $comment_head .= ":"; } $comment_head .= " "; } else { # 새글 $comment_head = "<thread>\n"; # 새 글 앞뒤에 <thread>, </thread>라는 표식이 생기는 게 싫으면 이 두 줄을 주석처리 $comment_tail .= "\n</thread>"; } if (($up > 0) && ($up < $threshold1)) { # 위로 달리는 새글 $string =~ s/(\<thread\($id,$up(,\d+)?\)\>)/$comment_head$newcomments <mysign($name,$timestamp)>\n$comment_tail\n\n$1/; } else { # 리플 or 아래로 달리는 새글 $string =~ s/(\<thread\($id,$up(,\d+)?\)\>)/$1\n\n$comment_head$newcomments <mysign($name,$timestamp)>\n$comment_tail/; } } elsif ($long) { # 여기까지가 추가되는 부분 $newcomments =~ s/^\s*//g; $newcomments =~ s/\s*$//g; ... # 아래 DoPostMain 앞에 이 세 줄 추가 if (((!&UserCanEdit($id,1)) && (($abs_up < 100) || ($abs_up > $threshold2))) || (&UserIsBanned())) { # 에디트 불가 $pageid = ""; } DoPostMain($string, $id, "*", $Section{'ts'}, 0, 0, $pageid); return; }
$MacroFunc{"thread"} = \&thread; sub thread { my ($txt) = @_; $txt =~ s/(&__LT__;thread\(([^,]+),([-+]?\d+),(\d+)\)&__GT__;)/&MacroThread($1,$2,$3,1,$4)/gei; $txt =~ s/(&__LT__;thread\(([^,]+),([-+]?\d+)\)&__GT__;)/&MacroThread($1,$2,$3,1,0)/gei; $txt =~ s/(&__LT__;thread&__GT__;((.)*?)&__LT__;\/thread&__GT__;)/&MacroThreadBlock($2)/geis; return $txt; } sub MacroThread { my ($itself, $id, $up, $long, $threadindent) = @_; my $txt; if ($threadindent > 0) { my $marginleft = 0; $marginleft = 3.3*($threadindent-1) if ($threadindent > 0); $txt = "<DIV class='threadreply' style='margin-left: $marginleft"."em'>"; } else { $txt = "<DIV class='threadnew'>"; } $txt .= &MacroComments($itself, $id, $up, $long, $threadindent)."</DIV>"; return $txt; } sub MacroThreadBlock { my ($blocktext) = @_; my $txt; $txt = "<DIV class='threaditem'>" . $blocktext . "</DIV>"; return $txt; } 1;
Write New Thread 새 글 쓰기 Write Comment 위 글에 의견달기
/* thread */ /* 새 글 쓰기 박스 */ DIV.threadnew { background-color:#F8F8F8; border: 1px solid gray; padding: 5px 5px 5px 5px; } /* 답글 달기 박스 */ DIV.threadreply { border-bottom: 1px dashed gray; padding: 1px 1px 1px 1px; } /* 답글 달기를 클릭했을 때 열리는 내부 박스 */ DIV.threadmemo { border:1px solid silver; padding-left:5px; } /* 하나의 쓰레드 블럭 (새 글 하나와 그에 딸린 답글들) */ DIV.threaditem { border-left: 2px solid #888888; padding: 5px; } /* "위 의견에 답글 달기" 링크 */ A.threadmemo:link, A.threadmemo:active, A.threadmemo:visited, A.threadmemo:hover { background: transparent; color: gray; text-decoration: none; } A.threadmemo:hover { text-decoration: underline; }
ext1.92 - 리플을 시간순으로 삽입, 나중에 달린 리플이 더 아래에 달리게 하였습니다. 또한, 리플을 달고 화면이 갱신되었을 때 자신이 단 리플을 바로 볼 수 있도록 URL에 앵커를 붙이게 하였습니다. 따로 수정내역을 위에 적지는 않으니 아래 두 파일을 보도록 하세요
가로선 넣어달라고 한건 접니다만, 조프처럼 새로선으로 하는 것이 더 보기 좋은 듯합니다.
또한, 답글의 경우는 가로선등으로 구분하지 말고 새 글에 대해서만 구분하는 것이 보기 좋을 듯 하네요.
세로선까지 넣어봤습니다. /ThreadTest에서 해 보시고 의견 주세요.
대만족하며 사용했습니다만, 불여우로 깔끔하게 나와서 별 문제없는 줄 알았는데 IE로 보니 선과 겹치고, 입력창도 좀 이상하게 나오더군요. 흑흑 div값을 조정해야 하는 듯 한데 어디를 건드려야 하는지 전혀 종잡을 수가..
thread 매크로의 단점인, "한 글의 리플들은 리플이 달린 역순으로 배치된다"를 극복할 방법을 찾았습니다. 매크로의 인터페이스를 바꿀 필요 없이 패치만 해 주면 이후 달리는 글들은 시간 순으로 배치가 될 텐데, 단점이라면 "내가 글을 입력한 자리(즉 원 글의 바로 아래)와 실제 답글이 달리는 자리가 달라지게 된다"겠군요. 아무리 그래도... 바꾸는 게 낫겠죠?
TestPage/Thread에서 테스트할 수 있습니다.
태그를 쓸수있는 옵션을 추가하는 건 어떨까요? 게시판처럼 html체크하면 태그도 사용가능하고, 체크 안하면 지금이랑 똑같은 방식으로..
http://me2day.net/yongyeol 얘네처럼 한 스레드에 앵커링크를 걸수있게하는 건 어떨까요?
참고로 주절주절에서는 진작부터 지원하고 있긴 합니다만, (HTML로 변환된 소스 보면 ti숫자~가 보입니다)
1. 있다는걸 알려주는 방법을 안 만들어놨다.
2. 한달 지나면 페이지가 바뀌니 딱히 활성화 시키고 싶지 않다.
는 두가지 문제가 있습니다.
thread를 지우는 기능은 어떨까요? 여러 스레드중 지우고 싶은 것이 생겨도 내용이 많아질 경우 페이지 편집으로 찾아서 지우는 것이 꽤 번거로울 때가 있더군요.
최근에 보니까 스레드매크로가 하위로 내려가는 것이 잘 안되는 것 같아요.
:이런식으로 한 단계 아래까지는 잘 적용되는데,
:: 2단계부터 들여쓰는 부분이 적용이 안 되는 것같아요.
NLL대화록논란,
뉴라이트교과서문제 보면 의견달기 부분은 들여쓰기가 적용되어 잇는데, 막상 들여쓰는 본문이 적용이 안되는 것같습니다. 전에는 잘 되었던 것같은데..