Passed
Push — master ( ef8508...b87d51 )
by litefeel
03:46
created

writing-on-github.php (1 issue)

Severity
1
<?php
2
/**
3
 * Plugin Name: Writing on GitHub
4
 * Plugin URI: https://github.com/litefeel/writing-on-github
5
 * Description: A WordPress plugin to allow you writing on GitHub (or Jekyll site).
6
 * Version: 1.9
7
 * Author:  litefeel
8
 * Author URI: https://www.litefeel.com
9
 * License: GPLv2
10
 * Text Domain: writing-on-github
11
 */
12
13
// If the functions have already been autoloaded, don't reload.
14
// This fixes function duplication during unit testing.
15
$path = dirname( __FILE__ ) . '/vendor/autoload.php';
16
if ( file_exists( $path ) ) {
17
    require_once( $path );
18
}
19
20
add_action( 'plugins_loaded', array( new Writing_On_GitHub, 'boot' ) );
21
22
class Writing_On_GitHub {
23
24
    /**
25
     * Object instance
26
     * @var self
27
     */
28
    public static $instance;
29
30
    /**
31
     * Language text domain
32
     * @var string
33
     */
34
    public static $text_domain = 'writing-on-github';
35
36
    /**
37
     * Controller object
38
     * @var Writing_On_GitHub_Controller
39
     */
40
    public $controller;
41
42
    /**
43
     * Controller object
44
     * @var Writing_On_GitHub_Admin
45
     */
46
    public $admin;
47
48
    /**
49
     * CLI object.
50
     *
51
     * @var Writing_On_GitHub_CLI
52
     */
53
    protected $cli;
54
55
    /**
56
     * Request object.
57
     *
58
     * @var Writing_On_GitHub_Request
59
     */
60
    protected $request;
61
62
    /**
63
     * Response object.
64
     *
65
     * @var Writing_On_GitHub_Response
66
     */
67
    protected $response;
68
69
    /**
70
     * Api object.
71
     *
72
     * @var Writing_On_GitHub_Api
73
     */
74
    protected $api;
75
76
    /**
77
     * Import object.
78
     *
79
     * @var Writing_On_GitHub_Import
80
     */
81
    protected $import;
82
83
    /**
84
     * Export object.
85
     *
86
     * @var Writing_On_GitHub_Export
87
     */
88
    protected $export;
89
90
    /**
91
     * Semaphore object.
92
     *
93
     * @var Writing_On_GitHub_Semaphore
94
     */
95
    protected $semaphore;
96
97
    /**
98
     * Database object.
99
     *
100
     * @var Writing_On_GitHub_Database
101
     */
102
    protected $database;
103
104
    /**
105
     * Called at load time, hooks into WP core
106
     */
107
    public function __construct() {
108
        self::$instance = $this;
109
110
        if ( is_admin() ) {
111
            $this->admin = new Writing_On_GitHub_Admin( plugin_basename( __FILE__ ) );
112
        }
113
114
        $this->controller = new Writing_On_GitHub_Controller( $this );
115
116
        if ( defined( 'WP_CLI' ) && WP_CLI ) {
117
            WP_CLI::add_command( 'wogh', $this->cli() );
118
        }
119
    }
120
121
    /**
122
     * Attaches the plugin's hooks into WordPress.
123
     */
124
    public function boot() {
125
        register_activation_hook( __FILE__, array( $this, 'activate' ) );
126
        add_action( 'admin_notices', array( $this, 'activation_notice' ) );
127
128
        add_action( 'init', array( $this, 'l10n' ) );
129
130
        // Controller actions.
131
        add_action( 'save_post', array( $this->controller, 'export_post' ) );
132
        add_action( 'delete_post', array( $this->controller, 'delete_post' ) );
133
        add_action( 'wp_ajax_nopriv_wogh_push_request', array( $this->controller, 'pull_posts' ) );
134
        add_action( 'wogh_export', array( $this->controller, 'export_all' ), 10, 2 );
135
        add_action( 'wogh_import', array( $this->controller, 'import_master' ), 10, 2 );
136
        add_filter( 'get_edit_post_link', array( $this, 'edit_post_link' ), 10, 3 );
137
138
        // add_filter( 'wogh_post_meta', array( $this, 'ignore_post_meta' ), 10, 1 );
139
        // add_filter( 'wogh_pre_import_meta', array( $this, 'ignore_post_meta' ), 10, 1 );
140
        add_filter( 'the_content', array( $this, 'the_content' ) );
141
142
        do_action( 'wogh_boot', $this );
143
    }
144
145
    public function edit_post_link($link, $postID, $context) {
146
        if ( ! wp_is_post_revision( $postID ) ) {
147
            $post = new Writing_On_GitHub_Post( $postID, Writing_On_GitHub::$instance->api() );
148
            if ( $post->is_on_github() ) {
149
                return $post->github_edit_url();
150
            }
151
        }
152
153
        return $link;
154
    }
155
156
    public function ignore_post_meta($meta) {
157
        $ignore_meta_keys = get_option('wogh_ignore_metas');
158
        if (empty($ignore_meta_keys)) {
159
            return $meta;
160
        }
161
162
        $keys = preg_split("/\\r\\n|\\r|\\n/", $ignore_meta_keys);
163
        if (empty($keys)) {
164
            return $meta;
165
        }
166
        foreach ($keys as $key => $value) {
167
            $keys[$key] = trim($value);
168
        }
169
170
        foreach ($meta as $key => $value) {
171
            if (in_array($key, $keys)) {
172
                unset($meta[$key]);
173
            }
174
        }
175
176
        return $meta;
177
    }
178
179
    public function the_content($content) {
180
        $arr = wp_upload_dir();
181
        $baseurl = $arr['baseurl'] . '/writing-on-github';
182
183
        $content = preg_replace_callback(
184
            '/(<img [^>]*?src=[\'"])\s*(\/images\/[^\s#]\S+)\s*([\'"][^>]*?>)/',
185
            function($matchs) use ($baseurl) {
186
                $url = $baseurl . $matchs[2];
187
                return "${matchs[1]}$url${matchs[3]}";
188
            },
189
            $content
190
        );
191
192
        $content = preg_replace_callback(
193
            '/(<a [^>]*?href=[\'"])\s*(\/images\/[^\s#]\S+)\s*([\'"][^>]*?>)/',
194
            function($matchs) use ($baseurl) {
195
                $url = $baseurl . $matchs[2];
196
                return "${matchs[1]}$url${matchs[3]}";
197
            },
198
            $content
199
        );
200
        return $content;
201
    }
202
203
    /**
204
     * Init i18n files
205
     */
206
    public function l10n() {
207
        load_plugin_textdomain( self::$text_domain );
208
    }
209
210
    /**
211
     * Sets and kicks off the export cronjob
212
     */
213
    public function start_export( $force = false ) {
214
        $this->start_cron( 'export', $force );
215
    }
216
217
    /**
218
     * Sets and kicks off the import cronjob
219
     */
220
    public function start_import( $force = false ) {
221
        $this->start_cron( 'import', $force );
222
    }
223
224
    /**
225
     * Enables the admin notice on initial activation
226
     */
227
    public function activate() {
228
        if ( 'yes' !== get_option( '_wogh_fully_exported' ) ) {
229
            set_transient( '_wogh_activated', 'yes' );
230
        }
231
    }
232
233
    /**
234
     * Displays the activation admin notice
235
     */
236
    public function activation_notice() {
237
        if ( ! get_transient( '_wogh_activated' ) ) {
238
            return;
239
        }
240
241
        delete_transient( '_wogh_activated' );
242
243
        ?><div class="updated">
244
            <p>
245
                <?php
246
                    printf(
247
                        __( 'To set up your site to sync with GitHub, update your <a href="%s">settings</a> and click "Export to GitHub."', 'writing-on-github' ),
248
                        admin_url( 'options-general.php?page=' . static::$text_domain)
249
                    );
250
                ?>
251
            </p>
252
        </div><?php
253
    }
254
255
    /**
256
     * Get the Controller object.
257
     *
258
     * @return Writing_On_GitHub_Controller
259
     */
260
    public function controller() {
261
        return $this->controller;
262
    }
263
264
    /**
265
     * Lazy-load the CLI object.
266
     *
267
     * @return Writing_On_GitHub_CLI
268
     */
269
    public function cli() {
270
        if ( ! $this->cli ) {
271
            $this->cli = new Writing_On_GitHub_CLI;
272
        }
273
274
        return $this->cli;
275
    }
276
277
    /**
278
     * Lazy-load the Request object.
279
     *
280
     * @return Writing_On_GitHub_Request
281
     */
282
    public function request() {
283
        if ( ! $this->request ) {
284
            $this->request = new Writing_On_GitHub_Request( $this );
285
        }
286
287
        return $this->request;
288
    }
289
290
    /**
291
     * Lazy-load the Response object.
292
     *
293
     * @return Writing_On_GitHub_Response
294
     */
295
    public function response() {
296
        if ( ! $this->response ) {
297
            $this->response = new Writing_On_GitHub_Response( $this );
298
        }
299
300
        return $this->response;
301
    }
302
303
    /**
304
     * Lazy-load the Api object.
305
     *
306
     * @return Writing_On_GitHub_Api
307
     */
308
    public function api() {
309
        if ( ! $this->api ) {
310
            $this->api = new Writing_On_GitHub_Api( $this );
311
        }
312
313
        return $this->api;
314
    }
315
316
    /**
317
     * Lazy-load the Import object.
318
     *
319
     * @return Writing_On_GitHub_Import
320
     */
321
    public function import() {
322
        if ( ! $this->import ) {
323
            $this->import = new Writing_On_GitHub_Import( $this );
324
        }
325
326
        return $this->import;
327
    }
328
329
    /**
330
     * Lazy-load the Export object.
331
     *
332
     * @return Writing_On_GitHub_Export
333
     */
334
    public function export() {
335
        if ( ! $this->export ) {
336
            $this->export = new Writing_On_GitHub_Export( $this );
337
        }
338
339
        return $this->export;
340
    }
341
342
    /**
343
     * Lazy-load the Semaphore object.
344
     *
345
     * @return Writing_On_GitHub_Semaphore
346
     */
347
    public function semaphore() {
348
        if ( ! $this->semaphore ) {
349
            $this->semaphore = new Writing_On_GitHub_Semaphore;
350
        }
351
352
        return $this->semaphore;
353
    }
354
355
    /**
356
     * Lazy-load the Database object.
357
     *
358
     * @return Writing_On_GitHub_Database
359
     */
360
    public function database() {
361
        if ( ! $this->database ) {
362
            $this->database = new Writing_On_GitHub_Database( $this );
363
        }
364
365
        return $this->database;
366
    }
367
368
    /**
369
     * Print to WP_CLI if in CLI environment or
370
     * write to debug.log if WP_DEBUG is enabled
371
     * @source http://www.stumiller.me/sending-output-to-the-wordpress-debug-log/
372
     *
373
     * @param mixed $msg
374
     * @param string $write
375
     */
376
    public static function write_log( $msg, $write = 'line' ) {
377
        if ( defined( 'WP_CLI' ) && WP_CLI ) {
378
            if ( is_array( $msg ) || is_object( $msg ) ) {
379
                WP_CLI::print_value( $msg );
380
            } else {
381
                WP_CLI::$write( $msg );
382
            }
383
        } elseif ( true === WP_DEBUG ) {
0 ignored issues
show
The condition true === WP_DEBUG is always false.
Loading history...
384
            if ( is_array( $msg ) || is_object( $msg ) ) {
385
                error_log( print_r( $msg, true ) );
386
            } else {
387
                error_log( $msg );
388
            }
389
        }
390
    }
391
392
    /**
393
     * Kicks of an import or export cronjob.
394
     *
395
     * @param bool   $force
396
     * @param string $type
397
     */
398
    protected function start_cron( $type, $force = false ) {
399
        update_option( '_wogh_' . $type . '_started', 'yes' );
400
        $user_id = get_current_user_id();
401
        wp_schedule_single_event( time(), 'wogh_' . $type . '', array( $user_id, $force ) );
402
        spawn_cron();
403
    }
404
}
405