-1,4 +1,9 |
== Anchor 링크 개선 == |
<toc> |
== # [#테스트1]Anchor 링크 개선 == |
=== # 한글 앵커 지원 === |
* "페이지이름#앵커" 에서, 페이지 이름이 한글일 때나 앵커가 한글일 경우 동작하지 않는 문제를 해결 |
* [[Bab2]]님의 패치를 적용 |
-10,7 +15,7 |
* 소스 수정 |
: wiki.pl 에서 |
{{{perl |
{{{#!vim perl |
############### |
### added by gypark |
### 패치를 위해 추가된 내부 전역 변수 |
-21,7 +26,7 |
}}} |
: |
{{{perl |
{{{#!vim perl |
sub InitLinkPatterns { |
... |
$QDelim = '(?:"")?'; # Optional quote delimiter (not in output) |
-50,7 +55,7 |
}}} |
: |
{{{perl |
{{{#!vim perl |
sub CommonMarkup { |
... |
if ($FreeLinks) { |
-74,17 +79,164 |
그리고 이거는 별개로... <anchor(앵커이름)> 했을때 <a name="#앵커이름"> 로 치환되는데 끝에 </a> 가 더 있어야 되지 않나 싶어서... |
: |
{{{perl |
{{{#!vim perl |
sub MacroAnchor() { return "<a name=\"\#@_\"></a>"; } # 뒤에 </a> 를 붙여줌 |
}}} |
== 사용자 의견 == |
ext1.46c 에서 다시 개선됨. <nowiki>[#앵커]</nowiki> 와 같은 형태에 한글을 사용할 수 있게 함 (이것은 <a name="앵커"></a> 로 치환된다. anchor 매크로를 따로 쓸 필요가 없었군) |
: |
{{{#!vim perl |
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) { |
... |
}}} |
=== # Anchor 링크 패턴 정리 === |
* 앵커를 만드는 패턴과, 페이지 이름을 명시하지 않고 동일 페이지 내의 앵커로 이동하는 링크를 만드는 패턴 정리 |
* Jof:UseModWiki소스수정/Anchor정리""의 내용을 그대로 적용 |
* 앵커를 만드는 방법: |
** <code>[#앵커이름]</code> - "앵커이름"으로 된 앵커를 만든다. 빈 텍스트 <code>""</code>에 앵커가 만들어지므로 눈에는 안 보임 |
** <code>[#앵커이름|텍스트]</code> - "앵커이름"으로 된 앵커가, "텍스트"에 걸린다. |
** '''[#테스트2|테스트2]''' - 좌측 "테스트2"에는 테스트용 앵커가 걸려 있음. 이 앵커로 이동하는 링크 테스트는 이 페이지 하단에. |
** <code><anchor(앵커이름)></code> 매크로는 기능이 겹쳐서 필요없음. 삭제함. (이미 페이지에 anchor 매크로를 쓰신 분들은... macros/anchor.pl 을 삭제하지 않고 놔두면 됩니다. mymacros/ 디렉토리로 옮겨 두는 걸 추천) |
* 앵커로 이동하는 링크를 만드는 방법: |
** <code>[[#앵커이름]]</code> - "앵커이름"으로 이동하는 링크가, "앵커이름" 텍스트에 걸린다. |
** <code>[[#앵커이름|텍스트]]</code> - "앵커이름"으로 이동하는 링크가, "텍스트" 텍스트에 걸린다. |
관련 소스 수정: |
wiki.pl 에서 두 곳을 고쳐줌 |
{{{#!vim perl |
sub StoreHref { |
my ($anchor, $text) = @_; |
# return "<a" . &StoreRaw($anchor) . ">$text</a>"; |
return StoreRaw("<a $anchor>$text</a>"); |
} |
}}} |
{{{#!vim perl |
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; |
... |
}}} |
=== # 역링크 처리, 링크 변경 처리 === |
예를 들어 갑 페이지에 <code>[[을#앵커]]</code>란 링크가 있으면 이것을 링크로 처리해주지 못하는 문제가 있었다. |
* Local:action=links""에서 갑 페이지에 있는 링크 중 을이 없음 |
* 을 페이지의 역링크 목록에 갑이 없음 |
* 을 페이지의 이름을 병으로 바꾸었을 때 이 링크가 자동으로 수정되지 않음 |
wiki.pl 수정: (diff 형식은 [https://github.com/gypark/UseModKr/compare/38ce42e3f2...106491f Comparing 38ce42e3f2...106491f for gypark's UseModKr - GitHub]) |
{{{#!vim perl |
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"; |
} |
... |
} |
}}} |
== # 추가 업데이트 내역 == |
ext2.15 - Anchor 링크 패턴 정리. anchor 매크로 삭제 |
ext2.23b - 링크로 처리되지 않는 문제 해결 |
<mysign([[Raymundo]],2012-2-24 1:23 am)> |
== # 사용자 의견 == |
이건 개선인지 개악인지 조금 모호한 것이...원래 앵커가 절대좌표(?)로 인식되었었는데 이제 상대좌표로 걸리게 됩니다. 누군가가 중간에 앵커를 삽입하거나 삭제하면 그 뒤의 놈들은 모두 영향을 받게 되지요. :)\\ |
오래간만에 글을 남기긴 했지만 종종 들어와서 횡설수설을 읽고 간답니다. 요즘 십자군이야기를 재미있게 읽고있네요. <mysign([[거북이]],2003-6-6 3:01 pm)> |
: 안녕하세요~ 무슨 말씀인지 전혀 이해가 되지 않습니다. :-O 앵커의 상대좌표란게 뭔가요? <mysign([[Raymundo]],2003-6-6 3:31 pm)> |
<nowiki> |
예전에는 toc에서 영어로 된 놈이 타이틀로 있다면 [[PinkFloyd#Wish_You_Were_Here]]이런 식으로 절대값을 써서 앵커를 정의할 수 있었지요. 그런데 지금은 [[PinkFloyd#H_4]]이런 식으로만 가능하다는 거지요. 이러면 중간에 타이틀이 삽입될 경우 다른 경로를 가리키게 되니까요 :) |
</nowiki> <mysign([[거북이]],2003-6-9 1:21 pm)> |
: 아... 그건 이 [[/Anchor링크]]와는 관계가 없고, [[/toc매크로버그]] 때문입니다. [[/toc매크로버그]]를 다른 방법으로 고치는 것을 생각해 봐야겠군요. <mysign([[Raymundo]],2003-6-9 2:18 pm)> |
ext1.46c 에서 소스 수정 사항이 추가되었습니다. <mysign([[Raymundo]],2003-9-3 6:18 pm)> |
<longcomments(100)> |
== # 테스트용 링크 == |
* <code>[[#테스트1]]</code> : [[#테스트1]] - 이 앵커는 목차 바로 아래 "Anchor 링크 개선" 제목 앞에 숨어 있음 |
* <code>[[#테스트2|테스트2로 가는 링크]]</code> : [[#테스트2|테스트2로 가는 링크]] |
---- |
[[위키위키분류]] |
############### ### 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) { ...
[#앵커이름]
- "앵커이름"으로 된 앵커를 만든다. 빈 텍스트 ""
에 앵커가 만들어지므로 눈에는 안 보임
[#앵커이름|텍스트]
- "앵커이름"으로 된 앵커가, "텍스트"에 걸린다.
<anchor(앵커이름)>
매크로는 기능이 겹쳐서 필요없음. 삭제함. (이미 페이지에 anchor 매크로를 쓰신 분들은... macros/anchor.pl 을 삭제하지 않고 놔두면 됩니다. mymacros/ 디렉토리로 옮겨 두는 걸 추천)
[[#앵커이름]]
- "앵커이름"으로 이동하는 링크가, "앵커이름" 텍스트에 걸린다.
[[#앵커이름|텍스트]]
- "앵커이름"으로 이동하는 링크가, "텍스트" 텍스트에 걸린다.
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; ...
[[을#앵커]]
란 링크가 있으면 이것을 링크로 처리해주지 못하는 문제가 있었다.
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"; } ... }
[[#테스트1]]
: 테스트1 - 이 앵커는 목차 바로 아래 "Anchor 링크 개선" 제목 앞에 숨어 있음
[[#테스트2|테스트2로 가는 링크]]
: 테스트2로 가는 링크