Make WordPress Core

Ticket #2665: xanga_LATEST.php

File xanga_LATEST.php, 8.7 KB (added by everglow, 19 years ago)

Completed version. Enjoy!

Line 
1<?php
2
3//Xanga archive importer by Jeremy Jay
4//Borrows heavily from the LiveJournal import script.
5//
6//Modified for current WP (2.1+) release and for current Xanga archive style by Daniel Kozlowski
7//
8//ATTN: unhtmlentities() has been disabled due to it's turning all ". " into ".? "
9// once the post was imported into wordpress 2.1. Thus, it has been disabled. If
10// you're using a version of PHP earlier than 4.3, you'll need to un-comment
11// calls to unhtmlentities() in this script. They are on lines 82 and 120.
12//
13//ATTN: I've run into some Xanga archives where the timestamp for a post or comment is
14// missing a zero. For example, "12:08" is printed as "12:8". This script
15// cannot read those! Please read through your code if some of the times are
16// coming up weird once you've imported the archive files.
17
18
19class Xanga_Import {
20
21 var $file;
22
23 function header() {
24 echo '<div class="wrap">';
25 echo '<h2>'.__('Import Xanga').'</h2>';
26 }
27
28 function footer() {
29 echo '</div>';
30 }
31
32 function unhtmlentities($string) { // From php.net for < 4.3 compatability
33 $trans_tbl = get_html_translation_table(HTML_ENTITIES);
34 $trans_tbl = array_flip($trans_tbl);
35 return strtr($string, $trans_tbl);
36 }
37
38 function greet() {
39 echo '<p>'.__('Howdy! This importer allows you to extract posts and comments from Xanga Premium Archive files into your blog. If you do not have Premium but have enough posts to be looking at this, just pay $4 for a month to get the archive and you will at least be supporting Xanga for all the hosting they have done for you. Pick an archive file to upload and click Import.').'</p>';
40 wp_import_upload_form("admin.php?import=xanga&amp;step=1");
41 }
42
43 function import_posts() {
44 global $wpdb, $current_user;
45
46 set_magic_quotes_runtime(0);
47 $importdata = file($this->file); // Read the file into an array
48 $importdata = implode('', $importdata); // squish it
49 $importdata = str_replace(array ("\r\n", "\r"), "\n", $importdata);
50
51 preg_match_all('|<div class="blogheader">(.*?)<hr size=1 noshade>(<div class="blogheader">)*?|is', $importdata, $posts);
52 $posts = $posts[1];
53 unset($importdata);
54 echo '<ol>';
55
56 foreach ($posts as $post) {
57 flush();
58 preg_match('|^(.*?)</div>|is', $post, $post_title);
59 $post_title = $wpdb->escape(trim($post_title[1]));
60
61 preg_match('/<div class="smalltext">Posted (.*?)\/(.*?)\/(.*?) at (.*?) (.*?)<\/div>/is', $post, $match);
62 list($hour,$min) = explode(':',$match[4]);
63 switch($match[5]) {
64 case 'AM' : if($hour == 12) $hour = 0; break;
65 case 'PM': if($hour < 12) $hour += 12; break;
66 }
67 $match[4] = "$hour:$min";
68 $post_date = "$match[3]-$match[1]-$match[2] $match[4]:00";
69 echo "Date: $post_date";
70
71 $com = split(' ', $post_title);
72
73 if( $com[1]=='Comments' ) {
74 preg_match_all('|<div class="ctextfooterwrap"><div class="ctext">(.*?)</div></div>|is', $post, $comments);
75 $comments = $comments[1];
76
77 $comment_post_ID = $post_id;
78 $num_comments = 0;
79 foreach ($comments as $comment) {
80 preg_match('|^(.*?)</div><div class="cfooter">|is', $comment, $comment_content);
81 $comment_content = str_replace(array ('<![CDATA[', ']]>'), '', trim($comment_content[1]));
82 //$comment_content = $this->unhtmlentities($comment_content);
83
84 // Clean up content
85 $comment_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $comment_content);
86 $comment_content = str_replace('<br>', '<br />', $comment_content);
87 $comment_content = str_replace('<hr>', '<hr />', $comment_content);
88 $comment_content = $wpdb->escape($comment_content);
89
90 preg_match('/<div class="cfooter">Posted (.*?)\/(.*?)\/(.*?) at (.*?) (.*?) by/i', $comment, $match);
91 list($hour,$min) = explode(':',$match[4]);
92 switch($match[5]) {
93 case 'AM' : if($hour == 12) $hour = 0; break;
94 case 'PM': if($hour < 12) $hour += 12; break;
95 }
96 $match[4] = "$hour:$min";
97 $comment_date = "$match[3]-$match[1]-$match[2] $match[4]:00";
98
99 preg_match('|<a href="http://www\.xanga\.com/home\.aspx\?user=(.*?)">(.*?)</a>|i', $comment, $comment_author);
100 $comment_author = $wpdb->escape(trim($comment_author[1]));
101 $comment_author_url = 'http://www.xanga.com/home.aspx?user='.$comment_author;
102
103 $comment_approved = 1;
104 // Check if it's already there
105 if (!comment_exists($comment_author, $comment_date)) {
106 $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_date', 'comment_content', 'comment_approved');
107 $commentdata = wp_filter_comment($commentdata);
108 wp_insert_comment($commentdata);
109 $num_comments++;
110 }
111 }
112 if ( $num_comments ) {
113 echo ' ';
114 printf(__('(%s comments)'), $num_comments);
115 }
116 } else {
117
118 preg_match('|<td style="padding-left:20; padding-bottom:20">(.*?)<div class="smalltext">Posted (\d{1,2}/\d{1,2}/\d{4}) at (.*?)<\/div>|is', $post, $post_content);
119 $post_content = str_replace(array ('<![CDATA[', ']]>'), '', trim($post_content[1]));
120 //$post_content = $this->unhtmlentities($post_content);
121
122 // Clean up content
123 $post_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $post_content);
124 $post_content = str_replace('<br>', '<br />', $post_content);
125 $post_content = str_replace('<hr>', '<hr />', $post_content);
126
127 //Xanga archives have some pretty crappy formatting, so this reduces the string to a single line.
128 //THIS WILL NOT REMOVE YOUR OWN FORMATTING. Any formatting changes you created in your posts
129 //are tagged, and thus will not be affected by the removal.
130 $post_content = str_replace("\n", " ", $post_content);
131 $post_content = $wpdb->escape($post_content);
132
133 $post_author = $current_user->ID;
134 $post_status = 'publish';
135
136 echo '<li>';
137 if ($post_id = post_exists($post_title, $post_content, $post_date)) {
138 printf(__('Post <i>%s</i> already exists.'), stripslashes($post_title));
139 } else {
140 printf(__('Importing post <i>%s</i>...'), stripslashes($post_title));
141 $postdata = compact('post_author', 'post_date', 'post_content', 'post_title', 'post_status');
142 $post_id = wp_insert_post($postdata);
143 if (!$post_id) {
144 _e("Couldn't get post ID");
145 echo '</li>';
146 break;
147 }
148 }
149 }
150
151 echo '</li>';
152 flush();
153 ob_flush();
154 }
155 echo '</ol>';
156 }
157
158 function import() {
159 $file = wp_import_handle_upload();
160 if ( isset($file['error']) ) {
161 echo $file['error'];
162 return;
163 }
164
165 $this->file = $file['file'];
166 $this->import_posts();
167 wp_import_cleanup($file['id']);
168
169 echo '<h3>';
170 printf(__('All done. <a href="%s">Have fun!</a>'), get_option('home'));
171 echo '</h3>';
172 }
173
174 function dispatch() {
175 if (empty ($_GET['step']))
176 $step = 0;
177 else
178 $step = (int) $_GET['step'];
179
180 $this->header();
181
182 switch ($step) {
183 case 0 :
184 $this->greet();
185 break;
186 case 1 :
187 $this->import();
188 break;
189 }
190
191 $this->footer();
192 }
193
194 function Xanga_Import() {
195 // Nothing.
196 }
197}
198
199$xanga_import = new Xanga_Import();
200
201register_importer('xanga', 'Xanga', __('Import posts from Xanga Archives'), array ($xanga_import, 'dispatch'));
202?>
203