[첫화면으로]UseModWiki소스수정/Anchor링크

마지막으로 [b]

1. Anchor 링크 개선
1.1. 한글 앵커 지원
1.2. Anchor 링크 패턴 정리
1.3. 역링크 처리, 링크 변경 처리
2. 추가 업데이트 내역
3. 사용자 의견
4. 테스트용 링크

1. Anchor 링크 개선

1.1. 한글 앵커 지원

wiki.pl 에서
###############
### added by gypark
### 패치를 위해 추가된 내부 전역 변수   
use vars qw(%RevisionTs $FS_lt $FS_gt $StartTime $Sec_Revision $Sec_Ts
    $ViewCount $AnchoredFreeLinkPattern);   # AnchoredFreeLinkPattern 추가
###
###############

sub InitLinkPatterns {
    ...
    $QDelim = '(?:"")?';     # Optional quote delimiter (not in output)
###############
### replaced by gypark
### anchor 에 한글 사용
#   $AnchoredLinkPattern = $LinkPattern . '#(\\w+)' . $QDelim if $NamedAnchors;
    $AnchoredLinkPattern = $LinkPattern . '#([0-9A-Za-z\xa0-\xff]+)' . $QDelim if $NamedAnchors;
###
###############
    $LinkPattern .= $QDelim;
    ...
    $FreeLinkPattern .= $QDelim;

###############
### added by gypark
### 한글패이지에 anchor 사용
### from Bab2's patch
    $AnchoredFreeLinkPattern = $FreeLinkPattern . '#([0-9A-Za-z\xa0-\xff]+)' . $QDelim if $NamedAnchors;
###
###############

    # Url-style links are delimited by one of:
   ...
}

sub CommonMarkup {
    ...
        if ($FreeLinks) {
            # Consider: should local free-link descriptions be conditional?
            # Also, consider that one could write [[Bad Page|Good Page]]?
            s/\[\[$FreeLinkPattern\|([^\]]+)\]\]/&StorePageOrEditLink($1, $2)/geo;
            s/\[\[$FreeLinkPattern\]\]/&StorePageOrEditLink($1, "")/geo;
###############
### added by gypark
### 한글패이지에 anchor 사용
### from Bab2's patch
            s/\[\[$AnchoredFreeLinkPattern\|([^\]]+)\]\]/&StoreBracketAnchoredLink($1, $2, $3)/geos if $NamedAnchors;
            s/\[\[$AnchoredFreeLinkPattern\]\]/&StoreRaw(&GetPageOrEditAnchoredLink($1, $2, ""))/geos if $NamedAnchors;
###
###############
        }
    ...
}

그리고 이거는 별개로... <anchor(앵커이름)> 했을때 <a name="#앵커이름"> 로 치환되는데 끝에 </a> 가 더 있어야 되지 않나 싶어서...

sub MacroAnchor() { return "<a name=\"\#@_\"></a>"; }    # 뒤에 </a> 를 붙여줌

ext1.46c 에서 다시 개선됨. [#앵커] 와 같은 형태에 한글을 사용할 수 있게 함 (이것은 <a name="앵커"></a> 로 치환된다. anchor 매크로를 따로 쓸 필요가 없었군)
sub CommonMarkup {
    ...
        s/\&__LT__;code\&__GT__;((.|\n)*?)\&__LT__;\/code\&__GT__;/&StorePre($1, "code")/ige;

###############
### replaced by gypark
### anchor 에 한글 사용
#       s/\[\#(\w+)\]/&StoreHref(" name=\"$1\"")/ge if $NamedAnchors;
        s/\[\#([0-9A-Za-z\xa0-\xff]+)\]/&StoreHref(" name=\"$1\"")/ge if $NamedAnchors;
###
###############
        if ($HtmlTags) {
    ...

1.2. Anchor 링크 패턴 정리

관련 소스 수정:

wiki.pl 에서 두 곳을 고쳐줌
sub StoreHref {
    my ($anchor, $text) = @_;

#   return "<a" . &StoreRaw($anchor) . ">$text</a>"; 
    return StoreRaw("<a $anchor>$text</a>");
}

sub CommonMarkup {
...
### anchor 에 한글 사용
#       s/\[\#(\w+)\]/&StoreHref(" name=\"$1\"")/ge if $NamedAnchors;
# anchor 정리 - 2012.01.06
        s/\[\[$AnchorPattern\|([^\]]+)\]\]/StoreHref("href=\"#$1\"", $2)/ge if $NamedAnchors;
        s/\[\[$AnchorPattern\]\]/StoreHref("href=\"#$1\"", $1)/ge if $NamedAnchors;

        s/\[$AnchorPattern\|([^\]]+)\]/StoreHref("name=\"$1\"", $2)/geo;
        s/\[$AnchorPattern\]/StoreHref("name=\"$1\"")/ge if $NamedAnchors;
...

1.3. 역링크 처리, 링크 변경 처리

예를 들어 갑 페이지에 [[을#앵커]]란 링크가 있으면 이것을 링크로 처리해주지 못하는 문제가 있었다.

wiki.pl 수정: (diff 형식은 [Comparing 38ce42e3f2...106491f for gypark's UseModKr - GitHub])
sub GetPageLinks {
        ...
             my $fl = $FreeLinkPattern;
             $text =~ s/\[\[$fl\|[^\]]+\]\]/push(@links, &FreeToNormal($1)), ' '/ge;
             $text =~ s/\[\[$fl\]\]/push(@links, &FreeToNormal($1)), ' '/ge;
# 두 줄 추가
             $text =~ s/\[\[$AnchoredFreeLinkPattern\|([^\]]+)\]\]/push(@links, &FreeToNormal($1)), ' '/ge;
             $text =~ s/\[\[$AnchoredFreeLinkPattern\]\]/push(@links, &FreeToNormal($1)), ' '/ge;
         }
         if ($WikiLinks) {
             $text =~ s/$LinkPattern/push(@links, &StripUrlPunct($1)), ' '/ge;
        ...
}

sub SubstituteTextLinks {
    ...
         $text =~
          s/\[\[$FreeLinkPattern\|([^\]]+)\]\]/&SubFreeLink($1,$2,$old,$new)/geo;
         $text =~ s/\[\[$FreeLinkPattern\]\]/&SubFreeLink($1,"",$old,$new)/geo;
# 세 줄 추가
         $text =~
          s/\[\[$AnchoredFreeLinkPattern\|([^\]]+)\]\]/&SubFreeLink($1,$3,$old,$new,$2)/geo;
         $text =~ s/\[\[$AnchoredFreeLinkPattern\]\]/&SubFreeLink($1,"",$old,$new,$2)/geo;
     }
     if ($BracketText) {  # Links like [URL text of link]
         $text =~ s/(\[$UrlPattern\s+([^\]]+?)\])/&StoreRaw($1)/geo;
    ...
}

 sub SubFreeLink {
# 다음 줄 수정
#    my ($link, $name, $old, $new) = @_;
+    my ($link, $name, $old, $new, $anchor) = @_;
     my ($oldlink);

     $oldlink = $link;
     ...
         $link = $oldlink;  # Preserve spaces if no match
     }
     $link = "[[$link";
# 세 줄 추가
     if ( defined $anchor and $anchor ne '' ) {
         $link .= "#$anchor";
     }
     if ($name ne "") {
         $link .= "|$name";
     }
     ...
}

2. 추가 업데이트 내역

ext2.15 - Anchor 링크 패턴 정리. anchor 매크로 삭제

ext2.23b - 링크로 처리되지 않는 문제 해결
-- Raymundo 2012-2-24 1:23 am

3. 사용자 의견

이건 개선인지 개악인지 조금 모호한 것이...원래 앵커가 절대좌표(?)로 인식되었었는데 이제 상대좌표로 걸리게 됩니다. 누군가가 중간에 앵커를 삽입하거나 삭제하면 그 뒤의 놈들은 모두 영향을 받게 되지요. :)
오래간만에 글을 남기긴 했지만 종종 들어와서 횡설수설을 읽고 간답니다. 요즘 십자군이야기를 재미있게 읽고있네요.
-- 거북이 2003-6-6 3:01 pm

안녕하세요~ 무슨 말씀인지 전혀 이해가 되지 않습니다. :-O 앵커의 상대좌표란게 뭔가요?
-- Raymundo 2003-6-6 3:31 pm
예전에는 toc에서 영어로 된 놈이 타이틀로 있다면 [[PinkFloyd#Wish_You_Were_Here]]이런 식으로 절대값을 써서 앵커를 정의할 수 있었지요. 그런데 지금은 [[PinkFloyd#H_4]]이런 식으로만 가능하다는 거지요. 이러면 중간에 타이틀이 삽입될 경우 다른 경로를 가리키게 되니까요 :)
-- 거북이 2003-6-9 1:21 pm

아... 그건 이 /Anchor링크와는 관계가 없고, /toc매크로버그 때문입니다. /toc매크로버그를 다른 방법으로 고치는 것을 생각해 봐야겠군요.
-- Raymundo 2003-6-9 2:18 pm

ext1.46c 에서 소스 수정 사항이 추가되었습니다.
-- Raymundo 2003-9-3 6:18 pm

이름:  
Homepage:
내용:
 

4. 테스트용 링크


위키위키분류

마지막 편집일: 2012-2-24 1:23 am (변경사항 [d])
1122 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기