2 // PukiWiki - Yet another WikiWikiWeb clone
3 // $Id: aname.inc.php,v 1.28 2011/01/25 15:01:01 henoheno Exp $
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
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>
14 // NOTE: Use 'id="key"' instead of 'name="key"' at XHTML 1.1
16 // Check ID is unique or not (compatible: no-check)
17 define('PLUGIN_ANAME_ID_MUST_UNIQUE', 0);
20 define('PLUGIN_ANAME_ID_MAX', 40);
23 define('PLUGIN_ANAME_ID_REGEX', '/^[A-Za-z][\w\-]*$/');
26 function plugin_aname_usage($convert = TRUE, $message = '')
30 return '#aname(anchorID[[,super][,full][,noid],Link title])' . '<br />';
32 return '#aname: ' . $message . '<br />';
36 return '&aname(anchorID[,super][,full][,noid]){[Link title]};';
38 return '&aname: ' . $message . ';';
44 function plugin_aname_convert()
48 if (func_num_args() < 1)
49 return plugin_aname_usage($convert);
51 return plugin_aname_tag(func_get_args(), $convert);
55 function plugin_aname_inline()
59 if (func_num_args() < 2)
60 return plugin_aname_usage($convert);
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);
66 return plugin_aname_tag($args, $convert);
69 // Aname plugin itself
70 function plugin_aname_tag($args = array(), $convert = TRUE)
73 static $_id = array();
75 if (empty($args) || $args[0] == '') return plugin_aname_usage($convert);
77 $id = array_shift($args);
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
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\')');
90 if (PLUGIN_ANAME_ID_MUST_UNIQUE && isset($_id[$id]) && ! $f_noid) {
91 return plugin_aname_usage($convert, 'ID already used: '. $id);
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: ' .
98 $_id[$id] = TRUE; // Set
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']) : '';
107 $href = ' href="' . $url . '#' . $id . '"';
108 $title = ' title="' . $id . '"';
113 return '<a class="' . $class . '"' . $attr_id . $href . $title . '>' .