diff --git a/contrib/tag_editcloud/main.php b/contrib/tag_editcloud/main.php new file mode 100644 index 00000000..a75cb4fe --- /dev/null +++ b/contrib/tag_editcloud/main.php @@ -0,0 +1,107 @@ +board prefs + * toggle sorting method via javascript || usepref(todo2: port userpref) + * colorize used tags in cloud || always show used tags in front of cloud + * theme junk + */ +class TagEditCloud implements Extension { + var $theme; + + public function receive_event(Event $event) { + global $config, $database, $page, $user; + //if(is_null($this->theme)) $this->theme = get_theme_object($this); + + if($event instanceof ImageInfoBoxBuildingEvent) { + if($this->can_tag($event->image)) { + $cfgstub_sortbyname=false; // FIXME + $cfgstub_showtop=40; // Derp + $cfgstub_minuse=2; // Derp + if($cfgstub_sortbyname) { + $event->add_part($this->build_tag_map($event->image,$cfgstub_minuse,false),40); + } else { + $event->add_part($this->build_tag_map($event->image,$cfgstub_showtop,4096),40); + } + } + } + } + + private function tag_link($tag) { + $u_tag = url_escape($tag); + return make_link("post/list/$u_tag/1"); + } +///// build_tag_map: output cloud of clickable tags +// build_tag_map($image|false, $defcount, $maxcount|false) -- taglist sorted by usage, displaying $defcount by default, up to $maxcount via toggle. +// build_tag_map($image|false, $minusage|false) -- taglist sorted by alpha, only showing tags with usage >= $minusage + + private function build_tag_map($image,$defcount,$maxcount) { // + + global $database; + $html="";$cloud="";$precloud=""; + $itags=Array(); + $tags_min=1; + $alphasort=false; + if(!is_int($defcount)) $defcount=20; + if(!is_int($maxcount)) { // Derp this is pretty cheesy. + $maxcount=4096; // Hurrrr + $tags_min=$defcount; + $alphasort=true; + } + + if ((gettype($image) == 'object') && (isset($image->tag_array)) && ($itags=$image->tag_array)) $itags=array_fill_keys(array_values($itags),true); + + $result = $database->execute(" SELECT tag, FLOOR(LOG(2.7, LOG(2.7, count - ? + 1)+1)*1.5*100)/100 AS scaled, count + FROM tags WHERE count >= ? ORDER BY ". + (!$alphasort ? "count DESC":"tag"). + " limit $maxcount", + array($tags_min,$tags_min) + ); + + + + $tag_data = $result->GetArray(); + $counter=1; + foreach($tag_data as $row) { + if((!$alphasort)&&($counter==$defcount)) $cloud .= "
"; + $h_tag = html_escape($row['tag']); + $size = sprintf("%.2f", (float)$row['scaled']/2); + $usecount=$row['count']; + $link = $this->tag_link($row['tag']); + if($size<0.5) $size = 0.5; + if(isset($itags[$row['tag']])) { +// if($size<0.75) $size = 0.75; + $precloud .= " $h_tag \n"; + } else { + $counter++; + $cloud .= " $h_tag \n"; + } + } + if ($precloud != '') $html .= "
$precloud
"; + $html .="
$cloud
"; + $rem=count($tag_data)-$defcount; +// $script = ""; +// $html.=$script; + if((!$alphasort)&&($counter>=$defcount)) $html .= "

[show $rem more tags]"; +// $html.='
'.var_export($itags,true).'
'; + return "
$html
"; // FIXME: stupidasallhell + } + + + private function can_tag($image) { + global $config, $user; + return ( + ($config->get_bool("tag_edit_anon") || !$user->is_anonymous()) && + ($user->is_admin() || !$image->is_locked()) + ); + } + +} +add_event_listener(new TagEditCloud()); +?> diff --git a/contrib/tag_editcloud/script.js b/contrib/tag_editcloud/script.js new file mode 100644 index 00000000..b0384a88 --- /dev/null +++ b/contrib/tag_editcloud/script.js @@ -0,0 +1,46 @@ +Array.prototype.editcloud_contains = function (ele) { + for (var i = 0; i < this.length; i++) { + if (this[i] == ele) { + return true; + } + } + return false; +}; +Array.prototype.editcloud_remove = function (ele) { + var arr = new Array(); + var count = 0; + for (var i = 0; i < this.length; i++) { + if (this[i] != ele) { + arr[count] = this[i]; + count++; + } + } + return arr; +}; + +function tageditcloud_toggle_extra(obj,hide) { + var el = document.getElementById(obj); + el.style.display = (el.style.display != 'none' ? 'none' : '' ); + hide.innerHTML=(el.style.display != 'none' ? 'show less tags' : 'show more tags' ); +} + +function tageditcloud_toggle_tag(ele) { + var thisTag = ele.innerHTML; + var taglist = document.getElementById('tag_editor'); + var tags = taglist.value.split(' '); + + // If tag is already listed, remove it + if (tags.editcloud_contains(thisTag)) { + tags = tags.editcloud_remove(thisTag); + ele.className = 'tag-unselected'; + + // Otherwise add it + } else { + tags.splice(0, 0, thisTag); + ele.className = 'tag-selected'; + } + + taglist.value = tags.join(' '); + + document.getElementById('tags').focus(); +} diff --git a/contrib/tag_editcloud/style.css b/contrib/tag_editcloud/style.css new file mode 100644 index 00000000..0c5b9566 --- /dev/null +++ b/contrib/tag_editcloud/style.css @@ -0,0 +1,20 @@ +span.tag-selected { + background:#88EE88; +} + +.tageditcloud { + color: #0000FF; +} + +.tageditcloud div#tagcloud_unset { + color: #0000FF; +} + +.tageditcloud div#tagcloud_set { + color: #0000FF; + font-style:italic; +} + +.tageditcloud div#tagcloud_extra { + color: #0000FF; +}