summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordonncha <donncha@7be80a69-a1ef-0310-a953-fb0f7c49ff36>2006-11-07 12:37:04 +0000
committerdonncha <donncha@7be80a69-a1ef-0310-a953-fb0f7c49ff36>2006-11-07 12:37:04 +0000
commitd510632e9f07cec9ac3de3b5dafc56bd58c81b8a (patch)
treeb4944ea6ceed3a73977f9edeae40f8174a4bab29
parent74e848ef222ada441de10e1db012988d1904b3ca (diff)
downloadwordpress-mu-d510632e9f07cec9ac3de3b5dafc56bd58c81b8a.tar.gz
wordpress-mu-d510632e9f07cec9ac3de3b5dafc56bd58c81b8a.tar.xz
wordpress-mu-d510632e9f07cec9ac3de3b5dafc56bd58c81b8a.zip
WP Merge
git-svn-id: http://svn.automattic.com/wordpress-mu/trunk@804 7be80a69-a1ef-0310-a953-fb0f7c49ff36
-rw-r--r--wp-admin/admin-functions.php118
-rw-r--r--wp-admin/comment.php127
-rw-r--r--wp-admin/edit-comments.php14
-rw-r--r--wp-admin/edit-form-comment.php4
-rw-r--r--wp-admin/edit-page-form.php3
-rw-r--r--wp-admin/edit.php4
-rw-r--r--wp-admin/import/wordpress.php27
-rw-r--r--wp-admin/install-rtl.css6
-rw-r--r--wp-admin/link-add.php8
-rw-r--r--wp-admin/menu-header.php10
-rw-r--r--wp-admin/moderation.php2
-rw-r--r--wp-admin/options.php36
-rw-r--r--wp-admin/post-new.php2
-rw-r--r--wp-admin/profile-update.php8
-rw-r--r--wp-admin/profile.php5
-rw-r--r--wp-admin/rtl.css143
-rw-r--r--wp-admin/upload-js.php2
-rw-r--r--wp-admin/upload-rtl.css42
-rw-r--r--wp-admin/upload.css2
-rw-r--r--wp-admin/user-edit.php2
-rw-r--r--wp-admin/wp-admin.css6
-rw-r--r--wp-includes/class-simplepie.php5285
-rw-r--r--wp-includes/comment.php2
-rw-r--r--wp-includes/feed.php99
-rw-r--r--wp-includes/formatting.php36
-rw-r--r--wp-includes/functions.php109
-rw-r--r--wp-includes/general-template.php9
-rw-r--r--wp-includes/js/autosave.js.php9
-rw-r--r--wp-includes/js/list-manipulation-js.php2
-rw-r--r--wp-includes/link-template.php2
-rw-r--r--wp-includes/pluggable.php25
-rw-r--r--wp-includes/plugin.php41
-rw-r--r--wp-includes/post.php91
-rw-r--r--wp-includes/query.php43
-rw-r--r--wp-includes/user.php10
-rw-r--r--wp-includes/wpmu-functions.php45
-rw-r--r--wp-login.php6
-rw-r--r--wp-settings.php10
-rw-r--r--xmlrpc.php2
39 files changed, 5931 insertions, 466 deletions
diff --git a/wp-admin/admin-functions.php b/wp-admin/admin-functions.php
index cedf1a7..0f80efd 100644
--- a/wp-admin/admin-functions.php
+++ b/wp-admin/admin-functions.php
@@ -122,12 +122,12 @@ function fix_attachment_links($post_ID) {
return;
$i = 0;
- $search = "# id=(\"|')p(\d+)\\1#i";
+ $search = "#[\s]+rel=(\"|')(.*?)wp-att-(\d+)\\1#i";
foreach ( $anchor_matches[0] as $anchor ) {
if ( 0 == preg_match($search, $anchor, $id_matches) )
continue;
- $id = $id_matches[2];
+ $id = $id_matches[3];
// While we have the attachment ID, let's adopt any orphans.
$attachment = & get_post($id, ARRAY_A);
@@ -287,12 +287,10 @@ function edit_comment() {
// Get an existing post and format it for editing.
function get_post_to_edit($id) {
- global $richedit;
- $richedit = ( 'true' == get_user_option('rich_editing') ) ? true : false;
$post = get_post($id);
- $post->post_content = format_to_edit($post->post_content, $richedit);
+ $post->post_content = format_to_edit($post->post_content, user_can_richedit());
$post->post_content = apply_filters('content_edit_pre', $post->post_content);
$post->post_excerpt = format_to_edit($post->post_excerpt);
@@ -350,12 +348,9 @@ function get_default_post_to_edit() {
}
function get_comment_to_edit($id) {
- global $richedit;
- $richedit = ( 'true' == get_user_option('rich_editing') ) ? true : false;
-
$comment = get_comment($id);
- $comment->comment_content = format_to_edit($comment->comment_content, $richedit);
+ $comment->comment_content = format_to_edit($comment->comment_content, user_can_richedit());
$comment->comment_content = apply_filters('comment_edit_pre', $comment->comment_content);
$comment->comment_author = format_to_edit($comment->comment_author);
@@ -993,6 +988,18 @@ function list_meta($meta) {
$style = '';
if ('_' == $entry['meta_key'] { 0 })
$style .= ' hidden';
+
+ if ( is_serialized($entry['meta_value']) ) {
+ if ( is_serialized_string($entry['meta_value']) ) {
+ // this is a serialized string, so we should display it
+ $entry['meta_value'] = maybe_unserialize($entry['meta_value']);
+ } else {
+ // this is a serialized array/object so we should NOT display it
+ --$count;
+ continue;
+ }
+ }
+
$key_js = js_escape($entry['meta_key']);
$entry['meta_key'] = wp_specialchars( $entry['meta_key'], true );
$entry['meta_value'] = wp_specialchars( $entry['meta_value'], true );
@@ -1024,12 +1031,14 @@ function get_meta_keys() {
function meta_form() {
global $wpdb;
+ $limit = (int) apply_filters('postmeta_form_limit', 30);
$keys = $wpdb->get_col("
- SELECT meta_key
- FROM $wpdb->postmeta
- GROUP BY meta_key
- ORDER BY meta_id DESC
- LIMIT 10");
+ SELECT meta_key
+ FROM $wpdb->postmeta
+ GROUP BY meta_key
+ ORDER BY meta_id DESC
+ LIMIT $limit");
+ natcasesort($keys);
?>
<h3><?php _e('Add a new custom field:') ?></h3>
<table id="newmeta" cellspacing="3" cellpadding="3">
@@ -1039,12 +1048,12 @@ function meta_form() {
</tr>
<tr valign="top">
<td align="right" width="18%">
-<?php if ($keys) : ?>
+<?php if ( $keys ) : ?>
<select id="metakeyselect" name="metakeyselect" tabindex="7">
<option value="#NONE#"><?php _e('- Select -'); ?></option>
<?php
- foreach ($keys as $key) {
+ foreach ( $keys as $key ) {
$key = wp_specialchars($key, 1);
echo "\n\t<option value='$key'>$key</option>";
}
@@ -1068,7 +1077,8 @@ function add_meta($post_ID) {
$metakeyselect = $wpdb->escape(stripslashes(trim($_POST['metakeyselect'])));
$metakeyinput = $wpdb->escape(stripslashes(trim($_POST['metakeyinput'])));
- $metavalue = $wpdb->escape(stripslashes(trim($_POST['metavalue'])));
+ $metavalue = maybe_serialize(stripslashes((trim($_POST['metavalue']))));
+ $metavalue = $wpdb->escape($metavalue);
if ( ('0' === $metavalue || !empty ($metavalue)) && ((('#NONE#' != $metakeyselect) && !empty ($metakeyselect)) || !empty ($metakeyinput)) ) {
// We have a key/value pair. If both the select and the
@@ -1099,8 +1109,9 @@ function delete_meta($mid) {
function update_meta($mid, $mkey, $mvalue) {
global $wpdb;
+ $mvalue = maybe_serialize(stripslashes($mvalue));
+ $mvalue = $wpdb->escape($mvalue);
$mid = (int) $mid;
-
return $wpdb->query("UPDATE $wpdb->postmeta SET meta_key = '$mkey', meta_value = '$mvalue' WHERE meta_id = '$mid'");
}
@@ -1108,7 +1119,10 @@ function get_post_meta_by_id($mid) {
global $wpdb;
$mid = (int) $mid;
- return $wpdb->get_row("SELECT * FROM $wpdb->postmeta WHERE meta_id = '$mid'");
+ $meta = $wpdb->get_row("SELECT * FROM $wpdb->postmeta WHERE meta_id = '$mid'");
+ if ( is_serialized_string($meta->meta_value) )
+ $meta->meta_value = maybe_unserialize($meta->meta_value);
+ return $meta;
}
function touch_time($edit = 1, $for_post = 1) {
@@ -1936,11 +1950,21 @@ function wp_import_cleanup($id) {
}
function wp_import_upload_form($action) {
+ $size = strtolower( ini_get('upload_max_filesize') );
+ $bytes = 0;
+ if ( strstr( $size, 'k' ) )
+ $bytes = $size * 1024;
+ if ( strstr( $size, 'm' ) )
+ $bytes = $size * 1024 * 1024;
+ if ( strstr( $size, 'g' ) )
+ $bytes = $size * 1024 * 1024 * 1024;
?>
<form enctype="multipart/form-data" id="import-upload-form" method="post" action="<?php echo $action ?>">
<p>
-<label for="upload"><?php _e('Choose a file from your computer:'); ?></label> <input type="file" id="upload" name="import" size="25" />
+<label for="upload"><?php _e('Choose a file from your computer:'); ?></label> (<?php printf( __('Maximum size: %s'), $size ); ?>)
+<input type="file" id="upload" name="import" size="25" />
<input type="hidden" name="action" value="save" />
+<input type="hidden" name="max_file_size" value="<?php echo $bytes; ?>" />
</p>
<p class="submit">
<input type="submit" value="<?php _e('Upload file and import'); ?> &raquo;" />
@@ -1996,11 +2020,11 @@ function the_attachment_links($id = false) {
<?php if ( $icon ) : ?>
<tr>
<th scope="row"><?php $thumb ? _e('Thumbnail linked to file') : _e('Image linked to file'); ?></th>
- <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo $post->guid; ?>" id="<?php echo $post->ID ?>"><?php echo $icon ?></a></textarea></td>
+ <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo $post->guid; ?>"><?php echo $icon ?></a></textarea></td>
</tr>
<tr>
<th scope="row"><?php $thumb ? _e('Thumbnail linked to page') : _e('Image linked to file'); ?></th>
- <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link($post->ID) ?>" rel="attachment" id="<?php echo $post->ID ?>"><?php echo $icon ?></a></textarea></td>
+ <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link($post->ID) ?>" rel="attachment wp-att-<?php echo $post->ID; ?>"><?php echo $icon ?></a></textarea></td>
</tr>
<?php else : ?>
<tr>
@@ -2009,7 +2033,7 @@ function the_attachment_links($id = false) {
</tr>
<tr>
<th scope="row"><?php _e('Link to page') ?></th>
- <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link($post->ID) ?>" rel="attachment" id="<?php echo $post->ID ?>"><?php the_title(); ?></a></textarea></td>
+ <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link($post->ID) ?>" rel="attachment wp-att-<?php echo $post->ID ?>"><?php the_title(); ?></a></textarea></td>
</tr>
<?php endif; ?>
</table>
@@ -2139,4 +2163,52 @@ The Webmaster" );
}
add_action('update_option_new_admin_email', 'update_option_new_admin_email', 10, 2);
+
+function wp_crop_image($src_file, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs = false, $dst_file = false) {
+ if ( ctype_digit($src_file) ) // Handle int as attachment ID
+ $src_file = get_attached_file($src_file);
+
+ $src = wp_load_image($src_file);
+
+ if ( !is_resource($src) )
+ return $src;
+
+ $dst = imagecreatetruecolor($dst_w, $dst_h);
+
+ if ( $src_abs ) {
+ $src_w -= $src_x;
+ $src_h -= $src_y;
+ }
+
+ imageantialias($dst, true);
+ imagecopyresampled($dst, $src, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
+
+ if ( !$dst_file )
+ $dst_file = str_replace(basename($src_file), 'cropped-'.basename($src_file), $src_file);
+
+ $dst_file = preg_replace('/\\.[^\\.]+$/', '.jpg', $dst_file);
+
+ if ( imagejpeg($dst, $dst_file) )
+ return $dst_file;
+ else
+ return false;
+}
+
+function wp_load_image($file) {
+ if ( ctype_digit($file) )
+ $file = get_attached_file($file);
+
+ if ( !file_exists($file) )
+ return "File '$file' doesn't exist?";
+
+ $contents = file_get_contents($file);
+
+ $image = imagecreatefromstring($contents);
+
+ if ( !is_resource($image) )
+ return "File '$file' is not image?";
+
+ return $image;
+}
+
?>
diff --git a/wp-admin/comment.php b/wp-admin/comment.php
index 6589d8b..065bd39 100644
--- a/wp-admin/comment.php
+++ b/wp-admin/comment.php
@@ -12,11 +12,10 @@ if ( isset( $_POST['deletecomment'] ) )
switch($action) {
case 'editcomment':
$title = __('Edit Comment');
- if ( user_can_richedit() )
- wp_enqueue_script( 'wp_tiny_mce' );
+
require_once ('admin-header.php');
- $comment = (int) $_GET['comment'];
+ $comment = (int) $_GET['c'];
if ( ! $comment = get_comment($comment) )
wp_die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'javascript:history.go(-1)'));
@@ -30,75 +29,99 @@ case 'editcomment':
break;
-case 'confirmdeletecomment':
-case 'mailapprovecomment':
+case 'cdc':
+case 'mac':
require_once('./admin-header.php');
- $comment = (int) $_GET['comment'];
- $p = (int) $_GET['p'];
- $formaction = 'confirmdeletecomment' == $action ? 'deletecomment' : 'approvecomment';
- $nonce_action = 'confirmdeletecomment' == $action ? 'delete-comment_' : 'approve-comment_';
+ $comment = (int) $_GET['c'];
+ $formaction = 'cdc' == $action ? 'deletecomment' : 'approvecomment';
+ $nonce_action = 'cdc' == $action ? 'delete-comment_' : 'approve-comment_';
$nonce_action .= $comment;
if ( ! $comment = get_comment($comment) )
wp_die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'edit.php'));
if ( !current_user_can('edit_post', $comment->comment_post_ID) )
- wp_die( 'confirmdeletecomment' == $action ? __('You are not allowed to delete comments on this post.') : __('You are not allowed to edit comments on this post, so you cannot approve this comment.') );
-
- echo "<div class='wrap'>\n";
- if ( 'spam' == $_GET['delete_type'] )
- echo "<p>" . __('<strong>Caution:</strong> You are about to mark the following comment as spam:') . "</p>\n";
- elseif ( 'confirmdeletecomment' == $action )
- echo "<p>" . __('<strong>Caution:</strong> You are about to delete the following comment:') . "</p>\n";
- else
- echo "<p>" . __('<strong>Caution:</strong> You are about to approve the following comment:') . "</p>\n";
- echo "<table border='0'>\n";
- echo "<tr><td>" . __('Author:') . "</td><td>$comment->comment_author</td></tr>\n";
- echo "<tr><td>" . __('E-mail:') . "</td><td>$comment->comment_author_email</td></tr>\n";
- echo "<tr><td>". __('URL:') . "</td><td>$comment->comment_author_url</td></tr>\n";
- echo "<tr><td>". __('Comment:') . "</td><td>$comment->comment_content</td></tr>\n";
- echo "</table>\n";
- echo "<p>" . __('Are you sure you want to do that?') . "</p>\n";
-
- echo "<form action='".get_option('siteurl')."/wp-admin/comment.php' method='get'>\n";
- wp_nonce_field($nonce_action);
- echo "<input type='hidden' name='action' value='$formaction' />\n";
- if ( 'spam' == $_GET['delete_type'] )
- echo "<input type='hidden' name='delete_type' value='spam' />\n";
- echo "<input type='hidden' name='p' value='$p' />\n";
- echo "<input type='hidden' name='comment' value='{$comment->comment_ID}' />\n";
- echo "<input type='hidden' name='noredir' value='1' />\n";
- echo "<input type='submit' value='" . __('Yes') . "' />";
- echo "&nbsp;&nbsp;";
- echo "<input type='button' value='" . __('No') . "' onclick=\"self.location='". get_option('siteurl') ."/wp-admin/edit-comments.php';\" />\n";
- echo "</form>\n";
- echo "</div>\n";
-
+ wp_die( 'cdc' == $action ? __('You are not allowed to delete comments on this post.') : __('You are not allowed to edit comments on this post, so you cannot approve this comment.') );
+?>
+<div class='wrap'>
+
+<div class="narrow">
+<?php if ( 'spam' == $_GET['dt'] ) { ?>
+<p><?php _e('<strong>Caution:</strong> You are about to mark the following comment as spam:'); ?></p>
+<?php } elseif ( 'cdc' == $action ) { ?>
+<p><?php _e('<strong>Caution:</strong> You are about to delete the following comment:'); ?></p>
+<?php } else { ?>
+<p><?php _e('<strong>Caution:</strong> You are about to approve the following comment:'); ?></p>
+<?php } ?>
+
+<p><?php _e('Are you sure you want to do that?'); ?></p>
+
+<form action='<?php echo get_option('siteurl'); ?>/wp-admin/comment.php' method='get'>
+
+<table width="100%">
+<tr>
+<td><input type='button' value='<?php _e('No'); ?>' onclick="self.location='<?php echo get_option('siteurl'); ?>/wp-admin/edit-comments.php';" /></td>
+<td align="right"><input type='submit' value='<?php _e('Yes'); ?>' /></td>
+</tr>
+</table>
+
+<?php wp_nonce_field($nonce_action); ?>
+<input type='hidden' name='action' value='<?php echo $formaction; ?>' />
+<?php if ( 'spam' == $_GET['dt'] ) { ?>
+<input type='hidden' name='dt' value='spam' />
+<?php } ?>
+<input type='hidden' name='p' value='<?php echo $comment->comment_post_ID; ?>' />
+<input type='hidden' name='c' value='<?php echo $comment->comment_ID; ?>' />
+<input type='hidden' name='noredir' value='1' />
+</form>
+
+<table class="editform" cellpadding="5">
+<tr class="alt">
+<th scope="row"><?php _e('Author:'); ?></th>
+<td><?php echo $comment->comment_author; ?></td>
+</tr>
+<?php if ( $comment->comment_author_email ) { ?>
+<tr>
+<th scope="row"><?php _e('E-mail:'); ?></th>
+<td><?php echo $comment->comment_author_email; ?></td>
+</tr>
+<?php } ?>
+<?php if ( $comment->comment_author_url ) { ?>
+<tr>
+<th scope="row"><?php _e('URL:'); ?></th>
+<td><?php echo $comment->comment_author_url; ?></td>
+</tr>
+<?php } ?>
+<tr>
+<th scope="row" valign="top"><p><?php _e('Comment:'); ?></p></th>
+<td><?php echo apply_filters( 'comment_text', $comment->comment_content ); ?></td>
+</tr>
+</table>
+
+</div>
+</div>
+<?php
break;
case 'deletecomment':
- $comment = (int) $_REQUEST['comment'];
+ $comment = (int) $_REQUEST['c'];
check_admin_referer('delete-comment_' . $comment);
- $p = (int) $_REQUEST['p'];
if ( isset($_REQUEST['noredir']) ) {
$noredir = true;
} else {
$noredir = false;
}
- $postdata = get_post($p) or
- wp_die(sprintf(__('Oops, no post with this ID. <a href="%s">Go back</a>!'), 'edit.php'));
-
if ( ! $comment = get_comment($comment) )
wp_die(sprintf(__('Oops, no comment with this ID. <a href="%s">Go back</a>!'), 'edit-comments.php'));
if ( !current_user_can('edit_post', $comment->comment_post_ID) )
wp_die( __('You are not allowed to edit comments on this post.') );
- if ( 'spam' == $_REQUEST['delete_type'] )
+ if ( 'spam' == $_REQUEST['dt'] )
wp_set_comment_status($comment->comment_ID, 'spam');
else
wp_delete_comment($comment->comment_ID);
@@ -112,10 +135,9 @@ case 'deletecomment':
break;
case 'unapprovecomment':
- $comment = (int) $_GET['comment'];
+ $comment = (int) $_GET['c'];
check_admin_referer('unapprove-comment_' . $comment);
-
- $p = (int) $_GET['p'];
+
if (isset($_GET['noredir'])) {
$noredir = true;
} else {
@@ -133,16 +155,15 @@ case 'unapprovecomment':
if ((wp_get_referer() != "") && (false == $noredir)) {
wp_redirect(wp_get_referer());
} else {
- wp_redirect(get_option('siteurl') .'/wp-admin/edit.php?p='.$p.'&c=1#comments');
+ wp_redirect(get_option('siteurl') .'/wp-admin/edit.php?p='.$comment->comment_post_ID.'&c=1#comments');
}
exit();
break;
case 'approvecomment':
- $comment = (int) $_GET['comment'];
+ $comment = (int) $_GET['c'];
check_admin_referer('approve-comment_' . $comment);
- $p = (int) $_GET['p'];
if (isset($_GET['noredir'])) {
$noredir = true;
} else {
@@ -164,7 +185,7 @@ case 'approvecomment':
if ((wp_get_referer() != "") && (false == $noredir)) {
wp_redirect(wp_get_referer());
} else {
- wp_redirect(get_option('siteurl') .'/wp-admin/edit.php?p='.$p.'&c=1#comments');
+ wp_redirect(get_option('siteurl') .'/wp-admin/edit.php?p='.$comment->comment_post_ID.'&c=1#comments');
}
exit();
break;
diff --git a/wp-admin/edit-comments.php b/wp-admin/edit-comments.php
index ae23c63..6227ef7 100644
--- a/wp-admin/edit-comments.php
+++ b/wp-admin/edit-comments.php
@@ -118,13 +118,13 @@ if ('view' == $mode) {
<p><?php comment_date('M j, g:i A'); ?> &#8212; [
<?php
if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
- echo " <a href='comment.php?action=editcomment&amp;comment=".$comment->comment_ID."'>" . __('Edit') . '</a>';
- echo ' | <a href="' . wp_nonce_url('comment.php?action=deletecomment&amp;p=' . $comment->comment_post_ID . '&amp;comment=' . $comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . '" onclick="return deleteSomething( \'comment\', ' . $comment->comment_ID . ', \'' . sprintf(__("You are about to delete this comment by &quot;%s&quot;.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to delete."), js_escape($comment->comment_author)) . "', theCommentList );\">" . __('Delete') . '</a> ';
+ echo " <a href='comment.php?action=editcomment&amp;c=".$comment->comment_ID."'>" . __('Edit') . '</a>';
+ echo ' | <a href="' . wp_nonce_url('comment.php?action=deletecomment&amp;p=' . $comment->comment_post_ID . '&amp;c=' . $comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . '" onclick="return deleteSomething( \'comment\', ' . $comment->comment_ID . ', \'' . sprintf(__("You are about to delete this comment by &quot;%s&quot;.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to delete."), js_escape($comment->comment_author)) . "', theCommentList );\">" . __('Delete') . '</a> ';
if ( ('none' != $comment_status) && ( current_user_can('moderate_comments') ) ) {
- echo '<span class="unapprove"> | <a href="' . wp_nonce_url('comment.php?action=unapprovecomment&amp;p=' . $comment->comment_post_ID . '&amp;comment=' . $comment->comment_ID, 'unapprove-comment_' . $comment->comment_ID) . '" onclick="return dimSomething( \'comment\', ' . $comment->comment_ID . ', \'unapproved\', theCommentList );">' . __('Unapprove') . '</a> </span>';
- echo '<span class="approve"> | <a href="' . wp_nonce_url('comment.php?action=approvecomment&amp;p=' . $comment->comment_post_ID . '&amp;comment=' . $comment->comment_ID, 'approve-comment_' . $comment->comment_ID) . '" onclick="return dimSomething( \'comment\', ' . $comment->comment_ID . ', \'unapproved\', theCommentList );">' . __('Approve') . '</a> </span>';
+ echo '<span class="unapprove"> | <a href="' . wp_nonce_url('comment.php?action=unapprovecomment&amp;p=' . $comment->comment_post_ID . '&amp;c=' . $comment->comment_ID, 'unapprove-comment_' . $comment->comment_ID) . '" onclick="return dimSomething( \'comment\', ' . $comment->comment_ID . ', \'unapproved\', theCommentList );">' . __('Unapprove') . '</a> </span>';
+ echo '<span class="approve"> | <a href="' . wp_nonce_url('comment.php?action=approvecomment&amp;p=' . $comment->comment_post_ID . '&amp;c=' . $comment->comment_ID, 'approve-comment_' . $comment->comment_ID) . '" onclick="return dimSomething( \'comment\', ' . $comment->comment_ID . ', \'unapproved\', theCommentList );">' . __('Approve') . '</a> </span>';
}
- echo " | <a href=\"" . wp_nonce_url("comment.php?action=deletecomment&amp;delete_type=spam&amp;p=" . $comment->comment_post_ID . "&amp;comment=" . $comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . "\" onclick=\"return deleteSomething( 'comment-as-spam', $comment->comment_ID, '" . sprintf(__("You are about to mark as spam this comment by &quot;%s&quot;.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to mark as spam."), js_escape( $comment->comment_author)) . "', theCommentList );\">" . __('Spam') . "</a> ";
+ echo " | <a href=\"" . wp_nonce_url("comment.php?action=deletecomment&amp;dt=spam&amp;p=" . $comment->comment_post_ID . "&amp;c=" . $comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . "\" onclick=\"return deleteSomething( 'comment-as-spam', $comment->comment_ID, '" . sprintf(__("You are about to mark as spam this comment by &quot;%s&quot;.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to mark as spam."), js_escape( $comment->comment_author)) . "', theCommentList );\">" . __('Spam') . "</a> ";
}
$post = get_post($comment->comment_post_ID);
$post_title = wp_specialchars( $post->post_title, 'double' );
@@ -183,9 +183,9 @@ $post_title = ('' == $post_title) ? "# $comment->comment_post_ID" : $post_title;
<?php } ?>
</td>
<td><?php if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
- echo "<a href='comment.php?action=editcomment&amp;comment=$comment->comment_ID' class='edit'>" . __('Edit') . "</a>"; } ?></td>
+ echo "<a href='comment.php?action=editcomment&amp;c=$comment->comment_ID' class='edit'>" . __('Edit') . "</a>"; } ?></td>
<td><?php if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
- echo "<a href=\"comment.php?action=deletecomment&amp;p=".$comment->comment_post_ID."&amp;comment=".$comment->comment_ID."\" onclick=\"return deleteSomething( 'comment', $comment->comment_ID, '" . sprintf(__("You are about to delete this comment by &quot;%s&quot;.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to delete."), js_escape( $comment->comment_author )) . "', theCommentList );\" class='delete'>" . __('Delete') . "</a> ";
+ echo "<a href=\"comment.php?action=deletecomment&amp;p=".$comment->comment_post_ID."&amp;c=".$comment->comment_ID."\" onclick=\"return deleteSomething( 'comment', $comment->comment_ID, '" . sprintf(__("You are about to delete this comment by &quot;%s&quot;.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to delete."), js_escape( $comment->comment_author )) . "', theCommentList );\" class='delete'>" . __('Delete') . "</a> ";
} ?></td>
</tr>
<?php
diff --git a/wp-admin/edit-form-comment.php b/wp-admin/edit-form-comment.php
index 26d79eb..893e3f7 100644
--- a/wp-admin/edit-form-comment.php
+++ b/wp-admin/edit-form-comment.php
@@ -36,7 +36,7 @@ addLoadEvent(focusit);
</div>
</fieldset>
-<fieldset id="<?php echo user_can_richedit() ? 'commentdivrich' : 'commentdiv'; ?>" style="clear: both;">
+<fieldset style="clear: both;">
<legend><?php _e('Comment') ?></legend>
<?php the_editor($comment->comment_content, 'content', 'newcomment_author_url'); ?>
</fieldset>
@@ -68,7 +68,7 @@ addLoadEvent(focusit);
<tr>
<th scope="row" valign="top"><?php _e('Delete'); $delete_nonce = wp_create_nonce( 'delete-comment_' . $comment->comment_ID ); ?>:</th>
<td><input name="deletecomment" class="button delete" type="submit" id="deletecomment" tabindex="10" value="<?php _e('Delete this comment') ?>" <?php echo "onclick=\"if ( confirm('" . __("You are about to delete this comment \\n \'Cancel\' to stop, \'OK\' to delete.") . "') ) { document.forms.post._wpnonce.value = '$delete_nonce'; return true; } return false;\""; ?> />
- <input type="hidden" name="comment" value="<?php echo $comment->comment_ID ?>" />
+ <input type="hidden" name="c" value="<?php echo $comment->comment_ID ?>" />
<input type="hidden" name="p" value="<?php echo $comment->comment_post_ID ?>" />
<input type="hidden" name="noredir" value="1" />
</td>
diff --git a/wp-admin/edit-page-form.php b/wp-admin/edit-page-form.php
index 2e4c19b..ae52683 100644
--- a/wp-admin/edit-page-form.php
+++ b/wp-admin/edit-page-form.php
@@ -1,7 +1,6 @@
<div class="wrap">
-<h2 id="write-post"><?php _e('Write Page'); ?><?php if ( 0 != $post_ID ) : ?>
-<small class="quickjump"><a href="#preview-post"><?php _e('preview &darr;'); ?></a></small><?php endif; ?></h2>
+<h2 id="write-post"><?php _e('Write Page'); ?></h2>
<?php
if (0 == $post_ID) {
$form_action = 'post';
diff --git a/wp-admin/edit.php b/wp-admin/edit.php
index bd570d0..e96b6d0 100644
--- a/wp-admin/edit.php
+++ b/wp-admin/edit.php
@@ -282,13 +282,13 @@ foreach ($comments as $comment) {
<p><?php comment_date('M j, g:i A'); ?> &#8212; [
<?php
if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
- echo " <a href='comment.php?action=editcomment&amp;comment=".$comment->comment_ID."\'>" . __('Edit') . '</a>';
+ echo " <a href='comment.php?action=editcomment&amp;c=".$comment->comment_ID."\'>" . __('Edit') . '</a>';
echo ' | <a href="' . wp_nonce_url('comment.php?action=deletecomment&amp;p=' . $post->ID . '&amp;comment=' . $comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . '" onclick="return deleteSomething( \'comment\', ' . $comment->comment_ID . ', \'' . sprintf(__("You are about to delete this comment by &quot;%s&quot;.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to delete."), js_escape($comment->comment_author)) . "', theCommentList );\">" . __('Delete') . '</a> ';
if ( ('none' != $comment_status) && ( current_user_can('moderate_comments') ) ) {
echo '<span class="unapprove"> | <a href="' . wp_nonce_url('comment.php?action=unapprovecomment&amp;p=' . $post->ID . '&amp;comment=' . $comment->comment_ID, 'unapprove-comment_' . $comment->comment_ID) . '" onclick="return dimSomething( \'comment\', ' . $comment->comment_ID . ', \'unapproved\', theCommentList );">' . __('Unapprove') . '</a> </span>';
echo '<span class="approve"> | <a href="' . wp_nonce_url('comment.php?action=approvecomment&amp;p=' . $post->ID . '&amp;comment=' . $comment->comment_ID, 'approve-comment_' . $comment->comment_ID) . '" onclick="return dimSomething( \'comment\', ' . $comment->comment_ID . ', \'unapproved\', theCommentList );">' . __('Approve') . '</a> </span>';
}
- echo " | <a href=\"" . wp_nonce_url("comment.php?action=deletecomment&amp;delete_type=spam&amp;p=".$comment->comment_post_ID."&amp;comment=".$comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . "\" onclick=\"return deleteSomething( 'comment-as-spam', $comment->comment_ID, '" . sprintf(__("You are about to mark as spam this comment by &quot;%s&quot;.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to mark as spam."), js_escape( $comment->comment_author)) . "', theCommentList );\">" . __('Spam') . "</a> ]";
+ echo " | <a href=\"" . wp_nonce_url("comment.php?action=deletecomment&amp;dt=spam&amp;p=".$comment->comment_post_ID."&amp;comment=".$comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . "\" onclick=\"return deleteSomething( 'comment-as-spam', $comment->comment_ID, '" . sprintf(__("You are about to mark as spam this comment by &quot;%s&quot;.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to mark as spam."), js_escape( $comment->comment_author)) . "', theCommentList );\">" . __('Spam') . "</a> ]";
} // end if any comments to show
?>
</p>
diff --git a/wp-admin/import/wordpress.php b/wp-admin/import/wordpress.php
index 46f5892..b850382 100644
--- a/wp-admin/import/wordpress.php
+++ b/wp-admin/import/wordpress.php
@@ -54,26 +54,10 @@ class WP_Import {
//function to check the authorname and do the mapping
function checkauthor($author) {
global $wpdb;
- //mtnames is an array with the names in the mt import file
- $pass = 'changeme';
- if (!(in_array($author, $this->mtnames))) { //a new mt author name is found
- ++ $this->j;
- $this->mtnames[$this->j] = $author; //add that new mt author name to an array
- $user_id = username_exists($this->newauthornames[$this->j]); //check if the new author name defined by the user is a pre-existing wp user
- if (!$user_id) { //banging my head against the desk now.
- if ($newauthornames[$this->j] == 'left_blank') { //check if the user does not want to change the authorname
- $user_id = wp_create_user($author, $pass);
- $this->newauthornames[$this->j] = $author; //now we have a name, in the place of left_blank.
- } else {
- $user_id = wp_create_user($this->newauthornames[$this->j], $pass);
- }
- } else {
- return $user_id; // return pre-existing wp username if it exists
- }
- } else {
- $key = array_search($author, $this->mtnames); //find the array key for $author in the $mtnames array
- $user_id = username_exists($this->newauthornames[$key]); //use that key to get the value of the author's name from $newauthornames
- }
+
+ $map = $_POST['userselect'];
+
+ $user_id = username_exists($map[$author]); //use that key to get the value of the author's name from $newauthornames
return $user_id;
}
@@ -140,7 +124,6 @@ class WP_Import {
?>
<h2><?php _e('Assign Authors'); ?></h2>
<p><?php _e('To make it easier for you to edit and save the imported posts and drafts, you may want to change the name of the author of the posts. For example, you may want to import all the entries as <code>admin</code>s entries.'); ?></p>
-<p><?php _e('If a new user is created by WordPress, the password will be set, by default, to "changeme". Quite suggestive, eh? ;)'); ?></p>
<?php
@@ -151,7 +134,7 @@ class WP_Import {
foreach ($authors as $author) {
++ $j;
echo '<li>Current author: <strong>'.$author.'</strong><br />'.'Map to existing: ';
- $this->users_form($author);
+ $this->users_form($j);
echo '</li>';
}
diff --git a/wp-admin/install-rtl.css b/wp-admin/install-rtl.css
index 06b67f6..6cf6b34 100644
--- a/wp-admin/install-rtl.css
+++ b/wp-admin/install-rtl.css
@@ -1 +1,5 @@
-body { font-family: Tahoma, Georgia, "Times New Roman", Times, serif; } \ No newline at end of file
+body { font-family: Tahoma, Georgia, "Times New Roman", Times, serif; }
+
+ul, ol { padding: 5px 20px 5px 5px; }
+
+.step, th { text-align: left; }
diff --git a/wp-admin/link-add.php b/wp-admin/link-add.php
index 087fc45..22dcc64 100644
--- a/wp-admin/link-add.php
+++ b/wp-admin/link-add.php
@@ -17,7 +17,7 @@ if ( current_user_can( 'manage_categories' ) )
require('admin-header.php');
?>
-<?php if ($_GET['added']) : ?>
+<?php if ($_GET['added'] && '' != $_POST['link_name']) : ?>
<div id="message" class="updated fade"><p><?php _e('Link added.'); ?></p></div>
<?php endif; ?>
@@ -26,8 +26,10 @@ require('admin-header.php');
include('edit-link-form.php');
?>
-<div class="wrap">
-<?php printf(__('<p>You can drag <a href="%s" title="Link add bookmarklet">Link This</a> to your toolbar and when you click it a window will pop up that will allow you to add whatever site you&#8217;re on to your bookmarks! Right now this only works on Mozilla or Netscape, but we&#8217;re working on it.</p>'), "javascript:void(linkmanpopup=window.open('" . get_option('siteurl') . "/wp-admin/link-add.php?action=popup&amp;linkurl='+escape(location.href)+'&amp;name='+escape(document.title),'LinkManager','scrollbars=yes,width=750,height=550,left=15,top=15,status=yes,resizable=yes'));linkmanpopup.focus();window.focus();linkmanpopup.focus();") ?>
+<div id="wp-link-bookmarklet" class="wrap">
+<h3><?php _e('Add Link Bookmarklet'); ?></h3>
+<p><?php _e('Right click on the following link and choose "Bookmark This Link..." to create an add link shortcut. Right now this only works on Mozilla or Netscape, but we’re working on it.'); ?></p>
+<?php printf(__('<p><a href="%s" title="Link add bookmarklet">Link This</a></p>'), "javascript:void(linkmanpopup=window.open('" . get_option('siteurl') . "/wp-admin/link-add.php?action=popup&amp;linkurl='+escape(location.href)+'&amp;name='+escape(document.title),'LinkManager','scrollbars=yes,width=750,height=550,left=15,top=15,status=yes,resizable=yes'));linkmanpopup.focus();window.focus();linkmanpopup.focus();") ?>
</div>
<?php
diff --git a/wp-admin/menu-header.php b/wp-admin/menu-header.php
index 8e1d213..d113276 100644
--- a/wp-admin/menu-header.php
+++ b/wp-admin/menu-header.php
@@ -13,9 +13,9 @@ foreach ($menu as $item) {
if ( !empty($submenu[$item[2]]) || current_user_can($item[1]) ) {
if ( file_exists(ABSPATH . PLUGINDIR . "/{$item[2]}") )
- echo "\n\t<li><a href='" . get_option('siteurl') . "/wp-admin/admin.php?page={$item[2]}'$class>{$item[0]}</a></li>";
+ echo "\n\t<li><a href='admin.php?page={$item[2]}'$class>{$item[0]}</a></li>";
else
- echo "\n\t<li><a href='" . get_option('siteurl') . "/wp-admin/{$item[2]}'$class>{$item[0]}</a></li>";
+ echo "\n\t<li><a href='{$item[2]}'$class>{$item[0]}</a></li>";
}
}
@@ -42,11 +42,11 @@ $menu_hook = get_plugin_page_hook($item[2], $parent_file);
if (file_exists(ABSPATH . PLUGINDIR . "/{$item[2]}") || ! empty($menu_hook)) {
if ( 'admin.php' == $pagenow )
- echo "\n\t<li><a href='" . get_option('siteurl') . "/wp-admin/admin.php?page={$item[2]}'$class>{$item[0]}</a></li>";
+ echo "\n\t<li><a href='admin.php?page={$item[2]}'$class>{$item[0]}</a></li>";
else
- echo "\n\t<li><a href='" . get_option('siteurl') . "/wp-admin/{$parent_file}?page={$item[2]}'$class>{$item[0]}</a></li>";
+ echo "\n\t<li><a href='{$parent_file}?page={$item[2]}'$class>{$item[0]}</a></li>";
} else {
- echo "\n\t<li><a href='" . get_option('siteurl') . "/wp-admin/{$item[2]}'$class>{$item[0]}</a></li>";
+ echo "\n\t<li><a href='{$item[2]}'$class>{$item[0]}</a></li>";
}
endforeach;
?>
diff --git a/wp-admin/moderation.php b/wp-admin/moderation.php
index 1989368..b9e3f06 100644
--- a/wp-admin/moderation.php
+++ b/wp-admin/moderation.php
@@ -134,7 +134,7 @@ $i = 0;
<p><strong><?php comment_author() ?></strong> <?php if ($comment->comment_author_email) { ?>| <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_url && 'http://' != $comment->comment_author_url) { ?> | <?php comment_author_url_link() ?> <?php } ?>| <?php _e('IP:') ?> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></p>
<?php comment_text() ?>
<p><?php comment_date('M j, g:i A'); ?> &#8212; [ <?php
-echo '<a href="comment.php?action=editcomment&amp;comment='.$comment->comment_ID.'">' . __('Edit') . '</a> | ';
+echo '<a href="comment.php?action=editcomment&amp;c='.$comment->comment_ID.'">' . __('Edit') . '</a> | ';
echo " <a href=\"post.php?action=deletecomment&amp;p=".$comment->comment_post_ID."&amp;comment=".$comment->comment_ID."\" onclick=\"return deleteSomething( 'comment', $comment->comment_ID, '" . sprintf(__("You are about to delete this comment by &quot;%s&quot;.\\n&quot;Cancel&quot; to stop, &quot;OK&quot; to delete."), js_escape($comment->comment_author)) . "', theCommentList );\">" . __('Delete ') . "</a> | "; ?>
<?php
$post = get_post($comment->comment_post_ID);
diff --git a/wp-admin/options.php b/wp-admin/options.php
index 33f5acd..ceb4830 100644
--- a/wp-admin/options.php
+++ b/wp-admin/options.php
@@ -11,9 +11,10 @@ if ( !current_user_can('manage_options') )
wp_die(__('Cheatin&#8217; uh?'));
if( $_GET[ 'adminhash' ] ) {
- $new_admin_details = get_option( 'new_admin_email' );
+ $new_admin_details = get_option( 'adminhash' );
if( is_array( $new_admin_details ) && $new_admin_details[ 'hash' ] == $_GET[ 'adminhash' ] && $new_admin_details[ 'newemail' ] != '' ) {
update_option( "admin_email", $new_admin_details[ 'newemail' ] );
+ delete_option( "adminhash" );
delete_option( "new_admin_email" );
}
wp_redirect( get_option( "siteurl" ) . "/wp-admin/options-general.php?updated=true" );
@@ -24,6 +25,7 @@ function sanitize_option($option, $value) { // Remember to call stripslashes!
switch ($option) {
case 'admin_email':
+ case 'new_admin_email':
$value = stripslashes($value);
$value = sanitize_email($value);
break;
@@ -137,23 +139,32 @@ if (!is_site_admin())
<table width="98%">
<?php
$options = $wpdb->get_results("SELECT * FROM $wpdb->options ORDER BY option_name");
-foreach ( (array) $options as $option )
- $options_to_update[] = $option->option_name;
-$options_to_update = implode(',', $options_to_update);
-?>
-
-<input type="hidden" name="page_options" value="<?php echo $options_to_update; ?>" />
-<?php
foreach ( (array) $options as $option) :
- $value = wp_specialchars($option->option_value, 'single');
+ $disabled = '';
+ if ( is_serialized($option->option_value) ) {
+ if ( is_serialized_string($option->option_value) ) {
+ // this is a serialized string, so we should display it
+ $value = wp_specialchars(maybe_unserialize($option->option_value), 'single');
+ $options_to_update[] = $option->option_name;
+ $class = 'all-options';
+ } else {
+ $value = 'SERIALIZED DATA';
+ $disabled = ' disabled="disabled"';
+ $class = 'all-options disabled';
+ }
+ } else {
+ $value = wp_specialchars($option->option_value, 'single');
+ $options_to_update[] = $option->option_name;
+ $class = 'all-options';
+ }
echo "
<tr>
<th scope='row'><label for='$option->option_name'>$option->option_name</label></th>
<td>";
- if (stristr($value, "\n")) echo "<textarea class='all-options' name='$option->option_name' id='$option->option_name' cols='30' rows='5'>$value</textarea>";
- else echo "<input class='all-options' type='text' name='$option->option_name' id='$option->option_name' size='30' value='" . $value . "' />";
+ if (stristr($value, "\n")) echo "<textarea class='$class' name='$option->option_name' id='$option->option_name' cols='30' rows='5'>$value</textarea>";
+ else echo "<input class='$class' type='text' name='$option->option_name' id='$option->option_name' size='30' value='" . $value . "'$disabled />";
echo "</td>
<td>$option->option_description</td>
@@ -161,7 +172,8 @@ foreach ( (array) $options as $option) :
endforeach;
?>
</table>
-<p class="submit"><input type="submit" name="Update" value="<?php _e('Update Options &raquo;') ?>" /></p>
+<?php $options_to_update = implode(',', $options_to_update); ?>
+<p class="submit"><input type="hidden" name="page_options" value="<?php echo wp_specialchars($options_to_update, true); ?>" /><input type="submit" name="Update" value="<?php _e('Update Options &raquo;') ?>" /></p>
</form>
</div>
diff --git a/wp-admin/post-new.php b/wp-admin/post-new.php
index 4ecc804..9cbcdc3 100644
--- a/wp-admin/post-new.php
+++ b/wp-admin/post-new.php
@@ -55,7 +55,7 @@ include('edit-form-advanced.php');
<?php if ( $is_NS4 || $is_gecko || $is_winIE ) { ?>
<div id="wp-bookmarklet" class="wrap">
-<h3><?php _e('WordPress bookmarklet'); ?></h3>
+<h3><?php _e('WordPress Bookmarklet'); ?></h3>
<p><?php _e('Right click on the following link and choose "Add to favorites" to create a posting shortcut.'); ?></p>
<p>
diff --git a/wp-admin/profile-update.php b/wp-admin/profile-update.php
index 944f799..d4fd657 100644
--- a/wp-admin/profile-update.php
+++ b/wp-admin/profile-update.php
@@ -17,9 +17,11 @@ if ( is_wp_error( $errors ) ) {
exit;
}
-if ( !isset( $_POST['rich_editing'] ) )
- $_POST['rich_editing'] = 'false';
-update_user_option( $current_user->id, 'rich_editing', $_POST['rich_editing'], true );
+if ( rich_edit_exists() ) {
+ if ( !isset( $_POST['rich_editing'] ) )
+ $_POST['rich_editing'] = 'false';
+ update_user_option( $current_user->id, 'rich_editing', $_POST['rich_editing'], true );
+}
if ( isset( $_POST['primary_blog'] ) ) {
$primary_blog = (int) $_POST['primary_blog'];
diff --git a/wp-admin/profile.php b/wp-admin/profile.php
index cc2506c..f1c38b4 100644
--- a/wp-admin/profile.php
+++ b/wp-admin/profile.php
@@ -36,6 +36,7 @@ $bookmarklet_height= 440;
<?php do_action('profile_personal_options'); ?>
<p class="submit"><input type="submit" value="<?php _e('Update Profile &raquo;') ?>" name="submit" /></p>
+<div style="clear: both"></div>
<fieldset>
<legend><?php _e('Name'); ?></legend>
@@ -88,14 +89,14 @@ $bookmarklet_height= 440;
<input type="text" name="yim" value="<?php echo $profileuser->yim ?>" />
</label></p>
-<p><label><?php _e('Jabber / Google Talk:') ?>
+<p><label><?php _e('Jabber / Google Talk:') ?><br />
<input type="text" name="jabber" value="<?php echo $profileuser->jabber ?>" /></label>
</p>
</fieldset>
<br clear="all" />
<fieldset>
<legend><?php _e('About Yourself'); ?></legend>
-<p class="desc"><?php _e('Share a little biographical information to fill out your profile. This may be shown publicly.'); ?></p>
+<p class="desc"><?php _e('Share a little biographical information. '); ?></p>
<p><textarea name="description" rows="5" cols="30"><?php echo $profileuser->description ?></textarea></p>
</fieldset>
diff --git a/wp-admin/rtl.css b/wp-admin/rtl.css
index 2f03a4d..ad4af49 100644
--- a/wp-admin/rtl.css
+++ b/wp-admin/rtl.css
@@ -1,47 +1,45 @@
-#viewarc, #viewcat, #namediv, #emaildiv, #uridiv, #planetnews li, #login ul li, #your-profile fieldset, .alignleft .available-theme {
- float: right
-}
+#viewarc, #viewcat, #namediv, #emaildiv, #uridiv, #planetnews li, #login ul li, #your-profile fieldset,
+ #footer .logo, .alignleft .available-theme { float: right; }
-#templateside, .alignright {
- float: left;
-}
+#templateside, .alignright { float: left; }
-#login, #send, .widefat th {
- text-align: right
-}
+#login #send, .readmore, .widefat th { text-align: right; }
-#postcustomsubmit, form#upload th, .submit, .editform th {
- text-align: left
-}
+#postcustomsubmit, form#upload th, .submit, .editform th { text-align: left; }
-body, td {
- font: 13px Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana;
-}
+#devnews h4, #wphead h1, #your-profile legend, fieldset.options legend,
+ #planetnews li .post { font-family: Tahoma, Georgia, "Times New Roman", Times, serif; }
-fieldset.options legend {
- font-family: Tahoma, Georgia, "Times New Roman", Times, serif;
-}
+#wphead { padding: .8em 2em .8em 19em; }
-textarea, input, select {
- font: 13px Tahoma, Verdana, Arial, Helvetica, sans-serif;
-}
+#wphead h1 { font-size: 2.4em; }
-.quicktags, .search {
- font: 12px Tahoma, Georgia, "Times New Roman", Times, serif;
-}
+#postdiv , #titlediv, #guiddiv { margin: 0 0 0 8px; }
+
+#ed_toolbar input { margin: 3px 0 2px 2px; }
+
+#edButtons input, #edButtons input:active { margin: 0px 0 -1px 2px; }
+
+body, td { font: 13px Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana; }
+
+h2 { font: normal 32px/5px serif; }
-.submit input, .submit input:focus, .button {
+textarea, input, select { font: 13px Tahoma, Verdana, Arial, Helvetica, sans-serif; }
+
+.quicktags, .search { font: 12px Tahoma, Georgia, "Times New Roman", Times, serif; }
+
+.updated, .confirm { padding: 0 3em 0 1em; }
+
+.submit input, .submit input:focus, .button, .button:focus {
+ border-left-color: #999;
border-right-color: #ccc;
}
.submit input:active, .button:active {
+ border-left-color: #ccc;
border-right-color: #999;
}
-.updated, .confirm {
- padding: 0 3em 0 1em;
-}
-
#adminmenu {
padding: .2em 2em .3em .2em;
height: 30px;
@@ -53,29 +51,28 @@ textarea, input, select {
float: right;
}
-#submenu {
- height: 21px;
- padding: 3px 3em 0 2em;
+#adminmenu a.current {
+ border-right: 0;
+ border-left: 2px solid #4f96c8;
}
+#adminmenu li { line-height: 180%; }
+
+#submenu, #minisub { padding: 3px 3em 0 2em; }
+
#submenu .current {
+ border-right: 0;
border-left: 2px solid #045290;
}
#submenu a {
- padding: .3em .4em .33em .4em;
+ padding: .3em .4em .4em .4em;
margin: 0 0 0 10px;
display: block;
float: right;
}
-#submenu li {
- line-height: 100%;
-}
-
-#postdiv , #titlediv, #guiddiv {
- margin: 0 0 0 8px;
-}
+#submenu li { line-height: 120%; }
#currenttheme img {
float: right;
@@ -84,36 +81,24 @@ textarea, input, select {
}
#postdiv #quicktags {
- padding-right: auto;
+ padding-right: 0;
padding-left: 6px;
}
-#quicktags #ed_toolbar {
- padding: 0px 0 0 2px;
-}
-
-#ed_toolbar input {
- margin: 3px 0 2px 2px;
+.readmore {
+ margin-right: auto;
+ margin-left: 5em;
}
* html #postexcerpt .dbx-toggle-open, * html #postexcerpt .dbx-toggle-open, #postexcerpt div, #attachmentlinks div {
- padding-right: auto;
+ padding-right: 0;
padding-left: 8px;
}
-#login h1 {
- left: auto;
- right: 137px;
-}
-
-#login h1 a {
- display: none;
-}
-
#searchform {
float: right;
margin-right: auto;
- margin-left: 3em;
+ margin-left: 1em;
}
#poststuff {
@@ -136,15 +121,6 @@ textarea, input, select {
left: 1em;
}
-#wphead {
- padding: .8em 2em .8em 19em;
-}
-
-#wphead h1 {
- font-size: 2.4em;
- font-family: Tahoma, Georgia, "Times New Roman", Times, serif
-}
-
#zeitgeist {
float: left;
margin-left: auto;
@@ -156,37 +132,29 @@ textarea, input, select {
padding: 0 .6em 0 0;
}
-#moremeta fieldset div {
- margin: 2px 0px 0 0;
+#categorydiv ul {
+ margin-left: auto;
+ margin-right: 10px;
}
+
+#moremeta fieldset div { margin: 2px 0px 0 0; }
+
#moremeta {
margin-right: auto;
margin-left: 15px;
right: auto;
left: 5%;
}
-#categorydiv ul {
- margin-left: auto;
- margin-right: 10px;
-}
-
-#your-profile legend {
- font-family: Tahoma, Georgia, "Times New Roman", Times, serif;
-}
#moremeta .dbx-content {
background: url(images/box-butt.gif) no-repeat bottom left;
- padding-right: auto;
+ padding-right: 0;
padding-left: 2px;
}
-#moremeta .dbx-handle {
- background: #2685af url(images/box-head.gif) no-repeat left;
-}
+#moremeta .dbx-handle { background: #2685af url(images/box-head.gif) no-repeat left; }
-#moremeta .dbx-box {
- background: url(images/box-bg.gif) repeat-y left;
-}
+#moremeta .dbx-box { background: url(images/box-bg.gif) repeat-y left; }
a.dbx-toggle, a.dbx-toggle:visited {
right: auto;
@@ -214,10 +182,11 @@ a.dbx-toggle, a.dbx-toggle:visited {
}
#postdivrich #edButtons {
- padding-left: auto;
+ padding-left: 0;
padding-right: 3px;
}
-#edButtons input, #edButtons input:active {
- margin: 0px 0 -1px 2px;
+.page-numbers {
+ margin-right: auto;
+ margin-left: 3px;
}
diff --git a/wp-admin/upload-js.php b/wp-admin/upload-js.php
index 4d5b21f..c92439f 100644
--- a/wp-admin/upload-js.php
+++ b/wp-admin/upload-js.php
@@ -221,7 +221,7 @@ addLoadEvent( function() {
display = 'full';
if ( 'none' != link )
- h += "<a href='" + ( 'file' == link ? ( this.currentImage.srcBase + this.currentImage.src ) : ( this.currentImage.page + "' rel='attachment" ) ) + "' title='" + this.currentImage.title + "'>";
+ h += "<a href='" + ( 'file' == link ? ( this.currentImage.srcBase + this.currentImage.src ) : ( this.currentImage.page + "' rel='attachment wp-att-" + this.currentImage.ID + "'" ) ) + "' title='" + this.currentImage.title + "'>";
if ( display )
h += "<img src='" + ( 'thumb' == display ? ( this.currentImage.thumbBase + this.currentImage.thumb ) : ( this.currentImage.srcBase + this.currentImage.src ) ) + "' alt='" + this.currentImage.title + "' />";
else
diff --git a/wp-admin/upload-rtl.css b/wp-admin/upload-rtl.css
index b7bb3ae..a085c86 100644
--- a/wp-admin/upload-rtl.css
+++ b/wp-admin/upload-rtl.css
@@ -1,22 +1,40 @@
-body { font: 13px Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana; }
+table { float: right; }
+
+#upload-file th, #the-attachment-links textarea { text-align: left; }
-#upload-menu li { margin: 0 .75em 0 0; }
+h2 { margin: 0 0 0 .2em; }
+
+#upload-files li { margin: 0 15px 15px 0; }
+
+#upload-file-view { padding: 0 75px 0 0; }
+
+#upload-menu li {
+ margin: 0 .75em 0 0;
+ display: block;
+ float: right;
+}
#upload-menu .current div {
border-right: 0;
border-left: 2px solid #448abd;
}
-#upload-file-view { 0 15px 0 0 }
-
-#file-title { margin: 0 15px .2em 0; }
-
-h2 { margin: 0 0 0 .2em; }
-
-#upload-files li { margin: 0 15px 15px 0; }
+#upload-file {
+ left: auto;
+ right: 0;
+}
-table { float: right; }
+#file-title {
+ margin: 0 75px .2em 0;
+ font-family: Tahoma, Georgia, "Times New Roman", Times, serif;
+}
-#the-attachment-links { float: left; }
+.back {
+ left: auto;
+ right: 14px;
+}
-#th { text-align: left; }
+#uploadoptions td {
+ padding-left: 0;
+ padding-right: 1em;
+}
diff --git a/wp-admin/upload.css b/wp-admin/upload.css
index 0358471..601f7e7 100644
--- a/wp-admin/upload.css
+++ b/wp-admin/upload.css
@@ -62,7 +62,7 @@ body { background: #f9fcfe; }
background: #f9fcfe;
}
-#uupload-file th {
+#upload-file th {
width: 8em;
}
diff --git a/wp-admin/user-edit.php b/wp-admin/user-edit.php
index 164464d..e1bdcc5 100644
--- a/wp-admin/user-edit.php
+++ b/wp-admin/user-edit.php
@@ -162,7 +162,7 @@ echo $role_list . '</select>';
<input type="text" name="yim" value="<?php echo $profileuser->yim ?>" />
</label></p>
-<p><label><?php _e('Jabber / Google Talk:') ?>
+<p><label><?php _e('Jabber / Google Talk:') ?><br />
<input type="text" name="jabber" value="<?php echo $profileuser->jabber ?>" /></label>
</p>
</fieldset>
diff --git a/wp-admin/wp-admin.css b/wp-admin/wp-admin.css
index 3b8595c..6fcffa8 100644
--- a/wp-admin/wp-admin.css
+++ b/wp-admin/wp-admin.css
@@ -458,6 +458,10 @@ textarea.all-options, input.all-options {
width: 250px;
}
+input.disabled, textarea.disabled {
+ background: #ccc;
+}
+
#adminmenu {
background: #83B4D8;
border-top: 3px solid #448abd;
@@ -505,7 +509,6 @@ textarea.all-options, input.all-options {
border-bottom: none;
margin: 0;
padding: 3px 2em 0 3em;
- height: 25px;
}
#minisub {
@@ -533,6 +536,7 @@ textarea.all-options, input.all-options {
#submenu li {
line-height: 180%;
+ height: 25px;
}
diff --git a/wp-includes/class-simplepie.php b/wp-includes/class-simplepie.php
new file mode 100644
index 0000000..d5c36b9
--- /dev/null
+++ b/wp-includes/class-simplepie.php
@@ -0,0 +1,5285 @@
+<?php
+/****************************************************
+SIMPLEPIE
+A PHP-Based RSS and Atom Feed Framework
+Takes the hard work out of managing a complete RSS/Atom solution.
+
+Version: "Lemon Meringue"
+Updated: 13 October 2006
+Copyright: 2004-2006 Ryan Parman, Geoffrey Sneddon
+http://simplepie.org
+
+*****************************************************
+LICENSE:
+
+GNU Lesser General Public License 2.1 (LGPL)
+http://creativecommons.org/licenses/LGPL/2.1/
+
+*****************************************************
+Please submit all bug reports and feature requests to the SimplePie forums.
+http://simplepie.org/support/
+
+****************************************************/
+
+class SimplePie
+{
+ // SimplePie Info
+ var $name = 'SimplePie';
+ var $version = 'Lemon Meringue';
+ var $build = '20061013';
+ var $url = 'http://simplepie.org/';
+ var $useragent;
+ var $linkback;
+
+ // Other objects, instances created here so we can set options on them
+ var $sanitize;
+
+ // Options
+ var $rss_url;
+ var $file;
+ var $timeout = 10;
+ var $xml_dump = false;
+ var $enable_cache = true;
+ var $max_minutes = 60;
+ var $cache_location = './cache';
+ var $order_by_date = true;
+ var $input_encoding = false;
+ var $cache_class = 'SimplePie_Cache';
+ var $locator_class = 'SimplePie_Locator';
+ var $parser_class = 'SimplePie_Parser';
+
+ // Misc. variables
+ var $data;
+ var $error;
+
+ function SimplePie($feed_url = null, $cache_location = null, $cache_max_minutes = null)
+ {
+ // Couple of variables built up from other variables
+ $this->useragent = $this->name . '/' . $this->version . ' (Feed Parser; ' . $this->url . '; Allow like Gecko) Build/' . $this->build;
+ $this->linkback = '<a href="' . $this->url . '" title="' . $this->name . ' ' . $this->version . '">' . $this->name . '</a>';
+
+ // Other objects, instances created here so we can set options on them
+ $this->sanitize = new SimplePie_Sanitize;
+
+ // Set options if they're passed to the constructor
+ if (!is_null($feed_url))
+ {
+ $this->feed_url($feed_url);
+ }
+
+ if (!is_null($cache_location))
+ {
+ $this->cache_location($cache_location);
+ }
+
+ if (!is_null($cache_max_minutes))
+ {
+ $this->cache_max_minutes($cache_max_minutes);
+ }
+
+ // If we've passed an xmldump variable in the URL, snap into XMLdump mode
+ if (isset($_GET['xmldump']))
+ {
+ $this->enable_xmldump(true);
+ }
+
+ // Only init the script if we're passed a feed URL
+ if (!is_null($feed_url))
+ {
+ return $this->init();
+ }
+ }
+
+ function feed_url($url)
+ {
+ $this->rss_url = SimplePie_Misc::fix_protocol($url, 1);
+ }
+
+ function set_file(&$file)
+ {
+ if (is_a($file, 'SimplePie_File'))
+ {
+ $this->rss_url = $file->url;
+ $this->file =& $file;
+ }
+ }
+
+ function set_timeout($timeout = 10)
+ {
+ $this->timeout = (int) $timeout;
+ }
+
+ function set_raw_data($data)
+ {
+ $this->raw_data = trim((string) $data);
+ }
+
+ function enable_xmldump($enable = false)
+ {
+ $this->xml_dump = (bool) $enable;
+ }
+
+ function enable_caching($enable = true)
+ {
+ $this->enable_cache = (bool) $enable;
+ }
+
+ function cache_max_minutes($minutes = 60)
+ {
+ $this->max_minutes = (float) $minutes;
+ }
+
+ function cache_location($location = './cache')
+ {
+ $this->cache_location = (string) $location;
+ }
+
+ function order_by_date($enable = true)
+ {
+ $this->order_by_date = (bool) $enable;
+ }
+
+ function input_encoding($encoding = false)
+ {
+ if ($encoding)
+ {
+ $this->input_encoding = (string) $encoding;
+ }
+ else
+ {
+ $this->input_encoding = false;
+ }
+ }
+
+ function set_cache_class($class = 'SimplePie_Cache')
+ {
+ if (SimplePie_Misc::is_a_class($class, 'SimplePie_Cache'))
+ {
+ $this->cache_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ function set_locator_class($class = 'SimplePie_Locator')
+ {
+ if (SimplePie_Misc::is_a_class($class, 'SimplePie_Locator'))
+ {
+ $this->locator_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ function set_parser_class($class = 'SimplePie_Parser')
+ {
+ if (SimplePie_Misc::is_a_class($class, 'SimplePie_Parser'))
+ {
+ $this->parser_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ function set_sanitize_class($object = 'SimplePie_Sanitize')
+ {
+ if (class_exists($object))
+ {
+ $this->sanitize = new $object;
+ return true;
+ }
+ return false;
+ }
+
+ function set_useragent($ua)
+ {
+ $this->useragent = (string) $ua;
+ }
+
+ function bypass_image_hotlink($get = false)
+ {
+ $this->sanitize->bypass_image_hotlink($get);
+ }
+
+ function bypass_image_hotlink_page($page = false)
+ {
+ $this->sanitize->bypass_image_hotlink_page($page);
+ }
+
+ function replace_headers($enable = false)
+ {
+ $this->sanitize->replace_headers($enable);
+ }
+
+ function remove_div($enable = true)
+ {
+ $this->sanitize->remove_div($enable);
+ }
+
+ function strip_ads($enable = false)
+ {
+ $this->sanitize->strip_ads($enable);
+ }
+
+ function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'), $encode = null)
+ {
+ $this->sanitize->strip_htmltags($tags);
+ if (!is_null($encode))
+ {
+ $this->sanitize->encode_instead_of_strip($tags);
+ }
+ }
+
+ function encode_instead_of_strip($enable = true)
+ {
+ $this->sanitize->encode_instead_of_strip($enable);
+ }
+
+ function strip_attributes($attribs = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur'))
+ {
+ $this->sanitize->strip_attributes($attribs);
+ }
+
+ function output_encoding($encoding = 'UTF-8')
+ {
+ $this->sanitize->output_encoding($encoding);
+ }
+
+ function set_item_class($class = 'SimplePie_Item')
+ {
+ return $this->sanitize->set_item_class($class);
+ }
+
+ function set_author_class($class = 'SimplePie_Author')
+ {
+ return $this->sanitize->set_author_class($class);
+ }
+
+ function set_enclosure_class($class = 'SimplePie_Enclosure')
+ {
+ return $this->sanitize->set_enclosure_class($class);
+ }
+
+ function init()
+ {
+ if (!(function_exists('version_compare') && ((version_compare(phpversion(), '4.3.2', '>=') && version_compare(phpversion(), '5', '<')) || version_compare(phpversion(), '5.0.3', '>='))) || !extension_loaded('xml') || !extension_loaded('pcre'))
+ {
+ return false;
+ }
+ if ($this->sanitize->bypass_image_hotlink && !empty($_GET[$this->sanitize->bypass_image_hotlink]))
+ {
+ if (get_magic_quotes_gpc())
+ {
+ $_GET[$this->sanitize->bypass_image_hotlink] = stripslashes($_GET[$this->sanitize->bypass_image_hotlink]);
+ }
+ SimplePie_Misc::display_file($_GET[$this->sanitize->bypass_image_hotlink], 10, $this->useragent);
+ }
+
+ if (isset($_GET['js']))
+ {
+ $embed = <<<EOT
+function embed_odeo(link) {
+ document.writeln('<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="440" height="80" wmode="transparent" allowScriptAccess="any" flashvars="valid_sample_rate=true&external_url='+link+'"></embed>');
+}
+
+function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) {
+ if (placeholder != '') {
+ document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
+ }
+ else {
+ document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
+ }
+}
+
+function embed_flash(bgcolor, width, height, link, loop, type) {
+ document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>');
+}
+
+function embed_wmedia(width, height, link) {
+ document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>');
+}
+EOT;
+
+ if (function_exists('ob_gzhandler'))
+ {
+ ob_start('ob_gzhandler');
+ }
+ header('Content-type: text/javascript; charset: UTF-8');
+ header('Cache-Control: must-revalidate');
+ header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 86400) . ' GMT');
+ echo $embed;
+ exit;
+ }
+
+ if (!empty($this->rss_url) || !empty($this->raw_data))
+ {
+ $this->data = array();
+ $cache = false;
+
+ if (!empty($this->rss_url))
+ {
+ // Decide whether to enable caching
+ if ($this->enable_cache && preg_match('/^http(s)?:\/\//i', $this->rss_url))
+ {
+ $cache = new $this->cache_class($this->cache_location, sha1($this->rss_url), 'spc');
+ }
+ // If it's enabled and we don't want an XML dump, use the cache
+ if ($cache && !$this->xml_dump)
+ {
+ // Load the Cache
+ $this->data = $cache->load();
+ if (!empty($this->data))
+ {
+ // If we've hit a sha1 collision just rerun it with caching disabled
+ if (isset($this->data['url']) && $this->data['url'] != $this->rss_url)
+ {
+ $cache = false;
+ }
+ // If we've got a feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL
+ else if (!empty($this->data['feed_url']))
+ {
+ $this->feed_url($this->data['feed_url']);
+ return $this->init();
+ }
+ // If the cache is new enough
+ else if ($cache->mtime() + $this->max_minutes * 60 < time())
+ {
+ // If we have last-modified and/or etag set
+ if (!empty($this->data['last-modified']) || !empty($this->data['etag']))
+ {
+ $headers = array();
+ if (!empty($this->data['last-modified']))
+ {
+ $headers['if-modified-since'] = $this->data['last-modified'];
+ }
+ if (!empty($this->data['etag']))
+ {
+ $headers['if-none-match'] = $this->data['etag'];
+ }
+ $file = new SimplePie_File($this->rss_url, $this->timeout/10, 5, $headers, $this->useragent);
+ if ($file->success)
+ {
+ $headers = $file->headers();
+ if ($headers['status']['code'] == 304)
+ {
+ $cache->touch();
+ return true;
+ }
+ }
+ unset($file);
+ }
+ // If we don't have last-modified or etag set, just clear the cache
+ else
+ {
+ $cache->unlink();
+ }
+ }
+ // If the cache is still valid, just return true
+ else
+ {
+ return true;
+ }
+ }
+ // If the cache is empty, delete it
+ else
+ {
+ $cache->unlink();
+ }
+ }
+ $this->data = array();
+ // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it.
+ if (!isset($file))
+ {
+ if (is_a($this->file, 'SimplePie_File') && $this->file->url == $this->rss_url)
+ {
+ $file =& $this->file;
+ }
+ else
+ {
+ $file = new SimplePie_File($this->rss_url, $this->timeout, 5, null, $this->useragent);
+ }
+ }
+ // If the file connection has an error, set SimplePie::error to that and quit
+ if (!$file->success)
+ {
+ $this->error = $file->error;
+ return false;
+ }
+
+ // Check if the supplied URL is a feed, if it isn't, look for it.
+ $locate = new $this->locator_class($file, $this->timeout, $this->useragent);
+ if (!$locate->is_feed($file))
+ {
+ $feed = $locate->find();
+ if ($feed)
+ {
+ if ($cache && !$cache->save(array('url' => $this->rss_url, 'feed_url' => $feed)))
+ {
+ $this->error = "$cache->name is not writeable";
+ SimplePie_Misc::error($this->error, E_USER_WARNING, __FILE__, __LINE__);
+ }
+ $this->rss_url = $feed;
+ return $this->init();
+ }
+ else
+ {
+ $this->error = "A feed could not be found at $this->rss_url";
+ SimplePie_Misc::error($this->error, E_USER_WARNING, __FILE__, __LINE__);
+ return false;
+ }
+ }
+
+ $headers = $file->headers();
+ $data = trim($file->body());
+ $file->close();
+ unset($file);
+ }
+ else
+ {
+ $data = $this->raw_data;
+ }
+
+ // First check to see if input has been overridden.
+ if (!empty($this->input_encoding))
+ {
+ $encoding = $this->input_encoding;
+ }
+ // Second try HTTP headers
+ else if (!empty($headers['content-type']) && preg_match('/charset\s*=\s*([^;]*)/i', $headers['content-type'], $charset))
+ {
+ $encoding = $charset[1];
+ }
+ // Then prolog, if at the very start of the document
+ else if (preg_match('/^<\?xml(.*)?>/msiU', $data, $prolog) && preg_match('/encoding\s*=\s*("([^"]*)"|\'([^\']*)\')/Ui', $prolog[1], $encoding))
+ {
+ $encoding = substr($encoding[1], 1, -1);
+ }
+ // UTF-32 Big Endian BOM
+ else if (strpos($data, sprintf('%c%c%c%c', 0x00, 0x00, 0xFE, 0xFF)) === 0)
+ {
+ $encoding = 'UTF-32be';
+ }
+ // UTF-32 Little Endian BOM
+ else if (strpos($data, sprintf('%c%c%c%c', 0xFF, 0xFE, 0x00, 0x00)) === 0)
+ {
+ $encoding = 'UTF-32';
+ }
+ // UTF-16 Big Endian BOM
+ else if (strpos($data, sprintf('%c%c', 0xFE, 0xFF)) === 0)
+ {
+ $encoding = 'UTF-16be';
+ }
+ // UTF-16 Little Endian BOM
+ else if (strpos($data, sprintf('%c%c', 0xFF, 0xFE)) === 0)
+ {
+ $encoding = 'UTF-16le';
+ }
+ // UTF-8 BOM
+ else if (strpos($data, sprintf('%c%c%c', 0xEF, 0xBB, 0xBF)) === 0)
+ {
+ $encoding = 'UTF-8';
+ }
+ // Fallback to the default
+ else
+ {
+ $encoding = null;
+ }
+
+ // Change the encoding to UTF-8 (as we always use UTF-8 internally)
+ $data = SimplePie_Misc::change_encoding($data, $encoding, 'UTF-8');
+
+ // Start parsing
+ $data = new $this->parser_class($data, 'UTF-8', $this->xml_dump);
+ // If we want the XML, just output that and quit
+ if ($this->xml_dump)
+ {
+ header('Content-type: text/xml; charset=UTF-8');
+ echo $data->data;
+ exit;
+ }
+ // If it's parsed fine
+ else if (!$data->error_code)
+ {
+ // Parse the data, and make it sane
+ $this->sanitize->parse_data_array($data->data, $this->rss_url);
+ unset($data);
+ // Get the sane data
+ $this->data['feedinfo'] = $this->sanitize->feedinfo;
+ unset($this->sanitize->feedinfo);
+ $this->data['info'] = $this->sanitize->info;
+ unset($this->sanitize->info);
+ $this->data['items'] = $this->sanitize->items;
+ unset($this->sanitize->items);
+ $this->data['feedinfo']['encoding'] = $this->sanitize->output_encoding;
+ $this->data['url'] = $this->rss_url;
+
+ // Store the headers that we need
+ if (!empty($headers['last-modified']))
+ {
+ $this->data['last-modified'] = $headers['last-modified'];
+ }
+ if (!empty($headers['etag']))
+ {
+ $this->data['etag'] = $headers['etag'];
+ }
+
+ // If we want to order it by date, check if all items have a date, and then sort it
+ if ($this->order_by_date && !empty($this->data['items']))
+ {
+ $do_sort = true;
+ foreach ($this->data['items'] as $item)
+ {
+ if (!$item->get_date('U'))
+ {
+ $do_sort = false;
+ break;
+ }
+ }
+ if ($do_sort)
+ {
+ usort($this->data['items'], create_function('$a, $b', 'if ($a->get_date(\'U\') == $b->get_date(\'U\')) return 1; return ($a->get_date(\'U\') < $b->get_date(\'U\')) ? 1 : -1;'));
+ }
+ }
+
+ // Cache the file if caching is enabled
+ if ($cache && !$cache->save($this->data))
+ {
+ $this->error = "$cache->name is not writeable";
+ SimplePie_Misc::error($this->error, E_USER_WARNING, __FILE__, __LINE__);
+ }
+ return true;
+ }
+ // If we have an error, just set SimplePie::error to it and quit
+ else
+ {
+ $this->error = "XML error: $data->error_string at line $data->current_line, column $data->current_column";
+ SimplePie_Misc::error($this->error, E_USER_WARNING, __FILE__, __LINE__);
+ return false;
+ }
+ }
+ }
+
+ function get_encoding()
+ {
+ if (!empty($this->data['feedinfo']['encoding']))
+ {
+ return $this->data['feedinfo']['encoding'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function handle_content_type($mime = 'text/html')
+ {
+ if (!headers_sent())
+ {
+ $header = "Content-type: $mime;";
+ if ($this->get_encoding())
+ {
+ $header .= ' charset=' . $this->get_encoding();
+ }
+ else
+ {
+ $header .= ' charset=UTF-8';
+ }
+ header($header);
+ }
+ }
+
+ function get_type()
+ {
+ if (!empty($this->data['feedinfo']['type']))
+ {
+ return $this->data['feedinfo']['type'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_version()
+ {
+ if (!empty($this->data['feedinfo']['version']))
+ {
+ return $this->data['feedinfo']['version'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_favicon($check = false, $alternate = null)
+ {
+ if (!empty($this->data['info']['link']['alternate'][0]))
+ {
+ $favicon = SimplePie_Misc::absolutize_url('/favicon.ico', $this->get_feed_link());
+
+ if ($check)
+ {
+ $file = new SimplePie_File($favicon, $this->timeout/10, 5, null, $this->useragent);
+ $headers = $file->headers();
+ $file->close();
+
+ if ($headers['status']['code'] == 200)
+ {
+ return $favicon;
+ }
+ }
+ else
+ {
+ return $favicon;
+ }
+ }
+ if (!is_null($alternate))
+ {
+ return $alternate;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_url()
+ {
+ if (!empty($this->rss_url))
+ {
+ return $this->rss_url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_feed()
+ {
+ if (!empty($this->rss_url))
+ {
+ return SimplePie_Misc::fix_protocol($this->rss_url, 2);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_outlook()
+ {
+ if (!empty($this->rss_url))
+ {
+ return 'outlook' . SimplePie_Misc::fix_protocol($this->rss_url, 2);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_podcast()
+ {
+ if (!empty($this->rss_url))
+ {
+ return SimplePie_Misc::fix_protocol($this->rss_url, 3);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_aol()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://feeds.my.aol.com/add.jsp?url=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_bloglines()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://www.bloglines.com/sub/' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_eskobo()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://www.eskobo.com/?AddToMyPage=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_feedfeeds()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://www.feedfeeds.com/add?feed=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_feedlounge()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://my.feedlounge.com/external/subscribe?url=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_feedster()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://www.feedster.com/myfeedster.php?action=addrss&amp;confirm=no&amp;rssurl=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_google()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://fusion.google.com/add?feedurl=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_gritwire()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://my.gritwire.com/feeds/addExternalFeed.aspx?FeedUrl=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_msn()
+ {
+ if ($this->subscribe_url())
+ {
+ $url = 'http://my.msn.com/addtomymsn.armx?id=rss&amp;ut=' . rawurlencode($this->subscribe_url());
+ if ($this->get_feed_link())
+ {
+ $url .= '&amp;ru=' . rawurlencode($this->get_feed_link());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_netvibes()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://www.netvibes.com/subscribe.php?url=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_newsburst()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://www.newsburst.com/Source/?add=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_newsgator()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://www.newsgator.com/ngs/subscriber/subext.aspx?url=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_odeo()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://www.odeo.com/listen/subscribe?feed=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_pluck()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://client.pluck.com/pluckit/prompt.aspx?GCID=C12286x053&amp;a=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_podnova()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://www.podnova.com/index_your_podcasts.srf?action=add&amp;url=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_rojo()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://www.rojo.com/add-subscription?resource=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function subscribe_yahoo()
+ {
+ if ($this->subscribe_url())
+ {
+ return 'http://add.my.yahoo.com/rss?url=' . rawurlencode($this->subscribe_url());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_feed_title()
+ {
+ if (!empty($this->data['info']['title']))
+ {
+ return $this->data['info']['title'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_feed_link()
+ {
+ if (!empty($this->data['info']['link']['alternate'][0]))
+ {
+ return $this->data['info']['link']['alternate'][0];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_feed_links()
+ {
+ if (!empty($this->data['info']['link']))
+ {
+ return $this->data['info']['link'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_feed_description()
+ {
+ if (!empty($this->data['info']['description']))
+ {
+ return $this->data['info']['description'];
+ }
+ else if (!empty($this->data['info']['dc:description']))
+ {
+ return $this->data['info']['dc:description'];
+ }
+ else if (!empty($this->data['info']['tagline']))
+ {
+ return $this->data['info']['tagline'];
+ }
+ else if (!empty($this->data['info']['subtitle']))
+ {
+ return $this->data['info']['subtitle'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_feed_copyright()
+ {
+ if (!empty($this->data['info']['copyright']))
+ {
+ return $this->data['info']['copyright'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_feed_language()
+ {
+ if (!empty($this->data['info']['language']))
+ {
+ return $this->data['info']['language'];
+ }
+ else if (!empty($this->data['info']['xml:lang']))
+ {
+ return $this->data['info']['xml:lang'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_image_exist()
+ {
+ if (!empty($this->data['info']['image']['url']) || !empty($this->data['info']['image']['logo']))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_image_title()
+ {
+ if (!empty($this->data['info']['image']['title']))
+ {
+ return $this->data['info']['image']['title'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_image_url()
+ {
+ if (!empty($this->data['info']['image']['url']))
+ {
+ return $this->data['info']['image']['url'];
+ }
+ else if (!empty($this->data['info']['image']['logo']))
+ {
+ return $this->data['info']['image']['logo'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_image_link()
+ {
+ if (!empty($this->data['info']['image']['link']))
+ {
+ return $this->data['info']['image']['link'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_image_width()
+ {
+ if (!empty($this->data['info']['image']['width']))
+ {
+ return $this->data['info']['image']['width'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_image_height()
+ {
+ if (!empty($this->data['info']['image']['height']))
+ {
+ return $this->data['info']['image']['height'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_item_quantity($max = 0)
+ {
+ if (!empty($this->data['items']))
+ {
+ $qty = sizeof($this->data['items']);
+ }
+ else
+ {
+ $qty = 0;
+ }
+ if ($max == 0)
+ {
+ return $qty;
+ }
+ else
+ {
+ return ($qty > $max) ? $max : $qty;
+ }
+ }
+
+ function get_item($key = 0)
+ {
+ if (!empty($this->data['items'][$key]))
+ {
+ return $this->data['items'][$key];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_items($start = 0, $end = 0)
+ {
+ if ($this->get_item_quantity() > 0)
+ {
+ if ($end == 0)
+ {
+ return array_slice($this->data['items'], $start);
+ }
+ else
+ {
+ return array_slice($this->data['items'], $start, $end);
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+}
+
+class SimplePie_Item
+{
+ var $data;
+
+ function SimplePie_Item($data)
+ {
+ $this->data =& $data;
+ }
+
+ function get_id()
+ {
+ if (!empty($this->data['guid']['data']))
+ {
+ return $this->data['guid']['data'];
+ }
+ else if (!empty($this->data['id']))
+ {
+ return $this->data['id'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_title()
+ {
+ if (!empty($this->data['title']))
+ {
+ return $this->data['title'];
+ }
+ else if (!empty($this->data['dc:title']))
+ {
+ return $this->data['dc:title'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_description()
+ {
+ if (!empty($this->data['content']))
+ {
+ return $this->data['content'];
+ }
+ else if (!empty($this->data['encoded']))
+ {
+ return $this->data['encoded'];
+ }
+ else if (!empty($this->data['summary']))
+ {
+ return $this->data['summary'];
+ }
+ else if (!empty($this->data['description']))
+ {
+ return $this->data['description'];
+ }
+ else if (!empty($this->data['dc:description']))
+ {
+ return $this->data['dc:description'];
+ }
+ else if (!empty($this->data['longdesc']))
+ {
+ return $this->data['longdesc'];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (!empty($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_categories()
+ {
+ $categories = array();
+ if (!empty($this->data['category']))
+ {
+ $categories = array_merge($categories, $this->data['category']);
+ }
+ if (!empty($this->data['subject']))
+ {
+ $categories = array_merge($categories, $this->data['subject']);
+ }
+ if (!empty($this->data['term']))
+ {
+ $categories = array_merge($categories, $this->data['term']);
+ }
+ if (!empty($categories))
+ {
+ return array_unique($categories);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_author($key = 0)
+ {
+ $authors = $this->get_authors();
+ if (!empty($authors[$key]))
+ {
+ return $authors[$key];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_authors()
+ {
+ $authors = array();
+ if (!empty($this->data['author']))
+ {
+ $authors = array_merge($authors, $this->data['author']);
+ }
+ if (!empty($this->data['creator']))
+ {
+ $authors = array_merge($authors, $this->data['creator']);
+ }
+ if (!empty($authors))
+ {
+ return array_unique($authors);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_date($date_format = 'j F Y, g:i a')
+ {
+ if (!empty($this->data['pubdate']))
+ {
+ return date($date_format, $this->data['pubdate']);
+ }
+ else if (!empty($this->data['dc:date']))
+ {
+ return date($date_format, $this->data['dc:date']);
+ }
+ else if (!empty($this->data['issued']))
+ {
+ return date($date_format, $this->data['issued']);
+ }
+ else if (!empty($this->data['published']))
+ {
+ return date($date_format, $this->data['published']);
+ }
+ else if (!empty($this->data['modified']))
+ {
+ return date($date_format, $this->data['modified']);
+ }
+ else if (!empty($this->data['updated']))
+ {
+ return date($date_format, $this->data['updated']);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_permalink()
+ {
+ $link = $this->get_link(0);
+ $enclosure = $this->get_enclosure(0);
+ if (!empty($link))
+ {
+ return $link;
+ }
+ else if (!empty($enclosure))
+ {
+ return $enclosure->get_link();
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_link($key = 0, $rel = 'alternate')
+ {
+ $links = $this->get_links($rel);
+ if (!empty($links[$key]))
+ {
+ return $links[$key];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_links($rel = 'alternate')
+ {
+ if ($rel == 'alternate')
+ {
+ $links = array();
+ if (!empty($this->data['link'][$rel]))
+ {
+ $links = $this->data['link'][$rel];
+ }
+ if (!empty($this->data['guid']['data']) && $this->data['guid']['permalink'] == true)
+ {
+ $links[] = $this->data['guid']['data'];
+ }
+ return $links;
+ }
+ else if (!empty($this->data['link'][$rel]))
+ {
+ return $this->data['link'][$rel];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_enclosure($key = 0)
+ {
+ $enclosures = $this->get_enclosures();
+ if (!empty($enclosures[$key]))
+ {
+ return $enclosures[$key];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_enclosures()
+ {
+ $enclosures = array();
+ $links = $this->get_links('enclosure');
+ if (!empty($this->data['enclosures']))
+ {
+ $enclosures = array_merge($enclosures, $this->data['enclosures']);
+ }
+ if (!empty($links))
+ {
+ $enclosures = array_merge($enclosures, $links);
+ }
+ if (!empty($enclosures))
+ {
+ return array_unique($enclosures);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_blinklist()
+ {
+ if ($this->get_permalink())
+ {
+ $url = 'http://www.blinklist.com/index.php?Action=Blink/addblink.php&amp;Description=&amp;Url=' . rawurlencode($this->get_permalink());
+ if ($this->get_title())
+ {
+ $url .= '&amp;Title=' . rawurlencode($this->get_title());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_blogmarks()
+ {
+ if ($this->get_permalink())
+ {
+ $url = 'http://blogmarks.net/my/new.php?mini=1&amp;simple=1&amp;url=' . rawurlencode($this->get_permalink());
+ if ($this->get_title())
+ {
+ $url .= '&amp;title=' . rawurlencode($this->get_title());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_delicious()
+ {
+ if ($this->get_permalink())
+ {
+ $url = 'http://del.icio.us/post/?v=3&amp;url=' . rawurlencode($this->get_permalink());
+ if ($this->get_title())
+ {
+ $url .= '&amp;title=' . rawurlencode($this->get_title());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_digg()
+ {
+ if ($this->get_permalink())
+ {
+ return 'http://digg.com/submit?phase=2&amp;URL=' . rawurlencode($this->get_permalink());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_furl()
+ {
+ if ($this->get_permalink())
+ {
+ $url = 'http://www.furl.net/storeIt.jsp?u=' . rawurlencode($this->get_permalink());
+ if ($this->get_title())
+ {
+ $url .= '&amp;t=' . rawurlencode($this->get_title());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_magnolia()
+ {
+ if ($this->get_permalink())
+ {
+ $url = 'http://ma.gnolia.com/bookmarklet/add?url=' . rawurlencode($this->get_permalink());
+ if ($this->get_title())
+ {
+ $url .= '&amp;title=' . rawurlencode($this->get_title());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_myweb20()
+ {
+ if ($this->get_permalink())
+ {
+ $url = 'http://myweb2.search.yahoo.com/myresults/bookmarklet?u=' . rawurlencode($this->get_permalink());
+ if ($this->get_title())
+ {
+ $url .= '&amp;t=' . rawurlencode($this->get_title());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_newsvine()
+ {
+ if ($this->get_permalink())
+ {
+ $url = 'http://www.newsvine.com/_wine/save?u=' . rawurlencode($this->get_permalink());
+ if ($this->get_title())
+ {
+ $url .= '&amp;h=' . rawurlencode($this->get_title());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_reddit()
+ {
+ if ($this->get_permalink())
+ {
+ $url = 'http://reddit.com/submit?url=' . rawurlencode($this->get_permalink());
+ if ($this->get_title())
+ {
+ $url .= '&amp;title=' . rawurlencode($this->get_title());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_segnalo()
+ {
+ if ($this->get_permalink())
+ {
+ $url = 'http://segnalo.com/post.html.php?url=' . rawurlencode($this->get_permalink());
+ if ($this->get_title())
+ {
+ $url .= '&amp;title=' . rawurlencode($this->get_title());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_simpy()
+ {
+ if ($this->get_permalink())
+ {
+ $url = 'http://www.simpy.com/simpy/LinkAdd.do?href=' . rawurlencode($this->get_permalink());
+ if ($this->get_title())
+ {
+ $url .= '&amp;title=' . rawurlencode($this->get_title());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_smarking()
+ {
+ if ($this->get_permalink())
+ {
+ return 'http://smarking.com/editbookmark/?url=' . rawurlencode($this->get_permalink());
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_spurl()
+ {
+ if ($this->get_permalink())
+ {
+ $url = 'http://www.spurl.net/spurl.php?v=3&amp;url=' . rawurlencode($this->get_permalink());
+ if ($this->get_title())
+ {
+ $url .= '&amp;title=' . rawurlencode($this->get_title());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function add_to_wists()
+ {
+ if ($this->get_permalink())
+ {
+ $url = 'http://wists.com/r.php?c=&amp;r=' . rawurlencode($this->get_permalink());
+ if ($this->get_title())
+ {
+ $url .= '&amp;title=' . rawurlencode($this->get_title());
+ }
+ return $url;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function search_technorati()
+ {
+ if ($this->get_permalink())
+ {
+ return 'http://www.technorati.com/search/' . rawurlencode($this->get_permalink());
+ }
+ else
+ {
+ return false;
+ }
+ }
+}
+
+class SimplePie_Author
+{
+ var $name;
+ var $link;
+ var $email;
+
+ // Constructor, used to input the data
+ function SimplePie_Author($name, $link, $email)
+ {
+ $this->name = $name;
+ $this->link = $link;
+ $this->email = $email;
+ }
+
+ function get_name()
+ {
+ if (!empty($this->name))
+ {
+ return $this->name;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_link()
+ {
+ if (!empty($this->link))
+ {
+ return $this->link;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_email()
+ {
+ if (!empty($this->email))
+ {
+ return $this->email;
+ }
+ else
+ {
+ return false;
+ }
+ }
+}
+
+class SimplePie_Enclosure
+{
+ var $link;
+ var $type;
+ var $length;
+
+ // Constructor, used to input the data
+ function SimplePie_Enclosure($link, $type, $length)
+ {
+ $this->link = $link;
+ $this->type = $type;
+ $this->length = $length;
+ }
+
+ function get_link()
+ {
+ if (!empty($this->link))
+ {
+ if (class_exists('idna_convert'))
+ {
+ $idn = new idna_convert;
+ $this->link = $idn->encode($this->link);
+ }
+ return $this->link;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_extension()
+ {
+ if (!empty($this->link))
+ {
+ return pathinfo($this->link, PATHINFO_EXTENSION);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_type()
+ {
+ if (!empty($this->type))
+ {
+ return $this->type;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_length()
+ {
+ if (!empty($this->length))
+ {
+ return $this->length;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_size()
+ {
+ $length = $this->get_length();
+ if (!empty($length))
+ {
+ return round($length/1048576, 2);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function native_embed($options='')
+ {
+ return $this->embed($options, true);
+ }
+
+ function embed($options = '', $native = false)
+ {
+ // Set up defaults
+ $audio = '';
+ $video = '';
+ $alt = '';
+ $altclass = '';
+ $loop = 'false';
+ $width = 'auto';
+ $height = 'auto';
+ $bgcolor = '#ffffff';
+
+ // Process options and reassign values as necessary
+ if (is_array($options))
+ {
+ extract($options);
+ }
+ else
+ {
+ $options = explode(',', $options);
+ foreach($options as $option)
+ {
+ $opt = explode(':', $option, 2);
+ if (isset($opt[0], $opt[1]))
+ {
+ $opt[0] = trim($opt[0]);
+ $opt[1] = trim($opt[1]);
+ switch ($opt[0])
+ {
+ case 'audio':
+ $audio = $opt[1];
+ break;
+
+ case 'video':
+ $video = $opt[1];
+ break;
+
+ case 'alt':
+ $alt = $opt[1];
+ break;
+
+ case 'altclass':
+ $altclass = $opt[1];
+ break;
+
+ case 'loop':
+ $loop = $opt[1];
+ break;
+
+ case 'width':
+ $width = $opt[1];
+ break;
+
+ case 'height':
+ $height = $opt[1];
+ break;
+
+ case 'bgcolor':
+ $bgcolor = $opt[1];
+ break;
+ }
+ }
+ }
+ }
+
+ $type = strtolower($this->get_type());
+
+ // If we encounter an unsupported mime-type, check the file extension and guess intelligently.
+ if (!in_array($type, array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mpeg', 'audio/x-mpeg', 'audio/mp3', 'x-audio/mp3', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video', 'application/x-shockwave-flash', 'application/futuresplash', 'application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx')))
+ {
+ switch (strtolower($this->get_extension()))
+ {
+ // Audio mime-types
+ case 'aac':
+ case 'adts':
+ $type = 'audio/acc';
+ break;
+
+ case 'aif':
+ case 'aifc':
+ case 'aiff':
+ case 'cdda':
+ $type = 'audio/aiff';
+ break;
+
+ case 'bwf':
+ $type = 'audio/wav';
+ break;
+
+ case 'kar':
+ case 'mid':
+ case 'midi':
+ case 'smf':
+ $type = 'audio/midi';
+ break;
+
+ case 'm4a':
+ $type = 'audio/x-m4a';
+ break;
+
+ case 'mp3':
+ case 'swa':
+ $type = 'audio/mp3';
+ break;
+
+ case 'wav':
+ $type = 'audio/wav';
+ break;
+
+ case 'wax':
+ $type = 'audio/x-ms-wax';
+ break;
+
+ case 'wma':
+ $type = 'audio/x-ms-wma';
+ break;
+
+ // Video mime-types
+ case '3gp':
+ case '3gpp':
+ $type = 'video/3gpp';
+ break;
+
+ case '3g2':
+ case '3gp2':
+ $type = 'video/3gpp2';
+ break;
+
+ case 'asf':
+ $type = 'video/x-ms-asf';
+ break;
+
+ case 'm1a':
+ case 'm1s':
+ case 'm1v':
+ case 'm15':
+ case 'm75':
+ case 'mp2':
+ case 'mpa':
+ case 'mpeg':
+ case 'mpg':
+ case 'mpm':
+ case 'mpv':
+ $type = 'video/mpeg';
+ break;
+
+ case 'm4v':
+ $type = 'video/x-m4v';
+ break;
+
+ case 'mov':
+ case 'qt':
+ $type = 'video/quicktime';
+ break;
+
+ case 'mp4':
+ case 'mpg4':
+ $type = 'video/mp4';
+ break;
+
+ case 'sdv':
+ $type = 'video/sd-video';
+ break;
+
+ case 'wm':
+ $type = 'video/x-ms-wm';
+ break;
+
+ case 'wmv':
+ $type = 'video/x-ms-wmv';
+ break;
+
+ case 'wvx':
+ $type = 'video/x-ms-wvx';
+ break;
+
+ // Flash mime-types
+ case 'spl':
+ $type = 'application/futuresplash';
+ break;
+
+ case 'swf':
+ $type = 'application/x-shockwave-flash';
+ break;
+ }
+ }
+
+ $mime = explode('/', $type, 2);
+ $mime = $mime[0];
+
+ // Process values for 'auto'
+ if ($width == 'auto')
+ {
+ if ($mime == 'video')
+ {
+ $width = '320';
+ }
+ else
+ {
+ $width = '100%';
+ }
+ }
+ if ($height == 'auto')
+ {
+ if ($mime == 'audio')
+ {
+ $height = 0;
+ }
+ else if ($mime == 'video')
+ {
+ $height = 240;
+ }
+ else
+ {
+ $height = 256;
+ }
+ }
+
+ // Set proper placeholder value
+ if ($mime == 'audio')
+ {
+ $placeholder = $audio;
+ }
+ else if ($mime == 'video')
+ {
+ $placeholder = $video;
+ }
+
+ $embed = '';
+
+ // Make sure the JS library is included
+ // (I know it'll be included multiple times, but I can't think of a better way to do this automatically)
+ if (!$native)
+ {
+ $embed .= '<script type="text/javascript" src="?js"></script>';
+ }
+
+ // Odeo Feed MP3's
+ if (substr(strtolower($this->get_link()), 0, 15) == 'http://odeo.com') {
+ if ($native)
+ {
+ $embed .= '<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="440" height="80" wmode="transparent" allowScriptAccess="any" flashvars="valid_sample_rate=true&external_url=' . $this->get_link() . '"></embed>';
+ }
+ else
+ {
+ $embed .= '<script type="text/javascript">embed_odeo("' . $this->get_link() . '");</script>';
+ }
+ }
+
+ // QuickTime 7 file types. Need to test with QuickTime 6.
+ else if (in_array($type, array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mpeg', 'audio/x-mpeg', 'audio/mp3', 'x-audio/mp3', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video')))
+ {
+ $height += 16;
+ if ($native)
+ {
+ if ($placeholder != "") {
+ $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" href=\"" . $this->get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://www.apple.com/quicktime/download/\"></embed>";
+ }
+ else {
+ $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" src=\"" . $this->get_link() . "\" width=\"$width+\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://www.apple.com/quicktime/download/\"></embed>";
+ }
+ }
+ else
+ {
+ $embed .= "<script type='text/javascript'>embed_quicktime('$type', '$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$placeholder', '$loop');</script>";
+ }
+ }
+
+ // Flash
+ else if (in_array($type, array('application/x-shockwave-flash', 'application/futuresplash')))
+ {
+ if ($native)
+ {
+ $embed .= "<embed src=\"" . $this->get_link() . "\" pluginspage=\"http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\"></embed>";
+ }
+ else
+ {
+ $embed .= "<script type='text/javascript'>embed_flash('$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$loop', '$type');</script>";
+ }
+ }
+
+ // Windows Media
+ else if (in_array($type, array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx')))
+ {
+ $height += 45;
+ if ($native)
+ {
+ $embed .= "<embed type=\"application/x-mplayer2\" src=\"" . $this->get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\"></embed>";
+ }
+ else
+ {
+ $embed .= "<script type='text/javascript'>embed_wmedia('$width', '$height', '" . $this->get_link() . "');</script>";
+ }
+ }
+
+ // Everything else
+ else $embed .= '<a href="' . $this->get_link() . '" class="' . $altclass . '">' . $alt . '</a>';
+
+ return $embed;
+ }
+}
+
+class SimplePie_File
+{
+ var $url;
+ var $useragent;
+ var $success = true;
+ var $headers = array();
+ var $body;
+ var $fp;
+ var $redirects = 0;
+ var $error;
+ var $method;
+
+ function SimplePie_File($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null)
+ {
+ if (class_exists('idna_convert'))
+ {
+ $idn = new idna_convert;
+ $url = $idn->encode($url);
+ }
+ $this->url = $url;
+ $this->useragent = $useragent;
+ if (preg_match('/^http(s)?:\/\//i', $url))
+ {
+ if (empty($useragent))
+ {
+ $useragent = ini_get('user_agent');
+ $this->useragent = $useragent;
+ }
+ if (!is_array($headers))
+ {
+ $headers = array();
+ }
+ if (extension_loaded('curl') && version_compare(SimplePie_Misc::get_curl_version(), '7.10', '>='))
+ {
+ $this->method = 'curl';
+ $fp = curl_init();
+ $headers2 = array();
+ foreach ($headers as $key => $value)
+ {
+ $headers2[] = "$key: $value";
+ }
+ curl_setopt($fp, CURLOPT_ENCODING, '');
+ curl_setopt($fp, CURLOPT_URL, $url);
+ curl_setopt($fp, CURLOPT_HEADER, 1);
+ curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
+ curl_setopt($fp, CURLOPT_REFERER, $url);
+ curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
+ curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
+ if (!ini_get('open_basedir') && !ini_get('safe_mode'))
+ {
+ curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
+ curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);
+ }
+
+ $this->headers = trim(curl_exec($fp));
+ if (curl_errno($fp))
+ {
+ $this->error = 'cURL error: ' . curl_error($fp);
+ $this->success = false;
+ return false;
+ }
+ else
+ {
+ $info = curl_getinfo($fp);
+ $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 2);
+ $this->body = array_pop($this->headers);
+ $this->headers = array_pop($this->headers);
+ $this->headers = $this->parse_headers($this->headers);
+ if (($this->headers['status']['code'] == 301 || $this->headers['status']['code'] == 302 || $this->headers['status']['code'] == 303 || $this->headers['status']['code'] == 307) && !empty($this->headers['location']) && $this->redirects < $redirects)
+ {
+ $this->redirects++;
+ return $this->SimplePie_File($this->headers['location'], $timeout, $redirects, $headers, $useragent);
+ }
+ }
+ }
+ else
+ {
+ $this->method = 'fsockopen';
+ $url_parts = parse_url($url);
+ if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) == 'https')
+ {
+ $url_parts['host'] = "ssl://$url_parts[host]";
+ $url_parts['port'] = 443;
+ }
+ if (!isset($url_parts['port']))
+ {
+ $url_parts['port'] = 80;
+ }
+ $this->fp = fsockopen($url_parts['host'], $url_parts['port'], $errno, $errstr, $timeout);
+ if (!$this->fp)
+ {
+ $this->error = 'fsockopen error: ' . $errstr;
+ $this->success = false;
+ return false;
+ }
+ else
+ {
+ stream_set_timeout($this->fp, $timeout);
+ $get = (isset($url_parts['query'])) ? "$url_parts[path]?$url_parts[query]" : $url_parts['path'];
+ $out = "GET $get HTTP/1.0\r\n";
+ $out .= "Host: $url_parts[host]\r\n";
+ $out .= "User-Agent: $useragent\r\n";
+ if (function_exists('gzinflate'))
+ {
+ $out .= "Accept-Encoding: gzip,deflate\r\n";
+ }
+
+ if (!empty($url_parts['user']) && !empty($url_parts['pass']))
+ {
+ $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n";
+ }
+ foreach ($headers as $key => $value)
+ {
+ $out .= "$key: $value\r\n";
+ }
+ $out .= "Connection: Close\r\n\r\n";
+ fwrite($this->fp, $out);
+
+ $info = stream_get_meta_data($this->fp);
+ $data = '';
+ while (strpos($data, "\r\n\r\n") === false && !$info['timed_out'])
+ {
+ $data .= fgets($this->fp, 128);
+ $info = stream_get_meta_data($this->fp);
+ }
+ if (!$info['timed_out'])
+ {
+ $this->headers = $this->parse_headers($data);
+ if (($this->headers['status']['code'] == 301 || $this->headers['status']['code'] == 302 || $this->headers['status']['code'] == 303 || $this->headers['status']['code'] == 307) && !empty($this->headers['location']) && $this->redirects < $redirects)
+ {
+ $this->redirects++;
+ return $this->SimplePie_File($this->headers['location'], $timeout, $redirects, $headers, $useragent);
+ }
+ }
+ else
+ {
+ $this->close();
+ $this->error = 'fsocket timed out';
+ $this->success = false;
+ return false;
+ }
+ }
+ }
+ return $this->headers['status']['code'];
+ }
+ else
+ {
+ $this->method = 'fopen';
+ if ($this->fp = fopen($url, 'r'))
+ {
+ return true;
+ }
+ else
+ {
+ $this->error = 'fopen could not open the file';
+ $this->success = false;
+ return false;
+ }
+ }
+ }
+
+ function headers()
+ {
+ return $this->headers;
+ }
+
+ function body()
+ {
+ if (is_null($this->body))
+ {
+ if ($this->fp)
+ {
+ $info = stream_get_meta_data($this->fp);
+ $this->body = '';
+ while (!$info['eof'] && !$info['timed_out'])
+ {
+ $this->body .= fread($this->fp, 1024);
+ $info = stream_get_meta_data($this->fp);
+ }
+ if (!$info['timed_out'])
+ {
+ $this->body = trim($this->body);
+ if ($this->method == 'fsockopen' && !empty($this->headers['content-encoding']) && $this->headers['content-encoding'] == 'gzip')
+ {
+ $this->body = substr($this->body, 10);
+ $this->body = gzinflate($this->body);
+ }
+ $this->close();
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+ return $this->body;
+ }
+
+ function close()
+ {
+ if (!is_null($this->fp))
+ {
+ if (fclose($this->fp))
+ {
+ $this->fp = null;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function parse_headers($headers)
+ {
+ $headers = explode("\r\n", trim($headers));
+ $status = array_shift($headers);
+ foreach ($headers as $header)
+ {
+ $data = explode(':', $header, 2);
+ $head[strtolower(trim($data[0]))] = trim($data[1]);
+ }
+ if (preg_match('/HTTP\/[0-9\.]+ ([0-9]+)(.*)$/i', $status, $matches))
+ {
+ if (isset($head['status']))
+ {
+ unset($head['status']);
+ }
+ $head['status']['code'] = $matches[1];
+ $head['status']['name'] = trim($matches[2]);
+ }
+ return $head;
+ }
+}
+
+class SimplePie_Cache
+{
+ var $location;
+ var $filename;
+ var $extension;
+ var $name;
+
+ function SimplePie_Cache($location, $filename, $extension)
+ {
+ $this->location = $location;
+ $this->filename = rawurlencode($filename);
+ $this->extension = rawurlencode($extension);
+ $this->name = "$location/$this->filename.$this->extension";
+ }
+
+ function save($data)
+ {
+ if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location))
+ {
+ $fp = fopen($this->name, 'w');
+ if ($fp)
+ {
+ fwrite($fp, serialize($data));
+ fclose($fp);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function load()
+ {
+ if (file_exists($this->name) && is_readable($this->name))
+ {
+ return unserialize(file_get_contents($this->name));
+ }
+ return false;
+ }
+
+ function mtime()
+ {
+ if (file_exists($this->name))
+ {
+ return filemtime($this->name);
+ }
+ return false;
+ }
+
+ function touch()
+ {
+ if (file_exists($this->name))
+ {
+ return touch($this->name);
+ }
+ return false;
+ }
+
+ function unlink()
+ {
+ if (file_exists($this->name))
+ {
+ return unlink($this->name);
+ }
+ return false;
+ }
+}
+
+class SimplePie_Misc
+{
+ function absolutize_url($relative, $base)
+ {
+ $relative = trim($relative);
+ $base = trim($base);
+ if (!empty($relative))
+ {
+ $relative = SimplePie_Misc::parse_url($relative, false);
+ $relative = array('scheme' => $relative[2], 'authority' => $relative[3], 'path' => $relative[5], 'query' => $relative[7], 'fragment' => $relative[9]);
+ if (!empty($relative['scheme']))
+ {
+ $target = $relative;
+ }
+ else if (!empty($base))
+ {
+ $base = SimplePie_Misc::parse_url($base, false);
+ $base = array('scheme' => $base[2], 'authority' => $base[3], 'path' => $base[5], 'query' => $base[7], 'fragment' => $base[9]);
+ $target['scheme'] = $base['scheme'];
+ if (!empty($relative['authority']))
+ {
+ $target = array_merge($relative, $target);
+ }
+ else
+ {
+ $target['authority'] = $base['authority'];
+ if (!empty($relative['path']))
+ {
+ if (strpos($relative['path'], '/') === 0)
+ {
+ $target['path'] = $relative['path'];
+ }
+ else
+ {
+ if (!empty($base['path']))
+ {
+ $target['path'] = dirname("$base[path].") . '/' . $relative['path'];
+ }
+ else
+ {
+ $target['path'] = '/' . $relative['path'];
+ }
+ }
+ if (!empty($relative['query']))
+ {
+ $target['query'] = $relative['query'];
+ }
+ $input = $target['path'];
+ $target['path'] = '';
+ while (!empty($input))
+ {
+ if (strpos($input, '../') === 0)
+ {
+ $input = substr($input, 3);
+ }
+ else if (strpos($input, './') === 0)
+ {
+ $input = substr($input, 2);
+ }
+ else if (strpos($input, '/./') === 0)
+ {
+ $input = substr_replace($input, '/', 0, 3);
+ }
+ else if (strpos($input, '/.') === 0 && SimplePie_Misc::strendpos($input, '/.') === 0)
+ {
+ $input = substr_replace($input, '/', -2);
+ }
+ else if (strpos($input, '/../') === 0)
+ {
+ $input = substr_replace($input, '/', 0, 4);
+ $target['path'] = preg_replace('/(\/)?([^\/]+)$/U', '', $target['path']);
+ }
+ else if (strpos($input, '/..') === 0 && SimplePie_Misc::strendpos($input, '/..') === 0)
+ {
+ $input = substr_replace($input, '/', 0, 3);
+ $target['path'] = preg_replace('/(\/)?([^\/]+)$/U', '', $target['path']);
+ }
+ else if ($input == '.' || $input == '..')
+ {
+ $input = '';
+ }
+ else
+ {
+ if (preg_match('/^(.+)(\/|$)/U', $input, $match))
+ {
+ $target['path'] .= $match[1];
+ $input = substr_replace($input, '', 0, strlen($match[1]));
+ }
+ }
+ }
+ }
+ else
+ {
+ if (!empty($base['path']))
+ {
+ $target['path'] = $base['path'];
+ }
+ else
+ {
+ $target['path'] = '/';
+ }
+ if (!empty($relative['query']))
+ {
+ $target['query'] = $relative['query'];
+ }
+ else if (!empty($base['query']))
+ {
+ $target['query'] = $base['query'];
+ }
+ }
+ }
+ if (!empty($relative['fragment']))
+ {
+ $target['fragment'] = $relative['fragment'];
+ }
+ }
+ else
+ {
+ return false;
+ }
+ $return = '';
+ if (!empty($target['scheme']))
+ {
+ $return .= "$target[scheme]:";
+ }
+ if (!empty($target['authority']))
+ {
+ $return .= $target['authority'];
+ }
+ if (!empty($target['path']))
+ {
+ $return .= $target['path'];
+ }
+ if (!empty($target['query']))
+ {
+ $return .= "?$target[query]";
+ }
+ if (!empty($target['fragment']))
+ {
+ $return .= "#$target[fragment]";
+ }
+ }
+ else
+ {
+ $return = $base;
+ }
+ return $return;
+ }
+
+ function strendpos($haystack, $needle)
+ {
+ return strlen($haystack) - strpos($haystack, $needle) - strlen($needle);
+ }
+
+ function get_element($realname, $string)
+ {
+ $return = array();
+ $name = preg_quote($realname, '/');
+ preg_match_all("/<($name)((\s*((\w+:)?\w+)\s*=\s*(\"([^\"]*)\"|'([^']*)'|(.*)))*)\s*((\/)?>|>(.*)<\/$name>)/msiU", $string, $matches, PREG_SET_ORDER);
+ for ($i = 0; $i < count($matches); $i++)
+ {
+ $return[$i]['tag'] = $realname;
+ $return[$i]['full'] = $matches[$i][0];
+ if (strlen($matches[$i][10]) <= 2)
+ {
+ $return[$i]['self_closing'] = true;
+ }
+ else
+ {
+ $return[$i]['self_closing'] = false;
+ $return[$i]['content'] = $matches[$i][12];
+ }
+ $return[$i]['attribs'] = array();
+ if (!empty($matches[$i][2]))
+ {
+ preg_match_all('/((\w+:)?\w+)\s*=\s*("([^"]*)"|\'([^\']*)\'|(\S+))\s/msiU', ' ' . $matches[$i][2] . ' ', $attribs, PREG_SET_ORDER);
+ for ($j = 0; $j < count($attribs); $j++)
+ {
+ $return[$i]['attribs'][strtoupper($attribs[$j][1])]['data'] = $attribs[$j][count($attribs[$j])-1];
+ $first = substr($attribs[$j][2], 0, 1);
+ $return[$i]['attribs'][strtoupper($attribs[$j][1])]['split'] = ($first == '"' || $first == "'") ? $first : '"';
+ }
+ }
+ }
+ return $return;
+ }
+
+ function element_implode($element)
+ {
+ $full = "<$element[tag]";
+ foreach ($element['attribs'] as $key => $value)
+ {
+ $key = strtolower($key);
+ $full .= " $key=$value[split]$value[data]$value[split]";
+ }
+ if ($element['self_closing'])
+ {
+ $full .= ' />';
+ }
+ else
+ {
+ $full .= ">$element[content]</$element[tag]>";
+ }
+ return $full;
+ }
+
+ function error($message, $level, $file, $line)
+ {
+ switch ($level)
+ {
+ case E_USER_ERROR:
+ $note = 'PHP Error';
+ break;
+ case E_USER_WARNING:
+ $note = 'PHP Warning';
+ break;
+ case E_USER_NOTICE:
+ $note = 'PHP Notice';
+ break;
+ default:
+ $note = 'Unknown Error';
+ break;
+ }
+ error_log("$note: $message in $file on line $line", 0);
+ return $message;
+ }
+
+ function display_file($url, $timeout = 10, $useragent = null)
+ {
+ $file = new SimplePie_File($url, $timeout, 5, null, $useragent);
+ $headers = $file->headers();
+ if ($file->body() !== false)
+ {
+ header('Content-type: ' . $headers['content-type']);
+ echo $file->body();
+ exit;
+ }
+ }
+
+ function fix_protocol($url, $http = 1)
+ {
+ $parsed = SimplePie_Misc::parse_url($url);
+ if (!empty($parsed['scheme']) && strtolower($parsed['scheme']) != 'http' && strtolower($parsed['scheme']) != 'https')
+ {
+ return SimplePie_Misc::fix_protocol("$parsed[authority]$parsed[path]$parsed[query]$parsed[fragment]", $http);
+ }
+ if (!file_exists($url) && empty($parsed['scheme']))
+ {
+ return SimplePie_Misc::fix_protocol("http://$url", $http);
+ }
+
+ if ($http == 2 && !empty($parsed['scheme']))
+ {
+ return "feed:$url";
+ }
+ else if ($http == 3 && strtolower($parsed['scheme']) == 'http')
+ {
+ return substr_replace($url, 'podcast', 0, 4);
+ }
+ else
+ {
+ return $url;
+ }
+ }
+
+ function parse_url($url, $parse_match = true)
+ {
+ preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/i', $url, $match);
+ if (empty($match[0]))
+ {
+ return false;
+ }
+ else
+ {
+ for ($i = 6; $i < 10; $i++)
+ {
+ if (!isset($match[$i]))
+ {
+ $match[$i] = '';
+ }
+ }
+ if ($parse_match)
+ {
+ $match = array('scheme' => $match[2], 'authority' => $match[4], 'path' => $match[5], 'query' => $match[6], 'fragment' => $match[8]);
+ }
+ return $match;
+ }
+ }
+
+ function change_encoding($data, $input, $output)
+ {
+ $input = SimplePie_Misc::encoding($input);
+ $output = SimplePie_Misc::encoding($output);
+
+ if ($input != $output)
+ {
+ if (function_exists('iconv') && $input['use_iconv'] && $output['use_iconv'] && iconv($input['encoding'], "$output[encoding]//TRANSLIT", $data))
+ {
+ return iconv($input['encoding'], "$output[encoding]//TRANSLIT", $data);
+ }
+ else if (function_exists('iconv') && $input['use_iconv'] && $output['use_iconv'] && iconv($input['encoding'], $output['encoding'], $data))
+ {
+ return iconv($input['encoding'], $output['encoding'], $data);
+ }
+ else if (function_exists('mb_convert_encoding') && $input['use_mbstring'] && $output['use_mbstring'])
+ {
+ return mb_convert_encoding($data, $output['encoding'], $input['encoding']);
+ }
+ else if ($input['encoding'] == 'ISO-8859-1' && $output['encoding'] == 'UTF-8')
+ {
+ return utf8_encode($data);
+ }
+ else if ($input['encoding'] == 'UTF-8' && $output['encoding'] == 'ISO-8859-1')
+ {
+ return utf8_decode($data);
+ }
+ }
+ return $data;
+ }
+
+ function encoding($encoding)
+ {
+ $return['use_mbstring'] = false;
+ $return['use_iconv'] = false;
+ switch (strtolower($encoding))
+ {
+
+ // 7bit
+ case '7bit':
+ case '7-bit':
+ $return['encoding'] = '7bit';
+ $return['use_mbstring'] = true;
+ break;
+
+ // 8bit
+ case '8bit':
+ case '8-bit':
+ $return['encoding'] = '8bit';
+ $return['use_mbstring'] = true;
+ break;
+
+ // ARMSCII-8
+ case 'armscii-8':
+ case 'armscii':
+ $return['encoding'] = 'ARMSCII-8';
+ $return['use_iconv'] = true;
+ break;
+
+ // ASCII
+ case 'us-ascii':
+ case 'ascii':
+ $return['encoding'] = 'US-ASCII';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // BASE64
+ case 'base64':
+ case 'base-64':
+ $return['encoding'] = 'BASE64';
+ $return['use_mbstring'] = true;
+ break;
+
+ // Big5 - Traditional Chinese, mainly used in Taiwan
+ case 'big5':
+ case '950':
+ $return['encoding'] = 'BIG5';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // Big5 with Hong Kong extensions, Traditional Chinese
+ case 'big5-hkscs':
+ $return['encoding'] = 'BIG5-HKSCS';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // byte2be
+ case 'byte2be':
+ $return['encoding'] = 'byte2be';
+ $return['use_mbstring'] = true;
+ break;
+
+ // byte2le
+ case 'byte2le':
+ $return['encoding'] = 'byte2le';
+ $return['use_mbstring'] = true;
+ break;
+
+ // byte4be
+ case 'byte4be':
+ $return['encoding'] = 'byte4be';
+ $return['use_mbstring'] = true;
+ break;
+
+ // byte4le
+ case 'byte4le':
+ $return['encoding'] = 'byte4le';
+ $return['use_mbstring'] = true;
+ break;
+
+ // EUC-CN
+ case 'euc-cn':
+ case 'euccn':
+ $return['encoding'] = 'EUC-CN';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // EUC-JISX0213
+ case 'euc-jisx0213':
+ case 'eucjisx0213':
+ $return['encoding'] = 'EUC-JISX0213';
+ $return['use_iconv'] = true;
+ break;
+
+ // EUC-JP
+ case 'euc-jp':
+ case 'eucjp':
+ $return['encoding'] = 'EUC-JP';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // EUCJP-win
+ case 'euc-jp-win':
+ case 'eucjp-win':
+ case 'eucjpwin':
+ $return['encoding'] = 'EUCJP-win';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // EUC-KR
+ case 'euc-kr':
+ case 'euckr':
+ $return['encoding'] = 'EUC-KR';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // EUC-TW
+ case 'euc-tw':
+ case 'euctw':
+ $return['encoding'] = 'EUC-TW';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // GB18030 - Simplified Chinese, national standard character set
+ case 'gb18030-2000':
+ case 'gb18030':
+ $return['encoding'] = 'GB18030';
+ $return['use_iconv'] = true;
+ break;
+
+ // GB2312 - Simplified Chinese, national standard character set
+ case 'gb2312':
+ case '936':
+ $return['encoding'] = 'GB2312';
+ $return['use_mbstring'] = true;
+ break;
+
+ // GBK
+ case 'gbk':
+ $return['encoding'] = 'GBK';
+ $return['use_iconv'] = true;
+ break;
+
+ // Georgian-Academy
+ case 'georgian-academy':
+ $return['encoding'] = 'Georgian-Academy';
+ $return['use_iconv'] = true;
+ break;
+
+ // Georgian-PS
+ case 'georgian-ps':
+ $return['encoding'] = 'Georgian-PS';
+ $return['use_iconv'] = true;
+ break;
+
+ // HTML-ENTITIES
+ case 'html-entities':
+ case 'htmlentities':
+ $return['encoding'] = 'HTML-ENTITIES';
+ $return['use_mbstring'] = true;
+ break;
+
+ // HZ
+ case 'hz':
+ $return['encoding'] = 'HZ';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-2022-CN
+ case 'iso-2022-cn':
+ case 'iso2022-cn':
+ case 'iso2022cn':
+ $return['encoding'] = 'ISO-2022-CN';
+ $return['use_iconv'] = true;
+ break;
+
+ // ISO-2022-CN-EXT
+ case 'iso-2022-cn-ext':
+ case 'iso2022-cn-ext':
+ case 'iso2022cn-ext':
+ case 'iso2022cnext':
+ $return['encoding'] = 'ISO-2022-CN';
+ $return['use_iconv'] = true;
+ break;
+
+ // ISO-2022-JP
+ case 'iso-2022-jp':
+ case 'iso2022-jp':
+ case 'iso2022jp':
+ $return['encoding'] = 'ISO-2022-JP';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-2022-JP-1
+ case 'iso-2022-jp-1':
+ case 'iso2022-jp-1':
+ case 'iso2022jp-1':
+ case 'iso2022jp1':
+ $return['encoding'] = 'ISO-2022-JP-1';
+ $return['use_iconv'] = true;
+ break;
+
+ // ISO-2022-JP-2
+ case 'iso-2022-jp-2':
+ case 'iso2022-jp-2':
+ case 'iso2022jp-2':
+ case 'iso2022jp2':
+ $return['encoding'] = 'ISO-2022-JP-2';
+ $return['use_iconv'] = true;
+ break;
+
+ // ISO-2022-JP-3
+ case 'iso-2022-jp-3':
+ case 'iso2022-jp-3':
+ case 'iso2022jp-3':
+ case 'iso2022jp3':
+ $return['encoding'] = 'ISO-2022-JP-3';
+ $return['use_iconv'] = true;
+ break;
+
+ // ISO-2022-KR
+ case 'iso-2022-kr':
+ case 'iso2022-kr':
+ case 'iso2022kr':
+ $return['encoding'] = 'ISO-2022-KR';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-1
+ case 'iso-8859-1':
+ case 'iso8859-1':
+ $return['encoding'] = 'ISO-8859-1';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-2
+ case 'iso-8859-2':
+ case 'iso8859-2':
+ $return['encoding'] = 'ISO-8859-2';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-3
+ case 'iso-8859-3':
+ case 'iso8859-3':
+ $return['encoding'] = 'ISO-8859-3';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-4
+ case 'iso-8859-4':
+ case 'iso8859-4':
+ $return['encoding'] = 'ISO-8859-4';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-5
+ case 'iso-8859-5':
+ case 'iso8859-5':
+ $return['encoding'] = 'ISO-8859-5';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-6
+ case 'iso-8859-6':
+ case 'iso8859-6':
+ $return['encoding'] = 'ISO-8859-6';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-7
+ case 'iso-8859-7':
+ case 'iso8859-7':
+ $return['encoding'] = 'ISO-8859-7';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-8
+ case 'iso-8859-8':
+ case 'iso8859-8':
+ $return['encoding'] = 'ISO-8859-8';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-9
+ case 'iso-8859-9':
+ case 'iso8859-9':
+ $return['encoding'] = 'ISO-8859-9';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-10
+ case 'iso-8859-10':
+ case 'iso8859-10':
+ $return['encoding'] = 'ISO-8859-10';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // mbstring/iconv functions don't appear to support 11 & 12
+
+ // ISO-8859-13
+ case 'iso-8859-13':
+ case 'iso8859-13':
+ $return['encoding'] = 'ISO-8859-13';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-14
+ case 'iso-8859-14':
+ case 'iso8859-14':
+ $return['encoding'] = 'ISO-8859-14';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-15
+ case 'iso-8859-15':
+ case 'iso8859-15':
+ $return['encoding'] = 'ISO-8859-15';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // ISO-8859-16
+ case 'iso-8859-16':
+ case 'iso8859-16':
+ $return['encoding'] = 'ISO-8859-16';
+ $return['use_iconv'] = true;
+ break;
+
+ // JIS
+ case 'jis':
+ $return['encoding'] = 'JIS';
+ $return['use_mbstring'] = true;
+ break;
+
+ // JOHAB - Korean
+ case 'johab':
+ $return['encoding'] = 'JOHAB';
+ $return['use_iconv'] = true;
+ break;
+
+ // Russian
+ case 'koi8-r':
+ case 'koi8r':
+ $return['encoding'] = 'KOI8-R';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // Turkish
+ case 'koi8-t':
+ case 'koi8t':
+ $return['encoding'] = 'KOI8-T';
+ $return['use_iconv'] = true;
+ break;
+
+ // Ukrainian
+ case 'koi8-u':
+ case 'koi8u':
+ $return['encoding'] = 'KOI8-U';
+ $return['use_iconv'] = true;
+ break;
+
+ // Russian+Ukrainian
+ case 'koi8-ru':
+ case 'koi8ru':
+ $return['encoding'] = 'KOI8-RU';
+ $return['use_iconv'] = true;
+ break;
+
+ // Macintosh (Mac OS Classic)
+ case 'macintosh':
+ $return['encoding'] = 'Macintosh';
+ $return['use_iconv'] = true;
+ break;
+
+ // MacArabic (Mac OS Classic)
+ case 'macarabic':
+ $return['encoding'] = 'MacArabic';
+ $return['use_iconv'] = true;
+ break;
+
+ // MacCentralEurope (Mac OS Classic)
+ case 'maccentraleurope':
+ $return['encoding'] = 'MacCentralEurope';
+ $return['use_iconv'] = true;
+ break;
+
+ // MacCroatian (Mac OS Classic)
+ case 'maccroatian':
+ $return['encoding'] = 'MacCroatian';
+ $return['use_iconv'] = true;
+ break;
+
+ // MacCyrillic (Mac OS Classic)
+ case 'maccyrillic':
+ $return['encoding'] = 'MacCyrillic';
+ $return['use_iconv'] = true;
+ break;
+
+ // MacGreek (Mac OS Classic)
+ case 'macgreek':
+ $return['encoding'] = 'MacGreek';
+ $return['use_iconv'] = true;
+ break;
+
+ // MacHebrew (Mac OS Classic)
+ case 'machebrew':
+ $return['encoding'] = 'MacHebrew';
+ $return['use_iconv'] = true;
+ break;
+
+ // MacIceland (Mac OS Classic)
+ case 'maciceland':
+ $return['encoding'] = 'MacIceland';
+ $return['use_iconv'] = true;
+ break;
+
+ // MacRoman (Mac OS Classic)
+ case 'macroman':
+ $return['encoding'] = 'MacRoman';
+ $return['use_iconv'] = true;
+ break;
+
+ // MacRomania (Mac OS Classic)
+ case 'macromania':
+ $return['encoding'] = 'MacRomania';
+ $return['use_iconv'] = true;
+ break;
+
+ // MacThai (Mac OS Classic)
+ case 'macthai':
+ $return['encoding'] = 'MacThai';
+ $return['use_iconv'] = true;
+ break;
+
+ // MacTurkish (Mac OS Classic)
+ case 'macturkish':
+ $return['encoding'] = 'MacTurkish';
+ $return['use_iconv'] = true;
+ break;
+
+ // MacUkraine (Mac OS Classic)
+ case 'macukraine':
+ $return['encoding'] = 'MacUkraine';
+ $return['use_iconv'] = true;
+ break;
+
+ // MuleLao-1
+ case 'mulelao-1':
+ case 'mulelao1':
+ $return['encoding'] = 'MuleLao-1';
+ $return['use_iconv'] = true;
+ break;
+
+ // Shift_JIS
+ case 'shift_jis':
+ case 'sjis':
+ case '932':
+ $return['encoding'] = 'Shift_JIS';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // Shift_JISX0213
+ case 'shift-jisx0213':
+ case 'shiftjisx0213':
+ $return['encoding'] = 'Shift_JISX0213';
+ $return['use_iconv'] = true;
+ break;
+
+ // SJIS-win
+ case 'sjis-win':
+ case 'sjiswin':
+ case 'shift_jis-win':
+ $return['encoding'] = 'SJIS-win';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // TCVN - Vietnamese
+ case 'tcvn':
+ $return['encoding'] = 'TCVN';
+ $return['use_iconv'] = true;
+ break;
+
+ // TDS565 - Turkish
+ case 'tds565':
+ $return['encoding'] = 'TDS565';
+ $return['use_iconv'] = true;
+ break;
+
+ // TIS-620 Thai
+ case 'tis-620':
+ case 'tis620':
+ $return['encoding'] = 'TIS-620';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UCS-2
+ case 'ucs-2':
+ case 'ucs2':
+ case 'utf-16':
+ case 'utf16':
+ $return['encoding'] = 'UCS-2';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UCS-2BE
+ case 'ucs-2be':
+ case 'ucs2be':
+ case 'utf-16be':
+ case 'utf16be':
+ $return['encoding'] = 'UCS-2BE';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UCS-2LE
+ case 'ucs-2le':
+ case 'ucs2le':
+ case 'utf-16le':
+ case 'utf16le':
+ $return['encoding'] = 'UCS-2LE';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UCS-2-INTERNAL
+ case 'ucs-2-internal':
+ case 'ucs2internal':
+ $return['encoding'] = 'UCS-2-INTERNAL';
+ $return['use_iconv'] = true;
+ break;
+
+ // UCS-4
+ case 'ucs-4':
+ case 'ucs4':
+ case 'utf-32':
+ case 'utf32':
+ $return['encoding'] = 'UCS-4';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UCS-4BE
+ case 'ucs-4be':
+ case 'ucs4be':
+ case 'utf-32be':
+ case 'utf32be':
+ $return['encoding'] = 'UCS-4BE';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UCS-4LE
+ case 'ucs-4le':
+ case 'ucs4le':
+ case 'utf-32le':
+ case 'utf32le':
+ $return['encoding'] = 'UCS-4LE';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UCS-4-INTERNAL
+ case 'ucs-4-internal':
+ case 'ucs4internal':
+ $return['encoding'] = 'UCS-4-INTERNAL';
+ $return['use_iconv'] = true;
+ break;
+
+ // UCS-16
+ case 'ucs-16':
+ case 'ucs16':
+ $return['encoding'] = 'UCS-16';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UCS-16BE
+ case 'ucs-16be':
+ case 'ucs16be':
+ $return['encoding'] = 'UCS-16BE';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UCS-16LE
+ case 'ucs-16le':
+ case 'ucs16le':
+ $return['encoding'] = 'UCS-16LE';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UCS-32
+ case 'ucs-32':
+ case 'ucs32':
+ $return['encoding'] = 'UCS-32';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UCS-32BE
+ case 'ucs-32be':
+ case 'ucs32be':
+ $return['encoding'] = 'UCS-32BE';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UCS-32LE
+ case 'ucs-32le':
+ case 'ucs32le':
+ $return['encoding'] = 'UCS-32LE';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UTF-7
+ case 'utf-7':
+ case 'utf7':
+ $return['encoding'] = 'UTF-7';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // UTF7-IMAP
+ case 'utf-7-imap':
+ case 'utf7-imap':
+ case 'utf7imap':
+ $return['encoding'] = 'UTF7-IMAP';
+ $return['use_mbstring'] = true;
+ break;
+
+ // VISCII - Vietnamese ASCII
+ case 'viscii':
+ $return['encoding'] = 'VISCII';
+ $return['use_iconv'] = true;
+ break;
+
+ // Windows-specific Central & Eastern Europe
+ case 'cp1250':
+ case 'windows-1250':
+ case 'win-1250':
+ case '1250':
+ $return['encoding'] = 'Windows-1250';
+ $return['use_iconv'] = true;
+ break;
+
+ // Windows-specific Cyrillic
+ case 'cp1251':
+ case 'windows-1251':
+ case 'win-1251':
+ case '1251':
+ $return['encoding'] = 'Windows-1251';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // Windows-specific Western Europe
+ case 'cp1252':
+ case 'windows-1252':
+ case '1252':
+ $return['encoding'] = 'Windows-1252';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+
+ // Windows-specific Greek
+ case 'cp1253':
+ case 'windows-1253':
+ case '1253':
+ $return['encoding'] = 'Windows-1253';
+ $return['use_iconv'] = true;
+ break;
+
+ // Windows-specific Turkish
+ case 'cp1254':
+ case 'windows-1254':
+ case '1254':
+ $return['encoding'] = 'Windows-1254';
+ $return['use_iconv'] = true;
+ break;
+
+ // Windows-specific Hebrew
+ case 'cp1255':
+ case 'windows-1255':
+ case '1255':
+ $return['encoding'] = 'Windows-1255';
+ $return['use_iconv'] = true;
+ break;
+
+ // Windows-specific Arabic
+ case 'cp1256':
+ case 'windows-1256':
+ case '1256':
+ $return['encoding'] = 'Windows-1256';
+ $return['use_iconv'] = true;
+ break;
+
+ // Windows-specific Baltic
+ case 'cp1257':
+ case 'windows-1257':
+ case '1257':
+ $return['encoding'] = 'Windows-1257';
+ $return['use_iconv'] = true;
+ break;
+
+ // Windows-specific Vietnamese
+ case 'cp1258':
+ case 'windows-1258':
+ case '1258':
+ $return['encoding'] = 'Windows-1258';
+ $return['use_iconv'] = true;
+ break;
+
+ // Default to UTF-8
+ default:
+ $return['encoding'] = 'UTF-8';
+ $return['use_iconv'] = true;
+ $return['use_mbstring'] = true;
+ break;
+ }
+
+ // Then, return it.
+ return $return;
+ }
+
+ function get_curl_version()
+ {
+ $curl = 0;
+ if (is_array(curl_version()))
+ {
+ $curl = curl_version();
+ $curl = $curl['version'];
+ }
+ else
+ {
+ $curl = curl_version();
+ $curl = explode(' ', $curl);
+ $curl = explode('/', $curl[0]);
+ $curl = $curl[1];
+ }
+ return $curl;
+ }
+
+ function is_a_class($class1, $class2)
+ {
+ if (class_exists($class1))
+ {
+ $classes = array(strtolower($class1));
+ while ($class1 = get_parent_class($class1))
+ {
+ $classes[] = strtolower($class1);
+ }
+ return in_array(strtolower($class2), $classes);
+ }
+ else
+ {
+ return false;
+ }
+ }
+}
+
+class SimplePie_Locator
+{
+ var $useragent;
+ var $timeout;
+ var $file;
+ var $local;
+ var $elsewhere;
+
+ function SimplePie_Locator(&$file, $timeout = 10, $useragent = null)
+ {
+ if (!is_a($file, 'SimplePie_File'))
+ {
+ $this->file = new SimplePie_File($file, $timeout, $useragent);
+ }
+ else
+ {
+ $this->file =& $file;
+ }
+ $this->useragent = $useragent;
+ $this->timeout = $timeout;
+ }
+
+
+ function find()
+ {
+ if ($this->is_feed($this->file))
+ {
+ return $this->file->url;
+ }
+
+ $autodiscovery = $this->autodiscovery($this->file);
+ if ($autodiscovery)
+ {
+ return $autodiscovery;
+ }
+
+ if ($this->get_links($this->file))
+ {
+ if (!empty($this->local))
+ {
+ $extension_local = $this->extension($this->local);
+ if ($extension_local)
+ {
+ return $extension_local;
+ }
+
+ $body_local = $this->body($this->local);
+ if ($body_local)
+ {
+ return $body_local;
+ }
+ }
+
+ if (!empty($this->elsewhere))
+ {
+ $extension_elsewhere = $this->extension($this->elsewhere);
+ if ($extension_elsewhere)
+ {
+ return $extension_elsewhere;
+ }
+
+ $body_elsewhere = $this->body($this->elsewhere);
+ if ($body_elsewhere)
+ {
+ return $body_elsewhere;
+ }
+ }
+ }
+ return false;
+ }
+
+ function is_feed(&$file)
+ {
+ if (!is_a($file, 'SimplePie_File'))
+ {
+ if (isset($this))
+ {
+ $file2 = new SimplePie_File($file, $this->timeout, 5, null, $this->useragent);
+ }
+ else
+ {
+ $file2 = new SimplePie_File($file);
+ }
+ $file2->body();
+ $file2->close();
+ }
+ else
+ {
+ $file2 =& $file;
+ }
+ $body = preg_replace('/<\!-(.*)-\>/msiU', '', $file2->body());
+ if (preg_match('/<(\w+\:)?rss/msiU', $body) || preg_match('/<(\w+\:)?RDF/mi', $body) || preg_match('/<(\w+\:)?feed/mi', $body))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ function autodiscovery(&$file)
+ {
+ $links = SimplePie_Misc::get_element('link', $file->body());
+ $done = array();
+ foreach ($links as $link)
+ {
+ if (!empty($link['attribs']['TYPE']['data']) && !empty($link['attribs']['HREF']['data']))
+ {
+ $type = strtolower(trim($link['attribs']['TYPE']['data']));
+ $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['HREF']['data']), $this->file->url);
+ if (!in_array($href, $done) && in_array($type, array('application/rss+xml', 'application/atom+xml', 'application/rdf+xml', 'application/xml+rss', 'application/xml+atom', 'application/xml+rdf', 'application/xml', 'application/x.atom+xml', 'text/xml')))
+ {
+ $feed = $this->is_feed($href);
+ if ($feed)
+ {
+ return $href;
+ }
+ }
+ $done[] = $href;
+ }
+ }
+ return false;
+ }
+
+ function get_links(&$file)
+ {
+ $links = SimplePie_Misc::get_element('a', $file->body());
+ foreach ($links as $link)
+ {
+ if (!empty($link['attribs']['HREF']['data']))
+ {
+ $href = trim($link['attribs']['HREF']['data']);
+ $parsed = SimplePie_Misc::parse_url($href);
+ if (empty($parsed['scheme']) || $parsed['scheme'] != 'javascript')
+ {
+ $current = SimplePie_Misc::parse_url($this->file->url);
+ if (empty($parsed['authority']) || $parsed['authority'] == $current['authority'])
+ {
+ $this->local[] = SimplePie_Misc::absolutize_url($href, $this->file->url);
+ }
+ else
+ {
+ $this->elsewhere[] = SimplePie_Misc::absolutize_url($href, $this->file->url);
+ }
+ }
+ }
+ }
+ if (!empty($this->local))
+ {
+ $this->local = array_unique($this->local);
+ }
+ if (!empty($this->elsewhere))
+ {
+ $this->elsewhere = array_unique($this->elsewhere);
+ }
+ if (!empty($this->local) || !empty($this->elsewhere))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ function extension(&$array)
+ {
+ foreach ($array as $key => $value)
+ {
+ $value = SimplePie_Misc::absolutize_url($value, $this->file->url);
+ if (in_array(strrchr($value, '.'), array('.rss', '.rdf', '.atom', '.xml')))
+ {
+ if ($this->is_feed($value))
+ {
+ return $value;
+ }
+ else
+ {
+ unset($array[$key]);
+ }
+ }
+ }
+ return false;
+ }
+
+ function body(&$array)
+ {
+ foreach ($array as $key => $value)
+ {
+ $value = SimplePie_Misc::absolutize_url($value, $this->file->url);
+ if (preg_match('/(rss|rdf|atom|xml)/i', $value))
+ {
+ if ($this->is_feed($value))
+ {
+ return $value;
+ }
+ else
+ {
+ unset($array[$key]);
+ }
+ }
+ }
+ return false;
+ }
+}
+
+class SimplePie_Parser
+{
+ var $encoding;
+ var $data;
+ var $namespaces = array('xml' => 'HTTP://WWW.W3.ORG/XML/1998/NAMESPACE', 'atom' => 'ATOM', 'rss2' => 'RSS', 'rdf' => 'RDF', 'rss1' => 'RSS', 'dc' => 'DC', 'xhtml' => 'XHTML', 'content' => 'CONTENT');
+ var $xml;
+ var $error_code;
+ var $error_string;
+ var $current_line;
+ var $current_column;
+ var $current_byte;
+ var $tag_name;
+ var $inside_item;
+ var $item_number = 0;
+ var $inside_channel;
+ var $author_number= 0;
+ var $category_number = 0;
+ var $enclosure_number = 0;
+ var $link_number = 0;
+ var $item_link_number = 0;
+ var $inside_image;
+ var $attribs;
+ var $is_first;
+ var $inside_author;
+
+
+ function SimplePie_Parser($data, $encoding, $return_xml = false)
+ {
+ $this->encoding = $encoding;
+
+ // Strip BOM:
+ // UTF-32 Big Endian BOM
+ if (strpos($data, sprintf('%c%c%c%c', 0x00, 0x00, 0xFE, 0xFF)) === 0)
+ {
+ $data = substr($data, 4);
+ }
+ // UTF-32 Little Endian BOM
+ else if (strpos($data, sprintf('%c%c%c%c', 0xFF, 0xFE, 0x00, 0x00)) === 0)
+ {
+ $data = substr($data, 4);
+ }
+ // UTF-16 Big Endian BOM
+ else if (strpos($data, sprintf('%c%c', 0xFE, 0xFF)) === 0)
+ {
+ $data = substr($data, 2);
+ }
+ // UTF-16 Little Endian BOM
+ else if (strpos($data, sprintf('%c%c', 0xFF, 0xFE)) === 0)
+ {
+ $data = substr($data, 2);
+ }
+ // UTF-8 BOM
+ else if (strpos($data, sprintf('%c%c%c', 0xEF, 0xBB, 0xBF)) === 0)
+ {
+ $data = substr($data, 3);
+ }
+
+ // Make sure the XML prolog is sane and has the correct encoding
+ if (preg_match('/^<\?xml(.*)?>/msiU', $data, $prolog))
+ {
+ $data = substr_replace($data, '', 0, strlen($prolog[0]));
+ }
+ $data = "<?xml version='1.0' encoding='$encoding'?>\n" . $data;
+
+ // Add an internal attribute to CDATA sections
+ $data = preg_replace_callback('/<(\S+)((\s*((\w+:)?\w+)\s*=\s*("([^"]*)"|\'([^\']*)\'))*)\s*(\/>|>\s*<\!\[CDATA\[(.*)<\/\\1>)/msiU', array(&$this, 'spencoded'), $data);
+
+ // Put some data into CDATA blocks
+ // If we're RSS
+ if ((stristr($data, '<rss') || preg_match('/<([a-z0-9]+\:)?RDF/mi', $data)) && (preg_match('/<([a-z0-9]+\:)?channel/mi', $data) || preg_match('/<([a-z0-9]+\:)?item/mi', $data)))
+ {
+ $sp_elements = array(
+ 'author',
+ 'description',
+ 'link',
+ 'title',
+ );
+ }
+ // Or if we're Atom
+ else
+ {
+ $sp_elements = array(
+ 'content',
+ 'copyright',
+ 'name',
+ 'subtitle',
+ 'summary',
+ 'tagline',
+ 'title',
+ );
+ }
+ foreach ($sp_elements as $full)
+ {
+ $data = preg_replace_callback("/<($full)((\s*((\w+:)?\w+)\s*=\s*(\"([^\"]*)\"|'([^']*)'))*)\s*(\/>|>(.*)<\/$full>)/msiU", array(&$this, 'add_cdata'), $data);
+ }
+ foreach ($sp_elements as $full)
+ {
+ // Deal with CDATA within CDATA (this can be caused by us inserting CDATA above)
+ $data = preg_replace_callback("/<($full)((\s*((\w+:)?\w+)\s*=\s*(\"([^\"]*)\"|'([^']*)'))*)\s*(\/>|><!\[CDATA\[(.*)\]\]><\/$full>)/msiU", array(&$this, 'cdata_in_cdata'), $data);
+ }
+
+ // Return the XML, if so desired
+ if ($return_xml)
+ {
+ $this->data =& $data;
+ return;
+ }
+
+ // Create the parser
+ $this->xml = xml_parser_create_ns($encoding);
+ xml_parser_set_option($this->xml, XML_OPTION_SKIP_WHITE, 1);
+ xml_set_object($this->xml, $this);
+ xml_set_character_data_handler($this->xml, 'data_handler');
+ xml_set_element_handler($this->xml, 'start_handler', 'end_handler');
+ xml_set_start_namespace_decl_handler($this->xml, 'start_name_space');
+ xml_set_end_namespace_decl_handler($this->xml, 'end_name_space');
+
+ // Parse!
+ if (!xml_parse($this->xml, $data))
+ {
+ $this->data = null;
+ $this->error_code = xml_get_error_code($this->xml);
+ $this->error_string = xml_error_string($this->error_code);
+ }
+ $this->current_line = xml_get_current_line_number($this->xml);
+ $this->current_column = xml_get_current_column_number($this->xml);
+ $this->current_byte = xml_get_current_byte_index($this->xml);
+ xml_parser_free($this->xml);
+ return;
+ }
+
+ function add_cdata($match)
+ {
+ if (isset($match[10]))
+ {
+ $match[10] = preg_replace('/^\s*<\!\[CDATA\[(.*)]]>\s*$/msiU', '\\1', $match[10]);
+ return "<$match[1]$match[2]><![CDATA[$match[10]]]></$match[1]>";
+ }
+ return $match[0];
+ }
+
+ function spencoded($match)
+ {
+ if (isset($match[10]))
+ {
+ return "<$match[1]$match[2] spencoded=\"false\"><![CDATA[$match[10]</$match[1]>";
+ }
+ return $match[0];
+ }
+
+ function cdata_in_cdata($match)
+ {
+ if (isset($match[10]))
+ {
+ $match[10] = preg_replace_callback('/<!\[CDATA\[(.*)\]\]>/msiU', array(&$this, 'real_cdata_in_cdata'), $match[10]);
+ return "<$match[1]$match[2]><![CDATA[$match[10]]]></$match[1]>";
+ }
+ return $match[0];
+ }
+
+ function real_cdata_in_cdata($match)
+ {
+ return htmlentities($match[1], ENT_NOQUOTES, $this->encoding);
+ }
+
+ function do_add_content(&$array, $data)
+ {
+ if ($this->is_first)
+ {
+ $array['data'] = $data;
+ $array['attribs'] = $this->attribs;
+ }
+ else
+ {
+ $array['data'] .= $data;
+ }
+ }
+
+ function start_handler($parser, $name, $attribs)
+ {
+ $this->tag_name = $name;
+ $this->attribs = $attribs;
+ $this->is_first = true;
+ switch ($this->tag_name)
+ {
+ case 'ITEM':
+ case $this->namespaces['rss2'] . ':ITEM':
+ case $this->namespaces['rss1'] . ':ITEM':
+ case 'ENTRY':
+ case $this->namespaces['atom'] . ':ENTRY':
+ $this->inside_item = true;
+ $this->do_add_content($this->data['items'][$this->item_number], '');
+ break;
+
+ case 'CHANNEL':
+ case $this->namespaces['rss2'] . ':CHANNEL':
+ case $this->namespaces['rss1'] . ':CHANNEL':
+ $this->inside_channel = true;
+ break;
+
+ case 'RSS':
+ case $this->namespaces['rss2'] . ':RSS':
+ $this->data['feedinfo']['type'] = 'RSS';
+ $this->do_add_content($this->data['feeddata'], '');
+ if (!empty($attribs['VERSION']))
+ {
+ $this->data['feedinfo']['version'] = trim($attribs['VERSION']);
+ }
+ break;
+
+ case $this->namespaces['rdf'] . ':RDF':
+ $this->data['feedinfo']['type'] = 'RSS';
+ $this->do_add_content($this->data['feeddata'], '');
+ $this->data['feedinfo']['version'] = 1;
+ break;
+
+ case 'FEED':
+ case $this->namespaces['atom'] . ':FEED':
+ $this->data['feedinfo']['type'] = 'Atom';
+ $this->do_add_content($this->data['feeddata'], '');
+ if (!empty($attribs['VERSION']))
+ {
+ $this->data['feedinfo']['version'] = trim($attribs['VERSION']);
+ }
+ break;
+
+ case 'IMAGE':
+ case $this->namespaces['rss2'] . ':IMAGE':
+ case $this->namespaces['rss1'] . ':IMAGE':
+ if ($this->inside_channel)
+ {
+ $this->inside_image = true;
+ }
+ break;
+ }
+
+ if (!empty($this->data['feedinfo']['type']) && $this->data['feedinfo']['type'] == 'Atom' && ($this->tag_name == 'AUTHOR' || $this->tag_name == $this->namespaces['atom'] . ':AUTHOR'))
+ {
+ $this->inside_author = true;
+ }
+ $this->data_handler($this->xml, '');
+ }
+
+ function data_handler($parser, $data)
+ {
+ if ($this->inside_item)
+ {
+ switch ($this->tag_name)
+ {
+ case 'TITLE':
+ case $this->namespaces['rss1'] . ':TITLE':
+ case $this->namespaces['rss2'] . ':TITLE':
+ case $this->namespaces['atom'] . ':TITLE':
+ $this->do_add_content($this->data['items'][$this->item_number]['title'], $data);
+ break;
+
+ case $this->namespaces['dc'] . ':TITLE':
+ $this->do_add_content($this->data['items'][$this->item_number]['dc:title'], $data);
+ break;
+
+ case 'CONTENT':
+ case $this->namespaces['atom'] . ':CONTENT':
+ $this->do_add_content($this->data['items'][$this->item_number]['content'], $data);
+ break;
+
+ case $this->namespaces['content'] . ':ENCODED':
+ $this->do_add_content($this->data['items'][$this->item_number]['encoded'], $data);
+ break;
+
+ case 'SUMMARY':
+ case $this->namespaces['atom'] . ':SUMMARY':
+ $this->do_add_content($this->data['items'][$this->item_number]['summary'], $data);
+ break;
+
+ case 'LONGDESC':
+ $this->do_add_content($this->data['items'][$this->item_number]['longdesc'], $data);
+ break;
+
+ case 'DESCRIPTION':
+ case $this->namespaces['rss1'] . ':DESCRIPTION':
+ case $this->namespaces['rss2'] . ':DESCRIPTION':
+ $this->do_add_content($this->data['items'][$this->item_number]['description'], $data);
+ break;
+
+ case $this->namespaces['dc'] . ':DESCRIPTION':
+ $this->do_add_content($this->data['items'][$this->item_number]['dc:description'], $data);
+ break;
+
+ case 'LINK':
+ case $this->namespaces['rss1'] . ':LINK':
+ case $this->namespaces['rss2'] . ':LINK':
+ case $this->namespaces['atom'] . ':LINK':
+ $this->do_add_content($this->data['items'][$this->item_number]['link'][$this->item_link_number], $data);
+ break;
+
+ case 'ENCLOSURE':
+ case $this->namespaces['rss1'] . ':ENCLOSURE':
+ case $this->namespaces['rss2'] . ':ENCLOSURE':
+ case $this->namespaces['atom'] . ':ENCLOSURE':
+ $this->do_add_content($this->data['items'][$this->item_number]['enclosure'][$this->enclosure_number], $data);
+ break;
+
+ case 'GUID':
+ case $this->namespaces['rss1'] . ':GUID':
+ case $this->namespaces['rss2'] . ':GUID':
+ $this->do_add_content($this->data['items'][$this->item_number]['guid'], $data);
+ break;
+
+ case 'ID':
+ case $this->namespaces['atom'] . ':ID':
+ $this->do_add_content($this->data['items'][$this->item_number]['id'], $data);
+ break;
+
+ case 'PUBDATE':
+ case $this->namespaces['rss1'] . ':PUBDATE':
+ case $this->namespaces['rss2'] . ':PUBDATE':
+ $this->do_add_content($this->data['items'][$this->item_number]['pubdate'], $data);
+ break;
+
+ case $this->namespaces['dc'] . ':DATE':
+ $this->do_add_content($this->data['items'][$this->item_number]['dc:date'], $data);
+ break;
+
+ case 'ISSUED':
+ case $this->namespaces['atom'] . ':ISSUED':
+ $this->do_add_content($this->data['items'][$this->item_number]['issued'], $data);
+ break;
+
+ case 'PUBLISHED':
+ case $this->namespaces['atom'] . ':PUBLISHED':
+ $this->do_add_content($this->data['items'][$this->item_number]['published'], $data);
+ break;
+
+ case 'MODIFIED':
+ case $this->namespaces['atom'] . ':MODIFIED':
+ $this->do_add_content($this->data['items'][$this->item_number]['modified'], $data);
+ break;
+
+ case 'UPDATED':
+ case $this->namespaces['atom'] . ':UPDATED':
+ $this->do_add_content($this->data['items'][$this->item_number]['updated'], $data);
+ break;
+
+ case 'CATEGORY':
+ case $this->namespaces['rss1'] . ':CATEGORY':
+ case $this->namespaces['rss2'] . ':CATEGORY':
+ case $this->namespaces['atom'] . ':CATEGORY':
+ $this->do_add_content($this->data['items'][$this->item_number]['category'][$this->category_number], $data);
+ break;
+
+ case $this->namespaces['dc'] . ':SUBJECT':
+ $this->do_add_content($this->data['items'][$this->item_number]['subject'][$this->category_number], $data);
+ break;
+
+ case $this->namespaces['dc'] . ':CREATOR':
+ $this->do_add_content($this->data['items'][$this->item_number]['creator'][$this->author_number], $data);
+ break;
+
+ case 'AUTHOR':
+ case $this->namespaces['rss1'] . ':AUTHOR':
+ case $this->namespaces['rss2'] . ':AUTHOR':
+ $this->do_add_content($this->data['items'][$this->item_number]['author'][$this->author_number]['rss'], $data);
+ break;
+ }
+
+ if ($this->inside_author)
+ {
+ switch ($this->tag_name)
+ {
+ case 'NAME':
+ case $this->namespaces['atom'] . ':NAME':
+ $this->do_add_content($this->data['items'][$this->item_number]['author'][$this->author_number]['name'], $data);
+ break;
+
+ case 'URL':
+ case $this->namespaces['atom'] . ':URL':
+ $this->do_add_content($this->data['items'][$this->item_number]['author'][$this->author_number]['url'], $data);
+ break;
+
+ case 'URI':
+ case $this->namespaces['atom'] . ':URI':
+ $this->do_add_content($this->data['items'][$this->item_number]['author'][$this->author_number]['uri'], $data);
+ break;
+
+ case 'HOMEPAGE':
+ case $this->namespaces['atom'] . ':HOMEPAGE':
+ $this->do_add_content($this->data['items'][$this->item_number]['author'][$this->author_number]['homepage'], $data);
+ break;
+
+ case 'EMAIL':
+ case $this->namespaces['atom'] . ':EMAIL':
+ $this->do_add_content($this->data['items'][$this->item_number]['author'][$this->author_number]['email'], $data);
+ break;
+ }
+ }
+ }
+
+ else if (($this->inside_channel && !$this->inside_image) || (isset($this->data['feedinfo']['type']) && $this->data['feedinfo']['type'] == 'Atom'))
+ {
+ switch ($this->tag_name)
+ {
+ case 'TITLE':
+ case $this->namespaces['rss1'] . ':TITLE':
+ case $this->namespaces['rss2'] . ':TITLE':
+ case $this->namespaces['atom'] . ':TITLE':
+ $this->do_add_content($this->data['info']['title'], $data);
+ break;
+
+ case 'LINK':
+ case $this->namespaces['rss1'] . ':LINK':
+ case $this->namespaces['rss2'] . ':LINK':
+ case $this->namespaces['atom'] . ':LINK':
+ $this->do_add_content($this->data['info']['link'][$this->link_number], $data);
+ break;
+
+ case 'DESCRIPTION':
+ case $this->namespaces['rss1'] . ':DESCRIPTION':
+ case $this->namespaces['rss2'] . ':DESCRIPTION':
+ $this->do_add_content($this->data['info']['description'], $data);
+ break;
+
+ case $this->namespaces['dc'] . ':DESCRIPTION':
+ $this->do_add_content($this->data['info']['dc:description'], $data);
+ break;
+
+ case 'TAGLINE':
+ case $this->namespaces['atom'] . ':TAGLINE':
+ $this->do_add_content($this->data['info']['tagline'], $data);
+ break;
+
+ case 'SUBTITLE':
+ case $this->namespaces['atom'] . ':SUBTITLE':
+ $this->do_add_content($this->data['info']['subtitle'], $data);
+ break;
+
+ case 'COPYRIGHT':
+ case $this->namespaces['rss1'] . ':COPYRIGHT':
+ case $this->namespaces['rss2'] . ':COPYRIGHT':
+ case $this->namespaces['atom'] . ':COPYRIGHT':
+ $this->do_add_content($this->data['info']['copyright'], $data);
+ break;
+
+ case 'LANGUAGE':
+ case $this->namespaces['rss1'] . ':LANGUAGE':
+ case $this->namespaces['rss2'] . ':LANGUAGE':
+ $this->do_add_content($this->data['info']['language'], $data);
+ break;
+
+ case 'LOGO':
+ case $this->namespaces['atom'] . ':LOGO':
+ $this->do_add_content($this->data['info']['logo'], $data);
+ break;
+
+ }
+ }
+
+ else if ($this->inside_channel && $this->inside_image)
+ {
+ switch ($this->tag_name)
+ {
+ case 'TITLE':
+ case $this->namespaces['rss1'] . ':TITLE':
+ case $this->namespaces['rss2'] . ':TITLE':
+ $this->do_add_content($this->data['info']['image']['title'], $data);
+ break;
+
+ case 'URL':
+ case $this->namespaces['rss1'] . ':URL':
+ case $this->namespaces['rss2'] . ':URL':
+ $this->do_add_content($this->data['info']['image']['url'], $data);
+ break;
+
+ case 'LINK':
+ case $this->namespaces['rss1'] . ':LINK':
+ case $this->namespaces['rss2'] . ':LINK':
+ $this->do_add_content($this->data['info']['image']['link'], $data);
+ break;
+
+ case 'WIDTH':
+ case $this->namespaces['rss1'] . ':WIDTH':
+ case $this->namespaces['rss2'] . ':WIDTH':
+ $this->do_add_content($this->data['info']['image']['width'], $data);
+ break;
+
+ case 'HEIGHT':
+ case $this->namespaces['rss1'] . ':HEIGHT':
+ case $this->namespaces['rss2'] . ':HEIGHT':
+ $this->do_add_content($this->data['info']['image']['height'], $data);
+ break;
+ }
+ }
+ $this->is_first = false;
+ }
+
+ function end_handler($parser, $name)
+ {
+ $this->tag_name = '';
+ switch ($name)
+ {
+ case 'ITEM':
+ case $this->namespaces['rss1'] . ':ITEM':
+ case $this->namespaces['rss2'] . ':ITEM':
+ case 'ENTRY':
+ case $this->namespaces['atom'] . ':ENTRY':
+ $this->inside_item = false;
+ $this->item_number++;
+ $this->author_number = 0;
+ $this->category_number = 0;
+ $this->enclosure_number = 0;
+ $this->item_link_number = 0;
+ break;
+
+ case 'CHANNEL':
+ case $this->namespaces['rss1'] . ':CHANNEL':
+ case $this->namespaces['rss2'] . ':CHANNEL':
+ $this->inside_channel = false;
+ break;
+
+ case 'IMAGE':
+ case $this->namespaces['rss1'] . ':IMAGE':
+ case $this->namespaces['rss2'] . ':IMAGE':
+ $this->inside_image = false;
+ break;
+
+ case 'AUTHOR':
+ case $this->namespaces['rss1'] . ':AUTHOR':
+ case $this->namespaces['rss2'] . ':AUTHOR':
+ case $this->namespaces['atom'] . ':AUTHOR':
+ $this->author_number++;
+ $this->inside_author = false;
+ break;
+
+ case 'CATEGORY':
+ case $this->namespaces['rss1'] . ':CATEGORY':
+ case $this->namespaces['rss2'] . ':CATEGORY':
+ case $this->namespaces['atom'] . ':CATEGORY':
+ case $this->namespaces['dc'] . ':SUBJECT':
+ $this->category_number++;
+ break;
+
+ case 'ENCLOSURE':
+ case $this->namespaces['rss1'] . ':ENCLOSURE':
+ case $this->namespaces['rss2'] . ':ENCLOSURE':
+ $this->enclosure_number++;
+ break;
+
+ case 'LINK':
+ case $this->namespaces['rss1'] . ':LINK':
+ case $this->namespaces['rss2'] . ':LINK':
+ case $this->namespaces['atom'] . ':LINK':
+ if ($this->inside_item)
+ {
+ $this->item_link_number++;
+ }
+ else
+ {
+ $this->link_number++;
+ }
+ break;
+ }
+ }
+
+ function start_name_space($parser, $prefix, $uri = null)
+ {
+ $prefix = strtoupper($prefix);
+ $uri = strtoupper($uri);
+ if ($prefix == 'ATOM' || $uri == 'HTTP://WWW.W3.ORG/2005/ATOM' || $uri == 'HTTP://PURL.ORG/ATOM/NS#')
+ {
+ $this->namespaces['atom'] = $uri;
+ }
+ else if ($prefix == 'RSS2' || $uri == 'HTTP://BACKEND.USERLAND.COM/RSS2')
+ {
+ $this->namespaces['rss2'] = $uri;
+ }
+ else if ($prefix == 'RDF' || $uri == 'HTTP://WWW.W3.ORG/1999/02/22-RDF-SYNTAX-NS#')
+ {
+ $this->namespaces['rdf'] = $uri;
+ }
+ else if ($prefix == 'RSS' || $uri == 'HTTP://PURL.ORG/RSS/1.0/' || $uri == 'HTTP://MY.NETSCAPE.COM/RDF/SIMPLE/0.9/')
+ {
+ $this->namespaces['rss1'] = $uri;
+ }
+ else if ($prefix == 'DC' || $uri == 'HTTP://PURL.ORG/DC/ELEMENTS/1.1/')
+ {
+ $this->namespaces['dc'] = $uri;
+ }
+ else if ($prefix == 'XHTML' || $uri == 'HTTP://WWW.W3.ORG/1999/XHTML')
+ {
+ $this->namespaces['xhtml'] = $uri;
+ $this->xhtml_prefix = $prefix;
+ }
+ else if ($prefix == 'CONTENT' || $uri == 'HTTP://PURL.ORG/RSS/1.0/MODULES/CONTENT/')
+ {
+ $this->namespaces['content'] = $uri;
+ }
+ }
+
+ function end_name_space($parser, $prefix)
+ {
+ if ($key = array_search(strtoupper($prefix), $this->namespaces))
+ {
+ if ($key == 'atom')
+ {
+ $this->namespaces['atom'] = 'ATOM';
+ }
+ else if ($key == 'rss2')
+ {
+ $this->namespaces['rss2'] = 'RSS';
+ }
+ else if ($key == 'rdf')
+ {
+ $this->namespaces['rdf'] = 'RDF';
+ }
+ else if ($key == 'rss1')
+ {
+ $this->namespaces['rss1'] = 'RSS';
+ }
+ else if ($key == 'dc')
+ {
+ $this->namespaces['dc'] = 'DC';
+ }
+ else if ($key == 'xhtml')
+ {
+ $this->namespaces['xhtml'] = 'XHTML';
+ $this->xhtml_prefix = 'XHTML';
+ }
+ else if ($key == 'content')
+ {
+ $this->namespaces['content'] = 'CONTENT';
+ }
+ }
+ }
+}
+
+class SimplePie_Sanitize
+{
+ // Private vars
+ var $feedinfo;
+ var $info;
+ var $items;
+ var $feed_xmlbase;
+ var $item_xmlbase;
+ var $attribs;
+ var $cached_entities;
+
+ // Options
+ var $remove_div = true;
+ var $strip_ads = false;
+ var $replace_headers = false;
+ var $bypass_image_hotlink = false;
+ var $bypass_image_hotlink_page = false;
+ var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
+ var $encode_instead_of_strip = false;
+ var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur');
+ var $input_encoding = 'UTF-8';
+ var $output_encoding = 'UTF-8';
+ var $item_class = 'SimplePie_Item';
+ var $author_class = 'SimplePie_Author';
+ var $enclosure_class = 'SimplePie_Enclosure';
+
+ function remove_div($enable = true)
+ {
+ $this->remove_div = (bool) $enable;
+ }
+
+ function strip_ads($enable = false)
+ {
+ $this->strip_ads = (bool) $enable;
+ }
+
+ function replace_headers($enable = false)
+ {
+ $this->enable_headers = (bool) $enable;
+ }
+
+ function bypass_image_hotlink($get = false)
+ {
+ if ($get)
+ {
+ $this->bypass_image_hotlink = (string) $get;
+ }
+ else
+ {
+ $this->bypass_image_hotlink = false;
+ }
+ }
+
+ function bypass_image_hotlink_page($page = false)
+ {
+ if ($page)
+ {
+ $this->bypass_image_hotlink_page = (string) $page;
+ }
+ else
+ {
+ $this->bypass_image_hotlink_page = false;
+ }
+ }
+
+ function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'))
+ {
+ if ($tags)
+ {
+ if (is_array($tags))
+ {
+ $this->strip_htmltags = $tags;
+ }
+ else
+ {
+ $this->strip_htmltags = explode(',', $tags);
+ }
+ }
+ else
+ {
+ $this->strip_htmltags = false;
+ }
+ }
+
+ function encode_instead_of_strip($enable = false)
+ {
+ $this->encode_instead_of_strip = (bool) $enable;
+ }
+
+ function strip_attributes($attribs = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur'))
+ {
+ if ($attribs)
+ {
+ if (is_array($attribs))
+ {
+ $this->strip_attributes = $attribs;
+ }
+ else
+ {
+ $this->strip_attributes = explode(',', $attribs);
+ }
+ }
+ else
+ {
+ $this->strip_attributes = false;
+ }
+ }
+
+ function input_encoding($encoding = 'UTF-8')
+ {
+ $this->input_encoding = (string) $encoding;
+ }
+
+ function output_encoding($encoding = 'UTF-8')
+ {
+ $this->output_encoding = (string) $encoding;
+ }
+
+ function set_item_class($class = 'SimplePie_Item')
+ {
+ if (SimplePie_Misc::is_a_class($class, 'SimplePie_Item'))
+ {
+ $this->item_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ function set_author_class($class = 'SimplePie_Author')
+ {
+ if (SimplePie_Misc::is_a_class($class, 'SimplePie_Author'))
+ {
+ $this->author_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ function set_enclosure_class($class = 'SimplePie_Enclosure')
+ {
+ if (SimplePie_Misc::is_a_class($class, 'SimplePie_Enclosure'))
+ {
+ $this->enclosure_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ function parse_data_array(&$data, $url)
+ {
+ // Feed Info (Type and Version)
+ if (!empty($data['feedinfo']['type']))
+ {
+ $this->feedinfo = $data['feedinfo'];
+ }
+
+ // Feed level xml:base
+ if (!empty($data['feeddata']['attribs']['XML:BASE']))
+ {
+ $this->feed_xmlbase = $data['feeddata']['attribs']['XML:BASE'];
+ }
+ else if (!empty($data['feeddata']['attribs']['HTTP://WWW.W3.ORG/XML/1998/NAMESPACE:BASE']))
+ {
+ $this->feed_xmlbase = $data['feeddata']['attribs']['HTTP://WWW.W3.ORG/XML/1998/NAMESPACE:BASE'];
+ }
+ // FeedBurner feeds use alternate link
+ else if (strpos($url, 'http://feeds.feedburner.com/') !== 0)
+ {
+ $this->feed_xmlbase = SimplePie_Misc::parse_url($url);
+ if (empty($this->feed_xmlbase['authority']))
+ {
+ $this->feed_xmlbase = preg_replace('/^' . preg_quote(realpath($_SERVER['DOCUMENT_ROOT']), '/') . '/', '', realpath($url));
+ }
+ else
+ {
+ $this->feed_xmlbase = $url;
+ }
+ }
+
+
+ // Feed link(s)
+ if (!empty($data['info']['link']))
+ {
+ foreach ($data['info']['link'] as $link)
+ {
+ if (empty($link['attribs']['REL']))
+ {
+ $rel = 'alternate';
+ }
+ else
+ {
+ $rel = strtolower($link['attribs']['REL']);
+ }
+ if ($rel == 'enclosure')
+ {
+ $href = null;
+ $type = null;
+ $length = null;
+ if (!empty($link['data']))
+ {
+ $href = $this->sanitize($link['data'], $link['attribs'], true);
+ }
+ else if (!empty($link['attribs']['HREF']))
+ {
+ $href = $this->sanitize($link['attribs']['HREF'], $link['attribs'], true);
+ }
+ if (!empty($link['attribs']['TYPE'])) {
+ $type = $this->sanitize($link['attribs']['TYPE'], $link['attribs']);
+ }
+ if (!empty($link['attribs']['LENGTH'])) {
+ $length = $this->sanitize($link['attribs']['LENGTH'], $link['attribs']);
+ }
+ $this->info['link']['enclosure'][] = new $this->enclosure_class($href, $type, $length);
+ }
+ else
+ {
+ if (!empty($link['data']))
+ {
+ $this->info['link'][$rel][] = $this->sanitize($link['data'], $link['attribs'], true);
+ }
+ else if (!empty($link['attribs']['HREF']))
+ {
+ $this->info['link'][$rel][] = $this->sanitize($link['attribs']['HREF'], $link['attribs'], true);
+ }
+ }
+ }
+ }
+
+ // Use the first alternate link if we don't have any feed xml:base
+ if (empty($this->feed_xmlbase) && !empty($this->info['link']['alternate'][0]))
+ {
+ $this->feed_xmlbase = $this->info['link']['alternate'][0];
+ }
+
+ // Feed Title
+ if (!empty($data['info']['title']['data']))
+ {
+ $this->info['title'] = $this->sanitize($data['info']['title']['data'], $data['info']['title']['attribs']);
+ }
+
+ // Feed Descriptions
+ if (!empty($data['info']['description']['data']))
+ {
+ $this->info['description'] = $this->sanitize($data['info']['description']['data'], $data['info']['description']['attribs']);
+ }
+ if (!empty($data['info']['dc:description']['data']))
+ {
+ $this->info['dc:description'] = $this->sanitize($data['info']['dc:description']['data'], $data['info']['dc:description']['attribs']);
+ }
+ if (!empty($data['info']['tagline']['data']))
+ {
+ $this->info['tagline'] = $this->sanitize($data['info']['tagline']['data'], $data['info']['tagline']['attribs']);
+ }
+ if (!empty($data['info']['subtitle']['data']))
+ {
+ $this->info['subtitle'] = $this->sanitize($data['info']['subtitle']['data'], $data['info']['subtitle']['attribs']);
+ }
+
+ // Feed Language
+ if (!empty($data['info']['language']['data']))
+ {
+ $this->info['language'] = $this->sanitize($data['info']['language']['data'], $data['info']['language']['attribs']);
+ }
+ if (!empty($data['feeddata']['attribs']['XML:LANG']))
+ {
+ $this->info['xml:lang'] = $this->sanitize($data['feeddata']['attribs']['XML:LANG'], null);
+ }
+ else if (!empty($data['feeddata']['attribs']['HTTP://WWW.W3.ORG/XML/1998/NAMESPACE:LANG']))
+ {
+ $this->info['xml:lang'] = $this->sanitize($data['feeddata']['attribs']['HTTP://WWW.W3.ORG/XML/1998/NAMESPACE:LANG'], null);
+ }
+
+ // Feed Copyright
+ if (!empty($data['info']['copyright']['data']))
+ {
+ $this->info['copyright'] = $this->sanitize($data['info']['copyright']['data'], $data['info']['copyright']['attribs']);
+ }
+
+ // Feed Image
+ if (!empty($data['info']['image']['title']['data']))
+ {
+ $this->info['image']['title'] = $this->sanitize($data['info']['image']['title']['data'], $data['info']['image']['title']['attribs']);
+ }
+ if (!empty($data['info']['image']['url']['data']))
+ {
+ $this->info['image']['url'] = $this->sanitize($data['info']['image']['url']['data'], $data['info']['image']['url']['attribs'], true);
+ }
+ if (!empty($data['info']['logo']['data']))
+ {
+ $this->info['image']['logo'] = $this->sanitize($data['info']['logo']['data'], $data['info']['logo']['attribs'], true);
+ }
+ if (!empty($data['info']['image']['link']['data']))
+ {
+ $this->info['image']['link'] = $this->sanitize($data['info']['image']['link']['data'], $data['info']['image']['link']['attribs'], true);
+ }
+ if (!empty($data['info']['image']['width']['data']))
+ {
+ $this->info['image']['width'] = $this->sanitize($data['info']['image']['width']['data'], $data['info']['image']['width']['attribs']);
+ }
+ if (!empty($data['info']['image']['height']['data']))
+ {
+ $this->info['image']['height'] = $this->sanitize($data['info']['image']['height']['data'], $data['info']['image']['height']['attribs']);
+ }
+
+ // Items
+ if (!empty($data['items']))
+ {
+ foreach ($data['items'] as $key => $item)
+ {
+ $newitem = null;
+
+ // Item level xml:base
+ if (!empty($item['attribs']['XML:BASE']))
+ {
+ $this->item_xmlbase = SimplePie_Misc::absolutize_url($item['attribs']['XML:BASE'], $this->feed_xmlbase);
+ }
+ else if (!empty($item['attribs']['HTTP://WWW.W3.ORG/XML/1998/NAMESPACE:BASE']))
+ {
+ $this->item_xmlbase = SimplePie_Misc::absolutize_url($item['attribs']['HTTP://WWW.W3.ORG/XML/1998/NAMESPACE:BASE'], $this->feed_xmlbase);
+ }
+ else
+ {
+ $this->item_xmlbase = null;
+ }
+
+ // Title
+ if (!empty($item['title']['data'])) {
+ $newitem['title'] = $this->sanitize($item['title']['data'], $item['title']['attribs']);
+ }
+ if (!empty($item['dc:title']['data']))
+ {
+ $newitem['dc:title'] = $this->sanitize($item['dc:title']['data'], $item['dc:title']['attribs']);
+ }
+
+ // Description
+ if (!empty($item['content']['data']))
+ {
+ $newitem['content'] = $this->sanitize($item['content']['data'], $item['content']['attribs']);
+ }
+ if (!empty($item['encoded']['data']))
+ {
+ $newitem['encoded'] = $this->sanitize($item['encoded']['data'], $item['encoded']['attribs']);
+ }
+ if (!empty($item['summary']['data']))
+ {
+ $newitem['summary'] = $this->sanitize($item['summary']['data'], $item['summary']['attribs']);
+ }
+ if (!empty($item['description']['data']))
+ {
+ $newitem['description'] = $this->sanitize($item['description']['data'], $item['description']['attribs']);
+ }
+ if (!empty($item['dc:description']['data']))
+ {
+ $newitem['dc:description'] = $this->sanitize($item['dc:description']['data'], $item['dc:description']['attribs']);
+ }
+ if (!empty($item['longdesc']['data']))
+ {
+ $newitem['longdesc'] = $this->sanitize($item['longdesc']['data'], $item['longdesc']['attribs']);
+ }
+
+ // Link(s)
+ if (!empty($item['link']))
+ {
+ foreach ($item['link'] as $link)
+ {
+ if (empty($link['attribs']['REL']))
+ {
+ $rel = 'alternate';
+ }
+ else
+ {
+ $rel = strtolower($link['attribs']['REL']);
+ }
+ if ($rel == 'enclosure')
+ {
+ $href = null;
+ $type = null;
+ $length = null;
+ if (!empty($link['data']))
+ {
+ $href = $this->sanitize($link['data'], $link['attribs'], true);
+ }
+ else if (!empty($link['attribs']['HREF']))
+ {
+ $href = $this->sanitize($link['attribs']['HREF'], $link['attribs'], true);
+ }
+ if (!empty($link['attribs']['TYPE'])) {
+ $type = $this->sanitize($link['attribs']['TYPE'], $link['attribs']);
+ }
+ if (!empty($link['attribs']['LENGTH'])) {
+ $length = $this->sanitize($link['attribs']['LENGTH'], $link['attribs']);
+ }
+ if (!empty($href))
+ {
+ $newitem['link'][$rel][] = new $this->enclosure_class($href, $type, $length);
+ }
+ }
+ else
+ {
+ if (!empty($link['data']))
+ {
+ $newitem['link'][$rel][] = $this->sanitize($link['data'], $link['attribs'], true);
+ }
+ else if (!empty($link['attribs']['HREF']))
+ {
+ $newitem['link'][$rel][] = $this->sanitize($link['attribs']['HREF'], $link['attribs'], true);
+ }
+ }
+ }
+ }
+
+ // Enclosure(s)
+ if (!empty($item['enclosure']))
+ {
+ foreach ($item['enclosure'] as $enclosure)
+ {
+ if (!empty($enclosure['attribs']['URL']))
+ {
+ $type = null;
+ $length = null;
+ $href = $this->sanitize($enclosure['attribs']['URL'], $enclosure['attribs'], true);
+ if (!empty($enclosure['attribs']['TYPE']))
+ {
+ $type = $this->sanitize($enclosure['attribs']['TYPE'], $enclosure['attribs']);
+ }
+ if (!empty($enclosure['attribs']['LENGTH']))
+ {
+ $length = $this->sanitize($enclosure['attribs']['LENGTH'], $enclosure['attribs']);
+ }
+ $newitem['enclosures'][] = new $this->enclosure_class($href, $type, $length);
+ }
+ }
+ }
+
+ // ID
+ if (!empty($item['guid']['data']))
+ {
+ if (!empty($item['guid']['attribs']['ISPERMALINK']) && strtolower($item['guid']['attribs']['ISPERMALINK']) == 'false')
+ {
+ $newitem['guid']['permalink'] = false;
+ }
+ else
+ {
+ $newitem['guid']['permalink'] = true;
+ }
+ $newitem['guid']['data'] = $this->sanitize($item['guid']['data'], $item['guid']['attribs']);
+ }
+ if (!empty($item['id']['data']))
+ {
+ $newitem['id'] = $this->sanitize($item['id']['data'], $item['id']['attribs']);
+ }
+
+ // Date
+ if (!empty($item['pubdate']['data']))
+ {
+ $newitem['pubdate'] = $this->parse_date($this->sanitize($item['pubdate']['data'], $item['pubdate']['attribs']));
+ }
+ if (!empty($item['dc:date']['data']))
+ {
+ $newitem['dc:date'] = $this->parse_date($this->sanitize($item['dc:date']['data'], $item['dc:date']['attribs']));
+ }
+ if (!empty($item['issued']['data']))
+ {
+ $newitem['issued'] = $this->parse_date($this->sanitize($item['issued']['data'], $item['issued']['attribs']));
+ }
+ if (!empty($item['published']['data']))
+ {
+ $newitem['published'] = $this->parse_date($this->sanitize($item['published']['data'], $item['published']['attribs']));
+ }
+ if (!empty($item['modified']['data']))
+ {
+ $newitem['modified'] = $this->parse_date($this->sanitize($item['modified']['data'], $item['modified']['attribs']));
+ }
+ if (!empty($item['updated']['data']))
+ {
+ $newitem['updated'] = $this->parse_date($this->sanitize($item['updated']['data'], $item['updated']['attribs']));
+ }
+
+ // Categories
+ if (!empty($item['category']))
+ {
+ foreach ($item['category'] as $category)
+ {
+ if (!empty($category['data']))
+ {
+ $newitem['category'][] = $this->sanitize($category['data'], $category['attribs']);
+ }
+ else if (!empty($category['attribs']['TERM']))
+ {
+ $newitem['term'][] = $this->sanitize($category['attribs']['TERM'], $category['attribs']);
+ }
+ }
+ }
+ if (!empty($item['subject']))
+ {
+ foreach ($item['subject'] as $category)
+ {
+ if (!empty($category['data']))
+ {
+ $newitem['subject'][] = $this->sanitize($category['data'], $category['attribs']);
+ }
+ }
+ }
+
+ // Author
+ if (!empty($item['creator']))
+ {
+ foreach ($item['creator'] as $creator)
+ {
+ if (!empty($creator['data']))
+ {
+ $newitem['creator'][] = new $this->author_class($this->sanitize($creator['data'], $creator['attribs']), null, null);
+ }
+ }
+ }
+ if (!empty($item['author']))
+ {
+ foreach ($item['author'] as $author)
+ {
+ $name = null;
+ $link = null;
+ $email = null;
+ if (!empty($author['rss']))
+ {
+ $sane = $this->sanitize($author['rss']['data'], $author['rss']['attribs']);
+ if (preg_match('/(.*)@(.*) \((.*)\)/msiU', $sane, $matches)) {
+ $name = trim($matches[3]);
+ $email = trim("$matches[1]@$matches[2]");
+ } else {
+ $email = $sane;
+ }
+ }
+ else
+ {
+ if (!empty($author['name']))
+ {
+ $name = $this->sanitize($author['name']['data'], $author['name']['attribs']);
+ }
+ if (!empty($author['url']))
+ {
+ $link = $this->sanitize($author['url']['data'], $author['url']['attribs'], true);
+ }
+ else if (!empty($author['uri']))
+ {
+ $link = $this->sanitize($author['uri']['data'], $author['uri']['attribs'], true);
+ }
+ else if (!empty($author['homepage']))
+ {
+ $link = $this->sanitize($author['homepage']['data'], $author['homepage']['attribs'], true);
+ }
+ if (!empty($author['email'])) {
+ $email = $this->sanitize($author['email']['data'], $author['email']['attribs']);
+ }
+ }
+ $newitem['author'][] = new $this->author_class($name, $link, $email);
+ }
+ }
+ unset($data['items'][$key]);
+ $this->items[] = new $this->item_class($newitem);
+ }
+ }
+ }
+
+ function sanitize($data, $attribs, $is_url = false)
+ {
+ $this->attribs = $attribs;
+ if (isset($this->feedinfo['type']) && $this->feedinfo['type'] == 'Atom')
+ {
+ if ((!empty($attribs['MODE']) && $attribs['MODE'] == 'base64') || (!empty($attribs['TYPE']) && $attribs['TYPE'] == 'application/octet-stream'))
+ {
+ $data = trim($data);
+ $data = base64_decode($data);
+ }
+ else if ((!empty($attribs['MODE']) && $attribs['MODE'] == 'escaped' || !empty($attribs['TYPE']) && ($attribs['TYPE'] == 'html' || $attribs['TYPE'] == 'text/html')) && (empty($attribs['SPENCODED']) || $attribs['SPENCODED'] != 'false'))
+ {
+ $data = $this->entities_decode($data);
+ }
+ if (!empty($attribs['TYPE']) && ($attribs['TYPE'] == 'xhtml' || $attribs['TYPE'] == 'application/xhtml+xml'))
+ {
+ if ($this->remove_div)
+ {
+ $data = preg_replace('/<div( .*)?>/msiU', '', strrev(preg_replace('/>vid\/</i', '', strrev($data), 1)), 1);
+ }
+ else
+ {
+ $data = preg_replace('/<div( .*)?>/msiU', '<div>', $data, 1);
+ }
+ }
+ }
+ else
+ {
+ if (empty($attribs['SPENCODED']) || $attribs['SPENCODED'] != 'false')
+ {
+ $data = $this->entities_decode($data);
+ }
+ }
+ $data = trim($data);
+ $data = str_replace(' spencoded="false">', '>', $data);
+
+ // If Strip Ads is enabled, strip them.
+ if ($this->strip_ads)
+ {
+ $data = preg_replace('/<a (.*)href=(.*)click\.phdo\?s=(.*)<\/a>/msiU', '', $data); // Pheedo links (tested with Dooce.com)
+ $data = preg_replace('/<p(.*)>(.*)<a href="http:\/\/ad.doubleclick.net\/jump\/(.*)<\/p>/msiU', '', $data); // Doubleclick links (tested with InfoWorld.com)
+ $data = preg_replace('/<p><map (.*)name=(.*)google_ad_map(.*)<\/p>/msiU', '', $data); // Google AdSense for Feeds (tested with tuaw.com).
+ // Feedflare, from Feedburner
+ }
+
+ // Replace H1, H2, and H3 tags with the less important H4 tags.
+ // This is because on a site, the more important headers might make sense,
+ // but it most likely doesn't fit in the context of RSS-in-a-webpage.
+ if ($this->replace_headers)
+ {
+ $data = preg_replace('/<h[1-3]((\s*((\w+:)?\w+)\s*=\s*("([^"]*)"|\'([^\']*)\'|(.*)))*)\s*>/msiU', '<h4\\1>', $data);
+ $data = preg_replace('/<\/h[1-3]>/i', '</h4>', $data);
+ }
+
+ if ($is_url)
+ {
+ $data = $this->replace_urls($data, true);
+ }
+ else
+ {
+ $data = preg_replace_callback('/<(\S+)((\s*((\w+:)?\w+)\s*=\s*("([^"]*)"|\'([^\']*)\'|(.*)))*)\s*(\/>|>(.*)<\/\S+>)/msiU', array(&$this, 'replace_urls'), $data);
+ }
+
+ // If Bypass Image Hotlink is enabled, rewrite all the image tags.
+ if ($this->bypass_image_hotlink)
+ {
+ $images = SimplePie_Misc::get_element('img', $data);
+ foreach ($images as $img)
+ {
+ if (!empty($img['attribs']['SRC']['data']))
+ {
+ $pre = '';
+ if ($this->bypass_image_hotlink_page)
+ {
+ $pre = $this->bypass_image_hotlink_page;
+ }
+ $pre .= "?$this->bypass_image_hotlink=";
+ $img['attribs']['SRC']['data'] = $pre . rawurlencode(strtr($img['attribs']['SRC']['data'], array_flip(get_html_translation_table(HTML_SPECIALCHARS, ENT_QUOTES))));
+ $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data);
+ }
+ }
+ }
+
+ // Strip out HTML tags and attributes that might cause various security problems.
+ // Based on recommendations by Mark Pilgrim at:
+ // http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely
+ if ($this->strip_htmltags)
+ {
+ foreach ($this->strip_htmltags as $tag)
+ {
+ $data = preg_replace_callback("/<($tag)((\s*((\w+:)?\w+)(\s*=\s*(\"([^\"]*)\"|'([^']*)'|(.*)))?)*)\s*(\/>|>(.*)<\/($tag)((\s*((\w+:)?\w+)(\s*=\s*(\"([^\"]*)\"|'([^']*)'|(.*)))?)*)\s*>)/msiU", array(&$this, 'do_strip_htmltags'), $data);
+ }
+ }
+
+ if ($this->strip_attributes)
+ {
+ foreach ($this->strip_attributes as $attrib)
+ {
+ $data = preg_replace('/ '. trim($attrib) .'=("|&quot;)(\w|\s|=|-|:|;|\/|\.|\?|&|,|#|!|\(|\)|\'|&apos;|<|>|\+|{|})*("|&quot;)/i', '', $data);
+ $data = preg_replace('/ '. trim($attrib) .'=(\'|&apos;)(\w|\s|=|-|:|;|\/|\.|\?|&|,|#|!|\(|\)|"|&quot;|<|>|\+|{|})*(\'|&apos;)/i', '', $data);
+ $data = preg_replace('/ '. trim($attrib) .'=(\w|\s|=|-|:|;|\/|\.|\?|&|,|#|!|\(|\)|\+|{|})*/i', '', $data);
+ }
+ }
+
+ // Convert encoding
+ $data = SimplePie_Misc::change_encoding($data, $this->input_encoding, $this->output_encoding);
+
+ return $data;
+ }
+
+ function do_strip_htmltags($match)
+ {
+ if ($this->encode_instead_of_strip)
+ {
+ if (isset($match[12]) && !in_array(strtolower($match[1]), array('script', 'style')))
+ {
+ return "&lt;$match[1]$match[2]&gt;$match[12]&lt;/$match[1]&gt;";
+ }
+ else if (isset($match[12]))
+ {
+ return "&lt;$match[1]$match[2]&gt;&lt;/$match[1]&gt;";
+ }
+ else
+ {
+ return "&lt;$match[1]$match[2]/&gt;";
+ }
+ }
+ else
+ {
+ if (isset($match[12]) && !in_array(strtolower($match[1]), array('script', 'style')))
+ {
+ return $match[12];
+ }
+ else
+ {
+ return '';
+ }
+ }
+ }
+
+ function replace_urls($data, $raw_url = false)
+ {
+ if (!empty($this->attribs['XML:BASE']))
+ {
+ $xmlbase = $attribs['XML:BASE'];
+ }
+ else if (!empty($this->attribs['HTTP://WWW.W3.ORG/XML/1998/NAMESPACE:BASE']))
+ {
+ $xmlbase = $this->attribs['HTTP://WWW.W3.ORG/XML/1998/NAMESPACE:BASE'];
+ }
+ if (!empty($xmlbase))
+ {
+ if (!empty($this->item_xmlbase))
+ {
+ $xmlbase = SimplePie_Misc::absolutize_url($xmlbase, $this->item_xmlbase);
+ }
+ else
+ {
+ $xmlbase = SimplePie_Misc::absolutize_url($xmlbase, $this->feed_xmlbase);
+ }
+ }
+ else if (!empty($this->item_xmlbase))
+ {
+ $xmlbase = $this->item_xmlbase;
+ }
+ else
+ {
+ $xmlbase = $this->feed_xmlbase;
+ }
+
+ if ($raw_url)
+ {
+ return SimplePie_Misc::absolutize_url($data, $xmlbase);
+ }
+ else
+ {
+ $attributes = array(
+ 'background',
+ 'href',
+ 'src',
+ 'longdesc',
+ 'usemap',
+ 'codebase',
+ 'data',
+ 'classid',
+ 'cite',
+ 'action',
+ 'profile',
+ 'for'
+ );
+ foreach ($attributes as $attribute)
+ {
+ if (preg_match("/$attribute='(.*)'/siU", $data[0], $attrib) || preg_match("/$attribute=\"(.*)\"/siU", $data[0], $attrib) || preg_match("/$attribute=(.*)[ |\/|>]/siU", $data[0], $attrib))
+ {
+ $new_tag = str_replace($attrib[1], SimplePie_Misc::absolutize_url($attrib[1], $xmlbase), $attrib[0]);
+ $data[0] = str_replace($attrib[0], $new_tag, $data[0]);
+ }
+ }
+ return $data[0];
+ }
+ }
+
+ function entities_decode($data)
+ {
+ return preg_replace_callback('/&(#)?(x)?([0-9a-z]+);/mi', array(&$this, 'do_entites_decode'), $data);
+ }
+
+ function do_entites_decode($data)
+ {
+ if (isset($this->cached_entities[$data[0]]))
+ {
+ return $this->cached_entities[$data[0]];
+ }
+ else
+ {
+ $return = SimplePie_Misc::change_encoding(html_entity_decode($data[0], ENT_QUOTES), 'ISO-8859-1', $this->input_encoding);
+ if ($return == $data[0])
+ {
+ $return = SimplePie_Misc::change_encoding(preg_replace_callback('/&#([0-9a-fx]+);/mi', array(&$this, 'replace_num_entity'), $data[0]), 'UTF-8', $this->input_encoding);
+ }
+ $this->cached_entities[$data[0]] = $return;
+ return $return;
+ }
+ }
+
+ /*
+ * Escape numeric entities
+ * From a PHP Manual note (on html_entity_decode())
+ * Copyright (c) 2005 by "php dot net at c dash ovidiu dot tk",
+ * "emilianomartinezluque at yahoo dot com" and "hurricane at cyberworldz dot org".
+ *
+ * This material may be distributed only subject to the terms and conditions set forth in
+ * the Open Publication License, v1.0 or later (the latest version is presently available at
+ * http://www.opencontent.org/openpub/).
+ */
+ function replace_num_entity($ord)
+ {
+ $ord = $ord[1];
+ if (preg_match('/^x([0-9a-f]+)$/i', $ord, $match))
+ {
+ $ord = hexdec($match[1]);
+ }
+ else
+ {
+ $ord = intval($ord);
+ }
+
+ $no_bytes = 0;
+ $byte = array();
+ if ($ord < 128)
+ {
+ return chr($ord);
+ }
+ if ($ord < 2048)
+ {
+ $no_bytes = 2;
+ }
+ else if ($ord < 65536)
+ {
+ $no_bytes = 3;
+ }
+ else if ($ord < 1114112)
+ {
+ $no_bytes = 4;
+ }
+ else
+ {
+ return;
+ }
+ switch ($no_bytes)
+ {
+ case 2:
+ $prefix = array(31, 192);
+ break;
+
+ case 3:
+ $prefix = array(15, 224);
+ break;
+
+ case 4:
+ $prefix = array(7, 240);
+ break;
+ }
+
+ for ($i = 0; $i < $no_bytes; $i++)
+ {
+ $byte[$no_bytes-$i-1] = (($ord & (63 * pow(2,6*$i))) / pow(2,6*$i)) & 63 | 128;
+ }
+ $byte[0] = ($byte[0] & $prefix[0]) | $prefix[1];
+
+ $ret = '';
+ for ($i = 0; $i < $no_bytes; $i++)
+ {
+ $ret .= chr($byte[$i]);
+ }
+ return $ret;
+ }
+
+ function parse_date($date)
+ {
+ $military_timezone = array('A' => '-0100', 'B' => '-0200', 'C' => '-0300', 'D' => '-0400', 'E' => '-0500', 'F' => '-0600', 'G' => '-0700', 'H' => '-0800', 'I' => '-0900', 'K' => '-1000', 'L' => '-1100', 'M' => '-1200', 'N' => '+0100', 'O' => '+0200', 'P' => '+0300', 'Q' => '+0400', 'R' => '+0500', 'S' => '+0600', 'T' => '+0700', 'U' => '+0800', 'V' => '+0900', 'W' => '+1000', 'X' => '+1100', 'Y' => '+1200', 'Z' => '-0000');
+ $north_american_timezone = array('GMT' => '-0000', 'EST' => '-0500', 'EDT' => '-0400', 'CST' => '-0600', 'CDT' => '-0500', 'MST' => '-0700', 'MDT' => '-0600', 'PST' => '-0800', 'PDT' => '-0700');
+ if (preg_match('/([0-9]{2,4})-?([0-9]{2})-?([0-9]{2})T([0-9]{2}):?([0-9]{2})(:?([0-9]{2}(\.[0-9]*)?))?(UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[a-z]|(\\+|-)[0-9]{4}|(\\+|-)[0-9]{2}:[0-9]{2})?/i', $date, $matches))
+ {
+ if (!isset($matches[7]))
+ {
+ $matches[7] = '';
+ }
+ if (!isset($matches[9]))
+ {
+ $matches[9] = '';
+ }
+ $matches[7] = str_pad(round($matches[7]), 2, '0', STR_PAD_LEFT);
+ switch (strlen($matches[9]))
+ {
+ case 0:
+ $timezone = '';
+ break;
+
+ case 1:
+ $timezone = $military_timezone[strtoupper($matches[9])];
+ break;
+
+ case 2:
+ $timezone = '-0000';
+ break;
+
+ case 3:
+ $timezone = $north_american_timezone[strtoupper($matches[9])];
+ break;
+
+ case 5:
+ $timezone = $matches[9];
+ break;
+
+ case 6:
+ $timezone = substr_replace($matches[9], '', 3, 1);
+ break;
+ }
+ $date = strtotime("$matches[1]-$matches[2]-$matches[3] $matches[4]:$matches[5]:$matches[7] $timezone");
+ }
+ else if (preg_match('/([0-9]{1,2})\s*(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s*([0-9]{2}|[0-9]{4})\s*([0-9]{2}):([0-9]{2})(:([0-9]{2}(\.[0-9]*)?))?\s*(UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[a-z]|(\\+|-)[0-9]{4}|(\\+|-)[0-9]{2}:[0-9]{2})?/i', $date, $matches))
+ {
+ $three_month = array('Jan' => 1, 'Feb' => 2, 'Mar' => 3, 'Apr' => 4, 'May' => 5, 'Jun' => 6, 'Jul' => 7, 'Aug' => 8, 'Sep' => 9, 'Oct' => 10, 'Nov' => 11, 'Dec' => 12);
+ $month = $three_month[$matches[2]];
+ if (strlen($matches[3]) == 2)
+ {
+ $year = ($matches[3] < 70) ? "20$matches[3]" : "19$matches[3]";
+ }
+ else
+ {
+ $year = $matches[3];
+ }
+ if (!isset($matches[7]))
+ {
+ $matches[7] = '';
+ }
+ if (!isset($matches[9]))
+ {
+ $matches[9] = '';
+ }
+ $second = str_pad(round($matches[7]), 2, '0', STR_PAD_LEFT);
+ switch (strlen($matches[9]))
+ {
+ case 0:
+ $timezone = '';
+ break;
+
+ case 1:
+ $timezone = $military_timezone[strtoupper($matches[9])];
+ break;
+
+ case 2:
+ $timezone = '-0000';
+ break;
+
+ case 3:
+ $timezone = $north_american_timezone[strtoupper($matches[9])];
+ break;
+
+ case 5:
+ $timezone = $matches[9];
+ break;
+
+ case 6:
+ $timezone = substr_replace($matches[9], '', 3, 1);
+ break;
+ }
+ $date = strtotime("$year-$month-$matches[1] $matches[4]:$matches[5]:$second $timezone");
+ }
+ else
+ {
+ $date = strtotime($date);
+ }
+ return ($date > 0) ? $date : false;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/wp-includes/comment.php b/wp-includes/comment.php
index e77f483..5d991e2 100644
--- a/wp-includes/comment.php
+++ b/wp-includes/comment.php
@@ -199,7 +199,7 @@ function wp_allow_comment($commentdata) {
}
// The author and the admins get respect.
- if ( $userdata && ( $user_id == $post_author || $user->has_cap('level_9') ) ) {
+ if ( $userdata && is_site_admin( $userdata->user_login ) == false && ( $user_id == $post_author || $user->has_cap('level_9' ) ) ) {
$approved = 1;
}
diff --git a/wp-includes/feed.php b/wp-includes/feed.php
index 9068eb3..ec11d65 100644
--- a/wp-includes/feed.php
+++ b/wp-includes/feed.php
@@ -23,27 +23,26 @@ function the_title_rss() {
function the_content_rss($more_link_text='(more...)', $stripteaser=0, $more_file='', $cut = 0, $encode_html = 0) {
$content = get_the_content($more_link_text, $stripteaser, $more_file);
$content = apply_filters('the_content_rss', $content);
- if ($cut && !$encode_html) {
+ if ( $cut && !$encode_html )
$encode_html = 2;
- }
- if ($encode_html == 1) {
+ if ( 1== $encode_html ) {
$content = wp_specialchars($content);
$cut = 0;
- } elseif ($encode_html == 0) {
+ } elseif ( 0 == $encode_html ) {
$content = make_url_footnote($content);
- } elseif ($encode_html == 2) {
+ } elseif ( 2 == $encode_html ) {
$content = strip_tags($content);
}
- if ($cut) {
+ if ( $cut ) {
$blah = explode(' ', $content);
- if (count($blah) > $cut) {
+ if ( count($blah) > $cut ) {
$k = $cut;
$use_dotdotdot = 1;
} else {
$k = count($blah);
$use_dotdotdot = 0;
}
- for ($i=0; $i<$k; $i++) {
+ for ( $i=0; $i<$k; $i++ ) {
$excerpt .= $blah[$i].' ';
}
$excerpt .= ($use_dotdotdot) ? '...' : '';
@@ -59,7 +58,7 @@ function the_excerpt_rss() {
}
function permalink_single_rss($file = '') {
- echo get_permalink();
+ echo get_permalink();
}
function comment_link() {
@@ -87,7 +86,7 @@ function comments_rss_link($link_text = 'Comments RSS', $commentsrssfilename = '
function comments_rss($commentsrssfilename = '') {
global $id;
- if ('' != get_option('permalink_structure'))
+ if ( '' != get_option('permalink_structure') )
$url = trailingslashit( get_permalink() ) . 'feed/';
else
$url = get_option('home') . "/$commentsrssfilename?feed=rss2&amp;p=$id";
@@ -96,50 +95,51 @@ function comments_rss($commentsrssfilename = '') {
}
function get_author_rss_link($echo = false, $author_id, $author_nicename) {
- $auth_ID = $author_id;
- $permalink_structure = get_option('permalink_structure');
+ $auth_ID = $author_id;
+ $permalink_structure = get_option('permalink_structure');
+
+ if ( '' == $permalink_structure ) {
+ $link = get_option('home') . '?feed=rss2&amp;author=' . $author_id;
+ } else {
+ $link = get_author_posts_url($author_id, $author_nicename);
+ $link = $link . "feed/";
+ }
- if ('' == $permalink_structure) {
- $link = get_option('home') . '?feed=rss2&amp;author=' . $author_id;
- } else {
- $link = get_author_posts_url($author_id, $author_nicename);
- $link = $link . "feed/";
- }
-
- $link = apply_filters('author_feed_link', $link);
+ $link = apply_filters('author_feed_link', $link);
- if ($echo) echo $link;
- return $link;
+ if ( $echo )
+ echo $link;
+ return $link;
}
function get_category_rss_link($echo = false, $cat_ID, $category_nicename) {
- $permalink_structure = get_option('permalink_structure');
+ $permalink_structure = get_option('permalink_structure');
- if ('' == $permalink_structure) {
- $link = get_option('home') . '?feed=rss2&amp;cat=' . $cat_ID;
- } else {
- $link = get_category_link($cat_ID);
- $link = $link . "feed/";
- }
+ if ( '' == $permalink_structure ) {
+ $link = get_option('home') . '?feed=rss2&amp;cat=' . $cat_ID;
+ } else {
+ $link = get_category_link($cat_ID);
+ $link = $link . "feed/";
+ }
- $link = apply_filters('category_feed_link', $link);
+ $link = apply_filters('category_feed_link', $link);
- if ($echo) echo $link;
- return $link;
+ if ( $echo )
+ echo $link;
+ return $link;
}
function get_the_category_rss($type = 'rss') {
- $categories = get_the_category();
- $the_list = '';
- foreach ($categories as $category) {
- $category->cat_name = convert_chars($category->cat_name);
- if ('rdf' == $type) {
- $the_list .= "\n\t\t<dc:subject>$category->cat_name</dc:subject>\n";
- } else {
- $the_list .= "\n\t\t<category>$category->cat_name</category>\n";
- }
- }
- return apply_filters('the_category_rss', $the_list, $type);
+ $categories = get_the_category();
+ $the_list = '';
+ foreach ( (array) $categories as $category ) {
+ $category->cat_name = convert_chars($category->cat_name);
+ if ( 'rdf' == $type )
+ $the_list .= "\n\t\t<dc:subject>$category->cat_name</dc:subject>\n";
+ else
+ $the_list .= "\n\t\t<category>$category->cat_name</category>\n";
+ }
+ return apply_filters('the_category_rss', $the_list, $type);
}
function the_category_rss($type = 'rss') {
@@ -148,14 +148,15 @@ function the_category_rss($type = 'rss') {
function rss_enclosure() {
global $id, $post;
- if (!empty($post->post_password) && ($_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password)) return;
+ if ( !empty($post->post_password) && ($_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password) )
+ return;
$custom_fields = get_post_custom();
- if( is_array( $custom_fields ) ) {
- while( list( $key, $val ) = each( $custom_fields ) ) {
- if( $key == 'enclosure' ) {
- if (is_array($val)) {
- foreach($val as $enc) {
+ if ( is_array($custom_fields) ) {
+ while ( list($key, $val) = each($custom_fields) ) {
+ if ( $key == 'enclosure' ) {
+ if ( is_array($val) ) {
+ foreach ( (array) $val as $enc ) {
$enclosure = split( "\n", $enc );
print "<enclosure url='".trim( htmlspecialchars($enclosure[ 0 ]) )."' length='".trim( $enclosure[ 1 ] )."' type='".trim( $enclosure[ 2 ] )."'/>\n";
}
diff --git a/wp-includes/formatting.php b/wp-includes/formatting.php
index 5c96044..7d083a8 100644
--- a/wp-includes/formatting.php
+++ b/wp-includes/formatting.php
@@ -285,6 +285,17 @@ function remove_accents($string) {
return $string;
}
+function sanitize_file( $name ) { // Like sanitize_title, but with periods
+ $name = strtolower( $name );
+ $name = preg_replace('/&.+?;/', '', $name); // kill entities
+ $name = str_replace( '_', '-', $name );
+ $name = preg_replace('/[^a-z0-9\s-.]/', '', $name);
+ $name = preg_replace('/\s+/', '-', $name);
+ $name = preg_replace('|-+|', '-', $name);
+ $name = trim($name, '-');
+ return $name;
+}
+
function sanitize_user( $username, $strict = false ) {
$raw_username = $username;
$username = strip_tags($username);
@@ -595,10 +606,18 @@ function antispambot($emailaddy, $mailto=0) {
function make_clickable($ret) {
$ret = ' ' . $ret;
- $ret = preg_replace("#(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", "$1<a href='$2' rel='nofollow'>$2</a>", $ret);
- $ret = preg_replace("#(^|[\n ])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", "$1<a href='http://$2' rel='nofollow'>$2</a>", $ret);
- $ret = preg_replace("#(\s)([a-z0-9\-_.]+)@([^,< \n\r]+)#i", "$1<a href=\"mailto:$2@$3\">$2@$3</a>", $ret);
- $ret = substr($ret, 1);
+ // in testing, using arrays here was found to be faster
+ $ret = preg_replace(
+ array(
+ '#([\s>])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is',
+ '#([\s>])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#is',
+ '#([\s>])([a-z0-9\-_.]+)@([^,< \n\r]+)#i'),
+ array(
+ '$1<a href="$2" rel="nofollow">$2</a>',
+ '$1<a href="http://$2" rel="nofollow">$2</a>',
+ '$1<a href="mailto:$2@$3">$2@$3</a>'),$ret);
+ // this one is not in an array because we need it to run last, for cleanup of accidental links within links
+ $ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret);
$ret = trim($ret);
return $ret;
}
@@ -618,7 +637,14 @@ function convert_smilies($text) {
if (get_option('use_smilies')) {
// HTML loop taken from texturize function, could possible be consolidated
$textarr = preg_split("/(<.*>)/U", $text, -1, PREG_SPLIT_DELIM_CAPTURE); // capture the tags as well as in between
- $output = implode('', preg_replace($wp_smiliessearch, $wp_smiliesreplace, $textarr));
+ $stop = count($textarr);// loop stuff
+ for ($i = 0; $i < $stop; $i++) {
+ $content = $textarr[$i];
+ if ((strlen($content) > 0) && ('<' != $content{0})) { // If it's not a tag
+ $content = preg_replace($wp_smiliessearch, $wp_smiliesreplace, $content);
+ }
+ $output .= $content;
+ }
} else {
// return default text.
$output = $text;
diff --git a/wp-includes/functions.php b/wp-includes/functions.php
index a3f4994..e87724a 100644
--- a/wp-includes/functions.php
+++ b/wp-includes/functions.php
@@ -156,28 +156,54 @@ function get_lastpostmodified($timezone = 'server') {
}
function maybe_unserialize($original) {
- if ( false !== $gm = @ unserialize($original) )
- return $gm;
- else
- return $original;
+ if ( is_serialized($original) ) // don't attempt to unserialize data that wasn't serialized going in
+ if ( false !== $gm = @ unserialize($original) )
+ return $gm;
+ return $original;
}
-/* Options functions */
-
-function is_switched( $setting = 'N/A' ) {
- global $switched;
- if ( $switched == false && defined('WP_INSTALLING') == false && $_REQUEST['nomemcache'] != 'all' && $_REQUEST['nomemcache'] != $setting ) {
+function is_serialized($data) {
+ // if it isn't a string, it isn't serialized
+ if ( !is_string($data) )
return false;
- } else {
+ $data = trim($data);
+ if ( 'N;' == $data )
return true;
- }
+ if ( !preg_match('/^([adObis]):/', $data, $badions) )
+ return false;
+ switch ( $badions[1] ) :
+ case 'a' :
+ case 'O' :
+ case 's' :
+ if ( preg_match("/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data) )
+ return true;
+ break;
+ case 'b' :
+ case 'i' :
+ case 'd' :
+ if ( preg_match("/^{$badions[1]}:[0-9.E-]+;\$/", $data) )
+ return true;
+ break;
+ endswitch;
+ return false;
+}
+function is_serialized_string($data) {
+ // if it isn't a string, it isn't a serialized string
+ if ( !is_string($data) )
+ return false;
+ $data = trim($data);
+ if ( preg_match('/^s:[0-9]+:.*;$/s',$data) ) // this should fetch all serialized strings
+ return true;
+ return false;
}
+/* Options functions */
+
function get_option($setting) {
global $wpdb, $switched, $current_blog;
- if ( is_switched() == false ) {
+ if ( $switched == false && defined('WP_INSTALLING') == false ) {
$value = wp_cache_get($setting, 'options');
} else {
$value = false;
@@ -266,10 +292,9 @@ function update_option($option_name, $newvalue) {
}
$_newvalue = $newvalue;
- if ( is_array($newvalue) || is_object($newvalue) )
- $newvalue = serialize($newvalue);
+ $newvalue = maybe_serialize($newvalue);
- wp_cache_set($option_name, $newvalue, 'options');
+ wp_cache_delete($option_name, 'options');
$newvalue = $wpdb->escape($newvalue);
$option_name = $wpdb->escape($option_name);
@@ -289,10 +314,9 @@ function add_option($name, $value = '', $description = '', $autoload = 'yes') {
if ( false !== get_option($name) )
return;
- if ( is_array($value) || is_object($value) )
- $value = serialize($value);
+ $value = maybe_serialize($value);
- wp_cache_set($name, $value, 'options');
+ wp_cache_delete($name, 'options');
$name = $wpdb->escape($name);
$value = $wpdb->escape($value);
@@ -312,6 +336,16 @@ function delete_option($name) {
return true;
}
+function maybe_serialize($data) {
+ if ( is_string($data) )
+ $data = trim($data);
+ elseif ( is_array($data) || is_object($data) )
+ return serialize($data);
+ if ( is_serialized($data) )
+ return serialize($data);
+ return $data;
+}
+
function gzip_compression() {
if ( !get_option('gzipcompression') ) return false;
@@ -568,10 +602,27 @@ function update_post_caches(&$posts) {
update_post_category_cache($post_id_list);
+ update_postmeta_cache($post_id_list);
+}
+
+function update_postmeta_cache($post_id_list = '') {
+ global $wpdb, $post_meta_cache, $blog_id;
+
+ // We should validate this comma-separated list for the upcoming SQL query
+ $post_id_list = preg_replace('|[^0-9,]|', '', $post_id_list);
+
+ // we're marking each post as having its meta cached (with no keys... empty array), to prevent posts with no meta keys from being queried again
+ // any posts that DO have keys will have this empty array overwritten with a proper array, down below
+ $post_id_array = explode(',', $post_id_list);
+ foreach ( (array) $post_id_array as $pid )
+ $post_meta_cache[$blogi_id][$pid] = array();
+
// Get post-meta info
if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE post_id IN($post_id_list) ORDER BY post_id, meta_key", ARRAY_A) ) {
// Change from flat structure to hierarchical:
- $post_meta_cache[$blog_id] = array();
+ if ( !isset($post_meta_cache) )
+ $post_meta_cache[$blog_id] = array();
+
foreach ($meta_list as $metarow) {
$mpid = (int) $metarow['post_id'];
$mkey = $metarow['meta_key'];
@@ -655,10 +706,13 @@ function add_query_arg() {
}
foreach($qs as $k => $v) {
- if ( $v != '' ) {
+ if ( $v !== FALSE ) {
if ( $ret != '' )
$ret .= '&';
- $ret .= "$k=$v";
+ if ( empty($v) && !preg_match('|[?&]' . preg_quote($k, '|') . '=|', $query) )
+ $ret .= $k;
+ else
+ $ret .= "$k=$v";
}
}
$ret = $protocol . $base . $ret . $frag;
@@ -680,10 +734,10 @@ remove_query_arg(removekeyarray, [oldquery_or_uri])
function remove_query_arg($key, $query='') {
if ( is_array($key) ) { // removing multiple keys
foreach ( (array) $key as $k )
- $query = add_query_arg($k, '', $query);
+ $query = add_query_arg($k, FALSE, $query);
return $query;
}
- return add_query_arg($key, '', $query);
+ return add_query_arg($key, FALSE, $query);
}
function add_magic_quotes($array) {
@@ -742,8 +796,10 @@ function status_header( $header ) {
elseif ( 410 == $header )
$text = 'Gone';
- @header("HTTP/1.1 $header $text");
- @header("Status: $header $text");
+ if ( substr(php_sapi_name(), 0, 3) == 'cgi' )
+ @header("Status: $header $text");
+ else
+ @header("HTTP/1.1 $header $text");
}
function nocache_headers() {
@@ -1142,7 +1198,7 @@ function wp_die($message, $title = '') {
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
+<html xmlns="http://www.w3.org/1999/xhtml" <?php if ( function_exists('language_attributes') ) language_attributes(); ?>>
<head>
<title><?php echo $title ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
@@ -1213,5 +1269,4 @@ function _mce_add_direction_buttons($input) {
return $input;
}
-
?>
diff --git a/wp-includes/general-template.php b/wp-includes/general-template.php
index 0e80761..4849360 100644
--- a/wp-includes/general-template.php
+++ b/wp-includes/general-template.php
@@ -338,7 +338,7 @@ function wp_get_archives($args = '') {
$arcresults = wp_cache_get( md5('archives' . $type . $limit), 'general');
if ( !$arcresults ) {
$arcresults = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC" . $limit);
- wp_cache_set( md5('archives' . $type . $limit), $arcresults, 'general', 600 );
+ wp_cache_set( md5('archives' . $type . $limit), $arcresults, 'general', 86400 );
}
if ( $arcresults ) {
$afterafter = $after;
@@ -755,6 +755,13 @@ function noindex() {
echo "<meta name='robots' content='noindex,nofollow' />\n";
}
+function rich_edit_exists() {
+ global $wp_rich_edit_exists;
+ if ( !isset($wp_rich_edit_exists) )
+ $wp_rich_edit_exists = file_exists(ABSPATH . WPINC . '/js/tinymce/tiny_mce.js');
+ return $wp_rich_edit_exists;
+}
+
function user_can_richedit() {
$can = true;
diff --git a/wp-includes/js/autosave.js.php b/wp-includes/js/autosave.js.php
index a8648f0..c360318 100644
--- a/wp-includes/js/autosave.js.php
+++ b/wp-includes/js/autosave.js.php
@@ -2,15 +2,11 @@
cache_javascript_headers();
?>
var autosaveLast = '';
-function autosave_timer() {
- autosave();
- setTimeout("autosave_timer()", <?php echo apply_filters('autosave_interval', '60000') ?>);
-}
-
+var autosavePeriodical;
function autosave_start_timer() {
var form = $('post');
autosaveLast = form.post_title.value+form.content.value;
- setTimeout("autosave_timer()", <?php echo apply_filters('autosave_start_delay', '60000') ?>);
+ autosavePeriodical = new PeriodicalExecuter(autosave, <?php echo apply_filters('autosave_interval', '60'); ?>);
}
addLoadEvent(autosave_start_timer)
@@ -80,6 +76,7 @@ function autosave() {
if ( typeof tinyMCE == "undefined" || tinyMCE.configs.length < 1 || rich == false ) {
autosaveAjax.setVar("content", form.content.value);
} else {
+ // Don't run while the TinyMCE spellcheck is on.
if(tinyMCE.selectedInstance.spellcheckerOn) return;
tinyMCE.wpTriggerSave();
autosaveAjax.setVar("content", form.content.value);
diff --git a/wp-includes/js/list-manipulation-js.php b/wp-includes/js/list-manipulation-js.php
index a6aa5ee..6c89d5f 100644
--- a/wp-includes/js/list-manipulation-js.php
+++ b/wp-includes/js/list-manipulation-js.php
@@ -52,7 +52,7 @@ Object.extend(listMan.prototype, {
tempObj.showLink = id;
});
}
- ajaxAdd.myResponseElement.update(tempObj.showLink ? ( "<div id='jumplink' class='updated fade'><p><a href='#" + what + '-' + tempObj.showLink + "'><?php echo wp_specialchars(__('Jump to new item'), 1); ?></a></p></div>" ) : '');
+ ajaxAdd.myResponseElement.update(tempObj.showLink ? ( "<div id='jumplink' class='updated fade'><p><a href='#" + what + '-' + tempObj.showLink + "'><?php _e('Jump to new item'); ?></a></p></div>" ) : '');
if ( tempObj.addComplete && typeof tempObj.addComplete == 'function' )
tempObj.addComplete( what, where, update, transport );
tempObj.recolorList();
diff --git a/wp-includes/link-template.php b/wp-includes/link-template.php
index 3526f5c..c4002bd 100644
--- a/wp-includes/link-template.php
+++ b/wp-includes/link-template.php
@@ -244,7 +244,7 @@ function edit_comment_link($link = 'Edit This', $before = '', $after = '') {
return;
}
- $location = get_option('siteurl') . "/wp-admin/comment.php?action=editcomment&amp;comment=$comment->comment_ID";
+ $location = get_option('siteurl') . "/wp-admin/comment.php?action=editcomment&amp;c=$comment->comment_ID";
echo $before . "<a href='$location'>$link</a>" . $after;
}
diff --git a/wp-includes/pluggable.php b/wp-includes/pluggable.php
index 57ae28a..18426d6 100644
--- a/wp-includes/pluggable.php
+++ b/wp-includes/pluggable.php
@@ -78,9 +78,7 @@ function get_userdata( $user_id ) {
if ($metavalues) {
foreach ( $metavalues as $meta ) {
- @ $value = unserialize($meta->meta_value);
- if ($value === FALSE)
- $value = $meta->meta_value;
+ $value = maybe_unserialize($meta->meta_value);
$user->{$meta->meta_key} = $value;
// We need to set user_level from meta, not row
@@ -131,9 +129,7 @@ function get_userdatabylogin($user_login) {
if ($metavalues) {
foreach ( $metavalues as $meta ) {
- @ $value = unserialize($meta->meta_value);
- if ($value === FALSE)
- $value = $meta->meta_value;
+ $value = maybe_unserialize($meta->meta_value);
$user->{$meta->meta_key} = $value;
// We need to set user_level from meta, not row
@@ -229,7 +225,7 @@ function auth_redirect() {
wp_clearcookie();
- wp_redirect(get_option('siteurl') . '/wp-login.php?redirect_to=' . urlencode($_SERVER['REQUEST_URI']));
+ wp_redirect(get_option('siteurl') . '/wp-login.php?action=auth&redirect_to=' . urlencode($_SERVER['REQUEST_URI']));
exit();
}
}
@@ -268,6 +264,11 @@ if ( !function_exists('wp_redirect') ) :
function wp_redirect($location, $status = 302) {
global $is_IIS;
+ $location = apply_filters('wp_redirect', $location, $status);
+
+ if ( !$location ) // allows the wp_redirect filter to cancel a redirect
+ return false;
+
$location = preg_replace('|[^a-z0-9-~+_.?#=&;,/:%]|i', '', $location);
$location = wp_kses_no_null($location);
@@ -376,8 +377,8 @@ function wp_notify_postauthor($comment_id, $comment_type='') {
$subject = sprintf( __('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title );
}
$notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
- $notify_message .= sprintf( __('To delete this comment, visit: %s'), get_option('siteurl').'/wp-admin/comment.php?action=confirmdeletecomment&p='.$comment->comment_post_ID."&comment=$comment_id" ) . "\r\n";
- $notify_message .= sprintf( __('To mark this comment as spam, visit: %s'), get_option('siteurl').'/wp-admin/comment.php?action=confirmdeletecomment&delete_type=spam&p='.$comment->comment_post_ID."&comment=$comment_id" ) . "\r\n";
+ $notify_message .= sprintf( __('To delete this comment, visit: %s'), get_option('siteurl')."/wp-admin/comment.php?action=cdc&c=$comment_id" ) . "\r\n";
+ $notify_message .= sprintf( __('To mark this comment as spam, visit: %s'), get_option('siteurl')."/wp-admin/comment.php?action=cdc&dt=spam&c=$comment_id" ) . "\r\n";
$admin_email = get_option('admin_email');
@@ -433,9 +434,9 @@ function wp_notify_moderator($comment_id) {
$notify_message .= sprintf( __('URL : %s'), $comment->comment_author_url ) . "\r\n";
$notify_message .= sprintf( __('Whois : http://ws.arin.net/cgi-bin/whois.pl?queryinput=%s'), $comment->comment_author_IP ) . "\r\n";
$notify_message .= __('Comment: ') . "\r\n" . $comment->comment_content . "\r\n\r\n";
- $notify_message .= sprintf( __('To approve this comment, visit: %s'), get_option('siteurl').'/wp-admin/comment.php?action=mailapprovecomment&p='.$comment->comment_post_ID."&comment=$comment_id" ) . "\r\n";
- $notify_message .= sprintf( __('To delete this comment, visit: %s'), get_option('siteurl').'/wp-admin/comment.php?action=confirmdeletecomment&p='.$comment->comment_post_ID."&comment=$comment_id" ) . "\r\n";
- $notify_message .= sprintf( __('To mark this comment as spam, visit: %s'), get_option('siteurl').'/wp-admin/comment.php?action=confirmdeletecomment&delete_type=spam&p='.$comment->comment_post_ID."&comment=$comment_id" ) . "\r\n";
+ $notify_message .= sprintf( __('To approve this comment, visit: %s'), get_option('siteurl')."/wp-admin/comment.php?action=mac&c=$comment_id" ) . "\r\n";
+ $notify_message .= sprintf( __('To delete this comment, visit: %s'), get_option('siteurl')."/wp-admin/comment.php?action=cdc&c=$comment_id" ) . "\r\n";
+ $notify_message .= sprintf( __('To mark this comment as spam, visit: %s'), get_option('siteurl')."/wp-admin/comment.php?action=cdc&dt=spam&c=$comment_id" ) . "\r\n";
$notify_message .= sprintf( __('Currently %s comments are waiting for approval. Please visit the moderation panel:'), $comments_waiting ) . "\r\n";
$notify_message .= get_option('siteurl') . "/wp-admin/moderation.php\r\n";
diff --git a/wp-includes/plugin.php b/wp-includes/plugin.php
index 7c58519..64ceb9a 100644
--- a/wp-includes/plugin.php
+++ b/wp-includes/plugin.php
@@ -12,9 +12,8 @@ function add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1)
foreach($wp_filter[$tag]["$priority"] as $filter) {
// uncomment if we want to match function AND accepted_args
// if ( $filter == array($function, $accepted_args) ) {
- if ( $filter['function'] == $function_to_add ) {
+ if ( $filter['function'] == $function_to_add )
return true;
- }
}
}
@@ -32,23 +31,20 @@ function apply_filters($tag, $string) {
merge_filters($tag);
- if ( !isset($wp_filter[$tag]) ) {
+ if ( !isset($wp_filter[$tag]) )
return $string;
- }
- foreach ($wp_filter[$tag] as $priority => $functions) {
- if ( !is_null($functions) ) {
- foreach($functions as $function) {
+ foreach ( (array) $wp_filter[$tag] as $priority => $functions ) {
+ if ( !is_null($functions) ) {
+ foreach ( (array) $functions as $function ) {
$function_name = $function['function'];
$accepted_args = $function['accepted_args'];
-
$the_args = $args;
array_unshift($the_args, $string);
if ( $accepted_args > 0 )
$the_args = array_slice($the_args, 0, $accepted_args);
- elseif ( $accepted_args == 0 )
+ elseif ( 0 == $accepted_args )
$the_args = NULL;
-
$string = call_user_func_array($function_name, $the_args);
}
}
@@ -56,11 +52,10 @@ function apply_filters($tag, $string) {
return $string;
}
-
function merge_filters($tag) {
global $wp_filter;
if ( isset($wp_filter['all']) ) {
- foreach ($wp_filter['all'] as $priority => $functions) {
+ foreach ( (array) $wp_filter['all'] as $priority => $functions ) {
if ( isset($wp_filter[$tag][$priority]) )
$wp_filter[$tag][$priority] = array_merge($wp_filter['all'][$priority], $wp_filter[$tag][$priority]);
else
@@ -73,18 +68,15 @@ function merge_filters($tag) {
uksort( $wp_filter[$tag], "strnatcasecmp" );
}
-
-
function remove_filter($tag, $function_to_remove, $priority = 10, $accepted_args = 1) {
global $wp_filter;
// rebuild the list of filters
if ( isset($wp_filter[$tag]["$priority"]) ) {
$new_function_list = array();
- foreach($wp_filter[$tag]["$priority"] as $filter) {
- if ( $filter['function'] != $function_to_remove ) {
+ foreach ( (array) $wp_filter[$tag]["$priority"] as $filter ) {
+ if ( $filter['function'] != $function_to_remove )
$new_function_list[] = $filter;
- }
}
$wp_filter[$tag]["$priority"] = $new_function_list;
}
@@ -115,10 +107,9 @@ function do_action($tag, $arg = '') {
if ( !isset($wp_filter[$tag]) )
return;
- foreach ($wp_filter[$tag] as $priority => $functions) {
+ foreach ( (array) $wp_filter[$tag] as $priority => $functions ) {
if ( !is_null($functions) ) {
- foreach($functions as $function) {
-
+ foreach ( (array) $functions as $function ) {
$function_name = $function['function'];
$accepted_args = $function['accepted_args'];
@@ -160,16 +151,14 @@ function do_action_ref_array($tag, $args) {
if ( !isset($wp_filter[$tag]) )
return;
- foreach ($wp_filter[$tag] as $priority => $functions) {
+ foreach ( (array) $wp_filter[$tag] as $priority => $functions ) {
if ( !is_null($functions) ) {
- foreach($functions as $function) {
-
+ foreach( (array) $functions as $function ) {
$function_name = $function['function'];
$accepted_args = $function['accepted_args'];
-
if ( $accepted_args > 0 )
$the_args = array_slice($args, 0, $accepted_args);
- elseif ( $accepted_args == 0 )
+ elseif ( 0 == $accepted_args )
$the_args = NULL;
else
$the_args = $args;
@@ -196,13 +185,11 @@ function plugin_basename($file) {
function register_activation_hook($file, $function) {
$file = plugin_basename($file);
-
add_action('activate_' . $file, $function);
}
function register_deactivation_hook($file, $function) {
$file = plugin_basename($file);
-
add_action('deactivate_' . $file, $function);
}
diff --git a/wp-includes/post.php b/wp-includes/post.php
index ed1eefb..40606ae 100644
--- a/wp-includes/post.php
+++ b/wp-includes/post.php
@@ -229,13 +229,12 @@ function add_post_meta($post_id, $key, $value, $unique = false) {
}
}
- $original = $value;
- if ( is_array($value) || is_object($value) )
- $value = $wpdb->escape(serialize($value));
+ $post_meta_cache[$blog_id][$post_id][$key][] = $original;
- $wpdb->query("INSERT INTO $wpdb->postmeta (post_id,meta_key,meta_value) VALUES ('$post_id','$key','$value')");
+ $value = maybe_serialize($value);
+ $value = $wpdb->escape($value);
- $post_meta_cache[$blog_id][$post_id][$key][] = $original;
+ $wpdb->query("INSERT INTO $wpdb->postmeta (post_id,meta_key,meta_value) VALUES ('$post_id','$key','$value')");
return true;
}
@@ -275,34 +274,17 @@ function get_post_meta($post_id, $key, $single = false) {
$post_id = (int) $post_id;
- if ( isset($post_meta_cache[$blog_id][$post_id][$key]) ) {
- if ( $single ) {
- return maybe_unserialize( $post_meta_cache[$blog_id][$post_id][$key][0] );
- } else {
- return maybe_unserialize( $post_meta_cache[$blog_id][$post_id][$key] );
- }
- }
-
- $metalist = $wpdb->get_results("SELECT meta_value FROM $wpdb->postmeta WHERE post_id = '$post_id' AND meta_key = '$key'", ARRAY_N);
-
- $values = array();
- if ( $metalist ) {
- foreach ($metalist as $metarow) {
- $values[] = $metarow[0];
- }
- }
+ if ( !isset($post_meta_cache[$blog_id][$post_id]) )
+ update_postmeta_cache($post_id);
if ( $single ) {
- if ( count($values) ) {
- $return = maybe_unserialize( $values[0] );
- } else {
+ if ( isset($post_meta_cache[$blog_id][$post_id][$key][0]) )
+ return maybe_unserialize($post_meta_cache[$blog_id][$post_id][$key][0]);
+ else
return '';
- }
- } else {
- $return = $values;
+ } else {
+ return maybe_unserialize($post_meta_cache[$blog_id][$post_id][$key]);
}
-
- return maybe_unserialize($return);
}
function update_post_meta($post_id, $key, $value, $prev_value = '') {
@@ -311,12 +293,12 @@ function update_post_meta($post_id, $key, $value, $prev_value = '') {
$post_id = (int) $post_id;
$original_value = $value;
- if ( is_array($value) || is_object($value) )
- $value = $wpdb->escape(serialize($value));
+ $value = maybe_serialize($value);
+ $value = $wpdb->escape($value);
$original_prev = $prev_value;
- if ( is_array($prev_value) || is_object($prev_value) )
- $prev_value = $wpdb->escape(serialize($prev_value));
+ $prev_value = maybe_serialize($prev_value);
+ $prev_value = $wpdb->escape($prev_value);
if (! $wpdb->get_var("SELECT meta_key FROM $wpdb->postmeta WHERE meta_key = '$key' AND post_id = '$post_id'") ) {
return false;
@@ -341,43 +323,24 @@ function update_post_meta($post_id, $key, $value, $prev_value = '') {
}
-function get_post_custom( $post_id = 0 ) {
+function get_post_custom($post_id = 0) {
global $id, $post_meta_cache, $wpdb, $blog_id;
- if ( ! $post_id )
+ if ( !$post_id )
$post_id = $id;
$post_id = (int) $post_id;
- if ( isset($post_meta_cache[$blog_id][$post_id]) )
- return $post_meta_cache[$blog_id][$post_id];
-
- if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE post_id = '$post_id' ORDER BY post_id, meta_key", ARRAY_A) ) {
- // Change from flat structure to hierarchical:
- $post_meta_cache = array();
- foreach ( $meta_list as $metarow ) {
- $mpid = (int) $metarow['post_id'];
- $mkey = $metarow['meta_key'];
- $mval = $metarow['meta_value'];
+ if ( !isset($post_meta_cache[$blog_id][$post_id]) )
+ update_postmeta_cache($post_id);
- // Force subkeys to be array type:
- if ( !isset($post_meta_cache[$blog_id][$mpid]) || !is_array($post_meta_cache[$blog_id][$mpid]) )
- $post_meta_cache[$blog_id][$mpid] = array();
-
- if ( !isset($post_meta_cache[$blog_id][$mpid]["$mkey"]) || !is_array($post_meta_cache[$blog_id][$mpid]["$mkey"]) )
- $post_meta_cache[$blog_id][$mpid]["$mkey"] = array();
-
- // Add a value to the current pid/key:
- $post_meta_cache[$blog_id][$mpid][$mkey][] = $mval;
- }
- return $post_meta_cache[$blog_id][$mpid];
- }
+ return $post_meta_cache[$blog_id][$post_id];
}
function get_post_custom_keys( $post_id = 0 ) {
$custom = get_post_custom( $post_id );
- if ( ! is_array($custom) )
+ if ( !is_array($custom) )
return;
if ( $keys = array_keys($custom) )
@@ -983,6 +946,16 @@ function get_page_by_path($page_path, $output = OBJECT) {
return NULL;
}
+function get_page_by_title($page_title, $output = OBJECT) {
+ global $wpdb;
+ $page_title = $wpdb->escape($page_title);
+ $page = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$page_title' AND post_type='page'");
+ if ( $page )
+ return get_page($page, $output);
+
+ return NULL;
+}
+
function &get_page_children($page_id, $pages) {
global $page_cache, $blog_id;
@@ -1305,7 +1278,7 @@ function wp_insert_attachment($object, $file = false, $post_parent = 0) {
wp_set_post_categories($post_ID, $post_category);
if ( $file )
- add_post_meta($post_ID, '_wp_attached_file', quotemeta( $file ) );
+ add_post_meta($post_ID, '_wp_attached_file', $file);
clean_post_cache($post_ID);
diff --git a/wp-includes/query.php b/wp-includes/query.php
index c1b88ec..b2dd69d 100644
--- a/wp-includes/query.php
+++ b/wp-includes/query.php
@@ -254,7 +254,7 @@ function the_post() {
class WP_Query {
var $query;
- var $query_vars;
+ var $query_vars = array();
var $queried_object;
var $queried_object_id;
var $request;
@@ -315,7 +315,7 @@ class WP_Query {
function init () {
unset($this->posts);
unset($this->query);
- unset($this->query_vars);
+ $this->query_vars = array();
unset($this->queried_object);
unset($this->queried_object_id);
$this->post_count = 0;
@@ -743,29 +743,26 @@ class WP_Query {
// If a search pattern is specified, load the posts that match
if (!empty($q['s'])) {
- $q['s'] = addslashes_gpc($q['s']);
- $search = ' AND (';
- $q['s'] = preg_replace('/, +/', ' ', $q['s']);
- $q['s'] = str_replace(',', ' ', $q['s']);
- $q['s'] = str_replace('"', ' ', $q['s']);
- $q['s'] = trim($q['s']);
- if ($q['exact']) {
- $n = '';
- } else {
- $n = '%';
+ // added slashes screw with quote grouping when done early, so done later
+ $q['s'] = stripslashes($q['s']);
+ if ($q['sentence']) {
+ $q['search_terms'] = array($q['s']);
}
- if (!$q['sentence']) {
- $s_array = explode(' ',$q['s']);
- $q['search_terms'] = $s_array;
- $search .= '((post_title LIKE \''.$n.$s_array[0].$n.'\') OR (post_content LIKE \''.$n.$s_array[0].$n.'\'))';
- for ( $i = 1; $i < count($s_array); $i = $i + 1) {
- $search .= ' AND ((post_title LIKE \''.$n.$s_array[$i].$n.'\') OR (post_content LIKE \''.$n.$s_array[$i].$n.'\'))';
- }
- $search .= ' OR (post_title LIKE \''.$n.$q['s'].$n.'\') OR (post_content LIKE \''.$n.$q['s'].$n.'\')';
- $search .= ')';
- } else {
- $search = ' AND ((post_title LIKE \''.$n.$q['s'].$n.'\') OR (post_content LIKE \''.$n.$q['s'].$n.'\'))';
+ else {
+ preg_match_all('/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $q[s], $matches);
+ $q['search_terms'] = array_map(create_function('$a', 'return trim($a, "\\"\'\\n\\r ");'), $matches[0]);
+ }
+ $n = ($q['exact']) ? '' : '%';
+ $searchand = '';
+ foreach((array)$q['search_terms'] as $term) {
+ $term = addslashes_gpc($term);
+ $search .= "{$searchand}((post_title LIKE '{$n}{$term}{$n}') OR (post_content LIKE '{$n}{$term}{$n}'))";
+ $searchand = ' AND ';
}
+ $term = addslashes_gpc($q['s']);
+ if (!$q['sentence'] && count($q['search_terms']) > 1 && $q['search_terms'][0] != $q['s'] ) $search .= " OR (post_title LIKE '{$n}{$term}{$n}') OR (post_content LIKE '{$n}{$term}{$n}')";
+
+ $search = " AND ({$search}) ";
}
// Category stuff
diff --git a/wp-includes/user.php b/wp-includes/user.php
index bdf537d..d5828bb 100644
--- a/wp-includes/user.php
+++ b/wp-includes/user.php
@@ -114,9 +114,11 @@ function update_usermeta( $user_id, $meta_key, $meta_value ) {
return false;
$meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
- if ( is_array($meta_value) || is_object($meta_value) )
- $meta_value = serialize($meta_value);
- $meta_value = trim( $meta_value );
+ // FIXME: usermeta data is assumed to be already escaped
+ if ( is_string($meta_value) )
+ $meta_value = stripslashes($meta_value);
+ $meta_value = maybe_serialize($meta_value);
+ $meta_value = $wpdb->escape($meta_value);
if (empty($meta_value)) {
return delete_usermeta($user_id, $meta_key);
@@ -166,4 +168,4 @@ function setup_userdata($user_id = '') {
$user_identity = $user->display_name;
}
-?> \ No newline at end of file
+?>
diff --git a/wp-includes/wpmu-functions.php b/wp-includes/wpmu-functions.php
index 27a158d..cbc8263 100644
--- a/wp-includes/wpmu-functions.php
+++ b/wp-includes/wpmu-functions.php
@@ -418,7 +418,7 @@ function get_users_of_blog( $id = '' ) {
return $users;
}
-function get_blogs_of_user( $id ) {
+function get_blogs_of_user( $id, $all = false ) {
global $wpdb, $wpmuBaseTablePrefix;
$user = get_userdata( $id );
@@ -433,7 +433,7 @@ function get_blogs_of_user( $id ) {
if ( strstr( $key, '_capabilities') && strstr( $key, 'wp_') ) {
preg_match('/wp_(\d+)_capabilities/', $key, $match);
$blog = get_blog_details( $match[1] );
- if ( $blog && $blog->deleted == 0 && isset( $blog->domain ) ) {
+ if ( $blog && isset( $blog->domain ) && ( $all == false && $blog->deleted == 0 || $all == true ) ) {
$blogs[$match[1]]->userblog_id = $match[1];
$blogs[$match[1]]->domain = $blog->domain;
$blogs[$match[1]]->path = $blog->path;
@@ -444,6 +444,47 @@ function get_blogs_of_user( $id ) {
return $blogs;
}
+function get_active_blog_for_user( $user_id ) { // get an active blog for user - either primary blog or from blogs list
+ $primary_blog = get_usermeta( $user_id, "primary_blog" );
+ if( $primary_blog == false ) {
+ $details = false;
+ } else {
+ $details = get_blog_details( $primary_blog );
+ }
+
+ if( ( is_object( $details ) == false ) || ( is_object( $details ) && $details->archived == 1 || $details->spam == 1 || $details->deleted == 1 ) ) {
+ $blogs = get_blogs_of_user( $user_id, true ); // if a user's primary blog is shut down, check their other blogs.
+ $ret = false;
+ if( is_array( $blogs ) && count( $blogs ) > 0 ) {
+ foreach( $blogs as $blog_id => $blog ) {
+ $details = get_blog_details( $blog_id );
+ if( is_object( $details ) && $details->archived == 0 && $details->spam == 0 && $details->deleted == 0 ) {
+ $ret = $blog;
+ break;
+ }
+ }
+ } else {
+ $ret = "username only"; // user has no blogs. We can add details for dashboard.wordpress.com here.
+ }
+ return $ret;
+ } else {
+ return $details;
+ }
+}
+
+function is_user_member_of_blog( $user_id, $blog_id = 0 ) {
+ global $wpdb;
+ if( $blog_id == 0 )
+ $blog_id = $wpdb->blogid;
+
+ $blogs = get_blogs_of_user( $user_id );
+ if( is_array( $blogs ) ) {
+ return array_key_exists( $blog_id, $blogs );
+ } else {
+ return false;
+ }
+}
+
function is_archived( $id ) {
return get_blog_status($id, 'archived');
}
diff --git a/wp-login.php b/wp-login.php
index cfc10f7..1cd7933 100644
--- a/wp-login.php
+++ b/wp-login.php
@@ -23,7 +23,7 @@ if ( defined('RELOCATE') ) { // Move flag is set
// Rather than duplicating this HTML all over the place, we'll stick it in function
function login_header($title = 'Login', $message = '') {
- global $errors, $error, $wp_locale;
+ global $errors, $error, $wp_locale, $current_site;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
@@ -133,7 +133,7 @@ case 'retrievepassword' :
if ( 'invalidkey' == $_GET['error'] ) $errors['invalidkey'] = __('Sorry, that key does not appear to be valid.');
do_action('lost_password');
- login_header(__('Lost Password'), '<p class="message">' . __('Please enter your username and e-mail address. You will recieve a new password via e-mail.') . '</p>');
+ login_header(__('Lost Password'), '<p class="message">' . __('Please enter your username and e-mail address. You will receive a new password via e-mail.') . '</p>');
?>
<form name="lostpasswordform" id="lostpasswordform" action="wp-login.php?action=lostpassword" method="post">
@@ -263,7 +263,7 @@ default:
login_header(__('Login'));
?>
-<form name="loginform" id="loginform" action="wp-login.php" method="post">
+<form name="loginform" id="loginform" action="https://<?php echo $current_blog->domain . $current_blog->path ?>wp-login.php" method="post">
<p>
<label><?php _e('Username:') ?><br />
<input type="text" name="log" id="user_login" class="input" value="<?php echo wp_specialchars(stripslashes($user_login), 1); ?>" size="20" tabindex="10" /></label>
diff --git a/wp-settings.php b/wp-settings.php
index 54a24df..d82c124 100644
--- a/wp-settings.php
+++ b/wp-settings.php
@@ -90,8 +90,14 @@ if ( defined('WP_CACHE') )
require (ABSPATH . 'wp-content/advanced-cache.php');
define('WPINC', 'wp-includes');
-if ( !defined('LANGDIR') )
- define('LANGDIR', WPINC . '/languages'); // no leading slash, no trailing slash
+
+if ( !defined('LANGDIR') ) {
+ if ( file_exists(ABSPATH . 'wp-content/languages') && @is_dir(ABSPATH . 'wp-content/languages') )
+ define('LANGDIR', 'wp-content/languages'); // no leading slash, no trailing slash
+ else
+ define('LANGDIR', WPINC . '/languages'); // no leading slash, no trailing slash
+}
+
if ( !defined('PLUGINDIR') )
define('PLUGINDIR', 'wp-content/plugins'); // no leading slash, no trailing slash
if ( file_exists(ABSPATH . 'wp-content/db.php') )
diff --git a/xmlrpc.php b/xmlrpc.php
index d8f75df..2437d27 100644
--- a/xmlrpc.php
+++ b/xmlrpc.php
@@ -134,7 +134,7 @@ class wp_xmlrpc_server extends IXR_Server {
function escape(&$array) {
global $wpdb;
- foreach ($array as $k => $v) {
+ foreach ( (array) $array as $k => $v ) {
if (is_array($v)) {
$this->escape($array[$k]);
} else if (is_object($v)) {