-
- 1. Anchor 링크 개선
-
-
- 1.1. 한글 앵커 지원
-
- 1.2. Anchor 링크 패턴 정리
-
- 1.3. 역링크 처리, 링크 변경 처리
-
2. 추가 업데이트 내역
-
- 3. 사용자 의견
-
- 4. 테스트용 링크
-
1. Anchor 링크 개선
1.1. 한글 앵커 지원
- "페이지이름#앵커" 에서, 페이지 이름이 한글일 때나 앵커가 한글일 경우 동작하지 않는 문제를 해결
- Bab2님의 패치를 적용
- 필수 요구 사항: 없음
- 선택 요구 사항: 없음
- 부작용 : 모름
- 각종 링크 패턴들을 치환하는 루틴이 오리지널 버전에서 K3 로 넘어오면서 많이 바뀌었는데, 그 와중에 링크들이 뭔가 일관성이 없게 걸리는 것 같은 느낌을 받는다.. 뭐 쓰는 데에 지장없으니 통과.
- wiki.pl 에서
use vars qw(%RevisionTs $FS_lt $FS_gt $StartTime $Sec_Revision $Sec_Ts
$ViewCount $AnchoredFreeLinkPattern);
-
sub InitLinkPatterns {
...
$QDelim = '(?:"")?';
$AnchoredLinkPattern = $LinkPattern . '#([0-9A-Za-z\xa0-\xff]+)' . $QDelim if $NamedAnchors;
$LinkPattern .= $QDelim;
...
$FreeLinkPattern .= $QDelim;
$AnchoredFreeLinkPattern = $FreeLinkPattern . '#([0-9A-Za-z\xa0-\xff]+)' . $QDelim if $NamedAnchors;
...
}
-
sub CommonMarkup {
...
if ($FreeLinks) {
s/\[\[$FreeLinkPattern\|([^\]]+)\]\]/&StorePageOrEditLink($1, $2)/geo;
s/\[\[$FreeLinkPattern\]\]/&StorePageOrEditLink($1, "")/geo;
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>"; }
ext1.46c 에서 다시 개선됨. [#앵커] 와 같은 형태에 한글을 사용할 수 있게 함 (이것은 <a name="앵커"></a> 로 치환된다. anchor 매크로를 따로 쓸 필요가 없었군)
-
sub CommonMarkup {
...
s/\&__LT__;code\&__GT__;((.|\n)*?)\&__LT__;\/code\&__GT__;/&StorePre($1, "code")/ige;
s/\[\#([0-9A-Za-z\xa0-\xff]+)\]/&StoreHref(" name=\"$1\"")/ge if $NamedAnchors;
if ($HtmlTags) {
...
1.2. Anchor 링크 패턴 정리
- 앵커를 만드는 방법:
-
[#앵커이름]
- "앵커이름"으로 된 앵커를 만든다. 빈 텍스트 ""
에 앵커가 만들어지므로 눈에는 안 보임
-
[#앵커이름|텍스트]
- "앵커이름"으로 된 앵커가, "텍스트"에 걸린다.
- 테스트2 - 좌측 "테스트2"에는 테스트용 앵커가 걸려 있음. 이 앵커로 이동하는 링크 테스트는 이 페이지 하단에.
-
<anchor(앵커이름)>
매크로는 기능이 겹쳐서 필요없음. 삭제함. (이미 페이지에 anchor 매크로를 쓰신 분들은... macros/anchor.pl 을 삭제하지 않고 놔두면 됩니다. mymacros/ 디렉토리로 옮겨 두는 걸 추천)
- 앵커로 이동하는 링크를 만드는 방법:
-
[[#앵커이름]]
- "앵커이름"으로 이동하는 링크가, "앵커이름" 텍스트에 걸린다.
-
[[#앵커이름|텍스트]]
- "앵커이름"으로 이동하는 링크가, "텍스트" 텍스트에 걸린다.
관련 소스 수정:
wiki.pl 에서 두 곳을 고쳐줌
sub StoreHref {
my ($anchor, $text) = @_;
return StoreRaw("<a $anchor>$text</a>");
}
sub CommonMarkup {
...
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. 역링크 처리, 링크 변경 처리
예를 들어 갑 페이지에 [[을#앵커]]
란 링크가 있으면 이것을 링크로 처리해주지 못하는 문제가 있었다.
- action=links에서 갑 페이지에 있는 링크 중 을이 없음
- 을 페이지의 역링크 목록에 갑이 없음
- 을 페이지의 이름을 병으로 바꾸었을 때 이 링크가 자동으로 수정되지 않음
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) {
$text =~ s/(\[$UrlPattern\s+([^\]]+?)\])/&StoreRaw($1)/geo;
...
}
sub SubFreeLink {
+ my ($link, $name, $old, $new, $anchor) = @_;
my ($oldlink);
$oldlink = $link;
...
$link = $oldlink;
}
$link = "[[$link";
if ( defined $anchor and $anchor ne '' ) {
$link .= "#$anchor";
}
if ($name ne "") {
$link .= "|$name";
}
...
}
2. 추가 업데이트 내역
ext2.15 - Anchor 링크 패턴 정리. anchor 매크로 삭제
ext2.23b - 링크로 처리되지 않는 문제 해결
3. 사용자 의견
이건 개선인지 개악인지 조금 모호한 것이...원래 앵커가 절대좌표(?)로 인식되었었는데 이제 상대좌표로 걸리게 됩니다. 누군가가 중간에 앵커를 삽입하거나 삭제하면 그 뒤의 놈들은 모두 영향을 받게 되지요. :)
오래간만에 글을 남기긴 했지만 종종 들어와서 횡설수설을 읽고 간답니다. 요즘 십자군이야기를 재미있게 읽고있네요.
- 안녕하세요~ 무슨 말씀인지 전혀 이해가 되지 않습니다. :-O 앵커의 상대좌표란게 뭔가요?
예전에는 toc에서 영어로 된 놈이 타이틀로 있다면 [[PinkFloyd#Wish_You_Were_Here]]이런 식으로 절대값을 써서 앵커를 정의할 수 있었지요. 그런데 지금은 [[PinkFloyd#H_4]]이런 식으로만 가능하다는 거지요. 이러면 중간에 타이틀이 삽입될 경우 다른 경로를 가리키게 되니까요 :)
- 아... 그건 이 /Anchor링크와는 관계가 없고, /toc매크로버그 때문입니다. /toc매크로버그를 다른 방법으로 고치는 것을 생각해 봐야겠군요.
ext1.46c 에서 소스 수정 사항이 추가되었습니다.
4. 테스트용 링크
-
[[#테스트1]]
: 테스트1 - 이 앵커는 목차 바로 아래 "Anchor 링크 개선" 제목 앞에 숨어 있음
-
[[#테스트2|테스트2로 가는 링크]]
: 테스트2로 가는 링크
위키위키분류