Changed omitted related tags (like tagme) to be powered by a setting, allowing any performance-impacting (or just not useful in this context) tags to be omitted

Further tag list performance improvements
TagListConfig constants
This commit is contained in:
Matthew Barbour 2019-07-13 21:18:45 -05:00 committed by Shish
parent 8606c70437
commit 88e6e68d79
5 changed files with 226 additions and 102 deletions

View File

@ -110,6 +110,7 @@ class Tag
$term = str_replace('_', '\_', $term); $term = str_replace('_', '\_', $term);
$term = str_replace('%', '\%', $term); $term = str_replace('%', '\%', $term);
$term = str_replace('*', '%', $term); $term = str_replace('*', '%', $term);
$term = str_replace("?", "_", $term);
return $term; return $term;
} }
} }

View File

@ -585,7 +585,7 @@ class OuroborosAPI extends Extension
ORDER BY SCORE_STRNORM(substr(tag, 1, 1)) LIMIT :start, :max_items ORDER BY SCORE_STRNORM(substr(tag, 1, 1)) LIMIT :start, :max_items
" "
), ),
['tags_min' => $config->get_int('tags_min'), 'start' => $start, 'max_items' => $limit] ['tags_min' => $config->get_int(TagListConfig::TAGS_MIN), 'start' => $start, 'max_items' => $limit]
); );
break; break;
case 'count': case 'count':
@ -596,7 +596,7 @@ class OuroborosAPI extends Extension
WHERE count >= :tags_min WHERE count >= :tags_min
ORDER BY count DESC, tag ASC LIMIT :start, :max_items ORDER BY count DESC, tag ASC LIMIT :start, :max_items
", ",
['tags_min' => $config->get_int('tags_min'), 'start' => $start, 'max_items' => $limit] ['tags_min' => $config->get_int(TagListConfig::TAGS_MIN), 'start' => $start, 'max_items' => $limit]
); );
break; break;
case 'date': case 'date':
@ -607,7 +607,7 @@ class OuroborosAPI extends Extension
WHERE count >= :tags_min WHERE count >= :tags_min
ORDER BY count DESC, tag ASC LIMIT :start, :max_items ORDER BY count DESC, tag ASC LIMIT :start, :max_items
", ",
['tags_min' => $config->get_int('tags_min'), 'start' => $start, 'max_items' => $limit] ['tags_min' => $config->get_int(TagListConfig::TAGS_MIN), 'start' => $start, 'max_items' => $limit]
); );
break; break;
} }

31
ext/tag_list/config.php Normal file
View File

@ -0,0 +1,31 @@
<?php
class TagListConfig
{
public const LENGTH = "tag_list_length";
public const POPULAR_TAG_LIST_LENGTH = "popular_tag_list_length";
public CONSt TAGS_MIN = "tags_min";
public const INFO_LINK = "info_link";
public const IMAGE_TYPE = "tag_list_image_type";
public const RELATED_SORT = "tag_list_related_sort";
public const POPULAR_SORT = "tag_list_popular_sort";
public const PAGES = "tag_list_pages";
public const OMIT_TAGS = "tag_list_omit_tags";
public const TYPE_RELATED = "related";
public const TYPE_TAGS= "tags";
public const TYPE_CHOICES = [
"Image's tags only" => TagListConfig::TYPE_TAGS,
"Show related" => TagListConfig::TYPE_RELATED
];
public const SORT_ALPHABETICAL = "alphabetical";
public const SORT_TAG_COUNT = "tagcount";
public const SORT_CHOICES = [
"Tag Count" => TagListConfig::SORT_TAG_COUNT,
"Alphabetical" => TagListConfig::SORT_ALPHABETICAL
];
}

View File

@ -1,18 +1,21 @@
<?php <?php
require_once "config.php";
class TagList extends Extension class TagList extends Extension
{ {
public function onInitExt(InitExtEvent $event) public function onInitExt(InitExtEvent $event)
{ {
global $config; global $config;
$config->set_default_int("tag_list_length", 15); $config->set_default_int(TagListConfig::LENGTH, 15);
$config->set_default_int("popular_tag_list_length", 15); $config->set_default_int(TagListConfig::POPULAR_TAG_LIST_LENGTH, 15);
$config->set_default_int("tags_min", 3); $config->set_default_int(TagListConfig::TAGS_MIN, 3);
$config->set_default_string("info_link", 'http://en.wikipedia.org/wiki/$tag'); $config->set_default_string(TagListConfig::INFO_LINK, 'http://en.wikipedia.org/wiki/$tag');
$config->set_default_string("tag_list_image_type", 'related'); $config->set_default_string(TagListConfig::OMIT_TAGS, 'tagme*');
$config->set_default_string("tag_list_related_sort", 'alphabetical'); $config->set_default_string(TagListConfig::IMAGE_TYPE, TagListConfig::TYPE_RELATED);
$config->set_default_string("tag_list_popular_sort", 'tagcount'); $config->set_default_string(TagListConfig::RELATED_SORT, TagListConfig::SORT_ALPHABETICAL);
$config->set_default_bool("tag_list_pages", false); $config->set_default_string(TagListConfig::POPULAR_SORT, TagListConfig::SORT_TAG_COUNT);
$config->set_default_bool(TagListConfig::PAGES, false);
} }
public function onPageRequest(PageRequestEvent $event) public function onPageRequest(PageRequestEvent $event)
@ -78,7 +81,7 @@ class TagList extends Extension
public function onPostListBuilding(PostListBuildingEvent $event) public function onPostListBuilding(PostListBuildingEvent $event)
{ {
global $config, $page; global $config, $page;
if ($config->get_int('tag_list_length') > 0) { if ($config->get_int(TagListConfig::LENGTH) > 0) {
if (!empty($event->search_terms)) { if (!empty($event->search_terms)) {
$this->add_refine_block($page, $event->search_terms); $this->add_refine_block($page, $event->search_terms);
} else { } else {
@ -105,8 +108,8 @@ class TagList extends Extension
public function onDisplayingImage(DisplayingImageEvent $event) public function onDisplayingImage(DisplayingImageEvent $event)
{ {
global $config, $page; global $config, $page;
if ($config->get_int('tag_list_length') > 0) { if ($config->get_int(TagListConfig::LENGTH) > 0) {
if ($config->get_string('tag_list_image_type') == 'related') { if ($config->get_string(TagListConfig::IMAGE_TYPE) == TagListConfig::TYPE_RELATED) {
$this->add_related_block($page, $event->image); $this->add_related_block($page, $event->image);
} else { } else {
if (class_exists("TagCategories") and $config->get_bool(TagCategoriesConfig::SPLIT_ON_VIEW)) { if (class_exists("TagCategories") and $config->get_bool(TagCategoriesConfig::SPLIT_ON_VIEW)) {
@ -121,30 +124,30 @@ class TagList extends Extension
public function onSetupBuilding(SetupBuildingEvent $event) public function onSetupBuilding(SetupBuildingEvent $event)
{ {
$sb = new SetupBlock("Tag Map Options"); $sb = new SetupBlock("Tag Map Options");
$sb->add_int_option("tags_min", "Only show tags used at least "); $sb->add_int_option(TagListConfig::TAGS_MIN, "Only show tags used at least ");
$sb->add_label(" times"); $sb->add_label(" times");
$sb->add_bool_option("tag_list_pages", "<br>Paged tag lists: "); $sb->add_bool_option(TagListConfig::PAGES, "<br>Paged tag lists: ");
$event->panel->add_block($sb); $event->panel->add_block($sb);
$sb = new SetupBlock("Popular / Related Tag List"); $sb = new SetupBlock("Popular / Related Tag List");
$sb->add_int_option("tag_list_length", "Show top "); $sb->add_int_option(TagListConfig::LENGTH, "Show top ");
$sb->add_label(" related tags"); $sb->add_label(" related tags");
$sb->add_int_option("popular_tag_list_length", "<br>Show top "); $sb->add_int_option(TagListConfig::POPULAR_TAG_LIST_LENGTH, "<br>Show top ");
$sb->add_label(" popular tags"); $sb->add_label(" popular tags");
$sb->add_text_option("info_link", "<br>Tag info link: "); $sb->start_table();
$sb->add_choice_option("tag_list_image_type", [ $sb->add_text_option(TagListConfig::INFO_LINK, "Tag info link", true);
"Image's tags only" => "tags", $sb->add_text_option(TagListConfig::OMIT_TAGS, "Omit tags", true);
"Show related" => "related" $sb->add_choice_option(TagListConfig::IMAGE_TYPE,
], "<br>Image tag list: "); TagListConfig::TYPE_CHOICES,
$sb->add_choice_option("tag_list_related_sort", [ "Image tag list", true);
"Tag Count" => "tagcount", $sb->add_choice_option(TagListConfig::RELATED_SORT,
"Alphabetical" => "alphabetical" TagListConfig::SORT_CHOICES,
], "<br>Sort related list by: "); "Sort related list by", true);
$sb->add_choice_option("tag_list_popular_sort", [ $sb->add_choice_option(TagListConfig::POPULAR_SORT,
"Tag Count" => "tagcount", TagListConfig::SORT_CHOICES,
"Alphabetical" => "alphabetical" "Sort popular list by", true);
], "<br>Sort popular list by: "); $sb->add_bool_option("tag_list_numbers", "Show tag counts", true);
$sb->add_bool_option("tag_list_numbers", "<br>Show tag counts: "); $sb->end_table();
$event->panel->add_block($sb); $event->panel->add_block($sb);
} }
// }}} // }}}
@ -165,17 +168,56 @@ class TagList extends Extension
return int_escape($_GET['mincount']); return int_escape($_GET['mincount']);
} else { } else {
global $config; global $config;
return $config->get_int('tags_min'); // get the default. return $config->get_int(TagListConfig::TAGS_MIN); // get the default.
} }
} }
private static function get_omitted_tags(): array
{
global $config, $database;
$tags_config = $config->get_string(TagListConfig::OMIT_TAGS);
$results = $database->cache->get("tag_list_omitted_tags:".$tags_config);
if($results==null) {
$results = [];
$tags = explode(" ", $tags_config);
if (empty($tags)) {
return [];
}
$where = [];
$args = [];
$i = 0;
foreach ($tags as $tag) {
$i++;
$arg = "tag$i";
$args[$arg] = Tag::sqlify($tag);
if (strpos($tag, '*') === false
&& strpos($tag, '?') === false) {
$where[] = " tag = :$arg ";
} else {
$where[] = " tag LIKE :$arg ";
}
}
$results = $database->get_col("SELECT id FROM tags WHERE " . implode(" OR ", $where), $args);
$database->cache->set("tag_list_omitted_tags:" . $tags_config, $results, 600);
}
return $results;
}
private function get_starts_with(): string private function get_starts_with(): string
{ {
global $config; global $config;
if (isset($_GET['starts_with'])) { if (isset($_GET['starts_with'])) {
return $_GET['starts_with'] . "%"; return $_GET['starts_with'] . "%";
} else { } else {
if ($config->get_bool("tag_list_pages")) { if ($config->get_bool(TagListConfig::PAGES)) {
return "a%"; return "a%";
} else { } else {
return "%"; return "%";
@ -244,7 +286,7 @@ class TagList extends Extension
"), ["tags_min"=>$tags_min, "tags_min2"=>$tags_min, "starts_with"=>$starts_with]); "), ["tags_min"=>$tags_min, "tags_min2"=>$tags_min, "starts_with"=>$starts_with]);
$html = ""; $html = "";
if ($config->get_bool("tag_list_pages")) { if ($config->get_bool(TagListConfig::PAGES)) {
$html .= $this->build_az(); $html .= $this->build_az();
} }
foreach ($tag_data as $row) { foreach ($tag_data as $row) {
@ -287,7 +329,7 @@ class TagList extends Extension
"), ["tags_min"=>$tags_min, "starts_with"=>$starts_with]); "), ["tags_min"=>$tags_min, "starts_with"=>$starts_with]);
$html = ""; $html = "";
if ($config->get_bool("tag_list_pages")) { if ($config->get_bool(TagListConfig::PAGES)) {
$html .= $this->build_az(); $html .= $this->build_az();
} }
@ -407,27 +449,34 @@ class TagList extends Extension
} }
// }}} // }}}
// blocks {{{ // blocks {{{
private function add_related_block(Page $page, Image $image) private function add_related_block(Page $page, Image $image): void
{ {
global $database, $config; global $database, $config;
$query = " $omitted_tags = self::get_omitted_tags();
SELECT t3.tag AS tag, t3.count AS calc_count, it3.tag_id $starting_tags = $database->get_col("SELECT tag_id FROM image_tags WHERE image_id = :image_id",["image_id" => $image->id]);
FROM image_tags AS it1 -- Starting image's tags
INNER JOIN tags AS t1 ON t1.id = it1.tag_id AND t1.tag NOT LIKE 'tagme%' $starting_tags = array_diff($starting_tags,$omitted_tags);
-- Get images with the same tags as the starting image
INNER JOIN image_tags AS it2 ON it1.tag_id=it2.tag_id if(count($starting_tags) === 0) {
-- Get the tags from those other images except the same as the starting tags // No valid starting tags, so can't look anything up
INNER JOIN image_tags AS it3 ON it2.image_id=it3.image_id return;
LEFT JOIN image_tags it4 ON it4.image_id = it1.image_id AND it4.tag_id = it3.tag_id }
INNER JOIN tags AS t3 ON t3.id = it3.tag_id AND t3.tag NOT LIKE 'tagme%'
$query = "SELECT tags.* FROM tags INNER JOIN (
SELECT it2.tag_id
FROM image_tags AS it1
INNER JOIN image_tags AS it2 ON it1.image_id=it2.image_id
AND it2.tag_id NOT IN (".implode(",",array_merge($omitted_tags,$starting_tags)).")
WHERE WHERE
it1.image_id=:image_id it1.tag_id IN (".implode(",",$starting_tags).")
GROUP BY it3.tag_id, t3.tag, t3.count GROUP BY it2.tag_id
ORDER BY calc_count DESC ) A ON A.tag_id = tags.id
ORDER BY count DESC
LIMIT :tag_list_length LIMIT :tag_list_length
"; ";
$args = ["image_id" => $image->id, "tag_list_length" => $config->get_int('tag_list_length')];
$args = ["tag_list_length" => $config->get_int(TagListConfig::LENGTH)];
$tags = $database->get_all($query, $args); $tags = $database->get_all($query, $args);
if (count($tags) > 0) { if (count($tags) > 0) {
@ -440,11 +489,11 @@ class TagList extends Extension
global $database; global $database;
$query = " $query = "
SELECT tags.tag, tags.count as calc_count SELECT tags.tag, tags.count
FROM tags, image_tags FROM tags, image_tags
WHERE tags.id = image_tags.tag_id WHERE tags.id = image_tags.tag_id
AND image_tags.image_id = :image_id AND image_tags.image_id = :image_id
ORDER BY calc_count DESC ORDER BY tags.count DESC
"; ";
$args = ["image_id"=>$image->id]; $args = ["image_id"=>$image->id];
@ -459,11 +508,11 @@ class TagList extends Extension
global $database; global $database;
$query = " $query = "
SELECT tags.tag, tags.count as calc_count SELECT tags.tag, tags.count
FROM tags, image_tags FROM tags, image_tags
WHERE tags.id = image_tags.tag_id WHERE tags.id = image_tags.tag_id
AND image_tags.image_id = :image_id AND image_tags.image_id = :image_id
ORDER BY calc_count DESC ORDER BY tags.count DESC
"; ";
$args = ["image_id"=>$image->id]; $args = ["image_id"=>$image->id];
@ -479,16 +528,32 @@ class TagList extends Extension
$tags = $database->cache->get("popular_tags"); $tags = $database->cache->get("popular_tags");
if (empty($tags)) { if (empty($tags)) {
$omitted_tags = self::get_omitted_tags();
if(empty($omitted_tags)) {
$query = " $query = "
SELECT tag, count as calc_count SELECT tag, count
FROM tags FROM tags
WHERE count > 0 WHERE count > 0
ORDER BY count DESC ORDER BY count DESC
LIMIT :popular_tag_list_length LIMIT :popular_tag_list_length
"; ";
$args = ["popular_tag_list_length"=>$config->get_int('popular_tag_list_length')];
} else {
$query = "
SELECT tag, count
FROM tags
WHERE count > 0
AND id NOT IN (".(implode(",", $omitted_tags)).")
ORDER BY count DESC
LIMIT :popular_tag_list_length
";
}
$args = ["popular_tag_list_length"=>$config->get_int(TagListConfig::POPULAR_TAG_LIST_LENGTH)];
$tags = $database->get_all($query, $args); $tags = $database->get_all($query, $args);
$database->cache->set("popular_tags", $tags, 600); $database->cache->set("popular_tags", $tags, 600);
} }
if (count($tags) > 0) { if (count($tags) > 0) {
@ -507,6 +572,20 @@ class TagList extends Extension
return; return;
} }
$wild_tags = $search;
$related_tags = self::get_related_tags($search, $config->get_int(TagListConfig::LENGTH));
if (!empty($related_tags)) {
$this->theme->display_refine_block($page, $related_tags, $wild_tags);
}
}
public static function get_related_tags(array $search, int $limit): array
{
global $config, $database;
$wild_tags = $search; $wild_tags = $search;
$str_search = Tag::implode($search); $str_search = Tag::implode($search);
$related_tags = $database->cache->get("related_tags:$str_search"); $related_tags = $database->cache->get("related_tags:$str_search");
@ -514,53 +593,66 @@ class TagList extends Extension
if (empty($related_tags)) { if (empty($related_tags)) {
// $search_tags = array(); // $search_tags = array();
$tag_id_array = []; $starting_tags = [];
$tags_ok = true; $tags_ok = true;
foreach ($wild_tags as $tag) { foreach ($wild_tags as $tag) {
if ($tag[0] == "-" || strpos($tag, "tagme")===0) { if ($tag[0] == "-") {
continue; continue;
} }
$tag = str_replace("*", "%", $tag);
$tag = str_replace("?", "_", $tag); $tag = Tag::sqlify($tag);
$tag_ids = $database->get_col("SELECT id FROM tags WHERE tag LIKE :tag AND count < 25000", ["tag" => $tag]); $tag_ids = $database->get_col("SELECT id FROM tags WHERE tag LIKE :tag AND count < 25000", ["tag" => $tag]);
// $search_tags = array_merge($search_tags, // $search_tags = array_merge($search_tags,
// $database->get_col("SELECT tag FROM tags WHERE tag LIKE :tag", array("tag"=>$tag))); // $database->get_col("SELECT tag FROM tags WHERE tag LIKE :tag", array("tag"=>$tag)));
$tag_id_array = array_merge($tag_id_array, $tag_ids); $starting_tags = array_merge($starting_tags, $tag_ids);
$tags_ok = count($tag_ids) > 0; $tags_ok = count($tag_ids) > 0;
if (!$tags_ok) { if (!$tags_ok) {
break; break;
} }
} }
$tag_id_list = join(', ', $tag_id_array);
if (count($tag_id_array) > 5 || count($tag_id_array) == 0) { if (count($starting_tags) > 5 || count($starting_tags) === 0) {
return; return [];
}
$omitted_tags = self::get_omitted_tags();
$starting_tags = array_diff($starting_tags,$omitted_tags);
if(count($starting_tags) === 0) {
// No valid starting tags, so can't look anything up
return [];
} }
if ($tags_ok) { if ($tags_ok) {
$query = " $query = "SELECT t.tag, A.calc_count AS count FROM tags t INNER JOIN (
SELECT t2.tag AS tag, COUNT(it2.image_id) AS calc_count SELECT it2.tag_id, COUNT(it2.image_id) AS calc_count
FROM image_tags AS it1 -- Got other images with the same tags FROM image_tags AS it1 -- Got other images with the same tags
-- Get the tags from those images, except those the same as the starting tags INNER JOIN image_tags AS it2 ON it1.image_id=it2.image_id
INNER JOIN image_tags AS it2 ON it1.image_id=it2.image_id AND it2.tag_id NOT IN($tag_id_list) -- And filter out unwanted tags
-- And filter out anything starting with tagme AND it2.tag_id NOT IN (".implode(",",array_merge($omitted_tags,$starting_tags)).")
INNER JOIN tags AS t2 ON it2.tag_id = t2.id AND t2.tag NOT LIKE 'tagme%'
WHERE WHERE
it1.tag_id IN($tag_id_list) it1.tag_id IN (".implode(",",$starting_tags).")
GROUP BY t2.tag GROUP BY it2.tag_id) A ON A.tag_id = t.id
ORDER BY calc_count ORDER BY A.calc_count
DESC LIMIT :limit DESC LIMIT :limit
"; ";
$args = ["limit"=>$config->get_int('tag_list_length')]; $args = ["limit" => $limit];
$related_tags = $database->get_all($query, $args); $related_tags = $database->get_all($query, $args);
$database->cache->set("related_tags:$str_search", $related_tags, 60*60); $database->cache->set("related_tags:$str_search", $related_tags, 60 * 60);
}
} }
if (!empty($related_tags)) {
$this->theme->display_refine_block($page, $related_tags, $wild_tags);
} }
if ($related_tags === false) {
return [];
} else {
return $related_tags;
} }
}
// }}} // }}}
} }

View File

@ -38,7 +38,7 @@ class TagListTheme extends Themelet
{ {
global $config; global $config;
$tag_info_link_is_visible = !is_null($config->get_string('info_link')); $tag_info_link_is_visible = !is_null($config->get_string(TagListConfig::INFO_LINK));
$tag_count_is_visible = $config->get_bool("tag_list_numbers"); $tag_count_is_visible = $config->get_bool("tag_list_numbers");
return ' return '
@ -68,7 +68,7 @@ class TagListTheme extends Themelet
{ {
global $config; global $config;
if ($config->get_string('tag_list_related_sort') == 'alphabetical') { if ($config->get_string(TagListConfig::RELATED_SORT) == TagListConfig::SORT_ALPHABETICAL) {
asort($tag_infos); asort($tag_infos);
} }
@ -117,14 +117,14 @@ class TagListTheme extends Themelet
$page->add_block(new Block($category_display_name, $tag_categories_html[$category], "left", 9)); $page->add_block(new Block($category_display_name, $tag_categories_html[$category], "left", 9));
} }
if ($config->get_string('tag_list_image_type')=="tags") {
if ($main_html != null) { if ($main_html != null) {
if ($config->get_string(TagListConfig::IMAGE_TYPE)==TagListConfig::TYPE_TAGS) {
$page->add_block(new Block("Tags", $main_html, "left", 10)); $page->add_block(new Block("Tags", $main_html, "left", 10));
}
} else { } else {
$page->add_block(new Block("Related Tags", $main_html, "left", 10)); $page->add_block(new Block("Related Tags", $main_html, "left", 10));
} }
} }
}
/* /*
* $tag_infos = array( * $tag_infos = array(
@ -134,7 +134,7 @@ class TagListTheme extends Themelet
*/ */
private function get_tag_list_html($tag_infos, $sort) private function get_tag_list_html($tag_infos, $sort)
{ {
if ($sort == 'alphabetical') { if ($sort == TagListConfig::SORT_ALPHABETICAL) {
asort($tag_infos); asort($tag_infos);
} }
@ -170,10 +170,10 @@ class TagListTheme extends Themelet
$main_html = $this->get_tag_list_html( $main_html = $this->get_tag_list_html(
$tag_infos, $tag_infos,
$config->get_string('tag_list_related_sort') $config->get_string(TagListConfig::RELATED_SORT)
); );
if ($config->get_string('tag_list_image_type')=="tags") { if ($config->get_string(TagListConfig::IMAGE_TYPE)==TagListConfig::TYPE_TAGS) {
$page->add_block(new Block("Tags", $main_html, "left", 10)); $page->add_block(new Block("Tags", $main_html, "left", 10));
} else { } else {
$page->add_block(new Block("Related Tags", $main_html, "left", 10)); $page->add_block(new Block("Related Tags", $main_html, "left", 10));
@ -193,7 +193,7 @@ class TagListTheme extends Themelet
$main_html = $this->get_tag_list_html( $main_html = $this->get_tag_list_html(
$tag_infos, $tag_infos,
$config->get_string('tag_list_popular_sort') $config->get_string(TagListConfig::POPULAR_SORT)
); );
$main_html .= "&nbsp;<br><a class='more' href='".make_link("tags")."'>Full List</a>\n"; $main_html .= "&nbsp;<br><a class='more' href='".make_link("tags")."'>Full List</a>\n";
@ -213,7 +213,7 @@ class TagListTheme extends Themelet
$main_html = $this->get_tag_list_html( $main_html = $this->get_tag_list_html(
$tag_infos, $tag_infos,
$config->get_string('tag_list_popular_sort') $config->get_string(TagListConfig::POPULAR_SORT)
); );
$main_html .= "&nbsp;<br><a class='more' href='".make_link("tags")."'>Full List</a>\n"; $main_html .= "&nbsp;<br><a class='more' href='".make_link("tags")."'>Full List</a>\n";
@ -242,10 +242,10 @@ class TagListTheme extends Themelet
} }
$h_tag_no_underscores = str_replace("_", " ", $h_tag); $h_tag_no_underscores = str_replace("_", " ", $h_tag);
$count = $row['calc_count']; $count = $row['count'];
// if($n++) $display_html .= "\n<br/>"; // if($n++) $display_html .= "\n<br/>";
if (!is_null($config->get_string('info_link'))) { if (!is_null($config->get_string(TagListConfig::INFO_LINK))) {
$link = html_escape(str_replace('$tag', url_escape($tag), $config->get_string('info_link'))); $link = html_escape(str_replace('$tag', url_escape($tag), $config->get_string(TagListConfig::INFO_LINK)));
$display_html .= '<td class="tag_info_link_cell"> <a class="tag_info_link'.$tag_category_css.'" '.$tag_category_style.'href="'.$link.'">?</a></td>'; $display_html .= '<td class="tag_info_link_cell"> <a class="tag_info_link'.$tag_category_css.'" '.$tag_category_style.'href="'.$link.'">?</a></td>';
} }
$link = $this->tag_link($row['tag']); $link = $this->tag_link($row['tag']);