OSDN Git Service

BugTrack/2484 AutoTicketLink for JIRA: Support underscore key XX_X
[pukiwiki/pukiwiki.git] / plugin / aname.inc.php
1 <?php
2 // PukiWiki - Yet another WikiWikiWeb clone
3 // $Id: aname.inc.php,v 1.28 2011/01/25 15:01:01 henoheno Exp $
4 // Copyright (C)
5 //   2002-2005 PukiWiki Developers Team
6 //   2001-2002 Originally written by yu-ji
7 // License: GPL v2 or (at your option) any later version
8 //
9 // aname plugin - Set various anchor tags
10 //   * With just an anchor id: <a id="key"></a>
11 //   * With a hyperlink to the anchor id: <a href="#key">string</a>
12 //   * With an anchor id and a link to the id itself: <a id="key" href="#key">string</a>
13 //
14 // NOTE: Use 'id="key"' instead of 'name="key"' at XHTML 1.1
15
16 // Check ID is unique or not (compatible: no-check)
17 define('PLUGIN_ANAME_ID_MUST_UNIQUE', 0);
18
19 // Max length of ID
20 define('PLUGIN_ANAME_ID_MAX',   40);
21
22 // Pattern of ID
23 define('PLUGIN_ANAME_ID_REGEX', '/^[A-Za-z][\w\-]*$/');
24
25 // Show usage
26 function plugin_aname_usage($convert = TRUE, $message = '')
27 {
28         if ($convert) {
29                 if ($message == '') {
30                         return '#aname(anchorID[[,super][,full][,noid],Link title])' . '<br />';
31                 } else {
32                         return '#aname: ' . $message . '<br />';
33                 }
34         } else {
35                 if ($message == '') {
36                         return '&amp;aname(anchorID[,super][,full][,noid]){[Link title]};';
37                 } else {
38                         return '&amp;aname: ' . $message . ';';
39                 }
40         }
41 }
42
43 // #aname
44 function plugin_aname_convert()
45 {
46         $convert = TRUE;
47
48         if (func_num_args() < 1)
49                 return plugin_aname_usage($convert);
50
51         return plugin_aname_tag(func_get_args(), $convert);
52 }
53
54 // &aname;
55 function plugin_aname_inline()
56 {
57         $convert = FALSE;
58
59         if (func_num_args() < 2)
60                 return plugin_aname_usage($convert);
61
62         $args = func_get_args(); // ONE or more
63         $body = strip_htmltag(array_pop($args), FALSE); // Strip anchor tags only
64         array_push($args, $body);
65
66         return plugin_aname_tag($args, $convert);
67 }
68
69 // Aname plugin itself
70 function plugin_aname_tag($args = array(), $convert = TRUE)
71 {
72         global $vars;
73         static $_id = array();
74
75         if (empty($args) || $args[0] == '') return plugin_aname_usage($convert);
76
77         $id = array_shift($args);
78         $body = '';
79         if (! empty($args)) $body = array_pop($args);
80         $f_noid  = in_array('noid',  $args); // Option: Without id attribute
81         $f_super = in_array('super', $args); // Option: CSS class
82         $f_full  = in_array('full',  $args); // Option: With full(absolute) URI
83
84         if ($body == '') {
85                 if ($f_noid)  return plugin_aname_usage($convert, 'Meaningless(No link-title with \'noid\')');
86                 if ($f_super) return plugin_aname_usage($convert, 'Meaningless(No link-title with \'super\')');
87                 if ($f_full)  return plugin_aname_usage($convert, 'Meaningless(No link-title with \'full\')');
88         }
89
90         if (PLUGIN_ANAME_ID_MUST_UNIQUE && isset($_id[$id]) && ! $f_noid) {
91                 return plugin_aname_usage($convert, 'ID already used: '. $id);
92         } else {
93                 if (strlen($id) > PLUGIN_ANAME_ID_MAX)
94                         return plugin_aname_usage($convert, 'ID too long');
95                 if (! preg_match(PLUGIN_ANAME_ID_REGEX, $id))
96                         return plugin_aname_usage($convert, 'Invalid ID string: ' .
97                                 htmlsc($id));
98                 $_id[$id] = TRUE; // Set
99         }
100
101         if ($convert) $body = htmlsc($body);
102         $id = htmlsc($id); // Insurance
103         $class   = $f_super ? 'anchor_super' : 'anchor';
104         $attr_id = $f_noid  ? '' : ' id="' . $id . '"';
105         $url     = $f_full  ? get_page_uri($vars['page']) : '';
106         if ($body != '') {
107                 $href  = ' href="' . $url . '#' . $id . '"';
108                 $title = ' title="' . $id . '"';
109         } else {
110                 $href = $title = '';
111         }
112
113         return '<a class="' . $class . '"' . $attr_id . $href . $title . '>' .
114                 $body . '</a>';
115 }
116