source: wordpress/plugins/owark/owark.php @ 86d7e64

Revision 86d7e64, 10.9 KB checked in by Eric van der Vlist <vdv@dyomedea.com>, 11 years ago (diff)

Initial import of the Wordpress plugin

  • Property mode set to 100644
Line 
1<?php
2/*  Copyright 2011 Eric van der Vlist (vdv@dyomedea.com)
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License, version 2, as
6    published by the Free Software Foundation.
7
8    This program is distributed in the hope that it will be useful,
9    but WITHOUT ANY WARRANTY; without even the implied warranty of
10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11    GNU General Public License for more details.
12
13    You should have received a copy of the GNU General Public License
14    along with this program; if not, write to the Free Software
15    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
16*/
17
18/*
19Plugin Name: owark
20Plugin URI: http://owark.org
21Description: Tired of broken links? Archive yours with the Open Web Archive!
22Version: 0.1
23Author: Eric van der Vlist
24Author URI: http://eric.van-der-vlist.com
25License: GLP2
26*/
27
28
29if (!class_exists("Owark")) {
30        class Owark {
31
32        private $broken_links = array();
33        private $post_id = -1;
34        private $post_type = "";
35       
36        /**
37         * Class constructor
38         *
39         * @package owark
40         * @since 0.1
41         *
42         *
43         */
44                function Owark() {
45
46            add_action('admin_menu', array($this, 'owark_admin_menu'));
47
48            // See http://stackoverflow.com/questions/2210826/need-help-with-wp-rewrite-in-a-wordpress-plugin
49            // Using a filter instead of an action to create the rewrite rules.
50            // Write rules -> Add query vars -> Recalculate rewrite rules
51            add_filter('rewrite_rules_array', array($this, 'create_rewrite_rules'));
52            add_filter('query_vars',array($this, 'add_query_vars'));
53
54            // Recalculates rewrite rules during admin init to save resources.
55            // Could probably run it once as long as it isn't going to change or check the
56            // $wp_rewrite rules to see if it's active.
57            add_filter('admin_init', array($this, 'flush_rewrite_rules'));
58            add_action( 'template_redirect', array($this, 'template_redirect_intercept') );
59
60            add_filter ( 'the_content', array($this, 'content_filter'));
61            add_filter ( 'comment_text', array($this, 'comment_filter'));
62            add_filter ( 'get_comment_author_link', array($this, 'comment_filter'));
63
64                }
65
66        function owark_admin_menu() {
67            add_management_page(__('The Open Web Archive', 'owark'), __('Web Archive', 'owark'), 'edit_others_posts', 'owark', array($this, 'management_page'));
68        }
69
70        /**
71         * URL of an archive page
72         *
73         * @package owark
74         * @since 0.1
75         *
76         *
77         */
78        function get_archive_url($archive_id) {
79            return home_url().'/owark/'.$archive_id;
80        }
81
82        /**
83         * Display the admin/tools page.
84         *
85         * @package owark
86         * @since 0.1
87         *
88         *
89         */
90        function management_page() {
91            //must check that the user has the required capability
92            if (!current_user_can('edit_others_posts')) {
93                wp_die( __('You do not have sufficient permissions to access this page.') );
94            }
95
96            global $wpdb;
97
98            echo '<div class="wrap">';
99            screen_icon();
100            echo '<h2>Owark - The Open Web Archive</h2>';
101            echo '<p><em>Tired of broken links? Archive yours with the Open Web Archive!</em></p>';
102            echo "</div>";
103
104            echo '<p>List of broken links with successfully archived pages:</p>';
105
106            $query = "SELECT owark.id, owark.url, owark.status, owark.arc_date, owark.arc_location, blc_links.status_text
107                        FROM {$wpdb->prefix}perwac AS owark, {$wpdb->prefix}blc_links as blc_links
108                        WHERE owark.url = blc_links.final_url COLLATE latin1_swedish_ci and blc_links.broken = 1
109                        ORDER BY owark.url";
110            $results = $wpdb->get_results($query);
111
112            echo '<table class="widefat">';
113            echo '<thead>';
114            echo '<tr>';
115            echo '<th>URL</th>';
116            echo '<th>Archive</th>';
117            echo '</tr>';
118            echo '</thead>';
119            echo '<tbody>';
120
121            foreach ($results as $link) {
122                $archive_url = $this->get_archive_url($link->id);
123                echo "<tr>
124                        <td><a href=\"{$link->url}\" target='_blank'>{$link->url}</a></td>
125                        <td><a href=\"{$archive_url}\" target='_blank'>{$link->arc_date}</a></td>
126                    </tr>";
127            }
128
129            echo '</tbody>';
130            echo '</table>';
131
132
133        }
134
135        /**
136         * Add a rewrite rule to display archive pages
137         *
138         * @package owark
139         * @since 0.1
140         *
141         *
142         */
143        function create_rewrite_rules($rules) {
144            global $wp_rewrite;
145            $newRule = array('owark/(.+)' => 'index.php?owark='.$wp_rewrite->preg_index(1));
146            $newRules = $newRule + $rules;
147            return $newRules;
148        }
149
150        /**
151         * Add a query variable used to display archive pages
152         *
153         * @package owark
154         * @since 0.1
155         *
156         *
157         */
158        function add_query_vars($qvars) {
159            $qvars[] = 'owark';
160            return $qvars;
161        }
162
163        /**
164         * Title says it all ;) ...
165         *
166         * @package owark
167         * @since 0.1
168         *
169         *
170         */
171        function flush_rewrite_rules() {
172            global $wp_rewrite;
173            $wp_rewrite->flush_rules();
174        }
175
176        /**
177         * Intercepts archive pages.
178         *
179         * @package owark
180         * @since 0.1
181         *
182         *
183         */
184        function template_redirect_intercept() {
185            global $wp_query;
186            if ($wp_query->get('owark')) {
187                $this->display_archive($wp_query->get('owark'));
188                exit;
189            }
190        }
191
192        /**
193         * Filter to replace broken links in comments.
194         *
195         * @package owark
196         * @since 0.1
197         *
198         *
199         */
200        function content_filter($content) {
201            global $post;
202            return $this->link_filter($content, $post->ID, $post->post_type);
203        }
204
205        /**
206         * Filter to replace broken links in comments.
207         *
208         * @package owark
209         * @since 0.1
210         *
211         *
212         */
213        function comment_filter($content) {
214            return $this->link_filter($content, get_comment_ID(), 'comment');
215        }
216
217        /**
218         * Generic filter to replace broken links in content.
219         *
220         * @package owark
221         * @since 0.1
222         *
223         *
224         */
225        function link_filter($content, $post_id, $post_type) {
226
227            global $wpdb;
228
229            // See if we haven't already loaded the broken links for this post...
230            if ($this->post_id != $post_id || $this->post_type != $post_type) {
231
232                $this->post_id =  $post_id;
233                $this->post_type = $post_type;
234
235                //Retrieve info about all occurrences of broken links in the current post
236                //which happens for comments (they have links to check in 2 different filters)
237                $q = "
238                    SELECT instances.raw_url, owark.id
239                    FROM {$wpdb->prefix}blc_instances AS instances,
240                        {$wpdb->prefix}blc_links AS links,
241                        {$wpdb->prefix}perwac AS owark
242                    WHERE
243                        instances.link_id = links.link_id
244                        AND owark.url = links.final_url COLLATE latin1_swedish_ci
245                        AND instances.container_id = %s
246                        AND instances.container_type = %s
247                        AND links.broken = 1
248                ";
249                $q = $wpdb->prepare($q, $this->post_id, $this->post_type);
250                $results = $wpdb->get_results($q);
251
252                $this->broken_links = array();
253
254                foreach ($results as $link) {
255                    $this->broken_links[$link->raw_url] = $link->id;
256                }
257
258            }
259
260
261            if (empty($this->broken_links)) {
262                return $content;
263            }
264
265            // Regexp : see http://stackoverflow.com/questions/2609095/hooking-into-comment-text-to-add-surrounding-tag
266            return preg_replace_callback('/(<a.*?href\s*=\s*["\'])([^"\'>]+)(["\'][^>]*>.*?<\/a>)/si', array( $this, 'replace_a_link'), $content);
267        }
268
269        /**
270         * Replace a link.
271         *
272         * @package owark
273         * @since 0.1
274         *
275         *
276         */
277        function replace_a_link($matches) {
278            if (array_key_exists($matches[2], $this->broken_links)) {
279                return $matches[1].$this->get_archive_url($this->broken_links[$matches[2]]).$matches[3];
280            } else {
281                return $matches[0];
282            }
283        }
284
285
286        /**
287         * Display an archive page
288         *
289         * @package owark
290         * @since 0.1
291         *
292         *
293         */
294        function display_archive($parameter) {
295
296            global $wpdb;
297
298            $id = intval($parameter);
299
300            $query = "SELECT *
301                        from {$wpdb->prefix}perwac AS owark
302                        where id = {$id}";
303            $link = $wpdb->get_row($query);
304
305            $blog_title = get_bloginfo('name');
306            $home_url = home_url();
307
308            $loc = "";
309            if( ($pos = strpos($link->arc_location, '/wp-content/perwac/')) !== FALSE )
310                $loc = substr($link->arc_location, $pos);
311            $arc_loc = home_url() . $loc;
312
313            echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
314        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
315<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
316
317            echo "<base href=\"{$arc_loc}/\">";
318            echo '<div style="background:#fff;border:1px solid #999;margin:-1px -1px 0;padding:0;">';
319            echo '<div style="background:#ddd;border:1px solid #999;color:#000;font:13px arial,sans-serif;font-weight:normal;margin:12px;padding:8px;text-align:left">';
320            echo "This is an <a href='http://owark.org'>Open Web Archive</a> archive of <a href=\"{$link->url}\">{$link->url}</a>.";
321            echo "<br />This snapshot has been taken on {$link->arc_date} for the website <a href=\"{$home_url}\">{$blog_title}</a> which contains a link to this page and has saved a copy to be displayed in the page ever disappears.";
322            echo '</div></div><div style="position:relative">';
323            $file_location = '.'.$loc.'/index.html';
324            $f = fopen($file_location, "r");
325            echo fread($f, filesize($file_location));
326            fclose($f);
327            echo '</div>';
328        }
329
330
331        }
332}
333
334
335if (class_exists("Owark")) {
336        $owark = new Owark();
337}
338
339
340
341?>
Note: See TracBrowser for help on using the repository browser.