a:8:{s:7:"version";s:3:"0.2";s:6:"author";s:17:"Michele Campeotto";s:10:"author_uri";s:21:"http://micampe.it/log";s:11:"description";s:49:"Display Technorati Cosmos for the current article";s:4:"name";s:21:"mic_technorati_cosmos";s:4:"help";s:1:"
";s:4:"code";s:4548:"
// Plugin configuration
define("COSMOS_CACHE_DIR", "cache/cosmos/");
define("TECHNORATI_KEY", "YOUR KEY HERE");

// Don't change anything below

define("TECHNORATI_CALL", "http://api.technorati.com/cosmos?format=xml&current=no&claim=1&key=".TECHNORATI_KEY."&url=");

function mic_technorati_cosmos($atts) {
	global $mic_cosmos_list;

	extract(lAtts(array(
		'label'    => 'Technorati Cosmos',
		'bubble'   => '/img/technorati_bubble.gif',
		'excerpt'  => '1',
		'nofollow' => '0'
	), $atts));

	$the_form = fetch('form', 'txp_form', 'name', $form);

	$url = "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];

	mic_get_cosmos($url);

	$out = '<!-- Technorati Cosmos for '.$url.' -->';
	if (count($mic_cosmos_list) > 0) {
		if ($label) {
			$out .= '<h3 class="cosmos_label">'.$label;
			if ($bubble) {
				$out .= '&nbsp;<a href="http://www.technorati.com/cosmos/search.html?url='.$url.'"  title="Technorati Link Cosmos for this post"><img style="border: 0; vertical-align: middle;" src="'.$bubble.'" alt="Technorati Cosmos" /></a>';
			}
			$out .= '</h3>';
		}
		$out .= '<ul class="cosmos_list">';
		$items = array();
		foreach ($mic_cosmos_list as $cosmo) {
			if ((!empty($cosmo->permalink) and is_int(array_search($cosmo->permalink, $items))) or
				(empty($cosmo->permalink) and is_int(array_search($cosmo->link, $items)))) {
				// Skip the item if we have already seen it
				continue;
			}
			$items[] = $cosmo->permalink;
			$items[] = $cosmo->link;

			$title = $cosmo->title;
			$link = (!empty($cosmo->permalink))?$cosmo->permalink:$cosmo->link;
			$body = $cosmo->excerpt;

			$out .= '<li><a href="'.$link.'" title="'.$title.'"'.($nofollow?' rel="nofollow"':'').'>'.$title.'</a>';
			if ($excerpt) {
				$out .= ' &mdash; '.$body;
			}
			$out .= '</li>';
		}
		$out .= '</ul>';
	}

	return $out;
}

function mic_get_cosmos($url) {
	global $mic_cosmos_list, $mic_cosmos_counter, $mic_cosmos_current_tag;

	$filename = COSMOS_CACHE_DIR.sha1($url);
	$technorati_call = TECHNORATI_CALL.$url;

	$modtime = file_exists($filename)?filemtime($filename):0;
	if (((time() - $modtime) > 21600)) {
		$a = file($technorati_call);
		set_time_limit(10);
		$contents = implode('', $a);
		$cachefp = fopen($filename, 'w');
		fwrite($cachefp, $contents);
		fclose($cachefp);
	}

	$mic_cosmos_list = array();
	$mic_cosmos_counter = 0;
	$xml_parser = xml_parser_create();
	xml_set_element_handler($xml_parser, "mic_startCosmoElement", "mic_endCosmoElement");
	xml_set_character_data_handler($xml_parser, "mic_cosmoData");
	$fp = fopen($filename, 'r') or die("Error reading XML data.");
	while ($data = fread($fp, 16384)) {
		xml_parse($xml_parser, $data, feof($fp));
	}
	fclose($fp);
	xml_parser_free($xml_parser);
}

class mic_cosmoItem {
	var $title;
	var $link;
	var $firstName;
	var $lastName;
	var $permalink;
	var $excerpt;
}

function mic_startCosmoElement($parser, $tagName, $attrs) {
	global $mic_cosmos_list, $mic_cosmos_counter, $mic_cosmos_current_tag;
	$mic_cosmos_current_tag .= "^$tagName";
	if ($tagName == "ITEM") {
		$mic_cosmos_list[$mic_cosmos_counter] = new mic_cosmoItem();
	}
}

function mic_endCosmoElement($parser, $tagName) {
	global $mic_cosmos_list, $mic_cosmos_counter, $mic_cosmos_current_tag;
	if ($tagName == "ITEM") {
		$mic_cosmos_counter++;
	}
	$caret_pos = strrpos($mic_cosmos_current_tag, '^');
	$mic_cosmos_current_tag = substr($mic_cosmos_current_tag, 0, $caret_pos);
}

function mic_cosmoData($parser, $data) {
	global $mic_cosmos_list, $mic_cosmos_counter, $mic_cosmos_current_tag;

	$documentKey = "^TAPI^DOCUMENT";
	$itemKey = $documentKey."^ITEM";
	$weblogKey = $itemKey."^WEBLOG";

	$titleKey = $itemKey."^WEBLOG^NAME";
	$linkKey = $itemKey."^WEBLOG^URL";
	$firstnameKey = $itemKey."^AUTHOR^FIRSTNAME";
	$lastnameKey = $itemKey."^AUTHOR^LASTNAME";
	$permalinkKey = $itemKey."^NEARESTPERMALINK";
	$excerptKey = $itemKey."^EXCERPT";

	if ($mic_cosmos_current_tag == $titleKey) {
		$mic_cosmos_list[$mic_cosmos_counter]->title = $data;
	} elseif ($mic_cosmos_current_tag == $linkKey) {
		$mic_cosmos_list[$mic_cosmos_counter]->link = $data;
	} elseif ($mic_cosmos_current_tag == $firstnameKey) {
		$mic_cosmos_list[$mic_cosmos_counter]->firstName = $data;
	} elseif ($mic_cosmos_current_tag == $lastnameKey) {
		$mic_cosmos_list[$mic_cosmos_counter]->lastName = $data;
	} elseif ($mic_cosmos_current_tag == $permalinkKey) {
		$mic_cosmos_list[$mic_cosmos_counter]->permalink = $data;
	} elseif ($mic_cosmos_current_tag == $excerptKey) {
		$mic_cosmos_list[$mic_cosmos_counter]->excerpt = $data;
	}
}
";s:3:"md5";s:32:"9bcd9ddfe59cb598c193dc5d7de40eb2";}