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/admin/functions.inc.php

    r27564 r28153  
    33function rvac_invalidate_cache()
    44{
    5   global $conf;
    6   conf_update_param('rvac_version', ++$conf['rvac_version'] );
    7   if (rand()%10==0)
    8   {
    9     foreach (glob(PHPWG_ROOT_PATH.PWG_COMBINED_DIR.'acds-*.js') as $file)
    10       @unlink($file);
    11   }
     5        global $conf;
     6        conf_update_param('rvac_version', ++$conf['rvac_version'] );
     7        if (rand()%10==0)
     8        {
     9                foreach (glob(PHPWG_ROOT_PATH.PWG_COMBINED_DIR.'acds-*.js') as $file)
     10                        @unlink($file);
     11        }
    1212}
    1313
    1414function rvac_custom_link(&$suggestion, $roots)
    1515{
    16   $url = $suggestion['url'];
    17   if (empty($url))
    18   {
    19     $q = $suggestion['name'];
    20     if ( ($pos=strpos($q,'\\')) !== false )
    21     {
    22       $q = substr($q, 0, $pos);
    23     }
    24   }
    25   elseif (strncmp($url,'q=',2)==0)
    26   {
    27     $q = substr($url,2);
    28   }
    29   else
    30   {
    31     foreach( $roots as $k => $root)
    32       $url = str_replace('$'.$k.'/', $root, $url);
    33   }
    34 
    35   if (isset($q))
    36   {
    37     if ( ($pos=strpos($q,' ')) !== false )
    38     {
    39       $q = '"'.$q.'"';
    40     }
    41     $url = get_root_url().'qsearch.php?q='.rawurlencode($q);
    42   }
    43 
    44   $suggestion['U_LINK'] = $url;
    45   return $suggestion;
     16        $url = $suggestion['url'];
     17        if (empty($url))
     18        {
     19                $q = $suggestion['name'];
     20                if ( ($pos=strpos($q,'\\')) !== false )
     21                {
     22                        $q = substr($q, 0, $pos);
     23                }
     24        }
     25        elseif (strncmp($url,'q=',2)==0)
     26        {
     27                $q = substr($url,2);
     28        }
     29        else
     30        {
     31                foreach( $roots as $k => $root)
     32                        $url = str_replace('$'.$k.'/', $root, $url);
     33        }
     34
     35        if (isset($q))
     36        {
     37                if ( ($pos=strpos($q,' ')) !== false )
     38                {
     39                        $q = '"'.$q.'"';
     40                }
     41                $url = get_root_url().'qsearch.php?q='.rawurlencode($q);
     42        }
     43
     44        $suggestion['U_LINK'] = $url;
     45        return $suggestion;
    4646}
    4747
     
    4949{
    5050        global $conf;
    51   $srv = $srv_arr[0];
    52   include_once( dirname(__FILE__).'/../functions.inc.php' );
    53   $srv->addMethod('rvac.addCustom', 'rv_ac_ws_add_custom_suggestion',
    54     array(
     51        $srv = $srv_arr[0];
     52        include_once( dirname(__FILE__).'/../functions.inc.php' );
     53        $srv->addMethod('rvac.addCustom', 'rv_ac_ws_add_custom_suggestion',
     54                array(
    5555                        'name' => array(),
    5656                        'counter' => array('default'=>0),
    5757                        'url' => array('default'=>''),
    5858                        'level' => array('default'=>min($conf['available_permission_levels']), 'maxValue'=>max($conf['available_permission_levels']),'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
    59     ),
    60     '','', array('admin_only'=>true, 'post_only'=>true));
    61 
    62   $srv->addMethod('rvac.modCustom', 'rv_ac_ws_mod_custom_suggestion',
    63     array(
    64       'id' => array(),
    65       'name' => array('flags' => WS_PARAM_OPTIONAL),
    66       'counter' => array('flags' => WS_PARAM_OPTIONAL),
    67       'url' => array('flags' => WS_PARAM_OPTIONAL),
     59                ),
     60                '','', array('admin_only'=>true, 'post_only'=>true));
     61
     62        $srv->addMethod('rvac.modCustom', 'rv_ac_ws_mod_custom_suggestion',
     63                array(
     64                        'id' => array(),
     65                        'name' => array('flags' => WS_PARAM_OPTIONAL),
     66                        'counter' => array('flags' => WS_PARAM_OPTIONAL),
     67                        'url' => array('flags' => WS_PARAM_OPTIONAL),
    6868                        'level' => array('flags' => WS_PARAM_OPTIONAL, 'maxValue'=>max($conf['available_permission_levels']),'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
    69     ),
    70     '','', array('admin_only'=>true, 'post_only'=>true));
    71 
    72   $srv->addMethod('rvac.delCustom', 'rv_ac_ws_del_custom_suggestion',
    73     array('id'),
    74     '','', array('admin_only'=>true, 'post_only'=>true));
     69                ),
     70                '','', array('admin_only'=>true, 'post_only'=>true));
     71
     72        $srv->addMethod('rvac.delCustom', 'rv_ac_ws_del_custom_suggestion',
     73                array('id'),
     74                '','', array('admin_only'=>true, 'post_only'=>true));
     75
     76
     77        $srv->addMethod('rvac.addVariant', 'rv_ac_ws_add_variant',
     78                array(
     79                        'in' => array(),
     80                        'type' => array(),
     81                        'out' => array(),
     82                        'comment' => array('flags' => WS_PARAM_OPTIONAL),
     83                ),
     84                '','', array('admin_only'=>true, 'post_only'=>true));
     85
     86        $srv->addMethod('rvac.modVariant', 'rv_ac_ws_mod_variant',
     87                array(
     88                        'key' => array(),
     89                        'in' => array(),
     90                        'type' => array(),
     91                        'out' => array(),
     92                        'comment' => array('flags' => WS_PARAM_OPTIONAL),
     93                ),
     94                '','', array('admin_only'=>true, 'post_only'=>true));
     95
     96        $srv->addMethod('rvac.delVariant', 'rv_ac_ws_del_variant',
     97                array(
     98                        'key' => array(),
     99                ),
     100                '','', array('admin_only'=>true, 'post_only'=>true));
     101
    75102}
    76103
    77104function rv_ac_ws_add_custom_suggestion($params, $service)
    78105{
    79   $name = trim($params['name']);
    80   if (empty($name))
    81     return new PwgError(400, 'Bad name');
    82 
    83   $insert = array('name'=>$name);
    84 
    85   if (isset($params['counter']))
    86     $insert['counter'] = intval($params['counter']);
    87   if ( !empty($params['url']) )
    88     $insert['url'] = $params['url'];
    89   if ( isset($params['level']) )
    90     $insert['level'] = $params['level'];
    91 
    92   mass_inserts(RVAC_SUGGESTIONS, array_keys($insert), array($insert));
    93   $id =  pwg_db_insert_id(RVAC_SUGGESTIONS);
    94 
    95   rvac_invalidate_cache();
    96   $row = pwg_db_fetch_assoc( pwg_query('SELECT * FROM '.RVAC_SUGGESTIONS.' WHERE id='.$id) );
    97   rvac_custom_link($row, rvac_get_url_roots());
    98   return $row;
     106        $name = trim($params['name']);
     107        if (empty($name))
     108                return new PwgError(400, 'Bad name');
     109
     110        $insert = array('name'=>$name);
     111
     112        if (isset($params['counter']))
     113                $insert['counter'] = intval($params['counter']);
     114        if ( !empty($params['url']) )
     115                $insert['url'] = $params['url'];
     116        if ( isset($params['level']) )
     117                $insert['level'] = $params['level'];
     118
     119        mass_inserts(RVAC_SUGGESTIONS, array_keys($insert), array($insert));
     120        $id =  pwg_db_insert_id(RVAC_SUGGESTIONS);
     121
     122        rvac_invalidate_cache();
     123        $row = pwg_db_fetch_assoc( pwg_query('SELECT * FROM '.RVAC_SUGGESTIONS.' WHERE id='.$id) );
     124        rvac_custom_link($row, rvac_get_url_roots());
     125        return $row;
    99126}
    100127
    101128function rv_ac_ws_mod_custom_suggestion($params, $service)
    102129{
    103   $id = intval($params['id']);
    104   $update = array();
    105 
    106   if (!empty($params['name']))
    107     $update['name'] = $params['name'];
    108   if (isset($params['counter']))
    109     $update['counter'] = intval($params['counter']);
    110   if (isset($params['url']))
    111     $update['url'] = $params['url'];
    112   if ( isset($params['level']) )
    113     $update['level'] = $params['level'];
    114 
    115   single_update(RVAC_SUGGESTIONS,
    116     $update,
    117     array('id' => $id)
    118     );
    119   $changes = pwg_db_changes();
    120 
    121   if ($changes)
    122     rvac_invalidate_cache();
    123 
    124   $row = pwg_db_fetch_assoc( pwg_query('SELECT * FROM '.RVAC_SUGGESTIONS.' WHERE id='.$id) );
    125   rvac_custom_link($row, rvac_get_url_roots());
    126   return $row;
     130        $id = intval($params['id']);
     131        $update = array();
     132
     133        if (!empty($params['name']))
     134                $update['name'] = $params['name'];
     135        if (isset($params['counter']))
     136                $update['counter'] = intval($params['counter']);
     137        if (isset($params['url']))
     138                $update['url'] = $params['url'];
     139        if ( isset($params['level']) )
     140                $update['level'] = $params['level'];
     141
     142        single_update(RVAC_SUGGESTIONS,
     143                $update,
     144                array('id' => $id)
     145                );
     146        $changes = pwg_db_changes();
     147
     148        if ($changes)
     149                rvac_invalidate_cache();
     150
     151        $row = pwg_db_fetch_assoc( pwg_query('SELECT * FROM '.RVAC_SUGGESTIONS.' WHERE id='.$id) );
     152        rvac_custom_link($row, rvac_get_url_roots());
     153        return $row;
    127154}
    128155
    129156function rv_ac_ws_del_custom_suggestion($params, $service)
    130157{
    131   $id = intval($params['id']);
    132   $q = 'DELETE FROM '.RVAC_SUGGESTIONS.' WHERE id='.$id;
    133   pwg_query($q);
    134   $changes = pwg_db_changes();
    135   if ($changes)
    136     rvac_invalidate_cache();
    137   return $changes;
    138 }
    139 
     158        $id = intval($params['id']);
     159        $q = 'DELETE FROM '.RVAC_SUGGESTIONS.' WHERE id='.$id;
     160        pwg_query($q);
     161        $changes = pwg_db_changes();
     162        if ($changes)
     163                rvac_invalidate_cache();
     164        return $changes;
     165}
     166
     167
     168
     169
     170function rvac_load_variant_rules()
     171{
     172        global $conf;
     173        $file=PHPWG_ROOT_PATH.$conf['data_location'].'plugins/autocomplete_variants.dat';
     174
     175        $data = @unserialize( file_get_contents($file));
     176        if ($data === false)
     177                return array();
     178        return $data;
     179}
     180
     181function rvac_save_variant_rules($rules, $callback = null)
     182{
     183        global $conf;
     184        $file=PHPWG_ROOT_PATH.$conf['data_location'].'plugins/autocomplete_variants.dat';
     185        $save = serialize($rules);
     186        if (@file_put_contents($file, $save)===false)
     187        {
     188                mkgetdir(dirname($file));
     189                file_put_contents($file, $save);
     190        }
     191
     192        $rmap = $amap = array();
     193        foreach($rules as $rule)
     194        {
     195                foreach($rule['in'] as $in_word)
     196                {
     197                        $in_word_t = transliterate($in_word);
     198                        $results = $rule['out'];
     199                        $processed = array();
     200                        for ($i=0; $i<count($results); $i++)
     201                        {
     202                                $outkey = $results[$i] == '$i' ? $in_word_t : transliterate($results[$i]);
     203                                if (isset($processed[$outkey]))
     204                                {
     205                                        array_splice($results, $i, 1);
     206                                        $i--;
     207                                        continue;
     208                                }
     209                                $processed[$outkey] = 1;
     210
     211                                if ('$a' == $results[$i])
     212                                {
     213                                        array_splice($results, $i, 1, $rule['in']);
     214                                        $i--;
     215                                }
     216                        }
     217
     218                        if ('r' == $rule['type'])
     219                        {
     220                                if (isset($rmap[$in_word_t]))
     221                                {
     222                                        if ($callback) $callback( array(
     223                                                'word' => $in_word,
     224                                                'wordt' => $in_word_t,
     225                                                'msg' => ' defined as input several times in replace rules'
     226                                        ));
     227                                }
     228                                else
     229                                        $rmap[$in_word_t] = $results;
     230                        }
     231                        else
     232                        {
     233                                $results = array_diff($results, array($in_word,$in_word_t, '$i'));
     234                                if (isset($amap[$in_word_t]))
     235                                        $results = array_unique( array_merge($amap[$in_word_t], $results));
     236                                $amap[$in_word_t] = $results;
     237                        }
     238                }
     239        }
     240
     241        $file=PHPWG_ROOT_PATH.$conf['data_location'].'tmp/autocomplete_variants.dat';
     242        $res = array('replace' => $rmap, 'add' => $amap );
     243        $save = serialize($res);
     244        if (@file_put_contents($file, $save)===false)
     245        {
     246                mkgetdir(dirname($file));
     247                file_put_contents($file, $save);
     248        }
     249        @file_put_contents($file.'.txt', var_export($res,true) );
     250}
     251
     252function rv_ac_ws_add_variant($params, $service)
     253{
     254        return rvac_ws_add_or_mod_variant($params, true);
     255}
     256
     257function rv_ac_ws_mod_variant($params, $service)
     258{
     259        return rvac_ws_add_or_mod_variant($params, false);
     260}
     261
     262function rvac_ws_add_or_mod_variant($params, $is_add)
     263{
     264        $rules = rvac_load_variant_rules();
     265
     266        foreach( array('in', 'out') as $i => $name)
     267        {
     268                $arr = preg_split("/[\n,]+/", stripslashes($params[$name]) );
     269                $arr = array_map('trim', $arr);
     270                $arr = array_values( array_filter($arr, function($word) {
     271                        return strlen($word)>0;
     272                }) );
     273                $arr = array_unique($arr);
     274                $$name = $arr;
     275        }
     276        if (empty($in))
     277                return new PwgError(WS_ERR_INVALID_PARAM, 'input word list empty');
     278        if (empty($out))
     279                return new PwgError(WS_ERR_INVALID_PARAM, 'output word list empty');
     280
     281        $in_trans = array_map('transliterate', $in);
     282        sort($in_trans);
     283        $key = implode(',', $in_trans);
     284        if (strlen($key)>16)
     285                $key = md5($key);
     286
     287        $type = $params['type'];
     288        if ($type!='r' && $type!='a')
     289                return new PwgError(WS_ERR_INVALID_PARAM, 'type');
     290
     291        if ($is_add)
     292        {
     293                if (isset($rules[$key]))
     294                        return new PwgError(WS_ERR_INVALID_PARAM, 'list already defined');
     295        }
     296        else
     297        {
     298                $okey = $params['key'];
     299                if (!isset($rules[$okey]))
     300                        return new PwgError(WS_ERR_INVALID_PARAM, 'no rule to update');
     301                unset($rules[$okey]);
     302        }
     303
     304        $rule = array(
     305                'in' => $in,
     306                'type' => $type,
     307                'out' => $out,
     308        );
     309        if (!empty($params['comment']))
     310                $rule['comment'] = $params['comment'];
     311        $rules[$key] = $rule;
     312
     313        $messages = array();
     314        $callback = function($params) use($in_trans, &$messages) {
     315                if (isset($params['word_t']))
     316                {
     317                        if (in_array($in_trans, $word_t))
     318                                $messages[] = $params['word'].' '.$params['msg'];
     319                }
     320                else
     321                        $messages[] = $params['msg'];
     322        };
     323
     324        rvac_save_variant_rules($rules, $callback);
     325        $rule['key'] = $key;
     326        return array(
     327                'messages' => $messages,
     328                'rule' => $rule,
     329        );
     330}
     331
     332function rv_ac_ws_del_variant($params, $service)
     333{
     334        $rules = rvac_load_variant_rules();
     335
     336        $key = $params['key'];
     337        if (empty($key))
     338                return new PwgError(WS_ERR_INVALID_PARAM, 'empty key');
     339
     340        if (!isset($rules[$key]))
     341                return true;
     342
     343        unset($rules[$key]);
     344
     345        rvac_save_variant_rules($rules);
     346}
    140347?>
Note: See TracChangeset for help on using the changeset viewer.