diff options
Diffstat (limited to 'application/LinkFilter.php')
-rw-r--r-- | application/LinkFilter.php | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/application/LinkFilter.php b/application/LinkFilter.php index 096d3b04..ceb47d16 100644 --- a/application/LinkFilter.php +++ b/application/LinkFilter.php | |||
@@ -209,19 +209,33 @@ class LinkFilter | |||
209 | */ | 209 | */ |
210 | public function filterTags($tags, $casesensitive = false, $privateonly = false) | 210 | public function filterTags($tags, $casesensitive = false, $privateonly = false) |
211 | { | 211 | { |
212 | $searchtags = $this->tagsStrToArray($tags, $casesensitive); | 212 | $searchtags = self::tagsStrToArray($tags, $casesensitive); |
213 | $filtered = array(); | 213 | $filtered = array(); |
214 | if (empty($searchtags)) { | ||
215 | return $filtered; | ||
216 | } | ||
214 | 217 | ||
215 | foreach ($this->links as $l) { | 218 | foreach ($this->links as $link) { |
216 | // ignore non private links when 'privatonly' is on. | 219 | // ignore non private links when 'privatonly' is on. |
217 | if (! $l['private'] && $privateonly === true) { | 220 | if (! $link['private'] && $privateonly === true) { |
218 | continue; | 221 | continue; |
219 | } | 222 | } |
220 | 223 | ||
221 | $linktags = $this->tagsStrToArray($l['tags'], $casesensitive); | 224 | $linktags = self::tagsStrToArray($link['tags'], $casesensitive); |
222 | 225 | ||
223 | if (count(array_intersect($linktags, $searchtags)) == count($searchtags)) { | 226 | $found = true; |
224 | $filtered[$l['linkdate']] = $l; | 227 | for ($i = 0 ; $i < count($searchtags) && $found; $i++) { |
228 | // Exclusive search, quit if tag found. | ||
229 | // Or, tag not found in the link, quit. | ||
230 | if (($searchtags[$i][0] == '-' && in_array(substr($searchtags[$i], 1), $linktags)) | ||
231 | || ($searchtags[$i][0] != '-') && ! in_array($searchtags[$i], $linktags) | ||
232 | ) { | ||
233 | $found = false; | ||
234 | } | ||
235 | } | ||
236 | |||
237 | if ($found) { | ||
238 | $filtered[$link['linkdate']] = $link; | ||
225 | } | 239 | } |
226 | } | 240 | } |
227 | krsort($filtered); | 241 | krsort($filtered); |
@@ -266,12 +280,12 @@ class LinkFilter | |||
266 | * | 280 | * |
267 | * @return array filtered tags string. | 281 | * @return array filtered tags string. |
268 | */ | 282 | */ |
269 | public function tagsStrToArray($tags, $casesensitive) | 283 | public static function tagsStrToArray($tags, $casesensitive) |
270 | { | 284 | { |
271 | // We use UTF-8 conversion to handle various graphemes (i.e. cyrillic, or greek) | 285 | // We use UTF-8 conversion to handle various graphemes (i.e. cyrillic, or greek) |
272 | $tagsOut = $casesensitive ? $tags : mb_convert_case($tags, MB_CASE_LOWER, 'UTF-8'); | 286 | $tagsOut = $casesensitive ? $tags : mb_convert_case($tags, MB_CASE_LOWER, 'UTF-8'); |
273 | $tagsOut = str_replace(',', ' ', $tagsOut); | 287 | $tagsOut = str_replace(',', ' ', $tagsOut); |
274 | 288 | ||
275 | return explode(' ', trim($tagsOut)); | 289 | return array_filter(explode(' ', trim($tagsOut)), 'strlen'); |
276 | } | 290 | } |
277 | } | 291 | } |