Subversion Repositories oidplus

Rev

Blame | Last modification | View Log | RSS feed

  1. <?php
  2.  
  3. # if (!interface_exists('VolcanoSearchProvider')) throw new Exception('Required interface "VolcanoSearchProvider" not found.');
  4. # if (!class_exists('VolcanoDB')) throw new Exception('Required class "VolcanoDB" not found.');
  5.  
  6. require_once __DIR__ . '/../../core/VolcanoSearchProvider.class.php';
  7.  
  8. class VolcanoSearchDomain implements VolcanoSearchProvider {
  9.         public static function checkId($id) {
  10.                 return self::strEqual($id, 'domain', true); // is always case insensitive
  11.         }
  12.  
  13.         protected static function tryNormalize($term) {
  14.                 // TODO: also validate syntax
  15.                 $ary = explode(':', $term);
  16.                 $term = $ary[0];
  17.                 if (substr($term, -1, 1) != '.') $term .= '.';
  18.                 return $term;
  19.         }
  20.  
  21.         public static function calcDistance($candidate, $searchterm) {
  22.                 // TODO: punycode?
  23.  
  24.                 $candidate  = self::tryNormalize($candidate);
  25.                 $searchterm = self::tryNormalize($searchterm);
  26.  
  27.                 if (strlen($candidate) <= strlen($searchterm)) {
  28.                         $cmp = substr($searchterm, strlen($searchterm)-strlen($candidate));
  29.                         if (!self::strEqual($cmp, $candidate, true)) return false;
  30.  
  31.                         $subdoms = substr($searchterm, 0, strlen($searchterm)-strlen($candidate));
  32.                         return substr_count($subdoms, '.');
  33.                 } else {
  34.                         $cmp = substr($candidate, strlen($candidate)-strlen($searchterm));
  35.                         if (!self::strEqual($cmp, $searchterm, true)) return false;
  36.  
  37.                         $too_specific = substr($candidate, 0, strlen($candidate)-strlen($searchterm));
  38.                         return -substr_count($too_specific, '.');
  39.                 }
  40.         }
  41.  
  42.         protected static function strEqual($str1, $str2, $caseInsensitive = false) {
  43.                 if ($caseInsensitive) {
  44.                         return strtolower($str1) == strtolower($str2);
  45.                 } else {
  46.                         return $str1 == $str2;
  47.                 }
  48.         }
  49. }
  50.  
  51. require_once __DIR__ . '/../../core/1_VolcanoDB.class.php';
  52. VolcanoDB::registerSearchProvider(new VolcanoSearchDomain());
  53.  
  54. # --- TEST
  55.  
  56. /*
  57. $x = new VolcanoSearchDomain();
  58. assert($x->calcDistance('de.',                  'viathinksoft.DE.') ==  1);
  59. assert($x->calcDistance('de.',                  'viathinksoft.de.') ==  1);
  60. assert($x->calcDistance('viathinksoft.de.',     'viathinksoft.de.') ==  0);
  61. assert($x->calcDistance('viathinksoft.DE.',     'viathinksoft.de.') ==  0);
  62. assert($x->calcDistance('www.viathinksoft.de.', 'viathinksoft.de.') == -1);
  63.  
  64. assert($x->calcDistance('de.',                  'viathinksoft.xx.') === false);
  65. assert($x->calcDistance('viathinksoft.de.',     'viathinksoft.xx.') === false);
  66. assert($x->calcDistance('www.viathinksoft.de.', 'viathinksoft.xx.') === false);
  67. */
  68.