Writing_On_GitHub   B
last analyzed

Complexity

Total Complexity 51

Size/Duplication

Total Lines 388
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 12
Bugs 0 Features 2
Metric Value
eloc 122
c 12
b 0
f 2
dl 0
loc 388
ccs 0
cts 130
cp 0
rs 7.92
wmc 51

21 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 4
A edit_post_link() 0 9 3
A boot() 0 19 1
A ignore_post_meta() 0 21 6
A cli() 0 6 2
A semaphore() 0 6 2
A activate() 0 3 2
A api() 0 6 2
A start_export() 0 2 1
A controller() 0 2 1
A activation_notice() 0 16 2
A the_content() 0 29 3
A request() 0 6 2
A export() 0 6 2
A import() 0 6 2
A start_cron() 0 5 1
A database() 0 6 2
A response() 0 6 2
A l10n() 0 2 1
B write_log() 0 12 9
A start_import() 0 2 1

How to fix   Complexity   

Complex Class

Complex classes like Writing_On_GitHub often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Writing_On_GitHub, and based on these observations, apply Extract Interface, too.

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.11
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 ) {
0 ignored issues
show
Bug introduced by
The constant WP_CLI was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
117
            WP_CLI::add_command( 'wogh', $this->cli() );
0 ignored issues
show
Bug introduced by
The type WP_CLI was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
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
        $basedir = $arr['basedir'] . '/writing-on-github';
183
184
        $content = preg_replace_callback(
185
            '/(<img [^>]*?src=[\'"])\S*?(\/images\/\S+)([\'"].*?>)/',
186
            function($matchs) use ($baseurl, $basedir) {
187
                if (is_file($basedir . $matchs[2])) {
188
                    $url = $baseurl . $matchs[2];
189
                    return "${matchs[1]}$url${matchs[3]}";
190
                }
191
                return "${matchs[0]}";
192
            },
193
            $content
194
        );
195
196
        $content = preg_replace_callback(
197
            '/(<a [^>]*?href=[\'"])\S*?(\/images\/S+)\s*([\'"].*?>)/',
198
            function($matchs) use ($baseurl, $basedir) {
199
                if (is_file($basedir . $matchs[2])) {
200
                    $url = $baseurl . $matchs[2];
201
                    return "${matchs[1]}$url${matchs[3]}";
202
                }
203
                return "${matchs[0]}";
204
            },
205
            $content
206
        );
207
        return $content;
208
    }
209
210
    /**
211
     * Init i18n files
212
     */
213
    public function l10n() {
214
        load_plugin_textdomain( self::$text_domain );
215
    }
216
217
    /**
218
     * Sets and kicks off the export cronjob
219
     */
220
    public function start_export( $force = false ) {
221
        $this->start_cron( 'export', $force );
222
    }
223
224
    /**
225
     * Sets and kicks off the import cronjob
226
     */
227
    public function start_import( $force = false ) {
228
        $this->start_cron( 'import', $force );
229
    }
230
231
    /**
232
     * Enables the admin notice on initial activation
233
     */
234
    public function activate() {
235
        if ( 'yes' !== get_option( '_wogh_fully_exported' ) ) {
236
            set_transient( '_wogh_activated', 'yes' );
237
        }
238
    }
239
240
    /**
241
     * Displays the activation admin notice
242
     */
243
    public function activation_notice() {
244
        if ( ! get_transient( '_wogh_activated' ) ) {
245
            return;
246
        }
247
248
        delete_transient( '_wogh_activated' );
249
250
        ?><div class="updated">
251
            <p>
252
                <?php
253
                    printf(
254
                        __( 'To set up your site to sync with GitHub, update your <a href="%s">settings</a> and click "Export to GitHub."', 'writing-on-github' ),
255
                        admin_url( 'options-general.php?page=' . static::$text_domain)
256
                    );
257
                ?>
258
            </p>
259
        </div><?php
260
    }
261
262
    /**
263
     * Get the Controller object.
264
     *
265
     * @return Writing_On_GitHub_Controller
266
     */
267
    public function controller() {
268
        return $this->controller;
269
    }
270
271
    /**
272
     * Lazy-load the CLI object.
273
     *
274
     * @return Writing_On_GitHub_CLI
275
     */
276
    public function cli() {
277
        if ( ! $this->cli ) {
278
            $this->cli = new Writing_On_GitHub_CLI;
279
        }
280
281
        return $this->cli;
282
    }
283
284
    /**
285
     * Lazy-load the Request object.
286
     *
287
     * @return Writing_On_GitHub_Request
288
     */
289
    public function request() {
290
        if ( ! $this->request ) {
291
            $this->request = new Writing_On_GitHub_Request( $this );
292
        }
293
294
        return $this->request;
295
    }
296
297
    /**
298
     * Lazy-load the Response object.
299
     *
300
     * @return Writing_On_GitHub_Response
301
     */
302
    public function response() {
303
        if ( ! $this->response ) {
304
            $this->response = new Writing_On_GitHub_Response( $this );
305
        }
306
307
        return $this->response;
308
    }
309
310
    /**
311
     * Lazy-load the Api object.
312
     *
313
     * @return Writing_On_GitHub_Api
314
     */
315
    public function api() {
316
        if ( ! $this->api ) {
317
            $this->api = new Writing_On_GitHub_Api( $this );
318
        }
319
320
        return $this->api;
321
    }
322
323
    /**
324
     * Lazy-load the Import object.
325
     *
326
     * @return Writing_On_GitHub_Import
327
     */
328
    public function import() {
329
        if ( ! $this->import ) {
330
            $this->import = new Writing_On_GitHub_Import( $this );
331
        }
332
333
        return $this->import;
334
    }
335
336
    /**
337
     * Lazy-load the Export object.
338
     *
339
     * @return Writing_On_GitHub_Export
340
     */
341
    public function export() {
342
        if ( ! $this->export ) {
343
            $this->export = new Writing_On_GitHub_Export( $this );
344
        }
345
346
        return $this->export;
347
    }
348
349
    /**
350
     * Lazy-load the Semaphore object.
351
     *
352
     * @return Writing_On_GitHub_Semaphore
353
     */
354
    public function semaphore() {
355
        if ( ! $this->semaphore ) {
356
            $this->semaphore = new Writing_On_GitHub_Semaphore;
357
        }
358
359
        return $this->semaphore;
360
    }
361
362
    /**
363
     * Lazy-load the Database object.
364
     *
365
     * @return Writing_On_GitHub_Database
366
     */
367
    public function database() {
368
        if ( ! $this->database ) {
369
            $this->database = new Writing_On_GitHub_Database( $this );
370
        }
371
372
        return $this->database;
373
    }
374
375
    /**
376
     * Print to WP_CLI if in CLI environment or
377
     * write to debug.log if WP_DEBUG is enabled
378
     * @source http://www.stumiller.me/sending-output-to-the-wordpress-debug-log/
379
     *
380
     * @param mixed $msg
381
     * @param string $write
382
     */
383
    public static function write_log( $msg, $write = 'line' ) {
384
        if ( defined( 'WP_CLI' ) && WP_CLI ) {
0 ignored issues
show
Bug introduced by
The constant WP_CLI was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
385
            if ( is_array( $msg ) || is_object( $msg ) ) {
386
                WP_CLI::print_value( $msg );
387
            } else {
388
                WP_CLI::$write( $msg );
389
            }
390
        } elseif ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
391
            if ( is_array( $msg ) || is_object( $msg ) ) {
392
                error_log( print_r( $msg, true ) );
393
            } else {
394
                error_log( $msg );
395
            }
396
        }
397
    }
398
399
    /**
400
     * Kicks of an import or export cronjob.
401
     *
402
     * @param bool   $force
403
     * @param string $type
404
     */
405
    protected function start_cron( $type, $force = false ) {
406
        update_option( '_wogh_' . $type . '_started', 'yes' );
407
        $user_id = get_current_user_id();
408
        wp_schedule_single_event( time(), 'wogh_' . $type . '', array( $user_id, $force ) );
409
        spawn_cron();
410
    }
411
}
412