PluginProbe
Master Addons for Elementor – Elementor Addons, Widgets, Mega Menu Builder, Popup Builder, Widget Builder & Template Kits / 3.1.9
Master Addons for Elementor – Elementor Addons, Widgets, Mega Menu Builder, Popup Builder, Widget Builder & Template Kits v3.1.9
3.2.2 3.2.3 3.2.1 3.2.0 3.1.9 3.1.8 3.1.7 3.1.6 3.1.5 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.9 trunk 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.3 1.1.4 1.1.5 All 174 releases
master-addons / inc / admin / widget-builder / icon-library-helper.php

icon-library-helper.php in Master Addons for Elementor – Elementor Addons, Widgets, Mega Menu Builder, Popup Builder, Widget Builder & Template Kits 3.1.9, at inc/admin/widget-builder/icon-library-helper.php

239 lines 7.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace MasterAddons\Inc\Admin\WidgetBuilder;
3
4 if (!defined('ABSPATH')) {
5 exit;
6 }
7
8 /**
9 * Icon Library Helper
10 * Handles icon library CSS enqueuing and configuration
11 *
12 * @package MasterAddons
13 * @subpackage WidgetBuilder
14 */
15 class Icon_Library_Helper
16 {
17 private static $instance = null;
18
19 public static function get_instance()
20 {
21 if (null === self::$instance) {
22 self::$instance = new self();
23 }
24 return self::$instance;
25 }
26
27 /**
28 * Enqueue icon library CSS files
29 */
30 public function enqueue_icon_libraries()
31 {
32 $plugin_url = trailingslashit(JLTMA_URL);
33 $fonts_path = $plugin_url . 'assets/fonts/';
34
35 // Elementor Icons — use Elementor's copy if available, otherwise local fallback
36 if (wp_style_is('elementor-icons', 'registered')) {
37 wp_enqueue_style('elementor-icons');
38 } else {
39 wp_enqueue_style('jltma-elementor-icons');
40 }
41
42 // Simple Line Icons
43 wp_enqueue_style(
44 'jltma-simple-line-icons',
45 $fonts_path . 'simple-line-icons/simple-line-icons.css',
46 [],
47 JLTMA_VER
48 );
49
50 // Iconic Fonts
51 wp_enqueue_style(
52 'jltma-iconic-fonts',
53 $fonts_path . 'iconic-fonts/iconic-font.min.css',
54 [],
55 JLTMA_VER
56 );
57
58 // Linear Icons
59 wp_enqueue_style(
60 'jltma-linear-icons',
61 $fonts_path . 'linear-icons/linear-icons.css',
62 [],
63 JLTMA_VER
64 );
65
66 // Material Icons
67 wp_enqueue_style(
68 'jltma-material-icons',
69 $fonts_path . 'material-icons/material-icons.css',
70 [],
71 JLTMA_VER
72 );
73
74 /**
75 * Allow premium to register extra icon font stylesheets (Feather, Remix, Teeny, etc.).
76 *
77 * Each entry: [ 'handle' => string, 'src' => string (absolute URL) ].
78 *
79 * @param array $extra_fonts Additional icon font stylesheets to enqueue.
80 * @param string $fonts_path Base URL of the free icon fonts folder.
81 */
82 $extra_fonts = apply_filters('master_addons/widget_builder/icon_libraries', [], $fonts_path);
83
84 if (is_array($extra_fonts)) {
85 foreach ($extra_fonts as $font) {
86 if (empty($font['handle']) || empty($font['src'])) {
87 continue;
88 }
89
90 wp_enqueue_style($font['handle'], $font['src'], [], JLTMA_VER);
91 }
92 }
93 }
94
95 /**
96 * Get icon library configuration
97 * Parses CSS files to extract icon class names
98 */
99 public function get_icon_library_config()
100 {
101 $fonts_dir = JLTMA_PATH . 'assets/fonts/';
102
103 $libraries = [];
104
105 // Add Elementor Icons — use Elementor's copy if available, otherwise local fallback
106 $eicons_css = null;
107 if (defined('ELEMENTOR_ASSETS_PATH') && file_exists(ELEMENTOR_ASSETS_PATH . 'lib/eicons/css/elementor-icons.min.css')) {
108 $eicons_css = ELEMENTOR_ASSETS_PATH . 'lib/eicons/css/elementor-icons.min.css';
109 } elseif (file_exists(JLTMA_PATH . 'assets/fonts/elementor-icon/elementor-icons.css')) {
110 $eicons_css = JLTMA_PATH . 'assets/fonts/elementor-icon/elementor-icons.css';
111 }
112 if ($eicons_css) {
113 $libraries['Elementor Icons'] = [
114 'prefix' => 'eicon-',
115 'display_prefix' => 'eicon eicon-',
116 'list-icon' => 'eicon eicon-elementor',
117 'icon-style' => 'elementor-icons',
118 'css_file' => $eicons_css
119 ];
120 }
121
122 // Add other icon libraries
123 $libraries = array_merge($libraries, [
124 'Simple Line Icons' => [
125 'prefix' => 'icon-',
126 'display_prefix' => 'icon-',
127 'list-icon' => 'icon-heart',
128 'icon-style' => 'simple-line-icons',
129 'css_file' => $fonts_dir . 'simple-line-icons/simple-line-icons.css'
130 ],
131 'Iconic Font Icons' => [
132 'prefix' => 'im-',
133 'display_prefix' => 'im im-',
134 'list-icon' => 'im im-flag',
135 'icon-style' => 'iconic-fonts',
136 'css_file' => $fonts_dir . 'iconic-fonts/iconic-font.min.css'
137 ],
138 'Linear Icons' => [
139 'prefix' => 'lnr-',
140 'display_prefix' => 'lnr lnr-',
141 'list-icon' => 'lnr lnr-flag',
142 'icon-style' => 'linear-icons',
143 'css_file' => $fonts_dir . 'linear-icons/linear-icons.css'
144 ],
145 'Material Icons' => [
146 'prefix' => 'jltma-material-icon-',
147 'display_prefix' => 'jltma-material-icon-',
148 'list-icon' => 'jltma-material-icon-flag',
149 'icon-style' => 'material-icons',
150 'css_file' => $fonts_dir . 'material-icons/material-icons.css'
151 ],
152 ]);
153
154 /**
155 * Allow premium to register extra icon libraries (Feather, Remix, Teeny, etc.).
156 *
157 * Each entry keyed by library name:
158 * [ 'prefix' => ..., 'display_prefix' => ..., 'list-icon' => ..., 'icon-style' => ..., 'css_file' => absolute path ].
159 *
160 * @param array $libraries Icon libraries to parse.
161 * @param string $base_path Plugin filesystem base path (JLTMA_PATH).
162 */
163 $libraries = apply_filters('master_addons/widget_builder/icon_library_config', $libraries, JLTMA_PATH);
164
165 $config = [];
166
167 foreach ($libraries as $library_name => $library_data) {
168 $icons = $this->parse_icon_classes_from_css($library_data['css_file'], $library_data['prefix']);
169
170 if (!empty($icons)) {
171 $config[$library_name] = [
172 '' => [
173 'prefix' => $library_data['display_prefix'],
174 'list-icon' => $library_data['list-icon'],
175 'icon-style' => $library_data['icon-style'],
176 'icons' => $icons
177 ]
178 ];
179 }
180 }
181
182 return $config;
183 }
184
185 /**
186 * Parse CSS file to extract icon class names
187 */
188 private function parse_icon_classes_from_css($css_file, $prefix)
189 {
190 if (!file_exists($css_file)) {
191 return [];
192 }
193
194 $css_content = file_get_contents($css_file);
195 $icons = [];
196
197 // Standard pattern matching for all libraries
198 $trim_prefix = trim($prefix);
199 $pattern = '/\.' . preg_quote($trim_prefix, '/') . '([a-zA-Z0-9_-]+)(?:\s|,|:|\{|::)/i';
200
201 preg_match_all($pattern, $css_content, $matches);
202 if (!empty($matches[1])) {
203 foreach ($matches[1] as $icon_name) {
204 // Skip pseudo-classes and common CSS properties
205 if (in_array($icon_name, ['before', 'after', 'hover', 'active', 'focus', 'disabled'])) {
206 continue;
207 }
208
209 // Return just the icon name (suffix after prefix)
210 if (!in_array($icon_name, $icons)) {
211 $icons[] = $icon_name;
212 }
213 }
214 }
215
216 // Remove duplicates and sort
217 $icons = array_unique($icons);
218 sort($icons);
219
220 return array_values($icons);
221 }
222
223 /**
224 * Localize icon library data for JavaScript
225 */
226 public function localize_icon_library()
227 {
228 $icon_config = $this->get_icon_library_config();
229
230 wp_localize_script(
231 'jltma-widget-builder-app',
232 'JLTMAIconLibrary',
233 [
234 'libraries' => $icon_config
235 ]
236 );
237 }
238 }
239