danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 * Integrates client-side editors with Drupal.
|
danielebarchiesi@0
|
6 */
|
danielebarchiesi@0
|
7
|
danielebarchiesi@0
|
8 /**
|
danielebarchiesi@0
|
9 * Implements hook_entity_info().
|
danielebarchiesi@0
|
10 */
|
danielebarchiesi@0
|
11 function wysiwyg_entity_info() {
|
danielebarchiesi@0
|
12 $types['wysiwyg_profile'] = array(
|
danielebarchiesi@0
|
13 'label' => t('Wysiwyg profile'),
|
danielebarchiesi@0
|
14 'base table' => 'wysiwyg',
|
danielebarchiesi@0
|
15 'controller class' => 'WysiwygProfileController',
|
danielebarchiesi@0
|
16 'fieldable' => FALSE,
|
danielebarchiesi@0
|
17 // When loading all entities, DrupalDefaultEntityController::load() ignores
|
danielebarchiesi@0
|
18 // its static cache. Therefore, wysiwyg_profile_load_all() implements a
|
danielebarchiesi@0
|
19 // custom static cache.
|
danielebarchiesi@0
|
20 'static cache' => FALSE,
|
danielebarchiesi@0
|
21 'entity keys' => array(
|
danielebarchiesi@0
|
22 'id' => 'format',
|
danielebarchiesi@0
|
23 ),
|
danielebarchiesi@0
|
24 );
|
danielebarchiesi@0
|
25 return $types;
|
danielebarchiesi@0
|
26 }
|
danielebarchiesi@0
|
27
|
danielebarchiesi@0
|
28 /**
|
danielebarchiesi@0
|
29 * Controller class for Wysiwyg profiles.
|
danielebarchiesi@0
|
30 */
|
danielebarchiesi@0
|
31 class WysiwygProfileController extends DrupalDefaultEntityController {
|
danielebarchiesi@0
|
32 /**
|
danielebarchiesi@0
|
33 * Overrides DrupalDefaultEntityController::attachLoad().
|
danielebarchiesi@0
|
34 */
|
danielebarchiesi@0
|
35 function attachLoad(&$queried_entities, $revision_id = FALSE) {
|
danielebarchiesi@0
|
36 // Unserialize the profile settings.
|
danielebarchiesi@0
|
37 foreach ($queried_entities as $key => $record) {
|
danielebarchiesi@0
|
38 $queried_entities[$key]->settings = unserialize($record->settings);
|
danielebarchiesi@0
|
39 }
|
danielebarchiesi@0
|
40 // Call the default attachLoad() method.
|
danielebarchiesi@0
|
41 parent::attachLoad($queried_entities, $revision_id);
|
danielebarchiesi@0
|
42 }
|
danielebarchiesi@0
|
43 }
|
danielebarchiesi@0
|
44
|
danielebarchiesi@0
|
45 /**
|
danielebarchiesi@0
|
46 * Implementation of hook_menu().
|
danielebarchiesi@0
|
47 */
|
danielebarchiesi@0
|
48 function wysiwyg_menu() {
|
danielebarchiesi@0
|
49 $items['admin/config/content/wysiwyg'] = array(
|
danielebarchiesi@0
|
50 'title' => 'Wysiwyg profiles',
|
danielebarchiesi@0
|
51 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
52 'page arguments' => array('wysiwyg_profile_overview'),
|
danielebarchiesi@0
|
53 'description' => 'Configure client-side editors.',
|
danielebarchiesi@0
|
54 'access arguments' => array('administer filters'),
|
danielebarchiesi@0
|
55 'file' => 'wysiwyg.admin.inc',
|
danielebarchiesi@0
|
56 );
|
danielebarchiesi@0
|
57 $items['admin/config/content/wysiwyg/profile'] = array(
|
danielebarchiesi@0
|
58 'title' => 'List',
|
danielebarchiesi@0
|
59 'type' => MENU_DEFAULT_LOCAL_TASK,
|
danielebarchiesi@0
|
60 );
|
danielebarchiesi@0
|
61 $items['admin/config/content/wysiwyg/profile/%wysiwyg_profile/edit'] = array(
|
danielebarchiesi@0
|
62 'title' => 'Edit',
|
danielebarchiesi@0
|
63 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
64 'page arguments' => array('wysiwyg_profile_form', 5),
|
danielebarchiesi@0
|
65 'access arguments' => array('administer filters'),
|
danielebarchiesi@0
|
66 'file' => 'wysiwyg.admin.inc',
|
danielebarchiesi@0
|
67 'tab_root' => 'admin/config/content/wysiwyg/profile',
|
danielebarchiesi@0
|
68 'tab_parent' => 'admin/config/content/wysiwyg/profile/%wysiwyg_profile',
|
danielebarchiesi@0
|
69 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
70 );
|
danielebarchiesi@0
|
71 $items['admin/config/content/wysiwyg/profile/%wysiwyg_profile/delete'] = array(
|
danielebarchiesi@0
|
72 'title' => 'Remove',
|
danielebarchiesi@0
|
73 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
74 'page arguments' => array('wysiwyg_profile_delete_confirm', 5),
|
danielebarchiesi@0
|
75 'access arguments' => array('administer filters'),
|
danielebarchiesi@0
|
76 'file' => 'wysiwyg.admin.inc',
|
danielebarchiesi@0
|
77 'tab_root' => 'admin/config/content/wysiwyg/profile',
|
danielebarchiesi@0
|
78 'tab_parent' => 'admin/config/content/wysiwyg/profile/%wysiwyg_profile',
|
danielebarchiesi@0
|
79 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
80 'weight' => 10,
|
danielebarchiesi@0
|
81 );
|
danielebarchiesi@0
|
82 // @see wysiwyg_dialog()
|
danielebarchiesi@0
|
83 $items['wysiwyg/%'] = array(
|
danielebarchiesi@0
|
84 'page callback' => 'wysiwyg_dialog',
|
danielebarchiesi@0
|
85 'page arguments' => array(1),
|
danielebarchiesi@0
|
86 'delivery callback' => 'wysiwyg_deliver_dialog_page',
|
danielebarchiesi@0
|
87 'access arguments' => array('access content'),
|
danielebarchiesi@0
|
88 'type' => MENU_CALLBACK,
|
danielebarchiesi@0
|
89 'file' => 'wysiwyg.dialog.inc',
|
danielebarchiesi@0
|
90 );
|
danielebarchiesi@0
|
91 return $items;
|
danielebarchiesi@0
|
92 }
|
danielebarchiesi@0
|
93
|
danielebarchiesi@0
|
94 /**
|
danielebarchiesi@0
|
95 * Implements hook_element_info().
|
danielebarchiesi@0
|
96 */
|
danielebarchiesi@0
|
97 function wysiwyg_element_info() {
|
danielebarchiesi@0
|
98 // @see wysiwyg_dialog()
|
danielebarchiesi@0
|
99 $types['wysiwyg_dialog_page'] = array(
|
danielebarchiesi@0
|
100 '#theme' => 'wysiwyg_dialog_page',
|
danielebarchiesi@0
|
101 '#theme_wrappers' => array('html'),
|
danielebarchiesi@0
|
102 '#show_messages' => TRUE,
|
danielebarchiesi@0
|
103 );
|
danielebarchiesi@0
|
104 return $types;
|
danielebarchiesi@0
|
105 }
|
danielebarchiesi@0
|
106
|
danielebarchiesi@0
|
107 /**
|
danielebarchiesi@0
|
108 * Implementation of hook_theme().
|
danielebarchiesi@0
|
109 *
|
danielebarchiesi@0
|
110 * @see drupal_common_theme(), common.inc
|
danielebarchiesi@0
|
111 * @see template_preprocess_page(), theme.inc
|
danielebarchiesi@0
|
112 */
|
danielebarchiesi@0
|
113 function wysiwyg_theme() {
|
danielebarchiesi@0
|
114 return array(
|
danielebarchiesi@0
|
115 'wysiwyg_profile_overview' => array(
|
danielebarchiesi@0
|
116 'render element' => 'form',
|
danielebarchiesi@0
|
117 ),
|
danielebarchiesi@0
|
118 'wysiwyg_admin_button_table' => array(
|
danielebarchiesi@0
|
119 'render element' => 'form',
|
danielebarchiesi@0
|
120 ),
|
danielebarchiesi@0
|
121 // @see wysiwyg_dialog()
|
danielebarchiesi@0
|
122 'wysiwyg_dialog_page' => array(
|
danielebarchiesi@0
|
123 'render element' => 'page',
|
danielebarchiesi@0
|
124 'file' => 'wysiwyg.dialog.inc',
|
danielebarchiesi@0
|
125 'template' => 'wysiwyg-dialog-page',
|
danielebarchiesi@0
|
126 ),
|
danielebarchiesi@0
|
127 );
|
danielebarchiesi@0
|
128 }
|
danielebarchiesi@0
|
129
|
danielebarchiesi@0
|
130 /**
|
danielebarchiesi@0
|
131 * Implementation of hook_help().
|
danielebarchiesi@0
|
132 */
|
danielebarchiesi@0
|
133 function wysiwyg_help($path, $arg) {
|
danielebarchiesi@0
|
134 switch ($path) {
|
danielebarchiesi@0
|
135 case 'admin/config/content/wysiwyg':
|
danielebarchiesi@0
|
136 $output = '<p>' . t('A Wysiwyg profile is associated with a text format. A Wysiwyg profile defines which client-side editor is loaded with a particular text format, what buttons or themes are enabled for the editor, how the editor is displayed, and a few other editor-specific functions.') . '</p>';
|
danielebarchiesi@0
|
137 return $output;
|
danielebarchiesi@0
|
138 }
|
danielebarchiesi@0
|
139 }
|
danielebarchiesi@0
|
140
|
danielebarchiesi@0
|
141 /**
|
danielebarchiesi@0
|
142 * Implementation of hook_form_alter().
|
danielebarchiesi@0
|
143 */
|
danielebarchiesi@0
|
144 function wysiwyg_form_alter(&$form, &$form_state) {
|
danielebarchiesi@0
|
145 // Teaser splitter is unconditionally removed and NOT supported.
|
danielebarchiesi@0
|
146 if (isset($form['body_field'])) {
|
danielebarchiesi@0
|
147 unset($form['body_field']['teaser_js']);
|
danielebarchiesi@0
|
148 }
|
danielebarchiesi@0
|
149 }
|
danielebarchiesi@0
|
150
|
danielebarchiesi@0
|
151 /**
|
danielebarchiesi@0
|
152 * Implements hook_element_info_alter().
|
danielebarchiesi@0
|
153 */
|
danielebarchiesi@0
|
154 function wysiwyg_element_info_alter(&$types) {
|
danielebarchiesi@0
|
155 $types['text_format']['#pre_render'][] = 'wysiwyg_pre_render_text_format';
|
danielebarchiesi@0
|
156 }
|
danielebarchiesi@0
|
157
|
danielebarchiesi@0
|
158 /**
|
danielebarchiesi@0
|
159 * Process a text format widget to load and attach editors.
|
danielebarchiesi@0
|
160 *
|
danielebarchiesi@0
|
161 * The element's #id is used as reference to attach client-side editors.
|
danielebarchiesi@0
|
162 */
|
danielebarchiesi@0
|
163 function wysiwyg_pre_render_text_format($element) {
|
danielebarchiesi@0
|
164 // filter_process_format() copies properties to the expanded 'value' child
|
danielebarchiesi@0
|
165 // element. Skip this text format widget, if it contains no 'format' or when
|
danielebarchiesi@0
|
166 // the current user does not have access to edit the value.
|
danielebarchiesi@0
|
167 if (!isset($element['format']) || !empty($element['value']['#disabled'])) {
|
danielebarchiesi@0
|
168 return $element;
|
danielebarchiesi@0
|
169 }
|
danielebarchiesi@0
|
170 // Allow modules to programmatically enforce no client-side editor by setting
|
danielebarchiesi@0
|
171 // the #wysiwyg property to FALSE.
|
danielebarchiesi@0
|
172 if (isset($element['#wysiwyg']) && !$element['#wysiwyg']) {
|
danielebarchiesi@0
|
173 return $element;
|
danielebarchiesi@0
|
174 }
|
danielebarchiesi@0
|
175
|
danielebarchiesi@0
|
176 $format_field = &$element['format'];
|
danielebarchiesi@0
|
177 $field = &$element['value'];
|
danielebarchiesi@0
|
178 $settings = array(
|
danielebarchiesi@0
|
179 'field' => $field['#id'],
|
danielebarchiesi@0
|
180 );
|
danielebarchiesi@0
|
181
|
danielebarchiesi@0
|
182 // If this textarea is #resizable and we will load at least one
|
danielebarchiesi@0
|
183 // editor, then only load the behavior and let the 'none' editor
|
danielebarchiesi@0
|
184 // attach/detach it to avoid hi-jacking the UI. Due to our CSS class
|
danielebarchiesi@0
|
185 // parsing, we can add arbitrary parameters for each input format.
|
danielebarchiesi@0
|
186 // The #resizable property will be removed below, if at least one
|
danielebarchiesi@0
|
187 // profile has been loaded.
|
danielebarchiesi@0
|
188 $resizable = 0;
|
danielebarchiesi@0
|
189 if (!empty($field['#resizable'])) {
|
danielebarchiesi@0
|
190 $resizable = 1;
|
danielebarchiesi@0
|
191 drupal_add_js('misc/textarea.js');
|
danielebarchiesi@0
|
192 }
|
danielebarchiesi@0
|
193 // Determine the available text formats.
|
danielebarchiesi@0
|
194 foreach ($format_field['format']['#options'] as $format_id => $format_name) {
|
danielebarchiesi@0
|
195 $format = 'format' . $format_id;
|
danielebarchiesi@0
|
196 // Initialize default settings, defaulting to 'none' editor.
|
danielebarchiesi@0
|
197 $settings[$format] = array(
|
danielebarchiesi@0
|
198 'editor' => 'none',
|
danielebarchiesi@0
|
199 'status' => 1,
|
danielebarchiesi@0
|
200 'toggle' => 1,
|
danielebarchiesi@0
|
201 'resizable' => $resizable,
|
danielebarchiesi@0
|
202 );
|
danielebarchiesi@0
|
203
|
danielebarchiesi@0
|
204 // Fetch the profile associated to this text format.
|
danielebarchiesi@0
|
205 $profile = wysiwyg_get_profile($format_id);
|
danielebarchiesi@0
|
206 if ($profile) {
|
danielebarchiesi@0
|
207 $loaded = TRUE;
|
danielebarchiesi@0
|
208 $settings[$format]['editor'] = $profile->editor;
|
danielebarchiesi@0
|
209 $settings[$format]['status'] = (int) wysiwyg_user_get_status($profile);
|
danielebarchiesi@0
|
210 if (isset($profile->settings['show_toggle'])) {
|
danielebarchiesi@0
|
211 $settings[$format]['toggle'] = (int) $profile->settings['show_toggle'];
|
danielebarchiesi@0
|
212 }
|
danielebarchiesi@0
|
213 // Check editor theme (and reset it if not/no longer available).
|
danielebarchiesi@0
|
214 $theme = wysiwyg_get_editor_themes($profile, (isset($profile->settings['theme']) ? $profile->settings['theme'] : ''));
|
danielebarchiesi@0
|
215
|
danielebarchiesi@0
|
216 // Add plugin settings (first) for this text format.
|
danielebarchiesi@0
|
217 wysiwyg_add_plugin_settings($profile);
|
danielebarchiesi@0
|
218 // Add profile settings for this text format.
|
danielebarchiesi@0
|
219 wysiwyg_add_editor_settings($profile, $theme);
|
danielebarchiesi@0
|
220 }
|
danielebarchiesi@0
|
221 }
|
danielebarchiesi@0
|
222 // Use a hidden element for a single text format.
|
danielebarchiesi@0
|
223 if (!$format_field['format']['#access']) {
|
danielebarchiesi@0
|
224 $format_field['wysiwyg'] = array(
|
danielebarchiesi@0
|
225 '#type' => 'hidden',
|
danielebarchiesi@0
|
226 '#name' => $format_field['format']['#name'],
|
danielebarchiesi@0
|
227 '#value' => $format_id,
|
danielebarchiesi@0
|
228 '#attributes' => array(
|
danielebarchiesi@0
|
229 'id' => $format_field['format']['#id'],
|
danielebarchiesi@0
|
230 'class' => array('wysiwyg'),
|
danielebarchiesi@0
|
231 ),
|
danielebarchiesi@0
|
232 );
|
danielebarchiesi@0
|
233 $format_field['wysiwyg']['#attached']['js'][] = array(
|
danielebarchiesi@0
|
234 'data' => array(
|
danielebarchiesi@0
|
235 'wysiwyg' => array(
|
danielebarchiesi@0
|
236 'triggers' => array(
|
danielebarchiesi@0
|
237 $format_field['format']['#id'] => $settings,
|
danielebarchiesi@0
|
238 ),
|
danielebarchiesi@0
|
239 ),
|
danielebarchiesi@0
|
240 ),
|
danielebarchiesi@0
|
241 'type' => 'setting',
|
danielebarchiesi@0
|
242 );
|
danielebarchiesi@0
|
243 }
|
danielebarchiesi@0
|
244 // Otherwise, attach to text format selector.
|
danielebarchiesi@0
|
245 else {
|
danielebarchiesi@0
|
246 $format_field['format']['#attributes']['class'][] = 'wysiwyg';
|
danielebarchiesi@0
|
247 $format_field['format']['#attached']['js'][] = array(
|
danielebarchiesi@0
|
248 'data' => array(
|
danielebarchiesi@0
|
249 'wysiwyg' => array(
|
danielebarchiesi@0
|
250 'triggers' => array(
|
danielebarchiesi@0
|
251 $format_field['format']['#id'] => $settings,
|
danielebarchiesi@0
|
252 ),
|
danielebarchiesi@0
|
253 ),
|
danielebarchiesi@0
|
254 ),
|
danielebarchiesi@0
|
255 'type' => 'setting',
|
danielebarchiesi@0
|
256 );
|
danielebarchiesi@0
|
257 }
|
danielebarchiesi@0
|
258
|
danielebarchiesi@0
|
259 // If we loaded at least one editor, then the 'none' editor will
|
danielebarchiesi@0
|
260 // handle resizable textareas instead of core.
|
danielebarchiesi@0
|
261 if (isset($loaded) && $resizable) {
|
danielebarchiesi@0
|
262 $field['#resizable'] = FALSE;
|
danielebarchiesi@0
|
263 }
|
danielebarchiesi@0
|
264
|
danielebarchiesi@0
|
265 return $element;
|
danielebarchiesi@0
|
266 }
|
danielebarchiesi@0
|
267
|
danielebarchiesi@0
|
268 /**
|
danielebarchiesi@0
|
269 * Determine the profile to use for a given input format id.
|
danielebarchiesi@0
|
270 *
|
danielebarchiesi@0
|
271 * This function also performs sanity checks for the configured editor in a
|
danielebarchiesi@0
|
272 * profile to ensure that we do not load a malformed editor.
|
danielebarchiesi@0
|
273 *
|
danielebarchiesi@0
|
274 * @param $format
|
danielebarchiesi@0
|
275 * The internal id of an input format.
|
danielebarchiesi@0
|
276 *
|
danielebarchiesi@0
|
277 * @return
|
danielebarchiesi@0
|
278 * A wysiwyg profile.
|
danielebarchiesi@0
|
279 *
|
danielebarchiesi@0
|
280 * @see wysiwyg_load_editor(), wysiwyg_get_editor()
|
danielebarchiesi@0
|
281 */
|
danielebarchiesi@0
|
282 function wysiwyg_get_profile($format) {
|
danielebarchiesi@0
|
283 if ($profile = wysiwyg_profile_load($format)) {
|
danielebarchiesi@0
|
284 if (wysiwyg_load_editor($profile)) {
|
danielebarchiesi@0
|
285 return $profile;
|
danielebarchiesi@0
|
286 }
|
danielebarchiesi@0
|
287 }
|
danielebarchiesi@0
|
288 return FALSE;
|
danielebarchiesi@0
|
289 }
|
danielebarchiesi@0
|
290
|
danielebarchiesi@0
|
291 /**
|
danielebarchiesi@0
|
292 * Load an editor library and initialize basic Wysiwyg settings.
|
danielebarchiesi@0
|
293 *
|
danielebarchiesi@0
|
294 * @param $profile
|
danielebarchiesi@0
|
295 * A wysiwyg editor profile.
|
danielebarchiesi@0
|
296 *
|
danielebarchiesi@0
|
297 * @return
|
danielebarchiesi@0
|
298 * TRUE if the editor has been loaded, FALSE if not.
|
danielebarchiesi@0
|
299 *
|
danielebarchiesi@0
|
300 * @see wysiwyg_get_profile()
|
danielebarchiesi@0
|
301 */
|
danielebarchiesi@0
|
302 function wysiwyg_load_editor($profile) {
|
danielebarchiesi@0
|
303 static $settings_added;
|
danielebarchiesi@0
|
304 static $loaded = array();
|
danielebarchiesi@0
|
305 $path = drupal_get_path('module', 'wysiwyg');
|
danielebarchiesi@0
|
306
|
danielebarchiesi@0
|
307 $name = $profile->editor;
|
danielebarchiesi@0
|
308 // Library files must be loaded only once.
|
danielebarchiesi@0
|
309 if (!isset($loaded[$name])) {
|
danielebarchiesi@0
|
310 // Load editor.
|
danielebarchiesi@0
|
311 $editor = wysiwyg_get_editor($name);
|
danielebarchiesi@0
|
312 if ($editor) {
|
danielebarchiesi@0
|
313 $default_library_options = array(
|
danielebarchiesi@0
|
314 'type' => 'file',
|
danielebarchiesi@0
|
315 'scope' => 'header',
|
danielebarchiesi@0
|
316 'defer' => FALSE,
|
danielebarchiesi@0
|
317 'cache' => TRUE,
|
danielebarchiesi@0
|
318 'preprocess' => TRUE,
|
danielebarchiesi@0
|
319 );
|
danielebarchiesi@0
|
320 // Determine library files to load.
|
danielebarchiesi@0
|
321 // @todo Allow to configure the library/execMode to use.
|
danielebarchiesi@0
|
322 if (isset($profile->settings['library']) && isset($editor['libraries'][$profile->settings['library']])) {
|
danielebarchiesi@0
|
323 $library = $profile->settings['library'];
|
danielebarchiesi@0
|
324 $files = $editor['libraries'][$library]['files'];
|
danielebarchiesi@0
|
325 }
|
danielebarchiesi@0
|
326 else {
|
danielebarchiesi@0
|
327 // Fallback to the first defined library by default (external libraries can change).
|
danielebarchiesi@0
|
328 $library = key($editor['libraries']);
|
danielebarchiesi@0
|
329 $files = array_shift($editor['libraries']);
|
danielebarchiesi@0
|
330 $files = $files['files'];
|
danielebarchiesi@0
|
331 }
|
danielebarchiesi@0
|
332
|
danielebarchiesi@0
|
333 // Check whether the editor requires an initialization script.
|
danielebarchiesi@0
|
334 if (!empty($editor['init callback'])) {
|
danielebarchiesi@0
|
335 $init = $editor['init callback']($editor, $library, $profile);
|
danielebarchiesi@0
|
336 if (!empty($init)) {
|
danielebarchiesi@0
|
337 // Build a file for each of the editors to hold the init scripts.
|
danielebarchiesi@0
|
338 // @todo Aggregate all initialization scripts into one file.
|
danielebarchiesi@0
|
339 $uri = 'public://js/wysiwyg/wysiwyg_' . $name . '_' . drupal_hash_base64($init) . '.js';
|
danielebarchiesi@0
|
340 $init_exists = file_exists($uri);
|
danielebarchiesi@0
|
341 if (!$init_exists) {
|
danielebarchiesi@0
|
342 $js_path = dirname($uri);
|
danielebarchiesi@0
|
343 file_prepare_directory($js_path, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
|
danielebarchiesi@0
|
344 }
|
danielebarchiesi@0
|
345 // Attempt to create the file, or fall back to an inline script (which
|
danielebarchiesi@0
|
346 // will not work in Ajax calls).
|
danielebarchiesi@0
|
347 if (!$init_exists && !file_unmanaged_save_data($init, $uri, FILE_EXISTS_REPLACE)) {
|
danielebarchiesi@0
|
348 drupal_add_js($init, array('type' => 'inline') + $default_library_options);
|
danielebarchiesi@0
|
349 }
|
danielebarchiesi@0
|
350 else {
|
danielebarchiesi@0
|
351 drupal_add_js(file_create_url($uri), $default_library_options);
|
danielebarchiesi@0
|
352 }
|
danielebarchiesi@0
|
353 }
|
danielebarchiesi@0
|
354 }
|
danielebarchiesi@0
|
355
|
danielebarchiesi@0
|
356 foreach ($files as $file => $options) {
|
danielebarchiesi@0
|
357 if (is_array($options)) {
|
danielebarchiesi@0
|
358 $options += $default_library_options;
|
danielebarchiesi@0
|
359 drupal_add_js($editor['library path'] . '/' . $file, $options);
|
danielebarchiesi@0
|
360 }
|
danielebarchiesi@0
|
361 else {
|
danielebarchiesi@0
|
362 drupal_add_js($editor['library path'] . '/' . $options);
|
danielebarchiesi@0
|
363 }
|
danielebarchiesi@0
|
364 }
|
danielebarchiesi@0
|
365 // If editor defines an additional load callback, invoke it.
|
danielebarchiesi@0
|
366 // @todo Isn't the settings callback sufficient?
|
danielebarchiesi@0
|
367 if (isset($editor['load callback']) && function_exists($editor['load callback'])) {
|
danielebarchiesi@0
|
368 $editor['load callback']($editor, $library);
|
danielebarchiesi@0
|
369 }
|
danielebarchiesi@0
|
370 // Load JavaScript integration files for this editor.
|
danielebarchiesi@0
|
371 $files = array();
|
danielebarchiesi@0
|
372 if (isset($editor['js files'])) {
|
danielebarchiesi@0
|
373 $files = $editor['js files'];
|
danielebarchiesi@0
|
374 }
|
danielebarchiesi@0
|
375 foreach ($files as $file) {
|
danielebarchiesi@0
|
376 drupal_add_js($editor['js path'] . '/' . $file);
|
danielebarchiesi@0
|
377 }
|
danielebarchiesi@0
|
378 // Load CSS stylesheets for this editor.
|
danielebarchiesi@0
|
379 $files = array();
|
danielebarchiesi@0
|
380 if (isset($editor['css files'])) {
|
danielebarchiesi@0
|
381 $files = $editor['css files'];
|
danielebarchiesi@0
|
382 }
|
danielebarchiesi@0
|
383 foreach ($files as $file) {
|
danielebarchiesi@0
|
384 drupal_add_css($editor['css path'] . '/' . $file);
|
danielebarchiesi@0
|
385 }
|
danielebarchiesi@0
|
386 $loaded[$name] = TRUE;
|
danielebarchiesi@0
|
387 }
|
danielebarchiesi@0
|
388 else {
|
danielebarchiesi@0
|
389 $loaded[$name] = FALSE;
|
danielebarchiesi@0
|
390 }
|
danielebarchiesi@0
|
391 }
|
danielebarchiesi@0
|
392
|
danielebarchiesi@0
|
393 // Add basic Wysiwyg settings if any editor has been added.
|
danielebarchiesi@0
|
394 if (!isset($settings_added) && $loaded[$name]) {
|
danielebarchiesi@0
|
395 drupal_add_js(array('wysiwyg' => array(
|
danielebarchiesi@0
|
396 'configs' => array(),
|
danielebarchiesi@0
|
397 'plugins' => array(),
|
danielebarchiesi@0
|
398 'disable' => t('Disable rich-text'),
|
danielebarchiesi@0
|
399 'enable' => t('Enable rich-text'),
|
danielebarchiesi@0
|
400 )), 'setting');
|
danielebarchiesi@0
|
401
|
danielebarchiesi@0
|
402 // Initialize our namespaces in the *header* to do not force editor
|
danielebarchiesi@0
|
403 // integration scripts to check and define Drupal.wysiwyg on its own.
|
danielebarchiesi@0
|
404 drupal_add_js($path . '/wysiwyg.init.js', array('group' => JS_LIBRARY));
|
danielebarchiesi@0
|
405
|
danielebarchiesi@0
|
406 // The 'none' editor is a special editor implementation, allowing us to
|
danielebarchiesi@0
|
407 // attach and detach regular Drupal behaviors just like any other editor.
|
danielebarchiesi@0
|
408 drupal_add_js($path . '/editors/js/none.js');
|
danielebarchiesi@0
|
409
|
danielebarchiesi@0
|
410 // Add wysiwyg.js to the footer to ensure it's executed after the
|
danielebarchiesi@0
|
411 // Drupal.settings array has been rendered and populated. Also, since editor
|
danielebarchiesi@0
|
412 // library initialization functions must be loaded first by the browser,
|
danielebarchiesi@0
|
413 // and Drupal.wysiwygInit() must be executed AFTER editors registered
|
danielebarchiesi@0
|
414 // their callbacks and BEFORE Drupal.behaviors are applied, this must come
|
danielebarchiesi@0
|
415 // last.
|
danielebarchiesi@0
|
416 drupal_add_js($path . '/wysiwyg.js', array('scope' => 'footer'));
|
danielebarchiesi@0
|
417
|
danielebarchiesi@0
|
418 $settings_added = TRUE;
|
danielebarchiesi@0
|
419 }
|
danielebarchiesi@0
|
420
|
danielebarchiesi@0
|
421 return $loaded[$name];
|
danielebarchiesi@0
|
422 }
|
danielebarchiesi@0
|
423
|
danielebarchiesi@0
|
424 /**
|
danielebarchiesi@0
|
425 * Add editor settings for a given input format.
|
danielebarchiesi@0
|
426 */
|
danielebarchiesi@0
|
427 function wysiwyg_add_editor_settings($profile, $theme) {
|
danielebarchiesi@0
|
428 static $formats = array();
|
danielebarchiesi@0
|
429
|
danielebarchiesi@0
|
430 if (!isset($formats[$profile->format])) {
|
danielebarchiesi@0
|
431 $config = wysiwyg_get_editor_config($profile, $theme);
|
danielebarchiesi@0
|
432 // drupal_to_js() does not properly convert numeric array keys, so we need
|
danielebarchiesi@0
|
433 // to use a string instead of the format id.
|
danielebarchiesi@0
|
434 if ($config) {
|
danielebarchiesi@0
|
435 drupal_add_js(array('wysiwyg' => array('configs' => array($profile->editor => array('format' . $profile->format => $config)))), 'setting');
|
danielebarchiesi@0
|
436 }
|
danielebarchiesi@0
|
437 $formats[$profile->format] = TRUE;
|
danielebarchiesi@0
|
438 }
|
danielebarchiesi@0
|
439 }
|
danielebarchiesi@0
|
440
|
danielebarchiesi@0
|
441 /**
|
danielebarchiesi@0
|
442 * Add settings for external plugins.
|
danielebarchiesi@0
|
443 *
|
danielebarchiesi@0
|
444 * Plugins can be used in multiple profiles, but not necessarily in all. Because
|
danielebarchiesi@0
|
445 * of that, we need to process plugins for each profile, even if most of their
|
danielebarchiesi@0
|
446 * settings are not stored per profile.
|
danielebarchiesi@0
|
447 *
|
danielebarchiesi@0
|
448 * Implementations of hook_wysiwyg_plugin() may execute different code for each
|
danielebarchiesi@0
|
449 * editor. Therefore, we have to invoke those implementations for each editor,
|
danielebarchiesi@0
|
450 * but process the resulting plugins separately for each profile.
|
danielebarchiesi@0
|
451 *
|
danielebarchiesi@0
|
452 * Drupal plugins differ to native plugins in that they have plugin-specific
|
danielebarchiesi@0
|
453 * definitions and settings, which need to be processed only once. But they are
|
danielebarchiesi@0
|
454 * also passed to the editor to prepare settings specific to the editor.
|
danielebarchiesi@0
|
455 * Therefore, we load and process the Drupal plugins only once, and hand off the
|
danielebarchiesi@0
|
456 * effective definitions for each profile to the editor.
|
danielebarchiesi@0
|
457 *
|
danielebarchiesi@0
|
458 * @param $profile
|
danielebarchiesi@0
|
459 * A wysiwyg editor profile.
|
danielebarchiesi@0
|
460 *
|
danielebarchiesi@0
|
461 * @todo Rewrite wysiwyg_process_form() to build a registry of effective
|
danielebarchiesi@0
|
462 * profiles in use, so we can process plugins in multiple profiles in one shot
|
danielebarchiesi@0
|
463 * and simplify this entire function.
|
danielebarchiesi@0
|
464 */
|
danielebarchiesi@0
|
465 function wysiwyg_add_plugin_settings($profile) {
|
danielebarchiesi@0
|
466 static $plugins = array();
|
danielebarchiesi@0
|
467 static $processed_plugins = array();
|
danielebarchiesi@0
|
468 static $processed_formats = array();
|
danielebarchiesi@0
|
469
|
danielebarchiesi@0
|
470 // Each input format must only processed once.
|
danielebarchiesi@0
|
471 // @todo ...as long as we do not have multiple profiles per format.
|
danielebarchiesi@0
|
472 if (isset($processed_formats[$profile->format])) {
|
danielebarchiesi@0
|
473 return;
|
danielebarchiesi@0
|
474 }
|
danielebarchiesi@0
|
475 $processed_formats[$profile->format] = TRUE;
|
danielebarchiesi@0
|
476
|
danielebarchiesi@0
|
477 $editor = wysiwyg_get_editor($profile->editor);
|
danielebarchiesi@0
|
478
|
danielebarchiesi@0
|
479 // Collect native plugins for this editor provided via hook_wysiwyg_plugin()
|
danielebarchiesi@0
|
480 // and Drupal plugins provided via hook_wysiwyg_include_directory().
|
danielebarchiesi@0
|
481 if (!array_key_exists($editor['name'], $plugins)) {
|
danielebarchiesi@0
|
482 $plugins[$editor['name']] = wysiwyg_get_plugins($editor['name']);
|
danielebarchiesi@0
|
483 }
|
danielebarchiesi@0
|
484
|
danielebarchiesi@0
|
485 // Nothing to do, if there are no plugins.
|
danielebarchiesi@0
|
486 if (empty($plugins[$editor['name']])) {
|
danielebarchiesi@0
|
487 return;
|
danielebarchiesi@0
|
488 }
|
danielebarchiesi@0
|
489
|
danielebarchiesi@0
|
490 // Determine name of proxy plugin for Drupal plugins.
|
danielebarchiesi@0
|
491 $proxy = (isset($editor['proxy plugin']) ? key($editor['proxy plugin']) : '');
|
danielebarchiesi@0
|
492
|
danielebarchiesi@0
|
493 // Process native editor plugins.
|
danielebarchiesi@0
|
494 if (isset($editor['plugin settings callback'])) {
|
danielebarchiesi@0
|
495 // @todo Require PHP 5.1 in 3.x and use array_intersect_key().
|
danielebarchiesi@0
|
496 $profile_plugins_native = array();
|
danielebarchiesi@0
|
497 foreach ($plugins[$editor['name']] as $plugin => $meta) {
|
danielebarchiesi@0
|
498 // Skip Drupal plugins (handled below).
|
danielebarchiesi@0
|
499 if ($plugin === $proxy) {
|
danielebarchiesi@0
|
500 continue;
|
danielebarchiesi@0
|
501 }
|
danielebarchiesi@0
|
502 // Only keep native plugins that are enabled in this profile.
|
danielebarchiesi@0
|
503 if (isset($profile->settings['buttons'][$plugin])) {
|
danielebarchiesi@0
|
504 $profile_plugins_native[$plugin] = $meta;
|
danielebarchiesi@0
|
505 }
|
danielebarchiesi@0
|
506 }
|
danielebarchiesi@0
|
507 // Invoke the editor's plugin settings callback, so it can populate the
|
danielebarchiesi@0
|
508 // settings for native external plugins with required values.
|
danielebarchiesi@0
|
509 $settings_native = call_user_func($editor['plugin settings callback'], $editor, $profile, $profile_plugins_native);
|
danielebarchiesi@0
|
510
|
danielebarchiesi@0
|
511 if ($settings_native) {
|
danielebarchiesi@0
|
512 drupal_add_js(array('wysiwyg' => array('plugins' => array('format' . $profile->format => array('native' => $settings_native)))), 'setting');
|
danielebarchiesi@0
|
513 }
|
danielebarchiesi@0
|
514 }
|
danielebarchiesi@0
|
515
|
danielebarchiesi@0
|
516 // Process Drupal plugins.
|
danielebarchiesi@0
|
517 if ($proxy && isset($editor['proxy plugin settings callback'])) {
|
danielebarchiesi@0
|
518 $profile_plugins_drupal = array();
|
danielebarchiesi@0
|
519 foreach (wysiwyg_get_all_plugins() as $plugin => $meta) {
|
danielebarchiesi@0
|
520 if (isset($profile->settings['buttons'][$proxy][$plugin])) {
|
danielebarchiesi@0
|
521 // JavaScript and plugin-specific settings for Drupal plugins must be
|
danielebarchiesi@0
|
522 // loaded and processed only once. Plugin information is cached
|
danielebarchiesi@0
|
523 // statically to pass it to the editor's proxy plugin settings callback.
|
danielebarchiesi@0
|
524 if (!isset($processed_plugins[$proxy][$plugin])) {
|
danielebarchiesi@0
|
525 $profile_plugins_drupal[$plugin] = $processed_plugins[$proxy][$plugin] = $meta;
|
danielebarchiesi@0
|
526 // Load the Drupal plugin's JavaScript.
|
danielebarchiesi@0
|
527 drupal_add_js($meta['js path'] . '/' . $meta['js file']);
|
danielebarchiesi@0
|
528 // Add plugin-specific settings.
|
danielebarchiesi@0
|
529 if (isset($meta['settings'])) {
|
danielebarchiesi@0
|
530 drupal_add_js(array('wysiwyg' => array('plugins' => array('drupal' => array($plugin => $meta['settings'])))), 'setting');
|
danielebarchiesi@0
|
531 }
|
danielebarchiesi@0
|
532 }
|
danielebarchiesi@0
|
533 else {
|
danielebarchiesi@0
|
534 $profile_plugins_drupal[$plugin] = $processed_plugins[$proxy][$plugin];
|
danielebarchiesi@0
|
535 }
|
danielebarchiesi@0
|
536 }
|
danielebarchiesi@0
|
537 }
|
danielebarchiesi@0
|
538 // Invoke the editor's proxy plugin settings callback, so it can populate
|
danielebarchiesi@0
|
539 // the settings for Drupal plugins with custom, required values.
|
danielebarchiesi@0
|
540 $settings_drupal = call_user_func($editor['proxy plugin settings callback'], $editor, $profile, $profile_plugins_drupal);
|
danielebarchiesi@0
|
541
|
danielebarchiesi@0
|
542 if ($settings_drupal) {
|
danielebarchiesi@0
|
543 drupal_add_js(array('wysiwyg' => array('plugins' => array('format' . $profile->format => array('drupal' => $settings_drupal)))), 'setting');
|
danielebarchiesi@0
|
544 }
|
danielebarchiesi@0
|
545 }
|
danielebarchiesi@0
|
546 }
|
danielebarchiesi@0
|
547
|
danielebarchiesi@0
|
548 /**
|
danielebarchiesi@0
|
549 * Retrieve available themes for an editor.
|
danielebarchiesi@0
|
550 *
|
danielebarchiesi@0
|
551 * Editor themes control the visual presentation of an editor.
|
danielebarchiesi@0
|
552 *
|
danielebarchiesi@0
|
553 * @param $profile
|
danielebarchiesi@0
|
554 * A wysiwyg editor profile; passed/altered by reference.
|
danielebarchiesi@0
|
555 * @param $selected_theme
|
danielebarchiesi@0
|
556 * An optional theme name that ought to be used.
|
danielebarchiesi@0
|
557 *
|
danielebarchiesi@0
|
558 * @return
|
danielebarchiesi@0
|
559 * An array of theme names, or a single, checked theme name if $selected_theme
|
danielebarchiesi@0
|
560 * was given.
|
danielebarchiesi@0
|
561 */
|
danielebarchiesi@0
|
562 function wysiwyg_get_editor_themes(&$profile, $selected_theme = NULL) {
|
danielebarchiesi@0
|
563 static $themes = array();
|
danielebarchiesi@0
|
564
|
danielebarchiesi@0
|
565 if (!isset($themes[$profile->editor])) {
|
danielebarchiesi@0
|
566 $editor = wysiwyg_get_editor($profile->editor);
|
danielebarchiesi@0
|
567 if (isset($editor['themes callback']) && function_exists($editor['themes callback'])) {
|
danielebarchiesi@0
|
568 $themes[$editor['name']] = $editor['themes callback']($editor, $profile);
|
danielebarchiesi@0
|
569 }
|
danielebarchiesi@0
|
570 // Fallback to 'default' otherwise.
|
danielebarchiesi@0
|
571 else {
|
danielebarchiesi@0
|
572 $themes[$editor['name']] = array('default');
|
danielebarchiesi@0
|
573 }
|
danielebarchiesi@0
|
574 }
|
danielebarchiesi@0
|
575
|
danielebarchiesi@0
|
576 // Check optional $selected_theme argument, if given.
|
danielebarchiesi@0
|
577 if (isset($selected_theme)) {
|
danielebarchiesi@0
|
578 // If the passed theme name does not exist, use the first available.
|
danielebarchiesi@0
|
579 if (!in_array($selected_theme, $themes[$profile->editor])) {
|
danielebarchiesi@0
|
580 $selected_theme = $profile->settings['theme'] = $themes[$profile->editor][0];
|
danielebarchiesi@0
|
581 }
|
danielebarchiesi@0
|
582 }
|
danielebarchiesi@0
|
583
|
danielebarchiesi@0
|
584 return isset($selected_theme) ? $selected_theme : $themes[$profile->editor];
|
danielebarchiesi@0
|
585 }
|
danielebarchiesi@0
|
586
|
danielebarchiesi@0
|
587 /**
|
danielebarchiesi@0
|
588 * Return plugin metadata from the plugin registry.
|
danielebarchiesi@0
|
589 *
|
danielebarchiesi@0
|
590 * @param $editor_name
|
danielebarchiesi@0
|
591 * The internal name of an editor to return plugins for.
|
danielebarchiesi@0
|
592 *
|
danielebarchiesi@0
|
593 * @return
|
danielebarchiesi@0
|
594 * An array for each plugin.
|
danielebarchiesi@0
|
595 */
|
danielebarchiesi@0
|
596 function wysiwyg_get_plugins($editor_name) {
|
danielebarchiesi@0
|
597 $plugins = array();
|
danielebarchiesi@0
|
598 if (!empty($editor_name)) {
|
danielebarchiesi@0
|
599 $editor = wysiwyg_get_editor($editor_name);
|
danielebarchiesi@0
|
600 // Add internal editor plugins.
|
danielebarchiesi@0
|
601 if (isset($editor['plugin callback']) && function_exists($editor['plugin callback'])) {
|
danielebarchiesi@0
|
602 $plugins = $editor['plugin callback']($editor);
|
danielebarchiesi@0
|
603 }
|
danielebarchiesi@0
|
604 // Add editor plugins provided via hook_wysiwyg_plugin().
|
danielebarchiesi@0
|
605 $plugins = array_merge($plugins, module_invoke_all('wysiwyg_plugin', $editor['name'], $editor['installed version']));
|
danielebarchiesi@0
|
606 // Add API plugins provided by Drupal modules.
|
danielebarchiesi@0
|
607 // @todo We need to pass the filepath to the plugin icon for Drupal plugins.
|
danielebarchiesi@0
|
608 if (isset($editor['proxy plugin'])) {
|
danielebarchiesi@0
|
609 $plugins += $editor['proxy plugin'];
|
danielebarchiesi@0
|
610 $proxy = key($editor['proxy plugin']);
|
danielebarchiesi@0
|
611 foreach (wysiwyg_get_all_plugins() as $plugin_name => $info) {
|
danielebarchiesi@0
|
612 $plugins[$proxy]['buttons'][$plugin_name] = $info['title'];
|
danielebarchiesi@0
|
613 }
|
danielebarchiesi@0
|
614 }
|
danielebarchiesi@0
|
615 }
|
danielebarchiesi@0
|
616 return $plugins;
|
danielebarchiesi@0
|
617 }
|
danielebarchiesi@0
|
618
|
danielebarchiesi@0
|
619 /**
|
danielebarchiesi@0
|
620 * Return an array of initial editor settings for a Wysiwyg profile.
|
danielebarchiesi@0
|
621 */
|
danielebarchiesi@0
|
622 function wysiwyg_get_editor_config($profile, $theme) {
|
danielebarchiesi@0
|
623 $editor = wysiwyg_get_editor($profile->editor);
|
danielebarchiesi@0
|
624 $settings = array();
|
danielebarchiesi@0
|
625 if (!empty($editor['settings callback']) && function_exists($editor['settings callback'])) {
|
danielebarchiesi@0
|
626 $settings = $editor['settings callback']($editor, $profile->settings, $theme);
|
danielebarchiesi@0
|
627
|
danielebarchiesi@0
|
628 // Allow other modules to alter the editor settings for this format.
|
danielebarchiesi@0
|
629 $context = array('editor' => $editor, 'profile' => $profile, 'theme' => $theme);
|
danielebarchiesi@0
|
630 drupal_alter('wysiwyg_editor_settings', $settings, $context);
|
danielebarchiesi@0
|
631 }
|
danielebarchiesi@0
|
632 return $settings;
|
danielebarchiesi@0
|
633 }
|
danielebarchiesi@0
|
634
|
danielebarchiesi@0
|
635 /**
|
danielebarchiesi@0
|
636 * Retrieve stylesheets for HTML/IFRAME-based editors.
|
danielebarchiesi@0
|
637 *
|
danielebarchiesi@0
|
638 * This assumes that the content editing area only needs stylesheets defined
|
danielebarchiesi@0
|
639 * for the scope 'theme'.
|
danielebarchiesi@0
|
640 *
|
danielebarchiesi@0
|
641 * @return
|
danielebarchiesi@0
|
642 * An array containing CSS files, including proper base path.
|
danielebarchiesi@0
|
643 */
|
danielebarchiesi@0
|
644 function wysiwyg_get_css() {
|
danielebarchiesi@0
|
645 static $files;
|
danielebarchiesi@0
|
646
|
danielebarchiesi@0
|
647 if (isset($files)) {
|
danielebarchiesi@0
|
648 return $files;
|
danielebarchiesi@0
|
649 }
|
danielebarchiesi@0
|
650 // In node form previews, the theme has not been initialized yet.
|
danielebarchiesi@0
|
651 if (!empty($_POST)) {
|
danielebarchiesi@0
|
652 drupal_theme_initialize();
|
danielebarchiesi@0
|
653 }
|
danielebarchiesi@0
|
654
|
danielebarchiesi@0
|
655 $files = array();
|
danielebarchiesi@0
|
656 foreach (drupal_add_css() as $filepath => $info) {
|
danielebarchiesi@0
|
657 if ($info['group'] >= CSS_THEME && $info['media'] != 'print') {
|
danielebarchiesi@0
|
658 if ($info['type'] == 'external') {
|
danielebarchiesi@0
|
659 $files[] = $filepath;
|
danielebarchiesi@0
|
660 }
|
danielebarchiesi@0
|
661 elseif (file_exists($filepath)) {
|
danielebarchiesi@0
|
662 $files[] = base_path() . $filepath;
|
danielebarchiesi@0
|
663 }
|
danielebarchiesi@0
|
664 }
|
danielebarchiesi@0
|
665 }
|
danielebarchiesi@0
|
666 return $files;
|
danielebarchiesi@0
|
667 }
|
danielebarchiesi@0
|
668
|
danielebarchiesi@0
|
669 /**
|
danielebarchiesi@0
|
670 * Loads a profile for a given text format.
|
danielebarchiesi@0
|
671 *
|
danielebarchiesi@0
|
672 * Since there are commonly not many text formats, and each text format-enabled
|
danielebarchiesi@0
|
673 * form element will possibly have to load every single profile, all existing
|
danielebarchiesi@0
|
674 * profiles are loaded and cached once to reduce the amount of database queries.
|
danielebarchiesi@0
|
675 */
|
danielebarchiesi@0
|
676 function wysiwyg_profile_load($format) {
|
danielebarchiesi@0
|
677 $profiles = wysiwyg_profile_load_all();
|
danielebarchiesi@0
|
678 return (isset($profiles[$format]) ? $profiles[$format] : FALSE);
|
danielebarchiesi@0
|
679 }
|
danielebarchiesi@0
|
680
|
danielebarchiesi@0
|
681 /**
|
danielebarchiesi@0
|
682 * Loads all profiles.
|
danielebarchiesi@0
|
683 */
|
danielebarchiesi@0
|
684 function wysiwyg_profile_load_all() {
|
danielebarchiesi@0
|
685 // entity_load(..., FALSE) does not re-use its own static cache upon
|
danielebarchiesi@0
|
686 // repetitive calls, so a custom static cache is required.
|
danielebarchiesi@0
|
687 // @see wysiwyg_entity_info()
|
danielebarchiesi@0
|
688 $profiles = &drupal_static(__FUNCTION__);
|
danielebarchiesi@0
|
689
|
danielebarchiesi@0
|
690 if (!isset($profiles)) {
|
danielebarchiesi@0
|
691 // Additional database cache to support alternative caches like memcache.
|
danielebarchiesi@0
|
692 if ($cached = cache_get('wysiwyg_profiles')) {
|
danielebarchiesi@0
|
693 $profiles = $cached->data;
|
danielebarchiesi@0
|
694 }
|
danielebarchiesi@0
|
695 else {
|
danielebarchiesi@0
|
696 $profiles = entity_load('wysiwyg_profile', FALSE);
|
danielebarchiesi@0
|
697 cache_set('wysiwyg_profiles', $profiles);
|
danielebarchiesi@0
|
698 }
|
danielebarchiesi@0
|
699 }
|
danielebarchiesi@0
|
700
|
danielebarchiesi@0
|
701 return $profiles;
|
danielebarchiesi@0
|
702 }
|
danielebarchiesi@0
|
703
|
danielebarchiesi@0
|
704 /**
|
danielebarchiesi@0
|
705 * Deletes a profile from the database.
|
danielebarchiesi@0
|
706 */
|
danielebarchiesi@0
|
707 function wysiwyg_profile_delete($format) {
|
danielebarchiesi@0
|
708 db_delete('wysiwyg')
|
danielebarchiesi@0
|
709 ->condition('format', $format)
|
danielebarchiesi@0
|
710 ->execute();
|
danielebarchiesi@0
|
711 }
|
danielebarchiesi@0
|
712
|
danielebarchiesi@0
|
713 /**
|
danielebarchiesi@0
|
714 * Clear all Wysiwyg profile caches.
|
danielebarchiesi@0
|
715 */
|
danielebarchiesi@0
|
716 function wysiwyg_profile_cache_clear() {
|
danielebarchiesi@0
|
717 entity_get_controller('wysiwyg_profile')->resetCache();
|
danielebarchiesi@0
|
718 drupal_static_reset('wysiwyg_profile_load_all');
|
danielebarchiesi@0
|
719 cache_clear_all('wysiwyg_profiles', 'cache');
|
danielebarchiesi@0
|
720 }
|
danielebarchiesi@0
|
721
|
danielebarchiesi@0
|
722 /**
|
danielebarchiesi@0
|
723 * Implements hook_form_FORM_ID_alter().
|
danielebarchiesi@0
|
724 */
|
danielebarchiesi@0
|
725 function wysiwyg_form_user_profile_form_alter(&$form, &$form_state, $form_id) {
|
danielebarchiesi@0
|
726 $account = $form['#user'];
|
danielebarchiesi@0
|
727 $user_formats = filter_formats($account);
|
danielebarchiesi@0
|
728 $options = array();
|
danielebarchiesi@0
|
729 $options_default = array();
|
danielebarchiesi@0
|
730 foreach (wysiwyg_profile_load_all() as $format => $profile) {
|
danielebarchiesi@0
|
731 // Only show profiles that have user_choose enabled.
|
danielebarchiesi@0
|
732 if (!empty($profile->settings['user_choose']) && isset($user_formats[$format])) {
|
danielebarchiesi@0
|
733 $options[$format] = check_plain($user_formats[$format]->name);
|
danielebarchiesi@0
|
734 if (wysiwyg_user_get_status($profile, $account)) {
|
danielebarchiesi@0
|
735 $options_default[] = $format;
|
danielebarchiesi@0
|
736 }
|
danielebarchiesi@0
|
737 }
|
danielebarchiesi@0
|
738 }
|
danielebarchiesi@0
|
739 if (!empty($options)) {
|
danielebarchiesi@0
|
740 $form['wysiwyg']['wysiwyg_status'] = array(
|
danielebarchiesi@0
|
741 '#type' => 'checkboxes',
|
danielebarchiesi@0
|
742 '#title' => t('Text formats enabled for rich-text editing'),
|
danielebarchiesi@0
|
743 '#options' => $options,
|
danielebarchiesi@0
|
744 '#default_value' => $options_default,
|
danielebarchiesi@0
|
745 );
|
danielebarchiesi@0
|
746 }
|
danielebarchiesi@0
|
747 }
|
danielebarchiesi@0
|
748
|
danielebarchiesi@0
|
749 /**
|
danielebarchiesi@0
|
750 * Implements hook_user_insert().
|
danielebarchiesi@0
|
751 *
|
danielebarchiesi@0
|
752 * Wysiwyg's user preferences are normally not exposed on the user registration
|
danielebarchiesi@0
|
753 * form, but in case they are manually altered in, we invoke
|
danielebarchiesi@0
|
754 * wysiwyg_user_update() accordingly.
|
danielebarchiesi@0
|
755 */
|
danielebarchiesi@0
|
756 function wysiwyg_user_insert(&$edit, $account, $category) {
|
danielebarchiesi@0
|
757 wysiwyg_user_update($edit, $account, $category);
|
danielebarchiesi@0
|
758 }
|
danielebarchiesi@0
|
759
|
danielebarchiesi@0
|
760 /**
|
danielebarchiesi@0
|
761 * Implements hook_user_update().
|
danielebarchiesi@0
|
762 */
|
danielebarchiesi@0
|
763 function wysiwyg_user_update(&$edit, $account, $category) {
|
danielebarchiesi@0
|
764 if (isset($edit['wysiwyg_status'])) {
|
danielebarchiesi@0
|
765 db_delete('wysiwyg_user')
|
danielebarchiesi@0
|
766 ->condition('uid', $account->uid)
|
danielebarchiesi@0
|
767 ->execute();
|
danielebarchiesi@0
|
768 $query = db_insert('wysiwyg_user')
|
danielebarchiesi@0
|
769 ->fields(array('uid', 'format', 'status'));
|
danielebarchiesi@0
|
770 foreach ($edit['wysiwyg_status'] as $format => $status) {
|
danielebarchiesi@0
|
771 $query->values(array(
|
danielebarchiesi@0
|
772 'uid' => $account->uid,
|
danielebarchiesi@0
|
773 'format' => $format,
|
danielebarchiesi@0
|
774 'status' => (int) (bool) $status,
|
danielebarchiesi@0
|
775 ));
|
danielebarchiesi@0
|
776 }
|
danielebarchiesi@0
|
777 $query->execute();
|
danielebarchiesi@0
|
778 }
|
danielebarchiesi@0
|
779 }
|
danielebarchiesi@0
|
780
|
danielebarchiesi@0
|
781 function wysiwyg_user_get_status($profile, $account = NULL) {
|
danielebarchiesi@0
|
782 global $user;
|
danielebarchiesi@0
|
783
|
danielebarchiesi@0
|
784 if (!isset($account)) {
|
danielebarchiesi@0
|
785 $account = $user;
|
danielebarchiesi@0
|
786 }
|
danielebarchiesi@0
|
787
|
danielebarchiesi@0
|
788 // Default wysiwyg editor status information is only required on forms, so we
|
danielebarchiesi@0
|
789 // do not pre-emptively load and attach this information on every user_load().
|
danielebarchiesi@0
|
790 if (!isset($account->wysiwyg_status)) {
|
danielebarchiesi@0
|
791 $account->wysiwyg_status = db_query("SELECT format, status FROM {wysiwyg_user} WHERE uid = :uid", array(
|
danielebarchiesi@0
|
792 ':uid' => $account->uid,
|
danielebarchiesi@0
|
793 ))->fetchAllKeyed();
|
danielebarchiesi@0
|
794 }
|
danielebarchiesi@0
|
795
|
danielebarchiesi@0
|
796 if (!empty($profile->settings['user_choose']) && isset($account->wysiwyg_status[$profile->format])) {
|
danielebarchiesi@0
|
797 $status = $account->wysiwyg_status[$profile->format];
|
danielebarchiesi@0
|
798 }
|
danielebarchiesi@0
|
799 else {
|
danielebarchiesi@0
|
800 $status = isset($profile->settings['default']) ? $profile->settings['default'] : TRUE;
|
danielebarchiesi@0
|
801 }
|
danielebarchiesi@0
|
802
|
danielebarchiesi@0
|
803 return (bool) $status;
|
danielebarchiesi@0
|
804 }
|
danielebarchiesi@0
|
805
|
danielebarchiesi@0
|
806 /**
|
danielebarchiesi@0
|
807 * @defgroup wysiwyg_api Wysiwyg API
|
danielebarchiesi@0
|
808 * @{
|
danielebarchiesi@0
|
809 *
|
danielebarchiesi@0
|
810 * @todo Forked from Panels; abstract into a separate API module that allows
|
danielebarchiesi@0
|
811 * contrib modules to define supported include/plugin types.
|
danielebarchiesi@0
|
812 */
|
danielebarchiesi@0
|
813
|
danielebarchiesi@0
|
814 /**
|
danielebarchiesi@0
|
815 * Return library information for a given editor.
|
danielebarchiesi@0
|
816 *
|
danielebarchiesi@0
|
817 * @param $name
|
danielebarchiesi@0
|
818 * The internal name of an editor.
|
danielebarchiesi@0
|
819 *
|
danielebarchiesi@0
|
820 * @return
|
danielebarchiesi@0
|
821 * The library information for the editor, or FALSE if $name is unknown or not
|
danielebarchiesi@0
|
822 * installed properly.
|
danielebarchiesi@0
|
823 */
|
danielebarchiesi@0
|
824 function wysiwyg_get_editor($name) {
|
danielebarchiesi@0
|
825 $editors = wysiwyg_get_all_editors();
|
danielebarchiesi@0
|
826 return isset($editors[$name]) && $editors[$name]['installed'] ? $editors[$name] : FALSE;
|
danielebarchiesi@0
|
827 }
|
danielebarchiesi@0
|
828
|
danielebarchiesi@0
|
829 /**
|
danielebarchiesi@0
|
830 * Compile a list holding all supported editors including installed editor version information.
|
danielebarchiesi@0
|
831 */
|
danielebarchiesi@0
|
832 function wysiwyg_get_all_editors() {
|
danielebarchiesi@0
|
833 static $editors;
|
danielebarchiesi@0
|
834
|
danielebarchiesi@0
|
835 if (isset($editors)) {
|
danielebarchiesi@0
|
836 return $editors;
|
danielebarchiesi@0
|
837 }
|
danielebarchiesi@0
|
838
|
danielebarchiesi@0
|
839 $editors = wysiwyg_load_includes('editors', 'editor');
|
danielebarchiesi@0
|
840 foreach ($editors as $editor => $properties) {
|
danielebarchiesi@0
|
841 // Fill in required properties.
|
danielebarchiesi@0
|
842 $editors[$editor] += array(
|
danielebarchiesi@0
|
843 'title' => '',
|
danielebarchiesi@0
|
844 'vendor url' => '',
|
danielebarchiesi@0
|
845 'download url' => '',
|
danielebarchiesi@0
|
846 'editor path' => wysiwyg_get_path($editors[$editor]['name']),
|
danielebarchiesi@0
|
847 'library path' => wysiwyg_get_path($editors[$editor]['name']),
|
danielebarchiesi@0
|
848 'libraries' => array(),
|
danielebarchiesi@0
|
849 'version callback' => NULL,
|
danielebarchiesi@0
|
850 'themes callback' => NULL,
|
danielebarchiesi@0
|
851 'settings form callback' => NULL,
|
danielebarchiesi@0
|
852 'settings callback' => NULL,
|
danielebarchiesi@0
|
853 'plugin callback' => NULL,
|
danielebarchiesi@0
|
854 'plugin settings callback' => NULL,
|
danielebarchiesi@0
|
855 'versions' => array(),
|
danielebarchiesi@0
|
856 'js path' => $editors[$editor]['path'] . '/js',
|
danielebarchiesi@0
|
857 'css path' => $editors[$editor]['path'] . '/css',
|
danielebarchiesi@0
|
858 );
|
danielebarchiesi@0
|
859 // Check whether library is present.
|
danielebarchiesi@0
|
860 if (!($editors[$editor]['installed'] = file_exists($editors[$editor]['library path']))) {
|
danielebarchiesi@0
|
861 continue;
|
danielebarchiesi@0
|
862 }
|
danielebarchiesi@0
|
863 // Detect library version.
|
danielebarchiesi@0
|
864 if (function_exists($editors[$editor]['version callback'])) {
|
danielebarchiesi@0
|
865 $editors[$editor]['installed version'] = $editors[$editor]['version callback']($editors[$editor]);
|
danielebarchiesi@0
|
866 }
|
danielebarchiesi@0
|
867 if (empty($editors[$editor]['installed version'])) {
|
danielebarchiesi@0
|
868 $editors[$editor]['error'] = t('The version of %editor could not be detected.', array('%editor' => $properties['title']));
|
danielebarchiesi@0
|
869 $editors[$editor]['installed'] = FALSE;
|
danielebarchiesi@0
|
870 continue;
|
danielebarchiesi@0
|
871 }
|
danielebarchiesi@0
|
872 // Determine to which supported version the installed version maps.
|
danielebarchiesi@0
|
873 ksort($editors[$editor]['versions']);
|
danielebarchiesi@0
|
874 $version = 0;
|
danielebarchiesi@0
|
875 foreach ($editors[$editor]['versions'] as $supported_version => $version_properties) {
|
danielebarchiesi@0
|
876 if (version_compare($editors[$editor]['installed version'], $supported_version, '>=')) {
|
danielebarchiesi@0
|
877 $version = $supported_version;
|
danielebarchiesi@0
|
878 }
|
danielebarchiesi@0
|
879 }
|
danielebarchiesi@0
|
880 if (!$version) {
|
danielebarchiesi@0
|
881 $editors[$editor]['error'] = t('The installed version %version of %editor is not supported.', array('%version' => $editors[$editor]['installed version'], '%editor' => $editors[$editor]['title']));
|
danielebarchiesi@0
|
882 $editors[$editor]['installed'] = FALSE;
|
danielebarchiesi@0
|
883 continue;
|
danielebarchiesi@0
|
884 }
|
danielebarchiesi@0
|
885 // Apply library version specific definitions and overrides.
|
danielebarchiesi@0
|
886 $editors[$editor] = array_merge($editors[$editor], $editors[$editor]['versions'][$version]);
|
danielebarchiesi@0
|
887 unset($editors[$editor]['versions']);
|
danielebarchiesi@0
|
888 }
|
danielebarchiesi@0
|
889 return $editors;
|
danielebarchiesi@0
|
890 }
|
danielebarchiesi@0
|
891
|
danielebarchiesi@0
|
892 /**
|
danielebarchiesi@0
|
893 * Invoke hook_wysiwyg_plugin() in all modules.
|
danielebarchiesi@0
|
894 */
|
danielebarchiesi@0
|
895 function wysiwyg_get_all_plugins() {
|
danielebarchiesi@0
|
896 static $plugins;
|
danielebarchiesi@0
|
897
|
danielebarchiesi@0
|
898 if (isset($plugins)) {
|
danielebarchiesi@0
|
899 return $plugins;
|
danielebarchiesi@0
|
900 }
|
danielebarchiesi@0
|
901
|
danielebarchiesi@0
|
902 $plugins = wysiwyg_load_includes('plugins', 'plugin');
|
danielebarchiesi@0
|
903 foreach ($plugins as $name => $properties) {
|
danielebarchiesi@0
|
904 $plugin = &$plugins[$name];
|
danielebarchiesi@0
|
905 // Fill in required/default properties.
|
danielebarchiesi@0
|
906 $plugin += array(
|
danielebarchiesi@0
|
907 'title' => $plugin['name'],
|
danielebarchiesi@0
|
908 'vendor url' => '',
|
danielebarchiesi@0
|
909 'js path' => $plugin['path'] . '/' . $plugin['name'],
|
danielebarchiesi@0
|
910 'js file' => $plugin['name'] . '.js',
|
danielebarchiesi@0
|
911 'css path' => $plugin['path'] . '/' . $plugin['name'],
|
danielebarchiesi@0
|
912 'css file' => $plugin['name'] . '.css',
|
danielebarchiesi@0
|
913 'icon path' => $plugin['path'] . '/' . $plugin['name'] . '/images',
|
danielebarchiesi@0
|
914 'icon file' => $plugin['name'] . '.png',
|
danielebarchiesi@0
|
915 'dialog path' => $plugin['name'],
|
danielebarchiesi@0
|
916 'dialog settings' => array(),
|
danielebarchiesi@0
|
917 'settings callback' => NULL,
|
danielebarchiesi@0
|
918 'settings form callback' => NULL,
|
danielebarchiesi@0
|
919 );
|
danielebarchiesi@0
|
920 // Fill in default settings.
|
danielebarchiesi@0
|
921 $plugin['settings'] += array(
|
danielebarchiesi@0
|
922 'path' => base_path() . $plugin['path'] . '/' . $plugin['name'],
|
danielebarchiesi@0
|
923 );
|
danielebarchiesi@0
|
924 // Check whether library is present.
|
danielebarchiesi@0
|
925 if (!($plugin['installed'] = file_exists($plugin['js path'] . '/' . $plugin['js file']))) {
|
danielebarchiesi@0
|
926 continue;
|
danielebarchiesi@0
|
927 }
|
danielebarchiesi@0
|
928 }
|
danielebarchiesi@0
|
929 return $plugins;
|
danielebarchiesi@0
|
930 }
|
danielebarchiesi@0
|
931
|
danielebarchiesi@0
|
932 /**
|
danielebarchiesi@0
|
933 * Load include files for wysiwyg implemented by all modules.
|
danielebarchiesi@0
|
934 *
|
danielebarchiesi@0
|
935 * @param $type
|
danielebarchiesi@0
|
936 * The type of includes to search for, can be 'editors'.
|
danielebarchiesi@0
|
937 * @param $hook
|
danielebarchiesi@0
|
938 * The hook name to invoke.
|
danielebarchiesi@0
|
939 * @param $file
|
danielebarchiesi@0
|
940 * An optional include file name without .inc extension to limit the search to.
|
danielebarchiesi@0
|
941 *
|
danielebarchiesi@0
|
942 * @see wysiwyg_get_directories(), _wysiwyg_process_include()
|
danielebarchiesi@0
|
943 */
|
danielebarchiesi@0
|
944 function wysiwyg_load_includes($type = 'editors', $hook = 'editor', $file = NULL) {
|
danielebarchiesi@0
|
945 // Determine implementations.
|
danielebarchiesi@0
|
946 $directories = wysiwyg_get_directories($type);
|
danielebarchiesi@0
|
947 $directories['wysiwyg'] = drupal_get_path('module', 'wysiwyg') . '/' . $type;
|
danielebarchiesi@0
|
948 $file_list = array();
|
danielebarchiesi@0
|
949 foreach ($directories as $module => $path) {
|
danielebarchiesi@0
|
950 $file_list[$module] = drupal_system_listing("/{$file}.inc\$/", $path, 'name', 0);
|
danielebarchiesi@0
|
951 }
|
danielebarchiesi@0
|
952
|
danielebarchiesi@0
|
953 // Load implementations.
|
danielebarchiesi@0
|
954 $info = array();
|
danielebarchiesi@0
|
955 foreach (array_filter($file_list) as $module => $files) {
|
danielebarchiesi@0
|
956 foreach ($files as $file) {
|
danielebarchiesi@0
|
957 include_once './' . $file->uri;
|
danielebarchiesi@0
|
958 $result = _wysiwyg_process_include($module, $module . '_' . $file->name, dirname($file->uri), $hook);
|
danielebarchiesi@0
|
959 if (is_array($result)) {
|
danielebarchiesi@0
|
960 $info = array_merge($info, $result);
|
danielebarchiesi@0
|
961 }
|
danielebarchiesi@0
|
962 }
|
danielebarchiesi@0
|
963 }
|
danielebarchiesi@0
|
964 return $info;
|
danielebarchiesi@0
|
965 }
|
danielebarchiesi@0
|
966
|
danielebarchiesi@0
|
967 /**
|
danielebarchiesi@0
|
968 * Helper function to build paths to libraries.
|
danielebarchiesi@0
|
969 *
|
danielebarchiesi@0
|
970 * @param $library
|
danielebarchiesi@0
|
971 * The external library name to return the path for.
|
danielebarchiesi@0
|
972 * @param $base_path
|
danielebarchiesi@0
|
973 * Whether to prefix the resulting path with base_path().
|
danielebarchiesi@0
|
974 *
|
danielebarchiesi@0
|
975 * @return
|
danielebarchiesi@0
|
976 * The path to the specified library.
|
danielebarchiesi@0
|
977 *
|
danielebarchiesi@0
|
978 * @ingroup libraries
|
danielebarchiesi@0
|
979 */
|
danielebarchiesi@0
|
980 function wysiwyg_get_path($library, $base_path = FALSE) {
|
danielebarchiesi@0
|
981 static $libraries;
|
danielebarchiesi@0
|
982
|
danielebarchiesi@0
|
983 if (!isset($libraries)) {
|
danielebarchiesi@0
|
984 $libraries = wysiwyg_get_libraries();
|
danielebarchiesi@0
|
985 }
|
danielebarchiesi@0
|
986 if (!isset($libraries[$library])) {
|
danielebarchiesi@0
|
987 // Most often, external libraries can be shared across multiple sites.
|
danielebarchiesi@0
|
988 return 'sites/all/libraries/' . $library;
|
danielebarchiesi@0
|
989 }
|
danielebarchiesi@0
|
990
|
danielebarchiesi@0
|
991 $path = ($base_path ? base_path() : '');
|
danielebarchiesi@0
|
992 $path .= $libraries[$library];
|
danielebarchiesi@0
|
993
|
danielebarchiesi@0
|
994 return $path;
|
danielebarchiesi@0
|
995 }
|
danielebarchiesi@0
|
996
|
danielebarchiesi@0
|
997 /**
|
danielebarchiesi@0
|
998 * Return an array of library directories.
|
danielebarchiesi@0
|
999 *
|
danielebarchiesi@0
|
1000 * Returns an array of library directories from the all-sites directory
|
danielebarchiesi@0
|
1001 * (i.e. sites/all/libraries/), the profiles directory, and site-specific
|
danielebarchiesi@0
|
1002 * directory (i.e. sites/somesite/libraries/). The returned array will be keyed
|
danielebarchiesi@0
|
1003 * by the library name. Site-specific libraries are prioritized over libraries
|
danielebarchiesi@0
|
1004 * in the default directories. That is, if a library with the same name appears
|
danielebarchiesi@0
|
1005 * in both the site-wide directory and site-specific directory, only the
|
danielebarchiesi@0
|
1006 * site-specific version will be listed.
|
danielebarchiesi@0
|
1007 *
|
danielebarchiesi@0
|
1008 * @return
|
danielebarchiesi@0
|
1009 * A list of library directories.
|
danielebarchiesi@0
|
1010 *
|
danielebarchiesi@0
|
1011 * @ingroup libraries
|
danielebarchiesi@0
|
1012 */
|
danielebarchiesi@0
|
1013 function wysiwyg_get_libraries() {
|
danielebarchiesi@0
|
1014 global $profile;
|
danielebarchiesi@0
|
1015
|
danielebarchiesi@0
|
1016 // When this function is called during Drupal's initial installation process,
|
danielebarchiesi@0
|
1017 // the name of the profile that is about to be installed is stored in the
|
danielebarchiesi@0
|
1018 // global $profile variable. At all other times, the regular system variable
|
danielebarchiesi@0
|
1019 // contains the name of the current profile, and we can call variable_get()
|
danielebarchiesi@0
|
1020 // to determine the profile.
|
danielebarchiesi@0
|
1021 if (!isset($profile)) {
|
danielebarchiesi@0
|
1022 $profile = variable_get('install_profile', 'default');
|
danielebarchiesi@0
|
1023 }
|
danielebarchiesi@0
|
1024
|
danielebarchiesi@0
|
1025 $directory = 'libraries';
|
danielebarchiesi@0
|
1026 $searchdir = array();
|
danielebarchiesi@0
|
1027 $config = conf_path();
|
danielebarchiesi@0
|
1028
|
danielebarchiesi@0
|
1029 // The 'profiles' directory contains pristine collections of modules and
|
danielebarchiesi@0
|
1030 // themes as organized by a distribution. It is pristine in the same way
|
danielebarchiesi@0
|
1031 // that /modules is pristine for core; users should avoid changing anything
|
danielebarchiesi@0
|
1032 // there in favor of sites/all or sites/<domain> directories.
|
danielebarchiesi@0
|
1033 if (file_exists("profiles/$profile/$directory")) {
|
danielebarchiesi@0
|
1034 $searchdir[] = "profiles/$profile/$directory";
|
danielebarchiesi@0
|
1035 }
|
danielebarchiesi@0
|
1036
|
danielebarchiesi@0
|
1037 // Always search sites/all/*.
|
danielebarchiesi@0
|
1038 $searchdir[] = 'sites/all/' . $directory;
|
danielebarchiesi@0
|
1039
|
danielebarchiesi@0
|
1040 // Also search sites/<domain>/*.
|
danielebarchiesi@0
|
1041 if (file_exists("$config/$directory")) {
|
danielebarchiesi@0
|
1042 $searchdir[] = "$config/$directory";
|
danielebarchiesi@0
|
1043 }
|
danielebarchiesi@0
|
1044
|
danielebarchiesi@0
|
1045 // Retrieve list of directories.
|
danielebarchiesi@0
|
1046 // @todo Core: Allow to scan for directories.
|
danielebarchiesi@0
|
1047 $directories = array();
|
danielebarchiesi@0
|
1048 $nomask = array('CVS');
|
danielebarchiesi@0
|
1049 foreach ($searchdir as $dir) {
|
danielebarchiesi@0
|
1050 if (is_dir($dir) && $handle = opendir($dir)) {
|
danielebarchiesi@0
|
1051 while (FALSE !== ($file = readdir($handle))) {
|
danielebarchiesi@0
|
1052 if (!in_array($file, $nomask) && $file[0] != '.') {
|
danielebarchiesi@0
|
1053 if (is_dir("$dir/$file")) {
|
danielebarchiesi@0
|
1054 $directories[$file] = "$dir/$file";
|
danielebarchiesi@0
|
1055 }
|
danielebarchiesi@0
|
1056 }
|
danielebarchiesi@0
|
1057 }
|
danielebarchiesi@0
|
1058 closedir($handle);
|
danielebarchiesi@0
|
1059 }
|
danielebarchiesi@0
|
1060 }
|
danielebarchiesi@0
|
1061
|
danielebarchiesi@0
|
1062 return $directories;
|
danielebarchiesi@0
|
1063 }
|
danielebarchiesi@0
|
1064
|
danielebarchiesi@0
|
1065 /**
|
danielebarchiesi@0
|
1066 * Return a list of directories by modules implementing wysiwyg_include_directory().
|
danielebarchiesi@0
|
1067 *
|
danielebarchiesi@0
|
1068 * @param $plugintype
|
danielebarchiesi@0
|
1069 * The type of a plugin; can be 'editors'.
|
danielebarchiesi@0
|
1070 *
|
danielebarchiesi@0
|
1071 * @return
|
danielebarchiesi@0
|
1072 * An array containing module names suffixed with '_' and their defined
|
danielebarchiesi@0
|
1073 * directory.
|
danielebarchiesi@0
|
1074 *
|
danielebarchiesi@0
|
1075 * @see wysiwyg_load_includes(), _wysiwyg_process_include()
|
danielebarchiesi@0
|
1076 */
|
danielebarchiesi@0
|
1077 function wysiwyg_get_directories($plugintype) {
|
danielebarchiesi@0
|
1078 $directories = array();
|
danielebarchiesi@0
|
1079 foreach (module_implements('wysiwyg_include_directory') as $module) {
|
danielebarchiesi@0
|
1080 $result = module_invoke($module, 'wysiwyg_include_directory', $plugintype);
|
danielebarchiesi@0
|
1081 if (isset($result) && is_string($result)) {
|
danielebarchiesi@0
|
1082 $directories[$module] = drupal_get_path('module', $module) . '/' . $result;
|
danielebarchiesi@0
|
1083 }
|
danielebarchiesi@0
|
1084 }
|
danielebarchiesi@0
|
1085 return $directories;
|
danielebarchiesi@0
|
1086 }
|
danielebarchiesi@0
|
1087
|
danielebarchiesi@0
|
1088 /**
|
danielebarchiesi@0
|
1089 * Process a single hook implementation of a wysiwyg editor.
|
danielebarchiesi@0
|
1090 *
|
danielebarchiesi@0
|
1091 * @param $module
|
danielebarchiesi@0
|
1092 * The module that owns the hook.
|
danielebarchiesi@0
|
1093 * @param $identifier
|
danielebarchiesi@0
|
1094 * Either the module or 'wysiwyg_' . $file->name
|
danielebarchiesi@0
|
1095 * @param $hook
|
danielebarchiesi@0
|
1096 * The name of the hook being invoked.
|
danielebarchiesi@0
|
1097 */
|
danielebarchiesi@0
|
1098 function _wysiwyg_process_include($module, $identifier, $path, $hook) {
|
danielebarchiesi@0
|
1099 $function = $identifier . '_' . $hook;
|
danielebarchiesi@0
|
1100 if (!function_exists($function)) {
|
danielebarchiesi@0
|
1101 return NULL;
|
danielebarchiesi@0
|
1102 }
|
danielebarchiesi@0
|
1103 $result = $function();
|
danielebarchiesi@0
|
1104 if (!isset($result) || !is_array($result)) {
|
danielebarchiesi@0
|
1105 return NULL;
|
danielebarchiesi@0
|
1106 }
|
danielebarchiesi@0
|
1107
|
danielebarchiesi@0
|
1108 // Fill in defaults.
|
danielebarchiesi@0
|
1109 foreach ($result as $editor => $properties) {
|
danielebarchiesi@0
|
1110 $result[$editor]['module'] = $module;
|
danielebarchiesi@0
|
1111 $result[$editor]['name'] = $editor;
|
danielebarchiesi@0
|
1112 $result[$editor]['path'] = $path;
|
danielebarchiesi@0
|
1113 }
|
danielebarchiesi@0
|
1114 return $result;
|
danielebarchiesi@0
|
1115 }
|
danielebarchiesi@0
|
1116
|
danielebarchiesi@0
|
1117 /**
|
danielebarchiesi@0
|
1118 * @} End of "defgroup wysiwyg_api".
|
danielebarchiesi@0
|
1119 */
|
danielebarchiesi@0
|
1120
|
danielebarchiesi@0
|
1121 /**
|
danielebarchiesi@0
|
1122 * Implements hook_features_api().
|
danielebarchiesi@0
|
1123 */
|
danielebarchiesi@0
|
1124 function wysiwyg_features_api() {
|
danielebarchiesi@0
|
1125 return array(
|
danielebarchiesi@0
|
1126 'wysiwyg' => array(
|
danielebarchiesi@0
|
1127 'name' => t('Wysiwyg profiles'),
|
danielebarchiesi@0
|
1128 'default_hook' => 'wysiwyg_default_profiles',
|
danielebarchiesi@0
|
1129 'default_file' => FEATURES_DEFAULTS_INCLUDED,
|
danielebarchiesi@0
|
1130 'feature_source' => TRUE,
|
danielebarchiesi@0
|
1131 'file' => drupal_get_path('module', 'wysiwyg') . '/wysiwyg.features.inc',
|
danielebarchiesi@0
|
1132 ),
|
danielebarchiesi@0
|
1133 );
|
danielebarchiesi@0
|
1134 }
|
danielebarchiesi@0
|
1135
|