diff options
author | ArthurHoaro <arthur@hoa.ro> | 2015-12-27 10:08:20 +0100 |
---|---|---|
committer | ArthurHoaro <arthur@hoa.ro> | 2016-01-06 19:53:04 +0100 |
commit | 822bffced8212e7f34bcb2ad063b31a78bd57bdb (patch) | |
tree | 04cd1efe9d2f015669a451fc7c853c23e38a44cb /application/LinkDB.php | |
parent | ba83317573a1477d731cbd3d974b601cf9afdba3 (diff) | |
download | Shaarli-822bffced8212e7f34bcb2ad063b31a78bd57bdb.tar.gz Shaarli-822bffced8212e7f34bcb2ad063b31a78bd57bdb.tar.zst Shaarli-822bffced8212e7f34bcb2ad063b31a78bd57bdb.zip |
Link filter refactoring
* introduce class LinkFilter to handle link filter operation (and lighten LinkDB).
* handle 'private only' in filtering.
* update template to prefill search fields with current search terms.
* coding style.
* unit test (mostly move from LinkDB to LinkFilter).
PS: preparation for #358 #315 and 'AND' search.
Diffstat (limited to 'application/LinkDB.php')
-rw-r--r-- | application/LinkDB.php | 120 |
1 files changed, 15 insertions, 105 deletions
diff --git a/application/LinkDB.php b/application/LinkDB.php index 51fa926d..be7d9016 100644 --- a/application/LinkDB.php +++ b/application/LinkDB.php | |||
@@ -63,6 +63,11 @@ class LinkDB implements Iterator, Countable, ArrayAccess | |||
63 | private $_redirector; | 63 | private $_redirector; |
64 | 64 | ||
65 | /** | 65 | /** |
66 | * @var LinkFilter instance. | ||
67 | */ | ||
68 | private $linkFilter; | ||
69 | |||
70 | /** | ||
66 | * Creates a new LinkDB | 71 | * Creates a new LinkDB |
67 | * | 72 | * |
68 | * Checks if the datastore exists; else, attempts to create a dummy one. | 73 | * Checks if the datastore exists; else, attempts to create a dummy one. |
@@ -80,6 +85,7 @@ class LinkDB implements Iterator, Countable, ArrayAccess | |||
80 | $this->_redirector = $redirector; | 85 | $this->_redirector = $redirector; |
81 | $this->_checkDB(); | 86 | $this->_checkDB(); |
82 | $this->_readDB(); | 87 | $this->_readDB(); |
88 | $this->linkFilter = new LinkFilter($this->_links); | ||
83 | } | 89 | } |
84 | 90 | ||
85 | /** | 91 | /** |
@@ -334,114 +340,18 @@ You use the community supported version of the original Shaarli project, by Seba | |||
334 | } | 340 | } |
335 | 341 | ||
336 | /** | 342 | /** |
337 | * Returns the list of links corresponding to a full-text search | 343 | * Filter links. |
338 | * | 344 | * |
339 | * Searches: | 345 | * @param string $type Type of filter. |
340 | * - in the URLs, title and description; | 346 | * @param mixed $request Search request, string or array. |
341 | * - are case-insensitive. | 347 | * @param bool $casesensitive Optional: Perform case sensitive filter |
342 | * | 348 | * @param bool $privateonly Optional: Returns private links only if true. |
343 | * Example: | ||
344 | * print_r($mydb->filterFulltext('hollandais')); | ||
345 | * | ||
346 | * mb_convert_case($val, MB_CASE_LOWER, 'UTF-8') | ||
347 | * - allows to perform searches on Unicode text | ||
348 | * - see https://github.com/shaarli/Shaarli/issues/75 for examples | ||
349 | */ | ||
350 | public function filterFulltext($searchterms) | ||
351 | { | ||
352 | // FIXME: explode(' ',$searchterms) and perform a AND search. | ||
353 | // FIXME: accept double-quotes to search for a string "as is"? | ||
354 | $filtered = array(); | ||
355 | $search = mb_convert_case($searchterms, MB_CASE_LOWER, 'UTF-8'); | ||
356 | $keys = array('title', 'description', 'url', 'tags'); | ||
357 | |||
358 | foreach ($this->_links as $link) { | ||
359 | $found = false; | ||
360 | |||
361 | foreach ($keys as $key) { | ||
362 | if (strpos(mb_convert_case($link[$key], MB_CASE_LOWER, 'UTF-8'), | ||
363 | $search) !== false) { | ||
364 | $found = true; | ||
365 | } | ||
366 | } | ||
367 | |||
368 | if ($found) { | ||
369 | $filtered[$link['linkdate']] = $link; | ||
370 | } | ||
371 | } | ||
372 | krsort($filtered); | ||
373 | return $filtered; | ||
374 | } | ||
375 | |||
376 | /** | ||
377 | * Returns the list of links associated with a given list of tags | ||
378 | * | 349 | * |
379 | * You can specify one or more tags, separated by space or a comma, e.g. | 350 | * @return array filtered links |
380 | * print_r($mydb->filterTags('linux programming')); | ||
381 | */ | 351 | */ |
382 | public function filterTags($tags, $casesensitive=false) | 352 | public function filter($type, $request, $casesensitive = false, $privateonly = false) { |
383 | { | 353 | $requestFilter = is_array($request) ? implode(' ', $request) : $request; |
384 | // Same as above, we use UTF-8 conversion to handle various graphemes (i.e. cyrillic, or greek) | 354 | return $this->linkFilter->filter($type, $requestFilter, $casesensitive, $privateonly); |
385 | // FIXME: is $casesensitive ever true? | ||
386 | $t = str_replace( | ||
387 | ',', ' ', | ||
388 | ($casesensitive ? $tags : mb_convert_case($tags, MB_CASE_LOWER, 'UTF-8')) | ||
389 | ); | ||
390 | |||
391 | $searchtags = explode(' ', $t); | ||
392 | $filtered = array(); | ||
393 | |||
394 | foreach ($this->_links as $l) { | ||
395 | $linktags = explode( | ||
396 | ' ', | ||
397 | ($casesensitive ? $l['tags']:mb_convert_case($l['tags'], MB_CASE_LOWER, 'UTF-8')) | ||
398 | ); | ||
399 | |||
400 | if (count(array_intersect($linktags, $searchtags)) == count($searchtags)) { | ||
401 | $filtered[$l['linkdate']] = $l; | ||
402 | } | ||
403 | } | ||
404 | krsort($filtered); | ||
405 | return $filtered; | ||
406 | } | ||
407 | |||
408 | |||
409 | /** | ||
410 | * Returns the list of articles for a given day, chronologically sorted | ||
411 | * | ||
412 | * Day must be in the form 'YYYYMMDD' (e.g. '20120125'), e.g. | ||
413 | * print_r($mydb->filterDay('20120125')); | ||
414 | */ | ||
415 | public function filterDay($day) | ||
416 | { | ||
417 | if (! checkDateFormat('Ymd', $day)) { | ||
418 | throw new Exception('Invalid date format'); | ||
419 | } | ||
420 | |||
421 | $filtered = array(); | ||
422 | foreach ($this->_links as $l) { | ||
423 | if (startsWith($l['linkdate'], $day)) { | ||
424 | $filtered[$l['linkdate']] = $l; | ||
425 | } | ||
426 | } | ||
427 | ksort($filtered); | ||
428 | return $filtered; | ||
429 | } | ||
430 | |||
431 | /** | ||
432 | * Returns the article corresponding to a smallHash | ||
433 | */ | ||
434 | public function filterSmallHash($smallHash) | ||
435 | { | ||
436 | $filtered = array(); | ||
437 | foreach ($this->_links as $l) { | ||
438 | if ($smallHash == smallHash($l['linkdate'])) { | ||
439 | // Yes, this is ugly and slow | ||
440 | $filtered[$l['linkdate']] = $l; | ||
441 | return $filtered; | ||
442 | } | ||
443 | } | ||
444 | return $filtered; | ||
445 | } | 355 | } |
446 | 356 | ||
447 | /** | 357 | /** |