Passed
Push — master ( c00ab5...5ed1e2 )
by litefeel
03:01
created

Writing_On_GitHub::cli()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
dl 0
loc 7
ccs 0
cts 4
cp 0
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 4
nc 2
nop 0
crap 6
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