qa-tag-cloud.php 4.06 KB
Newer Older
Scott committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
<?php
/*
	Question2Answer by Gideon Greenspan and contributors
	http://www.question2answer.org/

	File: qa-plugin/tag-cloud-widget/qa-tag-cloud.php
	Description: Widget module class for tag cloud plugin


	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	More about this license: http://www.question2answer.org/license.php
*/

Scott committed
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
class qa_tag_cloud
{
	public function option_default($option)
	{
		if ($option === 'tag_cloud_count_tags')
			return 100;
		if ($option === 'tag_cloud_font_size')
			return 24;
		if ($option === 'tag_cloud_minimal_font_size')
			return 8;
		if ($option === 'tag_cloud_size_popular')
			return true;
	}


	public function admin_form()
	{
		$saved = qa_clicked('tag_cloud_save_button');

		if ($saved) {
			qa_opt('tag_cloud_count_tags', (int) qa_post_text('tag_cloud_count_tags_field'));
			qa_opt('tag_cloud_font_size', (int) qa_post_text('tag_cloud_font_size_field'));
			qa_opt('tag_cloud_minimal_font_size', (int) qa_post_text('tag_cloud_minimal_font_size_field'));
			qa_opt('tag_cloud_size_popular', (int) qa_post_text('tag_cloud_size_popular_field'));
Scott committed
47 48
		}

Scott committed
49 50
		return array(
			'ok' => $saved ? 'Tag cloud settings saved' : null,
Scott committed
51

Scott committed
52 53 54 55 56 57 58 59
			'fields' => array(
				array(
					'label' => 'Maximum tags to show:',
					'type' => 'number',
					'value' => (int) qa_opt('tag_cloud_count_tags'),
					'suffix' => 'tags',
					'tags' => 'name="tag_cloud_count_tags_field"',
				),
Scott committed
60

Scott committed
61 62 63 64 65 66 67
				array(
					'label' => 'Biggest font size:',
					'suffix' => 'pixels',
					'type' => 'number',
					'value' => (int) qa_opt('tag_cloud_font_size'),
					'tags' => 'name="tag_cloud_font_size_field"',
				),
Scott committed
68

Scott committed
69 70 71 72 73 74
				array(
					'label' => 'Smallest allowed font size:',
					'suffix' => 'pixels',
					'type' => 'number',
					'value' => (int) qa_opt('tag_cloud_minimal_font_size'),
					'tags' => 'name="tag_cloud_minimal_font_size_field"',
Scott committed
75 76
				),

Scott committed
77 78 79 80 81
				array(
					'label' => 'Font size represents tag popularity',
					'type' => 'checkbox',
					'value' => qa_opt('tag_cloud_size_popular'),
					'tags' => 'name="tag_cloud_size_popular_field"',
Scott committed
82
				),
Scott committed
83
			),
Scott committed
84

Scott committed
85 86 87 88 89 90 91 92
			'buttons' => array(
				array(
					'label' => 'Save Changes',
					'tags' => 'name="tag_cloud_save_button"',
				),
			),
		);
	}
Scott committed
93 94


Scott committed
95 96 97 98 99 100 101 102
	public function allow_template($template)
	{
		$allowed = array(
			'activity', 'qa', 'questions', 'hot', 'ask', 'categories', 'question',
			'tag', 'tags', 'unanswered', 'user', 'users', 'search', 'admin', 'custom',
		);
		return in_array($template, $allowed);
	}
Scott committed
103 104


Scott committed
105 106 107 108
	public function allow_region($region)
	{
		return ($region === 'side');
	}
Scott committed
109 110


Scott committed
111 112
	public function output_widget($region, $place, $themeobject, $template, $request, $qa_content)
	{
Scott committed
113
		require_once QA_INCLUDE_DIR.'db/selects.php';
Scott committed
114

Scott committed
115
		$populartags = qa_db_single_select(qa_db_popular_tags_selectspec(0, (int) qa_opt('tag_cloud_count_tags')));
Scott committed
116

Scott committed
117
		$maxcount = reset($populartags);
Scott committed
118

Scott committed
119
		$themeobject->output(sprintf('<h2 style="margin-top: 0; padding-top: 0;">%s</h2>', qa_lang_html('main/popular_tags')));
Scott committed
120

Scott committed
121
		$themeobject->output('<div style="font-size: 10px;">');
Scott committed
122

Scott committed
123 124 125 126
		$maxsize = qa_opt('tag_cloud_font_size');
		$minsize = qa_opt('tag_cloud_minimal_font_size');
		$scale = qa_opt('tag_cloud_size_popular');
		$blockwordspreg = qa_get_block_words_preg();
Scott committed
127

Scott committed
128 129 130 131 132 133 134 135 136
		foreach ($populartags as $tag => $count) {
			$matches = qa_block_words_match_all($tag, $blockwordspreg);
			if (empty($matches)) {
				if ($scale) {
					$size = number_format($maxsize * $count / $maxcount, 1);
					if ($size < $minsize)
						$size = $minsize;
				} else
					$size = $maxsize;
Scott committed
137

Scott committed
138 139
				$themeobject->output(sprintf('<a href="%s" style="font-size: %dpx; vertical-align: baseline;">%s</a>', qa_path_html('tag/' . $tag), $size, qa_html($tag)));
			}
Scott committed
140 141
		}

Scott committed
142
		$themeobject->output('</div>');
Scott committed
143
	}
Scott committed
144
}