175 lines
4.6 KiB
PHP
175 lines
4.6 KiB
PHP
<?php
|
|
/**
|
|
* Central place to load the Code Editor used throughout the plugin with
|
|
* similar settings.
|
|
*
|
|
* @package WPCode
|
|
*/
|
|
|
|
/**
|
|
* Class WPCode_Code_Editor.
|
|
*/
|
|
class WPCode_Code_Editor {
|
|
|
|
|
|
/**
|
|
* Array of settings used to instantiate the editor.
|
|
*
|
|
* @var array
|
|
*/
|
|
private $settings;
|
|
|
|
/**
|
|
* Array of ids of textareas to init as code editors.
|
|
*
|
|
* @var array
|
|
*/
|
|
private $editors;
|
|
|
|
/**
|
|
* WPCode_Code_Editor Constructor.
|
|
*
|
|
* @param string $code_type The code type that will be converted to the mime type for the editor.
|
|
*/
|
|
public function __construct( $code_type = 'html' ) {
|
|
$this->load_code_mirror( $code_type );
|
|
}
|
|
|
|
/**
|
|
* If called, this loads CodeMirror on the current admin page with checks.
|
|
*
|
|
* @param string $code_type The code type that will be converted to the mime type for the editor.
|
|
*
|
|
* @return array|false
|
|
*/
|
|
public function load_code_mirror( $code_type ) {
|
|
if ( ! function_exists( 'wp_enqueue_code_editor' ) ) {
|
|
return false;
|
|
}
|
|
$editor_args = array(
|
|
'type' => wpcode()->execute->get_mime_for_code_type( $code_type ),
|
|
'showHint' => true,
|
|
'codemirror' => array(
|
|
'matchBrackets' => true,
|
|
'gutters' => array( 'CodeMirror-lint-markers', 'CodeMirror-foldgutter' ),
|
|
'foldGutter' => true,
|
|
'autoCloseBrackets' => true,
|
|
'highlightSelectionMatches' => true,
|
|
),
|
|
);
|
|
if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
|
|
$editor_args['codemirror']['readOnly'] = true;
|
|
}
|
|
|
|
// Check if the DISALLOW_UNFILTERED_HTML is defined and print the warning message
|
|
if ( defined( 'DISALLOW_UNFILTERED_HTML' ) && DISALLOW_UNFILTERED_HTML ) {
|
|
WPCode_Notice::warning(
|
|
esc_html__( 'The PHP constant DISALLOW_UNFILTERED_HTML is currently defined, which is preventing WPCode from saving code accurately. Please contact your webmaster for assistance in disabling this restriction.', 'insert-headers-and-footers' )
|
|
);
|
|
}
|
|
|
|
// Allow filtering of the editor args.
|
|
$editor_args = apply_filters( 'wpcode_editor_config', $editor_args );
|
|
|
|
// Add filter to override the current user meta for syntax highlighting.
|
|
add_filter( 'get_user_metadata', array( $this, 'override_user_meta' ), 10, 4 );
|
|
// Enqueue code editor and settings for manipulating HTML.
|
|
$this->settings = wp_enqueue_code_editor( $editor_args );
|
|
// Remove the filter.
|
|
remove_filter( 'get_user_metadata', array( $this, 'override_user_meta' ) );
|
|
|
|
return $this->settings;
|
|
}
|
|
|
|
/**
|
|
* When using the WPCode editor always load syntax highlighting.
|
|
*
|
|
* @param mixed $value The meta value.
|
|
* @param int $object_id The user ID.
|
|
* @param string $meta_key The meta key being looked up.
|
|
* @param bool $single True if only the first value should be returned.
|
|
*
|
|
* @return bool|mixed
|
|
*/
|
|
public function override_user_meta( $value, $object_id, $meta_key, $single ) {
|
|
if ( 'syntax_highlighting' !== $meta_key || ! apply_filters( 'wpcode_override_syntax_highlighting', true ) ) {
|
|
return $value;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Load hint scripts if needed.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function load_hint_scripts() {
|
|
wp_enqueue_script( 'htmlhint' );
|
|
wp_enqueue_script( 'csslint' );
|
|
wp_enqueue_script( 'jshint' );
|
|
}
|
|
|
|
/**
|
|
* Update a setting for the editor instance.
|
|
*
|
|
* @param string $key Key of setting to update.
|
|
* @param mixed $value Value to set the setting to, can be string, integer, array.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function set_setting( $key, $value ) {
|
|
if ( ! isset( $this->settings ) ) {
|
|
return;
|
|
}
|
|
if ( ! isset( $this->settings['codemirror'] ) ) {
|
|
$this->settings['codemirror'] = array();
|
|
}
|
|
|
|
$this->settings['codemirror'][ $key ] = $value;
|
|
}
|
|
|
|
/**
|
|
* Load the inline script needed to initiate the code editor using the current settings.
|
|
*
|
|
* @param string $id The textarea ID to init the editor for.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function register_editor( $id ) {
|
|
$this->editors[] = $id;
|
|
}
|
|
|
|
/**
|
|
* Load the inline script needed to initiate the code editor using the current settings.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function init_editor() {
|
|
wp_add_inline_script(
|
|
'code-editor',
|
|
sprintf(
|
|
'
|
|
jQuery( function() {
|
|
window.wpcode_editor = window.wpcode_editor ? window.wpcode_editor : {};
|
|
var ids = %1$s;
|
|
var settings = %2$s;
|
|
for ( var i in ids ) {
|
|
window.wpcode_editor[ids[i]] = wp.codeEditor.initialize( ids[i], settings );
|
|
}
|
|
} );',
|
|
wp_json_encode( $this->editors ),
|
|
wp_json_encode( $this->get_settings() )
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get the settings.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_settings() {
|
|
return $this->settings;
|
|
}
|
|
}
|