351

(7 답글들, 스킨 및 플러그인에 작성)

서툰걸음 작성:

저도 필요했는데..
테스소스를 뒤지다가
$_SERVER['DOCUMENT_ROOT'].$pluginURL
이렇게 쓴다는.. ^^

$_SERVER['DOCUMENT_ROOT'] 는 서버설정에 따라 정확한 root를 가리키지 않을 수도 있습니다. smile

mx는 안한다고 했던걸로 들은거 같네요.

353

(1 답글들, 티스토리(TiStory.com)에 작성)

헛.. 어느새 cool

"트랙백을 통한 주제 묶기 '이슈'"라는게 보이는군요.
시간날때 태터툴즈에 포함시켜볼려고 생각중이던 것이었는데.. 역시 세상은 넓고 같은 생각하는 사람도 많군요. smile

시간대를 자동으로 맞춰주는 기능이 필요하지 않나라는 생각이 드네요.
setup시(또는 checkup시)에 설치하는 분의 컴퓨터 시간내지는 블로그가 올라가있는 서버의 시간을 GMT와 비교해서 자동으로 세팅되게 하는 것은 어떨까요?

356

(3 답글들, 아이디어 및 기능 제안에 작성)

저도 찬성입니다. 지금하고 있는 작업들이 bug fix level이라고 하기에는 무리일거 같네요. smile

우와 10일이나..;; 수고하셨습니다!

Juno 작성:

한개의 치환자를 사용하게 되면..
내가 만든 플러그인이 [##_SKIN_head_end_##]를 사용하고..
다른분의 플러그인이 똑같이 [##_SKIN_head_end_##]를 사용하게 되면..
2개의 플러그인에 있는 모든 것이 출력이 되는건지요?
아닌걸로 알고 있는데..
문제가 발생할 소지가 많습니다.

네 2개의 플러그인에 있는 모든 것이 출력이 됩니다.
다만 handler(call되는 함수)의 이름은 unique해야겠지요. smile

좀 더 자세하게 설명을 드리자면 아래와 같이 작성하시면 됩니다.
($target을 받아서 꼭 return 해줘야합니다.)

plugin1

index.xml

...
<tag name="SKIN_head_end" handler="head_end1" />
...

index.php

function head_end1($target) {
    return "<script>1</script>".CRLF.$target;
}

plugin2

index.xml

...
<tag name="SKIN_head_end" handler="head_end2" />
...

index.php

function head_end2($target) {
    return "<script>2</script>".CRLF.$target;
}

event로는 불가능하다고 판단되어 치환자를 자동으로 삽입하는 방식으로 구현해놨습니다.

lib/skin.php

아래 함수 추가

function replaceSkinTag($contents, $tag) {
    $pattern[] = '/(<'.$tag.'.*>)'.CRLF.'/Ui';
    $pattern[] = '/<\/'.$tag.'>/Ui';

    $replacement[] = '$1'.CRLF.'[##_SKIN_'.$tag.'_start_##]';
    $replacement[] = '[##_SKIN_'.$tag.'_end_##]$0';

    return preg_replace($pattern, $replacement, $contents);
}


skin class의 skin 함수에 handleTags($sval); 바로 위에 아래 내용 추가

$sval = replaceSkinTag($sval, 'html');
$sval = replaceSkinTag($sval, 'head');
$sval = replaceSkinTag($sval, 'body');

자동으로 생성되는 치환자 목록

SKIN_html_start
SKIN_head_start
SKIN_head_end
SKIN_body_start
SKIN_body_end
SKIN_html_end

SKIN_*_start 는 해당 태그 다음 줄의 맨 앞에, SKIN_*_end 는 해당 태그의 바로 앞에 추가가 됩니다.

예제 :
...
<html xmlns="http://www.w3.org/1999/xhtml">
[##_SKIN_html_start_##]<head>
[##_SKIN_head_start_##]<meta http-equiv=Content-Type content="text/html; charset=utf-8" />
...
[##_SKIN_head_end_##]</head>
<body>
[##_SKIN_body_start_##]<a name="top"></a>
...
[##_SKIN_body_end_##]</body>
[##_SKIN_html_end_##]</html>

플러그인에서 사용하실 때는 <tag name="SKIN_head_end" handler="head_end" /> 와 같이 사용하시면 됩니다.


ps1. 일단 커밋해두겠으나 더 좋은 의견있으시면 태클걸어주세요. smile

ps2. container, header, content, sidebar 등의 id에도 만들어줄려고 했으나 table 형식의 스킨에서는 id가 없어서 일단 보류입니다. sad

login이 되어있는데 다시 /login 을 요청할 경우 login 페이지가 다시 뜨는 문제(이 페이지에서 login을 해도 다음 페이지로 넘어가지 않음)

blog/login/index.php 의 4라인에 아래 코드 추가

if (doesHaveMembership()) {
    header("Location: $blogURL");
    exit;
}


그리고 기존 29라인에 있던 불필요한 아래 코드 삭제

$blog = getBlogSetting($_SESSION['userid']);

마찬가지로 logout이 되어있는데 다시 /logout 을 요청할 경우 root로 이동되어버리는 문제

blog/logout/index.php

header('Location: /');

위를 아래로 수정

header("Location: $blogURL");

361

(16 답글들, 잡담하기에 작성)

메인페이지의 이미지가 랜덤이었네요.(몰랐;; )
근데 싸이월드 관련해서 만들어둔 이미지는 빼는게 좋지 않을까요?
조금 보기 그렇네요. sad

저도 그런거 같더군요. sad
있다가 집에가서 좀 봐야되겠네요.

보통 다른 사이트에서 앵커태그에 target="_blank"를 사용하는 것과 동일한 의미입니다.
다만 xhtml1.0에서 target 속성이 없어져서 그 것을 대체하기 위해 저렇게 사용합니다. smile

이 문제인지는 모르겠지만.. 방금 전에 tattertools MySQL Too Many Connection이 걸려서 그랬던 것일 수도 있다는 생각이 드네요.
지금도 안되시나요?

이 방법은.. 문제는 없을거 같기는 한데.. 너무 땜빵용이라는 느낌이 강하게 드네요.;;

악성코드 제거프로그램처럼 패턴을 등록하는 건가요? 괜찮은 생각인거 같네요. smile
근데 일일이 다운을 받게하는 것보다는 open api로 제공하는 쪽이 좋지 않을까요?(서버부하는..;; )
주기적으로 업데이트하는 것도 일이될거 같아서요.

그리고 내용 패턴을 등록하는 부분은 정규식으로 바꾸는 쪽이 좋을거 같다는 생각이 드네요.
등록해놓으신 단어들 중 일부는 무조건 스팸이라고 보기에는 무리인것들도 좀 있는거 같아서요.
뭐 정규식이라고 만능인건 아니겠지만..;;

링크사이트 나오는 부분을 말씀하시는 것인가요?
링크가 <a href="[##_link_url_##]" onclick="window.open(this.href); return false">[##_link_site_##].</a> 이런 식으로 걸리기때문에 그냥 클릭하셔도 새창내지는 새탭으로 열리게 되어있습니다.(전 그냥 클릭해도 새탭으로 열립니다.)
1.0.4 이전은 모르겠지만 1.0.4에서도 저렇게 되어있던걸로 기억합니다만..;

이게 싫으시다면 스킨에서 위의 onclick 이벤트를 지워주시면 될거 같습니다. smile

참고로 제 FF는 도구-설정-탭의 설정은 "최근 창의 새 탭", "링크를 항상 새 창에서 열기(새 탭)", "새 탭으로 링크 열기" 이렇게 설정되어 있네요.

368

(1 답글들, 버그 보고 및 QA (Quality Assurance)에 작성)

1.0.5 release로 grep해봤는데.. 사용하는 곳은 물론 정의되어 있는 곳 조차 없군요. OTL;;
아무래도 더 이상 사용하지 않는 것 같습니다.;

369

(9 답글들, 아이디어 및 기능 제안에 작성)

TnC에서 만들 블로그 서비스는 제가 알기로는 초보분들이나 직접 자신의 계정에 설치를해서 사용하기 힘든 상황이신 분들에게 태터툴즈가 더 쉽게 다가설 수 있기 위해 하는 것이라고 알고 있습니다.
하지만 김종찬님께서 생각하시는 것은 전문적인 성격이 강하기 때문에 TnC에서 생각하는 블로그 서비스와는 너무 목표가 다르다고 생각이 드는군요.
게다가 김종찬님께서 생각하고 계신 서비스는 반드시 TnC에서 해야될 이유는 없습니다.
오히려 다른 누군가가 주도해서 그런 곳이 생긴다면 좋을것 같네요.
김종찬님께서 해보시는 것은 어떨런지요? smile

그리고 제가 생각하는 이슈의 흐름의 이상적인 형태는 양방향인거 같네요.
누가 만들어낸 이슈인가하는 것이 중요한게 아니라 어떤 이슈에 대해서 정확하고 진실한 정보전달이 되는 것이 중요한게 아닐까요?
상황에따라 정확한 정보전달이 가능한 것은 기성 언론이 될 수도 있고 블로거들이 될 수도 있는 것이니까요. smile

ps. '더러운 것'이라는 부분에 대해서 laziel님께서 김종찬님의 글을 오해하신거 같다는 느낌이 드네요.

* ViewCommenter : 코멘트가 보일때 발생
    $target : 1. htmlspecialchars($commentSubItem['name'])
        2. '<a href="'.htmlspecialchars(addProtocolSense($commentSubItem['homepage'])).'" onclick="return openLinkInNewWindow(this)">'.htmlspecialchars($commentSubItem['name']).'</a>'
        - 코멘트 작성자의 이름
        - $commentSubItem['homepage']가 있는 경우에 2.를 적용해서 링크포함
    $mother : $commentSubItem
        - 코멘트에 대한 정보, array index : owner, replier, id, entry, parent, name, password, homepage, secret, comment, ip, written

* ViewGuestCommenter : 방명록에서 코멘트가 보일때 발생
    ViewCommenter 이벤트와 동일

* ViewCommentContent : 코멘트의 내용이 보일때 발생
    $target : nl2br(addLinkSense(htmlspecialchars($commentSubItem['comment']),' onclick="return openLinkInNewWindow(this)"'))
        - 코멘트 내용, addLinkSense는 http://로 시작하는 문장(?)에 자동으로 링크를 넣어줌
    $mother : $commentSubItem
        - 코멘트에 대한 정보, array index : owner, replier, id, entry, parent, name, password, homepage, secret, comment, ip, written

* ViewGuestCommentContent : 방명록에서 코멘트의 내용이 보일때 발생
    ViewCommentContent 이벤트와 동일

* ViewNoticeContent : 공지 내용을 볼때 발생
    $target : $view
        - 글 내용
    $mother : $id
        - 글 id

* ViewPostContent : 글 내용을 볼때 발생
    ViewNoticeContent 이벤트와 동일

* AddPost : 새로 글을 작성시 발생
    $target : $id
        - $id=mysql_insert_id();
    $mother : $entry
        - array index : visibility, category, title, content, location, tag, acceptComment, acceptTrackback, published

* AddComment : 코멘트가 입력될때 발생
    $target : $id
        - $id=mysql_insert_id();
    $mother : $comment
        - array index : entry, parent, name, password, homepage, secret, comment, ip

* AddGuestComment : 방명록에서 코멘트가 입력될때 발생
    AddComment 이벤트와 동일

* AddFeedURLToolbox : 리더에서 id가 feedAdder인 테이블 출력 후 발생
    $target : 공백
    $mother : null

* AddNoticeEditorToolbox : 공지관리에서 공지 작성/수정시 위지윅/textarea 출력 후 발생
    $target : 공백
    $mother : null

* AddPostEditorToolbox : 글관리에서 글 작성/수정시 위지윅/textarea 출력 후 발생
    $target : 공백
    $mother : null

* GetRemoteFeed : 원격지의 Feed를 받아올때 발생
    $target : null
    $mother : $url
        - $url=$feedRow['xmlURL'];
        - $feedRow 는 Feeds 테이블

* ViewLink : 사이드바에서 링크목록 출력시 발생
    $target : htmlspecialchars(UTF8::lessenAsEm($link['name'],$skinSetting['linkLength']))
        - 링크의 이름
        - $link 는 Links 테이블
        - $skinSetting 은 SkinSettings 테이블
    $mother : null

* ViewAttachedImage : 업로드한 이미지를 보여줄때 발생
    $target : 1. "<img src=\"$url\" $property/>"
        2. "<img src=\"$url\" $property style=\"cursor: pointer\" onclick=\"open_img('$url')\"/>"
        - 이미지의 크기가 변경된 경우 2, 아닌 경우 1
    $mother : $path
        - $path="$folderPath/$filename";

* ViewAttachedImageMobile : 잘 모르겠음;; (blog/m/item.php)
    $target : "<img src=\"$blogURL/imageResizer/?f=".urlencode($filename)."\" alt=\"\"/>"
    $mother : $path

* $suri['directive'].'/'.$suri['value'] : http://.../plugin/test 요청시 /plugin/test 이벤트 발생 (blog/plugin/index.php)
    $target : null
    $mother : null
    - 설명하기 애매해서 코드 첨부

define('ROOT','../..');
$url=isset($_SERVER['REDIRECT_URL'])?$_SERVER['REDIRECT_URL']:$_SERVER['SCRIPT_NAME'];
$depth=substr_count(ROOT,'/');
if($depth>0){
    if(ereg("^((/+[^/]+){{$depth}})/*(.*)$",$url,$matches)){
        $suri['directive']=$matches[1];
        if($matches[3]!==false)
            $suri['value']=$matches[3];
    }else
        respondNotFoundPage();
}else{
    $suri['directive']='/';
    $suri['value']=ltrim($url,'/');
}

1.0.5 추가(아직 보지 못함; )
* UpdatingVisitorStatistics : 방문자 통계 정보 갱신 여부
* ViewRefererURL : 리퍼러 로그 URL를 출력할 때
* ViewRSS : RSS 피드를 출력할 때
* SaveFeedItem : 리더에서 읽어온 피드를 저장할 때
* AddingComment : 댓글 추가 여부
* ModifyingComment : 댓글 수정 여부
* AddingTrackback : 트랙백 수신 여부
* AddingRefererLog : 리퍼러 로그 추가 여부


어떤 파일에서 각 이벤트가 발생하는지는 아래 글을 참고해주세요.
http://www.tattertools.com/ko/forum/vie … php?id=152

ps. path에 따라 발생하는 이벤트는 잘 이용하면 재밌는게 만들어질 수도 있을거 같네요. smile

대마왕 작성:

peris / 오~ 이렇게 하니까 되는군요. 고맙습니다.
근데 동영상 사이즈가 FF에서는 대충 눈대중으로 봤을때
200*150 정도의 사이즈로 재생이 되는데요.
동영상 마다 가로 세로 사이즈를 정해 주어야하니까 무지 불편한데
이것도 해결책이 없을까요?

아쉽지만 js로 동영상의 크기를 알아낼 방법은 없을거 같네요. roll

주민등록번호를 받아봤자 신용기관 인증을 하지 않는 이상 아무런 의미가 없죠.(주민등록번호 생성기야 수두룩하니..)
역시 돈이 문제;;

373

(7 답글들, 잡담하기에 작성)

laziel 작성:

개인적으로 제로보드5 가 별로 반갑지는 않습니다.
혹자는 왕의귀환이니 어쩌니 하면서 호들갑을 떨던데...까놓고 말하면 적당히좀 해먹지-_- 싶은;

생각하기 나름이겠지만 저같은 경우에는 제로보드5를 환영합니다.(저야 안쓰겠지만..)
어찌됐건간에 국내 apm환경의 서버에서 제로보드가 차지하는 비중은 적어도 반 이상은 되고, 국내 웹프로그래머의 반 이상은 제로보드를 통해서 배우기 시작했을거라고 생각합니다.
제로보드5에서 다국어지원, 표준 준수 등을 하신다고 하셨으니, 국내 대부분의 apm환경의 서버는 apm의 버전을 올리게 될거라 예상되며, 국내 웹프로그래머들도 표준 준수에 대해 공부하는 계기가 되어 표준을 준수하는 페이지가 많아질거라 예상합니다.
이 정도면 환영할만하지 않을까요? smile

아예 따로 작성을 하는거였군요.;;
그렇다면 blog/index.php 가 약간 다르게 작성이 되어야겠네요. smile
(개인적으로는 두번 작업하는거 같아 선호하지는 않을거 같지만요.)

crizin님께서 말씀하신 로딩 관련 내용은 FF에서는 안되는군요. sad
(다르게 만들면 안될거야 없겠지만요; )

375

(29 답글들, 공지사항에 작성)

갈 수는 있을거 같습니다..만 구경만해도 되나요?; 아는게 없어서;;
쫓아내지는 않으시겠죠? T_T