* @param mixed $request Filter content.
* @param bool $casesensitive Optional: Perform case sensitive filter if true.
* @param string $visibility Optional: return only all/private/public links
+ * @param string $untaggedonly Optional: return only untagged links. Applies only if $type includes FILTER_TAG
*
* @return array filtered link list.
*/
- public function filter($type, $request, $casesensitive = false, $visibility = 'all')
+ public function filter($type, $request, $casesensitive = false, $visibility = 'all', $untaggedonly = false)
{
if (! in_array($visibility, ['all', 'public', 'private'])) {
$visibility = 'all';
switch($type) {
case self::$FILTER_HASH:
return $this->filterSmallHash($request);
- case self::$FILTER_TAG | self::$FILTER_TEXT:
- if (!empty($request)) {
- $filtered = $this->links;
- if (isset($request[0])) {
- $filtered = $this->filterTags($request[0], $casesensitive, $visibility);
- }
- if (isset($request[1])) {
- $lf = new LinkFilter($filtered);
- $filtered = $lf->filterFulltext($request[1], $visibility);
+ case self::$FILTER_TAG | self::$FILTER_TEXT: // == "vuotext"
+ $noRequest = empty($request) || (empty($request[0]) && empty($request[1]));
+ if ($noRequest) {
+ if ($untaggedonly) {
+ return $this->filterUntagged($visibility);
}
- return $filtered;
+ return $this->noFilter($visibility);
}
- return $this->noFilter($visibility);
+ if ($untaggedonly) {
+ $filtered = $this->filterUntagged($visibility);
+ } else {
+ $filtered = $this->links;
+ }
+ if (!empty($request[0])) {
+ $filtered = (new LinkFilter($filtered))->filterTags($request[0], $casesensitive, $visibility);
+ }
+ if (!empty($request[1])) {
+ $filtered = (new LinkFilter($filtered))->filterFulltext($request[1], $visibility);
+ }
+ return $filtered;
case self::$FILTER_TEXT:
return $this->filterFulltext($request, $visibility);
case self::$FILTER_TAG:
- return $this->filterTags($request, $casesensitive, $visibility);
+ if ($untaggedonly) {
+ return $this->filterUntagged($visibility);
+ } else {
+ return $this->filterTags($request, $casesensitive, $visibility);
+ }
case self::$FILTER_DAY:
return $this->filterDay($request);
default:
return $filtered;
}
+ /**
+ * Return only links without any tag.
+ *
+ * @param string $visibility return only all/private/public links.
+ *
+ * @return array filtered links.
+ */
+ public function filterUntagged($visibility)
+ {
+ $filtered = [];
+ foreach ($this->links as $key => $link) {
+ if ($visibility !== 'all') {
+ if (! $link['private'] && $visibility === 'private') {
+ continue;
+ } else if ($link['private'] && $visibility === 'public') {
+ continue;
+ }
+ }
+
+ if (empty(trim($link['tags']))) {
+ $filtered[$key] = $link;
+ }
+ }
+
+ return $filtered;
+ }
+
/**
* Returns the list of articles for a given day, chronologically sorted
*