| Server IP : _ / Your IP : 169.254.129.1 Web Server : nginx/1.28.0 System : Linux 89e302d72aa1 6.6.143.1-1.azl3 #1 SMP PREEMPT_DYNAMIC Mon Jul 6 04:01:14 UTC 2026 x86_64 User : nginx ( 103) PHP Version : 8.2.30 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/wordpress/wp-content/plugins/quadmenu/includes/ |
Upload File : |
<?php
if (!defined('ABSPATH')) {
die('-1');
}
class QuadMenu_Compiler
{
public $redux = '';
public $args = array();
public static $instance;
public function __construct()
{
add_filter('quadmenu_global_js_data', array($this, 'js_data'));
add_action('init', array($this, 'activation'));
add_action('redux/page/' . QUADMENU_DB_OPTIONS . '/enqueue', array($this, 'enqueue'));
add_filter('redux/options/' . QUADMENU_DB_OPTIONS . '/ajax_save/response', array($this, 'developer_variables'));
add_filter('redux/options/' . QUADMENU_DB_OPTIONS . '/ajax_save/response', array($this, 'compile_variables'));
add_filter('redux/options/' . QUADMENU_DB_OPTIONS . '/compiler', array($this, 'compiler'), 5, 3);
add_action('wp_ajax_quadmenu_compiler_save', array($this, 'compiler_save'));
add_action('wp_ajax_nopriv_quadmenu_compiler_save', array($this, 'compiler_save'));
}
public static function instance()
{
if (!isset(self::$instance)) {
self::$instance = new QuadMenu_Compiler();
}
return self::$instance;
}
function activation()
{
if (!get_transient('_quadmenu_activation'))
return;
Quadmenu_Compiler::do_compiler(true);
}
function js_data($data)
{
global $quadmenu;
$data['debug'] = QUADMENU_DEV;
if ($compiler = $this->run_compiler()) {
$data['variables'] = self::less_variables($quadmenu);
$data['compiler'] = $compiler;
}
$data['files'] = apply_filters('quadmenu_compiler_files', array());
$data['nonce'] = wp_create_nonce('quadmenu');
$data['ajaxurl'] = admin_url( 'admin-ajax.php' );
return $data;
}
public function enqueue()
{
wp_register_script('quadmenu-less', QUADMENU_PLUGIN_URL . 'assets/backend/js/less.min.js', array(), QUADMENU_PLUGIN_VERSION, true);
wp_enqueue_script('quadmenu-compiler', QUADMENU_PLUGIN_URL . 'assets/backend/js/quadmenu-compiler' . QuadMenu::isMin() . '.js', array('quadmenu-less'), QUADMENU_PLUGIN_VERSION, true);
wp_localize_script('quadmenu-compiler', 'quadmenu', apply_filters('quadmenu_global_js_data', array()));
}
function developer_variables($return_array)
{
if (is_array($return_array)) {
$return_array['options'] = apply_filters('quadmenu_developer_options', $return_array['options']);
}
return $return_array;
}
function compile_variables($return_array)
{
if (is_array($return_array)) {
$return_array['variables'] = self::less_variables($return_array['options']);
}
return $return_array;
}
public function compiler_save()
{
if (!check_ajax_referer('quadmenu', 'nonce', false)) {
QuadMenu::send_json_error(esc_html__('Please reload page.', 'quadmenu'));
}
$return_array = array('status' => 'error');
if (!isset($_REQUEST['output']['imports'][0])) {
QuadMenu_Redux::add_notification('red', esc_html__('Imports is undefined.', 'quadmenu'));
wp_die();
}
if (!isset($_REQUEST['output']['css'])) {
QuadMenu_Redux::add_notification('red', esc_html__('CSS is undefined.', 'quadmenu'));
wp_die();
}
$file_ext = pathinfo($_REQUEST['output']['imports'][0], PATHINFO_EXTENSION);
if (!in_array($file_ext, array('less', 'css'))) {
wp_die('Cheating?');
}
$return_array['status'] = 'success';
$file_name = str_replace(".{$file_ext}", '.css', basename($_REQUEST['output']['imports'][0]));
try {
$this->save_file($file_name, QUADMENU_UPLOAD_DIR, stripslashes($_REQUEST['output']['css']));
} catch (Exception $e) {
$return_array['status'] = $e->getMessage();
}
ob_start();
QuadMenu_Redux::notification_bar();
$notification_bar = ob_get_contents();
ob_end_clean();
$return_array['notification_bar'] = $notification_bar;
Quadmenu_Compiler::do_compiler(false);
echo json_encode($return_array);
wp_die();
}
public static function do_compiler($run = true)
{
if ($run) {
update_option('_quadmenu_compiler', $run);
} else {
delete_option('_quadmenu_compiler');
}
}
public function run_compiler()
{
return (int) get_option('_quadmenu_compiler', false);
}
public function compiler($options, $css, $changed)
{
Quadmenu_Compiler::do_compiler(true);
QuadMenu_Redux::add_notification('yellow', sprintf(esc_html__('Some style options have been changed. Your stylesheet will be compiled to reflect changes. %s.', 'quadmenu'), esc_html__('Please wait', 'quadmenu')));
}
public function save_file($name = false, $dir = false, $content = false)
{
if (!$name || !$dir || !$content) {
return;
}
if (!class_exists('ReduxFrameworkInstances')) {
QuadMenu_Redux::add_notification('error', esc_html__('ReduxFramework is not installed', 'quadmenu'));
return;
}
$this->redux = ReduxFrameworkInstances::get_instance(QUADMENU_DB_OPTIONS);
// check if file exists ------------------------------------------------
$is_file = is_file(trailingslashit($dir) . $name);
// create the folder ---------------------------------------------------
if (!is_dir($dir)) {
$this->redux->filesystem->execute('mkdir', $dir);
QuadMenu_Redux::add_notification('yellow', sprintf(esc_html__('Folder created : %1$s', 'quadmenu'), $dir));
}
// write file ----------------------------------------------------------
if ($this->redux->filesystem->execute('put_contents', trailingslashit($dir) . $name, array('content' => $content))) {
QuadMenu_Redux::add_notification('green', sprintf(esc_html__('File has been %2$s : %1$s', 'quadmenu'), trailingslashit($dir) . $name, $is_file ? esc_html__('updated', 'quadmenu') : esc_html__('created', 'quadmenu')));
return;
}
QuadMenu_Redux::add_notification('error', sprintf(esc_html__('File cant\'t been created : %1$s', 'quadmenu'), trailingslashit($dir) . $name));
}
static public function less_variables(&$data, $header = '')
{
$html = array(); //QuadMenu_Compiler::less_themes();
if (!is_array($data))
return $data;
if (isset($data['styles'])) {
unset($data['styles']);
}
if (isset($data['styles_normalize'])) {
unset($data['styles_normalize']);
}
if (isset($data['styles_widgets'])) {
unset($data['styles_widgets']);
}
if (isset($data['styles_pscrollbar'])) {
unset($data['styles_pscrollbar']);
}
if (isset($data['styles_owlcarousel'])) {
unset($data['styles_owlcarousel']);
}
//if (isset($data['styles_icons'])) {
// unset($data['styles_icons']);
//}
if (isset($data['viewport'])) {
unset($data['viewport']);
}
if (isset($data['css'])) {
unset($data['css']);
}
if (isset($data['social'])) {
unset($data['social']);
}
if (isset($data['errors'])) {
unset($data['errors']);
}
if (isset($data['warnings'])) {
unset($data['warnings']);
}
if (isset($data['notification_bar'])) {
unset($data['notification_bar']);
}
foreach ($data as $key => &$val) {
$value = ($key != 'font-options') ? $val : '';
$value = (filter_var($value, FILTER_VALIDATE_URL)) ? "'{$value}'" : $value;
if (is_array($value)) {
$html = array_merge($html, self::less_variables($value, "{$key}_"));
} elseif ($value != '') {
$html["@{$header}{$key}"] = $value;
} else {
$html["@{$header}{$key}"] = 0;
}
}
return $html;
}
function redux_compiler($return_array = array())
{
global $quadmenu;
if (is_array($return_array)) {
$return_array['options'] = apply_filters('quadmenu_developer_options', $quadmenu);
$return_array['variables'] = self::less_variables($return_array['options']);
}
return $return_array;
}
}
new QuadMenu_Compiler();