add('name', PLUGIN_EVENT_FREETAG_TITLE);
$propbag->add('description', PLUGIN_EVENT_FREETAG_DESC);
$propbag->add('stackable', false);
$propbag->add('author', 'Garvin Hicking, Jonathan Arkell, Grischa Brockhaus, Lars Strojny, Malte Paskuda, Ian');
$propbag->add('requirements', array(
'serendipity' => '0.8',
'smarty' => '2.6.7',
'php' => '4.1.0'
));
$propbag->add('version', '3.63');
$propbag->add('event_hooks', array(
'frontend_fetchentries' => true,
'frontend_fetchentry' => true,
'frontend_display:rss-2.0:per_entry' => true,
'frontend_header' => true,
// 'frontend_display:rss-0.92:per_entry' => true,
'frontend_display:rss-1.0:per_entry' => true,
// 'frontend_display:rss-0.91:per_entry' => true,
'frontend_display:atom-0.3:per_entry' => true,
'frontend_display:atom-1.0:per_entry' => true,
'frontend_entryproperties' => true,
'frontend_rss' => true,
'entry_display' => true,
'entries_header' => true,
'backend_publish' => true,
'backend_save' => true,
'backend_display' => true,
'backend_sidebar_entries' => true,
'backend_sidebar_entries_event_display_managetags' => true,
'backend_delete_entry' => true,
'external_plugin' => true,
'xmlrpc_updertEntry' => true,
'xmlrpc_fetchEntry' => true,
'xmlrpc_deleteEntry' => true,
'css' => true,
'js_backend' => true
));
$propbag->add('groups', array('BACKEND_EDITOR'));
$this->supported_properties = array('freetag_name', 'freetag_tagList');
$this->dependencies = array('serendipity_plugin_freetag' => 'keep');
$propbag->add('configuration', array('cat2tag', 'keyword2tag', 'taglink', 'taglist', 'embed_footer', 'extended_smarty', 'show_tagcloud', 'min_percent', 'max_percent', 'max_tags', 'use_flash', 'flash_tag_color', 'flash_bg_trans', 'flash_bg_color', 'flash_width', 'flash_speed', 'meta_keywords', 'show_related', 'show_related_count', 'lowercase_tags', 'collation', 'send_http_header', 'admin_show_taglist', 'admin_ftayt', 'technorati_tag_link', 'technorati_tag_image'));
}
function introspect_config_item($name, &$propbag) {
global $serendipity;
switch($name) {
case 'show_tagcloud':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_SHOW_TAGCLOUD);
$propbag->add('description', '');
$propbag->add('default', true);
break;
case 'cat2tag':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_CAT2TAG);
$propbag->add('description', PLUGIN_EVENT_FREETAG_CAT2TAG_DESC);
$propbag->add('default', false);
break;
case 'keyword2tag':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_KEYWORD2TAG);
$propbag->add('description', PLUGIN_EVENT_FREETAG_KEYWORD2TAG_DESC);
$propbag->add('default', false);
break;
case 'embed_footer':
$propbag->add('type', 'select');
$propbag->add('name', PLUGIN_EVENT_FREETAG_EMBED_FOOTER);
$propbag->add('description', PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC . ' ' . PLUGIN_EVENT_FREETAG_EMBED_FOOTER_DESC2);
$propbag->add('select_values', array(
'yes' => YES,
'no' => NO,
'smarty' => 'Smarty'
));
$propbag->add('default', 'true');
break;
case 'extended_smarty':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_EXTENDED_SMARTY);
$propbag->add('description', PLUGIN_EVENT_FREETAG_EXTENDED_SMARTY_DESC);
$propbag->add('default', false);
break;
case 'taglist':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_TAGSASLIST);
$propbag->add('description', PLUGIN_EVENT_FREETAG_TAGSASLIST_DESC);
$propbag->add('default', false);
break;
case 'taglink':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_EVENT_FREETAG_TAGLINK);
$propbag->add('description', PLUGIN_EVENT_FREETAG_TAGLINK_DESC);
$propbag->add('default', $serendipity['baseURL'] . ($serendipity['rewrite'] == 'none' ? $serendipity['indexFile'] . '?/' : '') . 'plugin/tag/');
break;
case 'min_percent':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_EVENT_FREETAG_TAGCLOUD_MIN);
$propbag->add('description', '');
$propbag->add('default', '100');
break;
case 'max_percent':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_EVENT_FREETAG_TAGCLOUD_MAX);
$propbag->add('description', '');
$propbag->add('default', '300');
break;
case 'collation':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_EVENT_FREETAG_COLLATION);
$propbag->add('description', '');
$propbag->add('default', '');
break;
case 'max_tags':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_FREETAG_MAX_TAGS);
$propbag->add('description', '');
$propbag->add('default', '45');
break;
case 'meta_keywords':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_FREETAG_META_KEYWORDS);
$propbag->add('description', '');
$propbag->add('default', '0');
break;
case 'show_related':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_SHOW_RELATED);
$propbag->add('description', '');
$propbag->add('default', true);
break;
case 'show_related_count':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_EVENT_FREETAG_SHOW_RELATED_COUNT);
$propbag->add('description', '');
$propbag->add('default', '5');
break;
case 'lowercase_tags':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_LOWERCASE_TAGS);
$propbag->add('description', '');
$propbag->add('default', true);
break;
case 'send_http_header':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_SEND_HTTP_HEADER);
$propbag->add('description', '');
$propbag->add('default', true);
break;
case 'admin_show_taglist':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_ADMIN_TAGLIST);
$propbag->add('description', '');
$propbag->add('default', true);
break;
case 'admin_ftayt':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_ADMIN_FTAYT);
$propbag->add('description', '');
$propbag->add('default', false);
break;
case 'technorati_tag_link':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_TECHNORATI_TAGLINK);
$propbag->add('description', PLUGIN_EVENT_FREETAG_TECHNORATI_TAGLINK_DESC);
$propbag->add('default', false);
break;
case 'technorati_tag_image':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_EVENT_FREETAG_TECHNORATI_TAGLINK_IMG);
$propbag->add('description', '');
$propbag->add('default', 'http://static.technorati.com/static/img/pub/icon-utag-16x13.png');
break;
case 'use_flash':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_USE_FLASH);
$propbag->add('description', '');
$propbag->add('default', false);
break;
case 'flash_bg_trans':
$propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_EVENT_FREETAG_FLASH_TRANSPARENT);
$propbag->add('description', '');
$propbag->add('default', false);
break;
case 'flash_tag_color':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_EVENT_FREETAG_FLASH_TAG_COLOR);
$propbag->add('description', '');
$propbag->add('default', 'ff6600');
break;
case 'flash_bg_color':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_EVENT_FREETAG_FLASH_BG_COLOR);
$propbag->add('description', '');
$propbag->add('default', 'ffffff');
break;
case 'flash_width':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_EVENT_FREETAG_FLASH_WIDTH);
$propbag->add('description', '');
$propbag->add('default', '500');
break;
case 'flash_speed':
$propbag->add('type', 'string');
$propbag->add('name', PLUGIN_EVENT_FREETAG_FLASH_SPEED);
$propbag->add('description', '');
$propbag->add('default', '100');
break;
}
return true;
}
function generate_content(&$title) {
$title = $this->title;
}
static function tableCreated($table = 'entrytags') {
global $serendipity;
$q = "select count(tag) from {$serendipity['dbPrefix']}" . $table;
$row = serendipity_db_query($q, true, 'num');
if (!is_numeric($row[0])) { // if the response we got back was an SQL error.. :P
return false;
} else {
return true;
}
}
static function upgradeFromVersion1() {
global $serendipity;
$q = "SELECT count(*) FROM {$serendipity['dbPrefix']}entryproperties WHERE property = 'ep_freetag_name'";
$result = serendipity_db_query($q);
if ((int)$result[0] > 0) {
return true;
} else {
return false;
}
}
static function convertEntryPropertiesTags() {
global $serendipity;
$q = "SELECT entryid, value FROM {$serendipity['dbPrefix']}entryproperties WHERE property = 'ep_freetag_name'";
$result = serendipity_db_query($q);
if (!is_array($result)) {
return false;
}
foreach($result as $entry) {
$tags = serendipity_event_freetag::makeTagsFromTaglist($entry['value']);
serendipity_event_freetag::addTagsToEntry($entry['entryid'], $tags);
printf(PLUGIN_FREETAG_UPGRADE1_2, count($tags), $entry['entryid']);
echo '
';
}
$q = "DELETE FROM {$serendipity['dbPrefix']}entryproperties WHERE property = 'ep_freetag_name'";
$result = serendipity_db_query($q);
}
function cleanup() {
global $serendipity;
serendipity_event_freetag::static_install();
}
function install() {
serendipity_event_freetag::static_install();
}
static function static_install() {
global $serendipity;
if (!serendipity_event_freetag::tableCreated('entrytags')) {
$q = "CREATE TABLE {$serendipity['dbPrefix']}entrytags (" .
"entryid int(10) not null, " .
"tag varchar(50) not null, " .
"primary key (entryid, tag)" .
")";
$result = serendipity_db_schema_import($q);
if ($result !== true) {
return;
}
serendipity_db_schema_import("CREATE INDEX tagsentryindex ON {$serendipity['dbPrefix']}entrytags (entryid)");
serendipity_db_schema_import("CREATE INDEX tagsTagIndex ON {$serendipity['dbPrefix']}entrytags (tag)");
}
if (!serendipity_event_freetag::tableCreated('tagkeywords')) {
$q = "CREATE TABLE {$serendipity['dbPrefix']}tagkeywords (" .
"keywords text, " .
"tag varchar(50) not null, " .
"primary key (tag)" .
")";
$result = serendipity_db_schema_import($q);
}
if (serendipity_event_freetag::upgradeFromVersion1()) {
serendipity_event_freetag::convertEntryPropertiesTags();
} else {
echo "NOT UPGRADING!";
}
}
static function makeURLTag($tag) {
return str_replace('.', '%FF', urlencode($tag));
}
function getTagHtmlFromCSV($tagString) {
global $serendipity;
static $taglink = null;
if ($taglink == null) {
$taglink = $this->get_config('taglink');
}
$links = array();
if (empty($tagString)) {
return array();
}
$tags = explode(',', $tagString);
foreach($tags as $tag) {
$tag = trim($tag);
if (empty($tag)) {
continue;
}
$links[] = '' . (function_exists('serendipity_specialchars') ? serendipity_specialchars($tag) : htmlspecialchars($tag, ENT_COMPAT, LANG_CHARSET)) . '';
}
return implode(', ', $links);
}
function getTagHtml($tags, $extended_smarty = false) {
global $serendipity;
static $taglink = null;
$links = array();
if ($taglink == null) {
$taglink = $this->get_config('taglink');
}
if (!is_array($tags)) {
return '';
}
$technorati = $this->get_config('technorati_tag_link');
$technorati_img = $this->get_config('technorati_tag_image');
$img_url = $this->get_config('path_img',$serendipity['serendipityHTTPPath'] . 'plugins/serendipity_event_freetag/img/');
foreach($tags as $tag) {
$tag = trim($tag);
if (empty($tag)) {
continue;
}
$links[] = '' . (function_exists('serendipity_specialchars') ? serendipity_specialchars($tag) : htmlspecialchars($tag, ENT_COMPAT, LANG_CHARSET)) . '' .
($technorati?'':'');
}
if ($extended_smarty) {
return $links;
} else {
return implode(', ', $links);
}
}
function getRelatedEntries($tags, $postID) {
global $serendipity;
if (!is_array($tags)) {
return false;
}
foreach($tags AS $idx => $tag) {
$tags[$idx] = serendipity_db_escape_string($tag);
}
$q = "SELECT DISTINCT e1.entryid,
e2.title,
e2.timestamp
FROM {$serendipity['dbPrefix']}entrytags AS e1
LEFT JOIN {$serendipity['dbPrefix']}entries AS e2
ON e1.entryid = e2.id
WHERE e1.tag IN ('" . implode("', '", $tags) . "')
AND e1.entryid != " . (int)$postID . "
AND e2.isdraft = 'false'
" . (!serendipity_db_bool($serendipity['showFutureEntries']) ? " AND e2.timestamp <= " . time() : '') . "
ORDER BY e2.timestamp DESC
LIMIT " . $this->get_config('show_related_count', 10);
$result = serendipity_db_query($q, false, 'assoc', false, 'entryid', 'title');
if (!is_array($result)) {
return false;
}
return $result;
}
function getRelatedEntriesHtml(&$entries, $extended_smarty = false) {
global $serendipity;
if (!is_array($entries)) {
return false;
}
$entrylink = $serendipity['baseURL'] . ($serendipity['rewrite'] == 'none' ? $serendipity['indexFile'] . '?/' : '/');
if ($extended_smarty) {
$return = array();
$return['description'] = PLUGIN_EVENT_FREETAG_RELATED_ENTRIES;
foreach($entries AS $entryid => $title) {
$return['entries'][] = '' . (function_exists('serendipity_specialchars') ? serendipity_specialchars($title) : htmlspecialchars($title, ENT_COMPAT, LANG_CHARSET)) . '';
}
} else {
$return = '