[첫화면으로]UseModWiki소스수정/웹페이지링크쉽게올리기

마지막으로 [b]

1. 웹페이지 링크 횡설수설 등에 쉽게 올리기
1.1. 사용법
1.1.1. 마우스로 긁어서 선택한 텍스트가 있는 상태에서 스크립트를 띄우면
1.1.2. 추가 - 매크로 종류도 선택하기
1.1.3. 추가 - 클립보드에 복사하기, 링크 형태 전환하기
1.2. 부작용
1.3. 발견된 문제점
1.3.1. 즐겨찾기를 클릭해도 반응이 없고, "액세스가 거부되었습니다"라는 자바스크립트 에러가 나옴
1.3.2. URL 이 이상하게 바뀜 (해결됨)
1.4. addtopic.pl 추가
1.5. 추가 업데이트 내역
1.6. 사용자 의견

1. 웹페이지 링크 횡설수설 등에 쉽게 올리기

설명은 Jof:UseModWiki소스수정/주절주절에쉽게올리기를 참고. 방문자 입장에서는 Jof:조프일기/2005-07-16도 참고하면 좋겠다. 1년8개월만에 ext버전용으로 나왔음 =.=;

1.1. 사용법

addtopic.pl 파일을 myaction 디렉토리에 넣으면 됨.

다른 건 조프위키의 설명을 보면 될 것이고, 이쪽 패치에서 신경써야 될 법한 것들을 언급하면,

위 주소에서 다음 세가지 항목을 자기 위키에 맞게 고쳐서 배포하면 된다

addtopic.pl 쪽은 거의 손대지 않아도 되지만, 자기가 입맛대로 출력을 바꾸고 싶다면 아래 변수 정도를 바꿔주면 되겠다:
########## 자기 위키에 맞춰서 바꿔 줄 부분
    my ($title_only, $title_with_text, $guide_msg);
    # 텍스트 필드에 자동으로 채워지는 형태
    $title_only      = '[$url $title]';             # 선택한 텍스트가 없는 경우
    $title_with_text = '[$url $text -- $title]';    # 있는 경우


    $guide_msg =                # 입력폼 상단에 나올 안내문
        "웹사이트 링크는 [http://www.usemod.org UseModWiki] 형식으로 하면 됩니다.";
##########

1.1.1. 마우스로 긁어서 선택한 텍스트가 있는 상태에서 스크립트를 띄우면

Jof:UseModWiki소스수정/주절주절에쉽게올리기에서는
[URL주소 해당웹페이지의제목]
[URL주소 해당웹페이지의제목] 선택한텍스트
위의 형태로 입력폼을 채워넣도록 하고 있는데, 제 경우는 따로 텍스트를 긁어야 하는 경우는 대부분 웹페이지제목이 "***뉴스", "***블로그" 같이 추상적이라서, 해당 글의 제목을 다시 본문에서 복사해야 하는 경우였거든요. 그래서 아래와 같이 채워넣게 했습니다.
[URL주소 해당웹페이지의제목]
[URL주소 선택한텍스트 --- 해당웹페이지의제목]

저 형태를 바꾸고 싶다면 $title_with_text를 바꿔주시면 됩니다. 만일 조프위키의 형태처럼 채워넣고 싶다면, 아래와 같이 하면 되겠죠.
    my $title_with_text = '[$url $title] $text';
쉽게 알 수 있겠지만, "$url", "$title", "$text"라는 이름이 각각 URL주소, 웹페이지제목, 선택한텍스트를 의미합니다.

1.1.2. 추가 - 매크로 종류도 선택하기

(위에서 설명한 스크립트 주소도 그대로 사용할 수 있으니 굳이 기존 것을 바꿀 필요는 없음)

thread매크로를 쓰는 페이지 뿐 아니라, longcomments나 comments를 사용해서 일종의 스크랩 페이지를 꾸밀 때도 쓸 수 있게 했음

두 군데가 추가되었는데, 처음에 "m=3;"이라고 값을 주는 곳과, 뒤에 창을 띄울 때 위키 주소에 "'&m='+m+"이라고 그 값을 적용하는 부분이다.

이 m값을 처리하게 하는 바람에 스크립트 주소가 더 길어져서, 팝업을 띄우는 스크립트는 wiki 주소나 페이지 이름이 조금만 더 길어져도 512바이트를 넘어서 IE에서는 동작하지 않을 위험이 있으니 주의. 현재 창에 띄우는 스크립트는 그래도 버틸만 하다 -_-; 원래 맘 같아서는 macro='t' or 'l' or 'c' 등으로 명확하게 이름을 짓고 싶었는데, 스크립트 주소 길이를 줄이려고 변수 이름도 m이 되었고, 따옴표를 쓰지 않으려고 값도 숫자가 되었다 ㅠ,.ㅠ

1.1.3. 추가 - 클립보드에 복사하기, 링크 형태 전환하기

북마클릿을 띄웠을 때, 아래 그림의 빨간 점선 영역위에 마우스를 가져가면 우측에 버튼 두 개가 나타난다. (점선 자체도 처음에는 보이지 않음)

Upload:addtopic_01.png
(숨겨져 있는 버튼을 찾아라~)

"Toggle Format"
[URL 설명] - 1)
설명[URL]  - 2)

버튼을 숨긴 이유는... 홈페이지 주인장 아니면 쓸 일이 거의 없는 버튼 두 개가 추가로 달려 있으니 영 정신이 사나워서인데, 괜한 사족을 붙인 건지 모르겠다. :-)

1.2. 부작용

조프위키에 의하면 몇가지 있지만 쓰기 귀찮다랍니다. 저는 잘 모르겠습니다.

이 패치와는 무관하게, ext버전의 thread나 comment매크로들은 사용자가 입력한 걸 QuoteHtml()을 거쳐서 &나 부등호를 다 & amp; & lt; 등으로 바꿔버리기 때문에, URL에 &가 들어가 있어도 & amp; 로 바뀌어서 저장되고 있었더군요. 근데 그게 어떻게 제대로 된 링크가 걸렸나 싶었는데 출력할 때는 다시 저걸 되돌리는 루틴이 있는 듯.. 이건 나중에 다시 살펴봐야겠습니다.

1.3. 발견된 문제점

1.3.1. 즐겨찾기를 클릭해도 반응이 없고, "액세스가 거부되었습니다"라는 자바스크립트 에러가 나옴

정확한 이유는 모르겠는데, 다음 조건이 들어맞을 때 동작을 하지 않는다. 이 때는 IE하단에 자바스크립트 에러를 나타내는 느낌표가 뜨면서 동작을 하지 않는다. 느낌표를 클릭해보면 "액세스가 거부되었다"는 말이 나온다. 스크립트 주소에서 "선택한 텍스트"를 얻어내기 위한 if 단락을 지우면 이런 문제가 없는 걸로 봐서, 텍스트를 얻어낼 때 문제의 웹페이지가 아니라 직전에 포커스가 있던 곳에서 얻어내려고 하기 때문이 아닌가..라고 짐작을 하는데, 왜 "특정 웹페이지"라는 조건이 붙는지 이유를 모르겠다. 그 웹페이지에 포함된 스크립트와 충돌이 있는 게 아닐까 싶기도 함.

암튼 이런 경우 해결책은, 그 웹페이지 본문 아무데나 한번 클릭해준 후에 다시 즐겨찾기를 사용하는 것이다. 이게 홈피 주인장은 뭐 염두에 두면 될텐데, 다른 방문자가 이용할 때 (몇이나 있겠냐마는) 당황할 수 있겠다.

1.3.2. URL 이 이상하게 바뀜 (해결됨)

이번에도 저장을 잘 했는데 막상 횡설수설에서 링크를 클릭해보면 없는 기사라고 나온다. 저장할 때 주소가 잘못 저장되는 것이다.

원래 기사URL: http://news.naver.com/news/read.php?mode=LSS2D&office_id=023&article_id=0000237284&section_id=102&section_id2=255&menu_id=102
저장된 URL:   http://news.naver.com/news/read.php?mode=LSS2D&office_id=023&article_id=0000237284§ion_id=102§ion_id2=255&menu_id=102

네이버 뉴스 기사의 경우는 대부분 "&section_id="라는 항목이 주소에 들어 있는데,

따라서 "&section"뿐 아니라 "&quoting=no"라거나 "&ltprocess=" 등등이 포함된 URL은 저런 식으로 망가져버린다.

결국 textarea를 출력할때, default에 해당하는 텍스트에서 &를 &로 먼저 고친 후에 textarea에 넣음으로써 해결함. (wiki.pl에 있는 GetTextArea()를 호출) IE와 FF 양쪽에서 다 괜찮은 듯.

1.4. addtopic.pl 추가

# See http://jof4002.net/?UseModWiki소스수정/주절주절에쉽게올리기
#     http://gypark.pe.kr/wiki/UseModWiki소스수정/웹페이지링크쉽게올리기

use strict;

sub action_addtopic {
########## 자기 위키에 맞춰서 바꿔 줄 부분
    my ($title_only, $title_with_text, $guide_msg);
    # 텍스트 필드에 자동으로 채워지는 형태
    $title_only      = '[$url $title]';             # 선택한 텍스트가 없는 경우
    $title_with_text = '[$url $text -- $title]';    # 있는 경우

    $guide_msg =                # 입력폼 상단에 나올 안내문
        "웹사이트 링크는 [http://www.usemod.org UseModWiki] 형식으로 하면 됩니다.";
##########

    $EmbedWiki = 1;

    # 필요한 데이타를 쿼리스트링으로부터 가져옴
    my ($id, $up, $url, $title, $text, $macro);
    $id    = &GetParam("id", "");
    $up    = &GetParam("up", "");
    $url   = &GetParam("url", "");
    $title = &GetParam("title", "");
    $text  = &GetParam("text", "");
    $macro  = &GetParam("m", 3);

    # 그 외 출력할 때 사용될 변수들
    my ($header_msg, $ccode, $idvalue, $name_field, $default_text, $comment_field);
    my ($threadindent, $long);

    # 매크로 종류
    if ($macro == 1) {      # comments
        ($threadindent, $long) = ("", "0");
    } elsif ($macro == 2) { # longcomments
        ($threadindent, $long) = ("", "1");
    } else {                # thread
        ($threadindent, $long) = ("0", "1");
    }

    # 인코딩 관련 처리들
    $guide_msg = &guess_and_convert($guide_msg);
    $header_msg = "$id 페이지에 올리기";
    $header_msg = &guess_and_convert($header_msg);
    # 위키에서 UTF-8이 아닌 인코딩을 사용하는 경우는 변환
    if ($HttpCharset !~ /utf-8|utf8/i) {
        $id = &convert_encode($id, "UTF-8", $HttpCharset);
        $title = &convert_encode($title, "UTF-8", $HttpCharset);
        $text = &convert_encode($text, "UTF-8", $HttpCharset);
    }

    # ccode
    $ccode = &simple_crypt(length($id).substr(&CalcDay($Now),5));

    # 사용자 이름 필드에 채워넣을 값
    if (&LoginUser()) {
        $idvalue = "[[$UserID]]";
    }
    $name_field = $q->textfield(-name=>"name",
                                -class=>"comments",
                                -size=>"15",
                                -maxlength=>"80",
                                -default=>"$idvalue");

    # 입력폼에 채워넣을 기본 텍스트
    $text =~ s/^\s*//;
    $text =~ s/\s*$//;
    if ($text eq "") {
        eval '$default_text = "'.$title_only.'";';
    } else {
        eval '$default_text = "'.$title_with_text.'";';
    }

    $comment_field = &GetTextArea("comment", $default_text, 7, 80);

    # html 출력
    print &GetHeader("", $header_msg, "");
    print
        $q->h2($header_msg).
        "<DIV class='threadnew'>".
        $guide_msg."\n".
        $q->startform(-name=>"comments",-method=>"POST",-action=>"$ScriptName",
                -enctype=>"application/x-www-form-urlencoded",
                -accept_charset=>"$HttpCharset")."\n".
        &GetHiddenValue("action","comments")."\n".
        &GetHiddenValue("id","$id")."\n".
        &GetHiddenValue("pageid","$id")."\n".
        &GetHiddenValue("up","$up")."\n".
        &GetHiddenValue("ccode","$ccode") ."\n".
        &GetHiddenValue("long","$long")."\n".
        &GetHiddenValue("threadindent","$threadindent")."\n".
        T('Name') . ": ".
        $name_field . "&nbsp;"."\n".
        T('Comment') . ":<br>".
        $comment_field . "&nbsp;" ."\n".
        $q->submit(-name=>"Submit",-value=>("&nbsp;"x5).T("Submit").("&nbsp;"x5))."\n".
        "<DIV"
        . " onMouseOver=\"document.getElementById('secret').style.visibility='visible'\""
        . " onMouseOut=\"document.getElementById('secret').style.visibility='hidden'\""
        . ">"."\n".
        "<DIV id=\"secret\""
        . " style='text-align: right; visibility: hidden; border: 1px dashed red;'"
        . ">"."\n".
        $q->button(
                -name=>T("Copy to clipboard"),
                -onClick=>"copy_clip('',document.comments.comment.value)"
                ).
        " ".
        $q->button(
                -name=>T("Toggle format"),
                -onClick=>"change_format(document.comments.comment)"
                )."\n".
        "</DIV>"."\n".
        "</DIV>"."\n".
        $q->endform."\n".
        "</DIV>";

## "[URL 설명]" 형태와 "설명[URL]" 형태를 토글해주는 함수
    print <<EOF;

<script>
var to_bracket_url=true;
<!--
function change_format(obj) {
    var str = obj.value;
    if (to_bracket_url) {
        str = str.replace(/\\[(\\S+?)\\s(.*?)\\]/g,"\$2\[\$1\]");
    }
    else {
        str = str.replace(/(\\S.*)\\[(\\S+?)\\]/g,"\[\$2 \$1\]");
    }
    to_bracket_url = !to_bracket_url;

    obj.value = str;
}
-->
</script>
EOF
    print $q->end_html;

    return;
}

1;

1.5. 추가 업데이트 내역

-- Raymundo 2007-3-8 12:40 pm

-- Raymundo 2007-3-8 3:39 pm

ext2.1f - pl 파일 자체를 전혀 고치지 않고도 각자의 위키에 쓸 수 있는 형태가 되었기에, ext 배포본에 추가함.
-- Raymundo 2007-3-8 5:11 pm

ext2.1i - 스크립트 주소 쪽에서 매크로 종류도 지정할 수 있게 함
-- Raymundo 2007-3-9 7:51 pm

1.6. 사용자 의견

생각해 보니... "횡설수설"이라는 페이지 제목과 "-100"이라는 스레드 번호까지도 자바스크립트쪽에서 "id=횡설수설&up=-100"과 같은 식으로 적어주게 한다면, 이상적으로는 addtopic.pl 소스를 전혀 고치지 않고도 가져가서 쓸 수 있겠습니다. 스크립트에서 지정해주면 되니까... 근데 저 스크립트는 방문자가 자신의 브라우저에 즐겨찾기로 저장하는 것이라서 맘대로 바꿀 수 있다보니, 맘만 먹으면 thread매크로가 있는 페이지라면 (예를 들어 "게시판"에) 어디에든 맘대로 저걸 써서 올릴수도 있겠네요. 뭐 그렇게 따지면 브라우저로 직접 들어와서 올려버리면 그만이니 그게 그건가 싶기도 하고... 잠시 더 고민해보고 그렇게 바꾸든지 하겠습니다. 어느 쪽이 더 나을까요?

한가지 더, 좀 더 과감하게 고치면... 지금처럼 입력폼을 띄우고 방문자가 "달기" 버튼을 눌러서 등록하는게 아니라, 첨부터 즐겨찾기를 클릭하는 순간 횡설수설에 저장되게 할 수도 있겠다는 생각이 듭니다. 근데 과연 그게 좋은 생각일지는 =.=;; 스팸봇이 횡설수설에 들어왔다가 그 자바스크립트 링크를 들어가는 순간 계속 횡설수설 자체가 등록되어 버릴 법 하기도 하고??
-- Raymundo 2007-3-8 11:12 am

엥, 다 끝나고 나니까 IE에서는 즐겨찾기에 넣은 팝업 버전이 제대로 동작을 안하네 -_-;;;; FF에서는 잘 되는데... 주소가 너무 길어져서 그런가?
-- Raymundo 2007-3-8 1:09 pm

전체 주소가 508자를 넘어가면 작동하지 않음 -_-;;; 아 놔 별 게 다 속을...
-- Raymundo 2007-3-8 1:28 pm

아마도 512바이트 제한이고, "횡설수설" 네 글자가 8바이트를 차지해서 508자였던 듯. (짐작)
-- Raymundo 2007-3-8 2:44 pm

아... 이 기능, 없을 때는 몰랐는데 만들어보니 정말 좋군요 >.< 그동안 횡설수설 띄우고 URL 복사하고 제목 복사하고 하는게 얼마나 귀찮았는데...
-- Raymundo 2007-3-8 5:39 pm

firefox의 make link 확장을 사용하면 [웹페이지주소 제목] 이렇게 복사가 되요. 뭐 이 기능이 있으니 필요없는 내용이지만..
-- Nyxity 2007-3-8 6:04 pm

그것도 그렇고, FF용으로는 각종 블로그툴을 위한 북마클릿(이런 게 바로 북마클릿이란 걸 이제서야 알았습니다 ^^;)도 제공되고 있는 듯 하더군요. 근데 웹마가 손에 익은 이상 잘 못 넘어가겠더라고요.
-- Raymundo 2007-3-8 6:05 pm

와. 좋군요. 델리셔스 태그까지 넣을 수 있으면 완벽한데. 이건 너무 많이 바라는 거겠죠? :)
-- Nyxity 2007-3-9 11:29 am

엥? 그건 델리셔스에서 제공해야만... 혹시 델리셔스쪽에서, 다른 스크립트가 자기에게 태그를 등록할 수 있도록 인터페이스를 제공하고 있다면 그걸 쓰게 해 볼 수는 있을 것 같습니다. 근데 submit 버튼 하나로 양쪽을 구동시키는 건 안 될 것 같던데...
-- Raymundo 2007-3-9 12:52 pm

네이버뉴스 잘 안되는군요. 최신걸로 바꿨는데도.
http://news.naver.com/hotissue/ranking_read.php?ranking_type=popular_day&office_id=073&article_id=0000057038&date=20070323&seq=4
&이후 주소가 복사 안되요.
-- Nyxity 2007-3-23 1:01 pm

크, 역시나 불안하더라니 거기서 문제가...

그 구글에 있는 옛날 링크가 깨진다고 해서 한줄 추가해 준 거 주석처리해버리세요.

### QUERY_STRING이 %-인코딩된 형태로 오는 경우
### guess를 해도 ascii로 판정되기 때문에 변환이 안 된다.
### 이 시점에서 디코딩하여 복원함
$ENV{'QUERY_STRING'} =~ s/%([0-9a-fA-F]{2})/chr(hex($1))/ge; # 이 거

구글 쪽 문제는 다른 식으로 해결해야겠네요.
-- Raymundo 2007-3-23 2:35 pm

The mother of all questions:
In UseMod script, if I write a file, for instance HomePage, and its content is: "웹페이지링크쉽게올리기", in HomePage.db, the field "text" is "´ì§€ë§í¬ì‰½ê²Œì˜¬ë¦¬ê¸°", but on UseModKr script, the same content in HomePage.db is just "웹페이지링크쉽게올리기". Even if the name of a file is ""웹페이지링크쉽게올리기", in rclog on UseModKr is ""웹페이지링크쉽게올리기" too, literally.

I guess is difficult through this media, to give all details. But, only in case it won't be an arduous task explaining: what are the subroutines that I must take them a look. Where was the change for achieving it?
Really, thanks.

How the hell did you get it? :-)
-- JuanmaMP 2012-8-14 10:29 am

Hmmm... several years ago, I made usemodkr support UTF-8. There were a lot of work to do it. I can't remember what I did... sorry.

Did you check encoding setting for usemod script?
-- Raymundo 2012-8-14 12:17 pm

Well,

I compared these two scenarios (usemod, usemodkr) changing in usemod $HttpCharset.

$HttpCharset = "UTF-8"; # Charset for pages, like "iso-8859-2"

without other modification, I choosed the option "usemod pristine" against current usemodkr, and then I saw clearly, than UsemodKr saved files in other manners (which is what I like).

But it is a comfort your words, I've noticed than is not trivial matter; because it was being a source of effort for me, too.

Thanks, Raymundo :-)
-- JuanmaMP 2012-8-14 12:59 pm
이름:  
Homepage:
내용:
 

위키위키분류

마지막 편집일: 2024-4-29 10:14 am (변경사항 [d])
2104 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기