Ignore:
Timestamp:
Apr 10, 2014, 11:26:00 PM (10 years ago)
Author:
rvelices
Message:

autocomplete allows synonims / misspellings, etc ...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • extensions/rv_autocomplete/functions.inc.php

    r28088 r28153  
    33function rvac_get_conf()
    44{
    5   global $conf;
    6   if (is_array($conf['rvac_opts']))
    7     return $conf['rvac_opts'];
    8   $conf['rvac_opts'] = unserialize($conf['rvac_opts']);
    9   return $conf['rvac_opts'];
     5        global $conf;
     6        if (is_array($conf['rvac_opts']))
     7                return $conf['rvac_opts'];
     8        $conf['rvac_opts'] = unserialize($conf['rvac_opts']);
     9        return $conf['rvac_opts'];
    1010}
    1111
    1212function rvac_save_conf($cnf)
    1313{
    14   global $conf;
    15   $conf['rvac_opts'] = $cnf;
    16   conf_update_param('rvac_opts', addslashes(serialize($conf['rvac_opts'])) );
     14        global $conf;
     15        $conf['rvac_opts'] = $cnf;
     16        conf_update_param('rvac_opts', addslashes(serialize($conf['rvac_opts'])) );
    1717}
    1818
    1919function rvac_get_url_roots()
    2020{
    21   $roots = array(
    22     'r' => get_root_url()
    23   );
    24 
    25   $url = make_index_url( array('tags'=>array( array('id'=>123,'name'=>123,'url_name'=>123))) );
    26   $url = substr($url, 0, strpos($url, '123'));
    27   $roots['t'] = $url;
    28 
    29   $url = make_index_url( array('category'=>array('id'=>123,'name'=>123,'permalink'=>123)) );
    30   $url = substr($url, 0, strpos($url, '123'));
    31   $roots['a'] = $url;
    32  
    33   return $roots;
     21        $roots = array(
     22                'r' => get_root_url()
     23        );
     24
     25        $url = make_index_url( array('tags'=>array( array('id'=>123,'name'=>123,'url_name'=>123))) );
     26        $url = substr($url, 0, strpos($url, '123'));
     27        $roots['t'] = $url;
     28
     29        $url = make_index_url( array('category'=>array('id'=>123,'name'=>123,'permalink'=>123)) );
     30        $url = substr($url, 0, strpos($url, '123'));
     31        $roots['a'] = $url;
     32
     33        return $roots;
    3434}
    3535
     
    3737function rvac_normalize($name)
    3838{
    39   $invalid = '&().,-';
    40   $name = strtr($name, $invalid, str_repeat(' ', strlen($invalid)));
    41   $name = transliterate($name);
    42   for($i=0; $i<3; $i++)
    43     $name = str_replace('  ', ' ', $name);
    44   return $name;
     39        $invalid = '&().,-';
     40        $name = strtr($name, $invalid, str_repeat(' ', strlen($invalid)));
     41        $name = transliterate($name);
     42        for($i=0; $i<3; $i++)
     43                $name = str_replace('  ', ' ', $name);
     44        return $name;
    4545}
    4646
    4747function rvac_get_elem($item, $key)
    4848{
    49   $l = $item['names'][$key];
    50   $q = $item['q_names'][$key];
    51   $ret = array(
    52     'label' => $l,
    53     'value' => $item['url'],
    54     );
    55   if ($q != strtolower($l))
    56     $ret['q'] = $q;
     49        $l = $item['names'][$key];
     50        $q = $item['q_names'][$key];
     51        $ret = array(
     52                'label' => $l,
     53                'value' => $item['url'],
     54                );
     55        if ($q != strtolower($l))
     56                $ret['q'] = $q;
    5757        if ($item['counter'] > 0)
    5858                $ret['w'] = intval($item['counter']);
    59   return $ret;
     59        return $ret;
    6060}
    6161
    6262function rvac_get_index()
    6363{
    64   global $user;
    65 
    66   $rvac_conf = rvac_get_conf();
    67   $root_url = get_root_url();
    68   $items = array();
    69 
    70   $roots = rvac_get_url_roots();
    71 
    72 
    73   $query = 'SELECT id,name FROM '.TAGS_TABLE;
    74   if ( !empty($rvac_conf['excluded_tags']) )
    75     $query .= ' WHERE id NOT IN ('.implode(',',$rvac_conf['excluded_tags']).')';
    76   $tag_names = query2array($query, 'id','name');
    77 
    78   $url_len = strlen( $roots['t'] );
    79   foreach( get_available_tags() as $row)
    80   {
    81     if (!isset($tag_names[$row['id']])) continue;
    82     $row['type'] = 't';
    83     $row['url'] = '$t/' . substr( make_index_url( array('tags'=>array($row)) ), $url_len);
    84     $row['name'] = $tag_names[ $row['id'] ];
    85     $items[] = $row;
    86   }
    87 
    88 
    89   $query = 'SELECT id,name,permalink,nb_images AS counter
    90   FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.'
    91   ON id = cat_id AND user_id = '.$user['id'];
    92   if ( !empty($rvac_conf['excluded_albums']) )
    93     $query .= ' WHERE id NOT IN ('.implode(',',$rvac_conf['excluded_albums']).')';
    94 
    95   $url_len = strlen( $roots['a'] );
    96 
    97   $result = pwg_query($query);
    98   while ($row = pwg_db_fetch_assoc($result))
    99   {
    100     $row['type'] = 'a';
    101     $row['url'] = '$a/' . substr( make_index_url( array('category'=>$row) ), $url_len);
    102     $items[] = $row;
    103   }
    104 
    105   $query = 'SELECT name,counter,url FROM '.RVAC_SUGGESTIONS.' WHERE level<='.$user['level'];
    106   $result = pwg_query($query);
    107   while ($row = pwg_db_fetch_assoc($result))
    108   {
    109     $row['type'] = 's';
    110     if (empty($row['url']))
    111       $row['url'] = -1; // special use in js to submit form (cannot put 0 because jquery ui tests often item.value)
    112     $items[] = $row;
    113   }
    114 
    115   array_walk($items, function(&$obj) {
    116     $alt_names = trigger_event('get_tag_alt_names', array(), $obj['name']);
    117 
    118     if (empty($alt_names))
    119       $alt_names['default'] = $obj['name'];
    120     else
    121     {
    122       if (!isset($alt_names['default']) && isset($alt_names[0]))
    123       {
    124         $alt_names['default'] = $alt_names[0];
    125         unset($alt_names[0]);
    126       }
    127     }
    128 
    129     $obj['names'] = $alt_names;
    130     if ('s' !== $obj['type'])
    131     {
    132       $obj['q_names'] = $alt_names;
    133       foreach ($obj['q_names'] as &$q)
    134       {
    135         $q = rvac_normalize($q);
    136       }
    137     }
    138     else
    139     {
    140       foreach ($obj['names'] as $l => &$name)
    141       {
    142         $pos = strpos($name, '\\');
    143         if ($pos === false)
    144         {
    145           $q = rvac_normalize($name);
    146         }
    147         else
    148         {
    149           $q = substr($name, 0, $pos);
    150           if (-1 === $obj['url'] && 'default'==$l)
    151           {
    152             $obj['url'] = 'q='.$q;
    153           }
    154           $q = rvac_normalize($q);
    155           $name = substr_replace($name, '', $pos, 1);
    156         }
    157         $obj['q_names'][$l] = $q;
    158       }
    159     }
    160 
    161   });
    162 
    163   $type_order = array_flip( array('t','a','s') );
    164   usort($items, function($a, $b) use($type_order) {
    165     $d = $a['counter']-$b['counter'];
    166     if ($d) return -$d;
    167     $d = $type_order[$a['type']] - $type_order[$b['type']];
    168     if ($d) return $d;
    169     return strcmp($a['q_names']['default'],$b['q_names']['default']);
    170   });
    171 
    172   //var_export($items);
    173   $res = array();
    174   $res_alt = array();
    175   $lang = substr($user['language'],0,2);
    176   array_walk($items, function(&$obj) use($lang, &$res, &$res_alt) {
    177     $key = $lang;
    178     if (empty($obj['q_names'][$key]))
    179       $key = 'default';
    180     if (!empty($obj['q_names'][$key]))
    181       $res[] = rvac_get_elem($obj, $key);
    182     else
    183       $key = null;
    184     if ($key !== null) {
    185       foreach( array_keys($obj['q_names']) as $k) {
    186         if ($k==$key) continue;
    187         if (strncmp($obj['q_names'][$key],$obj['q_names'][$k],4)==0) continue;
    188         $res_alt[] = rvac_get_elem($obj, $k);
    189       }
    190     }
    191     else {
    192       foreach( $obj['q_names'] as $k => $q)
    193       {
    194         if (!empty($q))
    195           $res_alt[] = rvac_get_elem($obj, $k);
    196       }
    197     }
    198   });
    199 
    200   return array(
    201       'total' => count($res) + count($res_alt),
    202       'altLangIndex' => count($res),
    203       'src' => array_merge($res, $res_alt),
    204       'roots' => $roots
    205     );
     64        global $user;
     65
     66        $rvac_conf = rvac_get_conf();
     67        $root_url = get_root_url();
     68        $items = array();
     69
     70        $roots = rvac_get_url_roots();
     71
     72
     73        $query = 'SELECT id,name FROM '.TAGS_TABLE;
     74        if ( !empty($rvac_conf['excluded_tags']) )
     75                $query .= ' WHERE id NOT IN ('.implode(',',$rvac_conf['excluded_tags']).')';
     76        $tag_names = query2array($query, 'id','name');
     77
     78        $url_len = strlen( $roots['t'] );
     79        foreach( get_available_tags() as $row)
     80        {
     81                if (!isset($tag_names[$row['id']])) continue;
     82                $row['type'] = 't';
     83                $row['url'] = '$t/' . substr( make_index_url( array('tags'=>array($row)) ), $url_len);
     84                $row['name'] = $tag_names[ $row['id'] ];
     85                $items[] = $row;
     86        }
     87
     88
     89        $query = 'SELECT id,name,permalink,nb_images AS counter
     90        FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.'
     91        ON id = cat_id AND user_id = '.$user['id'];
     92        if ( !empty($rvac_conf['excluded_albums']) )
     93                $query .= ' WHERE id NOT IN ('.implode(',',$rvac_conf['excluded_albums']).')';
     94
     95        $url_len = strlen( $roots['a'] );
     96
     97        $result = pwg_query($query);
     98        while ($row = pwg_db_fetch_assoc($result))
     99        {
     100                $row['type'] = 'a';
     101                $row['url'] = '$a/' . substr( make_index_url( array('category'=>$row) ), $url_len);
     102                $items[] = $row;
     103        }
     104
     105        $query = 'SELECT name,counter,url FROM '.RVAC_SUGGESTIONS.' WHERE level<='.$user['level'];
     106        $result = pwg_query($query);
     107        while ($row = pwg_db_fetch_assoc($result))
     108        {
     109                $row['type'] = 's';
     110                if (empty($row['url']))
     111                        $row['url'] = -1; // special use in js to submit form (cannot put 0 because jquery ui tests often item.value)
     112                $items[] = $row;
     113        }
     114
     115        array_walk($items, function(&$obj) {
     116                $alt_names = trigger_event('get_tag_alt_names', array(), $obj['name']);
     117
     118                if (empty($alt_names))
     119                        $alt_names['default'] = $obj['name'];
     120                else
     121                {
     122                        if (!isset($alt_names['default']) && isset($alt_names[0]))
     123                        {
     124                                $alt_names['default'] = $alt_names[0];
     125                                unset($alt_names[0]);
     126                        }
     127                }
     128
     129                $obj['names'] = $alt_names;
     130                if ('s' !== $obj['type'])
     131                {
     132                        $obj['q_names'] = $alt_names;
     133                        foreach ($obj['q_names'] as &$q)
     134                        {
     135                                $q = rvac_normalize($q);
     136                        }
     137                }
     138                else
     139                {
     140                        foreach ($obj['names'] as $l => &$name)
     141                        {
     142                                $pos = strpos($name, '\\');
     143                                if ($pos === false)
     144                                {
     145                                        $q = rvac_normalize($name);
     146                                }
     147                                else
     148                                {
     149                                        $q = substr($name, 0, $pos);
     150                                        if (-1 === $obj['url'] && 'default'==$l)
     151                                        {
     152                                                $obj['url'] = 'q='.$q;
     153                                        }
     154                                        $q = rvac_normalize($q);
     155                                        $name = substr_replace($name, '', $pos, 1);
     156                                }
     157                                $obj['q_names'][$l] = $q;
     158                        }
     159                }
     160
     161        });
     162
     163        $type_order = array_flip( array('t','a','s') );
     164        usort($items, function($a, $b) use($type_order) {
     165                $d = $a['counter']-$b['counter'];
     166                if ($d) return -$d;
     167                $d = $type_order[$a['type']] - $type_order[$b['type']];
     168                if ($d) return $d;
     169                return strcmp($a['q_names']['default'],$b['q_names']['default']);
     170        });
     171
     172        //var_export($items);
     173        $res = array();
     174        $res_alt = array();
     175        $lang = substr($user['language'],0,2);
     176        array_walk($items, function(&$obj) use($lang, &$res, &$res_alt) {
     177                $key = $lang;
     178                if (empty($obj['q_names'][$key]))
     179                        $key = 'default';
     180                if (!empty($obj['q_names'][$key]))
     181                        $res[] = rvac_get_elem($obj, $key);
     182                else
     183                        $key = null;
     184                if ($key !== null) {
     185                        foreach( array_keys($obj['q_names']) as $k) {
     186                                if ($k==$key) continue;
     187                                if (strncmp($obj['q_names'][$key],$obj['q_names'][$k],4)==0) continue;
     188                                $res_alt[] = rvac_get_elem($obj, $k);
     189                        }
     190                }
     191                else {
     192                        foreach( $obj['q_names'] as $k => $q)
     193                        {
     194                                if (!empty($q))
     195                                        $res_alt[] = rvac_get_elem($obj, $k);
     196                        }
     197                }
     198        });
     199
     200        return array(
     201                        'total' => count($res) + count($res_alt),
     202                        'altLangIndex' => count($res),
     203                        'src' => array_merge($res, $res_alt),
     204                        'roots' => $roots
     205                );
     206}
     207
     208function rvac_on_qsearch_expression_parsed($expr)
     209{
     210        global $conf;
     211        $file=PHPWG_ROOT_PATH.$conf['data_location'].'tmp/autocomplete_variants.dat';
     212        $data = @unserialize( file_get_contents($file));
     213        if ($data === false)
     214                return;
     215
     216        $rmap = $data['replace'];
     217        $amap = $data['add'];
     218        foreach ($expr->stokens as $token)
     219        {
     220                if (isset($token->scope) && !$token->scope->is_text)
     221                        continue;
     222                if ($token->modifier & (QST_QUOTED|QST_WILDCARD))
     223                        continue;
     224
     225                $all = array_merge( array($token->term), $token->variants);
     226
     227                $in = $all[0];
     228                $in_t = transliterate($in);
     229                if (isset($rmap[$in_t]))
     230                {
     231                        $all = $rmap[$in_t];
     232                        foreach ($all as &$one)
     233                        {
     234                                if ('$i' == $one)
     235                                        $one = $in;
     236                        }
     237                        unset($one);
     238                }
     239
     240                $in_list = $processed = array();
     241                for ($i=0; $i<count($all); $i++)
     242                {
     243                        $in = $all[$i];
     244                        $in_t = transliterate($in);
     245
     246                        if (isset($in_list[$in_t]))
     247                        {
     248                                array_splice($all, $i, 1);
     249                                $i--;
     250                                continue;
     251                        }
     252
     253                        if (isset($processed[$in_t]))
     254                                continue;
     255                        $processed[$in_t] = 1;
     256
     257                        if (isset($amap[$in_t]))
     258                        {
     259                                array_splice($all, $i, 0, $amap[$in_t]);
     260                        }
     261                }
     262
     263                $token->term = array_shift($all);
     264                $token->variants = $all;
     265        }
    206266}
    207267?>
Note: See TracChangeset for help on using the changeset viewer.