/**
  * Generate the CSS for the widget.
  *
  * @param $instance
  * @return string
  */
 public function get_instance_css($instance)
 {
     if (!class_exists('lessc')) {
         require plugin_dir_path(__FILE__) . 'inc/lessc.inc.php';
     }
     if (!class_exists('SiteOrigin_Widgets_Less_Functions')) {
         require plugin_dir_path(__FILE__) . 'inc/less-functions.php';
     }
     $style_name = $this->get_style_name($instance);
     if (empty($style_name)) {
         return '';
     }
     $less_file = siteorigin_widget_get_plugin_dir_path($this->id_base) . 'styles/' . $style_name . '.less';
     $less_file = apply_filters('siteorigin_widgets_less_file_' . $this->id_base, $less_file, $instance, $this);
     $less = substr($less_file, -5) == '.less' && file_exists($less_file) ? file_get_contents($less_file) : '';
     // Substitute the variables
     if (!class_exists('SiteOrigin_Widgets_Color_Object')) {
         require plugin_dir_path(__FILE__) . 'inc/color.php';
     }
     // Lets widgets insert their own custom generated LESS
     $less = preg_replace_callback('/\\.widget-function\\((.*)\\);/', array($this, 'less_widget_inject'), $less);
     //handle less @import statements
     $less = preg_replace_callback('/^@import\\s+".*?\\/?([\\w-\\.]+)";/m', array($this, 'get_less_import_contents'), $less);
     $vars = $this->get_less_variables($instance);
     if (!empty($vars)) {
         foreach ($vars as $name => $value) {
             if (empty($value)) {
                 continue;
             }
             $less = preg_replace('/\\@' . preg_quote($name) . ' *\\:.*?;/', '@' . $name . ': ' . $value . ';', $less);
         }
     }
     $less = apply_filters('siteorigin_widgets_styles', $less, get_class($this), $instance);
     $less = apply_filters('siteorigin_widgets_less_' . $this->id_base, $less, $instance, $this);
     $style = $this->get_style_name($instance);
     $hash = $this->get_style_hash($instance);
     $css_name = $this->id_base . '-' . $style . '-' . $hash;
     //we assume that any remaining @imports are plain css imports and should be kept outside selectors
     $css_imports = '';
     if (preg_match_all('/^@import.+/m', $less, $imports)) {
         $css_imports = implode("\n", $imports[0]);
     }
     $less = $css_imports . "\n\n" . '.so-widget-' . $css_name . ' { ' . $less . ' } ';
     $c = new lessc();
     $lc_functions = new SiteOrigin_Widgets_Less_Functions($this, $instance);
     $lc_functions->registerFunctions($c);
     return apply_filters('siteorigin_widgets_instance_css', $c->compile($less), $instance, $this);
 }
 /**
  * Generate the CSS for the widget.
  *
  * @param $instance
  * @return string
  */
 public function get_instance_css($instance)
 {
     if (!class_exists('lessc')) {
         require plugin_dir_path(__FILE__) . 'inc/lessc.inc.php';
     }
     if (!class_exists('SiteOrigin_Widgets_Less_Functions')) {
         require plugin_dir_path(__FILE__) . 'inc/less-functions.php';
     }
     if (!method_exists($this, 'get_less_content')) {
         $style_name = $this->get_style_name($instance);
         if (empty($style_name)) {
             return '';
         }
         $less_file = siteorigin_widget_get_plugin_dir_path($this->id_base) . 'styles/' . $style_name . '.less';
         $less_file = apply_filters('siteorigin_widgets_less_file_' . $this->id_base, $less_file, $instance, $this);
         $less = substr($less_file, -5) == '.less' && file_exists($less_file) ? file_get_contents($less_file) : '';
     } else {
         // The widget is going handle getting the instance LESS
         $less = $this->get_less_content($instance);
     }
     // Substitute the variables
     if (!class_exists('SiteOrigin_Widgets_Color_Object')) {
         require plugin_dir_path(__FILE__) . 'inc/color.php';
     }
     // Lets widgets insert their own custom generated LESS
     $less = preg_replace_callback('/\\.widget-function\\((.*)\\);/', array($this, 'less_widget_inject'), $less);
     //handle less @import statements
     $less = preg_replace_callback('/^@import\\s+".*?\\/?([\\w-\\.]+)";/m', array($this, 'get_less_import_contents'), $less);
     $vars = $this->get_less_variables($instance);
     if (!empty($vars)) {
         foreach ($vars as $name => $value) {
             // Ignore empty string, false and null values (but keep '0')
             if ($value === '' || $value === false || $value === null) {
                 continue;
             }
             $less = preg_replace('/\\@' . preg_quote($name) . ' *\\:.*?;/', '@' . $name . ': ' . $value . ';', $less);
         }
     }
     $less = apply_filters('siteorigin_widgets_styles', $less, $this->widget_class, $instance);
     $less = apply_filters('siteorigin_widgets_less_' . $this->id_base, $less, $instance, $this);
     $style = $this->get_style_name($instance);
     $hash = $this->get_style_hash($instance);
     $css_name = $this->id_base . '-' . $style . '-' . $hash;
     //we assume that any remaining @imports are plain css imports and should be kept outside selectors
     $css_imports = '';
     if (preg_match_all('/^@import.+/m', $less, $imports)) {
         $css_imports = implode("\n", $imports[0]);
         $less = preg_replace('/^@import.+/m', '', $less);
     }
     $less = $css_imports . "\n\n" . '.so-widget-' . $css_name . " { \n" . $less . "\n } ";
     $compiler = new lessc();
     $lc_functions = new SiteOrigin_Widgets_Less_Functions($this, $instance);
     $lc_functions->registerFunctions($compiler);
     try {
         if (method_exists($compiler, 'compile')) {
             $css = $compiler->compile($less);
         }
     } catch (Exception $e) {
         $css = '';
     }
     // Remove any attributes with default as the value
     $css = preg_replace('/[a-zA-Z\\-]+ *: *default *;/', '', $css);
     // Remove any empty CSS
     $css = preg_replace('/[^{}]*\\{\\s*\\}/m', '', $css);
     $css = trim($css);
     return apply_filters('siteorigin_widgets_instance_css', $css, $instance, $this);
 }