OSDN Git Service

BugTrack/755: Overhaul.
authorhenoheno <henoheno>
Sat, 23 Apr 2005 14:43:19 +0000 (23:43 +0900)
committerhenoheno <henoheno>
Sat, 23 Apr 2005 14:43:19 +0000 (23:43 +0900)
* Show its usage
* Don't output meanless XHTML attributes
* Store and check ID(s) if already used or not
* Check ID length with PLUGIN_ANAME_ID_MAX (default:40)
* Added comments

plugin/aname.inc.php

index 981fdeb..2867a84 100644 (file)
 <?php
 // PukiWiki - Yet another WikiWikiWeb clone
-// $Id: aname.inc.php,v 1.17 2005/01/23 07:00:16 henoheno Exp $
+// $Id: aname.inc.php,v 1.18 2005/04/23 14:43:19 henoheno Exp $
 //
-// aname plugin - Set an anchor <a name="key"> to link
+// aname plugin - Set various anchor tag
+//   * A simple anchor <a id="key"></a>
+//   * A clickable link to the anchor <a href="#key">string</a>
+//   * Clickable anchor with the key itself <a id="key" href="#key">string</a>
+//
+// NOTE:
+//   Use 'id="key"' instead of 'name="key"' at XHTML 1.1
+
+define('PLUGIN_ANAME_ID_REGEX', '/^[A-Za-z][\w\-]*$/');
+define('PLUGIN_ANAME_ID_MAX',   40); // Max length
 
+// #aname
+function plugin_aname_convert()
+{
+       $args = func_get_args(); // Zero or more
+       return plugin_aname_tag($args);
+}
+
+// &aname;
 function plugin_aname_inline()
 {
-       $args = func_get_args();
-       return call_user_func_array('plugin_aname_convert', $args);
+       $args = func_get_args(); // ONE or more
+       return plugin_aname_tag($args, FALSE);
 }
 
-function plugin_aname_convert()
+// Show usage
+function plugin_aname_usage($convert = TRUE, $message = '')
 {
-       global $script, $vars;
+       if ($message == '') {
+               if ($convert) {
+                       return '#aname(anchorID[,super][,full][,noid][,Link title])';
+               } else {
+                       return '&amp;aname(anchorID[,super][,full][,noid])[{Link title}]';
+               }
+       } else {
+               if ($convert) {
+                       return '#aname: ' . $message;
+               } else {
+                       return '&amp;aname: ' . $message . ';';
+               }
+       }
+}
+
+// Aname plugin itself
+function plugin_aname_tag($args = array(), $convert = TRUE)
+{
+       global $vars;
+       static $_id = array();
 
-       if (func_num_args() < 1) return FALSE;
+       if (empty($args) || $args[0] == '')
+               return plugin_aname_usage($convert);
 
-       $args = func_get_args();
-       $id   = array_shift($args);
-       if (! preg_match('/^[A-Za-z][\w\-]*$/', $id)) return FALSE;
+       $id = array_shift($args);
+       if (isset($_id[$id])) {
+               return plugin_aname_usage($convert, 'ID already used: '. $id);
+       } else {
+               if (strlen($id) > PLUGIN_ANAME_ID_MAX)
+                       return plugin_aname_usage($convert, 'ID too long');
+               if (! preg_match(PLUGIN_ANAME_ID_REGEX, $id))
+                       return plugin_aname_usage($convert, 'Invalid ID string: ' .
+                               htmlspecialchars($id));
+               $_id[$id] = TRUE;
+       }
+       $id = htmlspecialchars($id); // Insurance
 
-       $body = ! empty($args) ? preg_replace('/<\/?a[^>]*>/', '', array_pop($args)) : '';
+       $body = '';
+       if (! empty($args)) {
+               if ($convert) {
+                       $body = htmlspecialchars(array_pop($args));
+               } else {
+                       $body = array_pop($args);
+               }
+       }
 
+       // Option: CSS class
        $class   = in_array('super', $args) ? 'anchor_super' : 'anchor';
-       $url     = in_array('full',  $args) ? $script . '?' . rawurlencode($vars['page']) : '';
+
+       // Option: Without id
        $attr_id = in_array('noid',  $args) ? '' : ' id="' . $id . '"';
 
-       return '<a class="' . $class . '"' . $attr_id . ' href="' . $url . '#' . $id .
-               '" title="' . $id . '">' . $body . '</a>';
+       // Option: With full(absolute) URI
+       $url     = in_array('full',  $args) ?
+               get_script_uri() . '?' . rawurlencode($vars['page']) : '';
+
+       // href and title attribute
+       if ($body != '') {
+               $href  = ' href="' . $url . '#' . $id . '"';
+               $title = ' title="' . $id . '"';
+       } else {
+               if ($attr_id == '')
+                       return plugin_aname_usage($convert, 'Meanless(No body and No id)');
+               $href = $title = '';
+       }
+
+       return '<a class="' . $class . '"' . $attr_id . $href . $title . '>' .
+               $body . '</a>';
 }
 ?>