/ToDoOrBugReport 에 적어두신 내용을 보고 소스를 찾아봤습니다. 그러니까 그 페이지 위에 한번이라도 ||를 이용한 테이블이 나오면 그 이후 ||, |<, |> 가 td닫고 새로 열기로 바뀌어 버리는데요. 원인은 $TableMode라는 변수가 1로 설정된 상태로 남아있기 때문입니다.
WikiLinesToHtml 함수에서 다음 부분을 찾아서 바꿔주면 됩니다.
if ($tag eq "TABLE") { $TableMode = 0; # 원래 내용은 필요없음 };
테이블이 생성될 때 매 라인의 끝이 ||으로 끝나게 변경했고, 그 ||가 tr 닫기로 치환되므로 원래 저 부분에 있던 tr 닫기는 필요없습니다. tag가 TABLE이니 굳이 table로 바꿀 필요도 없구요. 단지 $TableMode만 0으로 만들어주면 됩니다.
조프님의 패치를 /버그또는문제점해결에 반영했습니다. 완료.
sub DoEditPrefs { .... print '<br>', &GetFormCheck('linkstyle', $LinkFirstChar, T('Use WikiX link style for newpage')); # 추가한다. print '<br>', &GetFormCheck('linkrandom', 0, T('Add "Random Page" link to link bar')); print '<br>', $q->submit(-name=>'Save', -value=>T('Save')), "\n"; .... } sub DoUpdatePrefs { .... &UpdatePrefCheckbox("linkstyle"); #### 추가한다. &UpdatePrefCheckbox("linkrandom"); .... } sub GetPageOrEditAnchoredLink { .... #### 이것을 # if (($LinkFirstChar) && ($name =~ /(\[)?([^\/]*\/)?([a-zA-Z0-9\/]|[\x80-\xff][\x80-\xff])([^\]]*)(\])?/)) { #### 이것을 #### 이렇게 바꿔준다. if ((&GetParam('linkstyle', $LinkFirstChar)) && ($name =~ /(\[)?([^\/]*\/)?([a-zA-Z0-9\/]|[\x80-\xff][\x80-\xff])([^\]]*)(\])?/)) { #### 이렇게 바꿔준다. return $2 . &GetEditLink($id,"<b>$3</b>") . $4; } else { return $name . &GetEditLink($id,"?"); } .... }
별다른 문제는 없을겁니다. 원격위키링크를 wikix스타일로 표시할 수 있게 누가 손좀 봐줬으면 좋겠는데..흑. ㅠㅠ
이거 멋지군요. 반영했습니다.
적당한 위치에 다음 함수를 집어넣습니다. sub GetUserList { my (@userlist, $result); my $usernumber; opendir(USERLIST, $UserDir); @userlist = readdir(USERLIST); close(USERLIST); shift @userlist; shift @userlist; @userlist = sort @userlist; foreach $usernumber (0..(@userlist-1)) { @userlist[$usernumber] =~ s/(.*)\.db/($1)/gei; @userlist[$usernumber] = &StorePageOrEditLink("@userlist[$usernumber]", "@userlist[$usernumber]") . "<br>"; } $result = "@userlist"; return $result; } 그리고나서 아래의 함수에 한줄 추가합니다. sub MacroSubst { .... $txt =~ s/\&__LT__;userlist\&__GT__;/&GetUserList()/gei; ####추가한다. .... }
개인적으로 필요해서 추가했고, <userlist> 형식으로 사용하며, GenerateAllPagesList함수는 도저히 사용을 못하겠어서리, 그냥 보이는대로 만들었습니다.(허덥해서리..;; 최적화를 좀 부탁드리겠습니다.) 흐~ 사용자페이지가 없는데 그냥 링크를 넣고자 하면 &StorePageOrEditLink 대신에 &GetPageLink 를 넣음 될겁니다.
적용했습니다.
RemoteWiki를 위한 부산물입니다.(정작 RemoteWiki부분은 시작도 안했는데 -_-a) http://no-smok.net/ns/moin.cgi/?action=titleindex 와 페이지 의 내용을 같은 형식의 Plain Text로 출력합니다.
#### 함수전체 추가. sub DoTitleIndex { my (@list); my $index; print "Content-type: text/plain\n\n"; @list = &AllPagesList(); foreach $index (@list) { print $index."\r\n"; } } #### 여기까지. .... sub DoOtherRequest { .... } elsif ($action eq "index") { &DoIndex(); } elsif ($action eq "titleindex") { #### 추가한다. DoTitleIndex(); #### 추가한다. } elsif ($action eq "help") { # luke added &DoHelp(); .... }
HTML을 문법을 몰라서 GetHttpHeader 함수를 그냥 복사해서 붙여넣기 했는데, DoTitleIndex에서 "print &GetPlainTextHeader();"를 그냥 html문으로 출력하게끔 누가 수정 해줬으면 하는 작은 소망이 있습니다. :)
print "Content-type: text/plain\n\n";
적용했습니다.
아 별건 아니고요. 요즘 valid한 위키 페이지를 만드는 일을 해보고 있습니다.
에서 문서의 이름을 넣어주면 html이나 css가 문법적으로 에러가 없는지 확인할 수 있거든요.일단 BrowseExternUrl에서
} else { print &GetHttpHeader(); print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\">\n"; # 추가를 해줘야 하고요. (일반 위키 페이지의 경우는 DOCTYPE이 제대로 출력됩니다)
좀 애매한 부분이긴 한데, 원래 frameset에는 border라는 속성이 없습니다.
frame에 frameborder라는 속성이 있어서 이 속성을 0을 주면 되지요. [참고]
문제는 Opera가 이 속성을 제대로 지원하지 않는 것 같다는... 이건 지금 테스트 중입니다.
그럼.
지금 [조프위키] 대문을 보면 날짜와 그날 일정이 나옵니다.
오늘은 '''<date>''' 입니다.\\ <IncludeToday()>이런 식으로 해놨지요. IncludeToday의 내용은 오늘 날짜에 맞는 페이지를 Include 해주는 단순한 함수입니다.
제가 추가한 함수는 대강 다음과 같습니다.
sub MacroToday { my ($cal_name) = @_; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Now); if ($cal_name ne "") { $cal_name .= "/"; } my $cal_page = $cal_name . ($year + 1900) . "-"; if ($mon + 1 < 10) { $cal_page .= '0'; } $cal_page .= ($mon+1); if ($mday < 10) { $cal_page .= "-0$mday"; } else { $cal_page .= "-$mday"; } return &MacroInclude($cal_page); }
구찮아서 날짜 처리를 안했죠. -_-; 달력을 사용하는 김에 추가하면 대문이나 개인 페이지에 사용하기 괜찮지 않나 싶네요.
<IncludeToday(0,-1)> <IncludeToday(0,0)> <IncludeToday(0,1)>이런식으로요. '_'a
Bab2님도 그렇고 조프님도 그렇고... 이런 맛에 UseModWiki 를 떠날 수 없네요. 멋집니다. 잘 지내시죠? ^_^
조프님 홈에서 잠깐 테스트 해 보았는데, 인자로 페이지 이름이 들어갈 경우 페이지 이름이 위키네임이면 동작을 안 하는 것 같네요. 매크로 검사하기 전에 먼저 a href 링크로 바뀌어 버리니까 그러는 것 같습니다. 현재 작업 중입니다. 간만에 하려니까 문법도 가물가물하군요. ^^;
날짜 offset 을 인자로 받을 수 있도록 개선하여 반영했습니다. 완료.
#### 쿠키에 expire항목 추가. sub GetHttpHeader { ... if (defined($SetCookie{'id'})) { ################## 바꿔준다. $cookie = "$CookieName=" . "expire&" . $SetCookie{'expire'} . "&rev&" . $SetCookie{'rev'} . "&id&" . $SetCookie{'id'} . "&randkey&" . $SetCookie{'randkey'}; if ($SetCookie{'expire'} eq "1") { $cookie .= ";expires=Fri, 08-Sep-2010 19:48:23 GMT"; } else { $cookie .= ";"; } ################## 끝. if ($HttpCharset ne '') { ... } #### DoEnterLogin으로부터 받은 값을 해쉬에 추가. (약간 삐리리한.. -_-;) sub DoLogin { my $expire_mode; # 추가 .... $expire_mode = &UpdatePrefCheckbox("p_expire"); # 추가 ################# 밑에서부터 여기까지. if ($expire_mode eq "") { $SetCookie{'expire'} = 1; } else { $SetCookie{'expire'} = $expire_mode if ($expire_mode ne ""); } #### ↓이것들의 바로위에 ↑ 이것들 추가.(crypt함수 수정으로 인해 원문을 모름.) $SetCookie{'id'} = $uid; $SetCookie{'randkey'} = $UserData{'randkey'}; $SetCookie{'rev'} = 1; .... } #### 로긴창에 체크박스 폼 집어넣음. sub DoEnterLogin { .... print "<br>", &GetFormCheck('p_expire', 0, T('Keep login information')); ## 추가한다. print '<br>', $q->submit(-name=>'Login', -value=>T('Login')), "\n"; print "<hr>\n"; .... }겜방에서 컴터를 많이 쓴다는 누군가의 협박(?)으로 대충 만들어 봤는데, 어떨지 모르겠네요. 여전히 펄이나 웹이나 그런건 암것도 몰라서 ㅜㅡ; 좋은 하루 되세요.. ^^
반영했습니다. 완료.
.... sub GetRcHtml { if ($UseDiff && &GetParam("diffrclink", 1)) { $link .= &ScriptLinkDiff(4, $pagename, $tDiff, "") . " "; } #### 수정한다. if ($pagecount{$pagename} eq 1) { $link .= &GetPageLink($pagename)." <small>(<font color=red>" . &T('NEW') . "</font>)</small>"; } else { $link .= &GetPageLink($pagename); } #### 끝. $html .= "<tr><td style=\"border:0\"> </td><td style=\"border:0\"><li>$link $sum</td>" .... }굳이 필요할까라는 의문이 듭니다만..;;
적어주신 것이.. new 마크가 제목 뒤에 붙더군요. 다른 페이지들의 "~번 변경됨" 자리에 있는 게 더 나아보여서 조금 다르게 적용했습니다만... 정말 필요가 없어 보이는데요. :-) 어쨌거나 완료.
특정위키사이트의 인덱스목록을 받아와서 지정한 값과 일치하는 제목이 있으면 그 사이트의 해당페이지로 링크를 만들어줍니다.
* 페이지 목록을 받아오는 액션은 wiki.pl?action=remotepage 이며 현재 plain/text만 가능
NoSmok http://no-smok.net /ns/moin.cgi?action=titleindex
#config.pl 에 추가해야할 내용 $RemoteDir = "$DataDir/remotewiki"; # 원격위키의 타이틀인덱스가 저장될 장소. $UseRemoteWiki = 1; #1 원격 활성 2 비활성 $RemoteFile = "remotemap"; # 원격위키 타이틀인덱스 경로 #### 끝. # wiki.pl에 추가할 내용. #### 변수추가. use vars qw(@RcDays @HtmlPairs @HtmlSingle .... $RemoteFile $UseRemoteWiki $RemoteDir ### 추가 .... #### 해당페이지의 쌍둥이페이지가 있고, $UseRemoteWiki=1일때 페이지하단에 쌍둥이페이지 링크를 무조건 출력한다. KLE의 RemoteWiki 설명 참고. sub BrowsePage { .... #### 추가 if ($UseRemoteWiki eq 1) { $oldId = $id if($oldId eq ""); $fullHtml .= &WikiToHTML("<br><br><hr>\nSee Also: <metasearch($oldId)>"); ## REDIRECT매크로 사용시 리다이렉트된 페이지가 아닌 원래페이지의 목록을 보여줌. } #### 끝. $fullHtml .= &GetFooterText($id, $goodRevision); print $fullHtml; return if ($showDiff || ($revision ne '')); # Don't cache special version .... } .... #### <metasearch()> 매크로 sub MacroSubst { .... $txt =~ s/\&__LT__;metasearch\(([^\n]+)\)\&__GT__;/&MacroMetaSearch($1)/gei; #### 추가. .... } #### 전체추가 #### 원격사이트 페이지목록을 소켓으로 긁어온다. sub GetUrlSocket { use IO::Socket; my($url, $addr) = @_; my (@data, $result); my $sock; $sock = IO::Socket::INET->new(PeerAddr=>$url, Proto=>'tcp', PeerPort=>'80'); print $sock "GET ". $addr . "\n\n"; @data = <$sock>; $result = join ($FS,@data); $result =~ s/(\n|\r)//g; close($sock); return $result; } #### 긁어온 목록을 정리해서 화일로 저장한다. sub GetRemotePage{ my (@all, $data, $status, $count, $result); ($status, $data) = &ReadFile($RemoteFile); return "" if (!$status); @all = split(/\s+/, $data); &CreateDir($RemoteDir); for ($count=1;$count<1+(@all/3);$count++) { open (remotewiki, ">"."$RemoteDir"."/"."$all[3*$count-3]".".db"); @all[3*$count-2] =~ s/http\:\/\/(.*)/$1/g; ##### 0은 이름 1(3count-2)은 주소 2(3count-1)는 실행경로 ##### $result = &GetUrlSocket(@all[3*$count-2], @all[3*$count-1]); print remotewiki $FS.$result; close (remotewiki); } print &GetHeader('', T('Get RemotePages'), ""); print "<br>Getting RemoteWiki pages done.<br>"; print &ScriptLink("처음", T('<br>첫화면으로..<br>')); print "<hr>\n"; print $q->endform; print &GetMinimumFooter(); return ""; } #### 페이지 이름과 일치하는 원격사이트 목록을 출력한다. sub MacroMetaSearch { my ($name) = @_; my (@remotename, @all, $data, $status, $count, $remotedata); my $page; my $result = ""; $name = &RemoveLink($name); ($status, $data) = &ReadFile($RemoteFile); return "" if (!$status); @all = split(/\s+/, $data); for ($count=1;$count<1+(@all/3);$count++) { @all[3*$count-2] =~ s/http\:\/\/(.*)/$1/g; ##### 0은 이름 1(3count-2)은 주소 2(3count-1)는 실행경로 ##### open (getdb, ($RemoteDir."/".@all[3*$count-3].".db")); $remotedata = <getdb>; if ($remotedata =~ /$FS($name)$FS/i) { $result .= &StoreInterPage("@all[3*$count-3]\:$1")." "; } close (getdb); } return $result; } #### 끝. .... #### 원격사이트로부터 타이틀인덱스를 받는 action 추가 sub DoOtherRequest { .... } elsif ($action eq "titleindex") { DoTitleIndex(); #### 추가. } elsif ($action eq "remotepage") { &GetRemotePage(); #### 끝. } elsif ($action eq "help") { # luke added &DoHelp(); .... } .... sub GetPageOrEditAnchoredLink { my ($id, $anchor, $name) = @_; my (@temp, $exists); my $intername; #### 추가. .... if ($exists) { $id = "$id#$anchor" if $anchor; $name = "$name#$anchor" if $anchor && $NamedAnchors != 2; return &GetPageLinkText($id, $name); #### 추가한다. } elsif (($UseRemoteWiki) && (!$LinkFirstChar) && ($Section{'revision'} > 0)) { $intername = &MacroMetaSearch($id); $intername =~ s/\s+(.*)//g; return $intername." ".&GetPageLinkText($id,"?") if ($intername ne "Nothing."); } #### 끝. if ($FreeLinks) { .... }
어딜 찾아봐도 구체적으로 어떻게 구현했다는 말이 없으니...원..
그럭저럭 돌아갈겁니다. 노스모크의 "-_-" <- 이 링크가 안되는 문제가 있는데 이것은 StoreInterPage 함수의 문제이기 때문에 어쩔 수 없습니다.
(라기 보단 손대기 귀찮죠 -_-;;)
본문의 리모트 페이지는 우선순위가 제일 높은 한페이지만 표시하게 했습니다.
cron 대몬을 써서 자동으로 갱신시키고자 한다면. GetUrlSocket함수와 GetRemotePage를 별도의 화일로 만들어서 하루에 한 번 정도 갱신시켜주면 될 것입니다.
그 외에는 메뉴에 링크를 걸어서 직접 고쳐주는 수밖에 없죠. --;
WikiX스타일 링크는 적용이 안되는데 그건 wikix스타일을 쓰는 다른분이 해결좀 해주셨음 좋겠군요..
다른 문제는 모두 해결했습니다. (꽁수로 --;)
진짜로 끝냈다 만세~
각 페이지의 이름배열을 foreach문으로 변수하나하나에 나누어 검사하는 것을 화일(사이트) 한개마다 양쪽에 둘러쳐진 $FS변수 단위로 짤라서 한번에 검사하도록 수정했습니다. 이제 적용해도 괜찮을겁니다. WikiX는 스타일은 도저히 수가 안나서 포기했습니다. ^^;;
#!/usr/bin/perl $string1 = "abc"; $string2 = "abcd"; if ($string1 eq $string2) { print "yes!\n"; } else { print "no!\n"; }
UseModWiki소스수정/RemoteWiki 에 이동했습니다. 완료.
사는 데 지장없는 문제로 판단함. 완료. :-)