Extension: tag_editcloud: Add or remove tags to the editor via clicking
This commit is contained in:
parent
20987de933
commit
46f1746337
107
contrib/tag_editcloud/main.php
Normal file
107
contrib/tag_editcloud/main.php
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Name: Tag EditCloud
|
||||||
|
* Author: AtomicDryad
|
||||||
|
* Description: Add or remove tags to the editor via clicking.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Todo:
|
||||||
|
* Be less kludgy
|
||||||
|
* $cfgstub->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 .= "<div id=\"tagcloud_extra\" style=\"display: none;\">";
|
||||||
|
$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 .= " <span onclick=\"tageditcloud_toggle_tag(this)\" class=\"tag-selected\" style='font-size: ${size}em' title='$usecount'>$h_tag</span> \n";
|
||||||
|
} else {
|
||||||
|
$counter++;
|
||||||
|
$cloud .= " <span onclick=\"tageditcloud_toggle_tag(this)\" style='font-size: ${size}em' title='$usecount'>$h_tag</span> \n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($precloud != '') $html .= "<div id=\"tagcloud_set\">$precloud</div>";
|
||||||
|
$html .="<div id=\"tagcloud_unset\">$cloud</div>";
|
||||||
|
$rem=count($tag_data)-$defcount;
|
||||||
|
// $script = "";
|
||||||
|
// $html.=$script;
|
||||||
|
if((!$alphasort)&&($counter>=$defcount)) $html .= "</div><br>[<span onclick=\"tageditcloud_toggle_extra('tagcloud_extra',this);\" style=\"color: #0000EF; font-weight:bold;\">show $rem more tags</span>]";
|
||||||
|
// $html.='<pre>'.var_export($itags,true).'</pre>';
|
||||||
|
return "<div id=\"tageditcloud\" class=\"tageditcloud\">$html</div>"; // 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());
|
||||||
|
?>
|
46
contrib/tag_editcloud/script.js
Normal file
46
contrib/tag_editcloud/script.js
Normal file
@ -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();
|
||||||
|
}
|
20
contrib/tag_editcloud/style.css
Normal file
20
contrib/tag_editcloud/style.css
Normal file
@ -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;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user