diff options
-rw-r--r-- | application/FeedBuilder.php | 5 | ||||
-rw-r--r-- | application/LinkDB.php | 27 | ||||
-rw-r--r-- | application/LinkFilter.php | 30 | ||||
-rw-r--r-- | application/Utils.php | 4 | ||||
-rw-r--r-- | index.php | 18 | ||||
-rw-r--r-- | tests/LinkDBTest.php | 2 | ||||
-rw-r--r-- | tests/LinkFilterTest.php | 19 | ||||
-rw-r--r-- | tests/api/controllers/GetLinksTest.php | 4 | ||||
-rw-r--r-- | tests/api/controllers/InfoTest.php | 4 | ||||
-rw-r--r-- | tests/utils/ReferenceLinkDB.php | 26 | ||||
-rw-r--r-- | tpl/default/linklist.html | 6 | ||||
-rw-r--r-- | tpl/vintage/linklist.html | 6 |
12 files changed, 115 insertions, 36 deletions
diff --git a/application/FeedBuilder.php b/application/FeedBuilder.php index a1f4da48..7377bcec 100644 --- a/application/FeedBuilder.php +++ b/application/FeedBuilder.php | |||
@@ -97,6 +97,11 @@ class FeedBuilder | |||
97 | */ | 97 | */ |
98 | public function buildData() | 98 | public function buildData() |
99 | { | 99 | { |
100 | // Search for untagged links | ||
101 | if (isset($this->userInput['searchtags']) && empty($this->userInput['searchtags'])) { | ||
102 | $this->userInput['searchtags'] = false; | ||
103 | } | ||
104 | |||
100 | // Optionally filter the results: | 105 | // Optionally filter the results: |
101 | $linksToDisplay = $this->linkDB->filterSearch($this->userInput); | 106 | $linksToDisplay = $this->linkDB->filterSearch($this->userInput); |
102 | 107 | ||
diff --git a/application/LinkDB.php b/application/LinkDB.php index 7802cc8a..8ca0fab3 100644 --- a/application/LinkDB.php +++ b/application/LinkDB.php | |||
@@ -423,29 +423,12 @@ You use the community supported version of the original Shaarli project, by Seba | |||
423 | public function filterSearch($filterRequest = array(), $casesensitive = false, $visibility = 'all') | 423 | public function filterSearch($filterRequest = array(), $casesensitive = false, $visibility = 'all') |
424 | { | 424 | { |
425 | // Filter link database according to parameters. | 425 | // Filter link database according to parameters. |
426 | $searchtags = !empty($filterRequest['searchtags']) ? escape($filterRequest['searchtags']) : ''; | 426 | $searchtags = isset($filterRequest['searchtags']) ? escape($filterRequest['searchtags']) : ''; |
427 | $searchterm = !empty($filterRequest['searchterm']) ? escape($filterRequest['searchterm']) : ''; | 427 | $searchterm = isset($filterRequest['searchterm']) ? escape($filterRequest['searchterm']) : ''; |
428 | 428 | ||
429 | // Search tags + fullsearch. | 429 | // Search tags + fullsearch - blank string parameter will return all links. |
430 | if (! empty($searchtags) && ! empty($searchterm)) { | 430 | $type = LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT; |
431 | $type = LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT; | 431 | $request = [$searchtags, $searchterm]; |
432 | $request = array($searchtags, $searchterm); | ||
433 | } | ||
434 | // Search by tags. | ||
435 | elseif (! empty($searchtags)) { | ||
436 | $type = LinkFilter::$FILTER_TAG; | ||
437 | $request = $searchtags; | ||
438 | } | ||
439 | // Fulltext search. | ||
440 | elseif (! empty($searchterm)) { | ||
441 | $type = LinkFilter::$FILTER_TEXT; | ||
442 | $request = $searchterm; | ||
443 | } | ||
444 | // Otherwise, display without filtering. | ||
445 | else { | ||
446 | $type = ''; | ||
447 | $request = ''; | ||
448 | } | ||
449 | 432 | ||
450 | $linkFilter = new LinkFilter($this); | 433 | $linkFilter = new LinkFilter($this); |
451 | return $linkFilter->filter($type, $request, $casesensitive, $visibility); | 434 | return $linkFilter->filter($type, $request, $casesensitive, $visibility); |
diff --git a/application/LinkFilter.php b/application/LinkFilter.php index 81832a4b..0e887d38 100644 --- a/application/LinkFilter.php +++ b/application/LinkFilter.php | |||
@@ -253,6 +253,9 @@ class LinkFilter | |||
253 | { | 253 | { |
254 | // Implode if array for clean up. | 254 | // Implode if array for clean up. |
255 | $tags = is_array($tags) ? trim(implode(' ', $tags)) : $tags; | 255 | $tags = is_array($tags) ? trim(implode(' ', $tags)) : $tags; |
256 | if ($tags === false) { | ||
257 | return $this->filterUntagged($visibility); | ||
258 | } | ||
256 | if (empty($tags)) { | 259 | if (empty($tags)) { |
257 | return $this->noFilter($visibility); | 260 | return $this->noFilter($visibility); |
258 | } | 261 | } |
@@ -296,6 +299,33 @@ class LinkFilter | |||
296 | } | 299 | } |
297 | 300 | ||
298 | /** | 301 | /** |
302 | * Return only links without any tag. | ||
303 | * | ||
304 | * @param string $visibility return only all/private/public links. | ||
305 | * | ||
306 | * @return array filtered links. | ||
307 | */ | ||
308 | public function filterUntagged($visibility) | ||
309 | { | ||
310 | $filtered = []; | ||
311 | foreach ($this->links as $key => $link) { | ||
312 | if ($visibility !== 'all') { | ||
313 | if (! $link['private'] && $visibility === 'private') { | ||
314 | continue; | ||
315 | } else if ($link['private'] && $visibility === 'public') { | ||
316 | continue; | ||
317 | } | ||
318 | } | ||
319 | |||
320 | if (empty(trim($link['tags']))) { | ||
321 | $filtered[$key] = $link; | ||
322 | } | ||
323 | } | ||
324 | |||
325 | return $filtered; | ||
326 | } | ||
327 | |||
328 | /** | ||
299 | * Returns the list of articles for a given day, chronologically sorted | 329 | * Returns the list of articles for a given day, chronologically sorted |
300 | * | 330 | * |
301 | * Day must be in the form 'YYYYMMDD' (e.g. '20120125'), e.g. | 331 | * Day must be in the form 'YYYYMMDD' (e.g. '20120125'), e.g. |
diff --git a/application/Utils.php b/application/Utils.php index 9d0ebc5e..4a2f5561 100644 --- a/application/Utils.php +++ b/application/Utils.php | |||
@@ -91,6 +91,10 @@ function endsWith($haystack, $needle, $case = true) | |||
91 | */ | 91 | */ |
92 | function escape($input) | 92 | function escape($input) |
93 | { | 93 | { |
94 | if (is_bool($input)) { | ||
95 | return $input; | ||
96 | } | ||
97 | |||
94 | if (is_array($input)) { | 98 | if (is_array($input)) { |
95 | $out = array(); | 99 | $out = array(); |
96 | foreach($input as $key => $value) { | 100 | foreach($input as $key => $value) { |
@@ -1622,7 +1622,15 @@ function renderPage($conf, $pluginManager, $LINKSDB, $history) | |||
1622 | function buildLinkList($PAGE,$LINKSDB, $conf, $pluginManager) | 1622 | function buildLinkList($PAGE,$LINKSDB, $conf, $pluginManager) |
1623 | { | 1623 | { |
1624 | // Used in templates | 1624 | // Used in templates |
1625 | $searchtags = !empty($_GET['searchtags']) ? escape(normalize_spaces($_GET['searchtags'])) : ''; | 1625 | if (isset($_GET['searchtags'])) { |
1626 | if (! empty($_GET['searchtags'])) { | ||
1627 | $searchtags = escape(normalize_spaces($_GET['searchtags'])); | ||
1628 | } else { | ||
1629 | $searchtags = false; | ||
1630 | } | ||
1631 | } else { | ||
1632 | $searchtags = ''; | ||
1633 | } | ||
1626 | $searchterm = !empty($_GET['searchterm']) ? escape(normalize_spaces($_GET['searchterm'])) : ''; | 1634 | $searchterm = !empty($_GET['searchterm']) ? escape(normalize_spaces($_GET['searchterm'])) : ''; |
1627 | 1635 | ||
1628 | // Smallhash filter | 1636 | // Smallhash filter |
@@ -1637,7 +1645,11 @@ function buildLinkList($PAGE,$LINKSDB, $conf, $pluginManager) | |||
1637 | } else { | 1645 | } else { |
1638 | // Filter links according search parameters. | 1646 | // Filter links according search parameters. |
1639 | $visibility = ! empty($_SESSION['privateonly']) ? 'private' : 'all'; | 1647 | $visibility = ! empty($_SESSION['privateonly']) ? 'private' : 'all'; |
1640 | $linksToDisplay = $LINKSDB->filterSearch($_GET, false, $visibility); | 1648 | $request = [ |
1649 | 'searchtags' => $searchtags, | ||
1650 | 'searchterm' => $searchterm, | ||
1651 | ]; | ||
1652 | $linksToDisplay = $LINKSDB->filterSearch($request, false, $visibility); | ||
1641 | } | 1653 | } |
1642 | 1654 | ||
1643 | // ---- Handle paging. | 1655 | // ---- Handle paging. |
@@ -1684,7 +1696,7 @@ function buildLinkList($PAGE,$LINKSDB, $conf, $pluginManager) | |||
1684 | } | 1696 | } |
1685 | 1697 | ||
1686 | // Compute paging navigation | 1698 | // Compute paging navigation |
1687 | $searchtagsUrl = empty($searchtags) ? '' : '&searchtags=' . urlencode($searchtags); | 1699 | $searchtagsUrl = $searchtags === '' ? '' : '&searchtags=' . urlencode($searchtags); |
1688 | $searchtermUrl = empty($searchterm) ? '' : '&searchterm=' . urlencode($searchterm); | 1700 | $searchtermUrl = empty($searchterm) ? '' : '&searchterm=' . urlencode($searchterm); |
1689 | $previous_page_url = ''; | 1701 | $previous_page_url = ''; |
1690 | if ($i != count($keys)) { | 1702 | if ($i != count($keys)) { |
diff --git a/tests/LinkDBTest.php b/tests/LinkDBTest.php index 2523467d..25438277 100644 --- a/tests/LinkDBTest.php +++ b/tests/LinkDBTest.php | |||
@@ -475,7 +475,7 @@ class LinkDBTest extends PHPUnit_Framework_TestCase | |||
475 | public function testReorderLinksDesc() | 475 | public function testReorderLinksDesc() |
476 | { | 476 | { |
477 | self::$privateLinkDB->reorder('ASC'); | 477 | self::$privateLinkDB->reorder('ASC'); |
478 | $linkIds = array(42, 4, 1, 0, 7, 6, 8, 41); | 478 | $linkIds = array(42, 4, 9, 1, 0, 7, 6, 8, 41); |
479 | $cpt = 0; | 479 | $cpt = 0; |
480 | foreach (self::$privateLinkDB as $key => $value) { | 480 | foreach (self::$privateLinkDB as $key => $value) { |
481 | $this->assertEquals($linkIds[$cpt++], $key); | 481 | $this->assertEquals($linkIds[$cpt++], $key); |
diff --git a/tests/LinkFilterTest.php b/tests/LinkFilterTest.php index 37d5ca30..74162358 100644 --- a/tests/LinkFilterTest.php +++ b/tests/LinkFilterTest.php | |||
@@ -63,6 +63,12 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase | |||
63 | count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, '')) | 63 | count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, '')) |
64 | ); | 64 | ); |
65 | 65 | ||
66 | // Untagged only | ||
67 | $this->assertEquals( | ||
68 | self::$refDB->countUntaggedLinks(), | ||
69 | count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, false)) | ||
70 | ); | ||
71 | |||
66 | $this->assertEquals( | 72 | $this->assertEquals( |
67 | ReferenceLinkDB::$NB_LINKS_TOTAL, | 73 | ReferenceLinkDB::$NB_LINKS_TOTAL, |
68 | count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, '')) | 74 | count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, '')) |
@@ -146,7 +152,7 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase | |||
146 | public function testFilterDay() | 152 | public function testFilterDay() |
147 | { | 153 | { |
148 | $this->assertEquals( | 154 | $this->assertEquals( |
149 | 3, | 155 | 4, |
150 | count(self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '20121206')) | 156 | count(self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '20121206')) |
151 | ); | 157 | ); |
152 | } | 158 | } |
@@ -339,7 +345,7 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase | |||
339 | ); | 345 | ); |
340 | 346 | ||
341 | $this->assertEquals( | 347 | $this->assertEquals( |
342 | 7, | 348 | ReferenceLinkDB::$NB_LINKS_TOTAL - 1, |
343 | count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, '-revolution')) | 349 | count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, '-revolution')) |
344 | ); | 350 | ); |
345 | } | 351 | } |
@@ -399,7 +405,7 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase | |||
399 | ); | 405 | ); |
400 | 406 | ||
401 | $this->assertEquals( | 407 | $this->assertEquals( |
402 | 7, | 408 | ReferenceLinkDB::$NB_LINKS_TOTAL - 1, |
403 | count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, '-free')) | 409 | count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, '-free')) |
404 | ); | 410 | ); |
405 | } | 411 | } |
@@ -429,6 +435,13 @@ class LinkFilterTest extends PHPUnit_Framework_TestCase | |||
429 | 1, | 435 | 1, |
430 | count(self::$linkFilter->filter( | 436 | count(self::$linkFilter->filter( |
431 | LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT, | 437 | LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT, |
438 | array(false, 'PSR-2') | ||
439 | )) | ||
440 | ); | ||
441 | $this->assertEquals( | ||
442 | 1, | ||
443 | count(self::$linkFilter->filter( | ||
444 | LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT, | ||
432 | array($tags, '') | 445 | array($tags, '') |
433 | )) | 446 | )) |
434 | ); | 447 | ); |
diff --git a/tests/api/controllers/GetLinksTest.php b/tests/api/controllers/GetLinksTest.php index 84ae7f7a..4cb70224 100644 --- a/tests/api/controllers/GetLinksTest.php +++ b/tests/api/controllers/GetLinksTest.php | |||
@@ -95,7 +95,7 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase | |||
95 | $this->assertEquals($this->refDB->countLinks(), count($data)); | 95 | $this->assertEquals($this->refDB->countLinks(), count($data)); |
96 | 96 | ||
97 | // Check order | 97 | // Check order |
98 | $order = [41, 8, 6, 7, 0, 1, 4, 42]; | 98 | $order = [41, 8, 6, 7, 0, 1, 9, 4, 42]; |
99 | $cpt = 0; | 99 | $cpt = 0; |
100 | foreach ($data as $link) { | 100 | foreach ($data as $link) { |
101 | $this->assertEquals(self::NB_FIELDS_LINK, count($link)); | 101 | $this->assertEquals(self::NB_FIELDS_LINK, count($link)); |
@@ -164,7 +164,7 @@ class GetLinksTest extends \PHPUnit_Framework_TestCase | |||
164 | $data = json_decode((string) $response->getBody(), true); | 164 | $data = json_decode((string) $response->getBody(), true); |
165 | $this->assertEquals($this->refDB->countLinks(), count($data)); | 165 | $this->assertEquals($this->refDB->countLinks(), count($data)); |
166 | // Check order | 166 | // Check order |
167 | $order = [41, 8, 6, 7, 0, 1, 4, 42]; | 167 | $order = [41, 8, 6, 7, 0, 1, 9, 4, 42]; |
168 | $cpt = 0; | 168 | $cpt = 0; |
169 | foreach ($data as $link) { | 169 | foreach ($data as $link) { |
170 | $this->assertEquals(self::NB_FIELDS_LINK, count($link)); | 170 | $this->assertEquals(self::NB_FIELDS_LINK, count($link)); |
diff --git a/tests/api/controllers/InfoTest.php b/tests/api/controllers/InfoTest.php index e85eb281..f7e63bfa 100644 --- a/tests/api/controllers/InfoTest.php +++ b/tests/api/controllers/InfoTest.php | |||
@@ -81,7 +81,7 @@ class InfoTest extends \PHPUnit_Framework_TestCase | |||
81 | $this->assertEquals(200, $response->getStatusCode()); | 81 | $this->assertEquals(200, $response->getStatusCode()); |
82 | $data = json_decode((string) $response->getBody(), true); | 82 | $data = json_decode((string) $response->getBody(), true); |
83 | 83 | ||
84 | $this->assertEquals(8, $data['global_counter']); | 84 | $this->assertEquals(\ReferenceLinkDB::$NB_LINKS_TOTAL, $data['global_counter']); |
85 | $this->assertEquals(2, $data['private_counter']); | 85 | $this->assertEquals(2, $data['private_counter']); |
86 | $this->assertEquals('Shaarli', $data['settings']['title']); | 86 | $this->assertEquals('Shaarli', $data['settings']['title']); |
87 | $this->assertEquals('?', $data['settings']['header_link']); | 87 | $this->assertEquals('?', $data['settings']['header_link']); |
@@ -104,7 +104,7 @@ class InfoTest extends \PHPUnit_Framework_TestCase | |||
104 | $this->assertEquals(200, $response->getStatusCode()); | 104 | $this->assertEquals(200, $response->getStatusCode()); |
105 | $data = json_decode((string) $response->getBody(), true); | 105 | $data = json_decode((string) $response->getBody(), true); |
106 | 106 | ||
107 | $this->assertEquals(8, $data['global_counter']); | 107 | $this->assertEquals(\ReferenceLinkDB::$NB_LINKS_TOTAL, $data['global_counter']); |
108 | $this->assertEquals(2, $data['private_counter']); | 108 | $this->assertEquals(2, $data['private_counter']); |
109 | $this->assertEquals($title, $data['settings']['title']); | 109 | $this->assertEquals($title, $data['settings']['title']); |
110 | $this->assertEquals($headerLink, $data['settings']['header_link']); | 110 | $this->assertEquals($headerLink, $data['settings']['header_link']); |
diff --git a/tests/utils/ReferenceLinkDB.php b/tests/utils/ReferenceLinkDB.php index 1f4b3063..f09eebc1 100644 --- a/tests/utils/ReferenceLinkDB.php +++ b/tests/utils/ReferenceLinkDB.php | |||
@@ -4,7 +4,7 @@ | |||
4 | */ | 4 | */ |
5 | class ReferenceLinkDB | 5 | class ReferenceLinkDB |
6 | { | 6 | { |
7 | public static $NB_LINKS_TOTAL = 8; | 7 | public static $NB_LINKS_TOTAL = 9; |
8 | 8 | ||
9 | private $_links = array(); | 9 | private $_links = array(); |
10 | private $_publicCount = 0; | 10 | private $_publicCount = 0; |
@@ -38,6 +38,16 @@ class ReferenceLinkDB | |||
38 | ); | 38 | ); |
39 | 39 | ||
40 | $this->addLink( | 40 | $this->addLink( |
41 | 9, | ||
42 | 'PSR-2: Coding Style Guide', | ||
43 | 'http://www.php-fig.org/psr/psr-2/', | ||
44 | 'This guide extends and expands on PSR-1, the basic coding standard.', | ||
45 | 0, | ||
46 | DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121206_152312'), | ||
47 | '' | ||
48 | ); | ||
49 | |||
50 | $this->addLink( | ||
41 | 8, | 51 | 8, |
42 | 'Free as in Freedom 2.0 @website', | 52 | 'Free as in Freedom 2.0 @website', |
43 | 'https://static.fsf.org/nosvn/faif-2.0.pdf', | 53 | 'https://static.fsf.org/nosvn/faif-2.0.pdf', |
@@ -161,6 +171,20 @@ class ReferenceLinkDB | |||
161 | return $this->_privateCount; | 171 | return $this->_privateCount; |
162 | } | 172 | } |
163 | 173 | ||
174 | /** | ||
175 | * Returns the number of links without tag | ||
176 | */ | ||
177 | public function countUntaggedLinks() | ||
178 | { | ||
179 | $cpt = 0; | ||
180 | foreach ($this->_links as $link) { | ||
181 | if (empty($link['tags'])) { | ||
182 | ++$cpt; | ||
183 | } | ||
184 | } | ||
185 | return $cpt; | ||
186 | } | ||
187 | |||
164 | public function getLinks() | 188 | public function getLinks() |
165 | { | 189 | { |
166 | return $this->_links; | 190 | return $this->_links; |
diff --git a/tpl/default/linklist.html b/tpl/default/linklist.html index 6a4e14a6..2568a5d6 100644 --- a/tpl/default/linklist.html +++ b/tpl/default/linklist.html | |||
@@ -91,7 +91,7 @@ | |||
91 | <div id="searchcriteria">{'Nothing found.'|t}</div> | 91 | <div id="searchcriteria">{'Nothing found.'|t}</div> |
92 | </div> | 92 | </div> |
93 | </div> | 93 | </div> |
94 | {elseif="!empty($search_term) or !empty($search_tags) or !empty($visibility)"} | 94 | {elseif="!empty($search_term) or $search_tags !== '' or !empty($visibility)"} |
95 | <div class="pure-g pure-alert pure-alert-success search-result"> | 95 | <div class="pure-g pure-alert pure-alert-success search-result"> |
96 | <div class="pure-u-2-24"></div> | 96 | <div class="pure-u-2-24"></div> |
97 | <div class="pure-u-20-24"> | 97 | <div class="pure-u-20-24"> |
@@ -107,6 +107,10 @@ | |||
107 | <a href="?removetag={function="urlencode($value)"}">{$value}<span class="remove"><i class="fa fa-times"></i></span></a> | 107 | <a href="?removetag={function="urlencode($value)"}">{$value}<span class="remove"><i class="fa fa-times"></i></span></a> |
108 | </span> | 108 | </span> |
109 | {/loop} | 109 | {/loop} |
110 | {elseif="$search_tags === false"} | ||
111 | <span class="label label-tag" title="{'Remove tag'|t}"> | ||
112 | <a href="?">{'untagged'|t}<span class="remove"><i class="fa fa-times"></i></span></a> | ||
113 | </span> | ||
110 | {/if} | 114 | {/if} |
111 | {if="!empty($visibility)"} | 115 | {if="!empty($visibility)"} |
112 | {'with status'|t} | 116 | {'with status'|t} |
diff --git a/tpl/vintage/linklist.html b/tpl/vintage/linklist.html index fc116667..8458caa1 100644 --- a/tpl/vintage/linklist.html +++ b/tpl/vintage/linklist.html | |||
@@ -55,7 +55,7 @@ | |||
55 | 55 | ||
56 | {if="count($links)==0"} | 56 | {if="count($links)==0"} |
57 | <div id="searchcriteria">Nothing found.</div> | 57 | <div id="searchcriteria">Nothing found.</div> |
58 | {elseif="!empty($search_term) or !empty($search_tags)"} | 58 | {elseif="!empty($search_term) or $search_tags !== ''"} |
59 | <div id="searchcriteria"> | 59 | <div id="searchcriteria"> |
60 | {$result_count} results | 60 | {$result_count} results |
61 | {if="!empty($search_term)"} | 61 | {if="!empty($search_term)"} |
@@ -69,6 +69,10 @@ | |||
69 | <a href="?removetag={function="urlencode($value)"}">{$value} <span class="remove">x</span></a> | 69 | <a href="?removetag={function="urlencode($value)"}">{$value} <span class="remove">x</span></a> |
70 | </span> | 70 | </span> |
71 | {/loop} | 71 | {/loop} |
72 | {elseif="$search_tags === false"} | ||
73 | <span class="linktag" title="Remove tag"> | ||
74 | <a href="?">untagged <span class="remove">x</span></a> | ||
75 | </span> | ||
72 | {/if} | 76 | {/if} |
73 | </div> | 77 | </div> |
74 | {/if} | 78 | {/if} |