Passed
Push — master ( cdcc0c...410349 )
by litefeel
22:03 queued 03:07
created

Writing_On_GitHub::l10n()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 0
cts 2
cp 0
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
crap 2
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.5.1
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 {
0 ignored issues
show
Complexity introduced by
The class Writing_On_GitHub has a coupling between objects value of 13. Consider to reduce the number of dependencies under 13.
Loading history...
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;
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, 1 );
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) {
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
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) {
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
157
        $ignore_meta_keys = get_option('wogh_ignore_metas');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
158
        if (empty($ignore_meta_keys)) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
159
            return $meta;
160
        }
161
162
        $keys = preg_split("/\\r\\n|\\r|\\n/", $ignore_meta_keys);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
163
        if (empty($keys)) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
164
            return $meta;
165
        }
166
        foreach ($keys as $key => $value) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
167
            $keys[$key] = trim($value);
0 ignored issues
show
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
168
        }
169
170
        foreach ($meta as $key => $value) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
171
            if (in_array($key, $keys)) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
172
                unset($meta[$key]);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
introduced by
Array keys should be surrounded by spaces unless they contain a string or an integer.
Loading history...
173
            }
174
        }
175
176
        return $meta;
177
    }
178
179
    public function the_content($content) {
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
180
        $arr = wp_upload_dir();
181
        $baseurl = $arr['baseurl'] . '/writing-on-github';
182
183
        $content = preg_replace_callback(
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $content. This often makes code more readable.
Loading history...
184
            '/(<img [^>]*?src=[\'"])\s*(\/images\/[^\s#]\S+)\s*([\'"][^>]*?>)/',
185 View Code Duplication
            function($matchs) use ($baseurl) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
186
                $url = $baseurl . $matchs[2];
187
                return "${matchs[1]}$url${matchs[3]}";
188
            },
189
            $content
190
        );
191
192
        $content = preg_replace_callback(
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $content. This often makes code more readable.
Loading history...
193
            '/(<a [^>]*?href=[\'"])\s*(\/images\/[^\s#]\S+)\s*([\'"][^>]*?>)/',
194 View Code Duplication
            function($matchs) use ($baseurl) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
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() {
221
        $this->start_cron( 'import' );
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)
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
introduced by
Expected next thing to be a escaping function, not 'static'
Loading history...
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 ) {
384
            if ( is_array( $msg ) || is_object( $msg ) ) {
385
                error_log( print_r( $msg, true ) );
0 ignored issues
show
introduced by
The use of function print_r() is discouraged
Loading history...
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