[첫화면으로]UseModWiki소스수정/단축키개선

마지막으로 [b]

1. 단축키 개선
1.1. wiki.pl 수정
1.2. wikiscript.js 수정
1.3. 추가 업데이트 내역
1.4. 사용자 의견

1. 단축키 개선

/단축키에서 구현한 것을 개선해서, 키 입력 한 번으로 (엔터를 칠 필요 없이) 원하는 페이지로 이동하고자 함. 아이디어는 [클리앙]의 게시판 단축키와 [태터툴즈]의 단축키 지원 소식에서 얻음.

1.1. wiki.pl 수정

일일이 수정한 부분 골라내기 힘들어서 그냥 diff 출력을 옮김.

diff -u -r1.259 -r1.263
--- wiki.pl 24 Jan 2005 08:35:57 -0000  1.259
+++ wiki.pl 5 Feb 2005 03:00:08 -0000   1.263
@@ -33,8 +33,8 @@
 ### added by gypark
 ### wiki.pl 버전 정보
 use vars qw($WikiVersion $WikiRelease $HashKey);
-$WikiVersion = "0.92K3-ext1.72a";
-$WikiRelease = "2005-01-24";
+$WikiVersion = "0.92K3-ext1.73";
+$WikiRelease = "2005-02-05";

 $HashKey = "salt"; # 2-character string
 ###
@@ -100,7 +100,8 @@
    $ViewCount $AnchoredFreeLinkPattern %UserInterest %HiddenPage
    $pageid $IsPDA $MemoID
    $QuotedFullUrl
-   %MacroFunc %MacroFile);
+   %MacroFunc %MacroFile
+   $UseShortcut $UseShortcutPage);
 ###
 ###############

@@ -248,6 +249,9 @@
 umask 0;

 $TableOfContents = "";
+# 단축키
+$UseShortcut = 1;
+$UseShortcutPage = 1;

 # The "main" program, called at the end of this script file.
 sub DoWikiRequest {
@@ -1035,7 +1039,7 @@
    } else {
        my $bookmark = &GetParam('bookmark',-1);
        print "<br>" . &ScriptLink("action=bookmark&time=$Now",
-               T('Update my bookmark timestamp'));
+               T('Update my bookmark timestamp')." [m]");
        print " (".
            Ts('currently set to %s', &TimeToText($bookmark)).
            ")<br>\n";
@@ -1862,7 +1866,7 @@
 ### page 처음에 bottom 으로 가는 링크를 추가
 ### #EXTERN
    if (&GetParam('InFrame','') eq '') {
-       $result .= "\n<div align=\"right\"><a accesskey=\"z\" name=\"PAGE_TOP\" href=\"#PAGE_BOTTOM\">". T('Bottom') . "</a></div>\n";
+       $result .= "\n<div align=\"right\"><a accesskey=\"z\" name=\"PAGE_TOP\" href=\"#PAGE_BOTTOM\">". T('Bottom')." [b]" . "</a></div>\n";
    }
 ###
 ###############
@@ -1974,13 +1978,67 @@
            if ($FreeLinks) {
                $id = &FreeToNormal($id);
            }
-           $bodyExtra .= qq(ondblclick="location.href='$ScriptName?action=edit&id=$id'");
+           $bodyExtra .= qq( ondblclick="location.href='$ScriptName?action=edit&id=$id'" );
        }
    }
-
 ###
 ###############

+### 단축키
+   my $headExtra;
+   if ($UseShortcut) {
+       my $shortCutUrl = "$ScriptName".&ScriptLinkChar();
+       my $shortCutLogin = &LoginUser()?"logout":"login";
+       my $shortCutHome = &FreeToNormal($HomePage);
+
+       $headExtra .= <<EOH;
+<script>
+<!--
+var key = new Array();
+
+key['f'] = "${shortCutUrl}$shortCutHome";
+key['i'] = "${shortCutUrl}action=index";
+key['r'] = "${shortCutUrl}action=rc";
+key['l'] = "${shortCutUrl}action=$shortCutLogin";
+key['m'] = "${shortCutUrl}action=bookmark&time=$Now";
+
+key['t'] = "#PAGE_TOP";
+key['b'] = "#PAGE_BOTTOM";
+
+EOH
+
+       if ($UseShortcutPage) {
+           my $shortCutId = $q->param('id');
+           $shortCutId = $id if ($shortCutId eq '');
+           my $shortCutRevision = &GetParam('revision','');
+
+           $headExtra .= <<EOH;
+key['e'] = "${shortCutUrl}action=edit&id=$shortCutId";
+key['v'] = "${shortCutUrl}action=edit&id=$shortCutId&revision=$shortCutRevision";
+key['h'] = "${shortCutUrl}action=history&id=$shortCutId";
+key['d'] = "${shortCutUrl}action=browse&diff=5&id=$shortCutId";
+
+EOH
+       }
+
+       $headExtra .= <<EOH;
+document.onkeypress = GetKeyStroke;
+-->
+</script>
+EOH
+   }
+   $html .= $headExtra;
+
    # Insert any other body stuff (like scripts) into $bodyExtra here
    # (remember to add a space at the beginning to separate from prior text)
    $html .= "</HEAD><BODY $bodyExtra>\n";
@@ -2068,7 +2126,7 @@
 ###############
    }
    if ($UseDiff) {
-       $result .= ' ' . &ScriptLinkDiff(4, $id, T('(diff)'), $rev);
+       $result .= ' ' . &ScriptLinkDiff(4, $id, T('(diff [d])'), $rev);
    }

    $result .= '<br>';
@@ -2092,7 +2150,7 @@
    }
 ###
 ###############
-   $result .= &GetHistoryLink($id, T('History'));
+   $result .= &GetHistoryLink($id, T('History')." [h]");
    if ($rev ne '') {
        $result .= ' | ';
        $result .= &GetPageLinkText($id, T('View current revision'));
@@ -2103,9 +2161,9 @@
    if (&UserCanEdit($id, 1)) {
        if ($rev ne '') {
            $result .= &GetOldPageLink('edit',   $id, $rev,
-                        Ts('Edit revision %s of this page', $rev));
+                        Ts('Edit revision %s of this page', $rev)." [v]");
        } else {
-           $result .= &GetEditLink($id, T('Edit text of this page'));
+           $result .= &GetEditLink($id, T('Edit text of this page')." [e]");
        }
    } else {
 ###############
@@ -2178,7 +2236,7 @@
    if ($CheckTime) {
        $result .= "<i>" . sprintf("%8.3f",&tv_interval($StartTime)) . " sec </i>";
    }
-   $result .= "<a accesskey=\"x\" name=\"PAGE_BOTTOM\" href=\"#PAGE_TOP\">" . T('Top') . "</a></DIV>\n" . $q->end_html;
+   $result .= "<a accesskey=\"x\" name=\"PAGE_BOTTOM\" href=\"#PAGE_TOP\">" . T('Top')." [t]" . "</a></DIV>\n" . $q->end_html;
 ###

    return $result;
@@ -2212,9 +2270,9 @@
    $bartext = "\n<TABLE class='gotobar' width='100%'>";
    $bartext .= &GetFormStart();
    $bartext .= "<TR class='gotobar'>\n<TD class='gotohomepage'>";
-   $bartext .= &GetPageLink($HomePage);
-   $bartext .= "</TD>\n<TD class='gotoindex'>" . &ScriptLink("action=index", T('Index'));
-   $bartext .= "</TD>\n<TD class='gotorecentchanges'>" . &GetPageLink(T($RCName));
+   $bartext .= &GetPageLink($HomePage).&GetPageLinkText($HomePage, " [f]");
+   $bartext .= "</TD>\n<TD class='gotoindex'>" . &ScriptLink("action=index", T('Index')." [i]");
+   $bartext .= "</TD>\n<TD class='gotorecentchanges'>" . &GetPageLink(T($RCName)).&ScriptLink("action=rc", " [r]");
    if ($id =~ m|/|) {
        $main = $id;
        $main =~ s|/.*||;  # Only the main page name (remove subpage)
@@ -2252,12 +2310,12 @@
    $bartext .= "</TD>\n<TD class='gotolinks'>" . &ScriptLink("action=links", T('Links'));
 #  if (($UserID eq "113") || ($UserID eq "112")) {
    if (!&LoginUser()) {
-       $bartext .= "</TD>\n<TD class='gotologin'>" . &ScriptLink("action=login", T('Login'));
+       $bartext .= "</TD>\n<TD class='gotologin'>" . &ScriptLink("action=login", T('Login')." [l]");
    }
    else {
        $bartext .= "</TD>\n<TD class='gotologin'>".
            &GetPageLink(&GetParam('username'));
-       $bartext .= "</TD>\n<TD class='gotologin'>" . &ScriptLink("action=logout", T('Logout'));
+       $bartext .= "</TD>\n<TD class='gotologin'>" . &ScriptLink("action=logout", T('Logout'). " [l]");
    }
    $bartext .= "</TD>\n<TD class='gotosearch'>" . &GetSearchForm();
    if ($UserGotoBar ne '') {
@@ -5249,11 +5307,13 @@
    my ($id, $action, $text, $search);

    $ClickEdit = 0;                                 # luke added
+   $UseShortcutPage = 0;       # 단축키
    $action = &GetParam("action", "");
    $id = &GetParam("id", "");
    if ($action ne "") {
        $action = lc($action);
        if ($action eq "edit") {
+           $UseShortcut = 0;   # 단축키
            &DoEdit($id, 0, 0, "", 0)  if &ValidIdOrDie($id);
        } elsif ($action eq "unlock") {
            &DoUnlock();
@@ -5264,12 +5324,15 @@
 ### titleindex action 추가
 ### from Bab2's patch
        } elsif ($action eq "titleindex") {
+           $UseShortcut = 0;
            &DoTitleIndex();
 ###
 ###############
        } elsif ($action eq "help") {               # luke added
+           $UseShortcut = 0;
            &DoHelp();                              # luke added
        } elsif ($action eq "preview") {            # luke added
+           $UseShortcut = 0;
            &DoPreview();                           # luke added
        } elsif ($action eq "links") {
            &DoLinks();
@@ -5301,9 +5364,11 @@
            &DoBookmark();
 ### file upload
        } elsif ($action eq "upload") {
+           $UseShortcut = 0;
            &DoUpload();
 ### oekaki
        } elsif ($action eq "oekaki") {
+           $UseShortcut = 0;
            &DoOekaki();
 ### 관심 페이지
        } elsif ($action eq "interest") {
@@ -5319,6 +5384,7 @@
            &DoComments($id) if &ValidIdOrDie($id);
 ### rss from usemod1.0
        } elsif ($action eq "rss") {
+           $UseShortcut = 0;
            &DoRss();
 ### Trackback
        } elsif ($action eq "send_ping") {
@@ -5329,6 +5395,7 @@
 ###############
        } else {
            # Later improve error reporting
+           $UseShortcut = 0;
            &ReportError(Ts('Invalid action parameter %s', $action));
        }
        return;
@@ -5367,6 +5434,7 @@
    # Handle posted pages
    if (&GetParam("oldtime", "") ne "") {
        $id = &GetParam("title", "");
+       $UseShortcut = 0;
        &DoPost()  if &ValidIdOrDie($id);
        return;
    }
@@ -5632,7 +5700,9 @@
        if ($EditNote ne '') {
            print T($EditNote) . '<br>';  # Allow translation
        }
-       print $q->submit(-name=>'Save', -value=>T('Save')), "\n";
+### 단축키
+#      print $q->submit(-name=>'Save', -value=>T('Save')), "\n";
+       print $q->submit(-accesskey=>'r', -name=>'Save', -value=>T('Save')." [alt+r]"), "\n";
        $userName = &GetParam("username", "");
        if ($userName ne "") {
            print ' (', T('Your user name is'), ' ',
@@ -5640,13 +5710,11 @@
        } else {
            print ' (', Ts('Visit %s to set your user name.', &GetPrefsLink()), ') ';
        }
-   #print $q->submit(-name=>'Preview', -value=>T('Preview'));  # luke delete
 ###############
 ### replaced by gypark
 ### 미리보기 버튼에 번역함수 적용
-   # print q(<input type="button" name="prev1" value="Popup Preview" onclick="javascript:preview();">); # luke added
-       print q(<input type="button" name="prev1" value=").
-           T('Popup Preview') .
+       print q(<input accesskey="p" type="button" name="prev1" value=").
+           T('Popup Preview')." [alt+p]" .
            q(" onclick="javascript:preview();">); # luke added
 ###
 ###############
@@ -5654,12 +5722,12 @@
 ###############
 ### added by gypark
 ### file upload
-       print " ".q(<input type="button" name="prev1" value=").
-           T('Upload File') .
+       print " ".q(<input accesskey="u" type="button" name="prev1" value=").
+           T('Upload File')." [alt+u]" .
            q(" onclick="javascript:upload();">);
 ### oekaki
-       print " ".q(<input type="button" name="prev1" value=").
-           T('Oekaki') .
+       print " ".q(<input accesskey="o" type="button" name="prev1" value=").
+           T('Oekaki')." [alt+o]" .
            q(" onclick="javascript:oekaki();">);
 ###
 ###############

1.2. wikiscript.js 수정

ext1.109f 에서, wiki.pl 안에 들어 있는 GetKeyStroke함수를 wikiscript.js 쪽으로 옮기고, 한 줄 추가되었음
// 단축키 개선
function GetKeyStroke(KeyStorke) {
    var evt = KeyStorke || window.event;
    var eventChooser = evt.keyCode || evt.which;
    var target = evt.target || evt.srcElement;
    if (evt.altKey || evt.ctrlKey) return;               // ext1.109f 에서 추가된 라인
    while (target && target.tagName.toLowerCase() != 'input' && target.tagName.toLowerCase() != 'textarea') {
        target = target.parentElement;
    }
    if (!target) {
        var which = String.fromCharCode(eventChooser).toLowerCase();
        for (var i in key) {
            if (which == i) {
                document.location.href = key[i];
            }
        }
    }
}

1.3. 추가 업데이트 내역

ext1.74b - FireFox 에서도 동작하도록 수정

ext1.109f

1.4. 사용자 의견

페이지를 이동시키는 방법이..
- window.location = ... 클리앙에서 쓰는 방법
- location.href= ... 유즈모드에서 마우스 더블클릭시
- document.location.href = ... 태터
- parent.location.herf = ... 태터
등이 있군요. location 앞에 다른 게 있는 경우와 없는 경우, 뒤에 href 가 있는 경우와 없는 경우에 대해 설명 좀 해주세요~
-- Raymundo 2005-2-4 5:17 pm

최근에 소스를 수정하면서 FF로 테스트하면서야 알았는데... FF에서는 alt+e 를 눌러서 FF의 편집 도구 모음을 열려고 하면 위키까지 그 영향을 받아서 페이지 수정 화면으로 넘어가버리는군요... 그렇다고 FF에서 단축키 기능을 끄게 하면 이번에는 반대로 위키 페이지 작업을 할 때 불편할테고... 으음...
-- Raymundo 2007-2-9 1:09 pm

찾기할대도 첫 페이지로 가버려요.
-- Nyxity 2007-2-9 1:20 pm

이젠 잘 될 겁니다. :-) 근데 키보드가 한글 입력 상태에서는 동작하지 않던데, (IE에서는 되는데) 이건 태터에서도 그런 걸 보니 제가 해결할 수 있는 난이도가 아니지 싶어서 외면합니다 ^.^
-- Raymundo 2007-2-9 1:41 pm

애쓰셨습니다. 한글입력상태에서 동작안하는건 별 불편하지 않아요.
-- Nyxity 2007-2-9 1:42 pm

그리고 고질적인 브라우저의 "&" 처리 문제 때문에, 소스 코드 내의 "&"가 수정 할때마다 "&"로 바뀌어서 어떤 곳은 "&amp;amp;" 이런 식으로 계속 바꿔치기 된 곳들이 있군요. 그런 곳들은 다 그냥 "&"입니다. 일단 페이지는 고쳐놨지만 소스 수정하실 때 주의하셔야 하겠습니다.
-- Raymundo 2007-2-9 1:47 pm

으으... 맥을 쓰는 어느 분이 "command+f"를 눌러서 검색을 하려 할 때 첫 화면으로 이동해버린다는 제보를 하셨었는데, 그때는 내가 맥을 쓰고 있지 않아서 귀찮아서 수정을 미뤘더만... 내가 불편해서 죽겠군요... 근데 어딜 어떻게 손봐야 하려나...
-- Raymundo 2013-9-30 4:08 pm

나도 맥을 쓰게 되니 cmd+f 와 cmd+l 할 때마다 첫페이지로 가거나 로그아웃되는 문제가 있어서 일단 UseShortcut 변수 값을 0으로 해서 꺼 둠.
-- Raymundo 2013-11-7 3:37 pm
이름:  
Homepage:
내용:
 

위키위키분류

마지막 편집일: 2013-11-7 3:37 pm (변경사항 [d])
2600 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기