1 | <?php
|
---|
2 |
|
---|
3 | /*
|
---|
4 | Plugin Name: Parteibuch RSS Aggregator
|
---|
5 | Plugin URI: http://www.mein-parteibuch.com/blog/parteibuch-aggregator/
|
---|
6 | Description: A template based RSS Aggregator with search capability. After first activation <a href="edit.php?page=parteibuch-aggregator/bdp-rssadmin.php&action=editpbaoutput&pboutput=1&pbstart=1">start configuration here</a>
|
---|
7 | Version: 0.5.2
|
---|
8 | Author: Mein Parteibuch
|
---|
9 | Author URI: http://www.mein-parteibuch.com/
|
---|
10 |
|
---|
11 | The Parteibuch Aggregator is
|
---|
12 | based on Bryan Palmers (bryan@ozpolitics.info)
|
---|
13 | http://www.ozpolitics.info/blog/?p=87
|
---|
14 | BDP RSS Aggregator.
|
---|
15 |
|
---|
16 | Thank Bryan for the great work, but please don't bother
|
---|
17 | him with support requests for the Parteibuch Aggregator.
|
---|
18 |
|
---|
19 | Bookmarks come from social bookmarks plugin.
|
---|
20 |
|
---|
21 | Note: tabs set to two spaces
|
---|
22 | */
|
---|
23 |
|
---|
24 | /* Copyright 2009 Mein Parteibuch (email : katzen_no_xxx_spam_freund@mein-parteibuch.com)
|
---|
25 |
|
---|
26 | This program is free software; you can redistribute it and/or modify
|
---|
27 | it under the terms of the GNU General Public License as published by
|
---|
28 | the Free Software Foundation; either version 2 of the License, or
|
---|
29 | (at your option) any later version.
|
---|
30 |
|
---|
31 | This program is distributed in the hope that it will be useful,
|
---|
32 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
33 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
34 | GNU General Public License for more details.
|
---|
35 |
|
---|
36 | You should have received a copy of the GNU General Public License
|
---|
37 | along with this program; if not, write to the Free Software
|
---|
38 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
---|
39 | */
|
---|
40 |
|
---|
41 | /* ----- constants ----- */
|
---|
42 | define ('PBA_PRODUCT', 'Parteibuch Aggregator'); // Doh!
|
---|
43 | define ('PBA_VERSION', '0.5.2'); // CHECK: should be the same as above!
|
---|
44 | define ('PBA_DIRECTORY', 'parteibuch-aggregator'); // base in plugins directory
|
---|
45 |
|
---|
46 | define ('PBA_CACHE_PATH',dirname(__FILE__)."/pbacache/"); // the directory to be used as disk cache
|
---|
47 | define ('BDPRSS2_DEBUG', FALSE);
|
---|
48 |
|
---|
49 | /* ----- initialisation ----- */
|
---|
50 |
|
---|
51 | if ( !(phpversion() >= '5.0') )
|
---|
52 | die( 'Your server is running PHP version ' . phpversion() .
|
---|
53 | ' but the Parteibuch Aggregator Wordpress plugin requires at least 5.0' );
|
---|
54 |
|
---|
55 | if( !function_exists('mb_internal_encoding') || !function_exists('mb_regex_encoding') )
|
---|
56 | die( 'Your installation of PHP does not appear to support multibyte strings. '.
|
---|
57 | 'This support is needed by the Parteibuch Aggregator plugin. '.
|
---|
58 | 'You should ask your web-hoster to install it; it is easy to install. '.
|
---|
59 | 'For more information, refer to <a href="http://www.phpbuilder.com/manual/ref.mbstring.php">'.
|
---|
60 | 'http://www.phpbuilder.com/manual/ref.mbstring.php</a>.');
|
---|
61 |
|
---|
62 | //$timeshift=get_option('gmt_offset');
|
---|
63 | //echo $timeshift;
|
---|
64 |
|
---|
65 | /* ----- includes ----- */
|
---|
66 | if( !class_exists('Snoopy') ) require_once(ABSPATH."wp-includes/class-snoopy.php");
|
---|
67 | if(defined('WPLANG') && file_exists(dirname(__FILE__) . '/pba-defaultparameter_'. substr(WPLANG,0,2) .'.php')){
|
---|
68 | include_once(dirname(__FILE__) . '/pba-defaultparameter_'. substr(WPLANG,0,2) .'.php');
|
---|
69 | }else{
|
---|
70 | include_once(dirname(__FILE__) . '/pba-defaultparameter.php');
|
---|
71 | }
|
---|
72 |
|
---|
73 | require_once(dirname(__FILE__) . '/bdp-rssaggregator-db.php');
|
---|
74 | require_once(dirname(__FILE__) . '/bdp-rssfeed.php');
|
---|
75 |
|
---|
76 | /* ----- main game ----- */
|
---|
77 | if( !class_exists('BDPRSS2') ) // for protection only
|
---|
78 | {
|
---|
79 | /* ----- globals ----- */
|
---|
80 |
|
---|
81 | // this seems to be the first reliable header, let us test, when it is called, just testing, it seems to be loaded before headers are sent
|
---|
82 | //add_action('plugins_loaded', array('BDPRSS2', 'testingheaders'));
|
---|
83 |
|
---|
84 | // this seems to be the first reliable header, let us test, when it is called, just testing, it seems usually to be loaded before headers are sent
|
---|
85 | //add_action('init', array('BDPRSS2', 'testingheaders'));
|
---|
86 |
|
---|
87 | add_action('template_redirect', array('BDPRSS2', 'pba_catch_template_redirect'));
|
---|
88 | add_action('wp_head', array('BDPRSS2', 'tag')); // advertising
|
---|
89 | add_action('admin_menu', array('BDPRSS2', 'adminMenu')); // link in the relevant admin menus
|
---|
90 | add_action('shutdown', array('BDPRSS2', 'pba_shutdown')); // routine updating
|
---|
91 | add_filter('the_content', array('BDPRSS2', 'replace_page_content'));
|
---|
92 | add_filter('rewrite_rules_array', array('BDPRSS2', 'pba_rewrite'));
|
---|
93 | if(function_exists('register_deactivation_hook')) register_deactivation_hook( __FILE__, 'pba_uninstaller' );
|
---|
94 |
|
---|
95 | function pba_uninstaller(){
|
---|
96 | global $bdprss_db;
|
---|
97 | if($bdprss_db->pbaoption('delete_alldata') == 'Y'){
|
---|
98 | //echo 'Parteibuch Aggregator: "Delete all data" option set';
|
---|
99 | $bdprss_db->reset();
|
---|
100 | }else{
|
---|
101 | true;
|
---|
102 | //nothing to do, we are before sending headers, so we can't send a message to the user
|
---|
103 | //echo 'Parteibuch Aggregator: "Delete all data" option not set, keeping data for reactivation of the aggregator plugin.';
|
---|
104 | }
|
---|
105 | }
|
---|
106 |
|
---|
107 | //like to have some widgets? here you have:
|
---|
108 | include_once(dirname(__FILE__) . '/pba-widgets.php');
|
---|
109 |
|
---|
110 | $bdprssTagSet = array(
|
---|
111 | 'Links' => array('a'),
|
---|
112 | 'Images' => array('img'),
|
---|
113 | 'Paragraphs' => array('p'),
|
---|
114 | 'Line breaks' => array('br'),
|
---|
115 | 'Italics' => array('em', 'i'),
|
---|
116 | 'Underlining' => array('u'),
|
---|
117 | 'Bolding' => array('b', 'strong'),
|
---|
118 | 'Spans' => array('span'),
|
---|
119 | 'Text formating'=> array('abbr', 'cite', 'code', 'dfn', 'kbd', 'object', 'pre',
|
---|
120 | 'quote', 'ruby', 'samp', 'strike', 'style', 'sub', 'sup', 'var' ),
|
---|
121 | 'Tables' => array('table', 'tr', 'th', 'td', 'thead', 'tbody', 'tfoot'),
|
---|
122 | 'Lists' => array('ol', 'ul', 'dl', 'nl', 'li', 'di', 'dd', 'dt', 'label'),
|
---|
123 | 'Headings' => array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'),
|
---|
124 | 'Block quotes' => array('blockquote'),
|
---|
125 | 'Divisions' => array('div'),
|
---|
126 | 'Separators' => array('separator', 'hr')
|
---|
127 | );
|
---|
128 |
|
---|
129 | $bdprssdate = "bdprssarchivedate";
|
---|
130 | $bdprssCacheItem = "bdprsscacheitem";
|
---|
131 | $bdprssList = "bdprsslist";
|
---|
132 |
|
---|
133 | //globals
|
---|
134 |
|
---|
135 | $remember_pbapage=false;
|
---|
136 |
|
---|
137 | class BDPRSS2
|
---|
138 | {
|
---|
139 | /* --- hooks --- */
|
---|
140 |
|
---|
141 | //some functions triggered by the hooks
|
---|
142 |
|
---|
143 |
|
---|
144 | function pba_rewrite(&$rules){
|
---|
145 |
|
---|
146 | global $bdprss_db;
|
---|
147 | $pbadefault=$bdprss_db->pbaoption('enable_rewriting'); // can we access this already when generating rewrite rules?
|
---|
148 | $doit=false;
|
---|
149 | if(isset($pbadefault)) {
|
---|
150 | if($pbadefault == 'Y' && count($rules) > 5) $doit = true;
|
---|
151 | }
|
---|
152 | //hook and function is only fired, when rewrite rules are recreated
|
---|
153 | //Now the funny part
|
---|
154 | $pba_rules = array(
|
---|
155 | //tickersucheregex
|
---|
156 | '(.+?)?/s/[^/]+(/tickerpage/[0-9]+)?(/feed)?/?$' => 'index.php?&pagename=$matches[1]',
|
---|
157 | //kalenderregex
|
---|
158 | '([^/]+?)/([kc]alend[ae]r|opml|feedlist|ticker-feed|tickerpage)(/[0-9/-]+)?/?$' => 'index.php?&pagename=$matches[1]',
|
---|
159 | //dateregex
|
---|
160 | '(.+?)?/?[0-9]{4}-[0-9]{2}-[0-9]{2}(/tickerpage/[0-9]{1,}|/feed|/ticker-feed)?/?$' => 'index.php?&pagename=$matches[1]',
|
---|
161 | //cacheregex
|
---|
162 | '([^/page0-9]+?)/([0-9]+)/?$' => 'index.php?&pagename=$matches[1]'
|
---|
163 | );
|
---|
164 |
|
---|
165 | //echo "Debug: myrules: " . print_r($pba_rules);
|
---|
166 | if($doit) $rules = array_merge($pba_rules, $rules);
|
---|
167 |
|
---|
168 | //tricky stuff: the following line will make the rewrite entry in mstatustable be recreated at next page call
|
---|
169 | //if we would just recreate the memtablestatus rewriting row now, then the rules change would
|
---|
170 | //not be detected, because wordpress is not finished processing the rule
|
---|
171 |
|
---|
172 | $bdprss_db->mark_entry_as_old_in_statustable('rewriting');
|
---|
173 |
|
---|
174 | return $rules;
|
---|
175 | }
|
---|
176 |
|
---|
177 | //see here, MSIE is buggy http://us3.php.net/manual/en/function.ob-gzhandler.php#84493
|
---|
178 | function isBuggyIe() {
|
---|
179 | $ua = $_SERVER['HTTP_USER_AGENT'];
|
---|
180 | // quick escape for non-IEs
|
---|
181 | if (0 !== strpos($ua, 'Mozilla/4.0 (compatible; MSIE ')
|
---|
182 | || false !== strpos($ua, 'Opera')) {
|
---|
183 | return false;
|
---|
184 | }
|
---|
185 | // no regex = faaast
|
---|
186 | $version = (float)substr($ua, 30);
|
---|
187 | return ( $version <= 8 );
|
---|
188 | }
|
---|
189 |
|
---|
190 | function pba_catch_template_redirect(){
|
---|
191 | //here some lines to debug rewrite rules
|
---|
192 | //global $post;
|
---|
193 | //echo "<br><b>We passed pba_catch_template_redirect, post is: " . PBALIB::get_r($post) . "</b>";
|
---|
194 | //echo "The rules are: " . str_replace("\n",'<br>',PBALIB::get_r(get_option('rewrite_rules')));
|
---|
195 |
|
---|
196 | if(is_page()){
|
---|
197 |
|
---|
198 | global $remember_pbapage;
|
---|
199 | $pba_page_config['getoutputconfigbypageid']=true;
|
---|
200 | $pba_page=@PBA::outputwrapper($pba_page_config);
|
---|
201 |
|
---|
202 | if(isset($pba_page['shutdown']) && $pba_page['shutdown'] === true) {
|
---|
203 | BDPRSS2::isBuggyIe() || ob_start("ob_gzhandler");
|
---|
204 | echo $pba_page['result']; //xml output goes here
|
---|
205 | do_action('shutdown');
|
---|
206 | wp_cache_close();
|
---|
207 | exit;
|
---|
208 | } elseif(isset($pba_page['redirect']) && $pba_page['redirect'] === true){
|
---|
209 | //do redirect
|
---|
210 | header("Location: " . $pba_page['result']);
|
---|
211 | exit;
|
---|
212 | } else {
|
---|
213 | if($pba_page['result'] !== false){
|
---|
214 | $remember_pbapage=$pba_page;
|
---|
215 | }
|
---|
216 | }
|
---|
217 | }
|
---|
218 | }
|
---|
219 |
|
---|
220 | function tag()
|
---|
221 | {
|
---|
222 | /* tag()
|
---|
223 | * -- called early on to place a comment tag in the page
|
---|
224 | * -- I use the tag when people ask for help debugging why the plugin doesn't work for them.
|
---|
225 | */
|
---|
226 | global $bdprss_db;
|
---|
227 | // echo "\n\t<!-- ".PBA_PRODUCT." " .PBA_VERSION. " -->\n";
|
---|
228 | //parteibuch deactiveated due to security concerns if( $bdprss_db->get_mysql_version() < '4.0' )
|
---|
229 | //parteibuch deactiveated due to security concerns echo "\t<!-- Warning: Your version of MySQL (" . $bdprss_db->get_mysql_version() .
|
---|
230 | //parteibuch deactiveated due to security concerns ") appears old. You should update it. -->\n";
|
---|
231 | }
|
---|
232 |
|
---|
233 | function adminMenu()
|
---|
234 | {
|
---|
235 | /* adminMenu() -- called when the administration pages are being displayed
|
---|
236 | * -- this function hooks the RSS Feeds page into the admin menus
|
---|
237 | */
|
---|
238 | if (function_exists('add_management_page'))
|
---|
239 | add_management_page('Parteibuch RSS Aggregator', 'RSS Aggregator', 9,
|
---|
240 | dirname(__FILE__).'/bdp-rssadmin.php');
|
---|
241 | }
|
---|
242 |
|
---|
243 | function pba_shutdown()
|
---|
244 | {
|
---|
245 | // pba_shutdown() -- called at shutdown - processed the jobs
|
---|
246 | //print_r(getrusage());
|
---|
247 |
|
---|
248 | global $bdprss_db;
|
---|
249 |
|
---|
250 | //print_r($bdprss_db->serverstatus);
|
---|
251 |
|
---|
252 | ignore_user_abort(true);
|
---|
253 | wp_cache_close();
|
---|
254 | flush();
|
---|
255 | if(!ini_get('safe_mode')) set_time_limit(0);
|
---|
256 | // sleep(15); //just for simulating time intensive operations
|
---|
257 |
|
---|
258 | if(isset($bdprss_db->serverstatus['job2start']['name'])&& isset($bdprss_db->serverstatus['job2start']['time'])){
|
---|
259 | //we will not touch any jobs announced more than 8 seconds ago, the job manager could be already trying to reassign them
|
---|
260 | if(time() - $bdprss_db->serverstatus['job2start']['time'] < 8) $pba_job=$bdprss_db->serverstatus['job2start']['name'];
|
---|
261 | }
|
---|
262 | if(isset($pba_job)
|
---|
263 | && !$bdprss_db->highserverload
|
---|
264 | && $bdprss_db->memtablesok
|
---|
265 | && method_exists($bdprss_db, $pba_job)
|
---|
266 | ){
|
---|
267 | $bdprss_db->jobaction($pba_job, "start");
|
---|
268 | $return=$bdprss_db->$pba_job();
|
---|
269 | }
|
---|
270 | if(isset($pba_job)){
|
---|
271 | //echo "killing the job ... ";
|
---|
272 | $bdprss_db->jobaction($pba_job, "kill");
|
---|
273 | //echo "... done";
|
---|
274 | }
|
---|
275 | }
|
---|
276 |
|
---|
277 | //see an example of wp hooks here: http://www.devlounge.net/articles/wordpress-plugin-filters
|
---|
278 | function replace_page_content($content = ''){
|
---|
279 | global $remember_pbapage;
|
---|
280 | if($remember_pbapage !== false){
|
---|
281 | $content .= $remember_pbapage['result'];
|
---|
282 | }
|
---|
283 | return $content;
|
---|
284 | }
|
---|
285 |
|
---|
286 | /* ----- utilities ----- */
|
---|
287 | function tagalise($key)
|
---|
288 | {
|
---|
289 | return 'bdprss_xhtml_' . preg_replace("'[\s]*'", '', strtolower($key));
|
---|
290 | }
|
---|
291 |
|
---|
292 |
|
---|
293 | /* --- core input functions --- */
|
---|
294 |
|
---|
295 | function update(&$row)
|
---|
296 | {
|
---|
297 | /* update(&$row)
|
---|
298 | * -- does the grunt work of updating a feed,
|
---|
299 | * -- specified by a row from the site-table
|
---|
300 | */
|
---|
301 | global $bdprss_db;
|
---|
302 |
|
---|
303 | //$bdprss_db->recordError('Debug', 'Im here 1 at update');
|
---|
304 |
|
---|
305 | // Check we have a row from the site-table
|
---|
306 | if(!isset($row) || !$row || !$row->{$bdprss_db->cidentifier} || !$row->{$bdprss_db->cfeedurl})
|
---|
307 | {
|
---|
308 | $bdprss_db->recordError('Snark',
|
---|
309 | "Snark: update() called without a row from the siteTable (this should never happen)");
|
---|
310 | return;
|
---|
311 | }
|
---|
312 | $now = time();
|
---|
313 | $cidentifier = $row->{$bdprss_db->cidentifier};
|
---|
314 | $url = $row->{$bdprss_db->cfeedurl};
|
---|
315 | $lastupdated = (int) $row->{$bdprss_db->cupdatetime};
|
---|
316 |
|
---|
317 | // set the next poll time
|
---|
318 | $siteArray = array();
|
---|
319 | $siteArray['cidentifier'] = $cidentifier;
|
---|
320 | $siteArray['clastpolltime'] = $now;
|
---|
321 | if($row->{$bdprss_db->cpollingfreqmins})
|
---|
322 | $siteArray['cnextpolltime'] = $now + (60 * (int) $row->{$bdprss_db->cpollingfreqmins});
|
---|
323 | else
|
---|
324 | $siteArray['cnextpolltime'] = $now + (60 * (int) get_option('bdprss_update_frequency'));
|
---|
325 | $bdprss_db->updateTable($bdprss_db->sitetable, $siteArray, 'cidentifier');
|
---|
326 |
|
---|
327 | //mem table update
|
---|
328 | $bdprss_db->updateTable($bdprss_db->msitetable, $siteArray, 'cidentifier');
|
---|
329 |
|
---|
330 | // Clear errorBase
|
---|
331 | $bdprss_db->deleteErrors($url);
|
---|
332 |
|
---|
333 | // Get the feed
|
---|
334 | $feed = new BDPFeed($url);
|
---|
335 | $pfeed = $feed->parse();
|
---|
336 | if(!$pfeed)
|
---|
337 | {
|
---|
338 | $bdprss_db->recordError($url, "Failed to parse $url");
|
---|
339 | return;
|
---|
340 | }
|
---|
341 |
|
---|
342 | // extract and save key site information
|
---|
343 | if(isset($pfeed['title'])) { $siteArray['csitename'] = mb_substr($pfeed['title'], 0, 250); } else { $siteArray['csitename'] = ""; };
|
---|
344 | $siteArray['csiteurl'] = mb_substr($pfeed['link'], 0, 250);
|
---|
345 | if(isset($pfeed['copyright'])) $siteArray['csitelicense'] = mb_substr($pfeed['copyright'], 0, 250);
|
---|
346 | if(isset($pfeed['description'])) {
|
---|
347 | $siteArray['cdescription'] = mb_substr($pfeed['description'], 0, 250);
|
---|
348 | }elseif(isset($pfeed['tagline'])){
|
---|
349 | $siteArray['cdescription'] = mb_substr($pfeed['tagline'], 0, 250);
|
---|
350 | }else{
|
---|
351 | $siteArray['cdescription'] = "";
|
---|
352 | }
|
---|
353 | $siteArray['cupdatetime'] = $now;
|
---|
354 | $bdprss_db->updateTable($bdprss_db->sitetable, $siteArray, 'cidentifier',
|
---|
355 | $row->{$bdprss_db->csitenameoverride}=='Y');
|
---|
356 |
|
---|
357 | //mem table
|
---|
358 | $bdprss_db->updateTable($bdprss_db->msitetable, $siteArray, 'cidentifier',
|
---|
359 | $row->{$bdprss_db->csitenameoverride}=='Y');
|
---|
360 |
|
---|
361 |
|
---|
362 | // Establish virginity - an important concept for sites that don't provide item timestamps
|
---|
363 | $virgin = ($lastupdated == 1);
|
---|
364 | if(BDPRSS2_DEBUG) $bdprss_db->recordError($url, "I am a virgin site");
|
---|
365 |
|
---|
366 | // extract and save key item information
|
---|
367 | $counter = 1;
|
---|
368 | foreach ($pfeed['items'] as $item)
|
---|
369 | {
|
---|
370 | $ticks = 0;
|
---|
371 |
|
---|
372 | $link = $item['link'];
|
---|
373 | if(isset($item['title'])) {
|
---|
374 | $title = $item['title'];
|
---|
375 | }else{
|
---|
376 | $title=false;
|
---|
377 | }
|
---|
378 |
|
---|
379 | //parteibuch fill the new item site name, url and license info
|
---|
380 | $itemsitename="";
|
---|
381 | $itemsiteurl="";
|
---|
382 | $itemlicense="";
|
---|
383 |
|
---|
384 | $itemsitename .= $row->{$bdprss_db->csitename};
|
---|
385 | $itemsiteurl .= $row->{$bdprss_db->csiteurl};
|
---|
386 | $itemlicense .= $row->{$bdprss_db->csitelicense};
|
---|
387 |
|
---|
388 | if(!($row->{$bdprss_db->csitenameoverride}=='Y')){
|
---|
389 | if(isset($item['dc:creator']) && strlen($item['dc:creator'])>0) {
|
---|
390 | $itemsitename = $item['dc:creator'];
|
---|
391 | } elseif(strlen(mb_substr($pfeed['title'], 0, 250))>0){
|
---|
392 | $itemsitename = mb_substr($pfeed['title'], 0, 250);
|
---|
393 | }
|
---|
394 | if(isset($item['dc:source']) && strlen($item['dc:source'])>0) {
|
---|
395 | $itemsiteurl = $item['dc:source'];
|
---|
396 | } elseif(strlen(mb_substr($pfeed['link'], 0, 250))>0){
|
---|
397 | $itemsiteurl = mb_substr($pfeed['link'], 0, 250);
|
---|
398 | }
|
---|
399 | if(isset($item['dc:rights']) && strlen($item['dc:rights'])>0) {
|
---|
400 | $itemlicense = $item['dc:rights'];
|
---|
401 | } elseif(isset($pfeed['copyright']) && strlen(mb_substr($pfeed['copyright'], 0, 250))>0){
|
---|
402 | $itemlicense = mb_substr($pfeed['copyright'], 0, 250);
|
---|
403 | }
|
---|
404 | }
|
---|
405 |
|
---|
406 | if(!$link && isset($item['guid']))
|
---|
407 | {
|
---|
408 | // A work around for Penny Sharpe's blog - http://pennysharpe.com/redleather/
|
---|
409 | $link = $item['guid']; // in RSS guid stands for globally unique identifier
|
---|
410 | }
|
---|
411 |
|
---|
412 | // some error reporting sequences
|
---|
413 | if($link)
|
---|
414 | { $preError = "<a href='$link'>"; $postError = '</a>'; }
|
---|
415 | if($title && $link)
|
---|
416 | $errorLink = ' ('.$preError.$title.$postError.') ';
|
---|
417 | elseif($title && !$link)
|
---|
418 | $errorLink = ' ('.$title.') ';
|
---|
419 | elseif($link && !$title)
|
---|
420 | $errorLink = ' ['.$preError.'link'.$postError.'] ';
|
---|
421 | else
|
---|
422 | $errorLink = '';
|
---|
423 |
|
---|
424 | if(!$title)
|
---|
425 | {
|
---|
426 | $bdprss_db->recordError($url, "No title in feed for item $errorLink");
|
---|
427 | // lets see if we can make a half a meaningful title from the link
|
---|
428 | $title = 'No title';
|
---|
429 | }
|
---|
430 |
|
---|
431 | if(!$link)
|
---|
432 | {
|
---|
433 | $bdprss_db->recordError($url, "No link in feed for item $errorLink");
|
---|
434 | continue; // a URL link for the item is needed for the database
|
---|
435 | }
|
---|
436 |
|
---|
437 | //Parteibuch Debug
|
---|
438 | if(false && $url=='http://www.blog.de/srv/xml/xmlfeed.php?blog=140501&mode=rss2.0')
|
---|
439 | {
|
---|
440 | $bdprss_db->recordError($url, "Debug about wrong link for $errorLink");
|
---|
441 | }
|
---|
442 |
|
---|
443 |
|
---|
444 | $link = mb_substr($link, 0, 250); // keep it short buddy
|
---|
445 | $title = mb_substr($title, 0, 250); // keep it short buddy
|
---|
446 |
|
---|
447 | // get the itemtext
|
---|
448 | if(isset($item['content:encoded']))
|
---|
449 | $itemtext = $item['content:encoded'];
|
---|
450 | elseif(isset($item['description']))
|
---|
451 | $itemtext = $item['description'];
|
---|
452 | elseif(isset($item['content']))
|
---|
453 | $itemtext = $item['content'];
|
---|
454 | elseif(isset($item['summary']))
|
---|
455 | $itemtext = $item['summary'];
|
---|
456 | else
|
---|
457 | $itemtext = '';
|
---|
458 |
|
---|
459 | // get the time - this is tricky because many feeds don't provide a timestamp
|
---|
460 | $ticks = 0;
|
---|
461 | $timeType =
|
---|
462 | array('pubDate', 'dc:date', 'created', 'issued', 'published', 'updated', 'modified');
|
---|
463 | $done = FALSE;
|
---|
464 | foreach($timeType as $t)
|
---|
465 | {
|
---|
466 | if(isset($item[$t]))
|
---|
467 | {
|
---|
468 | $done = TRUE;
|
---|
469 | $ticks = strtotime($item[$t]);
|
---|
470 | if($ticks > 0) break;
|
---|
471 | $ticks = preg_replace("'[- +a-z]*$'si", '', $item[$t]);
|
---|
472 | $ticks = strtotime($ticks);
|
---|
473 | if($ticks > 0) break;
|
---|
474 | $ticks = BDPRSS2::w3cdtf($item[$t]);
|
---|
475 | if($ticks > 0) break;
|
---|
476 | $bdprss_db->recordError($url, 'Exact time of item post not correctly encoded: '.
|
---|
477 | $t.'['.$item[$t]."] $errorLink");
|
---|
478 | $done = FALSE;
|
---|
479 | }
|
---|
480 | if($ticks < 0) $ticks = 0;
|
---|
481 | }
|
---|
482 | if(!$done) $bdprss_db->recordError($url,
|
---|
483 | "No time-stamp in feed for post item $errorLink");
|
---|
484 | $rawTicks = $ticks;
|
---|
485 | $gmtadjust_seconds = intval(floatval($row->{$bdprss_db->cgmtadjust}) * 3600);
|
---|
486 | $ticks += $gmtadjust_seconds;
|
---|
487 |
|
---|
488 | // make time adjustments -- including for those feeds without timestamps
|
---|
489 | $windforward = FALSE;
|
---|
490 | $windback = FALSE;
|
---|
491 | $gmt_adjust = 0.0;
|
---|
492 | if($ticks <= 1000000)
|
---|
493 | {
|
---|
494 | if($virgin)
|
---|
495 | $ticks = 0;
|
---|
496 | else
|
---|
497 | $ticks = $now - $counter;
|
---|
498 | }
|
---|
499 | else
|
---|
500 | {
|
---|
501 | if (!$virgin)
|
---|
502 | {
|
---|
503 | // reprogram any necessary GMT adjustments for out of sync time stamps
|
---|
504 | // we can change $ticks here as ...
|
---|
505 | // ... $bdprss_db->update_itemstable() only updates $ticks on inserts
|
---|
506 | // ... it will not affect updates
|
---|
507 | if($ticks > intval($now+300))
|
---|
508 | {
|
---|
509 | $windback = TRUE;
|
---|
510 | $gmt_adjust = -0.5;
|
---|
511 | }
|
---|
512 | if($ticks < intval($lastupdated-300)) {
|
---|
513 | $windforward = TRUE;
|
---|
514 | $ticks = $now - $counter;
|
---|
515 | $gmt_adjust = 0.5;
|
---|
516 | }
|
---|
517 | }
|
---|
518 | }
|
---|
519 |
|
---|
520 | // one final tweak to prevent forward time
|
---|
521 | if($ticks > $now) $ticks = $now - $counter;
|
---|
522 |
|
---|
523 | // update/insert item information
|
---|
524 |
|
---|
525 | if ($bdprss_db->updateItem($url, $title, $counter, $itemtext, $link, $ticks, $itemsitename, $itemsiteurl, $itemlicense) && !$virgin)
|
---|
526 | {
|
---|
527 | // it was an item insert (and not an update) for an old feedurl
|
---|
528 | // -- let's see if we need to do an automatic adjustmemt to the time!
|
---|
529 | if($windback || $windforward)
|
---|
530 | {
|
---|
531 | $bdprss_db->recordError($url, "Raw time stamp: " .
|
---|
532 | PBALIB::gettheage($rawTicks). $errorLink);
|
---|
533 | $gmt_adjust += floatval($row->{$bdprss_db->cgmtadjust});
|
---|
534 | if($gmt_adjust > 48.0) $gmt_adjust = 48.0;
|
---|
535 | if($gmt_adjust < -48.0) $gmt_adjust = -48.0;
|
---|
536 | $siteArray['cgmtadjust'] = $gmt_adjust;
|
---|
537 | $bdprss_db->updateTable($bdprss_db->sitetable, $siteArray, 'cidentifier',
|
---|
538 | $row->{$bdprss_db->csitenameoverride}=='Y');
|
---|
539 |
|
---|
540 | //mem table
|
---|
541 | $bdprss_db->updateTable($bdprss_db->msitetable, $siteArray, 'cidentifier',
|
---|
542 | $row->{$bdprss_db->csitenameoverride}=='Y');
|
---|
543 |
|
---|
544 | $bdprss_db->recordError($url, "New GMT adjustment: $gmt_adjust hours $errorLink");
|
---|
545 | }
|
---|
546 | }
|
---|
547 | $counter++;
|
---|
548 | }
|
---|
549 | $bdprss_db->delete_old_items($url);
|
---|
550 | }
|
---|
551 |
|
---|
552 | function w3cdtf($dateString='')
|
---|
553 | {
|
---|
554 | /* w3cdtf() -- modified from parse_w3cdtf() in functions-rss.php in Wordpress!
|
---|
555 | */
|
---|
556 |
|
---|
557 | //parteibuch: get rid of milliseconds if any
|
---|
558 | $dateString=preg_replace('/\.\d{3}/','',$dateString);
|
---|
559 |
|
---|
560 | // regex to match wc3dtf
|
---|
561 | $pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/i";
|
---|
562 |
|
---|
563 | if ( preg_match( $pat, $dateString, $match ) )
|
---|
564 | {
|
---|
565 | list( $year, $month, $day, $hours, $minutes, $seconds) =
|
---|
566 | array( intval($match[1]), intval($match[2]), intval($match[3]),
|
---|
567 | intval($match[4]), intval($match[5]), intval($match[6]));
|
---|
568 |
|
---|
569 | if ( $match[10] != 'Z' )
|
---|
570 | {
|
---|
571 | list( $tz_mod, $tz_hour, $tz_min ) =
|
---|
572 | array( $match[8], intval($match[9]), intval($match[10]));
|
---|
573 |
|
---|
574 | // zero out the variables
|
---|
575 | if ( ! $tz_hour ) { $tz_hour = 0; }
|
---|
576 | if ( ! $tz_min ) { $tz_min = 0; }
|
---|
577 |
|
---|
578 | $offset = (($tz_hour*60)+$tz_min)*60;
|
---|
579 |
|
---|
580 | // is timezone ahead of GMT? then subtract offset
|
---|
581 | if ( $tz_mod == '+' ) { $offset *= -1; }
|
---|
582 | }
|
---|
583 | else
|
---|
584 | {
|
---|
585 | $offset = 0;
|
---|
586 | }
|
---|
587 |
|
---|
588 | $secondsSinceEpoch = gmmktime( $hours, $minutes, $seconds, $month, $day, $year) + $offset;
|
---|
589 | }
|
---|
590 | else
|
---|
591 | {
|
---|
592 | $secondsSinceEpoch = -1; // error
|
---|
593 | }
|
---|
594 |
|
---|
595 | return $secondsSinceEpoch;
|
---|
596 | }
|
---|
597 |
|
---|
598 |
|
---|
599 | /* --- core output functions --- */
|
---|
600 |
|
---|
601 | function remove_link_and_cache_links_from_item($itemtext=''){
|
---|
602 | //Remove old Cache Link at end of posting
|
---|
603 | $itemtext=preg_replace('/\[[^\]]*>Cache<\/a>\]$/','',$itemtext);
|
---|
604 | //Remove old Link Link at end of posting
|
---|
605 | $itemtext=preg_replace('/\[[^\]]*>Link<\/a>\] ?$/','',$itemtext);
|
---|
606 | return $itemtext;
|
---|
607 | }
|
---|
608 |
|
---|
609 | function packageItemText($string, $wordCount=0, $maxWordLength=50, $processTags=FALSE, $tagSet='')
|
---|
610 | {
|
---|
611 | global $bdp_output;
|
---|
612 | // keep acceptable tags
|
---|
613 | $string = mb_eregi_replace("\<", '<', $string);
|
---|
614 | $string = mb_eregi_replace("\>", '>', $string);
|
---|
615 | if($processTags && $tagSet)
|
---|
616 | {
|
---|
617 | $tagSet = preg_split("','", $tagSet, -1, PREG_SPLIT_NO_EMPTY);
|
---|
618 | foreach($tagSet as $ts)
|
---|
619 | {
|
---|
620 | // space out tags so they are are easy to identify
|
---|
621 | $string = mb_eregi_replace("<($ts [^>]*)>", " <\\1>", $string);
|
---|
622 | $string = mb_eregi_replace("<($ts)>", " <\\1>", $string);
|
---|
623 | $string = mb_eregi_replace("<(/$ts)>", " <\\1>", $string);
|
---|
624 | }
|
---|
625 | }
|
---|
626 | // delete unrequired tags
|
---|
627 | $string = mb_eregi_replace("<[a-zA-Z]+[^>]*>", '', $string);
|
---|
628 | $string = mb_eregi_replace("</[a-zA-Z]+[^>]*>", '', $string);
|
---|
629 | // restore required tags
|
---|
630 | $string = mb_eregi_replace("\<", '<', $string);
|
---|
631 | $string = mb_eregi_replace("\>", '>', $string);
|
---|
632 |
|
---|
633 | // count words
|
---|
634 | $words = explode(' ', $string);
|
---|
635 | $outWords = array();
|
---|
636 | $count = count($words);
|
---|
637 |
|
---|
638 | $inTag = false;
|
---|
639 | $HTMLclosure = array();
|
---|
640 | $token = false;
|
---|
641 |
|
---|
642 | if(!$wordCount) $wordCount= -1; // backward compatibility so that zero = no limit
|
---|
643 |
|
---|
644 | for($i=0; $i<$count && $wordCount!=0; $i++)
|
---|
645 | {
|
---|
646 | // trim
|
---|
647 | $outWords[$i] = mb_ereg_replace("^\s+", "", $words[$i]);
|
---|
648 | $outWords[$i] = mb_ereg_replace("\s+$", "", $outWords[$i]);
|
---|
649 |
|
---|
650 | if(!$outWords[$i]) continue;
|
---|
651 |
|
---|
652 | if($processTags)
|
---|
653 | {
|
---|
654 | if(mb_ereg('^<', $outWords[$i]))
|
---|
655 | {
|
---|
656 | if($inTag) $bdp_output .= "<!-- glitch nested tags? -->\n";
|
---|
657 | $inTag = TRUE;
|
---|
658 | if(mb_ereg('^<([a-zA-Z]+)', $outWords[$i], $matches))
|
---|
659 | {
|
---|
660 | //open tag
|
---|
661 | $m = mb_strtolower($matches[1]);
|
---|
662 | array_push($HTMLclosure, $m);
|
---|
663 | $token = $m;
|
---|
664 | }
|
---|
665 | if(mb_ereg('^</([a-zA-Z]+).*', $outWords[$i], $matches))
|
---|
666 | {
|
---|
667 | // close tag
|
---|
668 | $m = mb_strtolower($matches[1]);
|
---|
669 | $t = array_pop($HTMLclosure);
|
---|
670 | if($t && $t!=$m)
|
---|
671 | array_push($HTMLclosure, $t);
|
---|
672 | $inTag = FALSE;
|
---|
673 | }
|
---|
674 | }
|
---|
675 |
|
---|
676 | if($inTag)
|
---|
677 | {
|
---|
678 | if(mb_ereg('/>', $outWords[$i]))
|
---|
679 | {
|
---|
680 | // closure
|
---|
681 | $m = $token;
|
---|
682 | $t = array_pop($HTMLclosure);
|
---|
683 | if($t && $t!=$m) array_push($HTMLclosure, $t);
|
---|
684 | }
|
---|
685 | // quotes in tags must be respected
|
---|
686 | $outWords[$i] = mb_eregi_replace('"', '"', $outWords[$i]);
|
---|
687 | $outWords[$i] = mb_eregi_replace(''', "'", $outWords[$i]);
|
---|
688 | if(mb_ereg('>', $outWords[$i]))
|
---|
689 | {
|
---|
690 | $inTag = FALSE;
|
---|
691 | $token = FALSE;
|
---|
692 | }
|
---|
693 | continue;
|
---|
694 | }
|
---|
695 | }
|
---|
696 | $len = mb_strlen($outWords[$i]);
|
---|
697 | if($maxWordLength && $len > $maxWordLength)
|
---|
698 | {
|
---|
699 | $outWords[$i] = mb_substr($outWords[$i], 0, $maxWordLength);
|
---|
700 | $outWords[$i] .= '~';
|
---|
701 | }
|
---|
702 | $wordCount--;
|
---|
703 | }
|
---|
704 |
|
---|
705 | $ret = implode(' ', $outWords);
|
---|
706 |
|
---|
707 | if($inTag) $ret .= '>';
|
---|
708 |
|
---|
709 | if(count($words) > count($outWords)) $ret .= ' ...';
|
---|
710 |
|
---|
711 | if($processTags)
|
---|
712 | {
|
---|
713 | // close open tags
|
---|
714 | while($t = array_pop($HTMLclosure)) $ret .= "</$t>";
|
---|
715 |
|
---|
716 | // tighten up the HTML
|
---|
717 | $ret = mb_eregi_replace(" (</[a-zA-Z]+>)", "\\1", $ret);
|
---|
718 | $ret = mb_eregi_replace("([\(\$\[\{]) (<[a-zA-Z]+[^\>]*>)", "\\1\\2", $ret);
|
---|
719 | $ret = mb_eregi_replace("" (<[a-zA-Z]+[^\>]*>)", ""\\1", $ret);
|
---|
720 | $ret = mb_eregi_replace("" (<[a-zA-Z]+[^\>]*>)", ""\\1", $ret);
|
---|
721 | $ret = mb_eregi_replace("' (<[a-zA-Z]+[^\>]*>)", "'\\1", $ret);
|
---|
722 | $ret = mb_eregi_replace("‘ (<[a-zA-Z]+[^\>]*>)", "‘\\1", $ret);
|
---|
723 | $ret = mb_eregi_replace("‘ (<[a-zA-Z]+[^\>]*>)", "‘\\1", $ret);
|
---|
724 | $ret = mb_eregi_replace("“ (<[a-zA-Z]+[^\>]*>)", "“\\1", $ret);
|
---|
725 | $ret = mb_eregi_replace("“ (<[a-zA-Z]+[^\>]*>)", "“\\1", $ret);
|
---|
726 | $ret = mb_eregi_replace("(<[a-zA-Z]+[^\>]*>) (<[a-zA-Z]+[^\>]*>)", "\\1\\2", $ret);
|
---|
727 | }
|
---|
728 | return ($ret);
|
---|
729 | }
|
---|
730 |
|
---|
731 | function codeQuotes($text)
|
---|
732 | {
|
---|
733 | $text = ereg_replace(''' ,"'", $text);
|
---|
734 | $text = eregi_replace('"' ,'"' , $text);
|
---|
735 | return $text;
|
---|
736 | }
|
---|
737 |
|
---|
738 | // begin old function dummies
|
---|
739 | function print_item_set(&$itemSet, $listInfo, $relative='relative', $short_cache_link=false, $add_social_bookmarks=false, $useitemtitles=false){
|
---|
740 | echo "Debug: functionality of print_item_set function has been replaced by PBA::outputwrapper";
|
---|
741 | return false;
|
---|
742 | }
|
---|
743 | function putsiteheader($prehead, $posthead, $siteaddress, $description, $sitename){
|
---|
744 | echo "Debug: functionality of putsiteheader function has been replaced by PBA::outputwrapper";
|
---|
745 | return false;
|
---|
746 | }
|
---|
747 | function output($output_id, $overwrite_items_per_site='N', $short_cache_link=false, $outputdate="", $add_social_bookmarks=false, $tickerpage=1, $search="", $useitemtitles=false, $overwrite_listfilter=false){
|
---|
748 | echo "Debug: functionality of output function has been replaced by PBA::outputwrapper";
|
---|
749 | return false;
|
---|
750 | }
|
---|
751 | function archiveDate($output_id){
|
---|
752 | echo "Debug: functionality of archiveDate function has been replaced by PBA::outputwrapper";
|
---|
753 | return false;
|
---|
754 | }
|
---|
755 | function archiveList($output_id, $query_string_archive=true){
|
---|
756 | echo "Debug: functionality of archiveList function has been replaced by PBA::outputwrapper";
|
---|
757 | return false;
|
---|
758 | }
|
---|
759 | function viewCache($listnum=0,$itemnum=0){
|
---|
760 | echo "Debug: functionality of viewCache function has been replaced by PBA::outputwrapper";
|
---|
761 | return false;
|
---|
762 | }
|
---|
763 | function rss_print_item_set(&$itemSet, $listInfo, $relative='relative', $short_cache_link=false, $itemdate, $search) {
|
---|
764 | echo "Debug: functionality of rss_print_item_set function has been replaced by PBA::outputwrapper";
|
---|
765 | return false;
|
---|
766 | }
|
---|
767 | function rss_output($output_id, $short_cache_link=false){
|
---|
768 | // rss_output() -- just a reference on historic reasons to output()
|
---|
769 | $feeditems=BDPRSS2::output($output_id, 'N', $short_cache_link, "", false, 'feed', "", false);
|
---|
770 | return $feeditems;
|
---|
771 | }
|
---|
772 | function feeds_in_ticker($feedinlist=1,$age=604800){
|
---|
773 | echo "Debug: functionality of feeds_in_ticker function has been replaced by PBA::outputwrapper";
|
---|
774 | return false;
|
---|
775 | }
|
---|
776 | function feedlist($output_id=1, $maxage=604800, $list_id=false){
|
---|
777 | echo "Debug: functionality of feeds_in_ticker function has been replaced by PBA::outputwrapper";
|
---|
778 | return false;
|
---|
779 | }
|
---|
780 | function process_url_parameter(){
|
---|
781 | echo "Debug: function process_url_parameter has been removed to class PBALIB in pba_output_library.php";
|
---|
782 | return false;
|
---|
783 | }
|
---|
784 | // end old function dummies
|
---|
785 |
|
---|
786 |
|
---|
787 | } // class BDPRSS2
|
---|
788 | } // if( !class_exists('BDPRSS2') )
|
---|
789 |
|
---|
790 |
|
---|
791 | //here cames the parteibuch aggregator stuff
|
---|
792 | if(!(isset($bdprsssearchdebug) && $bdprsssearchdebug ===true)&& !class_exists('BDPRSS_SEARCH') ) {
|
---|
793 | require_once(dirname(__FILE__) . '/pba-rsssearch.php');
|
---|
794 | require_once(dirname(__FILE__) . '/pba_output_function.php');
|
---|
795 | global $bdprss_db;
|
---|
796 | if($bdprss_db->memtables_were_ok == 0) $result=$bdprss_search->bdprss_create_proc();
|
---|
797 | }
|
---|
798 |
|
---|
799 |
|
---|
800 |
|
---|
801 | ?>
|
---|