이 예제는 <index(Perl)>로 만들어진 <index(UseModWiki)>에다가 색인 기능을 넣는 것입니다. 줄여서 <index(UseModWiki:::유즈모드)>라고도 부르는 <index(UseModWiki:::유즈모드위키)>는 참 좋군요. <index(펄)>과 <index(Perl:::펄)>의 차이를 아시겠나요?
줄여서 유즈모드(3)라고도 부르는 유즈모드위키(4)는 참 좋군요.
애초에 색인을 달아야 할 정도로 한 페이지를 길게 쓸 일이 얼마나 있을까 싶다. :-) 거의 Perl/정규표현식 때문에 만든 것이라...
use strict; my $MyIndexCounter; my %MyIndexHash; # %MyIndexHash is "hash of hash of array" # %MyIndexHash = ( # "word1" => { # "word1" => [ num1 link, num2 link ], <-- <index(word1)> or <index(word1:::word1)> # "alias1" => [ num1 link, num2 link, num3 link ], <-- <index(word1:::alias1)> # "alias2" => [ num1 link ], # }, # "word2" => { # ... # }, # ... # ) sub index { my ($txt) = @_; my $index; $MyIndexCounter = 0; $txt =~ s/&__LT__;(?:index|ix)\((.+?)\)&__GT__;/&MacroIndex($1)/gei; return if ($MyIndexCounter == 0); $index = "<DIV class='wordindex'>"; $index .= &T('Index:')."<BR>"; my $tablecolumn = 4; # 한 행에 4열 my $column = 0; $index .= "<TABLE style='border:none; width=100%;' width='100%'>"; foreach my $key (sort {(lc($a) cmp lc($b)) || ($a cmp $b)} keys %MyIndexHash) { $column++; $column = 1 if ($column > $tablecolumn); $index .= "<TR>" if ($column == 1); $index .= "<TD style='vertical-align:top; border:none; border-top:1px solid gray; padding: 10px'>"; # main keyword $index .= "$key "; $index .= join(', ', @{$MyIndexHash{"$key"}{"$key"}}) if defined @{$MyIndexHash{"$key"}{"$key"}}; # aliases foreach my $aliaskey (sort {(lc($a) cmp lc($b)) || ($a cmp $b)} keys %{$MyIndexHash{"$key"}}) { next if ($aliaskey eq $key); $index .= "<BR> $aliaskey "; $index .= join(', ', @{$MyIndexHash{"$key"}{"$aliaskey"}}); } $index .= "</TD>"; $index .= "</TR>" if ($column == $tablecolumn); } while ($column != $tablecolumn) { $column++; $index .= "<TD style='border:none;'> </TD>"; } $index .= "</TABLE>"; $index .= "</DIV>"; $txt .= $index; return $txt; } sub MacroIndex { my ($word) = @_; my $txt; my ($key, $pword); $word = &RemoveLink($word); if ($word =~ /^(.+):::(.+)$/) { ($key, $pword) = ($1, $2); } else { $key = $word; $pword = $word; } # 본문 하단에 출력될 인덱스 화면을 위해 저장 $MyIndexCounter++; push @{$MyIndexHash{"$key"}{"$pword"}}, "<A class='wordindex' name='INDEX_$MyIndexCounter' href='#INDEXR_$MyIndexCounter'>$MyIndexCounter</A>"; # 매크로 있던 곳에 치환된 링크 $txt = "<A class='wordindex' name='INDEXR_$MyIndexCounter' href='#INDEX_$MyIndexCounter'>". $pword. "</A>". "<SPAN class='wordindex'>($MyIndexCounter)</SPAN>"; return $txt; } 1;
/* index */ DIV.wordindex { background-color: transparent; border-top:1px solid silver; padding:5px; } A.wordindex:link, A.wordindex:active, A.wordindex:visited, A.wordindex:hover { background: transparent; color: maroon; text-decoration: none; } A.wordindex:hover { text-decoration: underline; }
ext1.111c 에서 추가된 부분. 이게 있어야 화면에 "(색인번호)"가 출력되지 않는다.
SPAN.wordindex { font-size: 80%; vertical-align: sub; display: none; }
A.wordindex:link, A.wordindex:active, A.wordindex:visited, A.wordindex:hover { color: black; } SPAN.wordindex { display: inline; }
Index: 찾아보기:
ext1.111c
ext2rc6
ext2.10a