Passed
Push — ci ( ddfce8 )
by litefeel
02:07
created

Writing_On_GitHub::import()   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
if ( defined( 'WRITING_ON_GITHUB_TEST' ) && WRITING_ON_GITHUB_TEST ) {
16
	$path = dirname( __FILE__ ) . '/vendor/autoload.php';
17
	include_once $path;
18
}
19
20
21
// require_once(dirname(__FILE__) . '/Spyc.php');
22
require_once(dirname(__FILE__) . '/lib/cache.php');
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...
23
require_once(dirname(__FILE__) . '/lib/database.php');
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...
24
require_once(dirname(__FILE__) . '/lib/admin.php');
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...
25
require_once(dirname(__FILE__) . '/lib/payload.php');
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...
26
require_once(dirname(__FILE__) . '/lib/post.php');
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...
27
// require_once(dirname(__FILE__) . '/lib/cli.php');
28
require_once(dirname(__FILE__) . '/lib/controller.php');
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...
29
require_once(dirname(__FILE__) . '/lib/export.php');
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...
30
require_once(dirname(__FILE__) . '/lib/semaphore.php');
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...
31
require_once(dirname(__FILE__) . '/lib/request.php');
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...
32
require_once(dirname(__FILE__) . '/lib/client/base.php');
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...
33
require_once(dirname(__FILE__) . '/lib/client/fetch.php');
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...
34
require_once(dirname(__FILE__) . '/lib/client/persist.php');
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...
35
require_once(dirname(__FILE__) . '/lib/import.php');
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...
36
require_once(dirname(__FILE__) . '/lib/api.php');
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...
37
require_once(dirname(__FILE__) . '/lib/fileinfo.php');
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...
38
require_once(dirname(__FILE__) . '/lib/blob.php');
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...
39
require_once(dirname(__FILE__) . '/lib/response.php');
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...
40
// require_once(dirname(__FILE__) . '/views/setting-field.php');
41
// require_once(dirname(__FILE__) . '/views/options.php');
42
// require_once(dirname(__FILE__) . '/views/user-setting-field.php');
43
44
add_action( 'plugins_loaded', array( new Writing_On_GitHub, 'boot' ) );
45
46
class Writing_On_GitHub {
47
48
	/**
49
	 * Object instance
50
	 * @var self
51
	 */
52
	public static $instance;
53
54
	/**
55
	 * Language text domain
56
	 * @var string
57
	 */
58
	public static $text_domain = 'writing-on-github';
59
60
	/**
61
	 * Controller object
62
	 * @var Writing_On_GitHub_Controller
63
	 */
64
	public $controller;
65
66
	/**
67
	 * Controller object
68
	 * @var Writing_On_GitHub_Admin
69
	 */
70
	public $admin;
71
72
	/**
73
	 * CLI object.
74
	 *
75
	 * @var Writing_On_GitHub_CLI
76
	 */
77
	protected $cli;
78
79
	/**
80
	 * Request object.
81
	 *
82
	 * @var Writing_On_GitHub_Request
83
	 */
84
	protected $request;
85
86
	/**
87
	 * Response object.
88
	 *
89
	 * @var Writing_On_GitHub_Response
90
	 */
91
	protected $response;
92
93
	/**
94
	 * Api object.
95
	 *
96
	 * @var Writing_On_GitHub_Api
97
	 */
98
	protected $api;
99
100
	/**
101
	 * Import object.
102
	 *
103
	 * @var Writing_On_GitHub_Import
104
	 */
105
	protected $import;
106
107
	/**
108
	 * Export object.
109
	 *
110
	 * @var Writing_On_GitHub_Export
111
	 */
112
	protected $export;
113
114
	/**
115
	 * Semaphore object.
116
	 *
117
	 * @var Writing_On_GitHub_Semaphore
118
	 */
119
	protected $semaphore;
120
121
	/**
122
	 * Database object.
123
	 *
124
	 * @var Writing_On_GitHub_Database
125
	 */
126
	protected $database;
127
128
	/**
129
	 * Cache object.
130
	 *
131
	 * @var Writing_On_GitHub_Cache
132
	 */
133
	protected $cache;
134
135
	/**
136
	 * Called at load time, hooks into WP core
137
	 */
138
	public function __construct() {
139
		self::$instance = $this;
140
141
		if ( is_admin() ) {
142
			$this->admin = new Writing_On_GitHub_Admin;
143
		}
144
145
		$this->controller = new Writing_On_GitHub_Controller( $this );
146
147
		if ( defined( 'WP_CLI' ) && WP_CLI ) {
148
			WP_CLI::add_command( 'wogh', $this->cli() );
149
		}
150
	}
151
152
	/**
153
	 * Attaches the plugin's hooks into WordPress.
154
	 */
155
	public function boot() {
156
		register_activation_hook( __FILE__, array( $this, 'activate' ) );
157
		add_action( 'admin_notices', array( $this, 'activation_notice' ) );
158
159
		add_action( 'init', array( $this, 'l10n' ) );
160
161
		// Controller actions.
162
		add_action( 'save_post', array( $this->controller, 'export_post' ) );
163
		add_action( 'delete_post', array( $this->controller, 'delete_post' ) );
164
		add_action( 'wp_ajax_nopriv_wogh_push_request', array( $this->controller, 'pull_posts' ) );
165
        add_action( 'wogh_export', array( $this->controller, 'export_all' ), 10, 2 );
166
		add_action( 'wogh_import', array( $this->controller, 'import_master' ), 10, 1 );
167
		add_filter( 'get_edit_post_link', array( $this, 'edit_post_link' ), 10, 3 );
168
169
		// add_filter( 'wogh_post_meta', array( $this, 'ignore_post_meta' ), 10, 1 );
170
		// add_filter( 'wogh_pre_import_meta', array( $this, 'ignore_post_meta' ), 10, 1 );
171
		add_filter( 'the_content', array( $this, 'the_content' ) );
172
173
		do_action( 'wogh_boot', $this );
174
	}
175
176
	public function edit_post_link($link, $postID, $context) {
0 ignored issues
show
Unused Code introduced by
The parameter $context is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

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