From fdd2f67cc66398efdff7e7595555cb9b3dbb8894 Mon Sep 17 00:00:00 2001 From: Bachir Soussi Chiadmi Date: Fri, 7 Sep 2018 10:54:01 +0200 Subject: [PATCH] big update --- CHANGELOG.txt | 4 + google5c59d2e455c34eaa.html | 1 - includes/bootstrap.inc | 7 +- includes/common.inc | 5 +- includes/request-sanitizer.inc | 32 + modules/aggregator/aggregator.info | 7 +- modules/aggregator/tests/aggregator_test.info | 7 +- modules/block/block.info | 7 +- modules/block/tests/block_test.info | 7 +- .../block_test_theme/block_test_theme.info | 7 +- modules/blog/blog.info | 7 +- modules/book/book.info | 7 +- modules/color/color.info | 7 +- modules/comment/comment.info | 7 +- modules/contact/contact.info | 7 +- modules/contextual/contextual.info | 7 +- modules/dashboard/dashboard.info | 7 +- modules/dblog/dblog.info | 7 +- modules/field/field.info | 7 +- .../field_sql_storage/field_sql_storage.info | 7 +- modules/field/modules/list/list.info | 7 +- .../field/modules/list/tests/list_test.info | 7 +- modules/field/modules/number/number.info | 7 +- modules/field/modules/options/options.info | 7 +- modules/field/modules/text/text.info | 7 +- modules/field/tests/field_test.info | 7 +- modules/field_ui/field_ui.info | 7 +- modules/file/file.info | 7 +- modules/file/file.module | 3 + modules/file/tests/file_module_test.info | 7 +- modules/filter/filter.info | 7 +- modules/forum/forum.info | 7 +- modules/help/help.info | 7 +- modules/image/image.info | 7 +- modules/image/tests/image_module_test.info | 7 +- modules/locale/locale.info | 7 +- modules/locale/tests/locale_test.info | 7 +- modules/menu/menu.info | 7 +- modules/node/node.info | 7 +- modules/node/tests/node_access_test.info | 7 +- modules/node/tests/node_test.info | 7 +- modules/node/tests/node_test_exception.info | 7 +- modules/openid/openid.info | 7 +- modules/openid/tests/openid_test.info | 7 +- modules/overlay/overlay.info | 7 +- modules/path/path.info | 7 +- modules/php/php.info | 7 +- modules/poll/poll.info | 7 +- modules/profile/profile.info | 7 +- modules/rdf/rdf.info | 7 +- modules/rdf/tests/rdf_test.info | 7 +- modules/search/search.info | 7 +- .../search/tests/search_embedded_form.info | 7 +- modules/search/tests/search_extra_type.info | 7 +- modules/search/tests/search_node_tags.info | 7 +- modules/shortcut/shortcut.info | 7 +- modules/simpletest/simpletest.info | 7 +- .../simpletest/tests/actions_loop_test.info | 7 +- modules/simpletest/tests/ajax_forms_test.info | 7 +- modules/simpletest/tests/ajax_test.info | 7 +- modules/simpletest/tests/batch_test.info | 7 +- modules/simpletest/tests/boot_test_1.info | 7 +- modules/simpletest/tests/boot_test_2.info | 7 +- modules/simpletest/tests/common_test.info | 7 +- .../tests/common_test_cron_helper.info | 7 +- modules/simpletest/tests/database_test.info | 7 +- .../drupal_autoload_test.info | 7 +- ...drupal_system_listing_compatible_test.info | 7 +- ...upal_system_listing_incompatible_test.info | 7 +- .../simpletest/tests/entity_cache_test.info | 7 +- .../tests/entity_cache_test_dependency.info | 7 +- .../tests/entity_crud_hook_test.info | 7 +- .../tests/entity_query_access_test.info | 7 +- modules/simpletest/tests/error_test.info | 7 +- modules/simpletest/tests/file_test.info | 7 +- modules/simpletest/tests/filter_test.info | 7 +- modules/simpletest/tests/form_test.info | 7 +- modules/simpletest/tests/image_test.info | 7 +- modules/simpletest/tests/menu_test.info | 7 +- modules/simpletest/tests/module_test.info | 7 +- modules/simpletest/tests/path_test.info | 7 +- .../tests/psr_0_test/psr_0_test.info | 7 +- .../tests/psr_4_test/psr_4_test.info | 7 +- .../simpletest/tests/requirements1_test.info | 7 +- .../simpletest/tests/requirements2_test.info | 7 +- modules/simpletest/tests/session_test.info | 7 +- .../tests/system_dependencies_test.info | 7 +- ...atible_core_version_dependencies_test.info | 7 +- ...system_incompatible_core_version_test.info | 7 +- ...ible_module_version_dependencies_test.info | 7 +- ...stem_incompatible_module_version_test.info | 7 +- .../tests/system_project_namespace_test.info | 7 +- modules/simpletest/tests/system_test.info | 7 +- modules/simpletest/tests/taxonomy_test.info | 7 +- modules/simpletest/tests/theme_test.info | 7 +- .../themes/test_basetheme/test_basetheme.info | 7 +- .../themes/test_subtheme/test_subtheme.info | 7 +- .../tests/themes/test_theme/test_theme.info | 7 +- .../test_theme_nyan_cat.info | 7 +- .../simpletest/tests/update_script_test.info | 7 +- modules/simpletest/tests/update_test_1.info | 7 +- modules/simpletest/tests/update_test_2.info | 7 +- modules/simpletest/tests/update_test_3.info | 7 +- modules/simpletest/tests/url_alter_test.info | 7 +- modules/simpletest/tests/xmlrpc_test.info | 7 +- modules/statistics/statistics.info | 7 +- modules/syslog/syslog.info | 7 +- modules/system/system.info | 7 +- modules/system/tests/cron_queue_test.info | 7 +- modules/system/tests/system_cron_test.info | 7 +- modules/taxonomy/taxonomy.info | 7 +- modules/toolbar/toolbar.info | 7 +- modules/tracker/tracker.info | 7 +- .../translation/tests/translation_test.info | 7 +- modules/translation/translation.info | 7 +- modules/trigger/tests/trigger_test.info | 7 +- modules/trigger/trigger.info | 7 +- modules/update/tests/aaa_update_test.info | 7 +- modules/update/tests/bbb_update_test.info | 7 +- modules/update/tests/ccc_update_test.info | 7 +- .../update_test_admintheme.info | 7 +- .../update_test_basetheme.info | 7 +- .../update_test_subtheme.info | 7 +- modules/update/tests/update_test.info | 7 +- modules/update/update.info | 7 +- modules/user/tests/user_form_test.info | 7 +- modules/user/user.info | 7 +- profiles/minimal/minimal.info | 7 +- profiles/standard/standard.info | 7 +- ...drupal_system_listing_compatible_test.info | 7 +- ...upal_system_listing_incompatible_test.info | 7 +- profiles/testing/testing.info | 7 +- sites/all/libraries/less.php/Cache.php | 316 + sites/all/libraries/less.php/Less.php | 10311 ++++++++++++++++ sites/all/libraries/less.php/Version.php | 15 + sites/all/modules/imce/LICENSE.txt | 339 + sites/all/modules/imce/README.txt | 181 + sites/all/modules/imce/css/close.png | Bin 0 -> 322 bytes sites/all/modules/imce/css/collapsed.png | Bin 0 -> 104 bytes sites/all/modules/imce/css/delete.png | Bin 0 -> 320 bytes sites/all/modules/imce/css/error.png | Bin 0 -> 498 bytes sites/all/modules/imce/css/expanded.png | Bin 0 -> 101 bytes sites/all/modules/imce/css/folder-open.png | Bin 0 -> 948 bytes sites/all/modules/imce/css/folder-root.png | Bin 0 -> 338 bytes sites/all/modules/imce/css/folder.png | Bin 0 -> 228 bytes sites/all/modules/imce/css/header.png | Bin 0 -> 147 bytes sites/all/modules/imce/css/help.png | Bin 0 -> 525 bytes sites/all/modules/imce/css/imce-content.css | 460 + sites/all/modules/imce/css/leaf.png | Bin 0 -> 100 bytes sites/all/modules/imce/css/loading.gif | Bin 0 -> 1058 bytes sites/all/modules/imce/css/op.png | Bin 0 -> 261 bytes sites/all/modules/imce/css/ops.png | Bin 0 -> 164 bytes sites/all/modules/imce/css/resize.png | Bin 0 -> 331 bytes sites/all/modules/imce/css/sendto.png | Bin 0 -> 488 bytes sites/all/modules/imce/css/status.png | Bin 0 -> 440 bytes sites/all/modules/imce/css/submit.png | Bin 0 -> 261 bytes sites/all/modules/imce/css/thumb.png | Bin 0 -> 1004 bytes sites/all/modules/imce/css/tree.png | Bin 0 -> 349 bytes sites/all/modules/imce/css/upload.png | Bin 0 -> 502 bytes sites/all/modules/imce/css/view-box.png | Bin 0 -> 509 bytes sites/all/modules/imce/css/view-list.png | Bin 0 -> 493 bytes sites/all/modules/imce/css/warning.png | Bin 0 -> 444 bytes sites/all/modules/imce/css/x-resizer.png | Bin 0 -> 102 bytes sites/all/modules/imce/css/y-resizer.png | Bin 0 -> 107 bytes sites/all/modules/imce/imce.info | 12 + sites/all/modules/imce/imce.install | 125 + sites/all/modules/imce/imce.module | 215 + sites/all/modules/imce/inc/imce.admin.inc | 747 ++ .../modules/imce/inc/imce.core.profiles.inc | 56 + sites/all/modules/imce/inc/imce.js.inc | 67 + sites/all/modules/imce/inc/imce.page.inc | 1129 ++ sites/all/modules/imce/js/imce.js | 857 ++ sites/all/modules/imce/js/imce_extras.js | 284 + sites/all/modules/imce/js/imce_set_app.js | 97 + sites/all/modules/imce/js/imce_set_inline.js | 58 + sites/all/modules/imce/js/jquery.form.js | 31 + .../all/modules/imce/tpl/imce-content.tpl.php | 108 + .../modules/imce/tpl/imce-file-list.tpl.php | 25 + sites/all/modules/imce/tpl/imce-page.tpl.php | 21 + .../popsu_actualites.features.field.inc | 426 - .../popsu_actualites.features.field_base.inc | 182 + ...psu_actualites.features.field_instance.inc | 404 + .../popsu_actualites.features.inc | 60 +- .../popsu_actualites.field_group.inc | 5 +- .../popsu_actualites/popsu_actualites.info | 30 +- .../popsu_actualites.pages_default.inc | 602 +- .../popsu_actualites.strongarm.inc | 41 +- .../popsu_actualites.views_default.inc | 114 +- .../popsu_structure/popsu_structure.box.inc | 81 +- .../popsu_structure.context.inc | 12 +- .../popsu_structure.features.inc | 54 +- .../popsu_structure/popsu_structure.info | 14 +- .../popsu_villes.features.field_base.inc | 210 + .../popsu_villes.features.field_instance.inc | 489 + .../popsu_villes/popsu_villes.features.inc | 49 +- .../features/popsu_villes/popsu_villes.info | 30 +- .../popsu_villes.pages_default.inc | 630 +- .../popsu_villes/popsu_villes.strongarm.inc | 13 + .../popsu_villes.views_default.inc | 3 - sites/default/themes/popsu/css/screen.css | 17 +- .../popsu/img/body-pattern-wide-trans.png | Bin 37685 -> 51505 bytes .../popsu/img/body-pattern-wide-trans_OLD.png | Bin 0 -> 37685 bytes .../img/carte/points/points_carte_1-2-3-5.png | Bin 0 -> 1572 bytes .../img/carte/points/points_carte_1-2-5.png | Bin 0 -> 777 bytes .../img/carte/points/points_carte_1-3-5.png | Bin 0 -> 786 bytes .../img/carte/points/points_carte_1-5.png | Bin 0 -> 825 bytes .../img/carte/points/points_carte_2-3-5.png | Bin 0 -> 777 bytes .../img/carte/points/points_carte_2-5.png | Bin 0 -> 959 bytes .../popsu/img/carte/points/points_carte_5.png | Bin 0 -> 531 bytes .../themes/popsu/img/icons/facebook.png | Bin 0 -> 516 bytes .../themes/popsu/img/icons/twitter.png | Bin 0 -> 1555 bytes .../themes/popsu/img/icons/youtube-white.png | Bin 0 -> 8316 bytes .../logo-pages-froides-avec-baseline.png | Bin 11042 -> 15210 bytes .../logo-pages-froides-avec-baseline_OLD.png | Bin 0 -> 11042 bytes .../popsu1/logo-small-home-trans-old.png | Bin 0 -> 2987 bytes .../logos/popsu1/logo-small-home-trans.png | Bin 2987 -> 7693 bytes .../popsu2/logo-small-home-trans-old.png | Bin 0 -> 3081 bytes .../logos/popsu2/logo-small-home-trans.png | Bin 3081 -> 8734 bytes .../popsueurope/logo-small-home-trans-old.png | Bin 0 -> 3455 bytes .../popsueurope/logo-small-home-trans.png | Bin 3455 -> 10370 bytes .../popsumetropoles/logo-sidebar-trans.png | Bin 0 -> 14082 bytes .../popsumetropoles/logo-small-home-trans.png | Bin 0 -> 11591 bytes .../popsumetropoles/logo-small-trans.png | Bin 0 -> 3175 bytes .../popsumetropoles/logo-small-trans_new.png | Bin 0 -> 3175 bytes .../popsumetropoles/logo-small-trans_old.png | Bin 0 -> 7092 bytes .../logos/popsumonde/logo-sidebar-trans.png | Bin 0 -> 9933 bytes .../popsumonde/logo-small-home-trans.png | Bin 0 -> 10188 bytes .../img/logos/popsumonde/logo-small-trans.png | Bin 0 -> 2873 bytes .../logos/popsumonde/logo-small-trans_new.png | Bin 0 -> 2873 bytes .../logos/popsumonde/logo-small-trans_old.png | Bin 0 -> 7085 bytes .../popsuterritoires/logo-sidebar-trans.png | Bin 0 -> 10584 bytes .../logo-small-home-trans.png | Bin 0 -> 3387 bytes .../popsuterritoires/logo-small-trans.png | Bin 0 -> 2944 bytes .../popsuterritoires/logo-small-trans_old.png | Bin 0 -> 5484 bytes sites/default/themes/popsu/js/script.js | 93 +- .../themes/popsu/less/content-all.css.less | 113 +- .../default/themes/popsu/less/layout.css.less | 457 +- sites/default/themes/popsu/less/lib.less | 3 + sites/default/themes/popsu/less/wide.less | 77 +- themes/bartik/bartik.info | 7 +- themes/garland/garland.info | 7 +- themes/seven/seven.info | 7 +- themes/stark/stark.info | 7 +- 243 files changed, 18538 insertions(+), 2087 deletions(-) delete mode 100644 google5c59d2e455c34eaa.html create mode 100644 sites/all/libraries/less.php/Cache.php create mode 100644 sites/all/libraries/less.php/Less.php create mode 100644 sites/all/libraries/less.php/Version.php create mode 100644 sites/all/modules/imce/LICENSE.txt create mode 100644 sites/all/modules/imce/README.txt create mode 100644 sites/all/modules/imce/css/close.png create mode 100644 sites/all/modules/imce/css/collapsed.png create mode 100644 sites/all/modules/imce/css/delete.png create mode 100644 sites/all/modules/imce/css/error.png create mode 100644 sites/all/modules/imce/css/expanded.png create mode 100644 sites/all/modules/imce/css/folder-open.png create mode 100644 sites/all/modules/imce/css/folder-root.png create mode 100644 sites/all/modules/imce/css/folder.png create mode 100644 sites/all/modules/imce/css/header.png create mode 100644 sites/all/modules/imce/css/help.png create mode 100644 sites/all/modules/imce/css/imce-content.css create mode 100644 sites/all/modules/imce/css/leaf.png create mode 100644 sites/all/modules/imce/css/loading.gif create mode 100644 sites/all/modules/imce/css/op.png create mode 100644 sites/all/modules/imce/css/ops.png create mode 100644 sites/all/modules/imce/css/resize.png create mode 100644 sites/all/modules/imce/css/sendto.png create mode 100644 sites/all/modules/imce/css/status.png create mode 100644 sites/all/modules/imce/css/submit.png create mode 100644 sites/all/modules/imce/css/thumb.png create mode 100644 sites/all/modules/imce/css/tree.png create mode 100644 sites/all/modules/imce/css/upload.png create mode 100644 sites/all/modules/imce/css/view-box.png create mode 100644 sites/all/modules/imce/css/view-list.png create mode 100644 sites/all/modules/imce/css/warning.png create mode 100644 sites/all/modules/imce/css/x-resizer.png create mode 100644 sites/all/modules/imce/css/y-resizer.png create mode 100644 sites/all/modules/imce/imce.info create mode 100644 sites/all/modules/imce/imce.install create mode 100644 sites/all/modules/imce/imce.module create mode 100644 sites/all/modules/imce/inc/imce.admin.inc create mode 100644 sites/all/modules/imce/inc/imce.core.profiles.inc create mode 100644 sites/all/modules/imce/inc/imce.js.inc create mode 100644 sites/all/modules/imce/inc/imce.page.inc create mode 100644 sites/all/modules/imce/js/imce.js create mode 100644 sites/all/modules/imce/js/imce_extras.js create mode 100644 sites/all/modules/imce/js/imce_set_app.js create mode 100644 sites/all/modules/imce/js/imce_set_inline.js create mode 100644 sites/all/modules/imce/js/jquery.form.js create mode 100644 sites/all/modules/imce/tpl/imce-content.tpl.php create mode 100644 sites/all/modules/imce/tpl/imce-file-list.tpl.php create mode 100644 sites/all/modules/imce/tpl/imce-page.tpl.php delete mode 100644 sites/default/modules/features/popsu_actualites/popsu_actualites.features.field.inc create mode 100644 sites/default/modules/features/popsu_actualites/popsu_actualites.features.field_base.inc create mode 100644 sites/default/modules/features/popsu_actualites/popsu_actualites.features.field_instance.inc create mode 100644 sites/default/modules/features/popsu_villes/popsu_villes.features.field_base.inc create mode 100644 sites/default/modules/features/popsu_villes/popsu_villes.features.field_instance.inc create mode 100644 sites/default/themes/popsu/img/body-pattern-wide-trans_OLD.png create mode 100644 sites/default/themes/popsu/img/carte/points/points_carte_1-2-3-5.png create mode 100644 sites/default/themes/popsu/img/carte/points/points_carte_1-2-5.png create mode 100644 sites/default/themes/popsu/img/carte/points/points_carte_1-3-5.png create mode 100644 sites/default/themes/popsu/img/carte/points/points_carte_1-5.png create mode 100644 sites/default/themes/popsu/img/carte/points/points_carte_2-3-5.png create mode 100644 sites/default/themes/popsu/img/carte/points/points_carte_2-5.png create mode 100644 sites/default/themes/popsu/img/carte/points/points_carte_5.png create mode 100644 sites/default/themes/popsu/img/icons/facebook.png create mode 100644 sites/default/themes/popsu/img/icons/twitter.png create mode 100644 sites/default/themes/popsu/img/icons/youtube-white.png create mode 100644 sites/default/themes/popsu/img/logos/logo-pages-froides-avec-baseline_OLD.png create mode 100644 sites/default/themes/popsu/img/logos/popsu1/logo-small-home-trans-old.png create mode 100644 sites/default/themes/popsu/img/logos/popsu2/logo-small-home-trans-old.png create mode 100644 sites/default/themes/popsu/img/logos/popsueurope/logo-small-home-trans-old.png create mode 100644 sites/default/themes/popsu/img/logos/popsumetropoles/logo-sidebar-trans.png create mode 100644 sites/default/themes/popsu/img/logos/popsumetropoles/logo-small-home-trans.png create mode 100644 sites/default/themes/popsu/img/logos/popsumetropoles/logo-small-trans.png create mode 100644 sites/default/themes/popsu/img/logos/popsumetropoles/logo-small-trans_new.png create mode 100644 sites/default/themes/popsu/img/logos/popsumetropoles/logo-small-trans_old.png create mode 100644 sites/default/themes/popsu/img/logos/popsumonde/logo-sidebar-trans.png create mode 100644 sites/default/themes/popsu/img/logos/popsumonde/logo-small-home-trans.png create mode 100644 sites/default/themes/popsu/img/logos/popsumonde/logo-small-trans.png create mode 100644 sites/default/themes/popsu/img/logos/popsumonde/logo-small-trans_new.png create mode 100644 sites/default/themes/popsu/img/logos/popsumonde/logo-small-trans_old.png create mode 100644 sites/default/themes/popsu/img/logos/popsuterritoires/logo-sidebar-trans.png create mode 100644 sites/default/themes/popsu/img/logos/popsuterritoires/logo-small-home-trans.png create mode 100644 sites/default/themes/popsu/img/logos/popsuterritoires/logo-small-trans.png create mode 100644 sites/default/themes/popsu/img/logos/popsuterritoires/logo-small-trans_old.png diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 799b800..0929559 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,4 +1,8 @@ +Drupal 7.59, 2018-04-25 +----------------------- +- Fixed security issues (remote code execution). See SA-CORE-2018-004. + Drupal 7.58, 2018-03-28 ----------------------- - Fixed security issues (multiple vulnerabilities). See SA-CORE-2018-002. diff --git a/google5c59d2e455c34eaa.html b/google5c59d2e455c34eaa.html deleted file mode 100644 index 6af089d..0000000 --- a/google5c59d2e455c34eaa.html +++ /dev/null @@ -1 +0,0 @@ -google-site-verification: google5c59d2e455c34eaa.html \ No newline at end of file diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc index 06acf93..a91c398 100644 --- a/includes/bootstrap.inc +++ b/includes/bootstrap.inc @@ -8,7 +8,7 @@ /** * The current system version. */ -define('VERSION', '7.58'); +define('VERSION', '7.59'); /** * Core API compatibility. @@ -2778,6 +2778,11 @@ function _drupal_bootstrap_variables() { unset($_GET['destination']); unset($_REQUEST['destination']); } + // Use the DrupalRequestSanitizer to ensure that the destination's query + // parameters are not dangerous. + if (isset($_GET['destination'])) { + DrupalRequestSanitizer::cleanDestination(); + } // If there's still something in $_REQUEST['destination'] that didn't come // from $_GET, check it too. if (isset($_REQUEST['destination']) && (!isset($_GET['destination']) || $_REQUEST['destination'] != $_GET['destination']) && url_is_external($_REQUEST['destination'])) { diff --git a/includes/common.inc b/includes/common.inc index d7dc47f..f61d1eb 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -611,8 +611,9 @@ function drupal_parse_url($url) { } // The 'q' parameter contains the path of the current page if clean URLs are // disabled. It overrides the 'path' of the URL when present, even if clean - // URLs are enabled, due to how Apache rewriting rules work. - if (isset($options['query']['q'])) { + // URLs are enabled, due to how Apache rewriting rules work. The path + // parameter must be a string. + if (isset($options['query']['q']) && is_string($options['query']['q'])) { $options['path'] = $options['query']['q']; unset($options['query']['q']); } diff --git a/includes/request-sanitizer.inc b/includes/request-sanitizer.inc index 1daa6b5..7214436 100644 --- a/includes/request-sanitizer.inc +++ b/includes/request-sanitizer.inc @@ -51,6 +51,38 @@ class DrupalRequestSanitizer { } } + /** + * Removes the destination if it is dangerous. + * + * Note this can only be called after common.inc has been included. + * + * @return bool + * TRUE if the destination has been removed from $_GET, FALSE if not. + */ + public static function cleanDestination() { + $dangerous_keys = array(); + $log_sanitized_keys = variable_get('sanitize_input_logging', FALSE); + + $parts = drupal_parse_url($_GET['destination']); + // If there is a query string, check its query parameters. + if (!empty($parts['query'])) { + $whitelist = variable_get('sanitize_input_whitelist', array()); + + self::stripDangerousValues($parts['query'], $whitelist, $dangerous_keys); + if (!empty($dangerous_keys)) { + // The destination is removed rather than sanitized to mirror the + // handling of external destinations. + unset($_GET['destination']); + unset($_REQUEST['destination']); + if ($log_sanitized_keys) { + trigger_error(format_string('Potentially unsafe destination removed from query string parameters (GET) because it contained the following keys: @keys', array('@keys' => implode(', ', $dangerous_keys)))); + } + return TRUE; + } + } + return FALSE; + } + /** * Strips dangerous keys from the provided input. * diff --git a/modules/aggregator/aggregator.info b/modules/aggregator/aggregator.info index e8645d1..18821d2 100644 --- a/modules/aggregator/aggregator.info +++ b/modules/aggregator/aggregator.info @@ -7,8 +7,7 @@ files[] = aggregator.test configure = admin/config/services/aggregator/settings stylesheets[all][] = aggregator.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/aggregator/tests/aggregator_test.info b/modules/aggregator/tests/aggregator_test.info index e6d5a0a..d0d7f09 100644 --- a/modules/aggregator/tests/aggregator_test.info +++ b/modules/aggregator/tests/aggregator_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/block/block.info b/modules/block/block.info index 934bfde..c65e023 100644 --- a/modules/block/block.info +++ b/modules/block/block.info @@ -6,8 +6,7 @@ core = 7.x files[] = block.test configure = admin/structure/block -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/block/tests/block_test.info b/modules/block/tests/block_test.info index d7e2220..04d117b 100644 --- a/modules/block/tests/block_test.info +++ b/modules/block/tests/block_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/block/tests/themes/block_test_theme/block_test_theme.info b/modules/block/tests/themes/block_test_theme/block_test_theme.info index 31b4382..f1983a4 100644 --- a/modules/block/tests/themes/block_test_theme/block_test_theme.info +++ b/modules/block/tests/themes/block_test_theme/block_test_theme.info @@ -13,8 +13,7 @@ regions[footer] = Footer regions[highlighted] = Highlighted regions[help] = Help -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/blog/blog.info b/modules/blog/blog.info index 84ad946..ba12e29 100644 --- a/modules/blog/blog.info +++ b/modules/blog/blog.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = blog.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/book/book.info b/modules/book/book.info index 53e454b..b241366 100644 --- a/modules/book/book.info +++ b/modules/book/book.info @@ -7,8 +7,7 @@ files[] = book.test configure = admin/content/book/settings stylesheets[all][] = book.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/color/color.info b/modules/color/color.info index 0d17ce1..f3c14ea 100644 --- a/modules/color/color.info +++ b/modules/color/color.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = color.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/comment/comment.info b/modules/comment/comment.info index 5d5abbf..d00d467 100644 --- a/modules/comment/comment.info +++ b/modules/comment/comment.info @@ -9,8 +9,7 @@ files[] = comment.test configure = admin/content/comment stylesheets[all][] = comment.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/contact/contact.info b/modules/contact/contact.info index b365daf..99232a9 100644 --- a/modules/contact/contact.info +++ b/modules/contact/contact.info @@ -6,8 +6,7 @@ core = 7.x files[] = contact.test configure = admin/structure/contact -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/contextual/contextual.info b/modules/contextual/contextual.info index ba47a4c..e7f7218 100644 --- a/modules/contextual/contextual.info +++ b/modules/contextual/contextual.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = contextual.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/dashboard/dashboard.info b/modules/dashboard/dashboard.info index d6e9866..f83f5f8 100644 --- a/modules/dashboard/dashboard.info +++ b/modules/dashboard/dashboard.info @@ -7,8 +7,7 @@ files[] = dashboard.test dependencies[] = block configure = admin/dashboard/customize -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/dblog/dblog.info b/modules/dblog/dblog.info index cb85f81..5c90843 100644 --- a/modules/dblog/dblog.info +++ b/modules/dblog/dblog.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = dblog.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/field/field.info b/modules/field/field.info index e05108e..93d560a 100644 --- a/modules/field/field.info +++ b/modules/field/field.info @@ -11,8 +11,7 @@ dependencies[] = field_sql_storage required = TRUE stylesheets[all][] = theme/field.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.info b/modules/field/modules/field_sql_storage/field_sql_storage.info index 0543461..d7e27be 100644 --- a/modules/field/modules/field_sql_storage/field_sql_storage.info +++ b/modules/field/modules/field_sql_storage/field_sql_storage.info @@ -7,8 +7,7 @@ dependencies[] = field files[] = field_sql_storage.test required = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/field/modules/list/list.info b/modules/field/modules/list/list.info index bef7e4a..1f2b787 100644 --- a/modules/field/modules/list/list.info +++ b/modules/field/modules/list/list.info @@ -7,8 +7,7 @@ dependencies[] = field dependencies[] = options files[] = tests/list.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/field/modules/list/tests/list_test.info b/modules/field/modules/list/tests/list_test.info index 2d4d6cc..561bd87 100644 --- a/modules/field/modules/list/tests/list_test.info +++ b/modules/field/modules/list/tests/list_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/field/modules/number/number.info b/modules/field/modules/number/number.info index c65d94a..6bd079c 100644 --- a/modules/field/modules/number/number.info +++ b/modules/field/modules/number/number.info @@ -6,8 +6,7 @@ core = 7.x dependencies[] = field files[] = number.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/field/modules/options/options.info b/modules/field/modules/options/options.info index 632ca24..add868e 100644 --- a/modules/field/modules/options/options.info +++ b/modules/field/modules/options/options.info @@ -6,8 +6,7 @@ core = 7.x dependencies[] = field files[] = options.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/field/modules/text/text.info b/modules/field/modules/text/text.info index fe93a35..22f2eff 100644 --- a/modules/field/modules/text/text.info +++ b/modules/field/modules/text/text.info @@ -7,8 +7,7 @@ dependencies[] = field files[] = text.test required = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/field/tests/field_test.info b/modules/field/tests/field_test.info index ce3c725..f37ab1b 100644 --- a/modules/field/tests/field_test.info +++ b/modules/field/tests/field_test.info @@ -6,8 +6,7 @@ files[] = field_test.entity.inc version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/field_ui/field_ui.info b/modules/field_ui/field_ui.info index a415ae9..77ada25 100644 --- a/modules/field_ui/field_ui.info +++ b/modules/field_ui/field_ui.info @@ -6,8 +6,7 @@ core = 7.x dependencies[] = field files[] = field_ui.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/file/file.info b/modules/file/file.info index 7269b4a..6717d66 100644 --- a/modules/file/file.info +++ b/modules/file/file.info @@ -6,8 +6,7 @@ core = 7.x dependencies[] = field files[] = tests/file.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/file/file.module b/modules/file/file.module index 1e98f11..eea5847 100644 --- a/modules/file/file.module +++ b/modules/file/file.module @@ -239,6 +239,9 @@ function file_ajax_upload() { $form_parents = func_get_args(); $form_build_id = (string) array_pop($form_parents); + // Sanitize form parents before using them. + $form_parents = array_filter($form_parents, 'element_child'); + if (empty($_POST['form_build_id']) || $form_build_id != $_POST['form_build_id']) { // Invalid request. drupal_set_message(t('An unrecoverable error occurred. The uploaded file likely exceeded the maximum file size (@size) that this server supports.', array('@size' => format_size(file_upload_max_size()))), 'error'); diff --git a/modules/file/tests/file_module_test.info b/modules/file/tests/file_module_test.info index 958bf66..e341779 100644 --- a/modules/file/tests/file_module_test.info +++ b/modules/file/tests/file_module_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/filter/filter.info b/modules/filter/filter.info index 4a46c85..c96213e 100644 --- a/modules/filter/filter.info +++ b/modules/filter/filter.info @@ -7,8 +7,7 @@ files[] = filter.test required = TRUE configure = admin/config/content/formats -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/forum/forum.info b/modules/forum/forum.info index d5b1c76..1d74702 100644 --- a/modules/forum/forum.info +++ b/modules/forum/forum.info @@ -9,8 +9,7 @@ files[] = forum.test configure = admin/structure/forum stylesheets[all][] = forum.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/help/help.info b/modules/help/help.info index 2c851ea..86a154f 100644 --- a/modules/help/help.info +++ b/modules/help/help.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = help.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/image/image.info b/modules/image/image.info index dd1200c..d6190e3 100644 --- a/modules/image/image.info +++ b/modules/image/image.info @@ -7,8 +7,7 @@ dependencies[] = file files[] = image.test configure = admin/config/media/image-styles -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/image/tests/image_module_test.info b/modules/image/tests/image_module_test.info index c6b3a6a..5182a09 100644 --- a/modules/image/tests/image_module_test.info +++ b/modules/image/tests/image_module_test.info @@ -6,8 +6,7 @@ core = 7.x files[] = image_module_test.module hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/locale/locale.info b/modules/locale/locale.info index 674d1f5..8a7c1da 100644 --- a/modules/locale/locale.info +++ b/modules/locale/locale.info @@ -6,8 +6,7 @@ core = 7.x files[] = locale.test configure = admin/config/regional/language -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/locale/tests/locale_test.info b/modules/locale/tests/locale_test.info index 49da5e5..76a18f7 100644 --- a/modules/locale/tests/locale_test.info +++ b/modules/locale/tests/locale_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/menu/menu.info b/modules/menu/menu.info index 9b7ef57..26163ee 100644 --- a/modules/menu/menu.info +++ b/modules/menu/menu.info @@ -6,8 +6,7 @@ core = 7.x files[] = menu.test configure = admin/structure/menu -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/node/node.info b/modules/node/node.info index 11ae2cd..778e11b 100644 --- a/modules/node/node.info +++ b/modules/node/node.info @@ -9,8 +9,7 @@ required = TRUE configure = admin/structure/types stylesheets[all][] = node.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/node/tests/node_access_test.info b/modules/node/tests/node_access_test.info index 0079290..4f6966c 100644 --- a/modules/node/tests/node_access_test.info +++ b/modules/node/tests/node_access_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/node/tests/node_test.info b/modules/node/tests/node_test.info index f56e2e5..a36f6c7 100644 --- a/modules/node/tests/node_test.info +++ b/modules/node/tests/node_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/node/tests/node_test_exception.info b/modules/node/tests/node_test_exception.info index a4c1185..a0aac90 100644 --- a/modules/node/tests/node_test_exception.info +++ b/modules/node/tests/node_test_exception.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/openid/openid.info b/modules/openid/openid.info index 69d2663..85714e1 100644 --- a/modules/openid/openid.info +++ b/modules/openid/openid.info @@ -5,8 +5,7 @@ package = Core core = 7.x files[] = openid.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/openid/tests/openid_test.info b/modules/openid/tests/openid_test.info index 7186198..9cdea74 100644 --- a/modules/openid/tests/openid_test.info +++ b/modules/openid/tests/openid_test.info @@ -6,8 +6,7 @@ core = 7.x dependencies[] = openid hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/overlay/overlay.info b/modules/overlay/overlay.info index 1bf7e9e..dd760b7 100644 --- a/modules/overlay/overlay.info +++ b/modules/overlay/overlay.info @@ -4,8 +4,7 @@ package = Core version = VERSION core = 7.x -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/path/path.info b/modules/path/path.info index b5b0eb9..404b8ee 100644 --- a/modules/path/path.info +++ b/modules/path/path.info @@ -6,8 +6,7 @@ core = 7.x files[] = path.test configure = admin/config/search/path -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/php/php.info b/modules/php/php.info index 236f931..9d211b0 100644 --- a/modules/php/php.info +++ b/modules/php/php.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = php.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/poll/poll.info b/modules/poll/poll.info index eeed31d..2b4f199 100644 --- a/modules/poll/poll.info +++ b/modules/poll/poll.info @@ -6,8 +6,7 @@ core = 7.x files[] = poll.test stylesheets[all][] = poll.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/profile/profile.info b/modules/profile/profile.info index 1480c61..ef52e3a 100644 --- a/modules/profile/profile.info +++ b/modules/profile/profile.info @@ -11,8 +11,7 @@ configure = admin/config/people/profile ; See user_system_info_alter(). hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/rdf/rdf.info b/modules/rdf/rdf.info index 18e6297..5964486 100644 --- a/modules/rdf/rdf.info +++ b/modules/rdf/rdf.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x files[] = rdf.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/rdf/tests/rdf_test.info b/modules/rdf/tests/rdf_test.info index a302a7b..df9e829 100644 --- a/modules/rdf/tests/rdf_test.info +++ b/modules/rdf/tests/rdf_test.info @@ -6,8 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = blog -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/search/search.info b/modules/search/search.info index 248f476..87336e5 100644 --- a/modules/search/search.info +++ b/modules/search/search.info @@ -8,8 +8,7 @@ files[] = search.test configure = admin/config/search/settings stylesheets[all][] = search.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/search/tests/search_embedded_form.info b/modules/search/tests/search_embedded_form.info index 7e1b736..d037a82 100644 --- a/modules/search/tests/search_embedded_form.info +++ b/modules/search/tests/search_embedded_form.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/search/tests/search_extra_type.info b/modules/search/tests/search_extra_type.info index 534edad..cc8f2bf 100644 --- a/modules/search/tests/search_extra_type.info +++ b/modules/search/tests/search_extra_type.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/search/tests/search_node_tags.info b/modules/search/tests/search_node_tags.info index 1643898..b3964b3 100644 --- a/modules/search/tests/search_node_tags.info +++ b/modules/search/tests/search_node_tags.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/shortcut/shortcut.info b/modules/shortcut/shortcut.info index c490374..cfe7f4a 100644 --- a/modules/shortcut/shortcut.info +++ b/modules/shortcut/shortcut.info @@ -6,8 +6,7 @@ core = 7.x files[] = shortcut.test configure = admin/config/user-interface/shortcut -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/simpletest.info b/modules/simpletest/simpletest.info index 26b3485..67234c5 100644 --- a/modules/simpletest/simpletest.info +++ b/modules/simpletest/simpletest.info @@ -57,8 +57,7 @@ files[] = tests/upgrade/update.trigger.test files[] = tests/upgrade/update.field.test files[] = tests/upgrade/update.user.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/actions_loop_test.info b/modules/simpletest/tests/actions_loop_test.info index 2edf253..cc0cf53 100644 --- a/modules/simpletest/tests/actions_loop_test.info +++ b/modules/simpletest/tests/actions_loop_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/ajax_forms_test.info b/modules/simpletest/tests/ajax_forms_test.info index 9736647..574b882 100644 --- a/modules/simpletest/tests/ajax_forms_test.info +++ b/modules/simpletest/tests/ajax_forms_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/ajax_test.info b/modules/simpletest/tests/ajax_test.info index fe2f90b..8b6d24e 100644 --- a/modules/simpletest/tests/ajax_test.info +++ b/modules/simpletest/tests/ajax_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/batch_test.info b/modules/simpletest/tests/batch_test.info index a53e215..b090330 100644 --- a/modules/simpletest/tests/batch_test.info +++ b/modules/simpletest/tests/batch_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/boot_test_1.info b/modules/simpletest/tests/boot_test_1.info index 873825d..ec2a28a 100644 --- a/modules/simpletest/tests/boot_test_1.info +++ b/modules/simpletest/tests/boot_test_1.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/boot_test_2.info b/modules/simpletest/tests/boot_test_2.info index e8529ba..b944fef 100644 --- a/modules/simpletest/tests/boot_test_2.info +++ b/modules/simpletest/tests/boot_test_2.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/common_test.info b/modules/simpletest/tests/common_test.info index 8c56f80..c4ae99c 100644 --- a/modules/simpletest/tests/common_test.info +++ b/modules/simpletest/tests/common_test.info @@ -7,8 +7,7 @@ stylesheets[all][] = common_test.css stylesheets[print][] = common_test.print.css hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/common_test_cron_helper.info b/modules/simpletest/tests/common_test_cron_helper.info index bf8a729..dd5487d 100644 --- a/modules/simpletest/tests/common_test_cron_helper.info +++ b/modules/simpletest/tests/common_test_cron_helper.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/database_test.info b/modules/simpletest/tests/database_test.info index 3ff31ed..2707a7b 100644 --- a/modules/simpletest/tests/database_test.info +++ b/modules/simpletest/tests/database_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/drupal_autoload_test/drupal_autoload_test.info b/modules/simpletest/tests/drupal_autoload_test/drupal_autoload_test.info index b971535..1934fd4 100644 --- a/modules/simpletest/tests/drupal_autoload_test/drupal_autoload_test.info +++ b/modules/simpletest/tests/drupal_autoload_test/drupal_autoload_test.info @@ -7,8 +7,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info b/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info index f918fdc..d4826be 100644 --- a/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info +++ b/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info b/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info index 9edaf9f..f2a8cff 100644 --- a/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info +++ b/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/entity_cache_test.info b/modules/simpletest/tests/entity_cache_test.info index 212ce83..82f10db 100644 --- a/modules/simpletest/tests/entity_cache_test.info +++ b/modules/simpletest/tests/entity_cache_test.info @@ -6,8 +6,7 @@ core = 7.x dependencies[] = entity_cache_test_dependency hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/entity_cache_test_dependency.info b/modules/simpletest/tests/entity_cache_test_dependency.info index 5804987..b69b4a2 100644 --- a/modules/simpletest/tests/entity_cache_test_dependency.info +++ b/modules/simpletest/tests/entity_cache_test_dependency.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/entity_crud_hook_test.info b/modules/simpletest/tests/entity_crud_hook_test.info index 9f5f3ea..94f34b6 100644 --- a/modules/simpletest/tests/entity_crud_hook_test.info +++ b/modules/simpletest/tests/entity_crud_hook_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/entity_query_access_test.info b/modules/simpletest/tests/entity_query_access_test.info index 328e5d9..1c1bbf7 100644 --- a/modules/simpletest/tests/entity_query_access_test.info +++ b/modules/simpletest/tests/entity_query_access_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/error_test.info b/modules/simpletest/tests/error_test.info index bf6e044..f534291 100644 --- a/modules/simpletest/tests/error_test.info +++ b/modules/simpletest/tests/error_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/file_test.info b/modules/simpletest/tests/file_test.info index 3ceb3eb..da253a8 100644 --- a/modules/simpletest/tests/file_test.info +++ b/modules/simpletest/tests/file_test.info @@ -6,8 +6,7 @@ core = 7.x files[] = file_test.module hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/filter_test.info b/modules/simpletest/tests/filter_test.info index 96c6c4b..c660e01 100644 --- a/modules/simpletest/tests/filter_test.info +++ b/modules/simpletest/tests/filter_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/form_test.info b/modules/simpletest/tests/form_test.info index 7706be2..1c93e0d 100644 --- a/modules/simpletest/tests/form_test.info +++ b/modules/simpletest/tests/form_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/image_test.info b/modules/simpletest/tests/image_test.info index 82d2a3b..6605d3d 100644 --- a/modules/simpletest/tests/image_test.info +++ b/modules/simpletest/tests/image_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/menu_test.info b/modules/simpletest/tests/menu_test.info index 26d70dc..baa7b5a 100644 --- a/modules/simpletest/tests/menu_test.info +++ b/modules/simpletest/tests/menu_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/module_test.info b/modules/simpletest/tests/module_test.info index 1ebdd85..c916d5b 100644 --- a/modules/simpletest/tests/module_test.info +++ b/modules/simpletest/tests/module_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/path_test.info b/modules/simpletest/tests/path_test.info index 43ecd96..f30412a 100644 --- a/modules/simpletest/tests/path_test.info +++ b/modules/simpletest/tests/path_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/psr_0_test/psr_0_test.info b/modules/simpletest/tests/psr_0_test/psr_0_test.info index ca69f5c..deada7b 100644 --- a/modules/simpletest/tests/psr_0_test/psr_0_test.info +++ b/modules/simpletest/tests/psr_0_test/psr_0_test.info @@ -5,8 +5,7 @@ core = 7.x hidden = TRUE package = Testing -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/psr_4_test/psr_4_test.info b/modules/simpletest/tests/psr_4_test/psr_4_test.info index 75e5b0c..c2dde66 100644 --- a/modules/simpletest/tests/psr_4_test/psr_4_test.info +++ b/modules/simpletest/tests/psr_4_test/psr_4_test.info @@ -5,8 +5,7 @@ core = 7.x hidden = TRUE package = Testing -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/requirements1_test.info b/modules/simpletest/tests/requirements1_test.info index c5b3a60..3fca686 100644 --- a/modules/simpletest/tests/requirements1_test.info +++ b/modules/simpletest/tests/requirements1_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/requirements2_test.info b/modules/simpletest/tests/requirements2_test.info index b12197e..f09c28d 100644 --- a/modules/simpletest/tests/requirements2_test.info +++ b/modules/simpletest/tests/requirements2_test.info @@ -7,8 +7,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/session_test.info b/modules/simpletest/tests/session_test.info index 4987dea..5057671 100644 --- a/modules/simpletest/tests/session_test.info +++ b/modules/simpletest/tests/session_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/system_dependencies_test.info b/modules/simpletest/tests/system_dependencies_test.info index 4b03f29..4ab29b9 100644 --- a/modules/simpletest/tests/system_dependencies_test.info +++ b/modules/simpletest/tests/system_dependencies_test.info @@ -6,8 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = _missing_dependency -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info b/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info index cb2749e..f088990 100644 --- a/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info +++ b/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info @@ -6,8 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = system_incompatible_core_version_test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/system_incompatible_core_version_test.info b/modules/simpletest/tests/system_incompatible_core_version_test.info index 338521f..6e64ea5 100644 --- a/modules/simpletest/tests/system_incompatible_core_version_test.info +++ b/modules/simpletest/tests/system_incompatible_core_version_test.info @@ -5,8 +5,7 @@ version = VERSION core = 5.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info b/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info index edf6dd1..f2428bb 100644 --- a/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info +++ b/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info @@ -7,8 +7,7 @@ hidden = TRUE ; system_incompatible_module_version_test declares version 1.0 dependencies[] = system_incompatible_module_version_test (>2.0) -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/system_incompatible_module_version_test.info b/modules/simpletest/tests/system_incompatible_module_version_test.info index 51f3efc..148170a 100644 --- a/modules/simpletest/tests/system_incompatible_module_version_test.info +++ b/modules/simpletest/tests/system_incompatible_module_version_test.info @@ -5,8 +5,7 @@ version = 1.0 core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/system_project_namespace_test.info b/modules/simpletest/tests/system_project_namespace_test.info index 1507739..a6a2340 100644 --- a/modules/simpletest/tests/system_project_namespace_test.info +++ b/modules/simpletest/tests/system_project_namespace_test.info @@ -6,8 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = drupal:filter -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/system_test.info b/modules/simpletest/tests/system_test.info index 4b6175b..8f06e41 100644 --- a/modules/simpletest/tests/system_test.info +++ b/modules/simpletest/tests/system_test.info @@ -6,8 +6,7 @@ core = 7.x files[] = system_test.module hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/taxonomy_test.info b/modules/simpletest/tests/taxonomy_test.info index 3ccf229..14d51a8 100644 --- a/modules/simpletest/tests/taxonomy_test.info +++ b/modules/simpletest/tests/taxonomy_test.info @@ -6,8 +6,7 @@ core = 7.x hidden = TRUE dependencies[] = taxonomy -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/theme_test.info b/modules/simpletest/tests/theme_test.info index f5cb1ea..ee68377 100644 --- a/modules/simpletest/tests/theme_test.info +++ b/modules/simpletest/tests/theme_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info b/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info index ed247b7..718830f 100644 --- a/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info +++ b/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info @@ -6,8 +6,7 @@ hidden = TRUE settings[basetheme_only] = base theme value settings[subtheme_override] = base theme value -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info b/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info index dfd8bd8..17b6fd1 100644 --- a/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info +++ b/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info @@ -6,8 +6,7 @@ hidden = TRUE settings[subtheme_override] = subtheme value -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/themes/test_theme/test_theme.info b/modules/simpletest/tests/themes/test_theme/test_theme.info index c132c91..b57bc12 100644 --- a/modules/simpletest/tests/themes/test_theme/test_theme.info +++ b/modules/simpletest/tests/themes/test_theme/test_theme.info @@ -17,8 +17,7 @@ stylesheets[all][] = system.base.css settings[theme_test_setting] = default value -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/themes/test_theme_nyan_cat/test_theme_nyan_cat.info b/modules/simpletest/tests/themes/test_theme_nyan_cat/test_theme_nyan_cat.info index a4f5649..29a66bc 100644 --- a/modules/simpletest/tests/themes/test_theme_nyan_cat/test_theme_nyan_cat.info +++ b/modules/simpletest/tests/themes/test_theme_nyan_cat/test_theme_nyan_cat.info @@ -4,8 +4,7 @@ core = 7.x hidden = TRUE engine = nyan_cat -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/update_script_test.info b/modules/simpletest/tests/update_script_test.info index f3bfc50..a84f716 100644 --- a/modules/simpletest/tests/update_script_test.info +++ b/modules/simpletest/tests/update_script_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/update_test_1.info b/modules/simpletest/tests/update_test_1.info index a7431d5..c9d4661 100644 --- a/modules/simpletest/tests/update_test_1.info +++ b/modules/simpletest/tests/update_test_1.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/update_test_2.info b/modules/simpletest/tests/update_test_2.info index a7431d5..c9d4661 100644 --- a/modules/simpletest/tests/update_test_2.info +++ b/modules/simpletest/tests/update_test_2.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/update_test_3.info b/modules/simpletest/tests/update_test_3.info index a7431d5..c9d4661 100644 --- a/modules/simpletest/tests/update_test_3.info +++ b/modules/simpletest/tests/update_test_3.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/url_alter_test.info b/modules/simpletest/tests/url_alter_test.info index 23676af..98436f8 100644 --- a/modules/simpletest/tests/url_alter_test.info +++ b/modules/simpletest/tests/url_alter_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/simpletest/tests/xmlrpc_test.info b/modules/simpletest/tests/xmlrpc_test.info index ab787cc..f0a21cc 100644 --- a/modules/simpletest/tests/xmlrpc_test.info +++ b/modules/simpletest/tests/xmlrpc_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/statistics/statistics.info b/modules/statistics/statistics.info index 26c1794..5d13982 100644 --- a/modules/statistics/statistics.info +++ b/modules/statistics/statistics.info @@ -6,8 +6,7 @@ core = 7.x files[] = statistics.test configure = admin/config/system/statistics -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/syslog/syslog.info b/modules/syslog/syslog.info index 3f8b6ca..5e1aae5 100644 --- a/modules/syslog/syslog.info +++ b/modules/syslog/syslog.info @@ -6,8 +6,7 @@ core = 7.x files[] = syslog.test configure = admin/config/development/logging -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/system/system.info b/modules/system/system.info index da08a99..7914ef2 100644 --- a/modules/system/system.info +++ b/modules/system/system.info @@ -12,8 +12,7 @@ files[] = system.test required = TRUE configure = admin/config/system -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/system/tests/cron_queue_test.info b/modules/system/tests/cron_queue_test.info index 86d9e08..f054896 100644 --- a/modules/system/tests/cron_queue_test.info +++ b/modules/system/tests/cron_queue_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/system/tests/system_cron_test.info b/modules/system/tests/system_cron_test.info index 662c7c4..ea9c711 100644 --- a/modules/system/tests/system_cron_test.info +++ b/modules/system/tests/system_cron_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/taxonomy/taxonomy.info b/modules/taxonomy/taxonomy.info index 1f2fec8..d931595 100644 --- a/modules/taxonomy/taxonomy.info +++ b/modules/taxonomy/taxonomy.info @@ -8,8 +8,7 @@ files[] = taxonomy.module files[] = taxonomy.test configure = admin/structure/taxonomy -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/toolbar/toolbar.info b/modules/toolbar/toolbar.info index f025761..9ec3839 100644 --- a/modules/toolbar/toolbar.info +++ b/modules/toolbar/toolbar.info @@ -4,8 +4,7 @@ core = 7.x package = Core version = VERSION -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/tracker/tracker.info b/modules/tracker/tracker.info index d7cb61b..568a4e1 100644 --- a/modules/tracker/tracker.info +++ b/modules/tracker/tracker.info @@ -6,8 +6,7 @@ version = VERSION core = 7.x files[] = tracker.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/translation/tests/translation_test.info b/modules/translation/tests/translation_test.info index 9b597a0..5e5620f 100644 --- a/modules/translation/tests/translation_test.info +++ b/modules/translation/tests/translation_test.info @@ -5,8 +5,7 @@ package = Testing version = VERSION hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/translation/translation.info b/modules/translation/translation.info index 3e6513f..c6e7477 100644 --- a/modules/translation/translation.info +++ b/modules/translation/translation.info @@ -6,8 +6,7 @@ version = VERSION core = 7.x files[] = translation.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/trigger/tests/trigger_test.info b/modules/trigger/tests/trigger_test.info index 13e0698..8486e1f 100644 --- a/modules/trigger/tests/trigger_test.info +++ b/modules/trigger/tests/trigger_test.info @@ -4,8 +4,7 @@ package = Testing core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/trigger/trigger.info b/modules/trigger/trigger.info index 4c21ba8..0a6efeb 100644 --- a/modules/trigger/trigger.info +++ b/modules/trigger/trigger.info @@ -6,8 +6,7 @@ core = 7.x files[] = trigger.test configure = admin/structure/trigger -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/update/tests/aaa_update_test.info b/modules/update/tests/aaa_update_test.info index 96ac28a..1542255 100644 --- a/modules/update/tests/aaa_update_test.info +++ b/modules/update/tests/aaa_update_test.info @@ -4,8 +4,7 @@ package = Testing core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/update/tests/bbb_update_test.info b/modules/update/tests/bbb_update_test.info index 954fb75..3efd663 100644 --- a/modules/update/tests/bbb_update_test.info +++ b/modules/update/tests/bbb_update_test.info @@ -4,8 +4,7 @@ package = Testing core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/update/tests/ccc_update_test.info b/modules/update/tests/ccc_update_test.info index f3b7d04..9387a03 100644 --- a/modules/update/tests/ccc_update_test.info +++ b/modules/update/tests/ccc_update_test.info @@ -4,8 +4,7 @@ package = Testing core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/update/tests/themes/update_test_admintheme/update_test_admintheme.info b/modules/update/tests/themes/update_test_admintheme/update_test_admintheme.info index d21dd9c..2b1e2b9 100644 --- a/modules/update/tests/themes/update_test_admintheme/update_test_admintheme.info +++ b/modules/update/tests/themes/update_test_admintheme/update_test_admintheme.info @@ -3,8 +3,7 @@ description = Test theme which is used as admin theme. core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info b/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info index 07eb50f..1f361db 100644 --- a/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info +++ b/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info @@ -3,8 +3,7 @@ description = Test theme which acts as a base theme for other test subthemes. core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info b/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info index 26b480c..81428d2 100644 --- a/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info +++ b/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info @@ -4,8 +4,7 @@ core = 7.x base theme = update_test_basetheme hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/update/tests/update_test.info b/modules/update/tests/update_test.info index 7b42bc2..b989a75 100644 --- a/modules/update/tests/update_test.info +++ b/modules/update/tests/update_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/update/update.info b/modules/update/update.info index 4d9c369..2ec8ee7 100644 --- a/modules/update/update.info +++ b/modules/update/update.info @@ -6,8 +6,7 @@ core = 7.x files[] = update.test configure = admin/reports/updates/settings -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/user/tests/user_form_test.info b/modules/user/tests/user_form_test.info index 17ce34a..b275c35 100644 --- a/modules/user/tests/user_form_test.info +++ b/modules/user/tests/user_form_test.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/modules/user/user.info b/modules/user/user.info index 83e2b8e..331ad59 100644 --- a/modules/user/user.info +++ b/modules/user/user.info @@ -9,8 +9,7 @@ required = TRUE configure = admin/config/people stylesheets[all][] = user.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/profiles/minimal/minimal.info b/profiles/minimal/minimal.info index 1b363ab..933068c 100644 --- a/profiles/minimal/minimal.info +++ b/profiles/minimal/minimal.info @@ -5,8 +5,7 @@ core = 7.x dependencies[] = block dependencies[] = dblog -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/profiles/standard/standard.info b/profiles/standard/standard.info index a3fd9e2..b56253d 100644 --- a/profiles/standard/standard.info +++ b/profiles/standard/standard.info @@ -24,8 +24,7 @@ dependencies[] = field_ui dependencies[] = file dependencies[] = rdf -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info b/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info index 7a11e32..995e283 100644 --- a/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info +++ b/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info @@ -6,8 +6,7 @@ core = 7.x hidden = TRUE files[] = drupal_system_listing_compatible_test.test -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info b/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info index d2bd947..45d3659 100644 --- a/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info +++ b/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info @@ -8,8 +8,7 @@ version = VERSION core = 6.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/profiles/testing/testing.info b/profiles/testing/testing.info index e9fec6d..0b2a332 100644 --- a/profiles/testing/testing.info +++ b/profiles/testing/testing.info @@ -4,8 +4,7 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/sites/all/libraries/less.php/Cache.php b/sites/all/libraries/less.php/Cache.php new file mode 100644 index 0000000..e4023ef --- /dev/null +++ b/sites/all/libraries/less.php/Cache.php @@ -0,0 +1,316 @@ + '/'); + } + + + // generate name for compiled css file + $hash = md5(json_encode($less_files)); + $list_file = Less_Cache::$cache_dir . Less_Cache::$prefix . $hash . '.list'; + + + // check cached content + if( !isset($parser_options['use_cache']) || $parser_options['use_cache'] === true ){ + if( file_exists($list_file) ){ + + self::ListFiles($list_file, $list, $cached_name); + $compiled_name = self::CompiledName($list); + + // if $cached_name != $compiled_name, we know we need to recompile + if( !$cached_name || $cached_name === $compiled_name ){ + + $output_file = self::OutputFile($compiled_name, $parser_options ); + + if( $output_file && file_exists($output_file) ){ + @touch($list_file); + return basename($output_file); // for backwards compatibility, we just return the name of the file + } + } + } + } + + $compiled = self::Cache( $less_files, $parser_options ); + if( !$compiled ){ + return false; + } + + $compiled_name = self::CompiledName( $less_files ); + $output_file = self::OutputFile($compiled_name, $parser_options ); + + + //save the file list + $list = $less_files; + $list[] = $compiled_name; + $cache = implode("\n",$list); + file_put_contents( $list_file, $cache ); + + + //save the css + file_put_contents( $output_file, $compiled ); + + + //clean up + self::CleanCache(); + + return basename($output_file); + } + + /** + * Force the compiler to regenerate the cached css file + * + * @param array $less_files Array of .less files to compile + * @param array $parser_options Array of compiler options + * @param array $modify_vars Array of variables + * @return string Name of the css file + */ + public static function Regen( $less_files, $parser_options = array(), $modify_vars = array() ){ + $parser_options['use_cache'] = false; + return self::Get( $less_files, $parser_options, $modify_vars ); + } + + public static function Cache( &$less_files, $parser_options = array() ){ + + + // get less.php if it exists + $file = dirname(__FILE__) . '/Less.php'; + if( file_exists($file) && !class_exists('Less_Parser') ){ + require_once($file); + } + + $parser_options['cache_dir'] = Less_Cache::$cache_dir; + $parser = new Less_Parser($parser_options); + + + // combine files + foreach($less_files as $file_path => $uri_or_less ){ + + //treat as less markup if there are newline characters + if( strpos($uri_or_less,"\n") !== false ){ + $parser->Parse( $uri_or_less ); + continue; + } + + $parser->ParseFile( $file_path, $uri_or_less ); + } + + $compiled = $parser->getCss(); + + + $less_files = $parser->allParsedFiles(); + + return $compiled; + } + + + private static function OutputFile( $compiled_name, $parser_options ){ + + //custom output file + if( !empty($parser_options['output']) ){ + + //relative to cache directory? + if( preg_match('#[\\\\/]#',$parser_options['output']) ){ + return $parser_options['output']; + } + + return Less_Cache::$cache_dir.$parser_options['output']; + } + + return Less_Cache::$cache_dir.$compiled_name; + } + + + private static function CompiledName( $files ){ + + //save the file list + $temp = array(Less_Version::cache_version); + foreach($files as $file){ + $temp[] = filemtime($file)."\t".filesize($file)."\t".$file; + } + + return Less_Cache::$prefix.sha1(json_encode($temp)).'.css'; + } + + + public static function SetCacheDir( $dir ){ + Less_Cache::$cache_dir = $dir; + } + + public static function CheckCacheDir(){ + + Less_Cache::$cache_dir = str_replace('\\','/',Less_Cache::$cache_dir); + Less_Cache::$cache_dir = rtrim(Less_Cache::$cache_dir,'/').'/'; + + if( !file_exists(Less_Cache::$cache_dir) ){ + if( !mkdir(Less_Cache::$cache_dir) ){ + throw new Less_Exception_Parser('Less.php cache directory couldn\'t be created: '.Less_Cache::$cache_dir); + } + + }elseif( !is_dir(Less_Cache::$cache_dir) ){ + throw new Less_Exception_Parser('Less.php cache directory doesn\'t exist: '.Less_Cache::$cache_dir); + + }elseif( !is_writable(Less_Cache::$cache_dir) ){ + throw new Less_Exception_Parser('Less.php cache directory isn\'t writable: '.Less_Cache::$cache_dir); + + } + + } + + + /** + * Delete unused less.php files + * + */ + public static function CleanCache(){ + static $clean = false; + + if( $clean ){ + return; + } + + $files = scandir(Less_Cache::$cache_dir); + if( $files ){ + $check_time = time() - self::$gc_lifetime; + foreach($files as $file){ + + // don't delete if the file wasn't created with less.php + if( strpos($file,Less_Cache::$prefix) !== 0 ){ + continue; + } + + $full_path = Less_Cache::$cache_dir.'/'.$file; + + // make sure the file still exists + // css files may have already been deleted + if( !file_exists($full_path) ){ + continue; + } + $mtime = filemtime($full_path); + + // don't delete if it's a relatively new file + if( $mtime > $check_time ){ + continue; + } + + $parts = explode('.',$file); + $type = array_pop($parts); + + + // delete css files based on the list files + if( $type === 'css' ){ + continue; + } + + + // delete the list file and associated css file + if( $type === 'list' ){ + self::ListFiles($full_path, $list, $css_file_name); + if( $css_file_name ){ + $css_file = Less_Cache::$cache_dir.'/'.$css_file_name; + if( file_exists($css_file) ){ + unlink($css_file); + } + } + } + + unlink($full_path); + } + } + + $clean = true; + } + + + /** + * Get the list of less files and generated css file from a list file + * + */ + static function ListFiles($list_file, &$list, &$css_file_name ){ + + $list = explode("\n",file_get_contents($list_file)); + + //pop the cached name that should match $compiled_name + $css_file_name = array_pop($list); + + if( !preg_match('/^' . Less_Cache::$prefix . '[a-f0-9]+\.css$/',$css_file_name) ){ + $list[] = $css_file_name; + $css_file_name = false; + } + + } + +} \ No newline at end of file diff --git a/sites/all/libraries/less.php/Less.php b/sites/all/libraries/less.php/Less.php new file mode 100644 index 0000000..f22145e --- /dev/null +++ b/sites/all/libraries/less.php/Less.php @@ -0,0 +1,10311 @@ + false, // option - whether to compress + 'strictUnits' => false, // whether units need to evaluate correctly + 'strictMath' => false, // whether math has to be within parenthesis + 'relativeUrls' => true, // option - whether to adjust URL's to be relative + 'urlArgs' => array(), // whether to add args into url tokens + 'numPrecision' => 8, + + 'import_dirs' => array(), + 'import_callback' => null, + 'cache_dir' => null, + 'cache_method' => 'php', // false, 'serialize', 'php', 'var_export', 'callback'; + 'cache_callback_get' => null, + 'cache_callback_set' => null, + + 'sourceMap' => false, // whether to output a source map + 'sourceMapBasepath' => null, + 'sourceMapWriteTo' => null, + 'sourceMapURL' => null, + + 'plugins' => array(), + + ); + + public static $options = array(); + + + private $input; // Less input string + private $input_len; // input string length + private $pos; // current index in `input` + private $saveStack = array(); // holds state for backtracking + private $furthest; + + /** + * @var Less_Environment + */ + private $env; + + private $rules = array(); + + private static $imports = array(); + + public static $has_extends = false; + + public static $next_id = 0; + + /** + * Filename to contents of all parsed the files + * + * @var array + */ + public static $contentsMap = array(); + + + /** + * @param Less_Environment|array|null $env + */ + public function __construct( $env = null ){ + + // Top parser on an import tree must be sure there is one "env" + // which will then be passed around by reference. + if( $env instanceof Less_Environment ){ + $this->env = $env; + }else{ + $this->SetOptions(Less_Parser::$default_options); + $this->Reset( $env ); + } + + } + + + /** + * Reset the parser state completely + * + */ + public function Reset( $options = null ){ + $this->rules = array(); + self::$imports = array(); + self::$has_extends = false; + self::$imports = array(); + self::$contentsMap = array(); + + $this->env = new Less_Environment($options); + $this->env->Init(); + + //set new options + if( is_array($options) ){ + $this->SetOptions(Less_Parser::$default_options); + $this->SetOptions($options); + } + } + + /** + * Set one or more compiler options + * options: import_dirs, cache_dir, cache_method + * + */ + public function SetOptions( $options ){ + foreach($options as $option => $value){ + $this->SetOption($option,$value); + } + } + + /** + * Set one compiler option + * + */ + public function SetOption($option,$value){ + + switch($option){ + + case 'import_dirs': + $this->SetImportDirs($value); + return; + + case 'cache_dir': + if( is_string($value) ){ + Less_Cache::SetCacheDir($value); + Less_Cache::CheckCacheDir(); + } + return; + } + + Less_Parser::$options[$option] = $value; + } + + /** + * Registers a new custom function + * + * @param string $name function name + * @param callable $callback callback + */ + public function registerFunction($name, $callback) { + $this->env->functions[$name] = $callback; + } + + /** + * Removed an already registered function + * + * @param string $name function name + */ + public function unregisterFunction($name) { + if( isset($this->env->functions[$name]) ) + unset($this->env->functions[$name]); + } + + + /** + * Get the current css buffer + * + * @return string + */ + public function getCss(){ + + $precision = ini_get('precision'); + @ini_set('precision',16); + $locale = setlocale(LC_NUMERIC, 0); + setlocale(LC_NUMERIC, "C"); + + try { + + $root = new Less_Tree_Ruleset(array(), $this->rules ); + $root->root = true; + $root->firstRoot = true; + + + $this->PreVisitors($root); + + self::$has_extends = false; + $evaldRoot = $root->compile($this->env); + + + + $this->PostVisitors($evaldRoot); + + if( Less_Parser::$options['sourceMap'] ){ + $generator = new Less_SourceMap_Generator($evaldRoot, Less_Parser::$contentsMap, Less_Parser::$options ); + // will also save file + // FIXME: should happen somewhere else? + $css = $generator->generateCSS(); + }else{ + $css = $evaldRoot->toCSS(); + } + + if( Less_Parser::$options['compress'] ){ + $css = preg_replace('/(^(\s)+)|((\s)+$)/', '', $css); + } + + } catch (Exception $exc) { + // Intentional fall-through so we can reset environment + } + + //reset php settings + @ini_set('precision',$precision); + setlocale(LC_NUMERIC, $locale); + + // Rethrow exception after we handled resetting the environment + if (!empty($exc)) { + throw $exc; + } + + return $css; + } + + /** + * Run pre-compile visitors + * + */ + private function PreVisitors($root){ + + if( Less_Parser::$options['plugins'] ){ + foreach(Less_Parser::$options['plugins'] as $plugin){ + if( !empty($plugin->isPreEvalVisitor) ){ + $plugin->run($root); + } + } + } + } + + + /** + * Run post-compile visitors + * + */ + private function PostVisitors($evaldRoot){ + + $visitors = array(); + $visitors[] = new Less_Visitor_joinSelector(); + if( self::$has_extends ){ + $visitors[] = new Less_Visitor_processExtends(); + } + $visitors[] = new Less_Visitor_toCSS(); + + + if( Less_Parser::$options['plugins'] ){ + foreach(Less_Parser::$options['plugins'] as $plugin){ + if( property_exists($plugin,'isPreEvalVisitor') && $plugin->isPreEvalVisitor ){ + continue; + } + + if( property_exists($plugin,'isPreVisitor') && $plugin->isPreVisitor ){ + array_unshift( $visitors, $plugin); + }else{ + $visitors[] = $plugin; + } + } + } + + + for($i = 0; $i < count($visitors); $i++ ){ + $visitors[$i]->run($evaldRoot); + } + + } + + + /** + * Parse a Less string into css + * + * @param string $str The string to convert + * @param string $uri_root The url of the file + * @return Less_Tree_Ruleset|Less_Parser + */ + public function parse( $str, $file_uri = null ){ + + if( !$file_uri ){ + $uri_root = ''; + $filename = 'anonymous-file-'.Less_Parser::$next_id++.'.less'; + }else{ + $file_uri = self::WinPath($file_uri); + $filename = basename($file_uri); + $uri_root = dirname($file_uri); + } + + $previousFileInfo = $this->env->currentFileInfo; + $uri_root = self::WinPath($uri_root); + $this->SetFileInfo($filename, $uri_root); + + $this->input = $str; + $this->_parse(); + + if( $previousFileInfo ){ + $this->env->currentFileInfo = $previousFileInfo; + } + + return $this; + } + + + /** + * Parse a Less string from a given file + * + * @throws Less_Exception_Parser + * @param string $filename The file to parse + * @param string $uri_root The url of the file + * @param bool $returnRoot Indicates whether the return value should be a css string a root node + * @return Less_Tree_Ruleset|Less_Parser + */ + public function parseFile( $filename, $uri_root = '', $returnRoot = false){ + + if( !file_exists($filename) ){ + $this->Error(sprintf('File `%s` not found.', $filename)); + } + + + // fix uri_root? + // Instead of The mixture of file path for the first argument and directory path for the second argument has bee + if( !$returnRoot && !empty($uri_root) && basename($uri_root) == basename($filename) ){ + $uri_root = dirname($uri_root); + } + + + $previousFileInfo = $this->env->currentFileInfo; + + + if( $filename ){ + $filename = self::WinPath(realpath($filename)); + } + $uri_root = self::WinPath($uri_root); + + $this->SetFileInfo($filename, $uri_root); + + self::AddParsedFile($filename); + + if( $returnRoot ){ + $rules = $this->GetRules( $filename ); + $return = new Less_Tree_Ruleset(array(), $rules ); + }else{ + $this->_parse( $filename ); + $return = $this; + } + + if( $previousFileInfo ){ + $this->env->currentFileInfo = $previousFileInfo; + } + + return $return; + } + + + /** + * Allows a user to set variables values + * @param array $vars + * @return Less_Parser + */ + public function ModifyVars( $vars ){ + + $this->input = Less_Parser::serializeVars( $vars ); + $this->_parse(); + + return $this; + } + + + /** + * @param string $filename + */ + public function SetFileInfo( $filename, $uri_root = ''){ + + $filename = Less_Environment::normalizePath($filename); + $dirname = preg_replace('/[^\/\\\\]*$/','',$filename); + + if( !empty($uri_root) ){ + $uri_root = rtrim($uri_root,'/').'/'; + } + + $currentFileInfo = array(); + + //entry info + if( isset($this->env->currentFileInfo) ){ + $currentFileInfo['entryPath'] = $this->env->currentFileInfo['entryPath']; + $currentFileInfo['entryUri'] = $this->env->currentFileInfo['entryUri']; + $currentFileInfo['rootpath'] = $this->env->currentFileInfo['rootpath']; + + }else{ + $currentFileInfo['entryPath'] = $dirname; + $currentFileInfo['entryUri'] = $uri_root; + $currentFileInfo['rootpath'] = $dirname; + } + + $currentFileInfo['currentDirectory'] = $dirname; + $currentFileInfo['currentUri'] = $uri_root.basename($filename); + $currentFileInfo['filename'] = $filename; + $currentFileInfo['uri_root'] = $uri_root; + + + //inherit reference + if( isset($this->env->currentFileInfo['reference']) && $this->env->currentFileInfo['reference'] ){ + $currentFileInfo['reference'] = true; + } + + $this->env->currentFileInfo = $currentFileInfo; + } + + + /** + * @deprecated 1.5.1.2 + * + */ + public function SetCacheDir( $dir ){ + + if( !file_exists($dir) ){ + if( mkdir($dir) ){ + return true; + } + throw new Less_Exception_Parser('Less.php cache directory couldn\'t be created: '.$dir); + + }elseif( !is_dir($dir) ){ + throw new Less_Exception_Parser('Less.php cache directory doesn\'t exist: '.$dir); + + }elseif( !is_writable($dir) ){ + throw new Less_Exception_Parser('Less.php cache directory isn\'t writable: '.$dir); + + }else{ + $dir = self::WinPath($dir); + Less_Cache::$cache_dir = rtrim($dir,'/').'/'; + return true; + } + } + + + /** + * Set a list of directories or callbacks the parser should use for determining import paths + * + * @param array $dirs + */ + public function SetImportDirs( $dirs ){ + Less_Parser::$options['import_dirs'] = array(); + + foreach($dirs as $path => $uri_root){ + + $path = self::WinPath($path); + if( !empty($path) ){ + $path = rtrim($path,'/').'/'; + } + + if ( !is_callable($uri_root) ){ + $uri_root = self::WinPath($uri_root); + if( !empty($uri_root) ){ + $uri_root = rtrim($uri_root,'/').'/'; + } + } + + Less_Parser::$options['import_dirs'][$path] = $uri_root; + } + } + + /** + * @param string $file_path + */ + private function _parse( $file_path = null ){ + if (ini_get("mbstring.func_overload")) { + $mb_internal_encoding = ini_get("mbstring.internal_encoding"); + @ini_set("mbstring.internal_encoding", "ascii"); + } + + $this->rules = array_merge($this->rules, $this->GetRules( $file_path )); + + //reset php settings + if (isset($mb_internal_encoding)) { + @ini_set("mbstring.internal_encoding", $mb_internal_encoding); + } + } + + + /** + * Return the results of parsePrimary for $file_path + * Use cache and save cached results if possible + * + * @param string|null $file_path + */ + private function GetRules( $file_path ){ + + $this->SetInput($file_path); + + $cache_file = $this->CacheFile( $file_path ); + if( $cache_file ){ + if( Less_Parser::$options['cache_method'] == 'callback' ){ + if( is_callable(Less_Parser::$options['cache_callback_get']) ){ + $cache = call_user_func_array( + Less_Parser::$options['cache_callback_get'], + array($this, $file_path, $cache_file) + ); + + if( $cache ){ + $this->UnsetInput(); + return $cache; + } + } + + }elseif( file_exists($cache_file) ){ + switch(Less_Parser::$options['cache_method']){ + + // Using serialize + // Faster but uses more memory + case 'serialize': + $cache = unserialize(file_get_contents($cache_file)); + if( $cache ){ + touch($cache_file); + $this->UnsetInput(); + return $cache; + } + break; + + + // Using generated php code + case 'var_export': + case 'php': + $this->UnsetInput(); + return include($cache_file); + } + } + } + + $rules = $this->parsePrimary(); + + if( $this->pos < $this->input_len ){ + throw new Less_Exception_Chunk($this->input, null, $this->furthest, $this->env->currentFileInfo); + } + + $this->UnsetInput(); + + + //save the cache + if( $cache_file ){ + if( Less_Parser::$options['cache_method'] == 'callback' ){ + if( is_callable(Less_Parser::$options['cache_callback_set']) ){ + call_user_func_array( + Less_Parser::$options['cache_callback_set'], + array($this, $file_path, $cache_file, $rules) + ); + } + + }else{ + //msg('write cache file'); + switch(Less_Parser::$options['cache_method']){ + case 'serialize': + file_put_contents( $cache_file, serialize($rules) ); + break; + case 'php': + file_put_contents( $cache_file, '' ); + break; + case 'var_export': + //Requires __set_state() + file_put_contents( $cache_file, '' ); + break; + } + + Less_Cache::CleanCache(); + } + } + + return $rules; + } + + + /** + * Set up the input buffer + * + */ + public function SetInput( $file_path ){ + + if( $file_path ){ + $this->input = file_get_contents( $file_path ); + } + + $this->pos = $this->furthest = 0; + + // Remove potential UTF Byte Order Mark + $this->input = preg_replace('/\\G\xEF\xBB\xBF/', '', $this->input); + $this->input_len = strlen($this->input); + + + if( Less_Parser::$options['sourceMap'] && $this->env->currentFileInfo ){ + $uri = $this->env->currentFileInfo['currentUri']; + Less_Parser::$contentsMap[$uri] = $this->input; + } + + } + + + /** + * Free up some memory + * + */ + public function UnsetInput(){ + unset($this->input, $this->pos, $this->input_len, $this->furthest); + $this->saveStack = array(); + } + + + public function CacheFile( $file_path ){ + + if( $file_path && $this->CacheEnabled() ){ + + $env = get_object_vars($this->env); + unset($env['frames']); + + $parts = array(); + $parts[] = $file_path; + $parts[] = filesize( $file_path ); + $parts[] = filemtime( $file_path ); + $parts[] = $env; + $parts[] = Less_Version::cache_version; + $parts[] = Less_Parser::$options['cache_method']; + return Less_Cache::$cache_dir . Less_Cache::$prefix . base_convert( sha1(json_encode($parts) ), 16, 36) . '.lesscache'; + } + } + + + static function AddParsedFile($file){ + self::$imports[] = $file; + } + + static function AllParsedFiles(){ + return self::$imports; + } + + /** + * @param string $file + */ + static function FileParsed($file){ + return in_array($file,self::$imports); + } + + + function save() { + $this->saveStack[] = $this->pos; + } + + private function restore() { + $this->pos = array_pop($this->saveStack); + } + + private function forget(){ + array_pop($this->saveStack); + } + + + private function isWhitespace($offset = 0) { + return preg_match('/\s/',$this->input[ $this->pos + $offset]); + } + + /** + * Parse from a token, regexp or string, and move forward if match + * + * @param array $toks + * @return array + */ + private function match($toks){ + + // The match is confirmed, add the match length to `this::pos`, + // and consume any extra white-space characters (' ' || '\n') + // which come after that. The reason for this is that LeSS's + // grammar is mostly white-space insensitive. + // + + foreach($toks as $tok){ + + $char = $tok[0]; + + if( $char === '/' ){ + $match = $this->MatchReg($tok); + + if( $match ){ + return count($match) === 1 ? $match[0] : $match; + } + + }elseif( $char === '#' ){ + $match = $this->MatchChar($tok[1]); + + }else{ + // Non-terminal, match using a function call + $match = $this->$tok(); + + } + + if( $match ){ + return $match; + } + } + } + + /** + * @param string[] $toks + * + * @return string + */ + private function MatchFuncs($toks){ + + if( $this->pos < $this->input_len ){ + foreach($toks as $tok){ + $match = $this->$tok(); + if( $match ){ + return $match; + } + } + } + + } + + // Match a single character in the input, + private function MatchChar($tok){ + if( ($this->pos < $this->input_len) && ($this->input[$this->pos] === $tok) ){ + $this->skipWhitespace(1); + return $tok; + } + } + + // Match a regexp from the current start point + private function MatchReg($tok){ + + if( preg_match($tok, $this->input, $match, 0, $this->pos) ){ + $this->skipWhitespace(strlen($match[0])); + return $match; + } + } + + + /** + * Same as match(), but don't change the state of the parser, + * just return the match. + * + * @param string $tok + * @return integer + */ + public function PeekReg($tok){ + return preg_match($tok, $this->input, $match, 0, $this->pos); + } + + /** + * @param string $tok + */ + public function PeekChar($tok){ + //return ($this->input[$this->pos] === $tok ); + return ($this->pos < $this->input_len) && ($this->input[$this->pos] === $tok ); + } + + + /** + * @param integer $length + */ + public function skipWhitespace($length){ + + $this->pos += $length; + + for(; $this->pos < $this->input_len; $this->pos++ ){ + $c = $this->input[$this->pos]; + + if( ($c !== "\n") && ($c !== "\r") && ($c !== "\t") && ($c !== ' ') ){ + break; + } + } + } + + + /** + * @param string $tok + * @param string|null $msg + */ + public function expect($tok, $msg = NULL) { + $result = $this->match( array($tok) ); + if (!$result) { + $this->Error( $msg ? "Expected '" . $tok . "' got '" . $this->input[$this->pos] . "'" : $msg ); + } else { + return $result; + } + } + + /** + * @param string $tok + */ + public function expectChar($tok, $msg = null ){ + $result = $this->MatchChar($tok); + if( !$result ){ + $this->Error( $msg ? "Expected '" . $tok . "' got '" . $this->input[$this->pos] . "'" : $msg ); + }else{ + return $result; + } + } + + // + // Here in, the parsing rules/functions + // + // The basic structure of the syntax tree generated is as follows: + // + // Ruleset -> Rule -> Value -> Expression -> Entity + // + // Here's some LESS code: + // + // .class { + // color: #fff; + // border: 1px solid #000; + // width: @w + 4px; + // > .child {...} + // } + // + // And here's what the parse tree might look like: + // + // Ruleset (Selector '.class', [ + // Rule ("color", Value ([Expression [Color #fff]])) + // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) + // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) + // Ruleset (Selector [Element '>', '.child'], [...]) + // ]) + // + // In general, most rules will try to parse a token with the `$()` function, and if the return + // value is truly, will return a new node, of the relevant type. Sometimes, we need to check + // first, before parsing, that's when we use `peek()`. + // + + // + // The `primary` rule is the *entry* and *exit* point of the parser. + // The rules here can appear at any level of the parse tree. + // + // The recursive nature of the grammar is an interplay between the `block` + // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, + // as represented by this simplified grammar: + // + // primary → (ruleset | rule)+ + // ruleset → selector+ block + // block → '{' primary '}' + // + // Only at one point is the primary rule not called from the + // block rule: at the root level. + // + private function parsePrimary(){ + $root = array(); + + while( true ){ + + if( $this->pos >= $this->input_len ){ + break; + } + + $node = $this->parseExtend(true); + if( $node ){ + $root = array_merge($root,$node); + continue; + } + + //$node = $this->MatchFuncs( array( 'parseMixinDefinition', 'parseRule', 'parseRuleset', 'parseMixinCall', 'parseComment', 'parseDirective')); + $node = $this->MatchFuncs( array( 'parseMixinDefinition', 'parseNameValue', 'parseRule', 'parseRuleset', 'parseMixinCall', 'parseComment', 'parseRulesetCall', 'parseDirective')); + + if( $node ){ + $root[] = $node; + }elseif( !$this->MatchReg('/\\G[\s\n;]+/') ){ + break; + } + + if( $this->PeekChar('}') ){ + break; + } + } + + return $root; + } + + + + // We create a Comment node for CSS comments `/* */`, + // but keep the LeSS comments `//` silent, by just skipping + // over them. + private function parseComment(){ + + if( $this->input[$this->pos] !== '/' ){ + return; + } + + if( $this->input[$this->pos+1] === '/' ){ + $match = $this->MatchReg('/\\G\/\/.*/'); + return $this->NewObj4('Less_Tree_Comment',array($match[0], true, $this->pos, $this->env->currentFileInfo)); + } + + //$comment = $this->MatchReg('/\\G\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/'); + $comment = $this->MatchReg('/\\G\/\*(?s).*?\*+\/\n?/');//not the same as less.js to prevent fatal errors + if( $comment ){ + return $this->NewObj4('Less_Tree_Comment',array($comment[0], false, $this->pos, $this->env->currentFileInfo)); + } + } + + private function parseComments(){ + $comments = array(); + + while( $this->pos < $this->input_len ){ + $comment = $this->parseComment(); + if( !$comment ){ + break; + } + + $comments[] = $comment; + } + + return $comments; + } + + + + // + // A string, which supports escaping " and ' + // + // "milky way" 'he\'s the one!' + // + private function parseEntitiesQuoted() { + $j = $this->pos; + $e = false; + $index = $this->pos; + + if( $this->input[$this->pos] === '~' ){ + $j++; + $e = true; // Escaped strings + } + + if( $this->input[$j] != '"' && $this->input[$j] !== "'" ){ + return; + } + + if ($e) { + $this->MatchChar('~'); + } + + // Fix for #124: match escaped newlines + //$str = $this->MatchReg('/\\G"((?:[^"\\\\\r\n]|\\\\.)*)"|\'((?:[^\'\\\\\r\n]|\\\\.)*)\'/'); + $str = $this->MatchReg('/\\G"((?:[^"\\\\\r\n]|\\\\.|\\\\\r\n|\\\\[\n\r\f])*)"|\'((?:[^\'\\\\\r\n]|\\\\.|\\\\\r\n|\\\\[\n\r\f])*)\'/'); + + if( $str ){ + $result = $str[0][0] == '"' ? $str[1] : $str[2]; + return $this->NewObj5('Less_Tree_Quoted',array($str[0], $result, $e, $index, $this->env->currentFileInfo) ); + } + return; + } + + + // + // A catch-all word, such as: + // + // black border-collapse + // + private function parseEntitiesKeyword(){ + + //$k = $this->MatchReg('/\\G[_A-Za-z-][_A-Za-z0-9-]*/'); + $k = $this->MatchReg('/\\G%|\\G[_A-Za-z-][_A-Za-z0-9-]*/'); + if( $k ){ + $k = $k[0]; + $color = $this->fromKeyword($k); + if( $color ){ + return $color; + } + return $this->NewObj1('Less_Tree_Keyword',$k); + } + } + + // duplicate of Less_Tree_Color::FromKeyword + private function FromKeyword( $keyword ){ + $keyword = strtolower($keyword); + + if( Less_Colors::hasOwnProperty($keyword) ){ + // detect named color + return $this->NewObj1('Less_Tree_Color',substr(Less_Colors::color($keyword), 1)); + } + + if( $keyword === 'transparent' ){ + return $this->NewObj3('Less_Tree_Color', array( array(0, 0, 0), 0, true)); + } + } + + // + // A function call + // + // rgb(255, 0, 255) + // + // We also try to catch IE's `alpha()`, but let the `alpha` parser + // deal with the details. + // + // The arguments are parsed with the `entities.arguments` parser. + // + private function parseEntitiesCall(){ + $index = $this->pos; + + if( !preg_match('/\\G([\w-]+|%|progid:[\w\.]+)\(/', $this->input, $name,0,$this->pos) ){ + return; + } + $name = $name[1]; + $nameLC = strtolower($name); + + if ($nameLC === 'url') { + return null; + } + + $this->pos += strlen($name); + + if( $nameLC === 'alpha' ){ + $alpha_ret = $this->parseAlpha(); + if( $alpha_ret ){ + return $alpha_ret; + } + } + + $this->MatchChar('('); // Parse the '(' and consume whitespace. + + $args = $this->parseEntitiesArguments(); + + if( !$this->MatchChar(')') ){ + return; + } + + if ($name) { + return $this->NewObj4('Less_Tree_Call',array($name, $args, $index, $this->env->currentFileInfo) ); + } + } + + /** + * Parse a list of arguments + * + * @return array + */ + private function parseEntitiesArguments(){ + + $args = array(); + while( true ){ + $arg = $this->MatchFuncs( array('parseEntitiesAssignment','parseExpression') ); + if( !$arg ){ + break; + } + + $args[] = $arg; + if( !$this->MatchChar(',') ){ + break; + } + } + return $args; + } + + private function parseEntitiesLiteral(){ + return $this->MatchFuncs( array('parseEntitiesDimension','parseEntitiesColor','parseEntitiesQuoted','parseUnicodeDescriptor') ); + } + + // Assignments are argument entities for calls. + // They are present in ie filter properties as shown below. + // + // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) + // + private function parseEntitiesAssignment() { + + $key = $this->MatchReg('/\\G\w+(?=\s?=)/'); + if( !$key ){ + return; + } + + if( !$this->MatchChar('=') ){ + return; + } + + $value = $this->parseEntity(); + if( $value ){ + return $this->NewObj2('Less_Tree_Assignment',array($key[0], $value)); + } + } + + // + // Parse url() tokens + // + // We use a specific rule for urls, because they don't really behave like + // standard function calls. The difference is that the argument doesn't have + // to be enclosed within a string, so it can't be parsed as an Expression. + // + private function parseEntitiesUrl(){ + + + if( $this->input[$this->pos] !== 'u' || !$this->matchReg('/\\Gurl\(/') ){ + return; + } + + $value = $this->match( array('parseEntitiesQuoted','parseEntitiesVariable','/\\Gdata\:.*?[^\)]+/','/\\G(?:(?:\\\\[\(\)\'"])|[^\(\)\'"])+/') ); + if( !$value ){ + $value = ''; + } + + + $this->expectChar(')'); + + + if( isset($value->value) || $value instanceof Less_Tree_Variable ){ + return $this->NewObj2('Less_Tree_Url',array($value, $this->env->currentFileInfo)); + } + + return $this->NewObj2('Less_Tree_Url', array( $this->NewObj1('Less_Tree_Anonymous',$value), $this->env->currentFileInfo) ); + } + + + // + // A Variable entity, such as `@fink`, in + // + // width: @fink + 2px + // + // We use a different parser for variable definitions, + // see `parsers.variable`. + // + private function parseEntitiesVariable(){ + $index = $this->pos; + if ($this->PeekChar('@') && ($name = $this->MatchReg('/\\G@@?[\w-]+/'))) { + return $this->NewObj3('Less_Tree_Variable', array( $name[0], $index, $this->env->currentFileInfo)); + } + } + + + // A variable entity useing the protective {} e.g. @{var} + private function parseEntitiesVariableCurly() { + $index = $this->pos; + + if( $this->input_len > ($this->pos+1) && $this->input[$this->pos] === '@' && ($curly = $this->MatchReg('/\\G@\{([\w-]+)\}/')) ){ + return $this->NewObj3('Less_Tree_Variable',array('@'.$curly[1], $index, $this->env->currentFileInfo)); + } + } + + // + // A Hexadecimal color + // + // #4F3C2F + // + // `rgb` and `hsl` colors are parsed through the `entities.call` parser. + // + private function parseEntitiesColor(){ + if ($this->PeekChar('#') && ($rgb = $this->MatchReg('/\\G#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/'))) { + return $this->NewObj1('Less_Tree_Color',$rgb[1]); + } + } + + // + // A Dimension, that is, a number and a unit + // + // 0.5em 95% + // + private function parseEntitiesDimension(){ + + $c = @ord($this->input[$this->pos]); + + //Is the first char of the dimension 0-9, '.', '+' or '-' + if (($c > 57 || $c < 43) || $c === 47 || $c == 44){ + return; + } + + $value = $this->MatchReg('/\\G([+-]?\d*\.?\d+)(%|[a-z]+)?/'); + if( $value ){ + + if( isset($value[2]) ){ + return $this->NewObj2('Less_Tree_Dimension', array($value[1],$value[2])); + } + return $this->NewObj1('Less_Tree_Dimension',$value[1]); + } + } + + + // + // A unicode descriptor, as is used in unicode-range + // + // U+0?? or U+00A1-00A9 + // + function parseUnicodeDescriptor() { + $ud = $this->MatchReg('/\\G(U\+[0-9a-fA-F?]+)(\-[0-9a-fA-F?]+)?/'); + if( $ud ){ + return $this->NewObj1('Less_Tree_UnicodeDescriptor', $ud[0]); + } + } + + + // + // JavaScript code to be evaluated + // + // `window.location.href` + // + private function parseEntitiesJavascript(){ + $e = false; + $j = $this->pos; + if( $this->input[$j] === '~' ){ + $j++; + $e = true; + } + if( $this->input[$j] !== '`' ){ + return; + } + if( $e ){ + $this->MatchChar('~'); + } + $str = $this->MatchReg('/\\G`([^`]*)`/'); + if( $str ){ + return $this->NewObj3('Less_Tree_Javascript', array($str[1], $this->pos, $e)); + } + } + + + // + // The variable part of a variable definition. Used in the `rule` parser + // + // @fink: + // + private function parseVariable(){ + if ($this->PeekChar('@') && ($name = $this->MatchReg('/\\G(@[\w-]+)\s*:/'))) { + return $name[1]; + } + } + + + // + // The variable part of a variable definition. Used in the `rule` parser + // + // @fink(); + // + private function parseRulesetCall(){ + + if( $this->input[$this->pos] === '@' && ($name = $this->MatchReg('/\\G(@[\w-]+)\s*\(\s*\)\s*;/')) ){ + return $this->NewObj1('Less_Tree_RulesetCall', $name[1] ); + } + } + + + // + // extend syntax - used to extend selectors + // + function parseExtend($isRule = false){ + + $index = $this->pos; + $extendList = array(); + + + if( !$this->MatchReg( $isRule ? '/\\G&:extend\(/' : '/\\G:extend\(/' ) ){ return; } + + do{ + $option = null; + $elements = array(); + while( true ){ + $option = $this->MatchReg('/\\G(all)(?=\s*(\)|,))/'); + if( $option ){ break; } + $e = $this->parseElement(); + if( !$e ){ break; } + $elements[] = $e; + } + + if( $option ){ + $option = $option[1]; + } + + $extendList[] = $this->NewObj3('Less_Tree_Extend', array( $this->NewObj1('Less_Tree_Selector',$elements), $option, $index )); + + }while( $this->MatchChar(",") ); + + $this->expect('/\\G\)/'); + + if( $isRule ){ + $this->expect('/\\G;/'); + } + + return $extendList; + } + + + // + // A Mixin call, with an optional argument list + // + // #mixins > .square(#fff); + // .rounded(4px, black); + // .button; + // + // The `while` loop is there because mixins can be + // namespaced, but we only support the child and descendant + // selector for now. + // + private function parseMixinCall(){ + + $char = $this->input[$this->pos]; + if( $char !== '.' && $char !== '#' ){ + return; + } + + $index = $this->pos; + $this->save(); // stop us absorbing part of an invalid selector + + $elements = $this->parseMixinCallElements(); + + if( $elements ){ + + if( $this->MatchChar('(') ){ + $returned = $this->parseMixinArgs(true); + $args = $returned['args']; + $this->expectChar(')'); + }else{ + $args = array(); + } + + $important = $this->parseImportant(); + + if( $this->parseEnd() ){ + $this->forget(); + return $this->NewObj5('Less_Tree_Mixin_Call', array( $elements, $args, $index, $this->env->currentFileInfo, $important)); + } + } + + $this->restore(); + } + + + private function parseMixinCallElements(){ + $elements = array(); + $c = null; + + while( true ){ + $elemIndex = $this->pos; + $e = $this->MatchReg('/\\G[#.](?:[\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/'); + if( !$e ){ + break; + } + $elements[] = $this->NewObj4('Less_Tree_Element', array($c, $e[0], $elemIndex, $this->env->currentFileInfo)); + $c = $this->MatchChar('>'); + } + + return $elements; + } + + + + /** + * @param boolean $isCall + */ + private function parseMixinArgs( $isCall ){ + $expressions = array(); + $argsSemiColon = array(); + $isSemiColonSeperated = null; + $argsComma = array(); + $expressionContainsNamed = null; + $name = null; + $returner = array('args'=>array(), 'variadic'=> false); + + $this->save(); + + while( true ){ + if( $isCall ){ + $arg = $this->MatchFuncs( array( 'parseDetachedRuleset','parseExpression' ) ); + } else { + $this->parseComments(); + if( $this->input[ $this->pos ] === '.' && $this->MatchReg('/\\G\.{3}/') ){ + $returner['variadic'] = true; + if( $this->MatchChar(";") && !$isSemiColonSeperated ){ + $isSemiColonSeperated = true; + } + + if( $isSemiColonSeperated ){ + $argsSemiColon[] = array('variadic'=>true); + }else{ + $argsComma[] = array('variadic'=>true); + } + break; + } + $arg = $this->MatchFuncs( array('parseEntitiesVariable','parseEntitiesLiteral','parseEntitiesKeyword') ); + } + + if( !$arg ){ + break; + } + + + $nameLoop = null; + if( $arg instanceof Less_Tree_Expression ){ + $arg->throwAwayComments(); + } + $value = $arg; + $val = null; + + if( $isCall ){ + // Variable + if( property_exists($arg,'value') && count($arg->value) == 1 ){ + $val = $arg->value[0]; + } + } else { + $val = $arg; + } + + + if( $val instanceof Less_Tree_Variable ){ + + if( $this->MatchChar(':') ){ + if( $expressions ){ + if( $isSemiColonSeperated ){ + $this->Error('Cannot mix ; and , as delimiter types'); + } + $expressionContainsNamed = true; + } + + // we do not support setting a ruleset as a default variable - it doesn't make sense + // However if we do want to add it, there is nothing blocking it, just don't error + // and remove isCall dependency below + $value = null; + if( $isCall ){ + $value = $this->parseDetachedRuleset(); + } + if( !$value ){ + $value = $this->parseExpression(); + } + + if( !$value ){ + if( $isCall ){ + $this->Error('could not understand value for named argument'); + } else { + $this->restore(); + $returner['args'] = array(); + return $returner; + } + } + + $nameLoop = ($name = $val->name); + }elseif( !$isCall && $this->MatchReg('/\\G\.{3}/') ){ + $returner['variadic'] = true; + if( $this->MatchChar(";") && !$isSemiColonSeperated ){ + $isSemiColonSeperated = true; + } + if( $isSemiColonSeperated ){ + $argsSemiColon[] = array('name'=> $arg->name, 'variadic' => true); + }else{ + $argsComma[] = array('name'=> $arg->name, 'variadic' => true); + } + break; + }elseif( !$isCall ){ + $name = $nameLoop = $val->name; + $value = null; + } + } + + if( $value ){ + $expressions[] = $value; + } + + $argsComma[] = array('name'=>$nameLoop, 'value'=>$value ); + + if( $this->MatchChar(',') ){ + continue; + } + + if( $this->MatchChar(';') || $isSemiColonSeperated ){ + + if( $expressionContainsNamed ){ + $this->Error('Cannot mix ; and , as delimiter types'); + } + + $isSemiColonSeperated = true; + + if( count($expressions) > 1 ){ + $value = $this->NewObj1('Less_Tree_Value', $expressions); + } + $argsSemiColon[] = array('name'=>$name, 'value'=>$value ); + + $name = null; + $expressions = array(); + $expressionContainsNamed = false; + } + } + + $this->forget(); + $returner['args'] = ($isSemiColonSeperated ? $argsSemiColon : $argsComma); + return $returner; + } + + + + // + // A Mixin definition, with a list of parameters + // + // .rounded (@radius: 2px, @color) { + // ... + // } + // + // Until we have a finer grained state-machine, we have to + // do a look-ahead, to make sure we don't have a mixin call. + // See the `rule` function for more information. + // + // We start by matching `.rounded (`, and then proceed on to + // the argument list, which has optional default values. + // We store the parameters in `params`, with a `value` key, + // if there is a value, such as in the case of `@radius`. + // + // Once we've got our params list, and a closing `)`, we parse + // the `{...}` block. + // + private function parseMixinDefinition(){ + $cond = null; + + $char = $this->input[$this->pos]; + if( ($char !== '.' && $char !== '#') || ($char === '{' && $this->PeekReg('/\\G[^{]*\}/')) ){ + return; + } + + $this->save(); + + $match = $this->MatchReg('/\\G([#.](?:[\w-]|\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/'); + if( $match ){ + $name = $match[1]; + + $argInfo = $this->parseMixinArgs( false ); + $params = $argInfo['args']; + $variadic = $argInfo['variadic']; + + + // .mixincall("@{a}"); + // looks a bit like a mixin definition.. + // also + // .mixincall(@a: {rule: set;}); + // so we have to be nice and restore + if( !$this->MatchChar(')') ){ + $this->furthest = $this->pos; + $this->restore(); + return; + } + + + $this->parseComments(); + + if ($this->MatchReg('/\\Gwhen/')) { // Guard + $cond = $this->expect('parseConditions', 'Expected conditions'); + } + + $ruleset = $this->parseBlock(); + + if( is_array($ruleset) ){ + $this->forget(); + return $this->NewObj5('Less_Tree_Mixin_Definition', array( $name, $params, $ruleset, $cond, $variadic)); + } + + $this->restore(); + }else{ + $this->forget(); + } + } + + // + // Entities are the smallest recognized token, + // and can be found inside a rule's value. + // + private function parseEntity(){ + + return $this->MatchFuncs( array('parseEntitiesLiteral','parseEntitiesVariable','parseEntitiesUrl','parseEntitiesCall','parseEntitiesKeyword','parseEntitiesJavascript','parseComment') ); + } + + // + // A Rule terminator. Note that we use `peek()` to check for '}', + // because the `block` rule will be expecting it, but we still need to make sure + // it's there, if ';' was ommitted. + // + private function parseEnd(){ + return $this->MatchChar(';') || $this->PeekChar('}'); + } + + // + // IE's alpha function + // + // alpha(opacity=88) + // + private function parseAlpha(){ + + if ( ! $this->MatchReg('/\\G\(opacity=/i')) { + return; + } + + $value = $this->MatchReg('/\\G[0-9]+/'); + if( $value ){ + $value = $value[0]; + }else{ + $value = $this->parseEntitiesVariable(); + if( !$value ){ + return; + } + } + + $this->expectChar(')'); + return $this->NewObj1('Less_Tree_Alpha',$value); + } + + + // + // A Selector Element + // + // div + // + h1 + // #socks + // input[type="text"] + // + // Elements are the building blocks for Selectors, + // they are made out of a `Combinator` (see combinator rule), + // and an element name, such as a tag a class, or `*`. + // + private function parseElement(){ + $c = $this->parseCombinator(); + $index = $this->pos; + + $e = $this->match( array('/\\G(?:\d+\.\d+|\d+)%/', '/\\G(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/', + '#*', '#&', 'parseAttribute', '/\\G\([^()@]+\)/', '/\\G[\.#](?=@)/', 'parseEntitiesVariableCurly') ); + + if( is_null($e) ){ + $this->save(); + if( $this->MatchChar('(') ){ + if( ($v = $this->parseSelector()) && $this->MatchChar(')') ){ + $e = $this->NewObj1('Less_Tree_Paren',$v); + $this->forget(); + }else{ + $this->restore(); + } + }else{ + $this->forget(); + } + } + + if( !is_null($e) ){ + return $this->NewObj4('Less_Tree_Element',array( $c, $e, $index, $this->env->currentFileInfo)); + } + } + + // + // Combinators combine elements together, in a Selector. + // + // Because our parser isn't white-space sensitive, special care + // has to be taken, when parsing the descendant combinator, ` `, + // as it's an empty space. We have to check the previous character + // in the input, to see if it's a ` ` character. + // + private function parseCombinator(){ + if( $this->pos < $this->input_len ){ + $c = $this->input[$this->pos]; + if ($c === '>' || $c === '+' || $c === '~' || $c === '|' || $c === '^' ){ + + $this->pos++; + if( $this->input[$this->pos] === '^' ){ + $c = '^^'; + $this->pos++; + } + + $this->skipWhitespace(0); + + return $c; + } + + if( $this->pos > 0 && $this->isWhitespace(-1) ){ + return ' '; + } + } + } + + // + // A CSS selector (see selector below) + // with less extensions e.g. the ability to extend and guard + // + private function parseLessSelector(){ + return $this->parseSelector(true); + } + + // + // A CSS Selector + // + // .class > div + h1 + // li a:hover + // + // Selectors are made out of one or more Elements, see above. + // + private function parseSelector( $isLess = false ){ + $elements = array(); + $extendList = array(); + $condition = null; + $when = false; + $extend = false; + $e = null; + $c = null; + $index = $this->pos; + + while( ($isLess && ($extend = $this->parseExtend())) || ($isLess && ($when = $this->MatchReg('/\\Gwhen/') )) || ($e = $this->parseElement()) ){ + if( $when ){ + $condition = $this->expect('parseConditions', 'expected condition'); + }elseif( $condition ){ + //error("CSS guard can only be used at the end of selector"); + }elseif( $extend ){ + $extendList = array_merge($extendList,$extend); + }else{ + //if( count($extendList) ){ + //error("Extend can only be used at the end of selector"); + //} + if( $this->pos < $this->input_len ){ + $c = $this->input[ $this->pos ]; + } + $elements[] = $e; + $e = null; + } + + if( $c === '{' || $c === '}' || $c === ';' || $c === ',' || $c === ')') { break; } + } + + if( $elements ){ + return $this->NewObj5('Less_Tree_Selector',array($elements, $extendList, $condition, $index, $this->env->currentFileInfo)); + } + if( $extendList ) { + $this->Error('Extend must be used to extend a selector, it cannot be used on its own'); + } + } + + private function parseTag(){ + return ( $tag = $this->MatchReg('/\\G[A-Za-z][A-Za-z-]*[0-9]?/') ) ? $tag : $this->MatchChar('*'); + } + + private function parseAttribute(){ + + $val = null; + + if( !$this->MatchChar('[') ){ + return; + } + + $key = $this->parseEntitiesVariableCurly(); + if( !$key ){ + $key = $this->expect('/\\G(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\\\.)+/'); + } + + $op = $this->MatchReg('/\\G[|~*$^]?=/'); + if( $op ){ + $val = $this->match( array('parseEntitiesQuoted','/\\G[0-9]+%/','/\\G[\w-]+/','parseEntitiesVariableCurly') ); + } + + $this->expectChar(']'); + + return $this->NewObj3('Less_Tree_Attribute',array( $key, $op[0], $val)); + } + + // + // The `block` rule is used by `ruleset` and `mixin.definition`. + // It's a wrapper around the `primary` rule, with added `{}`. + // + private function parseBlock(){ + if( $this->MatchChar('{') ){ + $content = $this->parsePrimary(); + if( $this->MatchChar('}') ){ + return $content; + } + } + } + + private function parseBlockRuleset(){ + $block = $this->parseBlock(); + + if( $block ){ + $block = $this->NewObj2('Less_Tree_Ruleset',array( null, $block)); + } + + return $block; + } + + private function parseDetachedRuleset(){ + $blockRuleset = $this->parseBlockRuleset(); + if( $blockRuleset ){ + return $this->NewObj1('Less_Tree_DetachedRuleset',$blockRuleset); + } + } + + // + // div, .class, body > p {...} + // + private function parseRuleset(){ + $selectors = array(); + + $this->save(); + + while( true ){ + $s = $this->parseLessSelector(); + if( !$s ){ + break; + } + $selectors[] = $s; + $this->parseComments(); + + if( $s->condition && count($selectors) > 1 ){ + $this->Error('Guards are only currently allowed on a single selector.'); + } + + if( !$this->MatchChar(',') ){ + break; + } + if( $s->condition ){ + $this->Error('Guards are only currently allowed on a single selector.'); + } + $this->parseComments(); + } + + + if( $selectors ){ + $rules = $this->parseBlock(); + if( is_array($rules) ){ + $this->forget(); + return $this->NewObj2('Less_Tree_Ruleset',array( $selectors, $rules)); //Less_Environment::$strictImports + } + } + + // Backtrack + $this->furthest = $this->pos; + $this->restore(); + } + + /** + * Custom less.php parse function for finding simple name-value css pairs + * ex: width:100px; + * + */ + private function parseNameValue(){ + + $index = $this->pos; + $this->save(); + + + //$match = $this->MatchReg('/\\G([a-zA-Z\-]+)\s*:\s*((?:\'")?[a-zA-Z0-9\-% \.,!]+?(?:\'")?)\s*([;}])/'); + $match = $this->MatchReg('/\\G([a-zA-Z\-]+)\s*:\s*([\'"]?[#a-zA-Z0-9\-%\.,]+?[\'"]?) *(! *important)?\s*([;}])/'); + if( $match ){ + + if( $match[4] == '}' ){ + $this->pos = $index + strlen($match[0])-1; + } + + if( $match[3] ){ + $match[2] .= ' !important'; + } + + return $this->NewObj4('Less_Tree_NameValue',array( $match[1], $match[2], $index, $this->env->currentFileInfo)); + } + + $this->restore(); + } + + + private function parseRule( $tryAnonymous = null ){ + + $merge = false; + $startOfRule = $this->pos; + + $c = $this->input[$this->pos]; + if( $c === '.' || $c === '#' || $c === '&' ){ + return; + } + + $this->save(); + $name = $this->MatchFuncs( array('parseVariable','parseRuleProperty')); + + if( $name ){ + + $isVariable = is_string($name); + + $value = null; + if( $isVariable ){ + $value = $this->parseDetachedRuleset(); + } + + $important = null; + if( !$value ){ + + // prefer to try to parse first if its a variable or we are compressing + // but always fallback on the other one + //if( !$tryAnonymous && is_string($name) && $name[0] === '@' ){ + if( !$tryAnonymous && (Less_Parser::$options['compress'] || $isVariable) ){ + $value = $this->MatchFuncs( array('parseValue','parseAnonymousValue')); + }else{ + $value = $this->MatchFuncs( array('parseAnonymousValue','parseValue')); + } + + $important = $this->parseImportant(); + + // a name returned by this.ruleProperty() is always an array of the form: + // [string-1, ..., string-n, ""] or [string-1, ..., string-n, "+"] + // where each item is a tree.Keyword or tree.Variable + if( !$isVariable && is_array($name) ){ + $nm = array_pop($name); + if( $nm->value ){ + $merge = $nm->value; + } + } + } + + + if( $value && $this->parseEnd() ){ + $this->forget(); + return $this->NewObj6('Less_Tree_Rule',array( $name, $value, $important, $merge, $startOfRule, $this->env->currentFileInfo)); + }else{ + $this->furthest = $this->pos; + $this->restore(); + if( $value && !$tryAnonymous ){ + return $this->parseRule(true); + } + } + }else{ + $this->forget(); + } + } + + function parseAnonymousValue(){ + + if( preg_match('/\\G([^@+\/\'"*`(;{}-]*);/',$this->input, $match, 0, $this->pos) ){ + $this->pos += strlen($match[1]); + return $this->NewObj1('Less_Tree_Anonymous',$match[1]); + } + } + + // + // An @import directive + // + // @import "lib"; + // + // Depending on our environment, importing is done differently: + // In the browser, it's an XHR request, in Node, it would be a + // file-system operation. The function used for importing is + // stored in `import`, which we pass to the Import constructor. + // + private function parseImport(){ + + $this->save(); + + $dir = $this->MatchReg('/\\G@import?\s+/'); + + if( $dir ){ + $options = $this->parseImportOptions(); + $path = $this->MatchFuncs( array('parseEntitiesQuoted','parseEntitiesUrl')); + + if( $path ){ + $features = $this->parseMediaFeatures(); + if( $this->MatchChar(';') ){ + if( $features ){ + $features = $this->NewObj1('Less_Tree_Value',$features); + } + + $this->forget(); + return $this->NewObj5('Less_Tree_Import',array( $path, $features, $options, $this->pos, $this->env->currentFileInfo)); + } + } + } + + $this->restore(); + } + + private function parseImportOptions(){ + + $options = array(); + + // list of options, surrounded by parens + if( !$this->MatchChar('(') ){ + return $options; + } + do{ + $optionName = $this->parseImportOption(); + if( $optionName ){ + $value = true; + switch( $optionName ){ + case "css": + $optionName = "less"; + $value = false; + break; + case "once": + $optionName = "multiple"; + $value = false; + break; + } + $options[$optionName] = $value; + if( !$this->MatchChar(',') ){ break; } + } + }while( $optionName ); + $this->expectChar(')'); + return $options; + } + + private function parseImportOption(){ + $opt = $this->MatchReg('/\\G(less|css|multiple|once|inline|reference)/'); + if( $opt ){ + return $opt[1]; + } + } + + private function parseMediaFeature() { + $nodes = array(); + + do{ + $e = $this->MatchFuncs(array('parseEntitiesKeyword','parseEntitiesVariable')); + if( $e ){ + $nodes[] = $e; + } elseif ($this->MatchChar('(')) { + $p = $this->parseProperty(); + $e = $this->parseValue(); + if ($this->MatchChar(')')) { + if ($p && $e) { + $r = $this->NewObj7('Less_Tree_Rule', array( $p, $e, null, null, $this->pos, $this->env->currentFileInfo, true)); + $nodes[] = $this->NewObj1('Less_Tree_Paren',$r); + } elseif ($e) { + $nodes[] = $this->NewObj1('Less_Tree_Paren',$e); + } else { + return null; + } + } else + return null; + } + } while ($e); + + if ($nodes) { + return $this->NewObj1('Less_Tree_Expression',$nodes); + } + } + + private function parseMediaFeatures() { + $features = array(); + + do{ + $e = $this->parseMediaFeature(); + if( $e ){ + $features[] = $e; + if (!$this->MatchChar(',')) break; + }else{ + $e = $this->parseEntitiesVariable(); + if( $e ){ + $features[] = $e; + if (!$this->MatchChar(',')) break; + } + } + } while ($e); + + return $features ? $features : null; + } + + private function parseMedia() { + if( $this->MatchReg('/\\G@media/') ){ + $features = $this->parseMediaFeatures(); + $rules = $this->parseBlock(); + + if( is_array($rules) ){ + return $this->NewObj4('Less_Tree_Media',array( $rules, $features, $this->pos, $this->env->currentFileInfo)); + } + } + } + + + // + // A CSS Directive + // + // @charset "utf-8"; + // + private function parseDirective(){ + + if( !$this->PeekChar('@') ){ + return; + } + + $rules = null; + $index = $this->pos; + $hasBlock = true; + $hasIdentifier = false; + $hasExpression = false; + $hasUnknown = false; + + + $value = $this->MatchFuncs(array('parseImport','parseMedia')); + if( $value ){ + return $value; + } + + $this->save(); + + $name = $this->MatchReg('/\\G@[a-z-]+/'); + + if( !$name ) return; + $name = $name[0]; + + + $nonVendorSpecificName = $name; + $pos = strpos($name,'-', 2); + if( $name[1] == '-' && $pos > 0 ){ + $nonVendorSpecificName = "@" . substr($name, $pos + 1); + } + + + switch( $nonVendorSpecificName ){ + /* + case "@font-face": + case "@viewport": + case "@top-left": + case "@top-left-corner": + case "@top-center": + case "@top-right": + case "@top-right-corner": + case "@bottom-left": + case "@bottom-left-corner": + case "@bottom-center": + case "@bottom-right": + case "@bottom-right-corner": + case "@left-top": + case "@left-middle": + case "@left-bottom": + case "@right-top": + case "@right-middle": + case "@right-bottom": + hasBlock = true; + break; + */ + case "@charset": + $hasIdentifier = true; + $hasBlock = false; + break; + case "@namespace": + $hasExpression = true; + $hasBlock = false; + break; + case "@keyframes": + $hasIdentifier = true; + break; + case "@host": + case "@page": + case "@document": + case "@supports": + $hasUnknown = true; + break; + } + + if( $hasIdentifier ){ + $value = $this->parseEntity(); + if( !$value ){ + $this->error("expected " . $name . " identifier"); + } + } else if( $hasExpression ){ + $value = $this->parseExpression(); + if( !$value ){ + $this->error("expected " . $name. " expression"); + } + } else if ($hasUnknown) { + + $value = $this->MatchReg('/\\G[^{;]+/'); + if( $value ){ + $value = $this->NewObj1('Less_Tree_Anonymous',trim($value[0])); + } + } + + if( $hasBlock ){ + $rules = $this->parseBlockRuleset(); + } + + if( $rules || (!$hasBlock && $value && $this->MatchChar(';'))) { + $this->forget(); + return $this->NewObj5('Less_Tree_Directive',array($name, $value, $rules, $index, $this->env->currentFileInfo)); + } + + $this->restore(); + } + + + // + // A Value is a comma-delimited list of Expressions + // + // font-family: Baskerville, Georgia, serif; + // + // In a Rule, a Value represents everything after the `:`, + // and before the `;`. + // + private function parseValue(){ + $expressions = array(); + + do{ + $e = $this->parseExpression(); + if( $e ){ + $expressions[] = $e; + if (! $this->MatchChar(',')) { + break; + } + } + }while($e); + + if( $expressions ){ + return $this->NewObj1('Less_Tree_Value',$expressions); + } + } + + private function parseImportant (){ + if( $this->PeekChar('!') && $this->MatchReg('/\\G! *important/') ){ + return ' !important'; + } + } + + private function parseSub (){ + + if( $this->MatchChar('(') ){ + $a = $this->parseAddition(); + if( $a ){ + $this->expectChar(')'); + return $this->NewObj2('Less_Tree_Expression',array( array($a), true) ); //instead of $e->parens = true so the value is cached + } + } + } + + + /** + * Parses multiplication operation + * + * @return Less_Tree_Operation|null + */ + function parseMultiplication(){ + + $return = $m = $this->parseOperand(); + if( $return ){ + while( true ){ + + $isSpaced = $this->isWhitespace( -1 ); + + if( $this->PeekReg('/\\G\/[*\/]/') ){ + break; + } + + $op = $this->MatchChar('/'); + if( !$op ){ + $op = $this->MatchChar('*'); + if( !$op ){ + break; + } + } + + $a = $this->parseOperand(); + + if(!$a) { break; } + + $m->parensInOp = true; + $a->parensInOp = true; + $return = $this->NewObj3('Less_Tree_Operation',array( $op, array( $return, $a ), $isSpaced) ); + } + } + return $return; + + } + + + /** + * Parses an addition operation + * + * @return Less_Tree_Operation|null + */ + private function parseAddition (){ + + $return = $m = $this->parseMultiplication(); + if( $return ){ + while( true ){ + + $isSpaced = $this->isWhitespace( -1 ); + + $op = $this->MatchReg('/\\G[-+]\s+/'); + if( $op ){ + $op = $op[0]; + }else{ + if( !$isSpaced ){ + $op = $this->match(array('#+','#-')); + } + if( !$op ){ + break; + } + } + + $a = $this->parseMultiplication(); + if( !$a ){ + break; + } + + $m->parensInOp = true; + $a->parensInOp = true; + $return = $this->NewObj3('Less_Tree_Operation',array($op, array($return, $a), $isSpaced)); + } + } + + return $return; + } + + + /** + * Parses the conditions + * + * @return Less_Tree_Condition|null + */ + private function parseConditions() { + $index = $this->pos; + $return = $a = $this->parseCondition(); + if( $a ){ + while( true ){ + if( !$this->PeekReg('/\\G,\s*(not\s*)?\(/') || !$this->MatchChar(',') ){ + break; + } + $b = $this->parseCondition(); + if( !$b ){ + break; + } + + $return = $this->NewObj4('Less_Tree_Condition',array('or', $return, $b, $index)); + } + return $return; + } + } + + private function parseCondition() { + $index = $this->pos; + $negate = false; + $c = null; + + if ($this->MatchReg('/\\Gnot/')) $negate = true; + $this->expectChar('('); + $a = $this->MatchFuncs(array('parseAddition','parseEntitiesKeyword','parseEntitiesQuoted')); + + if( $a ){ + $op = $this->MatchReg('/\\G(?:>=|<=|=<|[<=>])/'); + if( $op ){ + $b = $this->MatchFuncs(array('parseAddition','parseEntitiesKeyword','parseEntitiesQuoted')); + if( $b ){ + $c = $this->NewObj5('Less_Tree_Condition',array($op[0], $a, $b, $index, $negate)); + } else { + $this->Error('Unexpected expression'); + } + } else { + $k = $this->NewObj1('Less_Tree_Keyword','true'); + $c = $this->NewObj5('Less_Tree_Condition',array('=', $a, $k, $index, $negate)); + } + $this->expectChar(')'); + return $this->MatchReg('/\\Gand/') ? $this->NewObj3('Less_Tree_Condition',array('and', $c, $this->parseCondition())) : $c; + } + } + + /** + * An operand is anything that can be part of an operation, + * such as a Color, or a Variable + * + */ + private function parseOperand (){ + + $negate = false; + $offset = $this->pos+1; + if( $offset >= $this->input_len ){ + return; + } + $char = $this->input[$offset]; + if( $char === '@' || $char === '(' ){ + $negate = $this->MatchChar('-'); + } + + $o = $this->MatchFuncs(array('parseSub','parseEntitiesDimension','parseEntitiesColor','parseEntitiesVariable','parseEntitiesCall')); + + if( $negate ){ + $o->parensInOp = true; + $o = $this->NewObj1('Less_Tree_Negative',$o); + } + + return $o; + } + + + /** + * Expressions either represent mathematical operations, + * or white-space delimited Entities. + * + * 1px solid black + * @var * 2 + * + * @return Less_Tree_Expression|null + */ + private function parseExpression (){ + $entities = array(); + + do{ + $e = $this->MatchFuncs(array('parseAddition','parseEntity')); + if( $e ){ + $entities[] = $e; + // operations do not allow keyword "/" dimension (e.g. small/20px) so we support that here + if( !$this->PeekReg('/\\G\/[\/*]/') ){ + $delim = $this->MatchChar('/'); + if( $delim ){ + $entities[] = $this->NewObj1('Less_Tree_Anonymous',$delim); + } + } + } + }while($e); + + if( $entities ){ + return $this->NewObj1('Less_Tree_Expression',$entities); + } + } + + + /** + * Parse a property + * eg: 'min-width', 'orientation', etc + * + * @return string + */ + private function parseProperty (){ + $name = $this->MatchReg('/\\G(\*?-?[_a-zA-Z0-9-]+)\s*:/'); + if( $name ){ + return $name[1]; + } + } + + + /** + * Parse a rule property + * eg: 'color', 'width', 'height', etc + * + * @return string + */ + private function parseRuleProperty(){ + $offset = $this->pos; + $name = array(); + $index = array(); + $length = 0; + + + $this->rulePropertyMatch('/\\G(\*?)/', $offset, $length, $index, $name ); + while( $this->rulePropertyMatch('/\\G((?:[\w-]+)|(?:@\{[\w-]+\}))/', $offset, $length, $index, $name )); // ! + + if( (count($name) > 1) && $this->rulePropertyMatch('/\\G\s*((?:\+_|\+)?)\s*:/', $offset, $length, $index, $name) ){ + // at last, we have the complete match now. move forward, + // convert name particles to tree objects and return: + $this->skipWhitespace($length); + + if( $name[0] === '' ){ + array_shift($name); + array_shift($index); + } + foreach($name as $k => $s ){ + if( !$s || $s[0] !== '@' ){ + $name[$k] = $this->NewObj1('Less_Tree_Keyword',$s); + }else{ + $name[$k] = $this->NewObj3('Less_Tree_Variable',array('@' . substr($s,2,-1), $index[$k], $this->env->currentFileInfo)); + } + } + return $name; + } + + + } + + private function rulePropertyMatch( $re, &$offset, &$length, &$index, &$name ){ + preg_match($re, $this->input, $a, 0, $offset); + if( $a ){ + $index[] = $this->pos + $length; + $length += strlen($a[0]); + $offset += strlen($a[0]); + $name[] = $a[1]; + return true; + } + } + + public static function serializeVars( $vars ){ + $s = ''; + + foreach($vars as $name => $value){ + $s .= (($name[0] === '@') ? '' : '@') . $name .': '. $value . ((substr($value,-1) === ';') ? '' : ';'); + } + + return $s; + } + + + /** + * Some versions of php have trouble with method_exists($a,$b) if $a is not an object + * + * @param string $b + */ + public static function is_method($a,$b){ + return is_object($a) && method_exists($a,$b); + } + + + /** + * Round numbers similarly to javascript + * eg: 1.499999 to 1 instead of 2 + * + */ + public static function round($i, $precision = 0){ + + $precision = pow(10,$precision); + $i = $i*$precision; + + $ceil = ceil($i); + $floor = floor($i); + if( ($ceil - $i) <= ($i - $floor) ){ + return $ceil/$precision; + }else{ + return $floor/$precision; + } + } + + + /** + * Create Less_Tree_* objects and optionally generate a cache string + * + * @return mixed + */ + public function NewObj0($class){ + $obj = new $class(); + if( $this->CacheEnabled() ){ + $obj->cache_string = ' new '.$class.'()'; + } + return $obj; + } + + public function NewObj1($class, $arg){ + $obj = new $class( $arg ); + if( $this->CacheEnabled() ){ + $obj->cache_string = ' new '.$class.'('.Less_Parser::ArgString($arg).')'; + } + return $obj; + } + + public function NewObj2($class, $args){ + $obj = new $class( $args[0], $args[1] ); + if( $this->CacheEnabled() ){ + $this->ObjCache( $obj, $class, $args); + } + return $obj; + } + + public function NewObj3($class, $args){ + $obj = new $class( $args[0], $args[1], $args[2] ); + if( $this->CacheEnabled() ){ + $this->ObjCache( $obj, $class, $args); + } + return $obj; + } + + public function NewObj4($class, $args){ + $obj = new $class( $args[0], $args[1], $args[2], $args[3] ); + if( $this->CacheEnabled() ){ + $this->ObjCache( $obj, $class, $args); + } + return $obj; + } + + public function NewObj5($class, $args){ + $obj = new $class( $args[0], $args[1], $args[2], $args[3], $args[4] ); + if( $this->CacheEnabled() ){ + $this->ObjCache( $obj, $class, $args); + } + return $obj; + } + + public function NewObj6($class, $args){ + $obj = new $class( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5] ); + if( $this->CacheEnabled() ){ + $this->ObjCache( $obj, $class, $args); + } + return $obj; + } + + public function NewObj7($class, $args){ + $obj = new $class( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6] ); + if( $this->CacheEnabled() ){ + $this->ObjCache( $obj, $class, $args); + } + return $obj; + } + + //caching + public function ObjCache($obj, $class, $args=array()){ + $obj->cache_string = ' new '.$class.'('. self::ArgCache($args).')'; + } + + public function ArgCache($args){ + return implode(',',array_map( array('Less_Parser','ArgString'),$args)); + } + + + /** + * Convert an argument to a string for use in the parser cache + * + * @return string + */ + public static function ArgString($arg){ + + $type = gettype($arg); + + if( $type === 'object'){ + $string = $arg->cache_string; + unset($arg->cache_string); + return $string; + + }elseif( $type === 'array' ){ + $string = ' Array('; + foreach($arg as $k => $a){ + $string .= var_export($k,true).' => '.self::ArgString($a).','; + } + return $string . ')'; + } + + return var_export($arg,true); + } + + public function Error($msg){ + throw new Less_Exception_Parser($msg, null, $this->furthest, $this->env->currentFileInfo); + } + + public static function WinPath($path){ + return str_replace('\\', '/', $path); + } + + public function CacheEnabled(){ + return (Less_Parser::$options['cache_method'] && (Less_Cache::$cache_dir || (Less_Parser::$options['cache_method'] == 'callback'))); + } + +} + + + + +/** + * Utility for css colors + * + * @package Less + * @subpackage color + */ +class Less_Colors { + + public static $colors = array( + 'aliceblue'=>'#f0f8ff', + 'antiquewhite'=>'#faebd7', + 'aqua'=>'#00ffff', + 'aquamarine'=>'#7fffd4', + 'azure'=>'#f0ffff', + 'beige'=>'#f5f5dc', + 'bisque'=>'#ffe4c4', + 'black'=>'#000000', + 'blanchedalmond'=>'#ffebcd', + 'blue'=>'#0000ff', + 'blueviolet'=>'#8a2be2', + 'brown'=>'#a52a2a', + 'burlywood'=>'#deb887', + 'cadetblue'=>'#5f9ea0', + 'chartreuse'=>'#7fff00', + 'chocolate'=>'#d2691e', + 'coral'=>'#ff7f50', + 'cornflowerblue'=>'#6495ed', + 'cornsilk'=>'#fff8dc', + 'crimson'=>'#dc143c', + 'cyan'=>'#00ffff', + 'darkblue'=>'#00008b', + 'darkcyan'=>'#008b8b', + 'darkgoldenrod'=>'#b8860b', + 'darkgray'=>'#a9a9a9', + 'darkgrey'=>'#a9a9a9', + 'darkgreen'=>'#006400', + 'darkkhaki'=>'#bdb76b', + 'darkmagenta'=>'#8b008b', + 'darkolivegreen'=>'#556b2f', + 'darkorange'=>'#ff8c00', + 'darkorchid'=>'#9932cc', + 'darkred'=>'#8b0000', + 'darksalmon'=>'#e9967a', + 'darkseagreen'=>'#8fbc8f', + 'darkslateblue'=>'#483d8b', + 'darkslategray'=>'#2f4f4f', + 'darkslategrey'=>'#2f4f4f', + 'darkturquoise'=>'#00ced1', + 'darkviolet'=>'#9400d3', + 'deeppink'=>'#ff1493', + 'deepskyblue'=>'#00bfff', + 'dimgray'=>'#696969', + 'dimgrey'=>'#696969', + 'dodgerblue'=>'#1e90ff', + 'firebrick'=>'#b22222', + 'floralwhite'=>'#fffaf0', + 'forestgreen'=>'#228b22', + 'fuchsia'=>'#ff00ff', + 'gainsboro'=>'#dcdcdc', + 'ghostwhite'=>'#f8f8ff', + 'gold'=>'#ffd700', + 'goldenrod'=>'#daa520', + 'gray'=>'#808080', + 'grey'=>'#808080', + 'green'=>'#008000', + 'greenyellow'=>'#adff2f', + 'honeydew'=>'#f0fff0', + 'hotpink'=>'#ff69b4', + 'indianred'=>'#cd5c5c', + 'indigo'=>'#4b0082', + 'ivory'=>'#fffff0', + 'khaki'=>'#f0e68c', + 'lavender'=>'#e6e6fa', + 'lavenderblush'=>'#fff0f5', + 'lawngreen'=>'#7cfc00', + 'lemonchiffon'=>'#fffacd', + 'lightblue'=>'#add8e6', + 'lightcoral'=>'#f08080', + 'lightcyan'=>'#e0ffff', + 'lightgoldenrodyellow'=>'#fafad2', + 'lightgray'=>'#d3d3d3', + 'lightgrey'=>'#d3d3d3', + 'lightgreen'=>'#90ee90', + 'lightpink'=>'#ffb6c1', + 'lightsalmon'=>'#ffa07a', + 'lightseagreen'=>'#20b2aa', + 'lightskyblue'=>'#87cefa', + 'lightslategray'=>'#778899', + 'lightslategrey'=>'#778899', + 'lightsteelblue'=>'#b0c4de', + 'lightyellow'=>'#ffffe0', + 'lime'=>'#00ff00', + 'limegreen'=>'#32cd32', + 'linen'=>'#faf0e6', + 'magenta'=>'#ff00ff', + 'maroon'=>'#800000', + 'mediumaquamarine'=>'#66cdaa', + 'mediumblue'=>'#0000cd', + 'mediumorchid'=>'#ba55d3', + 'mediumpurple'=>'#9370d8', + 'mediumseagreen'=>'#3cb371', + 'mediumslateblue'=>'#7b68ee', + 'mediumspringgreen'=>'#00fa9a', + 'mediumturquoise'=>'#48d1cc', + 'mediumvioletred'=>'#c71585', + 'midnightblue'=>'#191970', + 'mintcream'=>'#f5fffa', + 'mistyrose'=>'#ffe4e1', + 'moccasin'=>'#ffe4b5', + 'navajowhite'=>'#ffdead', + 'navy'=>'#000080', + 'oldlace'=>'#fdf5e6', + 'olive'=>'#808000', + 'olivedrab'=>'#6b8e23', + 'orange'=>'#ffa500', + 'orangered'=>'#ff4500', + 'orchid'=>'#da70d6', + 'palegoldenrod'=>'#eee8aa', + 'palegreen'=>'#98fb98', + 'paleturquoise'=>'#afeeee', + 'palevioletred'=>'#d87093', + 'papayawhip'=>'#ffefd5', + 'peachpuff'=>'#ffdab9', + 'peru'=>'#cd853f', + 'pink'=>'#ffc0cb', + 'plum'=>'#dda0dd', + 'powderblue'=>'#b0e0e6', + 'purple'=>'#800080', + 'red'=>'#ff0000', + 'rosybrown'=>'#bc8f8f', + 'royalblue'=>'#4169e1', + 'saddlebrown'=>'#8b4513', + 'salmon'=>'#fa8072', + 'sandybrown'=>'#f4a460', + 'seagreen'=>'#2e8b57', + 'seashell'=>'#fff5ee', + 'sienna'=>'#a0522d', + 'silver'=>'#c0c0c0', + 'skyblue'=>'#87ceeb', + 'slateblue'=>'#6a5acd', + 'slategray'=>'#708090', + 'slategrey'=>'#708090', + 'snow'=>'#fffafa', + 'springgreen'=>'#00ff7f', + 'steelblue'=>'#4682b4', + 'tan'=>'#d2b48c', + 'teal'=>'#008080', + 'thistle'=>'#d8bfd8', + 'tomato'=>'#ff6347', + 'turquoise'=>'#40e0d0', + 'violet'=>'#ee82ee', + 'wheat'=>'#f5deb3', + 'white'=>'#ffffff', + 'whitesmoke'=>'#f5f5f5', + 'yellow'=>'#ffff00', + 'yellowgreen'=>'#9acd32' + ); + + public static function hasOwnProperty($color) { + return isset(self::$colors[$color]); + } + + + public static function color($color) { + return self::$colors[$color]; + } + +} + + + +/** + * Environment + * + * @package Less + * @subpackage environment + */ +class Less_Environment{ + + //public $paths = array(); // option - unmodified - paths to search for imports on + //public static $files = array(); // list of files that have been imported, used for import-once + //public $rootpath; // option - rootpath to append to URL's + //public static $strictImports = null; // option - + //public $insecure; // option - whether to allow imports from insecure ssl hosts + //public $processImports; // option - whether to process imports. if false then imports will not be imported + //public $javascriptEnabled; // option - whether JavaScript is enabled. if undefined, defaults to true + //public $useFileCache; // browser only - whether to use the per file session cache + public $currentFileInfo; // information about the current file - for error reporting and importing and making urls relative etc. + + public $importMultiple = false; // whether we are currently importing multiple copies + + + /** + * @var array + */ + public $frames = array(); + + /** + * @var array + */ + public $mediaBlocks = array(); + + /** + * @var array + */ + public $mediaPath = array(); + + public static $parensStack = 0; + + public static $tabLevel = 0; + + public static $lastRule = false; + + public static $_outputMap; + + public static $mixin_stack = 0; + + /** + * @var array + */ + public $functions = array(); + + + public function Init(){ + + self::$parensStack = 0; + self::$tabLevel = 0; + self::$lastRule = false; + self::$mixin_stack = 0; + + if( Less_Parser::$options['compress'] ){ + + Less_Environment::$_outputMap = array( + ',' => ',', + ': ' => ':', + '' => '', + ' ' => ' ', + ':' => ' :', + '+' => '+', + '~' => '~', + '>' => '>', + '|' => '|', + '^' => '^', + '^^' => '^^' + ); + + }else{ + + Less_Environment::$_outputMap = array( + ',' => ', ', + ': ' => ': ', + '' => '', + ' ' => ' ', + ':' => ' :', + '+' => ' + ', + '~' => ' ~ ', + '>' => ' > ', + '|' => '|', + '^' => ' ^ ', + '^^' => ' ^^ ' + ); + + } + } + + + public function copyEvalEnv($frames = array() ){ + $new_env = new Less_Environment(); + $new_env->frames = $frames; + return $new_env; + } + + + public static function isMathOn(){ + return !Less_Parser::$options['strictMath'] || Less_Environment::$parensStack; + } + + public static function isPathRelative($path){ + return !preg_match('/^(?:[a-z-]+:|\/)/',$path); + } + + + /** + * Canonicalize a path by resolving references to '/./', '/../' + * Does not remove leading "../" + * @param string path or url + * @return string Canonicalized path + * + */ + public static function normalizePath($path){ + + $segments = explode('/',$path); + $segments = array_reverse($segments); + + $path = array(); + $path_len = 0; + + while( $segments ){ + $segment = array_pop($segments); + switch( $segment ) { + + case '.': + break; + + case '..': + if( !$path_len || ( $path[$path_len-1] === '..') ){ + $path[] = $segment; + $path_len++; + }else{ + array_pop($path); + $path_len--; + } + break; + + default: + $path[] = $segment; + $path_len++; + break; + } + } + + return implode('/',$path); + } + + + public function unshiftFrame($frame){ + array_unshift($this->frames, $frame); + } + + public function shiftFrame(){ + return array_shift($this->frames); + } + +} + + +/** + * Builtin functions + * + * @package Less + * @subpackage function + * @see http://lesscss.org/functions/ + */ +class Less_Functions{ + + public $env; + public $currentFileInfo; + + function __construct($env, $currentFileInfo = null ){ + $this->env = $env; + $this->currentFileInfo = $currentFileInfo; + } + + + /** + * @param string $op + */ + public static function operate( $op, $a, $b ){ + switch ($op) { + case '+': return $a + $b; + case '-': return $a - $b; + case '*': return $a * $b; + case '/': return $a / $b; + } + } + + public static function clamp($val, $max = 1){ + return min( max($val, 0), $max); + } + + public static function fround( $value ){ + + if( $value === 0 ){ + return $value; + } + + if( Less_Parser::$options['numPrecision'] ){ + $p = pow(10, Less_Parser::$options['numPrecision']); + return round( $value * $p) / $p; + } + return $value; + } + + public static function number($n){ + + if ($n instanceof Less_Tree_Dimension) { + return floatval( $n->unit->is('%') ? $n->value / 100 : $n->value); + } else if (is_numeric($n)) { + return $n; + } else { + throw new Less_Exception_Compiler("color functions take numbers as parameters"); + } + } + + public static function scaled($n, $size = 255 ){ + if( $n instanceof Less_Tree_Dimension && $n->unit->is('%') ){ + return (float)$n->value * $size / 100; + } else { + return Less_Functions::number($n); + } + } + + public function rgb ($r, $g, $b){ + return $this->rgba($r, $g, $b, 1.0); + } + + public function rgba($r, $g, $b, $a){ + $rgb = array($r, $g, $b); + $rgb = array_map(array('Less_Functions','scaled'),$rgb); + + $a = self::number($a); + return new Less_Tree_Color($rgb, $a); + } + + public function hsl($h, $s, $l){ + return $this->hsla($h, $s, $l, 1.0); + } + + public function hsla($h, $s, $l, $a){ + + $h = fmod(self::number($h), 360) / 360; // Classic % operator will change float to int + $s = self::clamp(self::number($s)); + $l = self::clamp(self::number($l)); + $a = self::clamp(self::number($a)); + + $m2 = $l <= 0.5 ? $l * ($s + 1) : $l + $s - $l * $s; + + $m1 = $l * 2 - $m2; + + return $this->rgba( self::hsla_hue($h + 1/3, $m1, $m2) * 255, + self::hsla_hue($h, $m1, $m2) * 255, + self::hsla_hue($h - 1/3, $m1, $m2) * 255, + $a); + } + + /** + * @param double $h + */ + public function hsla_hue($h, $m1, $m2){ + $h = $h < 0 ? $h + 1 : ($h > 1 ? $h - 1 : $h); + if ($h * 6 < 1) return $m1 + ($m2 - $m1) * $h * 6; + else if ($h * 2 < 1) return $m2; + else if ($h * 3 < 2) return $m1 + ($m2 - $m1) * (2/3 - $h) * 6; + else return $m1; + } + + public function hsv($h, $s, $v) { + return $this->hsva($h, $s, $v, 1.0); + } + + /** + * @param double $a + */ + public function hsva($h, $s, $v, $a) { + $h = ((Less_Functions::number($h) % 360) / 360 ) * 360; + $s = Less_Functions::number($s); + $v = Less_Functions::number($v); + $a = Less_Functions::number($a); + + $i = floor(($h / 60) % 6); + $f = ($h / 60) - $i; + + $vs = array( $v, + $v * (1 - $s), + $v * (1 - $f * $s), + $v * (1 - (1 - $f) * $s)); + + $perm = array(array(0, 3, 1), + array(2, 0, 1), + array(1, 0, 3), + array(1, 2, 0), + array(3, 1, 0), + array(0, 1, 2)); + + return $this->rgba($vs[$perm[$i][0]] * 255, + $vs[$perm[$i][1]] * 255, + $vs[$perm[$i][2]] * 255, + $a); + } + + public function hue($color){ + $c = $color->toHSL(); + return new Less_Tree_Dimension(Less_Parser::round($c['h'])); + } + + public function saturation($color){ + $c = $color->toHSL(); + return new Less_Tree_Dimension(Less_Parser::round($c['s'] * 100), '%'); + } + + public function lightness($color){ + $c = $color->toHSL(); + return new Less_Tree_Dimension(Less_Parser::round($c['l'] * 100), '%'); + } + + public function hsvhue( $color ){ + $hsv = $color->toHSV(); + return new Less_Tree_Dimension( Less_Parser::round($hsv['h']) ); + } + + + public function hsvsaturation( $color ){ + $hsv = $color->toHSV(); + return new Less_Tree_Dimension( Less_Parser::round($hsv['s'] * 100), '%' ); + } + + public function hsvvalue( $color ){ + $hsv = $color->toHSV(); + return new Less_Tree_Dimension( Less_Parser::round($hsv['v'] * 100), '%' ); + } + + public function red($color) { + return new Less_Tree_Dimension( $color->rgb[0] ); + } + + public function green($color) { + return new Less_Tree_Dimension( $color->rgb[1] ); + } + + public function blue($color) { + return new Less_Tree_Dimension( $color->rgb[2] ); + } + + public function alpha($color){ + $c = $color->toHSL(); + return new Less_Tree_Dimension($c['a']); + } + + public function luma ($color) { + return new Less_Tree_Dimension(Less_Parser::round( $color->luma() * $color->alpha * 100), '%'); + } + + public function luminance( $color ){ + $luminance = + (0.2126 * $color->rgb[0] / 255) + + (0.7152 * $color->rgb[1] / 255) + + (0.0722 * $color->rgb[2] / 255); + + return new Less_Tree_Dimension(Less_Parser::round( $luminance * $color->alpha * 100), '%'); + } + + public function saturate($color, $amount = null){ + // filter: saturate(3.2); + // should be kept as is, so check for color + if( !property_exists($color,'rgb') ){ + return null; + } + $hsl = $color->toHSL(); + + $hsl['s'] += $amount->value / 100; + $hsl['s'] = self::clamp($hsl['s']); + + return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']); + } + + /** + * @param Less_Tree_Dimension $amount + */ + public function desaturate($color, $amount){ + $hsl = $color->toHSL(); + + $hsl['s'] -= $amount->value / 100; + $hsl['s'] = self::clamp($hsl['s']); + + return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']); + } + + + + public function lighten($color, $amount){ + $hsl = $color->toHSL(); + + $hsl['l'] += $amount->value / 100; + $hsl['l'] = self::clamp($hsl['l']); + + return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']); + } + + public function darken($color, $amount){ + + if( $color instanceof Less_Tree_Color ){ + $hsl = $color->toHSL(); + $hsl['l'] -= $amount->value / 100; + $hsl['l'] = self::clamp($hsl['l']); + + return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']); + } + + Less_Functions::Expected('color',$color); + } + + public function fadein($color, $amount){ + $hsl = $color->toHSL(); + $hsl['a'] += $amount->value / 100; + $hsl['a'] = self::clamp($hsl['a']); + return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']); + } + + public function fadeout($color, $amount){ + $hsl = $color->toHSL(); + $hsl['a'] -= $amount->value / 100; + $hsl['a'] = self::clamp($hsl['a']); + return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']); + } + + public function fade($color, $amount){ + $hsl = $color->toHSL(); + + $hsl['a'] = $amount->value / 100; + $hsl['a'] = self::clamp($hsl['a']); + return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']); + } + + + + public function spin($color, $amount){ + $hsl = $color->toHSL(); + $hue = fmod($hsl['h'] + $amount->value, 360); + + $hsl['h'] = $hue < 0 ? 360 + $hue : $hue; + + return $this->hsla($hsl['h'], $hsl['s'], $hsl['l'], $hsl['a']); + } + + // + // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein + // http://sass-lang.com + // + + /** + * @param Less_Tree_Color $color1 + */ + public function mix($color1, $color2, $weight = null){ + if (!$weight) { + $weight = new Less_Tree_Dimension('50', '%'); + } + + $p = $weight->value / 100.0; + $w = $p * 2 - 1; + $hsl1 = $color1->toHSL(); + $hsl2 = $color2->toHSL(); + $a = $hsl1['a'] - $hsl2['a']; + + $w1 = (((($w * $a) == -1) ? $w : ($w + $a) / (1 + $w * $a)) + 1) / 2; + $w2 = 1 - $w1; + + $rgb = array($color1->rgb[0] * $w1 + $color2->rgb[0] * $w2, + $color1->rgb[1] * $w1 + $color2->rgb[1] * $w2, + $color1->rgb[2] * $w1 + $color2->rgb[2] * $w2); + + $alpha = $color1->alpha * $p + $color2->alpha * (1 - $p); + + return new Less_Tree_Color($rgb, $alpha); + } + + public function greyscale($color){ + return $this->desaturate($color, new Less_Tree_Dimension(100)); + } + + + public function contrast( $color, $dark = null, $light = null, $threshold = null){ + // filter: contrast(3.2); + // should be kept as is, so check for color + if( !property_exists($color,'rgb') ){ + return null; + } + if( !$light ){ + $light = $this->rgba(255, 255, 255, 1.0); + } + if( !$dark ){ + $dark = $this->rgba(0, 0, 0, 1.0); + } + //Figure out which is actually light and dark! + if( $dark->luma() > $light->luma() ){ + $t = $light; + $light = $dark; + $dark = $t; + } + if( !$threshold ){ + $threshold = 0.43; + } else { + $threshold = Less_Functions::number($threshold); + } + + if( $color->luma() < $threshold ){ + return $light; + } else { + return $dark; + } + } + + public function e ($str){ + if( is_string($str) ){ + return new Less_Tree_Anonymous($str); + } + return new Less_Tree_Anonymous($str instanceof Less_Tree_JavaScript ? $str->expression : $str->value); + } + + public function escape ($str){ + + $revert = array('%21'=>'!', '%2A'=>'*', '%27'=>"'",'%3F'=>'?','%26'=>'&','%2C'=>',','%2F'=>'/','%40'=>'@','%2B'=>'+','%24'=>'$'); + + return new Less_Tree_Anonymous(strtr(rawurlencode($str->value), $revert)); + } + + + /** + * todo: This function will need some additional work to make it work the same as less.js + * + */ + public function replace( $string, $pattern, $replacement, $flags = null ){ + $result = $string->value; + + $expr = '/'.str_replace('/','\\/',$pattern->value).'/'; + if( $flags && $flags->value){ + $expr .= self::replace_flags($flags->value); + } + + $result = preg_replace($expr,$replacement->value,$result); + + + if( property_exists($string,'quote') ){ + return new Less_Tree_Quoted( $string->quote, $result, $string->escaped); + } + return new Less_Tree_Quoted( '', $result ); + } + + public static function replace_flags($flags){ + $flags = str_split($flags,1); + $new_flags = ''; + + foreach($flags as $flag){ + switch($flag){ + case 'e': + case 'g': + break; + + default: + $new_flags .= $flag; + break; + } + } + + return $new_flags; + } + + public function _percent(){ + $string = func_get_arg(0); + + $args = func_get_args(); + array_shift($args); + $result = $string->value; + + foreach($args as $arg){ + if( preg_match('/%[sda]/i',$result, $token) ){ + $token = $token[0]; + $value = stristr($token, 's') ? $arg->value : $arg->toCSS(); + $value = preg_match('/[A-Z]$/', $token) ? urlencode($value) : $value; + $result = preg_replace('/%[sda]/i',$value, $result, 1); + } + } + $result = str_replace('%%', '%', $result); + + return new Less_Tree_Quoted( $string->quote , $result, $string->escaped); + } + + public function unit( $val, $unit = null) { + if( !($val instanceof Less_Tree_Dimension) ){ + throw new Less_Exception_Compiler('The first argument to unit must be a number' . ($val instanceof Less_Tree_Operation ? '. Have you forgotten parenthesis?' : '.') ); + } + + if( $unit ){ + if( $unit instanceof Less_Tree_Keyword ){ + $unit = $unit->value; + } else { + $unit = $unit->toCSS(); + } + } else { + $unit = ""; + } + return new Less_Tree_Dimension($val->value, $unit ); + } + + public function convert($val, $unit){ + return $val->convertTo($unit->value); + } + + public function round($n, $f = false) { + + $fraction = 0; + if( $f !== false ){ + $fraction = $f->value; + } + + return $this->_math('Less_Parser::round',null, $n, $fraction); + } + + public function pi(){ + return new Less_Tree_Dimension(M_PI); + } + + public function mod($a, $b) { + return new Less_Tree_Dimension( $a->value % $b->value, $a->unit); + } + + + + public function pow($x, $y) { + if( is_numeric($x) && is_numeric($y) ){ + $x = new Less_Tree_Dimension($x); + $y = new Less_Tree_Dimension($y); + }elseif( !($x instanceof Less_Tree_Dimension) || !($y instanceof Less_Tree_Dimension) ){ + throw new Less_Exception_Compiler('Arguments must be numbers'); + } + + return new Less_Tree_Dimension( pow($x->value, $y->value), $x->unit ); + } + + // var mathFunctions = [{name:"ce ... + public function ceil( $n ){ return $this->_math('ceil', null, $n); } + public function floor( $n ){ return $this->_math('floor', null, $n); } + public function sqrt( $n ){ return $this->_math('sqrt', null, $n); } + public function abs( $n ){ return $this->_math('abs', null, $n); } + + public function tan( $n ){ return $this->_math('tan', '', $n); } + public function sin( $n ){ return $this->_math('sin', '', $n); } + public function cos( $n ){ return $this->_math('cos', '', $n); } + + public function atan( $n ){ return $this->_math('atan', 'rad', $n); } + public function asin( $n ){ return $this->_math('asin', 'rad', $n); } + public function acos( $n ){ return $this->_math('acos', 'rad', $n); } + + private function _math() { + $args = func_get_args(); + $fn = array_shift($args); + $unit = array_shift($args); + + if ($args[0] instanceof Less_Tree_Dimension) { + + if( $unit === null ){ + $unit = $args[0]->unit; + }else{ + $args[0] = $args[0]->unify(); + } + $args[0] = (float)$args[0]->value; + return new Less_Tree_Dimension( call_user_func_array($fn, $args), $unit); + } else if (is_numeric($args[0])) { + return call_user_func_array($fn,$args); + } else { + throw new Less_Exception_Compiler("math functions take numbers as parameters"); + } + } + + /** + * @param boolean $isMin + */ + private function _minmax( $isMin, $args ){ + + $arg_count = count($args); + + if( $arg_count < 1 ){ + throw new Less_Exception_Compiler( 'one or more arguments required'); + } + + $j = null; + $unitClone = null; + $unitStatic = null; + + + $order = array(); // elems only contains original argument values. + $values = array(); // key is the unit.toString() for unified tree.Dimension values, + // value is the index into the order array. + + + for( $i = 0; $i < $arg_count; $i++ ){ + $current = $args[$i]; + if( !($current instanceof Less_Tree_Dimension) ){ + if( is_array($args[$i]->value) ){ + $args[] = $args[$i]->value; + } + continue; + } + + if( $current->unit->toString() === '' && !$unitClone ){ + $temp = new Less_Tree_Dimension($current->value, $unitClone); + $currentUnified = $temp->unify(); + }else{ + $currentUnified = $current->unify(); + } + + if( $currentUnified->unit->toString() === "" && !$unitStatic ){ + $unit = $unitStatic; + }else{ + $unit = $currentUnified->unit->toString(); + } + + if( $unit !== '' && !$unitStatic || $unit !== '' && $order[0]->unify()->unit->toString() === "" ){ + $unitStatic = $unit; + } + + if( $unit != '' && !$unitClone ){ + $unitClone = $current->unit->toString(); + } + + if( isset($values['']) && $unit !== '' && $unit === $unitStatic ){ + $j = $values['']; + }elseif( isset($values[$unit]) ){ + $j = $values[$unit]; + }else{ + + if( $unitStatic && $unit !== $unitStatic ){ + throw new Less_Exception_Compiler( 'incompatible types'); + } + $values[$unit] = count($order); + $order[] = $current; + continue; + } + + + if( $order[$j]->unit->toString() === "" && $unitClone ){ + $temp = new Less_Tree_Dimension( $order[$j]->value, $unitClone); + $referenceUnified = $temp->unifiy(); + }else{ + $referenceUnified = $order[$j]->unify(); + } + if( ($isMin && $currentUnified->value < $referenceUnified->value) || (!$isMin && $currentUnified->value > $referenceUnified->value) ){ + $order[$j] = $current; + } + } + + if( count($order) == 1 ){ + return $order[0]; + } + $args = array(); + foreach($order as $a){ + $args[] = $a->toCSS($this->env); + } + return new Less_Tree_Anonymous( ($isMin?'min(':'max(') . implode(Less_Environment::$_outputMap[','],$args).')'); + } + + public function min(){ + $args = func_get_args(); + return $this->_minmax( true, $args ); + } + + public function max(){ + $args = func_get_args(); + return $this->_minmax( false, $args ); + } + + public function getunit($n){ + return new Less_Tree_Anonymous($n->unit); + } + + public function argb($color) { + return new Less_Tree_Anonymous($color->toARGB()); + } + + public function percentage($n) { + return new Less_Tree_Dimension($n->value * 100, '%'); + } + + public function color($n) { + + if( $n instanceof Less_Tree_Quoted ){ + $colorCandidate = $n->value; + $returnColor = Less_Tree_Color::fromKeyword($colorCandidate); + if( $returnColor ){ + return $returnColor; + } + if( preg_match('/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/',$colorCandidate) ){ + return new Less_Tree_Color(substr($colorCandidate, 1)); + } + throw new Less_Exception_Compiler("argument must be a color keyword or 3/6 digit hex e.g. #FFF"); + } else { + throw new Less_Exception_Compiler("argument must be a string"); + } + } + + + public function iscolor($n) { + return $this->_isa($n, 'Less_Tree_Color'); + } + + public function isnumber($n) { + return $this->_isa($n, 'Less_Tree_Dimension'); + } + + public function isstring($n) { + return $this->_isa($n, 'Less_Tree_Quoted'); + } + + public function iskeyword($n) { + return $this->_isa($n, 'Less_Tree_Keyword'); + } + + public function isurl($n) { + return $this->_isa($n, 'Less_Tree_Url'); + } + + public function ispixel($n) { + return $this->isunit($n, 'px'); + } + + public function ispercentage($n) { + return $this->isunit($n, '%'); + } + + public function isem($n) { + return $this->isunit($n, 'em'); + } + + /** + * @param string $unit + */ + public function isunit( $n, $unit ){ + return ($n instanceof Less_Tree_Dimension) && $n->unit->is( ( property_exists($unit,'value') ? $unit->value : $unit) ) ? new Less_Tree_Keyword('true') : new Less_Tree_Keyword('false'); + } + + /** + * @param string $type + */ + private function _isa($n, $type) { + return is_a($n, $type) ? new Less_Tree_Keyword('true') : new Less_Tree_Keyword('false'); + } + + public function tint($color, $amount) { + return $this->mix( $this->rgb(255,255,255), $color, $amount); + } + + public function shade($color, $amount) { + return $this->mix($this->rgb(0, 0, 0), $color, $amount); + } + + public function extract($values, $index ){ + $index = (int)$index->value - 1; // (1-based index) + // handle non-array values as an array of length 1 + // return 'undefined' if index is invalid + if( property_exists($values,'value') && is_array($values->value) ){ + if( isset($values->value[$index]) ){ + return $values->value[$index]; + } + return null; + + }elseif( (int)$index === 0 ){ + return $values; + } + + return null; + } + + public function length($values){ + $n = (property_exists($values,'value') && is_array($values->value)) ? count($values->value) : 1; + return new Less_Tree_Dimension($n); + } + + public function datauri($mimetypeNode, $filePathNode = null ) { + + $filePath = ( $filePathNode ? $filePathNode->value : null ); + $mimetype = $mimetypeNode->value; + + $args = 2; + if( !$filePath ){ + $filePath = $mimetype; + $args = 1; + } + + $filePath = str_replace('\\','/',$filePath); + if( Less_Environment::isPathRelative($filePath) ){ + + if( Less_Parser::$options['relativeUrls'] ){ + $temp = $this->currentFileInfo['currentDirectory']; + } else { + $temp = $this->currentFileInfo['entryPath']; + } + + if( !empty($temp) ){ + $filePath = Less_Environment::normalizePath(rtrim($temp,'/').'/'.$filePath); + } + + } + + + // detect the mimetype if not given + if( $args < 2 ){ + + /* incomplete + $mime = require('mime'); + mimetype = mime.lookup(path); + + // use base 64 unless it's an ASCII or UTF-8 format + var charset = mime.charsets.lookup(mimetype); + useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0; + if (useBase64) mimetype += ';base64'; + */ + + $mimetype = Less_Mime::lookup($filePath); + + $charset = Less_Mime::charsets_lookup($mimetype); + $useBase64 = !in_array($charset,array('US-ASCII', 'UTF-8')); + if( $useBase64 ){ $mimetype .= ';base64'; } + + }else{ + $useBase64 = preg_match('/;base64$/',$mimetype); + } + + + if( file_exists($filePath) ){ + $buf = @file_get_contents($filePath); + }else{ + $buf = false; + } + + + // IE8 cannot handle a data-uri larger than 32KB. If this is exceeded + // and the --ieCompat flag is enabled, return a normal url() instead. + $DATA_URI_MAX_KB = 32; + $fileSizeInKB = round( strlen($buf) / 1024 ); + if( $fileSizeInKB >= $DATA_URI_MAX_KB ){ + $url = new Less_Tree_Url( ($filePathNode ? $filePathNode : $mimetypeNode), $this->currentFileInfo); + return $url->compile($this); + } + + if( $buf ){ + $buf = $useBase64 ? base64_encode($buf) : rawurlencode($buf); + $filePath = '"data:' . $mimetype . ',' . $buf . '"'; + } + + return new Less_Tree_Url( new Less_Tree_Anonymous($filePath) ); + } + + //svg-gradient + public function svggradient( $direction ){ + + $throw_message = 'svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position]'; + $arguments = func_get_args(); + + if( count($arguments) < 3 ){ + throw new Less_Exception_Compiler( $throw_message ); + } + + $stops = array_slice($arguments,1); + $gradientType = 'linear'; + $rectangleDimension = 'x="0" y="0" width="1" height="1"'; + $useBase64 = true; + $directionValue = $direction->toCSS(); + + + switch( $directionValue ){ + case "to bottom": + $gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"'; + break; + case "to right": + $gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"'; + break; + case "to bottom right": + $gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"'; + break; + case "to top right": + $gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"'; + break; + case "ellipse": + case "ellipse at center": + $gradientType = "radial"; + $gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"'; + $rectangleDimension = 'x="-50" y="-50" width="101" height="101"'; + break; + default: + throw new Less_Exception_Compiler( "svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center'" ); + } + + $returner = '' . + '' . + '<' . $gradientType . 'Gradient id="gradient" gradientUnits="userSpaceOnUse" ' . $gradientDirectionSvg . '>'; + + for( $i = 0; $i < count($stops); $i++ ){ + if( is_object($stops[$i]) && property_exists($stops[$i],'value') ){ + $color = $stops[$i]->value[0]; + $position = $stops[$i]->value[1]; + }else{ + $color = $stops[$i]; + $position = null; + } + + if( !($color instanceof Less_Tree_Color) || (!(($i === 0 || $i+1 === count($stops)) && $position === null) && !($position instanceof Less_Tree_Dimension)) ){ + throw new Less_Exception_Compiler( $throw_message ); + } + if( $position ){ + $positionValue = $position->toCSS(); + }elseif( $i === 0 ){ + $positionValue = '0%'; + }else{ + $positionValue = '100%'; + } + $alpha = $color->alpha; + $returner .= ''; + } + + $returner .= ''; + + + if( $useBase64 ){ + $returner = "'data:image/svg+xml;base64,".base64_encode($returner)."'"; + }else{ + $returner = "'data:image/svg+xml,".$returner."'"; + } + + return new Less_Tree_URL( new Less_Tree_Anonymous( $returner ) ); + } + + + /** + * @param string $type + */ + private static function Expected( $type, $arg ){ + + $debug = debug_backtrace(); + array_shift($debug); + $last = array_shift($debug); + $last = array_intersect_key($last,array('function'=>'','class'=>'','line'=>'')); + + $message = 'Object of type '.get_class($arg).' passed to darken function. Expecting `'.$type.'`. '.$arg->toCSS().'. '.print_r($last,true); + throw new Less_Exception_Compiler($message); + + } + + /** + * Php version of javascript's `encodeURIComponent` function + * + * @param string $string The string to encode + * @return string The encoded string + */ + public static function encodeURIComponent($string){ + $revert = array('%21' => '!', '%2A' => '*', '%27' => "'", '%28' => '(', '%29' => ')'); + return strtr(rawurlencode($string), $revert); + } + + + // Color Blending + // ref: http://www.w3.org/TR/compositing-1 + + public function colorBlend( $mode, $color1, $color2 ){ + $ab = $color1->alpha; // backdrop + $as = $color2->alpha; // source + $r = array(); // result + + $ar = $as + $ab * (1 - $as); + for( $i = 0; $i < 3; $i++ ){ + $cb = $color1->rgb[$i] / 255; + $cs = $color2->rgb[$i] / 255; + $cr = call_user_func( $mode, $cb, $cs ); + if( $ar ){ + $cr = ($as * $cs + $ab * ($cb - $as * ($cb + $cs - $cr))) / $ar; + } + $r[$i] = $cr * 255; + } + + return new Less_Tree_Color($r, $ar); + } + + public function multiply($color1, $color2 ){ + return $this->colorBlend( array($this,'colorBlendMultiply'), $color1, $color2 ); + } + + private function colorBlendMultiply($cb, $cs){ + return $cb * $cs; + } + + public function screen($color1, $color2 ){ + return $this->colorBlend( array($this,'colorBlendScreen'), $color1, $color2 ); + } + + private function colorBlendScreen( $cb, $cs){ + return $cb + $cs - $cb * $cs; + } + + public function overlay($color1, $color2){ + return $this->colorBlend( array($this,'colorBlendOverlay'), $color1, $color2 ); + } + + private function colorBlendOverlay($cb, $cs ){ + $cb *= 2; + return ($cb <= 1) + ? $this->colorBlendMultiply($cb, $cs) + : $this->colorBlendScreen($cb - 1, $cs); + } + + public function softlight($color1, $color2){ + return $this->colorBlend( array($this,'colorBlendSoftlight'), $color1, $color2 ); + } + + private function colorBlendSoftlight($cb, $cs ){ + $d = 1; + $e = $cb; + if( $cs > 0.5 ){ + $e = 1; + $d = ($cb > 0.25) ? sqrt($cb) + : ((16 * $cb - 12) * $cb + 4) * $cb; + } + return $cb - (1 - 2 * $cs) * $e * ($d - $cb); + } + + public function hardlight($color1, $color2){ + return $this->colorBlend( array($this,'colorBlendHardlight'), $color1, $color2 ); + } + + private function colorBlendHardlight( $cb, $cs ){ + return $this->colorBlendOverlay($cs, $cb); + } + + public function difference($color1, $color2) { + return $this->colorBlend( array($this,'colorBlendDifference'), $color1, $color2 ); + } + + private function colorBlendDifference( $cb, $cs ){ + return abs($cb - $cs); + } + + public function exclusion( $color1, $color2 ){ + return $this->colorBlend( array($this,'colorBlendExclusion'), $color1, $color2 ); + } + + private function colorBlendExclusion( $cb, $cs ){ + return $cb + $cs - 2 * $cb * $cs; + } + + public function average($color1, $color2){ + return $this->colorBlend( array($this,'colorBlendAverage'), $color1, $color2 ); + } + + // non-w3c functions: + public function colorBlendAverage($cb, $cs ){ + return ($cb + $cs) / 2; + } + + public function negation($color1, $color2 ){ + return $this->colorBlend( array($this,'colorBlendNegation'), $color1, $color2 ); + } + + public function colorBlendNegation($cb, $cs){ + return 1 - abs($cb + $cs - 1); + } + + // ~ End of Color Blending + +} + + +/** + * Mime lookup + * + * @package Less + * @subpackage node + */ +class Less_Mime{ + + // this map is intentionally incomplete + // if you want more, install 'mime' dep + static $_types = array( + '.htm' => 'text/html', + '.html'=> 'text/html', + '.gif' => 'image/gif', + '.jpg' => 'image/jpeg', + '.jpeg'=> 'image/jpeg', + '.png' => 'image/png', + '.ttf' => 'application/x-font-ttf', + '.otf' => 'application/x-font-otf', + '.eot' => 'application/vnd.ms-fontobject', + '.woff' => 'application/x-font-woff', + '.svg' => 'image/svg+xml', + ); + + public static function lookup( $filepath ){ + $parts = explode('.',$filepath); + $ext = '.'.strtolower(array_pop($parts)); + + if( !isset(self::$_types[$ext]) ){ + return null; + } + return self::$_types[$ext]; + } + + public static function charsets_lookup( $type = null ){ + // assumes all text types are UTF-8 + return $type && preg_match('/^text\//',$type) ? 'UTF-8' : ''; + } +} + + +/** + * Tree + * + * @package Less + * @subpackage tree + */ +class Less_Tree{ + + public $cache_string; + + public function toCSS(){ + $output = new Less_Output(); + $this->genCSS($output); + return $output->toString(); + } + + + /** + * Generate CSS by adding it to the output object + * + * @param Less_Output $output The output + * @return void + */ + public function genCSS($output){} + + + /** + * @param Less_Tree_Ruleset[] $rules + */ + public static function outputRuleset( $output, $rules ){ + + $ruleCnt = count($rules); + Less_Environment::$tabLevel++; + + + // Compressed + if( Less_Parser::$options['compress'] ){ + $output->add('{'); + for( $i = 0; $i < $ruleCnt; $i++ ){ + $rules[$i]->genCSS( $output ); + } + + $output->add( '}' ); + Less_Environment::$tabLevel--; + return; + } + + + // Non-compressed + $tabSetStr = "\n".str_repeat( ' ' , Less_Environment::$tabLevel-1 ); + $tabRuleStr = $tabSetStr.' '; + + $output->add( " {" ); + for($i = 0; $i < $ruleCnt; $i++ ){ + $output->add( $tabRuleStr ); + $rules[$i]->genCSS( $output ); + } + Less_Environment::$tabLevel--; + $output->add( $tabSetStr.'}' ); + + } + + public function accept($visitor){} + + + public static function ReferencedArray($rules){ + foreach($rules as $rule){ + if( method_exists($rule, 'markReferenced') ){ + $rule->markReferenced(); + } + } + } + + + /** + * Requires php 5.3+ + */ + public static function __set_state($args){ + + $class = get_called_class(); + $obj = new $class(null,null,null,null); + foreach($args as $key => $val){ + $obj->$key = $val; + } + return $obj; + } + +} + +/** + * Parser output + * + * @package Less + * @subpackage output + */ +class Less_Output{ + + /** + * Output holder + * + * @var string + */ + protected $strs = array(); + + /** + * Adds a chunk to the stack + * + * @param string $chunk The chunk to output + * @param Less_FileInfo $fileInfo The file information + * @param integer $index The index + * @param mixed $mapLines + */ + public function add($chunk, $fileInfo = null, $index = 0, $mapLines = null){ + $this->strs[] = $chunk; + } + + /** + * Is the output empty? + * + * @return boolean + */ + public function isEmpty(){ + return count($this->strs) === 0; + } + + + /** + * Converts the output to string + * + * @return string + */ + public function toString(){ + return implode('',$this->strs); + } + +} + +/** + * Visitor + * + * @package Less + * @subpackage visitor + */ +class Less_Visitor{ + + protected $methods = array(); + protected $_visitFnCache = array(); + + public function __construct(){ + $this->_visitFnCache = get_class_methods(get_class($this)); + $this->_visitFnCache = array_flip($this->_visitFnCache); + } + + public function visitObj( $node ){ + + $funcName = 'visit'.$node->type; + if( isset($this->_visitFnCache[$funcName]) ){ + + $visitDeeper = true; + $this->$funcName( $node, $visitDeeper ); + + if( $visitDeeper ){ + $node->accept($this); + } + + $funcName = $funcName . "Out"; + if( isset($this->_visitFnCache[$funcName]) ){ + $this->$funcName( $node ); + } + + }else{ + $node->accept($this); + } + + return $node; + } + + public function visitArray( $nodes ){ + + array_map( array($this,'visitObj'), $nodes); + return $nodes; + } +} + + + +/** + * Replacing Visitor + * + * @package Less + * @subpackage visitor + */ +class Less_VisitorReplacing extends Less_Visitor{ + + public function visitObj( $node ){ + + $funcName = 'visit'.$node->type; + if( isset($this->_visitFnCache[$funcName]) ){ + + $visitDeeper = true; + $node = $this->$funcName( $node, $visitDeeper ); + + if( $node ){ + if( $visitDeeper && is_object($node) ){ + $node->accept($this); + } + + $funcName = $funcName . "Out"; + if( isset($this->_visitFnCache[$funcName]) ){ + $this->$funcName( $node ); + } + } + + }else{ + $node->accept($this); + } + + return $node; + } + + public function visitArray( $nodes ){ + + $newNodes = array(); + foreach($nodes as $node){ + $evald = $this->visitObj($node); + if( $evald ){ + if( is_array($evald) ){ + self::flatten($evald,$newNodes); + }else{ + $newNodes[] = $evald; + } + } + } + return $newNodes; + } + + public function flatten( $arr, &$out ){ + + foreach($arr as $item){ + if( !is_array($item) ){ + $out[] = $item; + continue; + } + + foreach($item as $nestedItem){ + if( is_array($nestedItem) ){ + self::flatten( $nestedItem, $out); + }else{ + $out[] = $nestedItem; + } + } + } + + return $out; + } + +} + + + + +/** + * Configurable + * + * @package Less + * @subpackage Core + */ +abstract class Less_Configurable { + + /** + * Array of options + * + * @var array + */ + protected $options = array(); + + /** + * Array of default options + * + * @var array + */ + protected $defaultOptions = array(); + + + /** + * Set options + * + * If $options is an object it will be converted into an array by called + * it's toArray method. + * + * @throws Exception + * @param array|object $options + * + */ + public function setOptions($options){ + $options = array_intersect_key($options,$this->defaultOptions); + $this->options = array_merge($this->defaultOptions, $this->options, $options); + } + + + /** + * Get an option value by name + * + * If the option is empty or not set a NULL value will be returned. + * + * @param string $name + * @param mixed $default Default value if confiuration of $name is not present + * @return mixed + */ + public function getOption($name, $default = null){ + if(isset($this->options[$name])){ + return $this->options[$name]; + } + return $default; + } + + + /** + * Set an option + * + * @param string $name + * @param mixed $value + */ + public function setOption($name, $value){ + $this->options[$name] = $value; + } + +} + +/** + * Alpha + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Alpha extends Less_Tree{ + public $value; + public $type = 'Alpha'; + + public function __construct($val){ + $this->value = $val; + } + + //function accept( $visitor ){ + // $this->value = $visitor->visit( $this->value ); + //} + + public function compile($env){ + + if( is_object($this->value) ){ + $this->value = $this->value->compile($env); + } + + return $this; + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + + $output->add( "alpha(opacity=" ); + + if( is_string($this->value) ){ + $output->add( $this->value ); + }else{ + $this->value->genCSS( $output); + } + + $output->add( ')' ); + } + + public function toCSS(){ + return "alpha(opacity=" . (is_string($this->value) ? $this->value : $this->value->toCSS()) . ")"; + } + + +} + +/** + * Anonymous + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Anonymous extends Less_Tree{ + public $value; + public $quote; + public $index; + public $mapLines; + public $currentFileInfo; + public $type = 'Anonymous'; + + /** + * @param integer $index + * @param boolean $mapLines + */ + public function __construct($value, $index = null, $currentFileInfo = null, $mapLines = null ){ + $this->value = $value; + $this->index = $index; + $this->mapLines = $mapLines; + $this->currentFileInfo = $currentFileInfo; + } + + public function compile(){ + return new Less_Tree_Anonymous($this->value, $this->index, $this->currentFileInfo, $this->mapLines); + } + + public function compare($x){ + if( !is_object($x) ){ + return -1; + } + + $left = $this->toCSS(); + $right = $x->toCSS(); + + if( $left === $right ){ + return 0; + } + + return $left < $right ? -1 : 1; + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + $output->add( $this->value, $this->currentFileInfo, $this->index, $this->mapLines ); + } + + public function toCSS(){ + return $this->value; + } + +} + + +/** + * Assignment + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Assignment extends Less_Tree{ + + public $key; + public $value; + public $type = 'Assignment'; + + public function __construct($key, $val) { + $this->key = $key; + $this->value = $val; + } + + public function accept( $visitor ){ + $this->value = $visitor->visitObj( $this->value ); + } + + public function compile($env) { + return new Less_Tree_Assignment( $this->key, $this->value->compile($env)); + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + $output->add( $this->key . '=' ); + $this->value->genCSS( $output ); + } + + public function toCss(){ + return $this->key . '=' . $this->value->toCSS(); + } +} + + +/** + * Attribute + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Attribute extends Less_Tree{ + + public $key; + public $op; + public $value; + public $type = 'Attribute'; + + public function __construct($key, $op, $value){ + $this->key = $key; + $this->op = $op; + $this->value = $value; + } + + public function compile($env){ + + $key_obj = is_object($this->key); + $val_obj = is_object($this->value); + + if( !$key_obj && !$val_obj ){ + return $this; + } + + return new Less_Tree_Attribute( + $key_obj ? $this->key->compile($env) : $this->key , + $this->op, + $val_obj ? $this->value->compile($env) : $this->value); + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + $output->add( $this->toCSS() ); + } + + public function toCSS(){ + $value = $this->key; + + if( $this->op ){ + $value .= $this->op; + $value .= (is_object($this->value) ? $this->value->toCSS() : $this->value); + } + + return '[' . $value . ']'; + } +} + + +/** + * Call + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Call extends Less_Tree{ + public $value; + + protected $name; + protected $args; + protected $index; + protected $currentFileInfo; + public $type = 'Call'; + + public function __construct($name, $args, $index, $currentFileInfo = null ){ + $this->name = $name; + $this->args = $args; + $this->index = $index; + $this->currentFileInfo = $currentFileInfo; + } + + public function accept( $visitor ){ + $this->args = $visitor->visitArray( $this->args ); + } + + // + // When evaluating a function call, + // we either find the function in `tree.functions` [1], + // in which case we call it, passing the evaluated arguments, + // or we simply print it out as it appeared originally [2]. + // + // The *functions.js* file contains the built-in functions. + // + // The reason why we evaluate the arguments, is in the case where + // we try to pass a variable to a function, like: `saturate(@color)`. + // The function should receive the value, not the variable. + // + public function compile($env=null){ + $args = array(); + foreach($this->args as $a){ + $args[] = $a->compile($env); + } + + $nameLC = strtolower($this->name); + switch($nameLC){ + case '%': + $nameLC = '_percent'; + break; + + case 'get-unit': + $nameLC = 'getunit'; + break; + + case 'data-uri': + $nameLC = 'datauri'; + break; + + case 'svg-gradient': + $nameLC = 'svggradient'; + break; + } + + $result = null; + if( $nameLC === 'default' ){ + $result = Less_Tree_DefaultFunc::compile(); + + }else{ + + if( method_exists('Less_Functions',$nameLC) ){ // 1. + try { + + $func = new Less_Functions($env, $this->currentFileInfo); + $result = call_user_func_array( array($func,$nameLC),$args); + + } catch (Exception $e) { + throw new Less_Exception_Compiler('error evaluating function `' . $this->name . '` '.$e->getMessage().' index: '. $this->index); + } + } elseif( isset( $env->functions[$nameLC] ) && is_callable( $env->functions[$nameLC] ) ) { + try { + $result = call_user_func_array( $env->functions[$nameLC], $args ); + } catch (Exception $e) { + throw new Less_Exception_Compiler('error evaluating function `' . $this->name . '` '.$e->getMessage().' index: '. $this->index); + } + } + } + + if( $result !== null ){ + return $result; + } + + + return new Less_Tree_Call( $this->name, $args, $this->index, $this->currentFileInfo ); + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + + $output->add( $this->name . '(', $this->currentFileInfo, $this->index ); + $args_len = count($this->args); + for($i = 0; $i < $args_len; $i++ ){ + $this->args[$i]->genCSS( $output ); + if( $i + 1 < $args_len ){ + $output->add( ', ' ); + } + } + + $output->add( ')' ); + } + + + //public function toCSS(){ + // return $this->compile()->toCSS(); + //} + +} + + +/** + * Color + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Color extends Less_Tree{ + public $rgb; + public $alpha; + public $isTransparentKeyword; + public $type = 'Color'; + + public function __construct($rgb, $a = 1, $isTransparentKeyword = null ){ + + if( $isTransparentKeyword ){ + $this->rgb = $rgb; + $this->alpha = $a; + $this->isTransparentKeyword = true; + return; + } + + $this->rgb = array(); + if( is_array($rgb) ){ + $this->rgb = $rgb; + }else if( strlen($rgb) == 6 ){ + foreach(str_split($rgb, 2) as $c){ + $this->rgb[] = hexdec($c); + } + }else{ + foreach(str_split($rgb, 1) as $c){ + $this->rgb[] = hexdec($c.$c); + } + } + $this->alpha = is_numeric($a) ? $a : 1; + } + + public function compile(){ + return $this; + } + + public function luma(){ + $r = $this->rgb[0] / 255; + $g = $this->rgb[1] / 255; + $b = $this->rgb[2] / 255; + + $r = ($r <= 0.03928) ? $r / 12.92 : pow((($r + 0.055) / 1.055), 2.4); + $g = ($g <= 0.03928) ? $g / 12.92 : pow((($g + 0.055) / 1.055), 2.4); + $b = ($b <= 0.03928) ? $b / 12.92 : pow((($b + 0.055) / 1.055), 2.4); + + return 0.2126 * $r + 0.7152 * $g + 0.0722 * $b; + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + $output->add( $this->toCSS() ); + } + + public function toCSS( $doNotCompress = false ){ + $compress = Less_Parser::$options['compress'] && !$doNotCompress; + $alpha = Less_Functions::fround( $this->alpha ); + + + // + // If we have some transparency, the only way to represent it + // is via `rgba`. Otherwise, we use the hex representation, + // which has better compatibility with older browsers. + // Values are capped between `0` and `255`, rounded and zero-padded. + // + if( $alpha < 1 ){ + if( ( $alpha === 0 || $alpha === 0.0 ) && isset($this->isTransparentKeyword) && $this->isTransparentKeyword ){ + return 'transparent'; + } + + $values = array(); + foreach($this->rgb as $c){ + $values[] = Less_Functions::clamp( round($c), 255); + } + $values[] = $alpha; + + $glue = ($compress ? ',' : ', '); + return "rgba(" . implode($glue, $values) . ")"; + }else{ + + $color = $this->toRGB(); + + if( $compress ){ + + // Convert color to short format + if( $color[1] === $color[2] && $color[3] === $color[4] && $color[5] === $color[6]) { + $color = '#'.$color[1] . $color[3] . $color[5]; + } + } + + return $color; + } + } + + // + // Operations have to be done per-channel, if not, + // channels will spill onto each other. Once we have + // our result, in the form of an integer triplet, + // we create a new Color node to hold the result. + // + + /** + * @param string $op + */ + public function operate( $op, $other) { + $rgb = array(); + $alpha = $this->alpha * (1 - $other->alpha) + $other->alpha; + for ($c = 0; $c < 3; $c++) { + $rgb[$c] = Less_Functions::operate( $op, $this->rgb[$c], $other->rgb[$c]); + } + return new Less_Tree_Color($rgb, $alpha); + } + + public function toRGB(){ + return $this->toHex($this->rgb); + } + + public function toHSL(){ + $r = $this->rgb[0] / 255; + $g = $this->rgb[1] / 255; + $b = $this->rgb[2] / 255; + $a = $this->alpha; + + $max = max($r, $g, $b); + $min = min($r, $g, $b); + $l = ($max + $min) / 2; + $d = $max - $min; + + $h = $s = 0; + if( $max !== $min ){ + $s = $l > 0.5 ? $d / (2 - $max - $min) : $d / ($max + $min); + + switch ($max) { + case $r: $h = ($g - $b) / $d + ($g < $b ? 6 : 0); break; + case $g: $h = ($b - $r) / $d + 2; break; + case $b: $h = ($r - $g) / $d + 4; break; + } + $h /= 6; + } + return array('h' => $h * 360, 's' => $s, 'l' => $l, 'a' => $a ); + } + + //Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript + public function toHSV() { + $r = $this->rgb[0] / 255; + $g = $this->rgb[1] / 255; + $b = $this->rgb[2] / 255; + $a = $this->alpha; + + $max = max($r, $g, $b); + $min = min($r, $g, $b); + + $v = $max; + + $d = $max - $min; + if ($max === 0) { + $s = 0; + } else { + $s = $d / $max; + } + + $h = 0; + if( $max !== $min ){ + switch($max){ + case $r: $h = ($g - $b) / $d + ($g < $b ? 6 : 0); break; + case $g: $h = ($b - $r) / $d + 2; break; + case $b: $h = ($r - $g) / $d + 4; break; + } + $h /= 6; + } + return array('h'=> $h * 360, 's'=> $s, 'v'=> $v, 'a' => $a ); + } + + public function toARGB(){ + $argb = array_merge( (array) Less_Parser::round($this->alpha * 255), $this->rgb); + return $this->toHex( $argb ); + } + + public function compare($x){ + + if( !property_exists( $x, 'rgb' ) ){ + return -1; + } + + + return ($x->rgb[0] === $this->rgb[0] && + $x->rgb[1] === $this->rgb[1] && + $x->rgb[2] === $this->rgb[2] && + $x->alpha === $this->alpha) ? 0 : -1; + } + + public function toHex( $v ){ + + $ret = '#'; + foreach($v as $c){ + $c = Less_Functions::clamp( Less_Parser::round($c), 255); + if( $c < 16 ){ + $ret .= '0'; + } + $ret .= dechex($c); + } + + return $ret; + } + + + /** + * @param string $keyword + */ + public static function fromKeyword( $keyword ){ + $keyword = strtolower($keyword); + + if( Less_Colors::hasOwnProperty($keyword) ){ + // detect named color + return new Less_Tree_Color(substr(Less_Colors::color($keyword), 1)); + } + + if( $keyword === 'transparent' ){ + return new Less_Tree_Color( array(0, 0, 0), 0, true); + } + } + +} + + +/** + * Comment + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Comment extends Less_Tree{ + + public $value; + public $silent; + public $isReferenced; + public $currentFileInfo; + public $type = 'Comment'; + + public function __construct($value, $silent, $index = null, $currentFileInfo = null ){ + $this->value = $value; + $this->silent = !! $silent; + $this->currentFileInfo = $currentFileInfo; + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + //if( $this->debugInfo ){ + //$output->add( tree.debugInfo($env, $this), $this->currentFileInfo, $this->index); + //} + $output->add( trim($this->value) );//TODO shouldn't need to trim, we shouldn't grab the \n + } + + public function toCSS(){ + return Less_Parser::$options['compress'] ? '' : $this->value; + } + + public function isSilent(){ + $isReference = ($this->currentFileInfo && isset($this->currentFileInfo['reference']) && (!isset($this->isReferenced) || !$this->isReferenced) ); + $isCompressed = Less_Parser::$options['compress'] && !preg_match('/^\/\*!/', $this->value); + return $this->silent || $isReference || $isCompressed; + } + + public function compile(){ + return $this; + } + + public function markReferenced(){ + $this->isReferenced = true; + } + +} + + +/** + * Condition + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Condition extends Less_Tree{ + + public $op; + public $lvalue; + public $rvalue; + public $index; + public $negate; + public $type = 'Condition'; + + public function __construct($op, $l, $r, $i = 0, $negate = false) { + $this->op = trim($op); + $this->lvalue = $l; + $this->rvalue = $r; + $this->index = $i; + $this->negate = $negate; + } + + public function accept($visitor){ + $this->lvalue = $visitor->visitObj( $this->lvalue ); + $this->rvalue = $visitor->visitObj( $this->rvalue ); + } + + public function compile($env) { + $a = $this->lvalue->compile($env); + $b = $this->rvalue->compile($env); + + switch( $this->op ){ + case 'and': + $result = $a && $b; + break; + + case 'or': + $result = $a || $b; + break; + + default: + if( Less_Parser::is_method($a, 'compare') ){ + $result = $a->compare($b); + }elseif( Less_Parser::is_method($b, 'compare') ){ + $result = $b->compare($a); + }else{ + throw new Less_Exception_Compiler('Unable to perform comparison', null, $this->index); + } + + switch ($result) { + case -1: + $result = $this->op === '<' || $this->op === '=<' || $this->op === '<='; + break; + + case 0: + $result = $this->op === '=' || $this->op === '>=' || $this->op === '=<' || $this->op === '<='; + break; + + case 1: + $result = $this->op === '>' || $this->op === '>='; + break; + } + break; + } + + return $this->negate ? !$result : $result; + } + +} + + +/** + * DefaultFunc + * + * @package Less + * @subpackage tree + */ +class Less_Tree_DefaultFunc{ + + static $error_; + static $value_; + + public static function compile(){ + if( self::$error_ ){ + throw new Exception(self::$error_); + } + if( self::$value_ !== null ){ + return self::$value_ ? new Less_Tree_Keyword('true') : new Less_Tree_Keyword('false'); + } + } + + public static function value( $v ){ + self::$value_ = $v; + } + + public static function error( $e ){ + self::$error_ = $e; + } + + public static function reset(){ + self::$value_ = self::$error_ = null; + } +} + +/** + * DetachedRuleset + * + * @package Less + * @subpackage tree + */ +class Less_Tree_DetachedRuleset extends Less_Tree{ + + public $ruleset; + public $frames; + public $type = 'DetachedRuleset'; + + public function __construct( $ruleset, $frames = null ){ + $this->ruleset = $ruleset; + $this->frames = $frames; + } + + public function accept($visitor) { + $this->ruleset = $visitor->visitObj($this->ruleset); + } + + public function compile($env){ + if( $this->frames ){ + $frames = $this->frames; + }else{ + $frames = $env->frames; + } + return new Less_Tree_DetachedRuleset($this->ruleset, $frames); + } + + public function callEval($env) { + if( $this->frames ){ + return $this->ruleset->compile( $env->copyEvalEnv( array_merge($this->frames,$env->frames) ) ); + } + return $this->ruleset->compile( $env ); + } +} + + + +/** + * Dimension + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Dimension extends Less_Tree{ + + public $value; + public $unit; + public $type = 'Dimension'; + + public function __construct($value, $unit = null){ + $this->value = floatval($value); + + if( $unit && ($unit instanceof Less_Tree_Unit) ){ + $this->unit = $unit; + }elseif( $unit ){ + $this->unit = new Less_Tree_Unit( array($unit) ); + }else{ + $this->unit = new Less_Tree_Unit( ); + } + } + + public function accept( $visitor ){ + $this->unit = $visitor->visitObj( $this->unit ); + } + + public function compile(){ + return $this; + } + + public function toColor() { + return new Less_Tree_Color(array($this->value, $this->value, $this->value)); + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + + if( Less_Parser::$options['strictUnits'] && !$this->unit->isSingular() ){ + throw new Less_Exception_Compiler("Multiple units in dimension. Correct the units or use the unit function. Bad unit: ".$this->unit->toString()); + } + + $value = Less_Functions::fround( $this->value ); + $strValue = (string)$value; + + if( $value !== 0 && $value < 0.000001 && $value > -0.000001 ){ + // would be output 1e-6 etc. + $strValue = number_format($strValue,10); + $strValue = preg_replace('/\.?0+$/','', $strValue); + } + + if( Less_Parser::$options['compress'] ){ + // Zero values doesn't need a unit + if( $value === 0 && $this->unit->isLength() ){ + $output->add( $strValue ); + return $strValue; + } + + // Float values doesn't need a leading zero + if( $value > 0 && $value < 1 && $strValue[0] === '0' ){ + $strValue = substr($strValue,1); + } + } + + $output->add( $strValue ); + $this->unit->genCSS( $output ); + } + + public function __toString(){ + return $this->toCSS(); + } + + // In an operation between two Dimensions, + // we default to the first Dimension's unit, + // so `1px + 2em` will yield `3px`. + + /** + * @param string $op + */ + public function operate( $op, $other){ + + $value = Less_Functions::operate( $op, $this->value, $other->value); + $unit = clone $this->unit; + + if( $op === '+' || $op === '-' ){ + + if( !$unit->numerator && !$unit->denominator ){ + $unit->numerator = $other->unit->numerator; + $unit->denominator = $other->unit->denominator; + }elseif( !$other->unit->numerator && !$other->unit->denominator ){ + // do nothing + }else{ + $other = $other->convertTo( $this->unit->usedUnits()); + + if( Less_Parser::$options['strictUnits'] && $other->unit->toString() !== $unit->toCSS() ){ + throw new Less_Exception_Compiler("Incompatible units. Change the units or use the unit function. Bad units: '".$unit->toString() . "' and ".$other->unit->toString()+"'."); + } + + $value = Less_Functions::operate( $op, $this->value, $other->value); + } + }elseif( $op === '*' ){ + $unit->numerator = array_merge($unit->numerator, $other->unit->numerator); + $unit->denominator = array_merge($unit->denominator, $other->unit->denominator); + sort($unit->numerator); + sort($unit->denominator); + $unit->cancel(); + }elseif( $op === '/' ){ + $unit->numerator = array_merge($unit->numerator, $other->unit->denominator); + $unit->denominator = array_merge($unit->denominator, $other->unit->numerator); + sort($unit->numerator); + sort($unit->denominator); + $unit->cancel(); + } + return new Less_Tree_Dimension( $value, $unit); + } + + public function compare($other) { + if ($other instanceof Less_Tree_Dimension) { + + if( $this->unit->isEmpty() || $other->unit->isEmpty() ){ + $a = $this; + $b = $other; + } else { + $a = $this->unify(); + $b = $other->unify(); + if( $a->unit->compare($b->unit) !== 0 ){ + return -1; + } + } + $aValue = $a->value; + $bValue = $b->value; + + if ($bValue > $aValue) { + return -1; + } elseif ($bValue < $aValue) { + return 1; + } else { + return 0; + } + } else { + return -1; + } + } + + public function unify() { + return $this->convertTo(array('length'=> 'px', 'duration'=> 's', 'angle' => 'rad' )); + } + + public function convertTo($conversions) { + $value = $this->value; + $unit = clone $this->unit; + + if( is_string($conversions) ){ + $derivedConversions = array(); + foreach( Less_Tree_UnitConversions::$groups as $i ){ + if( isset(Less_Tree_UnitConversions::${$i}[$conversions]) ){ + $derivedConversions = array( $i => $conversions); + } + } + $conversions = $derivedConversions; + } + + + foreach($conversions as $groupName => $targetUnit){ + $group = Less_Tree_UnitConversions::${$groupName}; + + //numerator + foreach($unit->numerator as $i => $atomicUnit){ + $atomicUnit = $unit->numerator[$i]; + if( !isset($group[$atomicUnit]) ){ + continue; + } + + $value = $value * ($group[$atomicUnit] / $group[$targetUnit]); + + $unit->numerator[$i] = $targetUnit; + } + + //denominator + foreach($unit->denominator as $i => $atomicUnit){ + $atomicUnit = $unit->denominator[$i]; + if( !isset($group[$atomicUnit]) ){ + continue; + } + + $value = $value / ($group[$atomicUnit] / $group[$targetUnit]); + + $unit->denominator[$i] = $targetUnit; + } + } + + $unit->cancel(); + + return new Less_Tree_Dimension( $value, $unit); + } +} + + +/** + * Directive + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Directive extends Less_Tree{ + + public $name; + public $value; + public $rules; + public $index; + public $isReferenced; + public $currentFileInfo; + public $debugInfo; + public $type = 'Directive'; + + public function __construct($name, $value = null, $rules, $index = null, $currentFileInfo = null, $debugInfo = null ){ + $this->name = $name; + $this->value = $value; + if( $rules ){ + $this->rules = $rules; + $this->rules->allowImports = true; + } + + $this->index = $index; + $this->currentFileInfo = $currentFileInfo; + $this->debugInfo = $debugInfo; + } + + + public function accept( $visitor ){ + if( $this->rules ){ + $this->rules = $visitor->visitObj( $this->rules ); + } + if( $this->value ){ + $this->value = $visitor->visitObj( $this->value ); + } + } + + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + $value = $this->value; + $rules = $this->rules; + $output->add( $this->name, $this->currentFileInfo, $this->index ); + if( $this->value ){ + $output->add(' '); + $this->value->genCSS($output); + } + if( $this->rules ){ + Less_Tree::outputRuleset( $output, array($this->rules)); + } else { + $output->add(';'); + } + } + + public function compile($env){ + + $value = $this->value; + $rules = $this->rules; + if( $value ){ + $value = $value->compile($env); + } + + if( $rules ){ + $rules = $rules->compile($env); + $rules->root = true; + } + + return new Less_Tree_Directive( $this->name, $value, $rules, $this->index, $this->currentFileInfo, $this->debugInfo ); + } + + + public function variable($name){ + if( $this->rules ){ + return $this->rules->variable($name); + } + } + + public function find($selector){ + if( $this->rules ){ + return $this->rules->find($selector, $this); + } + } + + //rulesets: function () { if (this.rules) return tree.Ruleset.prototype.rulesets.apply(this.rules); }, + + public function markReferenced(){ + $this->isReferenced = true; + if( $this->rules ){ + Less_Tree::ReferencedArray($this->rules->rules); + } + } + +} + + +/** + * Element + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Element extends Less_Tree{ + + public $combinator = ''; + public $value = ''; + public $index; + public $currentFileInfo; + public $type = 'Element'; + + public $value_is_object = false; + + public function __construct($combinator, $value, $index = null, $currentFileInfo = null ){ + + $this->value = $value; + $this->value_is_object = is_object($value); + + if( $combinator ){ + $this->combinator = $combinator; + } + + $this->index = $index; + $this->currentFileInfo = $currentFileInfo; + } + + public function accept( $visitor ){ + if( $this->value_is_object ){ //object or string + $this->value = $visitor->visitObj( $this->value ); + } + } + + public function compile($env){ + + if( Less_Environment::$mixin_stack ){ + return new Less_Tree_Element($this->combinator, ($this->value_is_object ? $this->value->compile($env) : $this->value), $this->index, $this->currentFileInfo ); + } + + if( $this->value_is_object ){ + $this->value = $this->value->compile($env); + } + + return $this; + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + $output->add( $this->toCSS(), $this->currentFileInfo, $this->index ); + } + + public function toCSS(){ + + if( $this->value_is_object ){ + $value = $this->value->toCSS(); + }else{ + $value = $this->value; + } + + + if( $value === '' && $this->combinator && $this->combinator === '&' ){ + return ''; + } + + + return Less_Environment::$_outputMap[$this->combinator] . $value; + } + +} + + +/** + * Expression + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Expression extends Less_Tree{ + + public $value = array(); + public $parens = false; + public $parensInOp = false; + public $type = 'Expression'; + + public function __construct( $value, $parens = null ){ + $this->value = $value; + $this->parens = $parens; + } + + public function accept( $visitor ){ + $this->value = $visitor->visitArray( $this->value ); + } + + public function compile($env) { + + $doubleParen = false; + + if( $this->parens && !$this->parensInOp ){ + Less_Environment::$parensStack++; + } + + $returnValue = null; + if( $this->value ){ + + $count = count($this->value); + + if( $count > 1 ){ + + $ret = array(); + foreach($this->value as $e){ + $ret[] = $e->compile($env); + } + $returnValue = new Less_Tree_Expression($ret); + + }else{ + + if( ($this->value[0] instanceof Less_Tree_Expression) && $this->value[0]->parens && !$this->value[0]->parensInOp ){ + $doubleParen = true; + } + + $returnValue = $this->value[0]->compile($env); + } + + } else { + $returnValue = $this; + } + + if( $this->parens ){ + if( !$this->parensInOp ){ + Less_Environment::$parensStack--; + + }elseif( !Less_Environment::isMathOn() && !$doubleParen ){ + $returnValue = new Less_Tree_Paren($returnValue); + + } + } + return $returnValue; + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + $val_len = count($this->value); + for( $i = 0; $i < $val_len; $i++ ){ + $this->value[$i]->genCSS( $output ); + if( $i + 1 < $val_len ){ + $output->add( ' ' ); + } + } + } + + public function throwAwayComments() { + + if( is_array($this->value) ){ + $new_value = array(); + foreach($this->value as $v){ + if( $v instanceof Less_Tree_Comment ){ + continue; + } + $new_value[] = $v; + } + $this->value = $new_value; + } + } +} + + +/** + * Extend + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Extend extends Less_Tree{ + + public $selector; + public $option; + public $index; + public $selfSelectors = array(); + public $allowBefore; + public $allowAfter; + public $firstExtendOnThisSelectorPath; + public $type = 'Extend'; + public $ruleset; + + + public $object_id; + public $parent_ids = array(); + + /** + * @param integer $index + */ + public function __construct($selector, $option, $index){ + static $i = 0; + $this->selector = $selector; + $this->option = $option; + $this->index = $index; + + switch($option){ + case "all": + $this->allowBefore = true; + $this->allowAfter = true; + break; + default: + $this->allowBefore = false; + $this->allowAfter = false; + break; + } + + $this->object_id = $i++; + $this->parent_ids = array($this->object_id); + } + + public function accept( $visitor ){ + $this->selector = $visitor->visitObj( $this->selector ); + } + + public function compile( $env ){ + Less_Parser::$has_extends = true; + $this->selector = $this->selector->compile($env); + return $this; + //return new Less_Tree_Extend( $this->selector->compile($env), $this->option, $this->index); + } + + public function findSelfSelectors( $selectors ){ + $selfElements = array(); + + + for( $i = 0, $selectors_len = count($selectors); $i < $selectors_len; $i++ ){ + $selectorElements = $selectors[$i]->elements; + // duplicate the logic in genCSS function inside the selector node. + // future TODO - move both logics into the selector joiner visitor + if( $i && $selectorElements && $selectorElements[0]->combinator === "") { + $selectorElements[0]->combinator = ' '; + } + $selfElements = array_merge( $selfElements, $selectors[$i]->elements ); + } + + $this->selfSelectors = array(new Less_Tree_Selector($selfElements)); + } + +} + +/** + * CSS @import node + * + * The general strategy here is that we don't want to wait + * for the parsing to be completed, before we start importing + * the file. That's because in the context of a browser, + * most of the time will be spent waiting for the server to respond. + * + * On creation, we push the import path to our import queue, though + * `import,push`, we also pass it a callback, which it'll call once + * the file has been fetched, and parsed. + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Import extends Less_Tree{ + + public $options; + public $index; + public $path; + public $features; + public $currentFileInfo; + public $css; + public $skip; + public $root; + public $type = 'Import'; + + public function __construct($path, $features, $options, $index, $currentFileInfo = null ){ + $this->options = $options; + $this->index = $index; + $this->path = $path; + $this->features = $features; + $this->currentFileInfo = $currentFileInfo; + + if( is_array($options) ){ + $this->options += array('inline'=>false); + + if( isset($this->options['less']) || $this->options['inline'] ){ + $this->css = !isset($this->options['less']) || !$this->options['less'] || $this->options['inline']; + } else { + $pathValue = $this->getPath(); + if( $pathValue && preg_match('/css([\?;].*)?$/',$pathValue) ){ + $this->css = true; + } + } + } + } + +// +// The actual import node doesn't return anything, when converted to CSS. +// The reason is that it's used at the evaluation stage, so that the rules +// it imports can be treated like any other rules. +// +// In `eval`, we make sure all Import nodes get evaluated, recursively, so +// we end up with a flat structure, which can easily be imported in the parent +// ruleset. +// + + public function accept($visitor){ + + if( $this->features ){ + $this->features = $visitor->visitObj($this->features); + } + $this->path = $visitor->visitObj($this->path); + + if( !$this->options['inline'] && $this->root ){ + $this->root = $visitor->visit($this->root); + } + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + if( $this->css ){ + + $output->add( '@import ', $this->currentFileInfo, $this->index ); + + $this->path->genCSS( $output ); + if( $this->features ){ + $output->add( ' ' ); + $this->features->genCSS( $output ); + } + $output->add( ';' ); + } + } + + public function toCSS(){ + $features = $this->features ? ' ' . $this->features->toCSS() : ''; + + if ($this->css) { + return "@import " . $this->path->toCSS() . $features . ";\n"; + } else { + return ""; + } + } + + /** + * @return string + */ + public function getPath(){ + if ($this->path instanceof Less_Tree_Quoted) { + $path = $this->path->value; + $path = ( isset($this->css) || preg_match('/(\.[a-z]*$)|([\?;].*)$/',$path)) ? $path : $path . '.less'; + } else if ($this->path instanceof Less_Tree_URL) { + $path = $this->path->value->value; + }else{ + return null; + } + + //remove query string and fragment + return preg_replace('/[\?#][^\?]*$/','',$path); + } + + public function compileForImport( $env ){ + return new Less_Tree_Import( $this->path->compile($env), $this->features, $this->options, $this->index, $this->currentFileInfo); + } + + public function compilePath($env) { + $path = $this->path->compile($env); + $rootpath = ''; + if( $this->currentFileInfo && $this->currentFileInfo['rootpath'] ){ + $rootpath = $this->currentFileInfo['rootpath']; + } + + + if( !($path instanceof Less_Tree_URL) ){ + if( $rootpath ){ + $pathValue = $path->value; + // Add the base path if the import is relative + if( $pathValue && Less_Environment::isPathRelative($pathValue) ){ + $path->value = $this->currentFileInfo['uri_root'].$pathValue; + } + } + $path->value = Less_Environment::normalizePath($path->value); + } + + + + return $path; + } + + public function compile( $env ){ + + $evald = $this->compileForImport($env); + + //get path & uri + $path_and_uri = null; + if( is_callable(Less_Parser::$options['import_callback']) ){ + $path_and_uri = call_user_func(Less_Parser::$options['import_callback'],$evald); + } + + if( !$path_and_uri ){ + $path_and_uri = $evald->PathAndUri(); + } + + if( $path_and_uri ){ + list($full_path, $uri) = $path_and_uri; + }else{ + $full_path = $uri = $evald->getPath(); + } + + + //import once + if( $evald->skip( $full_path, $env) ){ + return array(); + } + + if( $this->options['inline'] ){ + //todo needs to reference css file not import + //$contents = new Less_Tree_Anonymous($this->root, 0, array('filename'=>$this->importedFilename), true ); + + Less_Parser::AddParsedFile($full_path); + $contents = new Less_Tree_Anonymous( file_get_contents($full_path), 0, array(), true ); + + if( $this->features ){ + return new Less_Tree_Media( array($contents), $this->features->value ); + } + + return array( $contents ); + } + + + // css ? + if( $evald->css ){ + $features = ( $evald->features ? $evald->features->compile($env) : null ); + return new Less_Tree_Import( $this->compilePath( $env), $features, $this->options, $this->index); + } + + + return $this->ParseImport( $full_path, $uri, $env ); + } + + + /** + * Using the import directories, get the full absolute path and uri of the import + * + * @param Less_Tree_Import $evald + */ + public function PathAndUri(){ + + $evald_path = $this->getPath(); + + if( $evald_path ){ + + $import_dirs = array(); + + if( Less_Environment::isPathRelative($evald_path) ){ + //if the path is relative, the file should be in the current directory + $import_dirs[ $this->currentFileInfo['currentDirectory'] ] = $this->currentFileInfo['uri_root']; + + }else{ + //otherwise, the file should be relative to the server root + $import_dirs[ $this->currentFileInfo['entryPath'] ] = $this->currentFileInfo['entryUri']; + + //if the user supplied entryPath isn't the actual root + $import_dirs[ $_SERVER['DOCUMENT_ROOT'] ] = ''; + + } + + // always look in user supplied import directories + $import_dirs = array_merge( $import_dirs, Less_Parser::$options['import_dirs'] ); + + + foreach( $import_dirs as $rootpath => $rooturi){ + if( is_callable($rooturi) ){ + list($path, $uri) = call_user_func($rooturi, $evald_path); + if( is_string($path) ){ + $full_path = $path; + return array( $full_path, $uri ); + } + }elseif( !empty($rootpath) ){ + $path = rtrim($rootpath,'/\\').'/'.ltrim($evald_path,'/\\'); + + if( file_exists($path) ){ + $full_path = Less_Environment::normalizePath($path); + $uri = Less_Environment::normalizePath(dirname($rooturi.$evald_path)); + return array( $full_path, $uri ); + } elseif( file_exists($path.'.less') ){ + $full_path = Less_Environment::normalizePath($path.'.less'); + $uri = Less_Environment::normalizePath(dirname($rooturi.$evald_path.'.less')); + return array( $full_path, $uri ); + } + } + } + } + } + + + /** + * Parse the import url and return the rules + * + * @return Less_Tree_Media|array + */ + public function ParseImport( $full_path, $uri, $env ){ + + $import_env = clone $env; + if( (isset($this->options['reference']) && $this->options['reference']) || isset($this->currentFileInfo['reference']) ){ + $import_env->currentFileInfo['reference'] = true; + } + + if( (isset($this->options['multiple']) && $this->options['multiple']) ){ + $import_env->importMultiple = true; + } + + $parser = new Less_Parser($import_env); + $root = $parser->parseFile($full_path, $uri, true); + + + $ruleset = new Less_Tree_Ruleset(array(), $root->rules ); + $ruleset->evalImports($import_env); + + return $this->features ? new Less_Tree_Media($ruleset->rules, $this->features->value) : $ruleset->rules; + } + + + /** + * Should the import be skipped? + * + * @return boolean|null + */ + private function Skip($path, $env){ + + $path = Less_Parser::winPath(realpath($path)); + + if( $path && Less_Parser::FileParsed($path) ){ + + if( isset($this->currentFileInfo['reference']) ){ + return true; + } + + return !isset($this->options['multiple']) && !$env->importMultiple; + } + + } +} + + + +/** + * Javascript + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Javascript extends Less_Tree{ + + public $type = 'Javascript'; + public $escaped; + public $expression; + public $index; + + /** + * @param boolean $index + * @param boolean $escaped + */ + public function __construct($string, $index, $escaped){ + $this->escaped = $escaped; + $this->expression = $string; + $this->index = $index; + } + + public function compile(){ + return new Less_Tree_Anonymous('/* Sorry, can not do JavaScript evaluation in PHP... :( */'); + } + +} + + +/** + * Keyword + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Keyword extends Less_Tree{ + + public $value; + public $type = 'Keyword'; + + /** + * @param string $value + */ + public function __construct($value){ + $this->value = $value; + } + + public function compile(){ + return $this; + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + + if( $this->value === '%') { + throw new Less_Exception_Compiler("Invalid % without number"); + } + + $output->add( $this->value ); + } + + public function compare($other) { + if ($other instanceof Less_Tree_Keyword) { + return $other->value === $this->value ? 0 : 1; + } else { + return -1; + } + } +} + + +/** + * Media + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Media extends Less_Tree{ + + public $features; + public $rules; + public $index; + public $currentFileInfo; + public $isReferenced; + public $type = 'Media'; + + public function __construct($value = array(), $features = array(), $index = null, $currentFileInfo = null ){ + + $this->index = $index; + $this->currentFileInfo = $currentFileInfo; + + $selectors = $this->emptySelectors(); + + $this->features = new Less_Tree_Value($features); + + $this->rules = array(new Less_Tree_Ruleset($selectors, $value)); + $this->rules[0]->allowImports = true; + } + + public function accept( $visitor ){ + $this->features = $visitor->visitObj($this->features); + $this->rules = $visitor->visitArray($this->rules); + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + + $output->add( '@media ', $this->currentFileInfo, $this->index ); + $this->features->genCSS( $output ); + Less_Tree::outputRuleset( $output, $this->rules); + + } + + public function compile($env) { + + $media = new Less_Tree_Media(array(), array(), $this->index, $this->currentFileInfo ); + + $strictMathBypass = false; + if( Less_Parser::$options['strictMath'] === false) { + $strictMathBypass = true; + Less_Parser::$options['strictMath'] = true; + } + + $media->features = $this->features->compile($env); + + if( $strictMathBypass ){ + Less_Parser::$options['strictMath'] = false; + } + + $env->mediaPath[] = $media; + $env->mediaBlocks[] = $media; + + array_unshift($env->frames, $this->rules[0]); + $media->rules = array($this->rules[0]->compile($env)); + array_shift($env->frames); + + array_pop($env->mediaPath); + + return !$env->mediaPath ? $media->compileTop($env) : $media->compileNested($env); + } + + public function variable($name) { + return $this->rules[0]->variable($name); + } + + public function find($selector) { + return $this->rules[0]->find($selector, $this); + } + + public function emptySelectors(){ + $el = new Less_Tree_Element('','&', $this->index, $this->currentFileInfo ); + $sels = array( new Less_Tree_Selector(array($el), array(), null, $this->index, $this->currentFileInfo) ); + $sels[0]->mediaEmpty = true; + return $sels; + } + + public function markReferenced(){ + $this->rules[0]->markReferenced(); + $this->isReferenced = true; + Less_Tree::ReferencedArray($this->rules[0]->rules); + } + + // evaltop + public function compileTop($env) { + $result = $this; + + if (count($env->mediaBlocks) > 1) { + $selectors = $this->emptySelectors(); + $result = new Less_Tree_Ruleset($selectors, $env->mediaBlocks); + $result->multiMedia = true; + } + + $env->mediaBlocks = array(); + $env->mediaPath = array(); + + return $result; + } + + public function compileNested($env) { + $path = array_merge($env->mediaPath, array($this)); + + // Extract the media-query conditions separated with `,` (OR). + foreach ($path as $key => $p) { + $value = $p->features instanceof Less_Tree_Value ? $p->features->value : $p->features; + $path[$key] = is_array($value) ? $value : array($value); + } + + // Trace all permutations to generate the resulting media-query. + // + // (a, b and c) with nested (d, e) -> + // a and d + // a and e + // b and c and d + // b and c and e + + $permuted = $this->permute($path); + $expressions = array(); + foreach($permuted as $path){ + + for( $i=0, $len=count($path); $i < $len; $i++){ + $path[$i] = Less_Parser::is_method($path[$i], 'toCSS') ? $path[$i] : new Less_Tree_Anonymous($path[$i]); + } + + for( $i = count($path) - 1; $i > 0; $i-- ){ + array_splice($path, $i, 0, array(new Less_Tree_Anonymous('and'))); + } + + $expressions[] = new Less_Tree_Expression($path); + } + $this->features = new Less_Tree_Value($expressions); + + + + // Fake a tree-node that doesn't output anything. + return new Less_Tree_Ruleset(array(), array()); + } + + public function permute($arr) { + if (!$arr) + return array(); + + if (count($arr) == 1) + return $arr[0]; + + $result = array(); + $rest = $this->permute(array_slice($arr, 1)); + foreach ($rest as $r) { + foreach ($arr[0] as $a) { + $result[] = array_merge( + is_array($a) ? $a : array($a), + is_array($r) ? $r : array($r) + ); + } + } + + return $result; + } + + public function bubbleSelectors($selectors) { + + if( !$selectors) return; + + $this->rules = array(new Less_Tree_Ruleset( $selectors, array($this->rules[0]))); + } + +} + + +/** + * A simple css name-value pair + * ex: width:100px; + * + * In bootstrap, there are about 600-1,000 simple name-value pairs (depending on how forgiving the match is) -vs- 6,020 dynamic rules (Less_Tree_Rule) + * Using the name-value object can speed up bootstrap compilation slightly, but it breaks color keyword interpretation: color:red -> color:#FF0000; + * + * @package Less + * @subpackage tree + */ +class Less_Tree_NameValue extends Less_Tree{ + + public $name; + public $value; + public $index; + public $currentFileInfo; + public $type = 'NameValue'; + + public function __construct($name, $value = null, $index = null, $currentFileInfo = null ){ + $this->name = $name; + $this->value = $value; + $this->index = $index; + $this->currentFileInfo = $currentFileInfo; + } + + public function genCSS( $output ){ + + $output->add( + $this->name + . Less_Environment::$_outputMap[': '] + . $this->value + . (((Less_Environment::$lastRule && Less_Parser::$options['compress'])) ? "" : ";") + , $this->currentFileInfo, $this->index); + } + + public function compile ($env){ + return $this; + } +} + + +/** + * Negative + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Negative extends Less_Tree{ + + public $value; + public $type = 'Negative'; + + public function __construct($node){ + $this->value = $node; + } + + //function accept($visitor) { + // $this->value = $visitor->visit($this->value); + //} + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + $output->add( '-' ); + $this->value->genCSS( $output ); + } + + public function compile($env) { + if( Less_Environment::isMathOn() ){ + $ret = new Less_Tree_Operation('*', array( new Less_Tree_Dimension(-1), $this->value ) ); + return $ret->compile($env); + } + return new Less_Tree_Negative( $this->value->compile($env) ); + } +} + +/** + * Operation + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Operation extends Less_Tree{ + + public $op; + public $operands; + public $isSpaced; + public $type = 'Operation'; + + /** + * @param string $op + */ + public function __construct($op, $operands, $isSpaced = false){ + $this->op = trim($op); + $this->operands = $operands; + $this->isSpaced = $isSpaced; + } + + public function accept($visitor) { + $this->operands = $visitor->visitArray($this->operands); + } + + public function compile($env){ + $a = $this->operands[0]->compile($env); + $b = $this->operands[1]->compile($env); + + + if( Less_Environment::isMathOn() ){ + + if( $a instanceof Less_Tree_Dimension && $b instanceof Less_Tree_Color ){ + $a = $a->toColor(); + + }elseif( $b instanceof Less_Tree_Dimension && $a instanceof Less_Tree_Color ){ + $b = $b->toColor(); + + } + + if( !method_exists($a,'operate') ){ + throw new Less_Exception_Compiler("Operation on an invalid type"); + } + + return $a->operate( $this->op, $b); + } + + return new Less_Tree_Operation($this->op, array($a, $b), $this->isSpaced ); + } + + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + $this->operands[0]->genCSS( $output ); + if( $this->isSpaced ){ + $output->add( " " ); + } + $output->add( $this->op ); + if( $this->isSpaced ){ + $output->add( ' ' ); + } + $this->operands[1]->genCSS( $output ); + } + +} + + +/** + * Paren + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Paren extends Less_Tree{ + + public $value; + public $type = 'Paren'; + + public function __construct($value) { + $this->value = $value; + } + + public function accept($visitor){ + $this->value = $visitor->visitObj($this->value); + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + $output->add( '(' ); + $this->value->genCSS( $output ); + $output->add( ')' ); + } + + public function compile($env) { + return new Less_Tree_Paren($this->value->compile($env)); + } + +} + + +/** + * Quoted + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Quoted extends Less_Tree{ + public $escaped; + public $value; + public $quote; + public $index; + public $currentFileInfo; + public $type = 'Quoted'; + + /** + * @param string $str + */ + public function __construct($str, $content = '', $escaped = false, $index = false, $currentFileInfo = null ){ + $this->escaped = $escaped; + $this->value = $content; + if( $str ){ + $this->quote = $str[0]; + } + $this->index = $index; + $this->currentFileInfo = $currentFileInfo; + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + if( !$this->escaped ){ + $output->add( $this->quote, $this->currentFileInfo, $this->index ); + } + $output->add( $this->value ); + if( !$this->escaped ){ + $output->add( $this->quote ); + } + } + + public function compile($env){ + + $value = $this->value; + if( preg_match_all('/`([^`]+)`/', $this->value, $matches) ){ + foreach($matches as $i => $match){ + $js = new Less_Tree_JavaScript($matches[1], $this->index, true); + $js = $js->compile()->value; + $value = str_replace($matches[0][$i], $js, $value); + } + } + + if( preg_match_all('/@\{([\w-]+)\}/',$value,$matches) ){ + foreach($matches[1] as $i => $match){ + $v = new Less_Tree_Variable('@' . $match, $this->index, $this->currentFileInfo ); + $v = $v->compile($env); + $v = ($v instanceof Less_Tree_Quoted) ? $v->value : $v->toCSS(); + $value = str_replace($matches[0][$i], $v, $value); + } + } + + return new Less_Tree_Quoted($this->quote . $value . $this->quote, $value, $this->escaped, $this->index, $this->currentFileInfo); + } + + public function compare($x) { + + if( !Less_Parser::is_method($x, 'toCSS') ){ + return -1; + } + + $left = $this->toCSS(); + $right = $x->toCSS(); + + if ($left === $right) { + return 0; + } + + return $left < $right ? -1 : 1; + } +} + + +/** + * Rule + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Rule extends Less_Tree{ + + public $name; + public $value; + public $important; + public $merge; + public $index; + public $inline; + public $variable; + public $currentFileInfo; + public $type = 'Rule'; + + /** + * @param string $important + */ + public function __construct($name, $value = null, $important = null, $merge = null, $index = null, $currentFileInfo = null, $inline = false){ + $this->name = $name; + $this->value = ($value instanceof Less_Tree_Value || $value instanceof Less_Tree_Ruleset) ? $value : new Less_Tree_Value(array($value)); + $this->important = $important ? ' ' . trim($important) : ''; + $this->merge = $merge; + $this->index = $index; + $this->currentFileInfo = $currentFileInfo; + $this->inline = $inline; + $this->variable = ( is_string($name) && $name[0] === '@'); + } + + public function accept($visitor) { + $this->value = $visitor->visitObj( $this->value ); + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + + $output->add( $this->name . Less_Environment::$_outputMap[': '], $this->currentFileInfo, $this->index); + try{ + $this->value->genCSS( $output); + + }catch( Less_Exception_Parser $e ){ + $e->index = $this->index; + $e->currentFile = $this->currentFileInfo; + throw $e; + } + $output->add( $this->important . (($this->inline || (Less_Environment::$lastRule && Less_Parser::$options['compress'])) ? "" : ";"), $this->currentFileInfo, $this->index); + } + + public function compile ($env){ + + $name = $this->name; + if( is_array($name) ){ + // expand 'primitive' name directly to get + // things faster (~10% for benchmark.less): + if( count($name) === 1 && $name[0] instanceof Less_Tree_Keyword ){ + $name = $name[0]->value; + }else{ + $name = $this->CompileName($env,$name); + } + } + + $strictMathBypass = Less_Parser::$options['strictMath']; + if( $name === "font" && !Less_Parser::$options['strictMath'] ){ + Less_Parser::$options['strictMath'] = true; + } + + try { + $evaldValue = $this->value->compile($env); + + if( !$this->variable && $evaldValue->type === "DetachedRuleset") { + throw new Less_Exception_Compiler("Rulesets cannot be evaluated on a property.", null, $this->index, $this->currentFileInfo); + } + + if( Less_Environment::$mixin_stack ){ + $return = new Less_Tree_Rule($name, $evaldValue, $this->important, $this->merge, $this->index, $this->currentFileInfo, $this->inline); + }else{ + $this->name = $name; + $this->value = $evaldValue; + $return = $this; + } + + }catch( Less_Exception_Parser $e ){ + if( !is_numeric($e->index) ){ + $e->index = $this->index; + $e->currentFile = $this->currentFileInfo; + } + throw $e; + } + + Less_Parser::$options['strictMath'] = $strictMathBypass; + + return $return; + } + + + public function CompileName( $env, $name ){ + $output = new Less_Output(); + foreach($name as $n){ + $n->compile($env)->genCSS($output); + } + return $output->toString(); + } + + public function makeImportant(){ + return new Less_Tree_Rule($this->name, $this->value, '!important', $this->merge, $this->index, $this->currentFileInfo, $this->inline); + } + +} + + +/** + * Ruleset + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Ruleset extends Less_Tree{ + + protected $lookups; + public $_variables; + public $_rulesets; + + public $strictImports; + + public $selectors; + public $rules; + public $root; + public $allowImports; + public $paths; + public $firstRoot; + public $type = 'Ruleset'; + public $multiMedia; + public $allExtends; + + public $ruleset_id; + public $originalRuleset; + + public $first_oelements; + + public function SetRulesetIndex(){ + $this->ruleset_id = Less_Parser::$next_id++; + $this->originalRuleset = $this->ruleset_id; + + if( $this->selectors ){ + foreach($this->selectors as $sel){ + if( $sel->_oelements ){ + $this->first_oelements[$sel->_oelements[0]] = true; + } + } + } + } + + public function __construct($selectors, $rules, $strictImports = null){ + $this->selectors = $selectors; + $this->rules = $rules; + $this->lookups = array(); + $this->strictImports = $strictImports; + $this->SetRulesetIndex(); + } + + public function accept( $visitor ){ + if( $this->paths ){ + $paths_len = count($this->paths); + for($i = 0,$paths_len; $i < $paths_len; $i++ ){ + $this->paths[$i] = $visitor->visitArray($this->paths[$i]); + } + }elseif( $this->selectors ){ + $this->selectors = $visitor->visitArray($this->selectors); + } + + if( $this->rules ){ + $this->rules = $visitor->visitArray($this->rules); + } + } + + public function compile($env){ + + $ruleset = $this->PrepareRuleset($env); + + + // Store the frames around mixin definitions, + // so they can be evaluated like closures when the time comes. + $rsRuleCnt = count($ruleset->rules); + for( $i = 0; $i < $rsRuleCnt; $i++ ){ + if( $ruleset->rules[$i] instanceof Less_Tree_Mixin_Definition || $ruleset->rules[$i] instanceof Less_Tree_DetachedRuleset ){ + $ruleset->rules[$i] = $ruleset->rules[$i]->compile($env); + } + } + + $mediaBlockCount = 0; + if( $env instanceof Less_Environment ){ + $mediaBlockCount = count($env->mediaBlocks); + } + + // Evaluate mixin calls. + $this->EvalMixinCalls( $ruleset, $env, $rsRuleCnt ); + + + // Evaluate everything else + for( $i=0; $i<$rsRuleCnt; $i++ ){ + if(! ($ruleset->rules[$i] instanceof Less_Tree_Mixin_Definition || $ruleset->rules[$i] instanceof Less_Tree_DetachedRuleset) ){ + $ruleset->rules[$i] = $ruleset->rules[$i]->compile($env); + } + } + + // Evaluate everything else + for( $i=0; $i<$rsRuleCnt; $i++ ){ + $rule = $ruleset->rules[$i]; + + // for rulesets, check if it is a css guard and can be removed + if( $rule instanceof Less_Tree_Ruleset && $rule->selectors && count($rule->selectors) === 1 ){ + + // check if it can be folded in (e.g. & where) + if( $rule->selectors[0]->isJustParentSelector() ){ + array_splice($ruleset->rules,$i--,1); + $rsRuleCnt--; + + for($j = 0; $j < count($rule->rules); $j++ ){ + $subRule = $rule->rules[$j]; + if( !($subRule instanceof Less_Tree_Rule) || !$subRule->variable ){ + array_splice($ruleset->rules, ++$i, 0, array($subRule)); + $rsRuleCnt++; + } + } + + } + } + } + + + // Pop the stack + $env->shiftFrame(); + + if ($mediaBlockCount) { + $len = count($env->mediaBlocks); + for($i = $mediaBlockCount; $i < $len; $i++ ){ + $env->mediaBlocks[$i]->bubbleSelectors($ruleset->selectors); + } + } + + return $ruleset; + } + + /** + * Compile Less_Tree_Mixin_Call objects + * + * @param Less_Tree_Ruleset $ruleset + * @param integer $rsRuleCnt + */ + private function EvalMixinCalls( $ruleset, $env, &$rsRuleCnt ){ + for($i=0; $i < $rsRuleCnt; $i++){ + $rule = $ruleset->rules[$i]; + + if( $rule instanceof Less_Tree_Mixin_Call ){ + $rule = $rule->compile($env); + + $temp = array(); + foreach($rule as $r){ + if( ($r instanceof Less_Tree_Rule) && $r->variable ){ + // do not pollute the scope if the variable is + // already there. consider returning false here + // but we need a way to "return" variable from mixins + if( !$ruleset->variable($r->name) ){ + $temp[] = $r; + } + }else{ + $temp[] = $r; + } + } + $temp_count = count($temp)-1; + array_splice($ruleset->rules, $i, 1, $temp); + $rsRuleCnt += $temp_count; + $i += $temp_count; + $ruleset->resetCache(); + + }elseif( $rule instanceof Less_Tree_RulesetCall ){ + + $rule = $rule->compile($env); + $rules = array(); + foreach($rule->rules as $r){ + if( ($r instanceof Less_Tree_Rule) && $r->variable ){ + continue; + } + $rules[] = $r; + } + + array_splice($ruleset->rules, $i, 1, $rules); + $temp_count = count($rules); + $rsRuleCnt += $temp_count - 1; + $i += $temp_count-1; + $ruleset->resetCache(); + } + + } + } + + + /** + * Compile the selectors and create a new ruleset object for the compile() method + * + */ + private function PrepareRuleset($env){ + + $hasOnePassingSelector = false; + $selectors = array(); + if( $this->selectors ){ + Less_Tree_DefaultFunc::error("it is currently only allowed in parametric mixin guards,"); + + foreach($this->selectors as $s){ + $selector = $s->compile($env); + $selectors[] = $selector; + if( $selector->evaldCondition ){ + $hasOnePassingSelector = true; + } + } + + Less_Tree_DefaultFunc::reset(); + } else { + $hasOnePassingSelector = true; + } + + if( $this->rules && $hasOnePassingSelector ){ + $rules = $this->rules; + }else{ + $rules = array(); + } + + $ruleset = new Less_Tree_Ruleset($selectors, $rules, $this->strictImports); + + $ruleset->originalRuleset = $this->ruleset_id; + + $ruleset->root = $this->root; + $ruleset->firstRoot = $this->firstRoot; + $ruleset->allowImports = $this->allowImports; + + + // push the current ruleset to the frames stack + $env->unshiftFrame($ruleset); + + + // Evaluate imports + if( $ruleset->root || $ruleset->allowImports || !$ruleset->strictImports ){ + $ruleset->evalImports($env); + } + + return $ruleset; + } + + function evalImports($env) { + + $rules_len = count($this->rules); + for($i=0; $i < $rules_len; $i++){ + $rule = $this->rules[$i]; + + if( $rule instanceof Less_Tree_Import ){ + $rules = $rule->compile($env); + if( is_array($rules) ){ + array_splice($this->rules, $i, 1, $rules); + $temp_count = count($rules)-1; + $i += $temp_count; + $rules_len += $temp_count; + }else{ + array_splice($this->rules, $i, 1, array($rules)); + } + + $this->resetCache(); + } + } + } + + function makeImportant(){ + + $important_rules = array(); + foreach($this->rules as $rule){ + if( $rule instanceof Less_Tree_Rule || $rule instanceof Less_Tree_Ruleset ){ + $important_rules[] = $rule->makeImportant(); + }else{ + $important_rules[] = $rule; + } + } + + return new Less_Tree_Ruleset($this->selectors, $important_rules, $this->strictImports ); + } + + public function matchArgs($args){ + return !$args; + } + + // lets you call a css selector with a guard + public function matchCondition( $args, $env ){ + $lastSelector = end($this->selectors); + + if( !$lastSelector->evaldCondition ){ + return false; + } + if( $lastSelector->condition && !$lastSelector->condition->compile( $env->copyEvalEnv( $env->frames ) ) ){ + return false; + } + return true; + } + + function resetCache(){ + $this->_rulesets = null; + $this->_variables = null; + $this->lookups = array(); + } + + public function variables(){ + $this->_variables = array(); + foreach( $this->rules as $r){ + if ($r instanceof Less_Tree_Rule && $r->variable === true) { + $this->_variables[$r->name] = $r; + } + } + } + + public function variable($name){ + + if( is_null($this->_variables) ){ + $this->variables(); + } + return isset($this->_variables[$name]) ? $this->_variables[$name] : null; + } + + public function find( $selector, $self = null ){ + + $key = implode(' ',$selector->_oelements); + + if( !isset($this->lookups[$key]) ){ + + if( !$self ){ + $self = $this->ruleset_id; + } + + $this->lookups[$key] = array(); + + $first_oelement = $selector->_oelements[0]; + + foreach($this->rules as $rule){ + if( $rule instanceof Less_Tree_Ruleset && $rule->ruleset_id != $self ){ + + if( isset($rule->first_oelements[$first_oelement]) ){ + + foreach( $rule->selectors as $ruleSelector ){ + $match = $selector->match($ruleSelector); + if( $match ){ + if( $selector->elements_len > $match ){ + $this->lookups[$key] = array_merge($this->lookups[$key], $rule->find( new Less_Tree_Selector(array_slice($selector->elements, $match)), $self)); + } else { + $this->lookups[$key][] = $rule; + } + break; + } + } + } + } + } + } + + return $this->lookups[$key]; + } + + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + + if( !$this->root ){ + Less_Environment::$tabLevel++; + } + + $tabRuleStr = $tabSetStr = ''; + if( !Less_Parser::$options['compress'] ){ + if( Less_Environment::$tabLevel ){ + $tabRuleStr = "\n".str_repeat( ' ' , Less_Environment::$tabLevel ); + $tabSetStr = "\n".str_repeat( ' ' , Less_Environment::$tabLevel-1 ); + }else{ + $tabSetStr = $tabRuleStr = "\n"; + } + } + + + $ruleNodes = array(); + $rulesetNodes = array(); + foreach($this->rules as $rule){ + + $class = get_class($rule); + if( ($class === 'Less_Tree_Media') || ($class === 'Less_Tree_Directive') || ($this->root && $class === 'Less_Tree_Comment') || ($class === 'Less_Tree_Ruleset' && $rule->rules) ){ + $rulesetNodes[] = $rule; + }else{ + $ruleNodes[] = $rule; + } + } + + // If this is the root node, we don't render + // a selector, or {}. + if( !$this->root ){ + + /* + debugInfo = tree.debugInfo(env, this, tabSetStr); + + if (debugInfo) { + output.add(debugInfo); + output.add(tabSetStr); + } + */ + + $paths_len = count($this->paths); + for( $i = 0; $i < $paths_len; $i++ ){ + $path = $this->paths[$i]; + $firstSelector = true; + + foreach($path as $p){ + $p->genCSS( $output, $firstSelector ); + $firstSelector = false; + } + + if( $i + 1 < $paths_len ){ + $output->add( ',' . $tabSetStr ); + } + } + + $output->add( (Less_Parser::$options['compress'] ? '{' : " {") . $tabRuleStr ); + } + + // Compile rules and rulesets + $ruleNodes_len = count($ruleNodes); + $rulesetNodes_len = count($rulesetNodes); + for( $i = 0; $i < $ruleNodes_len; $i++ ){ + $rule = $ruleNodes[$i]; + + // @page{ directive ends up with root elements inside it, a mix of rules and rulesets + // In this instance we do not know whether it is the last property + if( $i + 1 === $ruleNodes_len && (!$this->root || $rulesetNodes_len === 0 || $this->firstRoot ) ){ + Less_Environment::$lastRule = true; + } + + $rule->genCSS( $output ); + + if( !Less_Environment::$lastRule ){ + $output->add( $tabRuleStr ); + }else{ + Less_Environment::$lastRule = false; + } + } + + if( !$this->root ){ + $output->add( $tabSetStr . '}' ); + Less_Environment::$tabLevel--; + } + + $firstRuleset = true; + $space = ($this->root ? $tabRuleStr : $tabSetStr); + for( $i = 0; $i < $rulesetNodes_len; $i++ ){ + + if( $ruleNodes_len && $firstRuleset ){ + $output->add( $space ); + }elseif( !$firstRuleset ){ + $output->add( $space ); + } + $firstRuleset = false; + $rulesetNodes[$i]->genCSS( $output); + } + + if( !Less_Parser::$options['compress'] && $this->firstRoot ){ + $output->add( "\n" ); + } + + } + + + function markReferenced(){ + if( !$this->selectors ){ + return; + } + foreach($this->selectors as $selector){ + $selector->markReferenced(); + } + } + + public function joinSelectors( $context, $selectors ){ + $paths = array(); + if( is_array($selectors) ){ + foreach($selectors as $selector) { + $this->joinSelector( $paths, $context, $selector); + } + } + return $paths; + } + + public function joinSelector( &$paths, $context, $selector){ + + $hasParentSelector = false; + + foreach($selector->elements as $el) { + if( $el->value === '&') { + $hasParentSelector = true; + } + } + + if( !$hasParentSelector ){ + if( $context ){ + foreach($context as $context_el){ + $paths[] = array_merge($context_el, array($selector) ); + } + }else { + $paths[] = array($selector); + } + return; + } + + + // The paths are [[Selector]] + // The first list is a list of comma seperated selectors + // The inner list is a list of inheritance seperated selectors + // e.g. + // .a, .b { + // .c { + // } + // } + // == [[.a] [.c]] [[.b] [.c]] + // + + // the elements from the current selector so far + $currentElements = array(); + // the current list of new selectors to add to the path. + // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors + // by the parents + $newSelectors = array(array()); + + + foreach( $selector->elements as $el){ + + // non parent reference elements just get added + if( $el->value !== '&' ){ + $currentElements[] = $el; + } else { + // the new list of selectors to add + $selectorsMultiplied = array(); + + // merge the current list of non parent selector elements + // on to the current list of selectors to add + if( $currentElements ){ + $this->mergeElementsOnToSelectors( $currentElements, $newSelectors); + } + + // loop through our current selectors + foreach($newSelectors as $sel){ + + // if we don't have any parent paths, the & might be in a mixin so that it can be used + // whether there are parents or not + if( !$context ){ + // the combinator used on el should now be applied to the next element instead so that + // it is not lost + if( $sel ){ + $sel[0]->elements = array_slice($sel[0]->elements,0); + $sel[0]->elements[] = new Less_Tree_Element($el->combinator, '', $el->index, $el->currentFileInfo ); + } + $selectorsMultiplied[] = $sel; + }else { + + // and the parent selectors + foreach($context as $parentSel){ + // We need to put the current selectors + // then join the last selector's elements on to the parents selectors + + // our new selector path + $newSelectorPath = array(); + // selectors from the parent after the join + $afterParentJoin = array(); + $newJoinedSelectorEmpty = true; + + //construct the joined selector - if & is the first thing this will be empty, + // if not newJoinedSelector will be the last set of elements in the selector + if( $sel ){ + $newSelectorPath = $sel; + $lastSelector = array_pop($newSelectorPath); + $newJoinedSelector = $selector->createDerived( array_slice($lastSelector->elements,0) ); + $newJoinedSelectorEmpty = false; + } + else { + $newJoinedSelector = $selector->createDerived(array()); + } + + //put together the parent selectors after the join + if ( count($parentSel) > 1) { + $afterParentJoin = array_merge($afterParentJoin, array_slice($parentSel,1) ); + } + + if ( $parentSel ){ + $newJoinedSelectorEmpty = false; + + // join the elements so far with the first part of the parent + $newJoinedSelector->elements[] = new Less_Tree_Element( $el->combinator, $parentSel[0]->elements[0]->value, $el->index, $el->currentFileInfo); + + $newJoinedSelector->elements = array_merge( $newJoinedSelector->elements, array_slice($parentSel[0]->elements, 1) ); + } + + if (!$newJoinedSelectorEmpty) { + // now add the joined selector + $newSelectorPath[] = $newJoinedSelector; + } + + // and the rest of the parent + $newSelectorPath = array_merge($newSelectorPath, $afterParentJoin); + + // add that to our new set of selectors + $selectorsMultiplied[] = $newSelectorPath; + } + } + } + + // our new selectors has been multiplied, so reset the state + $newSelectors = $selectorsMultiplied; + $currentElements = array(); + } + } + + // if we have any elements left over (e.g. .a& .b == .b) + // add them on to all the current selectors + if( $currentElements ){ + $this->mergeElementsOnToSelectors($currentElements, $newSelectors); + } + foreach( $newSelectors as $new_sel){ + if( $new_sel ){ + $paths[] = $new_sel; + } + } + } + + function mergeElementsOnToSelectors( $elements, &$selectors){ + + if( !$selectors ){ + $selectors[] = array( new Less_Tree_Selector($elements) ); + return; + } + + + foreach( $selectors as &$sel){ + + // if the previous thing in sel is a parent this needs to join on to it + if( $sel ){ + $last = count($sel)-1; + $sel[$last] = $sel[$last]->createDerived( array_merge($sel[$last]->elements, $elements) ); + }else{ + $sel[] = new Less_Tree_Selector( $elements ); + } + } + } +} + + +/** + * RulesetCall + * + * @package Less + * @subpackage tree + */ +class Less_Tree_RulesetCall extends Less_Tree{ + + public $variable; + public $type = "RulesetCall"; + + public function __construct($variable){ + $this->variable = $variable; + } + + public function accept($visitor) {} + + public function compile( $env ){ + $variable = new Less_Tree_Variable($this->variable); + $detachedRuleset = $variable->compile($env); + return $detachedRuleset->callEval($env); + } +} + + + +/** + * Selector + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Selector extends Less_Tree{ + + public $elements; + public $condition; + public $extendList = array(); + public $_css; + public $index; + public $evaldCondition = false; + public $type = 'Selector'; + public $currentFileInfo = array(); + public $isReferenced; + public $mediaEmpty; + + public $elements_len = 0; + + public $_oelements; + public $_oelements_len; + public $cacheable = true; + + /** + * @param boolean $isReferenced + */ + public function __construct( $elements, $extendList = array() , $condition = null, $index=null, $currentFileInfo=null, $isReferenced=null ){ + + $this->elements = $elements; + $this->elements_len = count($elements); + $this->extendList = $extendList; + $this->condition = $condition; + if( $currentFileInfo ){ + $this->currentFileInfo = $currentFileInfo; + } + $this->isReferenced = $isReferenced; + if( !$condition ){ + $this->evaldCondition = true; + } + + $this->CacheElements(); + } + + public function accept($visitor) { + $this->elements = $visitor->visitArray($this->elements); + $this->extendList = $visitor->visitArray($this->extendList); + if( $this->condition ){ + $this->condition = $visitor->visitObj($this->condition); + } + + if( $visitor instanceof Less_Visitor_extendFinder ){ + $this->CacheElements(); + } + } + + public function createDerived( $elements, $extendList = null, $evaldCondition = null ){ + $newSelector = new Less_Tree_Selector( $elements, ($extendList ? $extendList : $this->extendList), null, $this->index, $this->currentFileInfo, $this->isReferenced); + $newSelector->evaldCondition = $evaldCondition ? $evaldCondition : $this->evaldCondition; + return $newSelector; + } + + + public function match( $other ){ + + if( !$other->_oelements || ($this->elements_len < $other->_oelements_len) ){ + return 0; + } + + for( $i = 0; $i < $other->_oelements_len; $i++ ){ + if( $this->elements[$i]->value !== $other->_oelements[$i]) { + return 0; + } + } + + return $other->_oelements_len; // return number of matched elements + } + + + public function CacheElements(){ + + $this->_oelements = array(); + $css = ''; + + foreach($this->elements as $v){ + + $css .= $v->combinator; + if( !$v->value_is_object ){ + $css .= $v->value; + continue; + } + + if( !property_exists($v->value,'value') || !is_string($v->value->value) ){ + $this->cacheable = false; + return; + } + $css .= $v->value->value; + } + + $this->_oelements_len = preg_match_all('/[,&#\.\w-](?:[\w-]|(?:\\\\.))*/', $css, $matches); + if( $this->_oelements_len ){ + $this->_oelements = $matches[0]; + + if( $this->_oelements[0] === '&' ){ + array_shift($this->_oelements); + $this->_oelements_len--; + } + } + } + + public function isJustParentSelector(){ + return !$this->mediaEmpty && + count($this->elements) === 1 && + $this->elements[0]->value === '&' && + ($this->elements[0]->combinator === ' ' || $this->elements[0]->combinator === ''); + } + + public function compile($env) { + + $elements = array(); + foreach($this->elements as $el){ + $elements[] = $el->compile($env); + } + + $extendList = array(); + foreach($this->extendList as $el){ + $extendList[] = $el->compile($el); + } + + $evaldCondition = false; + if( $this->condition ){ + $evaldCondition = $this->condition->compile($env); + } + + return $this->createDerived( $elements, $extendList, $evaldCondition ); + } + + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output, $firstSelector = true ){ + + if( !$firstSelector && $this->elements[0]->combinator === "" ){ + $output->add(' ', $this->currentFileInfo, $this->index); + } + + foreach($this->elements as $element){ + $element->genCSS( $output ); + } + } + + public function markReferenced(){ + $this->isReferenced = true; + } + + public function getIsReferenced(){ + return !isset($this->currentFileInfo['reference']) || !$this->currentFileInfo['reference'] || $this->isReferenced; + } + + public function getIsOutput(){ + return $this->evaldCondition; + } + +} + + +/** + * UnicodeDescriptor + * + * @package Less + * @subpackage tree + */ +class Less_Tree_UnicodeDescriptor extends Less_Tree{ + + public $value; + public $type = 'UnicodeDescriptor'; + + public function __construct($value){ + $this->value = $value; + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + $output->add( $this->value ); + } + + public function compile(){ + return $this; + } +} + + + +/** + * Unit + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Unit extends Less_Tree{ + + var $numerator = array(); + var $denominator = array(); + public $backupUnit; + public $type = 'Unit'; + + public function __construct($numerator = array(), $denominator = array(), $backupUnit = null ){ + $this->numerator = $numerator; + $this->denominator = $denominator; + $this->backupUnit = $backupUnit; + } + + public function __clone(){ + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + + if( $this->numerator ){ + $output->add( $this->numerator[0] ); + }elseif( $this->denominator ){ + $output->add( $this->denominator[0] ); + }elseif( !Less_Parser::$options['strictUnits'] && $this->backupUnit ){ + $output->add( $this->backupUnit ); + return ; + } + } + + public function toString(){ + $returnStr = implode('*',$this->numerator); + foreach($this->denominator as $d){ + $returnStr .= '/'.$d; + } + return $returnStr; + } + + public function __toString(){ + return $this->toString(); + } + + + /** + * @param Less_Tree_Unit $other + */ + public function compare($other) { + return $this->is( $other->toString() ) ? 0 : -1; + } + + public function is($unitString){ + return $this->toString() === $unitString; + } + + public function isLength(){ + $css = $this->toCSS(); + return !!preg_match('/px|em|%|in|cm|mm|pc|pt|ex/',$css); + } + + public function isAngle() { + return isset( Less_Tree_UnitConversions::$angle[$this->toCSS()] ); + } + + public function isEmpty(){ + return !$this->numerator && !$this->denominator; + } + + public function isSingular() { + return count($this->numerator) <= 1 && !$this->denominator; + } + + + public function usedUnits(){ + $result = array(); + + foreach(Less_Tree_UnitConversions::$groups as $groupName){ + $group = Less_Tree_UnitConversions::${$groupName}; + + foreach($this->numerator as $atomicUnit){ + if( isset($group[$atomicUnit]) && !isset($result[$groupName]) ){ + $result[$groupName] = $atomicUnit; + } + } + + foreach($this->denominator as $atomicUnit){ + if( isset($group[$atomicUnit]) && !isset($result[$groupName]) ){ + $result[$groupName] = $atomicUnit; + } + } + } + + return $result; + } + + public function cancel(){ + $counter = array(); + $backup = null; + + foreach($this->numerator as $atomicUnit){ + if( !$backup ){ + $backup = $atomicUnit; + } + $counter[$atomicUnit] = ( isset($counter[$atomicUnit]) ? $counter[$atomicUnit] : 0) + 1; + } + + foreach($this->denominator as $atomicUnit){ + if( !$backup ){ + $backup = $atomicUnit; + } + $counter[$atomicUnit] = ( isset($counter[$atomicUnit]) ? $counter[$atomicUnit] : 0) - 1; + } + + $this->numerator = array(); + $this->denominator = array(); + + foreach($counter as $atomicUnit => $count){ + if( $count > 0 ){ + for( $i = 0; $i < $count; $i++ ){ + $this->numerator[] = $atomicUnit; + } + }elseif( $count < 0 ){ + for( $i = 0; $i < -$count; $i++ ){ + $this->denominator[] = $atomicUnit; + } + } + } + + if( !$this->numerator && !$this->denominator && $backup ){ + $this->backupUnit = $backup; + } + + sort($this->numerator); + sort($this->denominator); + } + + +} + + + +/** + * UnitConversions + * + * @package Less + * @subpackage tree + */ +class Less_Tree_UnitConversions{ + + public static $groups = array('length','duration','angle'); + + public static $length = array( + 'm'=> 1, + 'cm'=> 0.01, + 'mm'=> 0.001, + 'in'=> 0.0254, + 'px'=> 0.000264583, // 0.0254 / 96, + 'pt'=> 0.000352778, // 0.0254 / 72, + 'pc'=> 0.004233333, // 0.0254 / 72 * 12 + ); + + public static $duration = array( + 's'=> 1, + 'ms'=> 0.001 + ); + + public static $angle = array( + 'rad' => 0.1591549430919, // 1/(2*M_PI), + 'deg' => 0.002777778, // 1/360, + 'grad'=> 0.0025, // 1/400, + 'turn'=> 1 + ); + +} + +/** + * Url + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Url extends Less_Tree{ + + public $attrs; + public $value; + public $currentFileInfo; + public $isEvald; + public $type = 'Url'; + + public function __construct($value, $currentFileInfo = null, $isEvald = null){ + $this->value = $value; + $this->currentFileInfo = $currentFileInfo; + $this->isEvald = $isEvald; + } + + public function accept( $visitor ){ + $this->value = $visitor->visitObj($this->value); + } + + /** + * @see Less_Tree::genCSS + */ + public function genCSS( $output ){ + $output->add( 'url(' ); + $this->value->genCSS( $output ); + $output->add( ')' ); + } + + /** + * @param Less_Functions $ctx + */ + public function compile($ctx){ + $val = $this->value->compile($ctx); + + if( !$this->isEvald ){ + // Add the base path if the URL is relative + if( Less_Parser::$options['relativeUrls'] + && $this->currentFileInfo + && is_string($val->value) + && Less_Environment::isPathRelative($val->value) + ){ + $rootpath = $this->currentFileInfo['uri_root']; + if ( !$val->quote ){ + $rootpath = preg_replace('/[\(\)\'"\s]/', '\\$1', $rootpath ); + } + $val->value = $rootpath . $val->value; + } + + $val->value = Less_Environment::normalizePath( $val->value); + } + + // Add cache buster if enabled + if( Less_Parser::$options['urlArgs'] ){ + if( !preg_match('/^\s*data:/',$val->value) ){ + $delimiter = strpos($val->value,'?') === false ? '?' : '&'; + $urlArgs = $delimiter . Less_Parser::$options['urlArgs']; + $hash_pos = strpos($val->value,'#'); + if( $hash_pos !== false ){ + $val->value = substr_replace($val->value,$urlArgs, $hash_pos, 0); + } else { + $val->value .= $urlArgs; + } + } + } + + return new Less_Tree_URL($val, $this->currentFileInfo, true); + } + +} + + +/** + * Value + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Value extends Less_Tree{ + + public $type = 'Value'; + public $value; + + public function __construct($value){ + $this->value = $value; + } + + public function accept($visitor) { + $this->value = $visitor->visitArray($this->value); + } + + public function compile($env){ + + $ret = array(); + $i = 0; + foreach($this->value as $i => $v){ + $ret[] = $v->compile($env); + } + if( $i > 0 ){ + return new Less_Tree_Value($ret); + } + return $ret[0]; + } + + /** + * @see Less_Tree::genCSS + */ + function genCSS( $output ){ + $len = count($this->value); + for($i = 0; $i < $len; $i++ ){ + $this->value[$i]->genCSS( $output ); + if( $i+1 < $len ){ + $output->add( Less_Environment::$_outputMap[','] ); + } + } + } + +} + + +/** + * Variable + * + * @package Less + * @subpackage tree + */ +class Less_Tree_Variable extends Less_Tree{ + + public $name; + public $index; + public $currentFileInfo; + public $evaluating = false; + public $type = 'Variable'; + + /** + * @param string $name + */ + public function __construct($name, $index = null, $currentFileInfo = null) { + $this->name = $name; + $this->index = $index; + $this->currentFileInfo = $currentFileInfo; + } + + public function compile($env) { + + if( $this->name[1] === '@' ){ + $v = new Less_Tree_Variable(substr($this->name, 1), $this->index + 1, $this->currentFileInfo); + $name = '@' . $v->compile($env)->value; + }else{ + $name = $this->name; + } + + if ($this->evaluating) { + throw new Less_Exception_Compiler("Recursive variable definition for " . $name, null, $this->index, $this->currentFileInfo); + } + + $this->evaluating = true; + + foreach($env->frames as $frame){ + if( $v = $frame->variable($name) ){ + $r = $v->value->compile($env); + $this->evaluating = false; + return $r; + } + } + + throw new Less_Exception_Compiler("variable " . $name . " is undefined in file ".$this->currentFileInfo["filename"], null, $this->index, $this->currentFileInfo); + } + +} + + + +class Less_Tree_Mixin_Call extends Less_Tree{ + + public $selector; + public $arguments; + public $index; + public $currentFileInfo; + + public $important; + public $type = 'MixinCall'; + + /** + * less.js: tree.mixin.Call + * + */ + public function __construct($elements, $args, $index, $currentFileInfo, $important = false){ + $this->selector = new Less_Tree_Selector($elements); + $this->arguments = $args; + $this->index = $index; + $this->currentFileInfo = $currentFileInfo; + $this->important = $important; + } + + //function accept($visitor){ + // $this->selector = $visitor->visit($this->selector); + // $this->arguments = $visitor->visit($this->arguments); + //} + + + public function compile($env){ + + $rules = array(); + $match = false; + $isOneFound = false; + $candidates = array(); + $defaultUsed = false; + $conditionResult = array(); + + $args = array(); + foreach($this->arguments as $a){ + $args[] = array('name'=> $a['name'], 'value' => $a['value']->compile($env) ); + } + + foreach($env->frames as $frame){ + + $mixins = $frame->find($this->selector); + + if( !$mixins ){ + continue; + } + + $isOneFound = true; + $defNone = 0; + $defTrue = 1; + $defFalse = 2; + + // To make `default()` function independent of definition order we have two "subpasses" here. + // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`), + // and build candidate list with corresponding flags. Then, when we know all possible matches, + // we make a final decision. + + $mixins_len = count($mixins); + for( $m = 0; $m < $mixins_len; $m++ ){ + $mixin = $mixins[$m]; + + if( $this->IsRecursive( $env, $mixin ) ){ + continue; + } + + if( $mixin->matchArgs($args, $env) ){ + + $candidate = array('mixin' => $mixin, 'group' => $defNone); + + if( $mixin instanceof Less_Tree_Ruleset ){ + + for( $f = 0; $f < 2; $f++ ){ + Less_Tree_DefaultFunc::value($f); + $conditionResult[$f] = $mixin->matchCondition( $args, $env); + } + if( $conditionResult[0] || $conditionResult[1] ){ + if( $conditionResult[0] != $conditionResult[1] ){ + $candidate['group'] = $conditionResult[1] ? $defTrue : $defFalse; + } + + $candidates[] = $candidate; + } + }else{ + $candidates[] = $candidate; + } + + $match = true; + } + } + + Less_Tree_DefaultFunc::reset(); + + + $count = array(0, 0, 0); + for( $m = 0; $m < count($candidates); $m++ ){ + $count[ $candidates[$m]['group'] ]++; + } + + if( $count[$defNone] > 0 ){ + $defaultResult = $defFalse; + } else { + $defaultResult = $defTrue; + if( ($count[$defTrue] + $count[$defFalse]) > 1 ){ + throw new Exception( 'Ambiguous use of `default()` found when matching for `'. $this->format($args) + '`' ); + } + } + + + $candidates_length = count($candidates); + $length_1 = ($candidates_length == 1); + + for( $m = 0; $m < $candidates_length; $m++){ + $candidate = $candidates[$m]['group']; + if( ($candidate === $defNone) || ($candidate === $defaultResult) ){ + try{ + $mixin = $candidates[$m]['mixin']; + if( !($mixin instanceof Less_Tree_Mixin_Definition) ){ + $mixin = new Less_Tree_Mixin_Definition('', array(), $mixin->rules, null, false); + $mixin->originalRuleset = $mixins[$m]->originalRuleset; + } + $rules = array_merge($rules, $mixin->evalCall($env, $args, $this->important)->rules); + } catch (Exception $e) { + //throw new Less_Exception_Compiler($e->getMessage(), $e->index, null, $this->currentFileInfo['filename']); + throw new Less_Exception_Compiler($e->getMessage(), null, null, $this->currentFileInfo); + } + } + } + + if( $match ){ + if( !$this->currentFileInfo || !isset($this->currentFileInfo['reference']) || !$this->currentFileInfo['reference'] ){ + Less_Tree::ReferencedArray($rules); + } + + return $rules; + } + } + + if( $isOneFound ){ + throw new Less_Exception_Compiler('No matching definition was found for `'.$this->Format( $args ).'`', null, $this->index, $this->currentFileInfo); + + }else{ + throw new Less_Exception_Compiler(trim($this->selector->toCSS()) . " is undefined in ".$this->currentFileInfo['filename'], null, $this->index); + } + + } + + /** + * Format the args for use in exception messages + * + */ + private function Format($args){ + $message = array(); + if( $args ){ + foreach($args as $a){ + $argValue = ''; + if( $a['name'] ){ + $argValue += $a['name']+':'; + } + if( is_object($a['value']) ){ + $argValue += $a['value']->toCSS(); + }else{ + $argValue += '???'; + } + $message[] = $argValue; + } + } + return implode(', ',$message); + } + + + /** + * Are we in a recursive mixin call? + * + * @return bool + */ + private function IsRecursive( $env, $mixin ){ + + foreach($env->frames as $recur_frame){ + if( !($mixin instanceof Less_Tree_Mixin_Definition) ){ + + if( $mixin === $recur_frame ){ + return true; + } + + if( isset($recur_frame->originalRuleset) && $mixin->ruleset_id === $recur_frame->originalRuleset ){ + return true; + } + } + } + + return false; + } + +} + + + + +class Less_Tree_Mixin_Definition extends Less_Tree_Ruleset{ + public $name; + public $selectors; + public $params; + public $arity = 0; + public $rules; + public $lookups = array(); + public $required = 0; + public $frames = array(); + public $condition; + public $variadic; + public $type = 'MixinDefinition'; + + + // less.js : /lib/less/tree/mixin.js : tree.mixin.Definition + public function __construct($name, $params, $rules, $condition, $variadic = false, $frames = array() ){ + $this->name = $name; + $this->selectors = array(new Less_Tree_Selector(array( new Less_Tree_Element(null, $name)))); + + $this->params = $params; + $this->condition = $condition; + $this->variadic = $variadic; + $this->rules = $rules; + + if( $params ){ + $this->arity = count($params); + foreach( $params as $p ){ + if (! isset($p['name']) || ($p['name'] && !isset($p['value']))) { + $this->required++; + } + } + } + + $this->frames = $frames; + $this->SetRulesetIndex(); + } + + + + //function accept( $visitor ){ + // $this->params = $visitor->visit($this->params); + // $this->rules = $visitor->visit($this->rules); + // $this->condition = $visitor->visit($this->condition); + //} + + + public function toCSS(){ + return ''; + } + + // less.js : /lib/less/tree/mixin.js : tree.mixin.Definition.evalParams + public function compileParams($env, $mixinFrames, $args = array() , &$evaldArguments = array() ){ + $frame = new Less_Tree_Ruleset(null, array()); + $params = $this->params; + $mixinEnv = null; + $argsLength = 0; + + if( $args ){ + $argsLength = count($args); + for($i = 0; $i < $argsLength; $i++ ){ + $arg = $args[$i]; + + if( $arg && $arg['name'] ){ + $isNamedFound = false; + + foreach($params as $j => $param){ + if( !isset($evaldArguments[$j]) && $arg['name'] === $params[$j]['name']) { + $evaldArguments[$j] = $arg['value']->compile($env); + array_unshift($frame->rules, new Less_Tree_Rule( $arg['name'], $arg['value']->compile($env) ) ); + $isNamedFound = true; + break; + } + } + if ($isNamedFound) { + array_splice($args, $i, 1); + $i--; + $argsLength--; + continue; + } else { + throw new Less_Exception_Compiler("Named argument for " . $this->name .' '.$args[$i]['name'] . ' not found'); + } + } + } + } + + $argIndex = 0; + foreach($params as $i => $param){ + + if ( isset($evaldArguments[$i]) ){ continue; } + + $arg = null; + if( isset($args[$argIndex]) ){ + $arg = $args[$argIndex]; + } + + if (isset($param['name']) && $param['name']) { + + if( isset($param['variadic']) ){ + $varargs = array(); + for ($j = $argIndex; $j < $argsLength; $j++) { + $varargs[] = $args[$j]['value']->compile($env); + } + $expression = new Less_Tree_Expression($varargs); + array_unshift($frame->rules, new Less_Tree_Rule($param['name'], $expression->compile($env))); + }else{ + $val = ($arg && $arg['value']) ? $arg['value'] : false; + + if ($val) { + $val = $val->compile($env); + } else if ( isset($param['value']) ) { + + if( !$mixinEnv ){ + $mixinEnv = new Less_Environment(); + $mixinEnv->frames = array_merge( array($frame), $mixinFrames); + } + + $val = $param['value']->compile($mixinEnv); + $frame->resetCache(); + } else { + throw new Less_Exception_Compiler("Wrong number of arguments for " . $this->name . " (" . $argsLength . ' for ' . $this->arity . ")"); + } + + array_unshift($frame->rules, new Less_Tree_Rule($param['name'], $val)); + $evaldArguments[$i] = $val; + } + } + + if ( isset($param['variadic']) && $args) { + for ($j = $argIndex; $j < $argsLength; $j++) { + $evaldArguments[$j] = $args[$j]['value']->compile($env); + } + } + $argIndex++; + } + + ksort($evaldArguments); + $evaldArguments = array_values($evaldArguments); + + return $frame; + } + + public function compile($env) { + if( $this->frames ){ + return new Less_Tree_Mixin_Definition($this->name, $this->params, $this->rules, $this->condition, $this->variadic, $this->frames ); + } + return new Less_Tree_Mixin_Definition($this->name, $this->params, $this->rules, $this->condition, $this->variadic, $env->frames ); + } + + public function evalCall($env, $args = NULL, $important = NULL) { + + Less_Environment::$mixin_stack++; + + $_arguments = array(); + + if( $this->frames ){ + $mixinFrames = array_merge($this->frames, $env->frames); + }else{ + $mixinFrames = $env->frames; + } + + $frame = $this->compileParams($env, $mixinFrames, $args, $_arguments); + + $ex = new Less_Tree_Expression($_arguments); + array_unshift($frame->rules, new Less_Tree_Rule('@arguments', $ex->compile($env))); + + + $ruleset = new Less_Tree_Ruleset(null, $this->rules); + $ruleset->originalRuleset = $this->ruleset_id; + + + $ruleSetEnv = new Less_Environment(); + $ruleSetEnv->frames = array_merge( array($this, $frame), $mixinFrames ); + $ruleset = $ruleset->compile( $ruleSetEnv ); + + if( $important ){ + $ruleset = $ruleset->makeImportant(); + } + + Less_Environment::$mixin_stack--; + + return $ruleset; + } + + + public function matchCondition($args, $env) { + + if( !$this->condition ){ + return true; + } + + // set array to prevent error on array_merge + if(!is_array($this->frames)) { + $this->frames = array(); + } + + $frame = $this->compileParams($env, array_merge($this->frames,$env->frames), $args ); + + $compile_env = new Less_Environment(); + $compile_env->frames = array_merge( + array($frame) // the parameter variables + , $this->frames // the parent namespace/mixin frames + , $env->frames // the current environment frames + ); + + $compile_env->functions = $env->functions; + + return (bool)$this->condition->compile($compile_env); + } + + public function matchArgs($args, $env = NULL){ + $argsLength = count($args); + + if( !$this->variadic ){ + if( $argsLength < $this->required ){ + return false; + } + if( $argsLength > count($this->params) ){ + return false; + } + }else{ + if( $argsLength < ($this->required - 1)){ + return false; + } + } + + $len = min($argsLength, $this->arity); + + for( $i = 0; $i < $len; $i++ ){ + if( !isset($this->params[$i]['name']) && !isset($this->params[$i]['variadic']) ){ + if( $args[$i]['value']->compile($env)->toCSS() != $this->params[$i]['value']->compile($env)->toCSS() ){ + return false; + } + } + } + + return true; + } + +} + + +/** + * Extend Finder Visitor + * + * @package Less + * @subpackage visitor + */ +class Less_Visitor_extendFinder extends Less_Visitor{ + + public $contexts = array(); + public $allExtendsStack; + public $foundExtends; + + public function __construct(){ + $this->contexts = array(); + $this->allExtendsStack = array(array()); + parent::__construct(); + } + + /** + * @param Less_Tree_Ruleset $root + */ + public function run($root){ + $root = $this->visitObj($root); + $root->allExtends =& $this->allExtendsStack[0]; + return $root; + } + + public function visitRule($ruleNode, &$visitDeeper ){ + $visitDeeper = false; + } + + public function visitMixinDefinition( $mixinDefinitionNode, &$visitDeeper ){ + $visitDeeper = false; + } + + public function visitRuleset($rulesetNode){ + + if( $rulesetNode->root ){ + return; + } + + $allSelectorsExtendList = array(); + + // get &:extend(.a); rules which apply to all selectors in this ruleset + if( $rulesetNode->rules ){ + foreach($rulesetNode->rules as $rule){ + if( $rule instanceof Less_Tree_Extend ){ + $allSelectorsExtendList[] = $rule; + $rulesetNode->extendOnEveryPath = true; + } + } + } + + + // now find every selector and apply the extends that apply to all extends + // and the ones which apply to an individual extend + foreach($rulesetNode->paths as $selectorPath){ + $selector = end($selectorPath); //$selectorPath[ count($selectorPath)-1]; + + $j = 0; + foreach($selector->extendList as $extend){ + $this->allExtendsStackPush($rulesetNode, $selectorPath, $extend, $j); + } + foreach($allSelectorsExtendList as $extend){ + $this->allExtendsStackPush($rulesetNode, $selectorPath, $extend, $j); + } + } + + $this->contexts[] = $rulesetNode->selectors; + } + + public function allExtendsStackPush($rulesetNode, $selectorPath, $extend, &$j){ + $this->foundExtends = true; + $extend = clone $extend; + $extend->findSelfSelectors( $selectorPath ); + $extend->ruleset = $rulesetNode; + if( $j === 0 ){ + $extend->firstExtendOnThisSelectorPath = true; + } + + $end_key = count($this->allExtendsStack)-1; + $this->allExtendsStack[$end_key][] = $extend; + $j++; + } + + + public function visitRulesetOut( $rulesetNode ){ + if( !is_object($rulesetNode) || !$rulesetNode->root ){ + array_pop($this->contexts); + } + } + + public function visitMedia( $mediaNode ){ + $mediaNode->allExtends = array(); + $this->allExtendsStack[] =& $mediaNode->allExtends; + } + + public function visitMediaOut(){ + array_pop($this->allExtendsStack); + } + + public function visitDirective( $directiveNode ){ + $directiveNode->allExtends = array(); + $this->allExtendsStack[] =& $directiveNode->allExtends; + } + + public function visitDirectiveOut(){ + array_pop($this->allExtendsStack); + } +} + + + + +/* +class Less_Visitor_import extends Less_VisitorReplacing{ + + public $_visitor; + public $_importer; + public $importCount; + + function __construct( $evalEnv ){ + $this->env = $evalEnv; + $this->importCount = 0; + parent::__construct(); + } + + + function run( $root ){ + $root = $this->visitObj($root); + $this->isFinished = true; + + //if( $this->importCount === 0) { + // $this->_finish(); + //} + } + + function visitImport($importNode, &$visitDeeper ){ + $importVisitor = $this; + $inlineCSS = $importNode->options['inline']; + + if( !$importNode->css || $inlineCSS ){ + $evaldImportNode = $importNode->compileForImport($this->env); + + if( $evaldImportNode && (!$evaldImportNode->css || $inlineCSS) ){ + $importNode = $evaldImportNode; + $this->importCount++; + $env = clone $this->env; + + if( (isset($importNode->options['multiple']) && $importNode->options['multiple']) ){ + $env->importMultiple = true; + } + + //get path & uri + $path_and_uri = null; + if( is_callable(Less_Parser::$options['import_callback']) ){ + $path_and_uri = call_user_func(Less_Parser::$options['import_callback'],$importNode); + } + + if( !$path_and_uri ){ + $path_and_uri = $importNode->PathAndUri(); + } + + if( $path_and_uri ){ + list($full_path, $uri) = $path_and_uri; + }else{ + $full_path = $uri = $importNode->getPath(); + } + + + //import once + if( $importNode->skip( $full_path, $env) ){ + return array(); + } + + if( $importNode->options['inline'] ){ + //todo needs to reference css file not import + //$contents = new Less_Tree_Anonymous($importNode->root, 0, array('filename'=>$importNode->importedFilename), true ); + + Less_Parser::AddParsedFile($full_path); + $contents = new Less_Tree_Anonymous( file_get_contents($full_path), 0, array(), true ); + + if( $importNode->features ){ + return new Less_Tree_Media( array($contents), $importNode->features->value ); + } + + return array( $contents ); + } + + + // css ? + if( $importNode->css ){ + $features = ( $importNode->features ? $importNode->features->compile($env) : null ); + return new Less_Tree_Import( $importNode->compilePath( $env), $features, $importNode->options, $this->index); + } + + return $importNode->ParseImport( $full_path, $uri, $env ); + } + + } + + $visitDeeper = false; + return $importNode; + } + + + function visitRule( $ruleNode, &$visitDeeper ){ + $visitDeeper = false; + return $ruleNode; + } + + function visitDirective($directiveNode, $visitArgs){ + array_unshift($this->env->frames,$directiveNode); + return $directiveNode; + } + + function visitDirectiveOut($directiveNode) { + array_shift($this->env->frames); + } + + function visitMixinDefinition($mixinDefinitionNode, $visitArgs) { + array_unshift($this->env->frames,$mixinDefinitionNode); + return $mixinDefinitionNode; + } + + function visitMixinDefinitionOut($mixinDefinitionNode) { + array_shift($this->env->frames); + } + + function visitRuleset($rulesetNode, $visitArgs) { + array_unshift($this->env->frames,$rulesetNode); + return $rulesetNode; + } + + function visitRulesetOut($rulesetNode) { + array_shift($this->env->frames); + } + + function visitMedia($mediaNode, $visitArgs) { + array_unshift($this->env->frames, $mediaNode->ruleset); + return $mediaNode; + } + + function visitMediaOut($mediaNode) { + array_shift($this->env->frames); + } + +} +*/ + + + + +/** + * Join Selector Visitor + * + * @package Less + * @subpackage visitor + */ +class Less_Visitor_joinSelector extends Less_Visitor{ + + public $contexts = array( array() ); + + /** + * @param Less_Tree_Ruleset $root + */ + public function run( $root ){ + return $this->visitObj($root); + } + + public function visitRule( $ruleNode, &$visitDeeper ){ + $visitDeeper = false; + } + + public function visitMixinDefinition( $mixinDefinitionNode, &$visitDeeper ){ + $visitDeeper = false; + } + + public function visitRuleset( $rulesetNode ){ + + $paths = array(); + + if( !$rulesetNode->root ){ + $selectors = array(); + + if( $rulesetNode->selectors && $rulesetNode->selectors ){ + foreach($rulesetNode->selectors as $selector){ + if( $selector->getIsOutput() ){ + $selectors[] = $selector; + } + } + } + + if( !$selectors ){ + $rulesetNode->selectors = null; + $rulesetNode->rules = null; + }else{ + $context = end($this->contexts); //$context = $this->contexts[ count($this->contexts) - 1]; + $paths = $rulesetNode->joinSelectors( $context, $selectors); + } + + $rulesetNode->paths = $paths; + } + + $this->contexts[] = $paths; //different from less.js. Placed after joinSelectors() so that $this->contexts will get correct $paths + } + + public function visitRulesetOut(){ + array_pop($this->contexts); + } + + public function visitMedia($mediaNode) { + $context = end($this->contexts); //$context = $this->contexts[ count($this->contexts) - 1]; + + if( !count($context) || (is_object($context[0]) && $context[0]->multiMedia) ){ + $mediaNode->rules[0]->root = true; + } + } + +} + + + +/** + * Process Extends Visitor + * + * @package Less + * @subpackage visitor + */ +class Less_Visitor_processExtends extends Less_Visitor{ + + public $allExtendsStack; + + /** + * @param Less_Tree_Ruleset $root + */ + public function run( $root ){ + $extendFinder = new Less_Visitor_extendFinder(); + $extendFinder->run( $root ); + if( !$extendFinder->foundExtends){ + return $root; + } + + $root->allExtends = $this->doExtendChaining( $root->allExtends, $root->allExtends); + + $this->allExtendsStack = array(); + $this->allExtendsStack[] = &$root->allExtends; + + return $this->visitObj( $root ); + } + + private function doExtendChaining( $extendsList, $extendsListTarget, $iterationCount = 0){ + // + // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering and pasting + // the selector we would do normally, but we are also adding an extend with the same target selector + // this means this new extend can then go and alter other extends + // + // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors + // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already processed if + // we look at each selector at a time, as is done in visitRuleset + + $extendsToAdd = array(); + + + //loop through comparing every extend with every target extend. + // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place + // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one + // and the second is the target. + // the seperation into two lists allows us to process a subset of chains with a bigger set, as is the + // case when processing media queries + for( $extendIndex = 0, $extendsList_len = count($extendsList); $extendIndex < $extendsList_len; $extendIndex++ ){ + for( $targetExtendIndex = 0; $targetExtendIndex < count($extendsListTarget); $targetExtendIndex++ ){ + + $extend = $extendsList[$extendIndex]; + $targetExtend = $extendsListTarget[$targetExtendIndex]; + + // look for circular references + if( in_array($targetExtend->object_id, $extend->parent_ids,true) ){ + continue; + } + + // find a match in the target extends self selector (the bit before :extend) + $selectorPath = array( $targetExtend->selfSelectors[0] ); + $matches = $this->findMatch( $extend, $selectorPath); + + + if( $matches ){ + + // we found a match, so for each self selector.. + foreach($extend->selfSelectors as $selfSelector ){ + + + // process the extend as usual + $newSelector = $this->extendSelector( $matches, $selectorPath, $selfSelector); + + // but now we create a new extend from it + $newExtend = new Less_Tree_Extend( $targetExtend->selector, $targetExtend->option, 0); + $newExtend->selfSelectors = $newSelector; + + // add the extend onto the list of extends for that selector + end($newSelector)->extendList = array($newExtend); + //$newSelector[ count($newSelector)-1]->extendList = array($newExtend); + + // record that we need to add it. + $extendsToAdd[] = $newExtend; + $newExtend->ruleset = $targetExtend->ruleset; + + //remember its parents for circular references + $newExtend->parent_ids = array_merge($newExtend->parent_ids,$targetExtend->parent_ids,$extend->parent_ids); + + // only process the selector once.. if we have :extend(.a,.b) then multiple + // extends will look at the same selector path, so when extending + // we know that any others will be duplicates in terms of what is added to the css + if( $targetExtend->firstExtendOnThisSelectorPath ){ + $newExtend->firstExtendOnThisSelectorPath = true; + $targetExtend->ruleset->paths[] = $newSelector; + } + } + } + } + } + + if( $extendsToAdd ){ + // try to detect circular references to stop a stack overflow. + // may no longer be needed. $this->extendChainCount++; + if( $iterationCount > 100) { + + try{ + $selectorOne = $extendsToAdd[0]->selfSelectors[0]->toCSS(); + $selectorTwo = $extendsToAdd[0]->selector->toCSS(); + }catch(Exception $e){ + $selectorOne = "{unable to calculate}"; + $selectorTwo = "{unable to calculate}"; + } + + throw new Less_Exception_Parser("extend circular reference detected. One of the circular extends is currently:"+$selectorOne+":extend(" + $selectorTwo+")"); + } + + // now process the new extends on the existing rules so that we can handle a extending b extending c ectending d extending e... + $extendsToAdd = $this->doExtendChaining( $extendsToAdd, $extendsListTarget, $iterationCount+1); + } + + return array_merge($extendsList, $extendsToAdd); + } + + + protected function visitRule( $ruleNode, &$visitDeeper ){ + $visitDeeper = false; + } + + protected function visitMixinDefinition( $mixinDefinitionNode, &$visitDeeper ){ + $visitDeeper = false; + } + + protected function visitSelector( $selectorNode, &$visitDeeper ){ + $visitDeeper = false; + } + + protected function visitRuleset($rulesetNode){ + + + if( $rulesetNode->root ){ + return; + } + + $allExtends = end($this->allExtendsStack); + $paths_len = count($rulesetNode->paths); + + // look at each selector path in the ruleset, find any extend matches and then copy, find and replace + foreach($allExtends as $allExtend){ + for($pathIndex = 0; $pathIndex < $paths_len; $pathIndex++ ){ + + // extending extends happens initially, before the main pass + if( isset($rulesetNode->extendOnEveryPath) && $rulesetNode->extendOnEveryPath ){ + continue; + } + + $selectorPath = $rulesetNode->paths[$pathIndex]; + + if( end($selectorPath)->extendList ){ + continue; + } + + $this->ExtendMatch( $rulesetNode, $allExtend, $selectorPath); + + } + } + } + + + private function ExtendMatch( $rulesetNode, $extend, $selectorPath ){ + $matches = $this->findMatch($extend, $selectorPath); + + if( $matches ){ + foreach($extend->selfSelectors as $selfSelector ){ + $rulesetNode->paths[] = $this->extendSelector($matches, $selectorPath, $selfSelector); + } + } + } + + + + private function findMatch($extend, $haystackSelectorPath ){ + + + if( !$this->HasMatches($extend, $haystackSelectorPath) ){ + return false; + } + + + // + // look through the haystack selector path to try and find the needle - extend.selector + // returns an array of selector matches that can then be replaced + // + $needleElements = $extend->selector->elements; + $potentialMatches = array(); + $potentialMatches_len = 0; + $potentialMatch = null; + $matches = array(); + + + + // loop through the haystack elements + $haystack_path_len = count($haystackSelectorPath); + for($haystackSelectorIndex = 0; $haystackSelectorIndex < $haystack_path_len; $haystackSelectorIndex++ ){ + $hackstackSelector = $haystackSelectorPath[$haystackSelectorIndex]; + + $haystack_elements_len = count($hackstackSelector->elements); + for($hackstackElementIndex = 0; $hackstackElementIndex < $haystack_elements_len; $hackstackElementIndex++ ){ + + $haystackElement = $hackstackSelector->elements[$hackstackElementIndex]; + + // if we allow elements before our match we can add a potential match every time. otherwise only at the first element. + if( $extend->allowBefore || ($haystackSelectorIndex === 0 && $hackstackElementIndex === 0) ){ + $potentialMatches[] = array('pathIndex'=> $haystackSelectorIndex, 'index'=> $hackstackElementIndex, 'matched'=> 0, 'initialCombinator'=> $haystackElement->combinator); + $potentialMatches_len++; + } + + for($i = 0; $i < $potentialMatches_len; $i++ ){ + + $potentialMatch = &$potentialMatches[$i]; + $potentialMatch = $this->PotentialMatch( $potentialMatch, $needleElements, $haystackElement, $hackstackElementIndex ); + + + // if we are still valid and have finished, test whether we have elements after and whether these are allowed + if( $potentialMatch && $potentialMatch['matched'] === $extend->selector->elements_len ){ + $potentialMatch['finished'] = true; + + if( !$extend->allowAfter && ($hackstackElementIndex+1 < $haystack_elements_len || $haystackSelectorIndex+1 < $haystack_path_len) ){ + $potentialMatch = null; + } + } + + // if null we remove, if not, we are still valid, so either push as a valid match or continue + if( $potentialMatch ){ + if( $potentialMatch['finished'] ){ + $potentialMatch['length'] = $extend->selector->elements_len; + $potentialMatch['endPathIndex'] = $haystackSelectorIndex; + $potentialMatch['endPathElementIndex'] = $hackstackElementIndex + 1; // index after end of match + $potentialMatches = array(); // we don't allow matches to overlap, so start matching again + $potentialMatches_len = 0; + $matches[] = $potentialMatch; + } + continue; + } + + array_splice($potentialMatches, $i, 1); + $potentialMatches_len--; + $i--; + } + } + } + + return $matches; + } + + + // Before going through all the nested loops, lets check to see if a match is possible + // Reduces Bootstrap 3.1 compile time from ~6.5s to ~5.6s + private function HasMatches($extend, $haystackSelectorPath){ + + if( !$extend->selector->cacheable ){ + return true; + } + + $first_el = $extend->selector->_oelements[0]; + + foreach($haystackSelectorPath as $hackstackSelector){ + if( !$hackstackSelector->cacheable ){ + return true; + } + + if( in_array($first_el, $hackstackSelector->_oelements) ){ + return true; + } + } + + return false; + } + + + /** + * @param integer $hackstackElementIndex + */ + private function PotentialMatch( $potentialMatch, $needleElements, $haystackElement, $hackstackElementIndex ){ + + + if( $potentialMatch['matched'] > 0 ){ + + // selectors add " " onto the first element. When we use & it joins the selectors together, but if we don't + // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to work out + // what the resulting combinator will be + $targetCombinator = $haystackElement->combinator; + if( $targetCombinator === '' && $hackstackElementIndex === 0 ){ + $targetCombinator = ' '; + } + + if( $needleElements[ $potentialMatch['matched'] ]->combinator !== $targetCombinator ){ + return null; + } + } + + // if we don't match, null our match to indicate failure + if( !$this->isElementValuesEqual( $needleElements[$potentialMatch['matched'] ]->value, $haystackElement->value) ){ + return null; + } + + $potentialMatch['finished'] = false; + $potentialMatch['matched']++; + + return $potentialMatch; + } + + + private function isElementValuesEqual( $elementValue1, $elementValue2 ){ + + if( $elementValue1 === $elementValue2 ){ + return true; + } + + if( is_string($elementValue1) || is_string($elementValue2) ) { + return false; + } + + if( $elementValue1 instanceof Less_Tree_Attribute ){ + return $this->isAttributeValuesEqual( $elementValue1, $elementValue2 ); + } + + $elementValue1 = $elementValue1->value; + if( $elementValue1 instanceof Less_Tree_Selector ){ + return $this->isSelectorValuesEqual( $elementValue1, $elementValue2 ); + } + + return false; + } + + + /** + * @param Less_Tree_Selector $elementValue1 + */ + private function isSelectorValuesEqual( $elementValue1, $elementValue2 ){ + + $elementValue2 = $elementValue2->value; + if( !($elementValue2 instanceof Less_Tree_Selector) || $elementValue1->elements_len !== $elementValue2->elements_len ){ + return false; + } + + for( $i = 0; $i < $elementValue1->elements_len; $i++ ){ + + if( $elementValue1->elements[$i]->combinator !== $elementValue2->elements[$i]->combinator ){ + if( $i !== 0 || ($elementValue1->elements[$i]->combinator || ' ') !== ($elementValue2->elements[$i]->combinator || ' ') ){ + return false; + } + } + + if( !$this->isElementValuesEqual($elementValue1->elements[$i]->value, $elementValue2->elements[$i]->value) ){ + return false; + } + } + + return true; + } + + + /** + * @param Less_Tree_Attribute $elementValue1 + */ + private function isAttributeValuesEqual( $elementValue1, $elementValue2 ){ + + if( $elementValue1->op !== $elementValue2->op || $elementValue1->key !== $elementValue2->key ){ + return false; + } + + if( !$elementValue1->value || !$elementValue2->value ){ + if( $elementValue1->value || $elementValue2->value ) { + return false; + } + return true; + } + + $elementValue1 = ($elementValue1->value->value ? $elementValue1->value->value : $elementValue1->value ); + $elementValue2 = ($elementValue2->value->value ? $elementValue2->value->value : $elementValue2->value ); + + return $elementValue1 === $elementValue2; + } + + + private function extendSelector($matches, $selectorPath, $replacementSelector){ + + //for a set of matches, replace each match with the replacement selector + + $currentSelectorPathIndex = 0; + $currentSelectorPathElementIndex = 0; + $path = array(); + $selectorPath_len = count($selectorPath); + + for($matchIndex = 0, $matches_len = count($matches); $matchIndex < $matches_len; $matchIndex++ ){ + + + $match = $matches[$matchIndex]; + $selector = $selectorPath[ $match['pathIndex'] ]; + + $firstElement = new Less_Tree_Element( + $match['initialCombinator'], + $replacementSelector->elements[0]->value, + $replacementSelector->elements[0]->index, + $replacementSelector->elements[0]->currentFileInfo + ); + + if( $match['pathIndex'] > $currentSelectorPathIndex && $currentSelectorPathElementIndex > 0 ){ + $last_path = end($path); + $last_path->elements = array_merge( $last_path->elements, array_slice( $selectorPath[$currentSelectorPathIndex]->elements, $currentSelectorPathElementIndex)); + $currentSelectorPathElementIndex = 0; + $currentSelectorPathIndex++; + } + + $newElements = array_merge( + array_slice($selector->elements, $currentSelectorPathElementIndex, ($match['index'] - $currentSelectorPathElementIndex) ) // last parameter of array_slice is different than the last parameter of javascript's slice + , array($firstElement) + , array_slice($replacementSelector->elements,1) + ); + + if( $currentSelectorPathIndex === $match['pathIndex'] && $matchIndex > 0 ){ + $last_key = count($path)-1; + $path[$last_key]->elements = array_merge($path[$last_key]->elements,$newElements); + }else{ + $path = array_merge( $path, array_slice( $selectorPath, $currentSelectorPathIndex, $match['pathIndex'] )); + $path[] = new Less_Tree_Selector( $newElements ); + } + + $currentSelectorPathIndex = $match['endPathIndex']; + $currentSelectorPathElementIndex = $match['endPathElementIndex']; + if( $currentSelectorPathElementIndex >= count($selectorPath[$currentSelectorPathIndex]->elements) ){ + $currentSelectorPathElementIndex = 0; + $currentSelectorPathIndex++; + } + } + + if( $currentSelectorPathIndex < $selectorPath_len && $currentSelectorPathElementIndex > 0 ){ + $last_path = end($path); + $last_path->elements = array_merge( $last_path->elements, array_slice($selectorPath[$currentSelectorPathIndex]->elements, $currentSelectorPathElementIndex)); + $currentSelectorPathIndex++; + } + + $slice_len = $selectorPath_len - $currentSelectorPathIndex; + $path = array_merge($path, array_slice($selectorPath, $currentSelectorPathIndex, $slice_len)); + + return $path; + } + + + protected function visitMedia( $mediaNode ){ + $newAllExtends = array_merge( $mediaNode->allExtends, end($this->allExtendsStack) ); + $this->allExtendsStack[] = $this->doExtendChaining($newAllExtends, $mediaNode->allExtends); + } + + protected function visitMediaOut(){ + array_pop( $this->allExtendsStack ); + } + + protected function visitDirective( $directiveNode ){ + $newAllExtends = array_merge( $directiveNode->allExtends, end($this->allExtendsStack) ); + $this->allExtendsStack[] = $this->doExtendChaining($newAllExtends, $directiveNode->allExtends); + } + + protected function visitDirectiveOut(){ + array_pop($this->allExtendsStack); + } + +} + +/** + * toCSS Visitor + * + * @package Less + * @subpackage visitor + */ +class Less_Visitor_toCSS extends Less_VisitorReplacing{ + + private $charset; + + public function __construct(){ + parent::__construct(); + } + + /** + * @param Less_Tree_Ruleset $root + */ + public function run( $root ){ + return $this->visitObj($root); + } + + public function visitRule( $ruleNode ){ + if( $ruleNode->variable ){ + return array(); + } + return $ruleNode; + } + + public function visitMixinDefinition($mixinNode){ + // mixin definitions do not get eval'd - this means they keep state + // so we have to clear that state here so it isn't used if toCSS is called twice + $mixinNode->frames = array(); + return array(); + } + + public function visitExtend(){ + return array(); + } + + public function visitComment( $commentNode ){ + if( $commentNode->isSilent() ){ + return array(); + } + return $commentNode; + } + + public function visitMedia( $mediaNode, &$visitDeeper ){ + $mediaNode->accept($this); + $visitDeeper = false; + + if( !$mediaNode->rules ){ + return array(); + } + return $mediaNode; + } + + public function visitDirective( $directiveNode ){ + if( isset($directiveNode->currentFileInfo['reference']) && (!property_exists($directiveNode,'isReferenced') || !$directiveNode->isReferenced) ){ + return array(); + } + if( $directiveNode->name === '@charset' ){ + // Only output the debug info together with subsequent @charset definitions + // a comment (or @media statement) before the actual @charset directive would + // be considered illegal css as it has to be on the first line + if( isset($this->charset) && $this->charset ){ + + //if( $directiveNode->debugInfo ){ + // $comment = new Less_Tree_Comment('/* ' . str_replace("\n",'',$directiveNode->toCSS())." */\n"); + // $comment->debugInfo = $directiveNode->debugInfo; + // return $this->visit($comment); + //} + + + return array(); + } + $this->charset = true; + } + return $directiveNode; + } + + public function checkPropertiesInRoot( $rulesetNode ){ + + if( !$rulesetNode->firstRoot ){ + return; + } + + foreach($rulesetNode->rules as $ruleNode){ + if( $ruleNode instanceof Less_Tree_Rule && !$ruleNode->variable ){ + $msg = "properties must be inside selector blocks, they cannot be in the root. Index ".$ruleNode->index.($ruleNode->currentFileInfo ? (' Filename: '.$ruleNode->currentFileInfo['filename']) : null); + throw new Less_Exception_Compiler($msg); + } + } + } + + + public function visitRuleset( $rulesetNode, &$visitDeeper ){ + + $visitDeeper = false; + + $this->checkPropertiesInRoot( $rulesetNode ); + + if( $rulesetNode->root ){ + return $this->visitRulesetRoot( $rulesetNode ); + } + + $rulesets = array(); + $rulesetNode->paths = $this->visitRulesetPaths($rulesetNode); + + + // Compile rules and rulesets + $nodeRuleCnt = count($rulesetNode->rules); + for( $i = 0; $i < $nodeRuleCnt; ){ + $rule = $rulesetNode->rules[$i]; + + if( property_exists($rule,'rules') ){ + // visit because we are moving them out from being a child + $rulesets[] = $this->visitObj($rule); + array_splice($rulesetNode->rules,$i,1); + $nodeRuleCnt--; + continue; + } + $i++; + } + + + // accept the visitor to remove rules and refactor itself + // then we can decide now whether we want it or not + if( $nodeRuleCnt > 0 ){ + $rulesetNode->accept($this); + + if( $rulesetNode->rules ){ + + if( count($rulesetNode->rules) > 1 ){ + $this->_mergeRules( $rulesetNode->rules ); + $this->_removeDuplicateRules( $rulesetNode->rules ); + } + + // now decide whether we keep the ruleset + if( $rulesetNode->paths ){ + //array_unshift($rulesets, $rulesetNode); + array_splice($rulesets,0,0,array($rulesetNode)); + } + } + + } + + + if( count($rulesets) === 1 ){ + return $rulesets[0]; + } + return $rulesets; + } + + + /** + * Helper function for visitiRuleset + * + * return array|Less_Tree_Ruleset + */ + private function visitRulesetRoot( $rulesetNode ){ + $rulesetNode->accept( $this ); + if( $rulesetNode->firstRoot || $rulesetNode->rules ){ + return $rulesetNode; + } + return array(); + } + + + /** + * Helper function for visitRuleset() + * + * @return array + */ + private function visitRulesetPaths($rulesetNode){ + + $paths = array(); + foreach($rulesetNode->paths as $p){ + if( $p[0]->elements[0]->combinator === ' ' ){ + $p[0]->elements[0]->combinator = ''; + } + + foreach($p as $pi){ + if( $pi->getIsReferenced() && $pi->getIsOutput() ){ + $paths[] = $p; + break; + } + } + } + + return $paths; + } + + protected function _removeDuplicateRules( &$rules ){ + // remove duplicates + $ruleCache = array(); + for( $i = count($rules)-1; $i >= 0 ; $i-- ){ + $rule = $rules[$i]; + if( $rule instanceof Less_Tree_Rule || $rule instanceof Less_Tree_NameValue ){ + + if( !isset($ruleCache[$rule->name]) ){ + $ruleCache[$rule->name] = $rule; + }else{ + $ruleList =& $ruleCache[$rule->name]; + + if( $ruleList instanceof Less_Tree_Rule || $ruleList instanceof Less_Tree_NameValue ){ + $ruleList = $ruleCache[$rule->name] = array( $ruleCache[$rule->name]->toCSS() ); + } + + $ruleCSS = $rule->toCSS(); + if( array_search($ruleCSS,$ruleList) !== false ){ + array_splice($rules,$i,1); + }else{ + $ruleList[] = $ruleCSS; + } + } + } + } + } + + protected function _mergeRules( &$rules ){ + $groups = array(); + + //obj($rules); + + $rules_len = count($rules); + for( $i = 0; $i < $rules_len; $i++ ){ + $rule = $rules[$i]; + + if( ($rule instanceof Less_Tree_Rule) && $rule->merge ){ + + $key = $rule->name; + if( $rule->important ){ + $key .= ',!'; + } + + if( !isset($groups[$key]) ){ + $groups[$key] = array(); + }else{ + array_splice($rules, $i--, 1); + $rules_len--; + } + + $groups[$key][] = $rule; + } + } + + + foreach($groups as $parts){ + + if( count($parts) > 1 ){ + $rule = $parts[0]; + $spacedGroups = array(); + $lastSpacedGroup = array(); + $parts_mapped = array(); + foreach($parts as $p){ + if( $p->merge === '+' ){ + if( $lastSpacedGroup ){ + $spacedGroups[] = self::toExpression($lastSpacedGroup); + } + $lastSpacedGroup = array(); + } + $lastSpacedGroup[] = $p; + } + + $spacedGroups[] = self::toExpression($lastSpacedGroup); + $rule->value = self::toValue($spacedGroups); + } + } + + } + + public static function toExpression($values){ + $mapped = array(); + foreach($values as $p){ + $mapped[] = $p->value; + } + return new Less_Tree_Expression( $mapped ); + } + + public static function toValue($values){ + //return new Less_Tree_Value($values); ?? + + $mapped = array(); + foreach($values as $p){ + $mapped[] = $p; + } + return new Less_Tree_Value($mapped); + } +} + + + +/** + * Parser Exception + * + * @package Less + * @subpackage exception + */ +class Less_Exception_Parser extends Exception{ + + /** + * The current file + * + * @var Less_ImportedFile + */ + public $currentFile; + + /** + * The current parser index + * + * @var integer + */ + public $index; + + protected $input; + + protected $details = array(); + + + /** + * Constructor + * + * @param string $message + * @param Exception $previous Previous exception + * @param integer $index The current parser index + * @param Less_FileInfo|string $currentFile The file + * @param integer $code The exception code + */ + public function __construct($message = null, Exception $previous = null, $index = null, $currentFile = null, $code = 0){ + + if (PHP_VERSION_ID < 50300) { + $this->previous = $previous; + parent::__construct($message, $code); + } else { + parent::__construct($message, $code, $previous); + } + + $this->currentFile = $currentFile; + $this->index = $index; + + $this->genMessage(); + } + + + protected function getInput(){ + + if( !$this->input && $this->currentFile && $this->currentFile['filename'] ){ + $this->input = file_get_contents( $this->currentFile['filename'] ); + } + } + + + + /** + * Converts the exception to string + * + * @return string + */ + public function genMessage(){ + + if( $this->currentFile && $this->currentFile['filename'] ){ + $this->message .= ' in '.basename($this->currentFile['filename']); + } + + if( $this->index !== null ){ + $this->getInput(); + if( $this->input ){ + $line = self::getLineNumber(); + $this->message .= ' on line '.$line.', column '.self::getColumn(); + + $lines = explode("\n",$this->input); + + $count = count($lines); + $start_line = max(0, $line-3); + $last_line = min($count, $start_line+6); + $num_len = strlen($last_line); + for( $i = $start_line; $i < $last_line; $i++ ){ + $this->message .= "\n".str_pad($i+1,$num_len,'0',STR_PAD_LEFT).'| '.$lines[$i]; + } + } + } + + } + + /** + * Returns the line number the error was encountered + * + * @return integer + */ + public function getLineNumber(){ + if( $this->index ){ + // https://bugs.php.net/bug.php?id=49790 + if (ini_get("mbstring.func_overload")) { + return substr_count(substr($this->input, 0, $this->index), "\n") + 1; + } else { + return substr_count($this->input, "\n", 0, $this->index) + 1; + } + } + return 1; + } + + + /** + * Returns the column the error was encountered + * + * @return integer + */ + public function getColumn(){ + + $part = substr($this->input, 0, $this->index); + $pos = strrpos($part,"\n"); + return $this->index - $pos; + } + +} + + +/** + * Chunk Exception + * + * @package Less + * @subpackage exception + */ +class Less_Exception_Chunk extends Less_Exception_Parser{ + + + protected $parserCurrentIndex = 0; + + protected $emitFrom = 0; + + protected $input_len; + + + /** + * Constructor + * + * @param string $input + * @param Exception $previous Previous exception + * @param integer $index The current parser index + * @param Less_FileInfo|string $currentFile The file + * @param integer $code The exception code + */ + public function __construct($input, Exception $previous = null, $index = null, $currentFile = null, $code = 0){ + + $this->message = 'ParseError: Unexpected input'; //default message + + $this->index = $index; + + $this->currentFile = $currentFile; + + $this->input = $input; + $this->input_len = strlen($input); + + $this->Chunks(); + $this->genMessage(); + } + + + /** + * See less.js chunks() + * We don't actually need the chunks + * + */ + protected function Chunks(){ + $level = 0; + $parenLevel = 0; + $lastMultiCommentEndBrace = null; + $lastOpening = null; + $lastMultiComment = null; + $lastParen = null; + + for( $this->parserCurrentIndex = 0; $this->parserCurrentIndex < $this->input_len; $this->parserCurrentIndex++ ){ + $cc = $this->CharCode($this->parserCurrentIndex); + if ((($cc >= 97) && ($cc <= 122)) || ($cc < 34)) { + // a-z or whitespace + continue; + } + + switch ($cc) { + + // ( + case 40: + $parenLevel++; + $lastParen = $this->parserCurrentIndex; + continue; + + // ) + case 41: + $parenLevel--; + if( $parenLevel < 0 ){ + return $this->fail("missing opening `(`"); + } + continue; + + // ; + case 59: + //if (!$parenLevel) { $this->emitChunk(); } + continue; + + // { + case 123: + $level++; + $lastOpening = $this->parserCurrentIndex; + continue; + + // } + case 125: + $level--; + if( $level < 0 ){ + return $this->fail("missing opening `{`"); + + } + //if (!$level && !$parenLevel) { $this->emitChunk(); } + continue; + // \ + case 92: + if ($this->parserCurrentIndex < $this->input_len - 1) { $this->parserCurrentIndex++; continue; } + return $this->fail("unescaped `\\`"); + + // ", ' and ` + case 34: + case 39: + case 96: + $matched = 0; + $currentChunkStartIndex = $this->parserCurrentIndex; + for ($this->parserCurrentIndex = $this->parserCurrentIndex + 1; $this->parserCurrentIndex < $this->input_len; $this->parserCurrentIndex++) { + $cc2 = $this->CharCode($this->parserCurrentIndex); + if ($cc2 > 96) { continue; } + if ($cc2 == $cc) { $matched = 1; break; } + if ($cc2 == 92) { // \ + if ($this->parserCurrentIndex == $this->input_len - 1) { + return $this->fail("unescaped `\\`"); + } + $this->parserCurrentIndex++; + } + } + if ($matched) { continue; } + return $this->fail("unmatched `" + chr($cc) + "`", $currentChunkStartIndex); + + // /, check for comment + case 47: + if ($parenLevel || ($this->parserCurrentIndex == $this->input_len - 1)) { continue; } + $cc2 = $this->CharCode($this->parserCurrentIndex+1); + if ($cc2 == 47) { + // //, find lnfeed + for ($this->parserCurrentIndex = $this->parserCurrentIndex + 2; $this->parserCurrentIndex < $this->input_len; $this->parserCurrentIndex++) { + $cc2 = $this->CharCode($this->parserCurrentIndex); + if (($cc2 <= 13) && (($cc2 == 10) || ($cc2 == 13))) { break; } + } + } else if ($cc2 == 42) { + // /*, find */ + $lastMultiComment = $currentChunkStartIndex = $this->parserCurrentIndex; + for ($this->parserCurrentIndex = $this->parserCurrentIndex + 2; $this->parserCurrentIndex < $this->input_len - 1; $this->parserCurrentIndex++) { + $cc2 = $this->CharCode($this->parserCurrentIndex); + if ($cc2 == 125) { $lastMultiCommentEndBrace = $this->parserCurrentIndex; } + if ($cc2 != 42) { continue; } + if ($this->CharCode($this->parserCurrentIndex+1) == 47) { break; } + } + if ($this->parserCurrentIndex == $this->input_len - 1) { + return $this->fail("missing closing `*/`", $currentChunkStartIndex); + } + } + continue; + + // *, check for unmatched */ + case 42: + if (($this->parserCurrentIndex < $this->input_len - 1) && ($this->CharCode($this->parserCurrentIndex+1) == 47)) { + return $this->fail("unmatched `/*`"); + } + continue; + } + } + + if( $level !== 0 ){ + if( ($lastMultiComment > $lastOpening) && ($lastMultiCommentEndBrace > $lastMultiComment) ){ + return $this->fail("missing closing `}` or `*/`", $lastOpening); + } else { + return $this->fail("missing closing `}`", $lastOpening); + } + } else if ( $parenLevel !== 0 ){ + return $this->fail("missing closing `)`", $lastParen); + } + + + //chunk didn't fail + + + //$this->emitChunk(true); + } + + public function CharCode($pos){ + return ord($this->input[$pos]); + } + + + public function fail( $msg, $index = null ){ + + if( !$index ){ + $this->index = $this->parserCurrentIndex; + }else{ + $this->index = $index; + } + $this->message = 'ParseError: '.$msg; + } + + + /* + function emitChunk( $force = false ){ + $len = $this->parserCurrentIndex - $this->emitFrom; + if ((($len < 512) && !$force) || !$len) { + return; + } + $chunks[] = substr($this->input, $this->emitFrom, $this->parserCurrentIndex + 1 - $this->emitFrom ); + $this->emitFrom = $this->parserCurrentIndex + 1; + } + */ + +} + + +/** + * Compiler Exception + * + * @package Less + * @subpackage exception + */ +class Less_Exception_Compiler extends Less_Exception_Parser{ + +} + +/** + * Parser output with source map + * + * @package Less + * @subpackage Output + */ +class Less_Output_Mapped extends Less_Output { + + /** + * The source map generator + * + * @var Less_SourceMap_Generator + */ + protected $generator; + + /** + * Current line + * + * @var integer + */ + protected $lineNumber = 0; + + /** + * Current column + * + * @var integer + */ + protected $column = 0; + + /** + * Array of contents map (file and its content) + * + * @var array + */ + protected $contentsMap = array(); + + /** + * Constructor + * + * @param array $contentsMap Array of filename to contents map + * @param Less_SourceMap_Generator $generator + */ + public function __construct(array $contentsMap, $generator){ + $this->contentsMap = $contentsMap; + $this->generator = $generator; + } + + /** + * Adds a chunk to the stack + * The $index for less.php may be different from less.js since less.php does not chunkify inputs + * + * @param string $chunk + * @param string $fileInfo + * @param integer $index + * @param mixed $mapLines + */ + public function add($chunk, $fileInfo = null, $index = 0, $mapLines = null){ + + //ignore adding empty strings + if( $chunk === '' ){ + return; + } + + + $sourceLines = array(); + $sourceColumns = ' '; + + + if( $fileInfo ){ + + $url = $fileInfo['currentUri']; + + if( isset($this->contentsMap[$url]) ){ + $inputSource = substr($this->contentsMap[$url], 0, $index); + $sourceLines = explode("\n", $inputSource); + $sourceColumns = end($sourceLines); + }else{ + throw new Exception('Filename '.$url.' not in contentsMap'); + } + + } + + $lines = explode("\n", $chunk); + $columns = end($lines); + + if($fileInfo){ + + if(!$mapLines){ + $this->generator->addMapping( + $this->lineNumber + 1, // generated_line + $this->column, // generated_column + count($sourceLines), // original_line + strlen($sourceColumns), // original_column + $fileInfo + ); + }else{ + for($i = 0, $count = count($lines); $i < $count; $i++){ + $this->generator->addMapping( + $this->lineNumber + $i + 1, // generated_line + $i === 0 ? $this->column : 0, // generated_column + count($sourceLines) + $i, // original_line + $i === 0 ? strlen($sourceColumns) : 0, // original_column + $fileInfo + ); + } + } + } + + if(count($lines) === 1){ + $this->column += strlen($columns); + }else{ + $this->lineNumber += count($lines) - 1; + $this->column = strlen($columns); + } + + // add only chunk + parent::add($chunk); + } + +} + +/** + * Encode / Decode Base64 VLQ. + * + * @package Less + * @subpackage SourceMap + */ +class Less_SourceMap_Base64VLQ { + + /** + * Shift + * + * @var integer + */ + private $shift = 5; + + /** + * Mask + * + * @var integer + */ + private $mask = 0x1F; // == (1 << shift) == 0b00011111 + + /** + * Continuation bit + * + * @var integer + */ + private $continuationBit = 0x20; // == (mask - 1 ) == 0b00100000 + + /** + * Char to integer map + * + * @var array + */ + private $charToIntMap = array( + 'A' => 0, 'B' => 1, 'C' => 2, 'D' => 3, 'E' => 4, 'F' => 5, 'G' => 6, + 'H' => 7,'I' => 8, 'J' => 9, 'K' => 10, 'L' => 11, 'M' => 12, 'N' => 13, + 'O' => 14, 'P' => 15, 'Q' => 16, 'R' => 17, 'S' => 18, 'T' => 19, 'U' => 20, + 'V' => 21, 'W' => 22, 'X' => 23, 'Y' => 24, 'Z' => 25, 'a' => 26, 'b' => 27, + 'c' => 28, 'd' => 29, 'e' => 30, 'f' => 31, 'g' => 32, 'h' => 33, 'i' => 34, + 'j' => 35, 'k' => 36, 'l' => 37, 'm' => 38, 'n' => 39, 'o' => 40, 'p' => 41, + 'q' => 42, 'r' => 43, 's' => 44, 't' => 45, 'u' => 46, 'v' => 47, 'w' => 48, + 'x' => 49, 'y' => 50, 'z' => 51, 0 => 52, 1 => 53, 2 => 54, 3 => 55, 4 => 56, + 5 => 57, 6 => 58, 7 => 59, 8 => 60, 9 => 61, '+' => 62, '/' => 63, + ); + + /** + * Integer to char map + * + * @var array + */ + private $intToCharMap = array( + 0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D', 4 => 'E', 5 => 'F', 6 => 'G', + 7 => 'H', 8 => 'I', 9 => 'J', 10 => 'K', 11 => 'L', 12 => 'M', 13 => 'N', + 14 => 'O', 15 => 'P', 16 => 'Q', 17 => 'R', 18 => 'S', 19 => 'T', 20 => 'U', + 21 => 'V', 22 => 'W', 23 => 'X', 24 => 'Y', 25 => 'Z', 26 => 'a', 27 => 'b', + 28 => 'c', 29 => 'd', 30 => 'e', 31 => 'f', 32 => 'g', 33 => 'h', 34 => 'i', + 35 => 'j', 36 => 'k', 37 => 'l', 38 => 'm', 39 => 'n', 40 => 'o', 41 => 'p', + 42 => 'q', 43 => 'r', 44 => 's', 45 => 't', 46 => 'u', 47 => 'v', 48 => 'w', + 49 => 'x', 50 => 'y', 51 => 'z', 52 => '0', 53 => '1', 54 => '2', 55 => '3', + 56 => '4', 57 => '5', 58 => '6', 59 => '7', 60 => '8', 61 => '9', 62 => '+', + 63 => '/', + ); + + /** + * Constructor + */ + public function __construct(){ + // I leave it here for future reference + // foreach(str_split('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/') as $i => $char) + // { + // $this->charToIntMap[$char] = $i; + // $this->intToCharMap[$i] = $char; + // } + } + + /** + * Convert from a two-complement value to a value where the sign bit is + * is placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + * We generate the value for 32 bit machines, hence -2147483648 becomes 1, not 4294967297, + * even on a 64 bit machine. + * @param string $aValue + */ + public function toVLQSigned($aValue){ + return 0xffffffff & ($aValue < 0 ? ((-$aValue) << 1) + 1 : ($aValue << 1) + 0); + } + + /** + * Convert to a two-complement value from a value where the sign bit is + * is placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + * We assume that the value was generated with a 32 bit machine in mind. + * Hence + * 1 becomes -2147483648 + * even on a 64 bit machine. + * @param integer $aValue + */ + public function fromVLQSigned($aValue){ + return $aValue & 1 ? $this->zeroFill(~$aValue + 2, 1) | (-1 - 0x7fffffff) : $this->zeroFill($aValue, 1); + } + + /** + * Return the base 64 VLQ encoded value. + * + * @param string $aValue The value to encode + * @return string The encoded value + */ + public function encode($aValue){ + $encoded = ''; + $vlq = $this->toVLQSigned($aValue); + do + { + $digit = $vlq & $this->mask; + $vlq = $this->zeroFill($vlq, $this->shift); + if($vlq > 0){ + $digit |= $this->continuationBit; + } + $encoded .= $this->base64Encode($digit); + } while($vlq > 0); + + return $encoded; + } + + /** + * Return the value decoded from base 64 VLQ. + * + * @param string $encoded The encoded value to decode + * @return integer The decoded value + */ + public function decode($encoded){ + $vlq = 0; + $i = 0; + do + { + $digit = $this->base64Decode($encoded[$i]); + $vlq |= ($digit & $this->mask) << ($i * $this->shift); + $i++; + } while($digit & $this->continuationBit); + + return $this->fromVLQSigned($vlq); + } + + /** + * Right shift with zero fill. + * + * @param integer $a number to shift + * @param integer $b number of bits to shift + * @return integer + */ + public function zeroFill($a, $b){ + return ($a >= 0) ? ($a >> $b) : ($a >> $b) & (PHP_INT_MAX >> ($b - 1)); + } + + /** + * Encode single 6-bit digit as base64. + * + * @param integer $number + * @return string + * @throws Exception If the number is invalid + */ + public function base64Encode($number){ + if($number < 0 || $number > 63){ + throw new Exception(sprintf('Invalid number "%s" given. Must be between 0 and 63.', $number)); + } + return $this->intToCharMap[$number]; + } + + /** + * Decode single 6-bit digit from base64 + * + * @param string $char + * @return number + * @throws Exception If the number is invalid + */ + public function base64Decode($char){ + if(!array_key_exists($char, $this->charToIntMap)){ + throw new Exception(sprintf('Invalid base 64 digit "%s" given.', $char)); + } + return $this->charToIntMap[$char]; + } + +} + + +/** + * Source map generator + * + * @package Less + * @subpackage Output + */ +class Less_SourceMap_Generator extends Less_Configurable { + + /** + * What version of source map does the generator generate? + */ + const VERSION = 3; + + /** + * Array of default options + * + * @var array + */ + protected $defaultOptions = array( + // an optional source root, useful for relocating source files + // on a server or removing repeated values in the 'sources' entry. + // This value is prepended to the individual entries in the 'source' field. + 'sourceRoot' => '', + + // an optional name of the generated code that this source map is associated with. + 'sourceMapFilename' => null, + + // url of the map + 'sourceMapURL' => null, + + // absolute path to a file to write the map to + 'sourceMapWriteTo' => null, + + // output source contents? + 'outputSourceFiles' => false, + + // base path for filename normalization + 'sourceMapRootpath' => '', + + // base path for filename normalization + 'sourceMapBasepath' => '' + ); + + /** + * The base64 VLQ encoder + * + * @var Less_SourceMap_Base64VLQ + */ + protected $encoder; + + /** + * Array of mappings + * + * @var array + */ + protected $mappings = array(); + + /** + * The root node + * + * @var Less_Tree_Ruleset + */ + protected $root; + + /** + * Array of contents map + * + * @var array + */ + protected $contentsMap = array(); + + /** + * File to content map + * + * @var array + */ + protected $sources = array(); + protected $source_keys = array(); + + /** + * Constructor + * + * @param Less_Tree_Ruleset $root The root node + * @param array $options Array of options + */ + public function __construct(Less_Tree_Ruleset $root, $contentsMap, $options = array()){ + $this->root = $root; + $this->contentsMap = $contentsMap; + $this->encoder = new Less_SourceMap_Base64VLQ(); + + $this->SetOptions($options); + + + // fix windows paths + if( !empty($this->options['sourceMapRootpath']) ){ + $this->options['sourceMapRootpath'] = str_replace('\\', '/', $this->options['sourceMapRootpath']); + $this->options['sourceMapRootpath'] = rtrim($this->options['sourceMapRootpath'],'/').'/'; + } + } + + /** + * Generates the CSS + * + * @return string + */ + public function generateCSS(){ + $output = new Less_Output_Mapped($this->contentsMap, $this); + + // catch the output + $this->root->genCSS($output); + + + $sourceMapUrl = $this->getOption('sourceMapURL'); + $sourceMapFilename = $this->getOption('sourceMapFilename'); + $sourceMapContent = $this->generateJson(); + $sourceMapWriteTo = $this->getOption('sourceMapWriteTo'); + + if( !$sourceMapUrl && $sourceMapFilename ){ + $sourceMapUrl = $this->normalizeFilename($sourceMapFilename); + } + + // write map to a file + if( $sourceMapWriteTo ){ + $this->saveMap($sourceMapWriteTo, $sourceMapContent); + } + + // inline the map + if( !$sourceMapUrl ){ + $sourceMapUrl = sprintf('data:application/json,%s', Less_Functions::encodeURIComponent($sourceMapContent)); + } + + if( $sourceMapUrl ){ + $output->add( sprintf('/*# sourceMappingURL=%s */', $sourceMapUrl) ); + } + + return $output->toString(); + } + + /** + * Saves the source map to a file + * + * @param string $file The absolute path to a file + * @param string $content The content to write + * @throws Exception If the file could not be saved + */ + protected function saveMap($file, $content){ + $dir = dirname($file); + // directory does not exist + if( !is_dir($dir) ){ + // FIXME: create the dir automatically? + throw new Exception(sprintf('The directory "%s" does not exist. Cannot save the source map.', $dir)); + } + // FIXME: proper saving, with dir write check! + if(file_put_contents($file, $content) === false){ + throw new Exception(sprintf('Cannot save the source map to "%s"', $file)); + } + return true; + } + + /** + * Normalizes the filename + * + * @param string $filename + * @return string + */ + protected function normalizeFilename($filename){ + + $filename = str_replace('\\', '/', $filename); + $rootpath = $this->getOption('sourceMapRootpath'); + $basePath = $this->getOption('sourceMapBasepath'); + + // "Trim" the 'sourceMapBasepath' from the output filename. + if (strpos($filename, $basePath) === 0) { + $filename = substr($filename, strlen($basePath)); + } + + // Remove extra leading path separators. + if(strpos($filename, '\\') === 0 || strpos($filename, '/') === 0){ + $filename = substr($filename, 1); + } + + return $rootpath . $filename; + } + + /** + * Adds a mapping + * + * @param integer $generatedLine The line number in generated file + * @param integer $generatedColumn The column number in generated file + * @param integer $originalLine The line number in original file + * @param integer $originalColumn The column number in original file + * @param string $sourceFile The original source file + */ + public function addMapping($generatedLine, $generatedColumn, $originalLine, $originalColumn, $fileInfo ){ + + $this->mappings[] = array( + 'generated_line' => $generatedLine, + 'generated_column' => $generatedColumn, + 'original_line' => $originalLine, + 'original_column' => $originalColumn, + 'source_file' => $fileInfo['currentUri'] + ); + + $this->sources[$fileInfo['currentUri']] = $fileInfo['filename']; + } + + + /** + * Generates the JSON source map + * + * @return string + * @see https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit# + */ + protected function generateJson(){ + + $sourceMap = array(); + $mappings = $this->generateMappings(); + + // File version (always the first entry in the object) and must be a positive integer. + $sourceMap['version'] = self::VERSION; + + + // An optional name of the generated code that this source map is associated with. + $file = $this->getOption('sourceMapFilename'); + if( $file ){ + $sourceMap['file'] = $file; + } + + + // An optional source root, useful for relocating source files on a server or removing repeated values in the 'sources' entry. This value is prepended to the individual entries in the 'source' field. + $root = $this->getOption('sourceRoot'); + if( $root ){ + $sourceMap['sourceRoot'] = $root; + } + + + // A list of original sources used by the 'mappings' entry. + $sourceMap['sources'] = array(); + foreach($this->sources as $source_uri => $source_filename){ + $sourceMap['sources'][] = $this->normalizeFilename($source_filename); + } + + + // A list of symbol names used by the 'mappings' entry. + $sourceMap['names'] = array(); + + // A string with the encoded mapping data. + $sourceMap['mappings'] = $mappings; + + if( $this->getOption('outputSourceFiles') ){ + // An optional list of source content, useful when the 'source' can't be hosted. + // The contents are listed in the same order as the sources above. + // 'null' may be used if some original sources should be retrieved by name. + $sourceMap['sourcesContent'] = $this->getSourcesContent(); + } + + // less.js compat fixes + if( count($sourceMap['sources']) && empty($sourceMap['sourceRoot']) ){ + unset($sourceMap['sourceRoot']); + } + + return json_encode($sourceMap); + } + + /** + * Returns the sources contents + * + * @return array|null + */ + protected function getSourcesContent(){ + if(empty($this->sources)){ + return; + } + $content = array(); + foreach($this->sources as $sourceFile){ + $content[] = file_get_contents($sourceFile); + } + return $content; + } + + /** + * Generates the mappings string + * + * @return string + */ + public function generateMappings(){ + + if( !count($this->mappings) ){ + return ''; + } + + $this->source_keys = array_flip(array_keys($this->sources)); + + + // group mappings by generated line number. + $groupedMap = $groupedMapEncoded = array(); + foreach($this->mappings as $m){ + $groupedMap[$m['generated_line']][] = $m; + } + ksort($groupedMap); + + $lastGeneratedLine = $lastOriginalIndex = $lastOriginalLine = $lastOriginalColumn = 0; + + foreach($groupedMap as $lineNumber => $line_map){ + while(++$lastGeneratedLine < $lineNumber){ + $groupedMapEncoded[] = ';'; + } + + $lineMapEncoded = array(); + $lastGeneratedColumn = 0; + + foreach($line_map as $m){ + $mapEncoded = $this->encoder->encode($m['generated_column'] - $lastGeneratedColumn); + $lastGeneratedColumn = $m['generated_column']; + + // find the index + if( $m['source_file'] ){ + $index = $this->findFileIndex($m['source_file']); + if( $index !== false ){ + $mapEncoded .= $this->encoder->encode($index - $lastOriginalIndex); + $lastOriginalIndex = $index; + + // lines are stored 0-based in SourceMap spec version 3 + $mapEncoded .= $this->encoder->encode($m['original_line'] - 1 - $lastOriginalLine); + $lastOriginalLine = $m['original_line'] - 1; + + $mapEncoded .= $this->encoder->encode($m['original_column'] - $lastOriginalColumn); + $lastOriginalColumn = $m['original_column']; + } + } + + $lineMapEncoded[] = $mapEncoded; + } + + $groupedMapEncoded[] = implode(',', $lineMapEncoded) . ';'; + } + + return rtrim(implode($groupedMapEncoded), ';'); + } + + /** + * Finds the index for the filename + * + * @param string $filename + * @return integer|false + */ + protected function findFileIndex($filename){ + return $this->source_keys[$filename]; + } + +} \ No newline at end of file diff --git a/sites/all/libraries/less.php/Version.php b/sites/all/libraries/less.php/Version.php new file mode 100644 index 0000000..1e95433 --- /dev/null +++ b/sites/all/libraries/less.php/Version.php @@ -0,0 +1,15 @@ + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/sites/all/modules/imce/README.txt b/sites/all/modules/imce/README.txt new file mode 100644 index 0000000..11515ee --- /dev/null +++ b/sites/all/modules/imce/README.txt @@ -0,0 +1,181 @@ + +IMCE +http://drupal.org/project/imce +==================================== + +DESCRIPTION +----------- +IMCE is an image/file uploader and browser that supports personal directories and quota. +IMCE can easily be integrated into any WYSIWYG editor or any web application that needs a file browser. +See INTEGRATION METHODS for more information. + +FEATURES +----------- +- Basic file operations: upload, delete +- Image(jpg, png, gif) operations: resize, create thumbnails, preview +- Support for private file system +- Configurable limits for user roles: file size per upload, directory quota, file extensions, and image dimensions +- Personal or shared folders for users +- Permissions per directory +- Ftp-like directory navigation +- File sorting by name, size, dimensions, date +- Tabbed interface for file operations +- Keyboard shortcuts(up, down, insert(or enter), delete, home, end, ctrl+A, R(esize), T(humbnails), U(pload)). +- Built-in support for inline image/file insertion into textareas +- Multiple file selection(using ctrl or shift) +- Ajax file operations +- Themable layout using tpl files + +INSTALLATION +----------- +1) Copy imce directory to your modules directory +2) Enable the module at module administration page +3) Create configuration profiles and assign them to user roles at /admin/config/media/imce +4) Test it at /imce. +5) See imce-content.tpl.php for some configuration options such as inline previewing. +6) See INTEGRATION METHODS to make IMCE collaborate with your application if it's not already integrated. +Notes: + - When you configure IMCE for inline image/file insertion into textareas there should appear an IMCE link under each textarea you specified. + - If you are uploading files containing unicode characters, it is strongly recommended to use the transliteration module that sanitizes filenames by converting characters from unicode to us-ascii. http://drupal.org/project/transliteration + - If you are using CCK, you may want to check the File field sources module at http://drupal.org/project/filefield_sources + + +FREQUENTLY FACED ISSUES +----------- +- Inaccessible/invalid directory or subdirectory: +In some server configurations, manually(ftp or directly) created directories may not be writable by PHP(by IMCE). In this case, you have to set the chmod permissions of the directory to 0777 in order to make it writable by anyone. +You should also make sure that in each configuration profile all of the defined directories are located under drupal's file system path which is usually "files". +And also if "safe mode restriction" is active in your server, don't expect IMCE to run flawlessly. + +- Disappearing images after node submission: +Having nothing to do with IMCE, it appeared many times in issue queues. This is an input filtering issue that can be resolved by adding tag into the default input format. Using Full HTML is another solution. See admin/config/content/formats. + +- Upload does not work in Opera +Jquery form plugin before version 2.09 has problems with Opera 9.2+. Replace Drupal's misc/jquery.form.js with the one at http://jquery.malsup.com/form/#download + +- IMCE may have problem working with Google Analytics and Secure pages modules. Just make sure to add *imce* path to the exceptions list of these modules. + + +INTEGRATION METHODS +----------- + +Here are the applications that already integrated IMCE. + +WYSIWYG: +Install http://drupal.org/project/imce_wysiwyg bridge module and enable IMCE as a plug-in in WYSIWYG settings + +BUEditor: +IMCE is integrated in image and link dialogs. + +(F)CKeditor(without WYSIWYG): +(F)ckeditor profile->File browser settings->IMCE integration + +If your application is not one of the above, please keep reading in order to learn how to integrate IMCE. + +Let's create a CASE and embody the IMCE integration on it: +- An application named myApp +- Has an url field for file url: + +- Has a browse button with click event(inline or set by jQuery): (This can be a text link or anything that is clickable) + + +Now let's go through the integration methods and define the openFileBrowser function that opens IMCE and makes it fill our url field on file selection. + + +INTEGRATION BY URL +----------- +When IMCE is opened using an url that contains &app=applicationName|fileProperty1@FieldId1|fileProperty2@FieldId2|... +the specified fields are filled with the specified properties of the selected file. + +Available file properties are: url, name, size(formatted), width, height, date(formatted), bytes(integer size in bytes), time(integer date timestamp), id(file id for newly uploaded files, 0 or integer), relpath(rawurlencoded path relative to file directory path.) + +In our CASE, we should open IMCE using this URL: /imce?app=myApp|url@urlField which contains our application name and our url field id + +function openFileBrowser() { + window.open('/imce?app=myApp|url@urlField', '', 'width=760,height=560,resizable=1'); +} + +That's all we need. Leave the rest to IMCE. +It will automatically create an operation tab named "Send to myApp" that sends the file url to our url field. +Clicking the files in preview do the same thing as well. + +- What if we had another field for another file property e.g, Size: ? +- We should have opened imce using this URL: /imce?app=myApp|url@urlField|size@file-size + + +- USING imceload: +You can point a predefined function to be executed when IMCE loads. +When the URL is like "app=myApp|imceload@myOnloadFunc", IMCE looks for "myOnloadFunc" in the parent window and executes it with the window parameter referring to IMCE window. +function myOnloadFunc (win) {//any method of imce is available through win.imce + win.imce.setSendTo('Give it to myApplication baby', myFileHandler);//you should also define myFileHandler +} + +- USING sendto: +You can point a predefined function to which the selected files are sent. +When the URL is like "app=myApp|sendto@myFileHandler", IMCE calls "myFileHandler" function of the parent window with file and window parameters. +function myFileHandler (file, win) { + $('#urlFieldId').val(file.url);//insert file url into the url field + win.close();//close IMCE +} +Usually sendto method is easier to implement, on the other hand imceload method is more flexible as you manually add your sento operator and also can do any modification before IMCE shows up. + + +ADVANCED INTEGRATION +----------- +In case: +- Your application wants to go beyond the simple "give me that file property" interaction with IMCE. +- Your application wants IMCE to send multiple files to it.(e.g., a gallery application) +- Your application wants to gain total control over IMCE. +Then you should consider applying advanced integration. + +The initial step of advanced integration is the same as imceload-integration above. + +We open IMCE and set its onload function: + +window.open('/imce?app=myApp|imceload@initiateMyApp', '', 'width=760,height=560,resizable=1'); //initiateMyApp(win) will run when imce loads + +Now we define our initiator function in which we do the necessary manipulations to IMCE interface: + +initiateMyApp = function (win) { + var imce = win.imce; + ...use imce methods to add/remove/change things... +} + +- Allright, but what do we add/romeve/change in IMCE ? +- Depends on our goal. Here are some properties and methods that can help us to achieve it: + +Hooks +imce.hooks.load: an array of functions that run after imce loads. they are called with the window parameter. +imce.hooks.list: an array of functions that run while processing the file list. each row of the file list is sent to these functions. +imce.hooks.navigate: an array of functions that run after a directory is loaded. parameters sent are data(from ajax or cache), old_directory, cached(boolean that states the data is from the cache or not). +imce.hooks.cache: an array of functions that run just before a new directory is loaded. parameters are cached_data and new_directory. + +Directory related properties +imce.tree: stores the directory list where imce.tree['.'] is the root element. + +Directory related methods +imce.dirAdd(directory_name, parent_element, clickable): adds directory_name under parent_element. ex: imce.dirAdd('foo', imce.dir['.'], true) +imce.dirSubdirs(directory_name, subdirectories): adds each subdirectory in subdirectories array under directory_name. ex: imce.dirSubdirs('foo', ['bar', 'baz']) + +File related properties +imce.findex: indexed array of files(table rows that contain file properties.) +imce.fids: object containing file_id(file name)-file(row) pairs. +imce.selected: object containing currently selected file_id(file name)-file(row) pairs. + +File related methods +imce.fileAdd(file): adds the file object to the list. file object has the properties; name, size(bytes), width, height, date(timestamp), fsize(formatted), fdate(formatted) +imce.fileRemove(fiile_id): removes the file having the file_id from the list. +imce.fileGet(file_id). returns the file object having the file_id. file object contains name, url, size, bytes, width, height, date, time, id(file id for newly uploaded files, 0 or integer), relpath(rawurlencoded path relative to file directory path.) + +File operations +imce.opAdd(op): adds an operation tab to the interface. op contains name, title, content(optional), func(optional onclick function) +imce.opEnable(name), imce.opDisable(name): enable/disable operation tabs. + +Miscellaneous +imce.setMessage(msg, type): logs a message of the type(status, warning, error) + +NOTES: +- All URL strings in the examples start with "/" considering the base path is "/". +In case your drupal is running on a sub directory e.g, http://localhost/drupal, these URLs should start with "/drupal/". +There is a safer solution that does not require manual URL fixing: If the Drupal javascript object is available in your page you can use Drupal.settings.basePath at the beginning of URLs (Drupal.settings.basePath+'?q=imce....'). Note that, this won't work with multilingual paths with language prefixes. +- file and directory ids(names) used in imce.js are url encoded forms of original names. They are decoded using imce.decode and displayed in the lists. \ No newline at end of file diff --git a/sites/all/modules/imce/css/close.png b/sites/all/modules/imce/css/close.png new file mode 100644 index 0000000000000000000000000000000000000000..ea709d08e8fdf90941f1f98e9973618dc3fdf7b0 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}PJmB{>(b@B#hCQZU3t26`7UuL zLw$L7NhT9rITvjiCvz=dJvlcMbuSBTKU;$!9a$GGX-6yFfF;Xz=_|PF$T@pE#_P*@ zEMK|T&M4T`DpHck%*!#(K;C27@;x4QF^iV$(2;evH42hoGFr9fz=iA2RgU_A9HLSZ zTRO@)TaXA%-pCr_E?Xf&m3?#4ne^UZ+0(?ST8yXt^|Njrz^-QUt6f%>X>>{Sn@?v z*W=Y&AFC^z;gEmSGwl+O%;S`dW6TQAbQJGac3cckdt6-mamDISp*DM&6+f)o^gv$v zU69kmN%KB!-gbM=isu`4KFY4R;1m7cN%w=N;X6C^|Ns9h?R2{Vv`e8R$S)Yk#RnK- zVx->!)#iJ;IEF}EuI+!w)u6!BBHNjrr|S84<(2RCr;XMstomJ;BY(Va<(COntn1FM z(@$u3OrNi{Av>md8zV!O6GIYi7-~6dSs~J39{an^LB{Ts5AAOr2 literal 0 HcmV?d00001 diff --git a/sites/all/modules/imce/css/error.png b/sites/all/modules/imce/css/error.png new file mode 100644 index 0000000000000000000000000000000000000000..b92fb75e700f1d5bd2becfc54ee5074e2096f06f GIT binary patch literal 498 zcmV%x=;vR z`2M)(%l_x>Uk}OiemSwLcn&X?{?1M6Z>1AMZA2>b-4l_V{2N<2j zJ?(MKuLiVnRSAp%rpo`#+ zUZBk+`GKVriteCOiS#UGpIm6zOBpEu-N72HdQetA6qR3uZA z8@2LE!t5#=6tuzKnLcSQyTz9y_=OFo799f%sV$wIPg!x#wSGS-_?^U=tFRah&p0h) z`3IpWDzs4|HNu9#FZ9pglf?K@u}3Lm zg`^l%%g)()w&5p+LlgL-80R9@U*#g-yp=UMkGzy@IB=2s9-ptmSARaHTPh9yK?#;e oH5muOF}ay`+1Wo|5BC4wg3?#4ne^UZ+0(?ST8yXt^|NjrVE0SN~wz&+q544{FM9AQ2*bF85tQG8X6lL z8yp-Q9UUDW9v&YbA0QwgAt50mA|fLrBP1jwB_$;$CMG8*CnzW=DJdx`Dk>{0D=aK5 zEiElBE-o)GFE1}IFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!- zJv}}?K0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SM@L6UNJvRZNlHpeOG`^kOiWEp zO-@cuPft%!P*71(QBqP;Q&Uq^R8&<}RaRD3S65e9SXfzESz20JTU%RPTwGmUU0z;Z zUteEfU|?WiU}0flVq#)rV`F4wWMyS#W@ct*XJ=?=XlZF_YHDh0Yin$5Y;A3AZfQa&mHWb8~cbbai!gc6N4mcXxPrczAetd3kwydU|_%dwhI+eSLj?etv&{ ze}I61fq{X7f`WsCgM@^Hg@uKNhK7fShlq%XiHV7dii(Sii;Rqnjg5_tj*gFykC2d% zk&%&+k&%*;l9Q8@l$4Z}m6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|k zp`oIpqNAguq@<*!rKP5(rl+T;sHmu^si~={sj8}~tE;Q5tgNlAt*)-FudlDLu&}YQ zv9hwVv$M0bw6wLgwYIjlx3{;rxVX8wxw^W#ySux*yu7`=y}rJ_zrVl0z`()5!NS7A z!otGC!^6bH#KpzM#>U3S$H&OX$jQmc%F4>i%gfBn%+1Zs&d$!y&(F}%(9zM+($dn? z)6>+{)YaA1*4Eb7*VowC*xA|H+S=OM+S=RO+uYpT-QC^Z-rnEe-{9cj;o;%p;^O1u zlq(=H}<;=jiC@>FMd}>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ^Yiob z^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg={r&#_{{R2~0FZhr00001bW%=J06^y0 zW&i*HVo5|nR0!8i&(RWqAP7X!MO;eM`v1R;%(C-%XJ7z83xcIt;3~9%!=2fOr`9Me z&Se+yq}x=iCU9ea!_ljP-mFiD=LpTMOiqmvmKCbTQrh;~a|Fphn&J>i`bpyh`2j9e WdIZT@J`sNa0000-<~KS?iaadG9xW%cOI!%{%7V_Agm<_MJ)VteZD)$``bCb#*;>@Zj6G zZ?4l;7ahJ~*}Xusvfpv?ijbwdo<4m#{lXjl`l;S?HUbTNyKcH5&@P3NAirQB7aw4V ziIIK_RNLt3;us=vIrjWPzGejh*NZC+I+Uj{Ep%A?>3@BsLPpN{PtS7Yrq~B?3CjKx z>j-a*ZL|op$(Eh^QCH{uva>r1_qA0{jy)0O`t)Ihs(r4F<%FgWU)*LWT-m^*>@lZZ zZp(=seDYg#T|}JuT{V-x*{U*ZC@Tt>F*`59_PPA@@cQ4cxjUZnb>;tEItS<&22WQ% Jmvv4FO#nH$sbl~E literal 0 HcmV?d00001 diff --git a/sites/all/modules/imce/css/folder.png b/sites/all/modules/imce/css/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..6e059125533ee733ef1aede1f678763b566f7f1c GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~i!VDy@FgET4QU(D&A+G=a{kwMUT3cINZf@?D zMwu050<$xjeSCa&cPRh6kp2Jr#LEk;|39d{v(n|*WW870gEnpQiU#UsED7=pW^j0R zBMrz&@^ozopr026>yBLDyZ literal 0 HcmV?d00001 diff --git a/sites/all/modules/imce/css/header.png b/sites/all/modules/imce/css/header.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1e8c6dbf17c26db56d7cf6a80ec5b08e2d628d GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{O!3-pi`)%$mUTynFxc`}YqYKg|)`RRq+f;_2cT!VxWdu$_@X yfZ>3_*607K z|NmdRb&XT@TjPZPji z{D14VAF0KUxg;-gn4jj5KFIF=iOb<8r|btVh5z;9*f{D1uHzx&Sr?jisE4?O0ydCw*FU(V#h_2)A(82Eu6u`dbo3kJHA0>IFxRwE8H z>VT(02 zd-olF5xqqHXOPR5TPd2Hn{=$g-w1cCHWKRjyA@`v(DJhXX(4|mtEoD8YC+NcLm~G$_k}L{WVK(? zXYEcEiQGA-X3jTHTfy8^v%=@o?$_56ZU1_m|Ha3A;epoQnbnaQwOhFA^8bJ0)SRXC V%T09Va-d%rJYD@<);T3K0RSr56z%{3 literal 0 HcmV?d00001 diff --git a/sites/all/modules/imce/css/imce-content.css b/sites/all/modules/imce/css/imce-content.css new file mode 100644 index 0000000..f746e0d --- /dev/null +++ b/sites/all/modules/imce/css/imce-content.css @@ -0,0 +1,460 @@ + +/*Body*/ +body.imce { + padding: 2px; + background: none; + text-align: left; + height: auto; +} + +/*Main container*/ +/*reset all tags.*/ +#imce-content, #imce-content * { + font: 11px/16px Verdana, sans-serif; + margin: 0; + padding: 0; + color: #444; + background: none; + border: none; + float: none; + list-style: none; +} +#imce-content { + position: relative; + background-color: #fff; +} +#imce-content a { + text-decoration: none; +} +#imce-content label { + font-weight: bold; +} +#imce-content label.option { + font-weight: normal; +} +#imce-content input.form-text, #imce-content input[type=text], #imce-content input.form-file, #imce-content input[type=file], #imce-content select, #imce-content textarea { + border: 1px inset #aaa; + padding: 2px; + background-color: #fff; + margin: 1px; + width: auto; +} +#imce-content input.form-submit, #imce-content input[type=submit], #imce-content button { + border: 2px groove #fff; + padding: 2px 6px 2px 20px; + margin: 2px 0; + background: #e8e8d8 url(submit.png) no-repeat 2px 50%; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +#imce-content [disabled], #imce-content .disabled { + color: #999; + cursor: default; + text-decoration: none !important; +} +#imce-content input.loading { + background-image: url(loading.gif) !important; +} +#imce-content .form-item { + margin: 4px 0; +} +#imce-content .form-item .description { + font-size: 0.9em; +} +#imce-content strong, #imce-content h4 { + font-weight: bold; +} +#imce-content em { + font-style: italic; +} +#imce-content ul.tips { + margin: 2px 8px; +} +#imce-content ul.tips li { + list-style: circle inside; + line-height: 18px; +} + +/*Main sections under imce-content*/ +#ops-wrapper { + margin-bottom: 2px; + background: #d0d7e7 url(ops.png) repeat-x; + border: 1px solid #a5b9cd; +} +#browse-wrapper { + overflow: hidden; + height: 260px; + clear: both; +} +#browse-resizer {} +#preview-wrapper { + height: 180px; + overflow: auto; +} + +/*columns of browse-wrapper*/ +#navigation-wrapper { + width: 25%; + height: 100%; + overflow: auto; + float: left; + position: relative; +} +#navigation-resizer { + height: 100%; + float: left; +} +#sub-browse-wrapper { + height: 100%; + overflow: auto; + position: relative; +} + +/*rows of sub-browse wrapper*/ +#file-header-wrapper { + height: 25px; + background: url(header.png) repeat-x 0 0; + position: relative; +} +#file-list-wrapper { + padding-bottom: 20px;/*#dir-stat height*/ + outline: none; +} +#dir-stat { + position: absolute; + z-index: 1; + bottom: 0; + padding: 2px 5px; + background-color: #e9ecef; +} + +#dir-stat, #dir-stat * { + font-size: 0.9em; +} + +/*Navigation header*/ +#navigation-header { + background: url(header.png) repeat-x 0 0; + position: absolute; + z-index: 1; + width: 100%; + height: 25px; +} +#navigation-header span { + display: inline-block; + padding: 4px 4px 5px 20px; + font-weight: bold; + background: url(tree.png) no-repeat 0 50%; +} + +/*Navigation tree (ul)*/ +#navigation-tree { + margin-top: 25px;/*navigation-header height*/ +} +#navigation-tree ul { + margin-left: 15px; +} +#navigation-tree li { + padding: 2px; + background: transparent url(collapsed.png) no-repeat 3px 6px; + white-space: nowrap; +} +#navigation-tree li.expanded { + background-image: url(expanded.png); +} +#navigation-tree li.leaf { + background-image: url(leaf.png); +} +#navigation-tree li.loading { + background-image: url(loading.gif); + background-position: 0 2px; +} +#navigation-tree li span.expander { + display: inline-block; + width: 12px; + cursor: pointer; + margin-right: 1px; +} +#navigation-tree li a { + display: inline-block; +} +#navigation-tree li a:hover { + text-decoration: underline; +} +#navigation-tree li a.folder { + margin-left: 2px; + padding-left: 18px; + background: transparent url(folder.png) no-repeat 0 50%; +} +#navigation-tree li a.active { + font-weight: bold; + background-image: url(folder-open.png); + background-color: #ecf0f4; +} +#navigation-tree li.root > a.folder { + background-image: url(folder-root.png); +} + +/*File list and header. (Accessible by #file-list and #file-header. Both have the classname "files")*/ +#file-header, #file-list { + table-layout: fixed; + width: 100%; +} +#file-header td { + padding: 4px; + font-weight: bold; + cursor: default; +} +#file-header td.asc { + color: #f60; +} +#file-header td.asc:after { + content: "\2193"; + font-weight: normal; +} +#file-header td.desc { + color: #09f; +} +#file-header td.desc:after { + content: "\2191"; + font-weight: normal; +} +#file-list td { + overflow: hidden; + border-top: 1px solid #ccf; + border-bottom: 1px solid #ccf; + padding: 4px; + cursor: default; +} +#file-list td.name, #file-header td.name { + min-width: 12em; + white-space: nowrap; +} +#file-list td.size, #file-header td.size { + width: 6.5em; + text-align: right; +} +#file-list td.width, #file-header td.width { + width: 5em; + text-align: right; +} +#file-list td.height, #file-header td.height { + width: 5em; +} +#file-list td.date, #file-header td.date { + width: 12em; + text-align: center; +} +#file-list tr:hover td { + background-color: #e9ecef; +} +#file-list tr.selected td { + background-color: #07f; + color: #fff; +} +#file-list tr.selected span { + color: #fff; +} +#file-list td.name img { + vertical-align: middle; + margin-right: 3px; +} + + +/*File operations*/ +#op-items { + min-height: 26px; +} +#op-contents { + position: absolute; + z-index: 2; +} +#op-contents .op-content { + display: none; + padding: 16px; + border: 2px solid #344454; + background-color: #f5f5f5; + position: relative; +} +#op-close-link { + display: none; + position: absolute; + z-index: 3; + top: 2px; + right: 2px; + width: 16px; + height: 16px; + background: url(close.png) no-repeat 50% 50%; +} +#ops-list { +} +#ops-list li { + display: block; + float: left; +} +#ops-list a { + display: block; + padding: 5px 8px 5px 20px; + text-decoration: none; + background: url(op.png) no-repeat 2px 50%; +} +#ops-list a:hover { + background-color: #e9ecef; +} +#ops-list li.active a { + background-color: #f9f8f7; +} +#ops-list a span { + display: inline-block; + color: #0e1f43; + padding-left: 1px; +} +#ops-list li.loading a { + background-image: url(loading.gif); +} + +/*Custom op styles*/ +#op-item-upload a, #imce-content #edit-upload { + background-image: url(upload.png); +} +#op-item-thumb a, #imce-content #edit-thumb { + background-image: url(thumb.png); +} +#op-item-resize a, #imce-content #edit-resize { + background-image: url(resize.png); +} +#op-item-delete a { + background-image: url(delete.png); +} +#op-item-sendto a { + background-image: url(sendto.png); +} +#op-item-help a { + background-image: url(help.png); +} +#op-item-changeview a { + background-image: url(view-box.png); +} +.box-view #op-item-changeview a { + background-image: url(view-list.png); +} +#op-item-help a, #op-item-changeview a { + white-space: nowrap; + overflow: hidden; + width: 1px; + padding: 5px 0 5px 25px; + background-position: 5px 50%; +} +#op-item-help, #op-item-changeview { + float: right !important; +} + +/*resizers*/ +#imce-content .y-resizer { + height: 5px; + cursor: n-resize; + background: #f4f5f6 url(y-resizer.png) no-repeat 50% 50%; + border-top: 1px solid #e0e3e5; + border-bottom: 1px solid #e0e3e5; +} +#imce-content .x-resizer { + width: 5px; + cursor: e-resize; + background: #f4f5f6 url(x-resizer.png) no-repeat 50% 50%; + border-left: 1px solid #e0e3e5; + border-right: 1px solid #e0e3e5; +} + +/*Message box*/ +#message-box { + display: none; + position: absolute; + width: 60%; + left: 20%; + top: 32%; + z-index: 10; + padding: 5px; + background-color: #fff; + border: 2px solid #000; +} +#message-box * { + font-size: 1.1em; + font-weight: bold; + color: #000; +} +#imce-content div.message { + background: url(status.png) no-repeat 0 0; + padding-left: 20px; + margin: 2px 0; +} +#imce-content div.error { + background: url(error.png) no-repeat 0 0; + padding-left: 20px; +} +#imce-content div.warning { + background: url(warning.png) no-repeat 0 0; + padding-left: 20px; +} +#log-messages { + height: 60px; + overflow: auto; + border: 1px solid #000; + padding: 2px 4px; +} +#log-messages * { + font-family: monospace; +} + +#file-preview { + text-align: center; +} +.imce-hide, .js #forms-wrapper, #help-box { + display: none; +} + +/*IE*/ +.ie #imce-content input, .ie #imce-content select { + vertical-align: middle; + line-height: 1.2em; +} +.ie-7 #navigation-tree li { + list-style-image: none; +} +.ie-7 #imce-content input.form-submit, .ie-7 #imce-content input[type=submit], .ie-7 #imce-content button { + border-style: outset; +} +.ie-7 #ops-list a span { + cursor: pointer; +} +.ie-7 #file-list-wrapper { + display: inline-block; /* Gives hasLayout */ +} + +/* File list in box view */ +.box-view #file-list tr { + display: block; + float: left; + border: 1px solid #ccf; + margin: 10px; +} +.box-view #file-list td { + border: 0; +} +.box-view #file-list td.name { + min-width: 0; + padding: 5px; + text-align: center; + vertical-align: middle; +} +.box-view #file-list td.name img { + margin: 0; +} +.box-view #file-list td.name span { + display: block; + overflow: hidden; + white-space: nowrap; +} +.box-view #file-list td.size, .box-view #file-list td.date, .box-view #file-list td.width, .box-view #file-list td.height { + display: none; +} \ No newline at end of file diff --git a/sites/all/modules/imce/css/leaf.png b/sites/all/modules/imce/css/leaf.png new file mode 100644 index 0000000000000000000000000000000000000000..605d3ac811754459a0f16a464244c4024925cebb GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZ+0(?ST8yXt^|NjrrhRYvzv*0l=FzAo3r4_O!(df$8uj$mVTYHU2C!#ix>pWQ+$N{xLltG6H=m$OqZlDG3394P^jpwPiC`@=T@8sl&u1g{p zT_#L)5t!)VD8%98F^M_xfQ(F+`$hi=Rti#VBCi}1Efj8DWOA@;aee%0=Ol-UgRdDC zrD2ZeWzb;*n$5+)4>UVqfg*=*rWsqCWO}5GyJ5`r0KRFaAzejVdAknFl64X3czJl^Av=VFL)V`_Lq$t1=GjHW)mY&{oi5Vemi(J?kI7H?#bvqS$X3b#ib4#8W zKv6F@tbI&MYTqj)R&F zty6s*f-TH0z5Z6%U>R}FulwkOyciKKvD*4Z<|<|bsh|MQ=@ z|HprZz90WXHvjtn6JjLDMT+$U%z&Br3@8GrIDF^Ve}-iPD+$RkG7$c7l_6H!_OTlQKhoA00000 LNkvXXu0mjfls0qn literal 0 HcmV?d00001 diff --git a/sites/all/modules/imce/css/ops.png b/sites/all/modules/imce/css/ops.png new file mode 100644 index 0000000000000000000000000000000000000000..25b4c2cd306c8c88c53f715a41641169506ebd1c GIT binary patch literal 164 zcmV;V09*fwP)fPe))!XUR+Ue2Q=h)us(AVeD*y!5e?AqV!+28Bj;q2Dj>fPb(+~Muh+31Z; z>QMjy04YgCK~xCW6~T!C01yxavElr`{+qQD3}bVcIBj$WS-mcTM!kHMq~!q<(EzrC SG?t?P0000ul-b z+eR5D9m?T6m+#-+eEIzC*Uu9- zUcY+(J+gM^)2B~UXTD9E@ZkNA|7{0P7H(Ldx3K5lhyOrO(ZQ1qv`e8R$S)Yg#{(E* zVx->!)mC}BIEF}Ej_qgUYgXWK)t>lBMq&x~!IuyIZI9U~HB~(5#A4MN4PJ$4ua}yq zieA64cI)CWQP*&qZEoyy>V?(v#ur1%s!npUXO@geCxw Cq^zm{ literal 0 HcmV?d00001 diff --git a/sites/all/modules/imce/css/sendto.png b/sites/all/modules/imce/css/sendto.png new file mode 100644 index 0000000000000000000000000000000000000000..90309230d3fdef07717510c5b687b9f105706e0a GIT binary patch literal 488 zcmVP)>MIQl_}jXquEl%GJ!pDlU|w%$1~Q%wHfE(%h*Tl9WR^Pm;5o z%Y~$TSA+>|7bwh>nY;)8pe>rt?y7G367dVyx!~LL38VjM+E0vMHVNDCdm3 z`d2}K=*4$!Gtl*kk}1ub;E~gq7k$XMFR&P8r`?^+xS1D8h2JSBA1;!P;=OVPOMFm1 zOYeMxwyPyoKwrFe+Wkt?)QVkV%9DZ#61x1~|A#)dG%wm`4-Le)s3-Gj{8qj{il0Tr{ z{=s3y0mxj$o~*>UtU?qE;8(!Q(8^$GrBLP+w)JvMbAPXu^ZXGW7nB0}S6D_N6laRv e{R&?7Z@dHod&N*riG=F_0000VD9%%W zT-WY0qUxq?K>s#$#6`hZ8=+B}B*fJx#D+Y!0f?y^xRj-7nkAg+MTC?!t8NQ`sPG}G zmpn8`TBV2oE^=d$6~#W_NCuG+RWA(_5~7HRw$$u(1#r?+?4W|0n~>FO9NblF{}a%@ z9)yjV#@$m$%Qut^%X%56nClD(i&Y$}CFJ>FTGn`Fca~L7`=fTQy&@(O?GC?O0j6?_ zlv>53PDsj^x|56`qdsnVobvpoqHK9l>;6S-=Zp1O*3Rv|_s literal 0 HcmV?d00001 diff --git a/sites/all/modules/imce/css/submit.png b/sites/all/modules/imce/css/submit.png new file mode 100644 index 0000000000000000000000000000000000000000..4e045722935ae792a92e4dd18097bf0b34a4b936 GIT binary patch literal 261 zcmV+g0s8)lP)i!F()j;J z2lM|Q?F|2atqb}8|L@QLP!}oUGawDD`N7`*Uwar(@ULTyFjth~GoT%$;>X#p{~snY zpy02Y{a^;n#AiSeNX4(`hyTBt$$)~to^OX4(1_0fMW{djf4ZLa~tfA2+BVHXV2X@oglH4}mz4oRlbs9&JM>FA$9Z-gqBL2Kjc^00000 LNkvXXu0mjf&TDfR literal 0 HcmV?d00001 diff --git a/sites/all/modules/imce/css/thumb.png b/sites/all/modules/imce/css/thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..ef2949794e01717117d4338659cbe1d8e8e383d8 GIT binary patch literal 1004 zcmVRJf)-5Dk_pJE0QfOl`=G(W@x!DGM6_zraVQiK1r}aO|?Z- zyG>-tOJ2lKXv%CMPE+C@3f?DJd!{Dl021EG#T7EiEoCE-x=HFfcGNF)=bSGBYzXG&D3d zH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}?K0iM{KtMo2K|w-7LPJACL_|bIMMXwN zMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuyP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7 zSXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?WjVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@ zX=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2Ta&vQYbaZreb#-=jc6WDoczAeud3kzz zdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyDgoK2Jg@uNOhKGlTh=_=ZiHVAeii?Yj zjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z}m6ev3mY0{8n3$NEnVFiJnwy)OoSdAU zot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5(rl+T;sHmu^si~@}s;jH3tgNi9t*x%E zuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#pxVX5vxw*Q!y1To(yu7@dCU$jHda$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD) z(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa z^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg={r&#_{{R2~brpGk0000WbW%=J|NsC0 z|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|Ns90TwELN0001cNklKD?#f0Ko_Jt~<^(bj z9j_cKqxqvIAK388sql+k`GH;>7|KNSv@#Z17DQoF?zja a0Q>_D95zs;3BpqV0000@`{S(*akZ5!|NsB@v~$-7+NDqu&`mp%{;-TyXfg!#_qW1F=u;jxM!U`Ch zr!L%|_KIQY2Zr?@85H+3cK6RHFK<=e%76aqlhFOX>o@GVaQ*r9yDzuz*md{rqXP%_ zojiGB_wHkITR1;_c>nU{%ZCpiym;|^^X4tvw{P>>YY$YsLTrOB&@T=pL4LviDFY0L zsyDg-&06Z|;us=vIrPkRp(X_`$39&mKL#|MKgf|KI-rZTolO`g4WP(q2HnIFtnW1p|dB z0St$#H@X1LTI1>B7$R{w_S|u?CIb=Ii{b*@3ZWA(xXfC>c;w#C|ND)OaCRHtnOwb4 zmL=Ed)zp9+?8&!UMBiw>*fHIYF^>Ckj7?wJw43QK60+WvJ^SMHYL<;;#-`V&q}zB`s&8`3c|7Wk- z!co0Nv~e3}^_C}3o`^PXx9r-^SGVok_ir3kTSOYSxlTVKP`{08@!Jb(J^$-{eJKY#f1_s@xA$1a>X^W^bk-jtmWA3l8i=)qSY z`1Wn`)R}Kyzk2`X#p`EJ+Sdsb6`m4nu3dWf(Br+P>m28?i$A<~ zNan3%ndWS*)0`}aSY6-7J$ck_=EN}DslDm()UMRLExr!F)_dtj9H05^X~;ZHlWvB0 o_HB%R?0zuFZQH$p-CzadpXc&>nNJ0=0Nu&p>FVdQ&MBb@0JFv-I{*Lx literal 0 HcmV?d00001 diff --git a/sites/all/modules/imce/css/warning.png b/sites/all/modules/imce/css/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..6d2756033a1c138f87cacf2bb8422f323c4ec2b1 GIT binary patch literal 444 zcmV;t0Ym;w6)(oadp1V{s#>$LhrQ)y&!{Z38Emf)CMz~gxh_49gOUB zz5_Q5v~>93^L#IrA0-kA8irDl=F1y&3V@ID(J0|+lTKRa)Ca&PDv-tG!ybKbBgtHw zVQ}2WE|A5tdre>L?=k?6+gJs%l&b8@dTWU-%Tj>j2JPPhS-K5xu)fWPVJN_HgZ5{E zETkU~sK>8qwr!g;nT!G)H)!yTERcn2_l{(7haJb^TrQ^o#|;`hLkpyNxq688MfO~a zUDxG&KCb}B4H`V~{wk2elsuT1-aYB>^?jc`&*MU&pa91W8a(hKGgx5Mk7T{Mz=3b8 z8ECiLiuf}$c;H1w3xrI|LkT}CvhHnh7=|1Kfd;bKtU|+bg9Z=0$RJA>MOt}2#(Ijo zk;9!%=cmLpO+_4r1`oW*AWN6)^v+MR?yPbYMT)_a!Emg@iwv^VIFm00003X_2hHzX@7I+XE!tzK@AuOFi xsMO()d`GpTjG}@bQxa#}|Ns9F8)~)t0d-Ynnw_}E8`b~- literal 0 HcmV?d00001 diff --git a/sites/all/modules/imce/css/y-resizer.png b/sites/all/modules/imce/css/y-resizer.png new file mode 100644 index 0000000000000000000000000000000000000000..3a32f6549b0234cb844ea337f268119ec2cc1223 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp@K+Md+1|&Tmw(yXvg#G#d z-=3L6Scti>tKo;eK)Isk0d2NN9t?&00;`olY=#JSlk@&6T%thT44$rjF6*2Ung9to B8o>Yn literal 0 HcmV?d00001 diff --git a/sites/all/modules/imce/imce.info b/sites/all/modules/imce/imce.info new file mode 100644 index 0000000..c812d4f --- /dev/null +++ b/sites/all/modules/imce/imce.info @@ -0,0 +1,12 @@ +name = "IMCE" +description = "An image/file uploader and browser supporting personal directories and user quota." +core = "7.x" +package = "Media" +configure = "admin/config/media/imce" + +; Information added by Drupal.org packaging script on 2017-05-27 +version = "7.x-1.11" +core = "7.x" +project = "imce" +datestamp = "1495890787" + diff --git a/sites/all/modules/imce/imce.install b/sites/all/modules/imce/imce.install new file mode 100644 index 0000000..9062e88 --- /dev/null +++ b/sites/all/modules/imce/imce.install @@ -0,0 +1,125 @@ +condition('module', 'imce')->execute(); + variable_del('imce_profiles'); + variable_del('imce_roles_profiles'); + variable_del('imce_settings_textarea'); + variable_del('imce_settings_absurls'); + variable_del('imce_settings_replace'); + variable_del('imce_settings_thumb_method'); + variable_del('imce_settings_disable_private'); + variable_del('imce_settings_admin_theme'); + variable_del('imce_custom_content'); + variable_del('imce_custom_process'); + variable_del('imce_custom_init'); + variable_del('imce_custom_scan'); + variable_del('imce_custom_response'); +} + +/** + * Updates from 6.x to 7.x. + */ +function imce_update_7000() { + // Update role-profile assignments + $roles_profiles = variable_get('imce_roles_profiles', array()); + if (!empty($roles_profiles)) { + $scheme = variable_get('file_default_scheme', 'public'); + foreach ($roles_profiles as $rid => &$role) { + $role[$scheme . '_pid'] = $role['pid']; + unset($role['pid']); + } + variable_set('imce_roles_profiles', $roles_profiles); + } + // Update textarea ids + $ids = str_replace(' ', '', variable_get('imce_settings_textarea', '')); + if ($ids != '') { + $ids = explode(',', $ids); + foreach ($ids as &$id) { + $id .= '*'; + } + variable_set('imce_settings_textarea', implode(', ', $ids)); + } +} + +/** + * Migrates imce files from {files} to {file_managed}. + * Removes {imce_files} in favor of {file_usage}. + */ +function imce_update_7001(&$sandbox) { + if (!db_table_exists('imce_files') || !db_table_exists('files')) { + return; + } + // Initiate progress + if (!isset($sandbox['progress'])) { + $sandbox['progress'] = 0; + $sandbox['last_fid_processed'] = 0; + $sandbox['max'] = db_query("SELECT COUNT(*) FROM {imce_files} i INNER JOIN {files} f ON i.fid = f.fid")->fetchField(); + } + // Prepare variables + $limit = 250; + $basedir = variable_get('file_directory_path', conf_path() . '/files') . '/'; + $baselen = strlen($basedir); + $scheme = file_default_scheme() . '://'; + $result = db_query_range('SELECT f.* FROM {imce_files} i INNER JOIN {files} f ON i.fid = f.fid WHERE i.fid > :fid ORDER BY i.fid', 0, $limit, array(':fid' => $sandbox['last_fid_processed']))->fetchAll(); + // Migrate imce files from {files} to {file_managed} + foreach ($result as $file) { + $relpath = substr($file->filepath, 0, $baselen) == $basedir ? substr($file->filepath, $baselen) : $file->filepath; + $file->uri = file_stream_wrapper_uri_normalize($scheme . $relpath); + unset($file->filepath); + if (!db_query("SELECT 1 FROM {file_managed} WHERE fid = :fid", array(':fid' => $file->fid))->fetchField()) { + // Check duplicate uri + if ($fid = db_query("SELECT fid FROM {file_managed} WHERE uri = :uri", array(':uri' => $file->uri))->fetchField()) { + $file->fid = $fid; + } + else { + drupal_write_record('file_managed', $file); + } + } + file_usage_add($file, 'imce', 'file', $file->fid); + $sandbox['progress']++; + $sandbox['last_fid_processed'] = $file->fid; + } + // Drop {imce_files} if the progress is complete. + $sandbox['#finished'] = empty($sandbox['max']) ? 1 : $sandbox['progress'] / $sandbox['max']; + if ($sandbox['#finished'] >= 1) { + db_drop_table('imce_files'); + return t('Migrated IMCE files.'); + } +} + +/** + * Fixes misconfigurations where anonymous user is given User-1 profile + */ +function imce_update_7002() { + $roles = variable_get('imce_roles_profiles', array()); + $rid = DRUPAL_ANONYMOUS_RID; + if (!empty($roles[$rid])) { + $update = FALSE; + foreach ($roles[$rid] as $key => $value) { + if ($value == 1 && substr($key, -4) == '_pid') { + $roles[$rid][$key] = '0'; + $update = TRUE; + } + } + if ($update) { + variable_set('imce_roles_profiles', $roles); + } + } +} \ No newline at end of file diff --git a/sites/all/modules/imce/imce.module b/sites/all/modules/imce/imce.module new file mode 100644 index 0000000..e2b6bae --- /dev/null +++ b/sites/all/modules/imce/imce.module @@ -0,0 +1,215 @@ + 'File browser', + 'page callback' => 'imce', + 'access callback' => 'imce_access', + 'access arguments' => array(FALSE, 1), + 'file' => 'inc/imce.page.inc', + 'type' => MENU_CALLBACK, + ); + $items['user/%user/imce'] = array( + 'title' => 'File browser', + 'page callback' => 'imce_user_page', + 'page arguments' => array(1), + 'access callback' => 'imce_user_page_access', + 'access arguments' => array(1), + 'file' => 'inc/imce.page.inc', + 'type' => MENU_LOCAL_TASK, + 'weight' => 10, + ); + $items['admin/config/media/imce'] = array( + 'title' => 'IMCE', + 'description' => 'Control how your image/file browser works.', + 'page callback' => 'imce_admin', + 'access arguments' => $access, + 'file' => 'inc/imce.admin.inc', + ); + $items['admin/config/media/imce/profile'] = array( + 'title' => 'Add new profile', + 'page callback' => 'imce_profile_operations', + 'access arguments' => $access, + 'type' => MENU_VISIBLE_IN_BREADCRUMB, + 'file' => 'inc/imce.admin.inc', + ); + return $items; +} + +/** + * Implements hook_admin_paths(). + */ +function imce_admin_paths() { + if (variable_get('imce_settings_admin_theme', FALSE)) { + return array( + 'imce' => TRUE, + 'imce/*' => TRUE, + 'file/imce/*' => TRUE, + 'imce-filefield/*' => TRUE, + ); + } +} + +/** + * Implements hook_permission(). + */ +function imce_permission() { + return array( + 'administer imce' => array( + 'title' => t('Administer IMCE'), + 'restrict access' => TRUE, + ), + ); +} + +/** + * Implements hook_theme(). + */ +function imce_theme() { + $path = drupal_get_path('module', 'imce') . '/tpl'; + $theme['imce_admin'] = array('function' => 'imce_admin_theme', 'render element' => 'form'); + $theme['imce_directories'] = array('function' => 'imce_directories_theme', 'render element' => 'form'); + $theme['imce_thumbnails'] = array('function' => 'imce_thumbnails_theme', 'render element' => 'form'); + $theme['imce_root_text'] = array( + 'variables' => array('imce_ref' => NULL), + ); + $theme['imce_user_page'] = array( + 'variables' => array('account' => NULL), + ); + $theme['imce_file_list'] = array( + 'template' => 'imce-file-list', + 'variables' => array('imce_ref' => NULL), + 'path' => $path, + ); + $theme['imce_content'] = array( + 'template' => 'imce-content', + 'variables' => array('tree' => NULL, 'forms' => NULL, 'imce_ref' => NULL), + 'path' => $path, + ); + $theme['imce_page'] = array( + 'template' => 'imce-page', + 'variables' => array('content' => NULL), + 'path' => $path, + ); + return $theme; +} + +/** + * Implements hook_file_download(). + * Support private downloads if not disabled. + */ +function imce_file_download($uri) { + $serve = file_uri_scheme($uri) == 'private' && !variable_get('imce_settings_disable_private', 1) && file_exists($uri) && strpos(basename($uri), '.'); + if ($serve) { + return array( + 'Content-type' => file_get_mimetype($uri), + 'Content-Length' => filesize($uri), + ); + } +} + +/** + * Implements hook_element_info(). + */ +function imce_element_info() { + return array('textarea' => array('#process' => array('imce_textarea'))); +} + +/** + * Inline image/link insertion to textareas. + */ +function imce_textarea($element) { + static $regexp; + if (!isset($regexp)) { + $regexp = FALSE; + if (imce_access() && $regexp = str_replace(' ', '', variable_get('imce_settings_textarea', ''))) { + $regexp = '@^(' . str_replace(',', '|', implode('.*', array_map('preg_quote', explode('*', $regexp)))) . ')$@'; + } + } + if ($regexp && preg_match($regexp, $element['#id'])) { + drupal_add_js(drupal_get_path('module', 'imce') . '/js/imce_set_inline.js'); + $element['#description'] = (isset($element['#description']) ? $element['#description'] : '') . ''; + } + return $element; +} + +/** + * Returns the configuration profile assigned to a user for a specific file scheme. + */ +function imce_user_profile($user, $scheme = NULL) { + static $ups = array(); + + // Set scheme + if (empty($scheme)) { + $scheme = variable_get('file_default_scheme', 'public'); + } + + // Return from cache. + if (isset($ups[$scheme][$user->uid])) { + return $ups[$scheme][$user->uid]; + } + $ups[$scheme][$user->uid] = FALSE; + + // Check scheme + $swrappers = file_get_stream_wrappers(); + if (!isset($swrappers[$scheme])) { + return FALSE; + } + + $profiles = variable_get('imce_profiles', array()); + $scinfo = array('scheme' => $scheme); + + // Handle user#1 separately + if ($user->uid == 1) { + return $ups[$scheme][$user->uid] = isset($profiles[1]) ? $profiles[1] + $scinfo : FALSE; + } + + // Handle regular users. + $roles_profiles = variable_get('imce_roles_profiles', array()); + $sckey = $scheme . '_pid'; + foreach ($roles_profiles as $rid => $conf) { + if (isset($user->roles[$rid]) && isset($conf[$sckey]) && isset($profiles[$conf[$sckey]])) { + return $ups[$scheme][$user->uid] = $profiles[$conf[$sckey]] + $scinfo; + } + } + + return FALSE; +} + +/** + * Checks if the user is assigned an imce profile. + * A more detailed assignment check is performed before imce loads. + */ +function imce_access($user = FALSE, $scheme = NULL) { + if ($user === FALSE) { + global $user; + } + return imce_user_profile($user, $scheme) ? TRUE : FALSE; +} + +/** + * Checks access to user/{$account->uid}/imce for the $user. + */ +function imce_user_page_access($account, $user = FALSE) { + if ($user === FALSE) { + global $user; + } + return ($user->uid == 1 || $account->uid == $user->uid) && ($profile = imce_user_profile($account)) && $profile['usertab']; +} + +/** + * Check if the directory name is regular. + */ +function imce_reg_dir($dirname) { + return $dirname == '.' || is_int($dirname) || (is_string($dirname) && $dirname != '' && !preg_match('@(^\s)|(^/)|(^\./)|(\s$)|(/$)|(/\.$)|(\.\.)|(//)|(\\\\)|(/\./)@', $dirname)); +} \ No newline at end of file diff --git a/sites/all/modules/imce/inc/imce.admin.inc b/sites/all/modules/imce/inc/imce.admin.inc new file mode 100644 index 0000000..23529c2 --- /dev/null +++ b/sites/all/modules/imce/inc/imce.admin.inc @@ -0,0 +1,747 @@ + t('Operations'), 'colspan' => 2)); + $rows = array(); + + foreach ($profiles as $pid => $profile) { + $rows[] = array( + check_plain($profile['name']), + l(t('Edit'), 'admin/config/media/imce/profile/edit/' . $pid), + $pid == 1 ? '' : l(t('Delete'), 'admin/config/media/imce/profile/delete/' . $pid), + ); + } + + $rows[] = array('', array('data' => l(t('Add new profile'), 'admin/config/media/imce/profile'), 'colspan' => 2)); + + $output['title'] = array( + '#markup' => '

' . t('Configuration profiles') . '

', + ); + $output['table'] = array( + '#theme' => 'table', + '#header' => $header, + '#rows' => $rows, + '#attributes' => array('id' => 'imce-profiles-list'), + ); + $output['form'] = drupal_get_form('imce_admin_form'); + + // Display security warnings + if (empty($_POST)) { + $roles = variable_get('imce_roles_profiles', array()); + if (!empty($roles[DRUPAL_ANONYMOUS_RID]['public_pid']) || !empty($roles[DRUPAL_ANONYMOUS_RID]['private_pid'])) { + drupal_set_message(t('Anonymous user role has access to IMCE.') . ' ' . t('Make sure this is not a misconfiguration.'), 'warning'); + } + if (imce_admin_check_wildcard_upload(DRUPAL_AUTHENTICATED_RID, $roles)) { + drupal_set_message(t('Authenticated user role is assigned a configuration profile with unrestricted file extensions.') . ' ' . t('Make sure this is not a misconfiguration.'), 'warning'); + } + } + + return $output; +} + +/** + * Admin form. + */ +function imce_admin_form($form, &$form_state) { + //roles profiles + $form['roles'] = array('#tree' => TRUE); + $roles = imce_sorted_roles(); + $form['#weighted'] = count($roles) > 3; + + foreach ($roles as $rid => $role) { + $core = $rid == DRUPAL_ANONYMOUS_RID || $rid == DRUPAL_AUTHENTICATED_RID; + $form['roles'][$rid] = imce_role_form($role, $form['#weighted'], $core); + } + + //common settings + $form['common'] = array( + '#type' => 'fieldset', + '#title' => t('Common settings'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ); + $form['common']['textarea'] = array( + '#type' => 'textfield', + '#title' => t('Enable inline image/file insertion into plain textareas'), + '#default_value' => variable_get('imce_settings_textarea', ''), + '#maxlength' => NULL, + '#description' => t('If you don\'t use any WYSIWYG editor, this feature will allow you to add your images or files as html code into any plain textarea. Enter comma separated textarea IDs under which you want to enable a link to IMCE. The * character is a wildcard. Hint: ID of Body fields in most node types starts with edit-body*.'), + ); + $form['common']['absurls'] = array( + '#type' => 'checkbox', + '#title' => t('Absolute URLs'), + '#default_value' => variable_get('imce_settings_absurls', 0), + '#description' => t('Check if you want IMCE to return absolute file URLs.'), + ); + $form['common']['replace'] = array( + '#type' => 'radios', + '#title' => t('Default behaviour for existing files during file uploads'), + '#default_value' => variable_get('imce_settings_replace', FILE_EXISTS_RENAME), + '#options' => array( + FILE_EXISTS_RENAME => t('Keep the existing file renaming the new one'), + FILE_EXISTS_ERROR => t('Keep the existing file rejecting the new one'), + FILE_EXISTS_REPLACE => t('Replace the existing file with the new one') + ), + ); + $form['common']['thumb_method'] = array( + '#type' => 'radios', + '#title' => t('Default method for creating thumbnails'), + '#default_value' => variable_get('imce_settings_thumb_method', 'scale_and_crop'), + '#options' => array( + 'scale' => t('Scale the image with respect to the thumbnail dimensions.'), + 'scale_and_crop' => t('First scale then crop the image to fit the thumbnail dimensions.') + ), + ); + $form['common']['disable_private'] = array( + '#type' => 'checkbox', + '#title' => t('Disable serving of private files'), + '#default_value' => variable_get('imce_settings_disable_private', 1), + '#description' => t('IMCE serves all files under private files directory without applying any access restrictions. This allows anonymous access to any file(/system/files/filename) unless there is a module restricting access to the files. Here you can disable this feature.'), + ); + $form['common']['admin_theme'] = array( + '#type' => 'checkbox', + '#title' => t('Use admin theme for IMCE paths'), + '#default_value' => variable_get('imce_settings_admin_theme', FALSE), + '#description' => t('If you have user interface issues with the active theme you may consider switching to admin theme.'), + ); + + $form['submit'] = array('#type' => 'submit', '#value' => t('Save configuration')); + $form['#theme'] = 'imce_admin'; + $form['#submit'][] = 'imce_admin_submit'; + return $form; +} + +/** + * Admin form themed. + */ +function imce_admin_theme($variables) { + $form = $variables['form']; + $profile1 = imce_user1_profile(); + $header = array(t('User role')); + $rows = array(array(t('Site maintenance account'))); + $keys = array('name'); + //add each stream wrapper as a column + $swrappers = file_get_stream_wrappers(STREAM_WRAPPERS_VISIBLE); + foreach ($swrappers as $scheme => $info) { + $header[] = l($info['name'], 'imce/' . $scheme); + $rows[0][] = check_plain($profile1['name']); + $keys[] = $scheme . '_pid'; + } + + //in case we need profile weights. + $weight_info = ''; + if ($form['#weighted']) { + $header[] = t('Weight'); + $rows[0][] = t('n/a'); + $keys[] = 'weight'; + $weight_info = t('For users who have multiple roles, the weight property will determine the assigned profile. Lighter roles that are placed upper will take the precedence. So, an administrator role should be placed over other roles by having a smaller weight, ie. -10.'); + } + + foreach (element_children($form['roles']) as $rid) { + $cells = array(); + foreach ($keys as $key) { + $cells[] = drupal_render($form['roles'][$rid][$key]); + } + $rows[] = $cells; + } + + $output = '

' . t('Role-profile assignments') . '

'; + $output .= theme('table', array('header' => $header, 'rows' => $rows)); + $output .= '
' . t('Assign profiles to user roles for available file systems. Your default file system is %name.', array('%name' => $swrappers[variable_get('file_default_scheme', 'public')]['name'])) . ' ' . $weight_info . '
'; + $output .= drupal_render($form['common']); + $output .= drupal_render_children($form); + return $output; +} + +/** + * Validate admin form. + */ +function imce_admin_form_validate($form, &$form_state) { + $roles = $form_state['values']['roles']; + // Check anonymous profile. Do not allow wildcard upload. + if ($key = imce_admin_check_wildcard_upload(DRUPAL_ANONYMOUS_RID, $roles)) { + form_error($form['roles'][DRUPAL_ANONYMOUS_RID][$key], t('Anonymous user role can not have a configuration profile with unrestricted file extensions.')); + } +} + +/** + * Submit admin form. + */ +function imce_admin_submit($form, &$form_state) { + $roles = $form_state['values']['roles']; + if (count($roles) > 3) { + uasort($roles, 'imce_rolesort'); + } + variable_set('imce_roles_profiles', $roles); + variable_set('imce_settings_textarea', $form_state['values']['textarea']); + variable_set('imce_settings_absurls', $form_state['values']['absurls']); + variable_set('imce_settings_replace', $form_state['values']['replace']); + variable_set('imce_settings_thumb_method', $form_state['values']['thumb_method']); + variable_set('imce_settings_disable_private', $form_state['values']['disable_private']); + variable_set('imce_settings_admin_theme', $form_state['values']['admin_theme']); + drupal_set_message(t('Changes have been saved.')); +} + +/** + * Add-Edit-Delete profiles. + */ +function imce_profile_operations($op = 'add', $pid = 0) { + //delete + if ($op == 'delete') { + drupal_set_title(t('Delete configuration profile')); + return drupal_get_form('imce_profile_delete_form', $pid); + } + //add-edit + if ($op === 'add' || $op === 'edit') { + return drupal_get_form('imce_profile_form', $pid); + } + drupal_access_denied(); +} + +/** + * Profile form. + */ +function imce_profile_form($form, &$form_state, $pid = 0) { + + if ($pid && $profile = imce_load_profile($pid)) { + drupal_set_title($profile['name']); + } + else { + $pid = 0; + $profile = imce_sample_profile(); + $profile['name'] = ''; + } + + //import profile + if (isset($_GET['import']) && $imported = imce_load_profile($_GET['import'])) { + if (empty($form_state['post'])) { + drupal_set_message(t('Settings were imported from the profile %name', array('%name' => $imported['name']))); + } + $imported['name'] = $profile['name']; //preserve the original name. + $profile = $imported; + } + + $form_state['profile'] = $profile;//store the original profile just in case. + + $form = array('#tree' => TRUE); + $form['name'] = array( + '#type' => 'textfield', + '#title' => t('Profile name'), + '#default_value' => $profile['name'], + '#description' => t('Give a name to this profile.'), + '#required' => TRUE, + ); + $form['import'] = array( + '#markup' => imce_profile_import_html($pid), + ); + $form['usertab'] = array( + '#type' => 'checkbox', + '#title' => t('Display file browser tab in user profile pages.'), + '#default_value' => $profile['usertab'], + ); + $form['filesize'] = array( + '#type' => 'textfield', + '#title' => t('Maximum file size per upload'), + '#default_value' => $profile['filesize'], + '#description' => t('Set to 0 to use the maximum value available.') . ' ' . t('Your PHP settings limit the maximum file size per upload to %size.', array('%size' => format_size(file_upload_max_size()))), + '#field_suffix' => t('MB'), + ); + $form['quota'] = array( + '#type' => 'textfield', + '#title' => t('Directory quota'), + '#default_value' => $profile['quota'], + '#description' => t('Define the upload quota per directory.') . ' ' . t('Set to 0 to use the maximum value available.'), + '#field_suffix' => t('MB'), + ); + $form['tuquota'] = array( + '#type' => 'textfield', + '#title' => t('Total user quota'), + '#default_value' => $profile['tuquota'], + '#description' => t('This quota measures the size of all user uploaded files in the database and does not include FTP files. You can either use both quotations together or safely ignore this by setting the value to 0.'), + '#field_suffix' => t('MB'), + ); + $form['extensions'] = array( + '#type' => 'textfield', + '#title' => t('Permitted file extensions'), + '#default_value' => $profile['extensions'], + '#maxlength' => 255, + '#description' => t('Specify the allowed file extensions for uploaded files. Separate extensions with a space and do not include the leading dot.') . ' ' . t('Set to * to remove the restriction.'), + ); + $form['dimensions'] = array( + '#type' => 'textfield', + '#title' => t('Maximum image dimensions'), + '#default_value' => $profile['dimensions'], + '#description' => t('The maximum allowed image size (e.g. 640x480). Set to 0 for no restriction. If an image toolkit is installed, files exceeding this value will be scaled down to fit.', array('!image-toolkit-link' => url('admin/config/media/image-toolkit'))), + '#field_suffix' => '' . t('WIDTHxHEIGHT') . '', + ); + $form['filenum'] = array( + '#type' => 'textfield', + '#title' => t('Maximum number of files per operation'), + '#default_value' => $profile['filenum'], + '#description' => t('You can allow users to select multiple files for operations such as delete, resize, etc. Entire batch file operation is executed in a single drupal load, which may be good. However there will be an increase in script execution time, cpu load and memory consumption possibly exceeding the limits of your server, which is really bad. For unlimited number of file handling, set this to 0.'), + ); + + //Directories + $form['directories']['#theme'] = 'imce_directories'; + $form['directories']['#weight'] = 1; + for ($i = 0; $i < count($profile['directories']); $i++) { + $form['directories'][$i] = imce_directory_form($profile['directories'][$i]); + } + $form['directories'][$i] = imce_directory_form(); + $form['directories'][$i+1] = imce_directory_form(); + + //Thumbnails + $form['thumbnails']['#theme'] = 'imce_thumbnails'; + $form['thumbnails']['#weight'] = 2; + for ($i = 0; $i < count($profile['thumbnails']); $i++) { + $form['thumbnails'][$i] = imce_thumbnail_form($profile['thumbnails'][$i]); + } + $form['thumbnails'][$i] = imce_thumbnail_form(); + $form['thumbnails'][$i+1] = imce_thumbnail_form(); + + $form = array('profile' => $form); + $form['pid'] = array('#type' => 'hidden', '#value' => $pid); + $form['submit'] = array('#type' => 'submit', '#value' => t('Save configuration')); + $form['#validate'][] = 'imce_profile_validate'; + $form['#submit'][] = 'imce_profile_submit'; + return $form; +} + +/** + * Profile form validate. + */ +function imce_profile_validate($form, &$form_state) { + $profile = &$form_state['values']['profile']; + $dim_re = '/^\d+x\d+$/'; + $dim_error = t('Dimensions must be specified in WIDTHxHEIGHT format.'); + // Check max image dimensions + if ($profile['dimensions'] && !preg_match($dim_re, $profile['dimensions'])) { + return form_set_error('profile][dimensions', $dim_error); + } + // Check thumbnails dimensions + foreach ($profile['thumbnails'] as $i => $thumb) { + if (trim($thumb['name']) != '' && !preg_match($dim_re, $thumb['dimensions'])) { + return form_set_error("profile][thumbnails][$i][dimensions", $dim_error); + } + } +} + +/** + * Profile form submit. + */ +function imce_profile_submit($form, &$form_state) { + $profile = $form_state['values']['profile']; + $pid = $form_state['values']['pid']; + $message = $pid > 0 ? t('The changes have been saved.') : t('Profile has been added.'); + + //unset empty fields of directories and thumbnails. + imce_clean_profile_fields($profile); + + //save profile. + $pid = imce_update_profiles($pid, $profile); + + drupal_set_message($message); + $form_state['redirect'] = 'admin/config/media/imce/profile/edit/' . $pid; +} + +/** + * directory settings form + */ +function imce_directory_form($directory = array()) { + if (empty($directory)) { + $directory = array('name' => '', 'subnav' => 0, 'browse' => 0, 'upload' => 0, 'thumb' => 0, 'delete' => 0, 'resize' => 0); + } + $form['name'] = array( + '#type' => 'textfield', + '#default_value' => $directory['name'], + '#size' => 24, + '#maxlength' => NULL, + ); + $form['subnav'] = array( + '#type' => 'checkbox', + '#title' => t('Including subdirectories'), + '#default_value' => $directory['subnav'], + ); + $form['browse'] = array( + '#type' => 'checkbox', + '#title' => t('Browse'), + '#default_value' => $directory['browse'], + ); + $form['upload'] = array( + '#type' => 'checkbox', + '#title' => t('Upload'), + '#default_value' => $directory['upload'], + ); + $form['thumb'] = array( + '#type' => 'checkbox', + '#title' => t('Thumbnails'), + '#default_value' => $directory['thumb'], + ); + $form['delete'] = array( + '#type' => 'checkbox', + '#title' => t('Delete'), + '#default_value' => $directory['delete'], + ); + $form['resize'] = array( + '#type' => 'checkbox', + '#title' => t('Resize'), + '#default_value' => $directory['resize'], + ); + return $form; +} + +/** + * Directorys form themed. + */ +function imce_directories_theme($variables) { + $form = $variables['form']; + $rows = array(); + $root = t('root'); + + foreach (element_children($form) as $key) { + //directory path + $row = array('
<' . $root . '>' . '/' . drupal_render($form[$key]['name']) . '
' . drupal_render($form[$key]['subnav'])); + unset($form[$key]['name'], $form[$key]['subnav']); + + //permissions + $header = array(); + foreach (element_children($form[$key]) as $perm) { + $header[] = $form[$key][$perm]['#title']; + unset($form[$key][$perm]['#title']); + $row[] = drupal_render($form[$key][$perm]); + } + + $rows[] = $row; + } + + array_unshift($header, t('Directory path')); + + $output = '

' . t('Directories') . '

'; + $output .= theme('table', array('header' => $header, 'rows' => $rows)); + $output .= '
' . t('Define directories that users of this profile can access. +
    +
  • Use alphanumeric characters as directory paths.
  • +
  • To specify file system root, just enter .(dot) character.
  • +
  • Use %uid as a placeholder for user ID. Ex: users/user%uid creates directories such as users/user1, users/user42, etc.
  • +
  • To remove a directory from the list, leave the directory path blank.
  • +
  • If you want more flexibility in directory paths you can execute php to return a directory path.
    + For php execution your directory path must start with php: and the rest must be a valid php code that is expected to return the actual directory path.
    Ex: php: return \'users/\'.$user->name; defines users/USER-NAME as the directory path.
    + A multi-level directory example php: return date(\'Y\', $user->created).\'/\'.date(\'m\', $user->created).\'/\'.$user->uid; defines MEMBERSHIP-YEAR/MONTH/USER-ID as the directory path, resulting in self-categorized user directories based on membership date.
    + Note that you should use the $user variable instead of $GLOBALS[\'user\'] since they are not always the same object.
  • +
+

Note that thumbnails permission does not affect thumbnail creation on upload. See thumbnails decription below.

+

If you need more fields, just fill all and save, and you will get two more on the next page.

') . '
'; + $output .= drupal_render_children($form); + return $output; +} + +/** + * thumbnail settings form + */ +function imce_thumbnail_form($thumb = array()) { + if (empty($thumb)) { + $thumb = array('name' => '', 'dimensions' => '', 'prefix' => '', 'suffix' => ''); + } + $form['name'] = array( + '#type' => 'textfield', + '#default_value' => $thumb['name'], + '#size' => 20, + ); + $form['dimensions'] = array( + '#type' => 'textfield', + '#default_value' => $thumb['dimensions'], + '#size' => 20, + ); + $form['prefix'] = array( + '#type' => 'textfield', + '#default_value' => $thumb['prefix'], + '#size' => 20, + ); + $form['suffix'] = array( + '#type' => 'textfield', + '#default_value' => $thumb['suffix'], + '#size' => 20, + ); + return $form; +} + +/** + * Thumbnails form themed. + */ +function imce_thumbnails_theme($variables) { + $form = $variables['form']; + $header = array(t('Name'), t('Dimensions'), t('Prefix'), t('Suffix')); + $rows = array(); + + foreach (element_children($form) as $key) { + $rows[] = array( + drupal_render($form[$key]['name']), + drupal_render($form[$key]['dimensions']), + drupal_render($form[$key]['prefix']), + drupal_render($form[$key]['suffix']), + ); + } + + $output = '

' . t('Thumbnails') . '

'; + $output .= theme('table', array('header' => $header, 'rows' => $rows)); + $output .= '
' . t('You may create a list of thumbnail options that users can choose from. +
    +
  • Use alphanumeric characters as thumbnail names.
  • +
  • Specify dimensions as WidthxHeight.
  • +
  • Prefix and suffix are strings that are added to original file name to create the thumbnail name.
  • +
  • An example thumbnail: Name = Small, Dimensions = 80x80, Prefix = small_
  • +
+

Note that users will always be able to create these thumbnails on file upload no matter what the thumbnail permission is.

+

If you need more fields, just fill all and save, and you will get two more on the next page.

') . '
'; + $output .= drupal_render_children($form); + return $output; +} + +/** + * Role-profile form + */ +function imce_role_form($role, $weight = TRUE, $core = TRUE) { + $form['name'] = array( + '#markup' => check_plain($role['name']), + ); + if ($weight) { + $form['weight'] = $core ? array( + '#type' => 'textfield', + '#value' => $role['weight'], + '#attributes' => array('readonly' => 'readonly', 'style' => 'border: none; width: 2em; background-color: transparent;'), + ) : array( + '#type' => 'weight', + '#default_value' => $role['weight'], + ); + } + foreach (array_keys(file_get_stream_wrappers(STREAM_WRAPPERS_VISIBLE)) as $scheme) { + $form[$scheme . '_pid'] = array( + '#type' => 'select', + '#options' => imce_profile_options(), + '#default_value' => $role[$scheme . '_pid'], + '#empty_value' => 0, + ); + } + return $form; +} + +/** + * Profile delete form + */ +function imce_profile_delete_form($form, &$form_state, $pid) { + if ($pid > 1 && $profile = imce_load_profile($pid)) { + $form['#submit'][] = 'imce_profile_delete_submit'; + $form['pid'] = array('#type' => 'hidden', '#value' => $pid); + return confirm_form($form, + t('Are you sure you want to delete the profile %name?', + array('%name' => $profile['name'])), + 'admin/config/media/imce', + '', + t('Delete'), + t('Cancel') + ); + } + drupal_goto('admin/config/media/imce'); +} + +/** + * Profile delete form submit + */ +function imce_profile_delete_submit($form, &$form_state) { + imce_update_profiles($form_state['values']['pid'], NULL); + drupal_set_message(t('Profile has been deleted.')); + $form_state['redirect'] = 'admin/config/media/imce'; +} + +/** + * Profile options. + */ +function imce_profile_options() { + $options = array(); + foreach (variable_get('imce_profiles', array()) as $pid => $profile) { + $options[$pid] = $profile['name']; + } + return $options; +} + +/** + * Profile import links. + */ +function imce_profile_import_html($pid = 0) { + $output = ''; + $links = array(); + + foreach (variable_get('imce_profiles', array()) as $id => $profile) { + if ($pid != $id) { + $links[] = l($profile['name'], $_GET['q'], array('query' => array('import' => $id))); + } + } + + if (!empty($links)) { + $output = '

' . t('Import settings from other profiles') . ': '; + $output .= implode(', ', $links) . '

'; + } + + return $output; +} + +/** + * Update role-profile assignments. + */ +function imce_update_roles($pid) { + $roles = variable_get('imce_roles_profiles', array()); + foreach ($roles as $rid => $role) { + foreach ($role as $key => $value) { + if (substr($key, -4) == '_pid') { + if ($value == $pid) { + $roles[$rid][$key] = 0; + } + elseif ($value > $pid) { + $roles[$rid][$key]--; + } + } + } + } + variable_set('imce_roles_profiles', $roles); +} + +/** + * Add, update or delete a profile. + */ +function imce_update_profiles($pid, $profile = NULL) { + $profiles = variable_get('imce_profiles', array()); + + //add or update + if (isset($profile)) { + $pid = isset($profiles[$pid]) ? $pid : count($profiles)+1; + $profiles[$pid] = $profile; + } + + //delete + elseif (isset($profiles[$pid]) && $pid > 1) { + unset($profiles[$pid]); + for ($i = $pid+1; isset($profiles[$i]); $i++) { + $profiles[$i-1] = $profiles[$i]; + unset($profiles[$i]); + } + imce_update_roles($pid); + } + + variable_set('imce_profiles', $profiles); + return $pid; +} + +/** + * Unset empty fields in thumbnails and directory paths. + */ +function imce_clean_profile_fields(&$profile) { + $clean = array(); + foreach ($profile['thumbnails'] as $thumb) { + if (trim($thumb['name']) != '') { + $clean[] = $thumb; + } + } + $profile['thumbnails'] = $clean; + + $clean = array(); + $names = array(); + foreach ($profile['directories'] as $dir) { + $dir['name'] = trim($dir['name'], '/ '); + if ($dir['name'] == '') { + continue; + } + if (isset($names[$dir['name']])) { + drupal_set_message(t('Duplicate directory paths are not allowed.'), 'error'); + continue; + } + if (!imce_reg_dir($dir['name'])) { + drupal_set_message(t('%dirname is not accepted as a proper directory name.', array('%dirname' => $dir['name'])), 'error'); + continue; + } + $clean[] = $dir; + $names[$dir['name']] = 1; + } + $profile['directories'] = $clean; +} + +/** + * Profile load. + */ +function imce_load_profile($pid) { + $profiles = variable_get('imce_profiles', array()); + return isset($profiles[$pid]) ? $profiles[$pid] : NULL; +} + +/** + * Sort roles according to their weights. + */ +function imce_sorted_roles() { + static $sorted; + if (!isset($sorted)) { + $sorted = array(); + $roles = user_roles(); + $profiles = variable_get('imce_profiles', array()); + $roles_profiles = variable_get('imce_roles_profiles', array()); + $roles_profiles[DRUPAL_ANONYMOUS_RID]['weight'] = 12; + $roles_profiles[DRUPAL_AUTHENTICATED_RID]['weight'] = 11; + $schemes = array_keys(file_get_stream_wrappers(STREAM_WRAPPERS_VISIBLE)); + foreach ($roles as $rid => $name) { + $sorted[$rid] = array( + 'name' => $name, + 'weight' => isset($roles_profiles[$rid]['weight']) ? $roles_profiles[$rid]['weight'] : 0 + ); + foreach ($schemes as $scheme) { + $key = $scheme . '_pid'; + $sorted[$rid][$key] = isset($roles_profiles[$rid][$key]) && isset($profiles[$roles_profiles[$rid][$key]]) ? $roles_profiles[$rid][$key] : 0; + } + } + uasort($sorted, 'imce_rolesort'); + } + return $sorted; +} + +/** + * Sorting function for roles. + */ +function imce_rolesort($r1, $r2) { + return $r1['weight']-$r2['weight']; +} + +/** + * Checks if the given role can upload all extensions. + */ +function imce_admin_check_wildcard_upload($rid, $conf = NULL) { + if (!isset($conf)) { + $conf = variable_get('imce_roles_profiles', array()); + } + if (!empty($conf[$rid])) { + foreach ($conf[$rid] as $key => $pid) { + if ($pid && substr($key, -4) == '_pid') { + if ($profile = imce_load_profile($pid)) { + if ($profile['extensions'] === '*' && !empty($profile['directories'])) { + foreach ($profile['directories'] as $dirconf) { + if (!empty($dirconf['upload'])) { + return $key; + } + } + } + } + } + } + } + return FALSE; +} + +//Include core profile functions. +include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'imce') . '/inc/imce.core.profiles.inc'; \ No newline at end of file diff --git a/sites/all/modules/imce/inc/imce.core.profiles.inc b/sites/all/modules/imce/inc/imce.core.profiles.inc new file mode 100644 index 0000000..7495773 --- /dev/null +++ b/sites/all/modules/imce/inc/imce.core.profiles.inc @@ -0,0 +1,56 @@ + $n, 'usertab' => $u, 'filesize' => $f, 'quota' => $q, 'tuquota' => $tq, 'extensions' => $e, 'dimensions' => $d, 'filenum' => $fn, 'directories' => array(), 'thumbnails' => array()); + foreach ($ds as $d) { + $profile['directories'][] = array('name' => $d[0], 'subnav' => $d[1], 'browse' => $d[2], 'upload' => $d[3], 'thumb' => $d[4], 'delete' => $d[5], 'resize' => $d[6]); + } + foreach ($ts as $t) { + $profile['thumbnails'][] = array('name' => $t[0], 'dimensions' => $t[1], 'prefix' => $t[2], 'suffix' => $t[3]); + } + return $profile; +} + +/** + * User1's profile. + */ +function imce_user1_profile() { + $profiles = variable_get('imce_profiles', array()); + if (isset($profiles[1])) { + return $profiles[1]; + } + return imce_construct_profile('User-1', 1, 0, 0, 0, '*', '1200x1200', 0, array(array('.', 1, 1, 1, 1, 1, 1)), array(array('Small', '90x90', 'small_', ''), array('Medium', '120x120', 'medium_', ''), array('Large', '180x180', 'large_', ''))); +} + +/** + * Default profile. + */ +function imce_sample_profile() { + return imce_construct_profile('Sample profile', 1, 1, 2, 0, 'gif png jpg jpeg', '800x600', 1, array(array('u%uid', 0, 1, 1, 1, 0, 0)), array(array('Thumb', '90x90', 'thumb_', ''))); +} diff --git a/sites/all/modules/imce/inc/imce.js.inc b/sites/all/modules/imce/inc/imce.js.inc new file mode 100644 index 0000000..7e500c5 --- /dev/null +++ b/sites/all/modules/imce/inc/imce.js.inc @@ -0,0 +1,67 @@ + theme('imce_file_list', array('imce_ref' => array('imce' => &$imce))), + 'dirsize' => format_size($imce['dirsize']), + 'subdirectories' => array_map('rawurlencode', array_values($imce['subdirectories'])), + 'perm' => $imce['perm'] + ); +} + +/** + * Ajax operation: upload + */ +function imce_js_upload(&$imce) { + if ($imce['perm']['upload']) { + $_POST['op'] = t('Upload'); + drupal_get_form('imce_upload_form', array('imce' => &$imce)); + return array('added' => isset($imce['added']) ? $imce['added'] : NULL, 'dirsize' => format_size($imce['dirsize'])); + } +} + +/** + * Ajax operation: thumbnails + */ +function imce_js_thumb(&$imce) { + if ($imce['perm']['thumb']) { + $_POST['op'] = t('Create thumbnails'); + return imce_process_fileop($imce); + } +} + +/** + * Ajax operation: delete + */ +function imce_js_delete(&$imce) { + if ($imce['perm']['delete']) { + $_POST['op'] = t('Delete'); + return imce_process_fileop($imce); + } +} + +/** + * Ajax operation: resize + */ +function imce_js_resize(&$imce) { + if ($imce['perm']['resize']) { + $_POST['op'] = t('Resize'); + return imce_process_fileop($imce); + } +} + +/** + * Process file operations form + */ +function imce_process_fileop(&$imce) { + drupal_get_form('imce_fileop_form', array('imce' => &$imce)); + return array('added' => isset($imce['added']) ? $imce['added'] : NULL, 'removed' => isset($imce['removed']) ? $imce['removed'] : NULL, 'dirsize' => format_size($imce['dirsize'])); +} \ No newline at end of file diff --git a/sites/all/modules/imce/inc/imce.page.inc b/sites/all/modules/imce/inc/imce.page.inc new file mode 100644 index 0000000..32e267c --- /dev/null +++ b/sites/all/modules/imce/inc/imce.page.inc @@ -0,0 +1,1129 @@ + $account)); +} + +/** + * Returns the imce page for the specified user and the file scheme. + */ +function imce_page($user, $scheme = NULL, $jsop = NULL) { + return theme('imce_page', array('content' => imce_content($user, $scheme, $jsop))); +} + +/** + * Returns the content of the file browser. + */ +function imce_content($user, $scheme = NULL, $jsop = NULL) { + + //execute ajax calls. + if ($jsop) { + return imce_js($user, $scheme, $jsop); + } + + //initiate configuration profile + if (!$imce = imce_initiate_profile($user, $scheme)) { + return ''; + } + imce_process_profile($imce);//get active directory content + + //Before creating the content let's add main files required for imce to function properly. + $path = drupal_get_path('module', 'imce'); + drupal_add_js($path . '/js/jquery.form.js'); + drupal_add_js($path . '/js/imce.js'); + drupal_add_js($path . '/js/imce_extras.js'); + drupal_add_css($path . '/css/imce-content.css'); + + //process forms. + $imce_ref = array('imce' => &$imce); + $forms = array(); + if (!$imce['error']) { + //process file upload. + if (imce_perm_exists($imce, 'upload')) { + $forms[] = drupal_get_form('imce_upload_form', $imce_ref); + } + //process file operations. + $forms[] = drupal_get_form('imce_fileop_form', $imce_ref); + } + $forms = drupal_render($forms); + + //run custom content functions. possible to insert extra forms. content is invisible when js is enabled. + foreach (variable_get('imce_custom_content', array()) as $func => $state) { + if ($state && function_exists($func) && $output = $func($imce)) { + $forms .= $output; + } + } + + $content = theme('imce_content', array( + 'tree' => imce_create_tree($imce), + 'forms' => $forms, + 'imce_ref' => $imce_ref, + )); + + //make necessary changes for js conversion + $imce['dir'] = str_replace('%2F', '/', rawurlencode($imce['dir'])); + unset($imce['files'], $imce['name'], $imce['directories'], $imce['subdirectories'], $imce['filesize'], $imce['quota'], $imce['tuquota'], $imce['thumbnails'], $imce['uid'], $imce['usertab']); + + drupal_add_js($imce_ref, 'setting'); + + return $content; +} + +/** + * Ajax operations. q=imce&jsop={op} + */ +function imce_js($user, $scheme, $jsop = '') { + $response = array(); + + //data + if ($imce = imce_initiate_profile($user, $scheme)) { + imce_process_profile($imce); + if (!$imce['error']) { + module_load_include('inc', 'imce', 'inc/imce.js'); + if (function_exists($func = 'imce_js_' . $jsop)) { + $response['data'] = $func($imce); + } + // Allow alteration of response. + foreach (variable_get('imce_custom_response', array()) as $func => $state) { + if ($state && function_exists($func)) { + $func($jsop, $response, $imce, $user); + } + } + } + } + //messages + $response['messages'] = drupal_get_messages(); + + //disable devel log. + $GLOBALS['devel_shutdown'] = FALSE; + //for upload we must return plain text header. + drupal_add_http_header('Content-Type', (!empty($_POST['html_response']) ? 'text/html' : 'application/json') . '; charset=utf-8'); + print drupal_json_encode($response); + exit(); +} + +/** + * Upload form. + */ +function imce_upload_form($form, &$form_state, $ref) { + $imce =& $ref['imce']; + $form['imce'] = array( + '#type' => 'file', + '#title' => t('File'), + '#size' => 30, + ); + if (!empty($imce['thumbnails'])) { + $form['thumbnails'] = array( + '#type' => 'checkboxes', + '#title' => t('Create thumbnails'), + '#options' => imce_thumbnail_options($imce['thumbnails']), + ); + } + $form['upload'] = array( + '#type' => 'submit', + '#value' => t('Upload'), + '#submit' => $imce['perm']['upload'] ? array('imce_upload_submit') : NULL, + ); + $form = array('fset_upload' => array('#type' => 'fieldset', '#title' => t('Upload file')) + $form); + $form['html_response'] = array('#type' => 'hidden', '#default_value' => '1'); + $form['#attributes']['enctype'] = 'multipart/form-data'; + $form['#action'] = $imce['url']; + return $form; +} + +/** + * File operations form. + */ +function imce_fileop_form($form, &$form_state, $ref) { + $imce =& $ref['imce']; + $form['filenames'] = array( + '#type' => 'textfield', + '#title' => t('Selected files'), + '#maxlength' => $imce['filenum'] ? $imce['filenum']*255 : NULL, + ); + + //thumbnail + if (!empty($imce['thumbnails']) && imce_perm_exists($imce, 'thumb')) { + $form['fset_thumb'] = array( + '#type' => 'fieldset', + '#title' => t('Thumbnails'), + ) + imce_thumb_form($imce); + } + + //delete + if (imce_perm_exists($imce, 'delete')) { + $form['fset_delete'] = array( + '#type' => 'fieldset', + '#title' => t('Delete'), + ) + imce_delete_form($imce); + } + + //resize + if (imce_perm_exists($imce, 'resize')) { + $form['fset_resize'] = array( + '#type' => 'fieldset', + '#title' => t('Resize'), + ) + imce_resize_form($imce); + } + + $form['#action'] = $imce['url']; + return $form; +} + +/** + * Thumbnail form. + */ +function imce_thumb_form(&$imce) { + $form['thumbnails'] = array( + '#type' => 'checkboxes', + '#title' => t('Thumbnails'), + '#options' => imce_thumbnail_options($imce['thumbnails']), + ); + $form['thumb'] = array( + '#type' => 'submit', + '#value' => t('Create thumbnails'), + '#submit' => $imce['perm']['thumb'] ? array('imce_thumb_submit') : NULL, + ); + return $form; +} + +/** + * Delete form. + */ +function imce_delete_form(&$imce) { + $form['delete'] = array( + '#type' => 'submit', + '#value' => t('Delete'), + '#submit' => $imce['perm']['delete'] ? array('imce_delete_submit') : NULL, + ); + return $form; +} + +/** + * Resizing form. + */ +function imce_resize_form(&$imce) { + $form['width'] = array( + '#type' => 'textfield', + '#title' => t('Width x Height'), + '#size' => 5, + '#maxlength' => 4, + '#prefix' => '
', + ); + $form['height'] = array( + '#type' => 'textfield', + '#size' => 5, + '#maxlength' => 4, + '#prefix' => 'x', + ); + $form['resize'] = array( + '#type' => 'submit', + '#value' => t('Resize'), + '#submit' => $imce['perm']['resize'] ? array('imce_resize_submit') : NULL,//permission for submission + '#suffix' => '
', + ); + $form['copy'] = array( + '#type' => 'checkbox', + '#title' => t('Create a new image'), + '#default_value' => 1, + ); + return $form; +} + +/** + * Validate file operations form. + */ +function imce_fileop_form_validate($form, &$form_state) { + $imce =& $form_state['build_info']['args'][0]['imce']; + + //check if the filenames is empty + if ($form_state['values']['filenames'] == '') { + return form_error($form['filenames'], t('Please select a file.')); + } + + //filenames come separated by colon + $filenames = explode(':', $form_state['values']['filenames']); + $cnt = count($filenames); + //check the number of files. + if ($imce['filenum'] && $cnt > $imce['filenum']) { + return form_error($form['filenames'], t('You are not allowed to operate on more than %num files.', array('%num' => $imce['filenum']))); + } + + //check if there is any illegal choice + for ($i = 0; $i < $cnt; $i++) { + $filenames[$i] = $filename = rawurldecode($filenames[$i]); + if (!isset($imce['files'][$filename])) { + watchdog('imce', 'Illegal choice %choice in !name element.', array('%choice' => $filename, '!name' => t('directory (%dir)', array('%dir' => imce_dir_uri($imce)))), WATCHDOG_ERROR); + return form_error($form['filenames'], t('An illegal choice has been detected. Please contact the site administrator.')); + } + } + + $form_state['values']['filenames'] = $filenames; +} + +/** + * Submit upload form. + */ +function imce_upload_submit($form, &$form_state) { + $form_state['redirect'] = FALSE; + $imce =& $form_state['build_info']['args'][0]['imce']; + // Need to provide extension validatior, otherwise file_save_upload uses the default. + $validators['file_validate_extensions'] = array($imce['extensions'] === '*' ? NULL : $imce['extensions']); + $validators['imce_validate_all'] = array(&$imce); + $diruri = imce_dir_uri($imce); + + //save uploaded file. + $replace = variable_get('imce_settings_replace', FILE_EXISTS_RENAME); + if ($file = file_save_upload('imce', $validators, $diruri, $replace)) { + + //core bug #54223. + if ($replace == FILE_EXISTS_RENAME) { + $name = drupal_basename($file->uri); + if ($name != $file->filename) { + $file->filename = $name; + drupal_set_message(t('The file has been renamed to %filename.', array('%filename' => $file->filename))); + } + } + + $file->uid = $imce['uid'];//global user may not be the owner. + $file->status = FILE_STATUS_PERMANENT; + file_save($file); + imce_file_register($file); + drupal_set_message(t('%filename has been uploaded.', array('%filename' => $file->filename))); + + //update file list + $img = imce_image_info($file->uri); + $file->width = $img ? $img['width'] : 0; + $file->height = $img ? $img['height'] : 0; + imce_add_file($file, $imce); + + //create thumbnails + if (isset($form_state['values']['thumbnails']) && $img) { + imce_create_thumbnails($file->filename, $imce, $form_state['values']['thumbnails']); + } + } + else { + drupal_set_message(t('Upload failed.'), 'error'); + } +} + +/** + * Submit thumbnail form. + */ +function imce_thumb_submit($form, &$form_state) { + $form_state['redirect'] = FALSE; + $imce =& $form_state['build_info']['args'][0]['imce']; + //create thumbnails + imce_process_files($form_state['values']['filenames'], $imce, 'imce_create_thumbnails', array($form_state['values']['thumbnails'])); +} + +/** + * Submit delete form. + */ +function imce_delete_submit($form, &$form_state) { + $form_state['redirect'] = FALSE; + $imce =& $form_state['build_info']['args'][0]['imce']; + + $deleted = imce_process_files($form_state['values']['filenames'], $imce, 'imce_delete_file'); + + if (!empty($deleted)) { + drupal_set_message(t('File deletion successful: %files.', array('%files' => utf8_encode(implode(', ', $deleted))))); + } + +} + +/** + * Submit resize form. + */ +function imce_resize_submit($form, &$form_state) { + $form_state['redirect'] = FALSE; + $imce =& $form_state['build_info']['args'][0]['imce']; + + //check dimensions + $width = (int) $form_state['values']['width']; + $height = (int) $form_state['values']['height']; + list($maxw, $maxh) = $imce['dimensions'] ? explode('x', $imce['dimensions']) : array(0, 0); + if ($width < 1 || $height < 1 || ($maxw && ($width > $maxw || $height > $maxh))) { + drupal_set_message(t('Please specify dimensions within the allowed range that is from 1x1 to @dimensions.', array('@dimensions' => $imce['dimensions'] ? $imce['dimensions'] : t('unlimited'))), 'error'); + return; + } + + $resized = imce_process_files($form_state['values']['filenames'], $imce, 'imce_resize_image', array($width, $height, $form_state['values']['copy'])); + + if (!empty($resized)) { + drupal_set_message(t('File resizing successful: %files.', array('%files' => utf8_encode(implode(', ', $resized))))); + } + +} + +/** + * Do batch operations on files. + * Used by delete, resize, create thumbnail submissions. + */ +function imce_process_files($filenames, &$imce, $function, $args = array()) { + $args = array_merge(array('', &$imce), $args); + $processed = array(); + + foreach ($filenames as $filename) { + $args[0] = $filename; + if (call_user_func_array($function, $args)) { + $processed[] = $filename; + } + } + + return $processed; +} + +/** + * Deletes a file in the file list. + */ +function imce_delete_file($filename, &$imce) { + $uri = imce_dir_uri($imce) . $filename; + if (!imce_delete_filepath($uri)) { + return FALSE; + } + imce_remove_file($filename, $imce); + return TRUE; +} + +/** + * Deletes a file by uri. + */ +function imce_delete_filepath($uri) { + $file = file_load_multiple(array(), array('uri' => $uri)); + $file = reset($file); + + // File exists in database + if ($file) { + $usage = file_usage_list($file); + $is_imce = isset($usage['imce']); + unset($usage['imce']); + // File is in use by an other module. + if (!empty($usage)) { + drupal_set_message(t('%filename is in use by another application.', array('%filename' => $file->filename)), 'error'); + return FALSE; + } + // Force delete file. Prevent running file_usage_list() second time. + if (!file_delete($file, TRUE)) { + return FALSE; + } + } + // Not in db. Probably loaded via ftp. + elseif (!file_unmanaged_delete($uri)) { + return FALSE; + } + + return TRUE; +} + +/** + * Create all selected thumbnails. + */ +function imce_create_thumbnails($filename, &$imce, $values) { + $created = array(); + foreach ($imce['thumbnails'] as $thumbnail) { + if ($values[$thumbnail['name']] && imce_create_thumbnail($filename, $imce, $thumbnail)) { + $created[] = $thumbnail['name']; + } + } + if (!empty($created)) { + drupal_set_message(t('Thumbnail creation (%thumbnames) successful for %filename.', array('%thumbnames' => implode(', ', $created), '%filename' => utf8_encode($filename)))); + } + return $created; +} + +/** + * Create a thumbnail. + */ +function imce_create_thumbnail($filename, &$imce, $thumbnail) { + //generate thumbnail name + $name = $thumbnail['prefix']; + if ($thumbnail['suffix'] != '' && $dot = strrpos($filename, '.')) { + $name .= substr($filename, 0, $dot); + $name .= $thumbnail['suffix']; + $name .= substr($filename, $dot); + } + else { + $name .= $filename; + } + //scale the image + list($width, $height) = explode('x', $thumbnail['dimensions']); + return imce_resize_image($filename, $imce, $width, $height, TRUE, $name, variable_get('imce_settings_thumb_method', 'scale_and_crop')); +} + +/** + * Resize an image in the file list. Also used for thumbnail creation. + */ +function imce_resize_image($filename, &$imce, $width, $height, $copy = TRUE, $destname = FALSE, $op = 'resize') { + $destdir = imce_dir_uri($imce); + $imguri = $destdir . $filename; + + //check if the file is an image + if (!$imce['files'][$filename]['width'] || !$img = imce_image_info($imguri)) { + drupal_set_message(t('%filename is not an image.', array('%filename' => utf8_encode($filename))), 'error', FALSE); + return FALSE; + } + + if (substr($op, 0, 5) == 'scale' && !($width < $img['width'] || $height < $img['height'])) { + drupal_set_message(t('Scaling up is not allowed.'), 'error', FALSE); + return FALSE; + } + + //create file object + $file = new stdClass(); + $file->uri = $destdir . $destname; + if (!$destname || $destname == $filename) { + $file->uri = $copy ? file_create_filename($filename, $destdir) : $imguri; + } + $file->filename = drupal_basename($file->uri); + + //check if a file having the same properties exists already. + if (isset($imce['files'][$file->filename])) { + if (($f = $imce['files'][$file->filename]) && $f['width'] == $width && $f['height'] == $height) { + drupal_set_message(t('%filename(%dimensions) already exists.', array('%filename' => utf8_encode($file->filename), '%dimensions' => $width . 'x' . $height)), 'error'); + return FALSE; + } + } + + //validate file name + $errors = file_validate_name_length($file); + if (!empty($errors)) { + drupal_set_message($errors[0], 'error'); + return FALSE; + } + + //resize image + $image = image_load($imguri); + $function = 'image_' . $op; + if (!$image || !function_exists($function) || !$function($image, $width, $height)) { + drupal_set_message(t('%filename cannot be resized to %dimensions', array('%filename' => utf8_encode($filename), '%dimensions' => $width . 'x' . $height)), 'error', FALSE); + return FALSE; + } + + //copy to a temp file + if (!$tempuri = drupal_tempnam('temporary://', 'imce')) { + return FALSE; + } + register_shutdown_function('file_unmanaged_delete', $tempuri); + if (!image_save($image, $tempuri) || !$image->info) { + return FALSE; + } + + //validate quota + $file->filesize = $image->info['file_size']; + $quotadiff = $file->filename == $filename ? -$imce['files'][$filename]['size'] : 0; + if (!imce_validate_quotas($file, $imce, $quotadiff)) { + return FALSE; + } + + //build the rest of the file object + $file->uid = $imce['uid']; + $file->filemime = $img['mime']; + $file->status = FILE_STATUS_PERMANENT; + $file->timestamp = REQUEST_TIME; + + //copy from temp to file uri + $destination = $file->uri; + $file->uri = $tempuri; + if (!$file = file_copy($file, $destination, FILE_EXISTS_REPLACE)) { + return FALSE; + } + imce_file_register($file); + + //update file list + //if the file was scaled get the new dimensions + if ($op == 'scale') { + $img = imce_image_info($file->uri); + $width = $img['width']; + $height = $img['height']; + } + $file->width = $width; + $file->height = $height; + imce_add_file($file, $imce); + + return $file; +} + +/** + * Add a new file to the file list. + */ +function imce_add_file($file, &$imce) { + $imce['dirsize'] += $file->filesize; + if (isset($imce['files'][$file->filename])) { + $imce['dirsize'] -= $imce['files'][$file->filename]['size']; + } + $imce['files'][$file->filename] = array( + 'name' => $file->filename, + 'size' => $file->filesize, + 'width' => $file->width, + 'height' => $file->height, + 'date' => $file->timestamp + ); + if (isset($_GET['jsop'])) { + $add = $imce['files'][$file->filename]; + $add['name'] = rawurlencode($file->filename); + $add['fsize'] = format_size($file->filesize); + $add['fdate'] = format_date($file->timestamp, 'short'); + $add['id'] = $file->fid; + $imce['added'][] = $add; + } +} + +/** + * Remove a file from the file list. + */ +function imce_remove_file($filename, &$imce) { + if (isset($imce['files'][$filename])) { + $imce['dirsize'] -= $imce['files'][$filename]['size']; + unset($imce['files'][$filename]); + if (isset($_GET['jsop'])) { + $imce['removed'][] = rawurlencode($filename); + } + } +} + +/** + * Validate uploaded file. + */ +function imce_validate_all($file, $imce) { + + //validate image resolution only if filesize validation passes. + //because user might have uploaded a very big image + //and scaling it may exploit system memory. + $errors = imce_validate_filesize($file, $imce['filesize']); + //image resolution validation + if (empty($errors) && preg_match('/\.(png|gif|jpe?g)$/i', $file->filename)) { + $errors = array_merge($errors, file_validate_image_resolution($file, $imce['dimensions'])); + } + //directory quota validation + if ($imce['quota']) { + $errors = array_merge($errors, imce_validate_quota($file, $imce['quota'], $imce['dirsize'])); + } + //user quota validation. check it if no errors were thrown. + if (empty($errors) && $imce['tuquota']) { + $errors = imce_validate_tuquota($file, $imce['tuquota'], file_space_used($imce['uid'])); + } + return $errors; +} + +/** + * Validate filesize for maximum allowed file size. + */ +function imce_validate_filesize($file, $maxsize = 0) { + $errors = array(); + if ($maxsize && $file->filesize > $maxsize) { + $errors[] = t('The file is %filesize exceeding the maximum file size of %maxsize.', array('%filesize' => format_size($file->filesize), '%maxsize' => format_size($maxsize))); + } + return $errors; +} + +/** + * Validate filesize for directory quota. + */ +function imce_validate_quota($file, $quota = 0, $currentsize = 0) { + $errors = array(); + if ($quota && ($currentsize + $file->filesize) > $quota) { + $errors[] = t('%filename is %filesize which would exceed your directory quota. You are currently using %size of %total_quota.', array('%size' => format_size($currentsize), '%total_quota' => format_size($quota), '%filesize' => format_size($file->filesize), '%filename' => utf8_encode($file->filename))); + } + return $errors; +} + +/** + * Validate filesize for total user quota. + */ +function imce_validate_tuquota($file, $quota = 0, $currentsize = 0) { + $errors = array(); + if ($quota && ($currentsize + $file->filesize) > $quota) { + $errors[] = t('%filename is %filesize which would exceed your total user quota. You are currently using %size of %total_quota.', array('%size' => format_size($currentsize), '%total_quota' => format_size($quota), '%filesize' => format_size($file->filesize), '%filename' => utf8_encode($file->filename))); + } + return $errors; +} + +/** + * Validate both directory and total user quota. Returns true/false not errors. + */ +function imce_validate_quotas($file, &$imce, $add = 0) { + $errors = imce_validate_quota($file, $imce['quota'], $imce['dirsize'] + $add); + if (empty($errors) && $imce['tuquota']) { + $errors = imce_validate_tuquota($file, $imce['tuquota'], file_space_used($imce['uid']) + $add); + } + if (!empty($errors)) { + drupal_set_message($errors[0], 'error'); + return FALSE; + } + return TRUE; +} + +/** + * Checks if the file is an image and returns info. + * There are two switchable versions that use image_get_info() and getimagesize() + */ +if (variable_get('imce_image_get_info', 0)) { + function imce_image_info($file) { + $mimes = array('image/jpeg' => IMAGETYPE_JPEG, 'image/gif' => IMAGETYPE_GIF, 'image/png' => IMAGETYPE_PNG); + if (is_file($file) && ($dot = strrpos($file, '.')) && in_array(strtolower(substr($file, $dot+1)), array('jpg', 'jpeg', 'gif', 'png')) && ($info = @image_get_info($file)) && isset($mimes[$info['mime_type']]) ) { + return array('width' => $info['width'], 'height' => $info['height'], 'type' => $mimes[$info['mime_type']], 'mime' => $info['mime_type']); + } + return FALSE; + } +} +else { + function imce_image_info($file) { + if (is_file($file) && ($dot = strrpos($file, '.')) && in_array(strtolower(substr($file, $dot+1)), array('jpg', 'jpeg', 'gif', 'png')) && ($info = @getimagesize($file)) && in_array($info[2], array(IMAGETYPE_JPEG, IMAGETYPE_GIF, IMAGETYPE_PNG)) ) { + return array('width' => $info[0], 'height' => $info[1], 'type' => $info[2], 'mime' => $info['mime']); + } + return FALSE; + } +} + +/** + * Return thumbnails as options to be used in upload form. + */ +function imce_thumbnail_options($thumbs = array()) { + $options = array(); + foreach ($thumbs as $thumb) { + $options[$thumb['name']] = $thumb['name'] . ' (' . $thumb['dimensions'] . ')'; + } + return $options; +} + +/** + * Initiate and return configuration profile for the $user. + */ +function imce_initiate_profile($user, $scheme = NULL) { + + //check user profile and translate tokens in directory paths and evaluate php paths. + if ($imce = imce_user_profile($user, $scheme)) { + // Allow alteration of raw profile + foreach (variable_get('imce_custom_init', array()) as $func => $state) { + if ($state && function_exists($func)) { + $func($imce, $user); + } + } + imce_process_directories($imce, $user); + if (!empty($imce['directories'])) { + $imce['uid'] = (int) $user->uid; + $imce['url'] = url($_GET['q']); + $imce['clean'] = variable_get('clean_url', 0) == 1; + $imce['absurls'] = variable_get('imce_settings_absurls', 0) == 1; + $imce['furl'] = file_create_url($imce['scheme'] . '://'); + $imce['filesize'] *= 1048576;//convert from Mb to byte + $imce['quota'] *= 1048576; + $imce['tuquota'] *= 1048576; + $imce['filenum'] = (int) $imce['filenum']; + //check and set the active directory + if ($info = imce_working_directory($imce)) { + $imce['direct'] = isset($imce['directories'][$info['name']]); + $imce['directories'][$info['name']] = $info; + $imce['dir'] = $info['name']; + $imce['perm'] = $info;//copy permissions of the active directory. + unset($imce['perm']['name']); + } + else { + drupal_set_message(t('Unable to get a working directory for the file browser!'), 'error'); + $imce['dir'] = FALSE; + $imce['error'] = TRUE; + } + return $imce; + } + drupal_set_message(t('There is no valid directory specified for the file browser!'), 'error'); + } + else { + drupal_set_message(t('You do not have access to any configuration profile to use the file browser!'), 'error'); + } + + return FALSE; +} + +/** + * Get files and folders of the actve directory. Do custom processing. + */ +function imce_process_profile(&$imce) { + //get directory content. do a custom scan if it is set + $scan = ($scan = variable_get('imce_custom_scan', '')) && function_exists($scan) ? $scan : 'imce_scan_directory'; + $imce += $scan($imce['dir'], $imce); + + //run custom process functions + foreach (variable_get('imce_custom_process', array()) as $func => $state) { + if ($state && function_exists($func)) { + $func($imce); + } + } + + //set subdirectories + if (!$imce['error'] && !imce_subdirectories_accessible($imce)) { + $imce['subdirectories'] = array(); + } +} + +/** + * Translate tokens and evaluate php in directory names. + * Convert directories into an associative array (dirname => info) + */ +function imce_process_directories(&$imce, $user) { + $directories = $imce['directories']; + $paths = array(); + $translate = array('%uid' => $user->uid); + + foreach ($directories as $directory) { + if (substr($directory['name'], 0, 4) == 'php:') { + $directory['name'] = eval(substr($directory['name'], 4)); + //php may return an array of directories + if (is_array($directory['name'])) { + foreach ($directory['name'] as $name) { + $paths[$name] = array('name' => $name) + $directory; + } + continue; + } + } + else { + $directory['name'] = strtr($directory['name'], $translate); + } + if ($directory['name']) { + $paths[$directory['name']] = $directory; + } + } + + $imce['directories'] = $paths; +} + +/** + * Return an available directory for the profile. + */ +function imce_working_directory(&$imce) { + //Do not use session if there is only one directory assigned. + $sess = TRUE; + if (count($imce['directories']) < 2) { + $perms = reset($imce['directories']); + if (!isset($perms['subnav']) || !$perms['subnav']) { + $sess = FALSE; + } + } + //check GET. + if (isset($_GET['dir'])) { + if ($info = imce_directory_info($_GET['dir'], $imce)) { + if (imce_check_directory($_GET['dir'], $imce)) { + if ($sess) { + $_SESSION['imce_directory'] = rawurlencode($info['name']); + } + } + else { + $info = FALSE; + } + } + else { + imce_inaccessible_directory($_GET['dir'], $imce); + } + return $info; + } + + //check session + if ($sess && isset($_SESSION['imce_directory'])) { + $dirname = rawurldecode($_SESSION['imce_directory']); + if ($info = imce_directory_info($dirname, $imce)) { + if (imce_check_directory($dirname, $imce)) { + return $info; + } + } + } + + //or the whole list. + foreach ($imce['directories'] as $dirname => $info) { + $dirname = (string) $dirname; + if (imce_check_directory($dirname, $imce)) { + if ($sess) { + $_SESSION['imce_directory'] = rawurlencode($dirname); + } + return $info; + } + } + + return FALSE; +} + +/** + * Create a writable directory(any level) under file system directory. + */ +function imce_check_directory($dirname, $imce) { + $diruri = imce_dir_uri($imce, $dirname); + + if (!imce_reg_dir($dirname) || !file_prepare_directory($diruri, FILE_CREATE_DIRECTORY)) { + return imce_inaccessible_directory($dirname, $imce); + } + + return TRUE; +} + +/** + * Generate and log a directory access error. + */ +function imce_inaccessible_directory($dirname, $imce) { + if (is_string($dirname)) { + $dirname = utf8_encode($dirname); + $diruri = imce_dir_uri($imce, $dirname); + drupal_set_message(t('Directory %dirname is not accessible.', array('%dirname' => $dirname)), 'error'); + watchdog('imce', 'Access to %directory was denied.', array('%directory' => $diruri), WATCHDOG_ERROR); + } + return FALSE; +} + +/** + * Return the permissions for a directory that is accessed directly or indirectly. + * A child of a predefined directory in the directory list takes its parent's properties. + * If it has multiple parents, it gets the properties of the latter in the list. + */ +function imce_directory_info($dirname, $imce) { + + if (isset($imce['directories'][$dirname])) { + return $imce['directories'][$dirname]; + } + + $info = FALSE; + if (imce_reg_dir($dirname)) { + $diruri = imce_dir_uri($imce, $dirname); + if (file_prepare_directory($diruri)) { + foreach ($imce['directories'] as $name => $prop) { + if ($prop['subnav'] && ($name === '.' || strpos($dirname . '/', $name . '/') === 0)) { + $info = $prop; + $info['name'] = $dirname; + } + } + } + } + + return $info; +} + +/** + * Detect if the subdirectories are accessible through any directory(not just the current one) in the list. + */ +function imce_subdirectories_accessible(&$imce) { + + if (!empty($imce['subdirectories'])) { + if (!empty($imce['perm']['subnav'])) { + return TRUE; + } + //checking only the first one is sufficient. + $dirname = reset($imce['subdirectories']); + if ($imce['dir'] !== '.') { + $dirname = $imce['dir'] . '/' . $dirname; + } + + //check if any setting is applicable for this subdirectory through any directory in the list. + foreach ($imce['directories'] as $name => $info) { + $name = (string) $name; + if ($info['subnav'] && $dirname != $name && ($name == '.' || strpos($dirname . '/', $name . '/') === 0)) { + return TRUE; + } + } + } + + return FALSE; +} + +/** + * Check if a permission is given to at least one directory in the list. + */ +function imce_perm_exists(&$imce, $perm) { + static $perms = array(); + + if (isset($perms[$perm])) { + return $perms[$perm]; + } + + if (isset($imce['perm'][$perm]) && $imce['perm'][$perm]) { + return $perms[$perm] = TRUE; + } + + foreach ($imce['directories'] as $name => $info) { + if (isset($info[$perm]) && $info[$perm]) { + return $perms[$perm] = TRUE; + } + } + + return $perms[$perm] = FALSE; +} + +/** + * Scan directory and return file list, subdirectories, and total size. + */ +function imce_scan_directory($dirname, $imce) { + + $directory = array('dirsize' => 0, 'files' => array(), 'subdirectories' => array(), 'error' => FALSE); + $diruri = imce_dir_uri($imce, $dirname); + + if (!is_string($dirname) || $dirname == '' || !$handle = opendir($diruri)) { + imce_inaccessible_directory($dirname, $imce); + $directory['error'] = TRUE; + return $directory; + } + + while (($file = readdir($handle)) !== FALSE) { + + // Do not include dot files and folders + if (substr($file, 0, 1) === '.') { + continue; + } + + $path = $diruri . $file; + + if (is_dir($path)) { + $directory['subdirectories'][] = $file; + continue; + } + + $width = $height = 0; + if ($img = imce_image_info($path)) { + $width = $img['width']; + $height = $img['height']; + } + $size = filesize($path); + $date = filemtime($path); + $directory['files'][$file] = array( + 'name' => $file, + 'size' => $size, + 'width' => $width, + 'height' => $height, + 'date' => $date + ); + $directory['dirsize'] += $size; + } + + closedir($handle); + sort($directory['subdirectories']); + return $directory; +} + +/** + * Create directory tree. + */ +function imce_create_tree(&$imce) { + $paths = array(); + //rearrange paths as arg0=>arg1=>... + foreach ($imce['directories'] as $path => $arr) { + $tmp =& $paths; + if ($path != '.') { + $args = explode('/', $path); + foreach ($args as $arg) { + if (!isset($tmp[$arg])) { + $tmp[$arg] = array(); + } + $tmp =& $tmp[$arg]; + } + $tmp[':access:'] = TRUE; + } + if ("$path" == $imce['dir']) { + $tmp[':active:'] = TRUE; + foreach ($imce['subdirectories'] as $arg) { + $tmp[$arg][':access:'] = TRUE; + } + } + } + //set root branch + $root = theme('imce_root_text', array('imce_ref' => array('imce' => &$imce))); + $q = $imce['clean'] ? '?' : '&'; + if (isset($imce['directories']['.'])) { + $root = '' . $root . ''; + } + else { + $root = '' . $root . ''; + } + + return $root . imce_tree_html($imce, $paths, $q); +} + +/** + * Return tree html. + * This is not themable because it is complex and needs to be in a proper format for js processing. + */ +function imce_tree_html(&$imce, $paths, $q = '?', $prefix = '', $eprefix = '') { + unset($paths[':access:'], $paths[':active:']); + $html = ''; + foreach ($paths as $arg => $children) { + $path = $prefix . $arg; + $earg = rawurlencode($arg); + $epath = $eprefix . $earg; + if (isset($children[':access:']) || imce_directory_info($path, $imce)) { + $a = '' . $earg . ''; + } + else { + $a = '' . $earg . ''; + } + $ul = imce_tree_html($imce, $children, $q, $path . '/', $epath . '/'); + $class = $ul ? ' class="expanded"' : (isset($children[':active:']) ? ' class="leaf"' : ''); + $html .= '' . $a . $ul . ''; + } + if ($html) { + $html = '
    ' . $html . '
'; + } + return $html; +} + +/** + * Return the uri of the active directory + */ +function imce_dir_uri($imce, $dir = NULL) { + if (!isset($dir)) { + $dir = $imce['dir']; + } + $target = $dir === '.' ? '' : $dir; + $uri = $imce['scheme'] . '://' . $target; + // Uri is already normalized. Call alterers. + drupal_alter('file_stream_wrapper_uri_normalize', $uri, $imce['scheme'], $target); + // Add the slash + if (substr($uri, -1) !== '/') { + $uri .= '/'; + } + return $uri; +} + +/** + * Returns the text for the root directory in a directory tree. + */ +function theme_imce_root_text($variables) { + //$imce = &$variables['imce_ref']['imce']; + return '<' . t('root') . '>'; +} + +/** + * Returns the html for user's file browser tab. + */ +function theme_imce_user_page($variables) { + global $user; + $account = $variables['account']; + $options = array(); + //switch to account's active folder + if ($user->uid == 1 && $account->uid != 1) { + $imce = imce_initiate_profile($account); + $options['query'] = array('dir' => $imce['dir']); + } + return ''; +} + +/** + * Registers the file as an IMCE file. + */ +function imce_file_register($file) { + if (!db_query("SELECT 1 FROM {file_usage} WHERE module = 'imce' AND fid = :fid", array(':fid' => $file->fid))->fetchField()) { + file_usage_add($file, 'imce', 'file', $file->fid); + } +} \ No newline at end of file diff --git a/sites/all/modules/imce/js/imce.js b/sites/all/modules/imce/js/imce.js new file mode 100644 index 0000000..17c8f7c --- /dev/null +++ b/sites/all/modules/imce/js/imce.js @@ -0,0 +1,857 @@ +(function($) { +//Global container. +window.imce = {tree: {}, findex: [], fids: {}, selected: {}, selcount: 0, ops: {}, cache: {}, urlId: {}, +vars: {previewImages: 1, cache: 1}, +hooks: {load: [], list: [], navigate: [], cache: []}, + +//initiate imce. +initiate: function() { + imce.conf = Drupal.settings.imce || {}; + if (imce.conf.error != false) return; + imce.ie = (navigator.userAgent.match(/msie (\d+)/i) || ['', 0])[1] * 1; + imce.FLW = imce.el('file-list-wrapper'), imce.SBW = imce.el('sub-browse-wrapper'); + imce.NW = imce.el('navigation-wrapper'), imce.BW = imce.el('browse-wrapper'); + imce.PW = imce.el('preview-wrapper'), imce.FW = imce.el('forms-wrapper'); + imce.updateUI(); + imce.prepareMsgs();//process initial status messages + imce.initiateTree();//build directory tree + imce.hooks.list.unshift(imce.processRow);//set the default list-hook. + imce.initiateList();//process file list + imce.initiateOps();//prepare operation tabs + imce.refreshOps(); + // Bind global error handler + $(document).ajaxError(imce.ajaxError); + imce.invoke('load', window);//run functions set by external applications. +}, + +//process navigation tree +initiateTree: function() { + $('#navigation-tree li').each(function(i) { + var a = this.firstChild, txt = a.firstChild; + txt && (txt.data = imce.decode(txt.data)); + var branch = imce.tree[a.title] = {'a': a, li: this, ul: this.lastChild.tagName == 'UL' ? this.lastChild : null}; + if (a.href) imce.dirClickable(branch); + imce.dirCollapsible(branch); + }); +}, + +//Add a dir to the tree under parent +dirAdd: function(dir, parent, clickable) { + if (imce.tree[dir]) return clickable ? imce.dirClickable(imce.tree[dir]) : imce.tree[dir]; + var parent = parent || imce.tree['.']; + parent.ul = parent.ul ? parent.ul : parent.li.appendChild(imce.newEl('ul')); + var branch = imce.dirCreate(dir, imce.decode(dir.substr(dir.lastIndexOf('/')+1)), clickable); + parent.ul.appendChild(branch.li); + return branch; +}, + +//create list item for navigation tree +dirCreate: function(dir, text, clickable) { + if (imce.tree[dir]) return imce.tree[dir]; + var branch = imce.tree[dir] = {li: imce.newEl('li'), a: imce.newEl('a')}; + $(branch.a).addClass('folder').text(text).attr('title', dir).appendTo(branch.li); + imce.dirCollapsible(branch); + return clickable ? imce.dirClickable(branch) : branch; +}, + +//change currently active directory +dirActivate: function(dir) { + if (dir != imce.conf.dir) { + if (imce.tree[imce.conf.dir]){ + $(imce.tree[imce.conf.dir].a).removeClass('active'); + } + $(imce.tree[dir].a).addClass('active'); + imce.conf.dir = dir; + } + return imce.tree[imce.conf.dir]; +}, + +//make a dir accessible +dirClickable: function(branch) { + if (branch.clkbl) return branch; + $(branch.a).attr('href', '#').removeClass('disabled').click(function() {imce.navigate(this.title); return false;}); + branch.clkbl = true; + return branch; +}, + +//sub-directories expand-collapse ability +dirCollapsible: function (branch) { + if (branch.clpsbl) return branch; + $(imce.newEl('span')).addClass('expander').html(' ').click(function() { + if (branch.ul) { + $(branch.ul).toggle(); + $(branch.li).toggleClass('expanded'); + imce.ie && $('#navigation-header').css('top', imce.NW.scrollTop); + } + else if (branch.clkbl){ + $(branch.a).click(); + } + }).prependTo(branch.li); + branch.clpsbl = true; + return branch; +}, + +//update navigation tree after getting subdirectories. +dirSubdirs: function(dir, subdirs) { + var branch = imce.tree[dir]; + if (subdirs && subdirs.length) { + var prefix = dir == '.' ? '' : dir +'/'; + for (var i in subdirs) {//add subdirectories + imce.dirAdd(prefix + subdirs[i], branch, true); + } + $(branch.li).removeClass('leaf').addClass('expanded'); + $(branch.ul).show(); + } + else if (!branch.ul){//no subdirs->leaf + $(branch.li).removeClass('expanded').addClass('leaf'); + } +}, + +//process file list +initiateList: function(cached) { + var L = imce.hooks.list, dir = imce.conf.dir, token = {'%dir': dir == '.' ? $(imce.tree['.'].a).text() : imce.decode(dir)} + imce.findex = [], imce.fids = {}, imce.selected = {}, imce.selcount = 0, imce.vars.lastfid = null; + imce.tbody = imce.el('file-list').tBodies[0]; + if (imce.tbody.rows.length) { + for (var row, i = 0; row = imce.tbody.rows[i]; i++) { + var fid = row.id; + imce.findex[i] = imce.fids[fid] = row; + if (cached) { + if (imce.hasC(row, 'selected')) { + imce.selected[imce.vars.lastfid = fid] = row; + imce.selcount++; + } + } + else { + for (var func, j = 0; func = L[j]; j++) func(row);//invoke list-hook + } + } + } + if (!imce.conf.perm.browse) { + imce.setMessage(Drupal.t('File browsing is disabled in directory %dir.', token), 'error'); + } +}, + +//add a file to the list. (having properties name,size,formatted size,width,height,date,formatted date) +fileAdd: function(file) { + var row, fid = file.name, i = imce.findex.length, attr = ['name', 'size', 'width', 'height', 'date']; + if (!(row = imce.fids[fid])) { + row = imce.findex[i] = imce.fids[fid] = imce.tbody.insertRow(i); + for (var i in attr) row.insertCell(i).className = attr[i]; + } + row.cells[0].innerHTML = row.id = fid; + row.cells[1].innerHTML = file.fsize; row.cells[1].id = file.size; + row.cells[2].innerHTML = file.width; + row.cells[3].innerHTML = file.height; + row.cells[4].innerHTML = file.fdate; row.cells[4].id = file.date; + imce.invoke('list', row); + if (imce.vars.prvfid == fid) imce.setPreview(fid); + if (file.id) imce.urlId[imce.getURL(fid)] = file.id; +}, + +//remove a file from the list +fileRemove: function(fid) { + if (!(row = imce.fids[fid])) return; + imce.fileDeSelect(fid); + imce.findex.splice(row.rowIndex, 1); + $(row).remove(); + delete imce.fids[fid]; + if (imce.vars.prvfid == fid) imce.setPreview(); +}, + +//return a file object containing all properties. +fileGet: function (fid) { + var file = imce.fileProps(fid); + if (file) { + file.name = imce.decode(fid); + file.url = imce.getURL(fid); + file.relpath = imce.getRelpath(fid); + file.id = imce.urlId[file.url] || 0; //file id for newly uploaded files + } + return file; +}, + +//return file properties embedded in html. +fileProps: function (fid) { + var row = imce.fids[fid]; + return row ? { + size: row.cells[1].innerHTML, + bytes: row.cells[1].id * 1, + width: row.cells[2].innerHTML * 1, + height: row.cells[3].innerHTML * 1, + date: row.cells[4].innerHTML, + time: row.cells[4].id * 1 + } : null; +}, + +//simulate row click. selection-highlighting +fileClick: function(row, ctrl, shft) { + if (!row) return; + var fid = typeof(row) == 'string' ? row : row.id; + if (ctrl || fid == imce.vars.prvfid) { + imce.fileToggleSelect(fid); + } + else if (shft) { + var last = imce.lastFid(); + var start = last ? imce.fids[last].rowIndex : -1; + var end = imce.fids[fid].rowIndex; + var step = start > end ? -1 : 1; + while (start != end) { + start += step; + imce.fileSelect(imce.findex[start].id); + } + } + else { + for (var fname in imce.selected) { + imce.fileDeSelect(fname); + } + imce.fileSelect(fid); + } + //set preview + imce.setPreview(imce.selcount == 1 ? imce.lastFid() : null); +}, + +//file select/deselect functions +fileSelect: function (fid) { + if (imce.selected[fid] || !imce.fids[fid]) return; + imce.selected[fid] = imce.fids[imce.vars.lastfid=fid]; + $(imce.selected[fid]).addClass('selected'); + imce.selcount++; +}, +fileDeSelect: function (fid) { + if (!imce.selected[fid] || !imce.fids[fid]) return; + if (imce.vars.lastfid == fid) imce.vars.lastfid = null; + $(imce.selected[fid]).removeClass('selected'); + delete imce.selected[fid]; + imce.selcount--; +}, +fileToggleSelect: function (fid) { + imce['file'+ (imce.selected[fid] ? 'De' : '') +'Select'](fid); +}, + +//process file operation form and create operation tabs. +initiateOps: function() { + imce.setHtmlOps(); + imce.setUploadOp();//upload + imce.setFileOps();//thumb, delete, resize +}, + +//process existing html ops. +setHtmlOps: function () { + $(imce.el('ops-list')).children('li').each(function() { + if (!this.firstChild) return $(this).remove(); + var name = this.id.substr(8); + var Op = imce.ops[name] = {div: imce.el('op-content-'+ name), li: imce.el('op-item-'+ name)}; + Op.a = Op.li.firstChild; + Op.title = Op.a.innerHTML; + $(Op.a).click(function() {imce.opClick(name); return false;}); + }); +}, + +//convert upload form to an op. +setUploadOp: function () { + var el, form = imce.el('imce-upload-form'); + if (!form) return; + $(form).ajaxForm(imce.uploadSettings()).find('fieldset').each(function() {//clean up fieldsets + this.removeChild(this.firstChild); + $(this).after(this.childNodes); + }).remove(); + // Set html response flag + el = form.elements['files[imce]']; + if (el && el.files && window.FormData) { + if (el = form.elements.html_response) { + el.value = 0; + } + } + imce.opAdd({name: 'upload', title: Drupal.t('Upload'), content: form});//add op +}, + +//convert fileop form submit buttons to ops. +setFileOps: function () { + var form = imce.el('imce-fileop-form'); + if (!form) return; + $(form.elements.filenames).parent().remove(); + $(form).find('fieldset').each(function() {//remove fieldsets + var $sbmt = $('input:submit', this); + if (!$sbmt.length) return; + var Op = {name: $sbmt.attr('id').substr(5)}; + var func = function() {imce.fopSubmit(Op.name); return false;}; + $sbmt.click(func); + Op.title = $(this).children('legend').remove().text() || $sbmt.val(); + Op.name == 'delete' ? (Op.func = func) : (Op.content = this.childNodes); + imce.opAdd(Op); + }).remove(); + imce.vars.opform = $(form).serialize();//serialize remaining parts. +}, + +//refresh ops states. enable/disable +refreshOps: function() { + for (var p in imce.conf.perm) { + if (imce.conf.perm[p]) imce.opEnable(p); + else imce.opDisable(p); + } +}, + +//add a new file operation +opAdd: function (op) { + var oplist = imce.el('ops-list'), opcons = imce.el('op-contents'); + var name = op.name || ('op-'+ $(oplist).children('li').length); + var title = op.title || 'Untitled'; + var Op = imce.ops[name] = {title: title}; + if (op.content) { + Op.div = imce.newEl('div'); + $(Op.div).attr({id: 'op-content-'+ name, 'class': 'op-content'}).appendTo(opcons).append(op.content); + } + Op.a = imce.newEl('a'); + Op.li = imce.newEl('li'); + $(Op.a).attr({href: '#', name: name, title: title}).html('' + title +'').click(imce.opClickEvent); + $(Op.li).attr('id', 'op-item-'+ name).append(Op.a).appendTo(oplist); + Op.func = op.func || imce.opVoid; + return Op; +}, + +//click event for file operations +opClickEvent: function(e) { + imce.opClick(this.name); + return false; +}, + +//void operation function +opVoid: function() {}, + +//perform op click +opClick: function(name) { + var Op = imce.ops[name], oldop = imce.vars.op; + if (!Op || Op.disabled) { + return imce.setMessage(Drupal.t('You can not perform this operation.'), 'error'); + } + if (Op.div) { + if (oldop) { + var toggle = oldop == name; + imce.opShrink(oldop, toggle ? 'fadeOut' : 'hide'); + if (toggle) return false; + } + var left = Op.li.offsetLeft; + var $opcon = $('#op-contents').css({left: 0}); + $(Op.div).fadeIn('normal', function() { + setTimeout(function() { + if (imce.vars.op) { + var $inputs = $('input', imce.ops[imce.vars.op].div); + $inputs.eq(0).focus(); + //form inputs become invisible in IE. Solution is as stupid as the behavior. + $('html').hasClass('ie') && $inputs.addClass('dummyie').removeClass('dummyie'); + } + }); + }); + var diff = left + $opcon.width() - $('#imce-content').width(); + $opcon.css({left: diff > 0 ? left - diff - 1 : left}); + $(Op.li).addClass('active'); + $(imce.opCloseLink).fadeIn(300); + imce.vars.op = name; + } + Op.func(true); + return true; +}, + +//enable a file operation +opEnable: function(name) { + var Op = imce.ops[name]; + if (Op && Op.disabled) { + Op.disabled = false; + $(Op.li).show(); + } +}, + +//disable a file operation +opDisable: function(name) { + var Op = imce.ops[name]; + if (Op && !Op.disabled) { + Op.div && imce.opShrink(name); + $(Op.li).hide(); + Op.disabled = true; + } +}, + +//hide contents of a file operation +opShrink: function(name, effect) { + if (imce.vars.op != name) return; + var Op = imce.ops[name]; + $(Op.div).stop(true, true)[effect || 'hide'](); + $(Op.li).removeClass('active'); + $(imce.opCloseLink).hide(); + Op.func(false); + imce.vars.op = null; +}, + +//navigate to dir +navigate: function(dir) { + if (imce.vars.navbusy || (dir == imce.conf.dir && !confirm(Drupal.t('Do you want to refresh the current directory?')))) return; + var cache = imce.vars.cache && dir != imce.conf.dir; + var set = imce.navSet(dir, cache); + if (cache && imce.cache[dir]) {//load from the cache + set.success({data: imce.cache[dir]}); + set.complete(); + } + else $.ajax(set);//live load +}, +//ajax navigation settings +navSet: function (dir, cache) { + $(imce.tree[dir].li).addClass('loading'); + imce.vars.navbusy = dir; + return {url: imce.ajaxURL('navigate', dir), + type: 'GET', + dataType: 'json', + success: function(response) { + if (response.data && !response.data.error) { + if (cache) imce.navCache(imce.conf.dir, dir);//cache the current dir + imce.navUpdate(response.data, dir); + } + imce.processResponse(response); + }, + complete: function () { + $(imce.tree[dir].li).removeClass('loading'); + imce.vars.navbusy = null; + } + }; +}, + +//update directory using the given data +navUpdate: function(data, dir) { + var cached = data == imce.cache[dir], olddir = imce.conf.dir; + if (cached) data.files.id = 'file-list'; + $(imce.FLW).html(data.files); + imce.dirActivate(dir); + imce.dirSubdirs(dir, data.subdirectories); + $.extend(imce.conf.perm, data.perm); + imce.refreshOps(); + imce.initiateList(cached); + imce.setPreview(imce.selcount == 1 ? imce.lastFid() : null); + imce.SBW.scrollTop = 0; + imce.invoke('navigate', data, olddir, cached); +}, + +//set cache +navCache: function (dir, newdir) { + var C = imce.cache[dir] = {'dir': dir, files: imce.el('file-list'), dirsize: imce.el('dir-size').innerHTML, perm: $.extend({}, imce.conf.perm)}; + C.files.id = 'cached-list-'+ dir; + imce.FW.appendChild(C.files); + imce.invoke('cache', C, newdir); +}, + +//validate upload form +uploadValidate: function (data, form, options) { + var path = $('#edit-imce').val(); + if (!path) return false; + if (imce.conf.extensions != '*') { + var ext = path.substr(path.lastIndexOf('.') + 1); + if ((' '+ imce.conf.extensions +' ').indexOf(' '+ ext.toLowerCase() +' ') == -1) { + return imce.setMessage(Drupal.t('Only files with the following extensions are allowed: %files-allowed.', {'%files-allowed': imce.conf.extensions}), 'error'); + } + } + options.url = imce.ajaxURL('upload');//make url contain current dir. + imce.fopLoading('upload', true); + return true; +}, + +//settings for upload +uploadSettings: function () { + return { + beforeSubmit: imce.uploadValidate, + success: function (response) { + try{ + imce.processResponse($.parseJSON(response)); + } catch(e) {} + }, + complete: function () { + imce.fopLoading('upload', false); + }, + resetForm: true, + dataType: 'text' + }; +}, + +//validate default ops(delete, thumb, resize) +fopValidate: function(fop) { + if (!imce.validateSelCount(1, imce.conf.filenum)) return false; + switch (fop) { + case 'delete': + return confirm(Drupal.t('Delete selected files?')); + case 'thumb': + if (!$('input:checked', imce.ops['thumb'].div).length) { + return imce.setMessage(Drupal.t('Please select a thumbnail.'), 'error'); + } + return imce.validateImage(); + case 'resize': + var w = imce.el('edit-width').value, h = imce.el('edit-height').value; + var maxDim = imce.conf.dimensions.split('x'); + var maxW = maxDim[0]*1, maxH = maxW ? maxDim[1]*1 : 0; + if (!(/^[1-9][0-9]*$/).test(w) || !(/^[1-9][0-9]*$/).test(h) || (maxW && (maxW < w*1 || maxH < h*1))) { + return imce.setMessage(Drupal.t('Please specify dimensions within the allowed range that is from 1x1 to @dimensions.', {'@dimensions': maxW ? imce.conf.dimensions : Drupal.t('unlimited')}), 'error'); + } + return imce.validateImage(); + } + + var func = fop +'OpValidate'; + if (imce[func]) return imce[func](fop); + return true; +}, + +//submit wrapper for default ops +fopSubmit: function(fop) { + switch (fop) { + case 'thumb': case 'delete': case 'resize': return imce.commonSubmit(fop); + } + var func = fop +'OpSubmit'; + if (imce[func]) return imce[func](fop); +}, + +//common submit function shared by default ops +commonSubmit: function(fop) { + if (!imce.fopValidate(fop)) return false; + imce.fopLoading(fop, true); + $.ajax(imce.fopSettings(fop)); +}, + +//settings for default file operations +fopSettings: function (fop) { + return {url: imce.ajaxURL(fop), type: 'POST', dataType: 'json', success: imce.processResponse, complete: function (response) {imce.fopLoading(fop, false);}, data: imce.vars.opform +'&filenames='+ encodeURIComponent(imce.serialNames()) +'&jsop='+ fop + (imce.ops[fop].div ? '&'+ $('input, select, textarea', imce.ops[fop].div).serialize() : '')}; +}, + +//toggle loading state +fopLoading: function(fop, state) { + var el = imce.el('edit-'+ fop), func = state ? 'addClass' : 'removeClass'; + if (el) { + $(el)[func]('loading'); + el.disabled = state; + } + else { + $(imce.ops[fop].li)[func]('loading'); + imce.ops[fop].disabled = state; + } +}, + +//preview a file. +setPreview: function (fid) { + var row, html = ''; + imce.vars.prvfid = fid; + if (fid && (row = imce.fids[fid])) { + var width = row.cells[2].innerHTML * 1; + html = imce.vars.previewImages && width ? imce.imgHtml(fid, width, row.cells[3].innerHTML) : imce.decodePlain(fid); + html = ''+ html +''; + } + imce.el('file-preview').innerHTML = html; +}, + +//default file send function. sends the file to the new window. +send: function (fid) { + fid && window.open(imce.getURL(fid)); +}, + +//add an operation for an external application to which the files are send. +setSendTo: function (title, func) { + imce.send = function (fid) { fid && func(imce.fileGet(fid), window);}; + var opFunc = function () { + if (imce.selcount != 1) return imce.setMessage(Drupal.t('Please select a file.'), 'error'); + imce.send(imce.vars.prvfid); + }; + imce.vars.prvtitle = title; + return imce.opAdd({name: 'sendto', title: title, func: opFunc}); +}, + +//move initial page messages into log +prepareMsgs: function () { + var msgs; + if (msgs = imce.el('imce-messages')) { + $('>div', msgs).each(function (){ + var type = this.className.split(' ')[1]; + var li = $('>ul li', this); + if (li.length) li.each(function () {imce.setMessage(this.innerHTML, type);}); + else imce.setMessage(this.innerHTML, type); + }); + $(msgs).remove(); + } +}, + +//insert log message +setMessage: function (msg, type) { + var $box = $(imce.msgBox); + var logs = imce.el('log-messages') || $(imce.newEl('div')).appendTo('#help-box-content').before('

'+ Drupal.t('Log messages') +':

').attr('id', 'log-messages')[0]; + var msg = '
'+ msg +'
'; + $box.queue(function() { + $box.css({opacity: 0, display: 'block'}).html(msg); + $box.dequeue(); + }); + var q = $box.queue().length, t = imce.vars.msgT || 1000; + q = q < 2 ? 1 : q < 3 ? 0.8 : q < 4 ? 0.7 : 0.4;//adjust speed with respect to queue length + $box.fadeTo(600 * q, 1).fadeTo(t * q, 1).fadeOut(400 * q); + $(logs).append(msg); + return false; +}, + +//invoke hooks +invoke: function (hook) { + var i, args, func, funcs; + if ((funcs = imce.hooks[hook]) && funcs.length) { + (args = $.makeArray(arguments)).shift(); + for (i = 0; func = funcs[i]; i++) func.apply(this, args); + } +}, + +//process response +processResponse: function (response) { + if (response.data) imce.resData(response.data); + if (response.messages) imce.resMsgs(response.messages); +}, + +//process response data +resData: function (data) { + var i, added, removed; + if (added = data.added) { + var cnt = imce.findex.length; + for (i in added) {//add new files or update existing + imce.fileAdd(added[i]); + } + if (added.length == 1) {//if it is a single file operation + imce.highlight(added[0].name);//highlight + } + if (imce.findex.length != cnt) {//if new files added, scroll to bottom. + $(imce.SBW).animate({scrollTop: imce.SBW.scrollHeight}).focus(); + } + } + if (removed = data.removed) for (i in removed) { + imce.fileRemove(removed[i]); + } + imce.conf.dirsize = data.dirsize; + imce.updateStat(); +}, + +//set response messages +resMsgs: function (msgs) { + for (var type in msgs) for (var i in msgs[type]) { + imce.setMessage(msgs[type][i], type); + } +}, + +//return img markup +imgHtml: function (fid, width, height) { + return ''+ imce.decodePlain(fid) +''; +}, + +//check if the file is an image +isImage: function (fid) { + return imce.fids[fid].cells[2].innerHTML * 1; +}, + +//find the first non-image in the selection +getNonImage: function (selected) { + for (var fid in selected) { + if (!imce.isImage(fid)) return fid; + } + return false; +}, + +//validate current selection for images +validateImage: function () { + var nonImg = imce.getNonImage(imce.selected); + return nonImg ? imce.setMessage(Drupal.t('%filename is not an image.', {'%filename': imce.decode(nonImg)}), 'error') : true; +}, + +//validate number of selected files +validateSelCount: function (Min, Max) { + if (Min && imce.selcount < Min) { + return imce.setMessage(Min == 1 ? Drupal.t('Please select a file.') : Drupal.t('You must select at least %num files.', {'%num': Min}), 'error'); + } + if (Max && Max < imce.selcount) { + return imce.setMessage(Drupal.t('You are not allowed to operate on more than %num files.', {'%num': Max}), 'error'); + } + return true; +}, + +//update file count and dir size +updateStat: function () { + imce.el('file-count').innerHTML = imce.findex.length; + imce.el('dir-size').innerHTML = imce.conf.dirsize; +}, + +//serialize selected files. return fids with a colon between them +serialNames: function () { + var str = ''; + for (var fid in imce.selected) { + str += ':'+ fid; + } + return str.substr(1); +}, + +//get file url. re-encode & and # for mod rewrite +getURL: function (fid, uncached) { + var url = imce.getRelpath(fid); + if (imce.conf.modfix) { + url = url.replace(/%(23|26)/g, '%25$1'); + } + url = imce.conf.furl + url; + if (uncached) { + var file = imce.fileProps(fid); + url += (url.indexOf('?') === -1 ? '?' : '&') + 's' + file.bytes + 'd' + file.time; + } + return url; +}, + +//get encoded file path relative to root. +getRelpath: function (fid) { + var dir = imce.conf.dir; + return (dir === '.' ? '' : dir + '/') + fid; +}, + +//el. by id +el: function (id) { + return document.getElementById(id); +}, + +//find the latest selected fid +lastFid: function () { + if (imce.vars.lastfid) return imce.vars.lastfid; + for (var fid in imce.selected); + return fid; +}, + +//create ajax url +ajaxURL: function (op, dir) { + return imce.conf.url + (imce.conf.clean ? '?' :'&') +'jsop='+ op +'&dir='+ (dir||imce.conf.dir); +}, + +//fast class check +hasC: function (el, name) { + return el.className && (' '+ el.className +' ').indexOf(' '+ name +' ') != -1; +}, + +//highlight a single file +highlight: function (fid) { + if (imce.vars.prvfid) imce.fileClick(imce.vars.prvfid); + imce.fileClick(fid); +}, + +//process a row +processRow: function (row) { + row.cells[0].innerHTML = '' + imce.decodePlain(row.id) + ''; + row.onmousedown = function(e) { + var e = e||window.event; + imce.fileClick(this, e.ctrlKey, e.shiftKey); + return !(e.ctrlKey || e.shiftKey); + }; + row.ondblclick = function(e) { + imce.send(this.id); + return false; + }; +}, + +//decode urls. uses unescape. can be overridden to use decodeURIComponent +decode: function (str) { + try { + return decodeURIComponent(str); + } catch(e) {} + return str; +}, + +//decode and convert to plain text +decodePlain: function (str) { + return Drupal.checkPlain(imce.decode(str)); +}, + +//global ajax error function +ajaxError: function (e, response, settings, thrown) { + imce.setMessage(Drupal.ajaxError(response, settings.url).replace(/\n/g, '
'), 'error'); +}, + +//convert button elements to standard input buttons +convertButtons: function(form) { + $('button:submit', form).each(function(){ + $(this).replaceWith(''); + }); +}, + +//create element +newEl: function(name) { + return document.createElement(name); +}, + +//scroll syncronization for section headers +syncScroll: function(scrlEl, fixEl, bottom) { + var $fixEl = $(fixEl); + var prop = bottom ? 'bottom' : 'top'; + var factor = bottom ? -1 : 1; + var syncScrl = function(el) { + $fixEl.css(prop, factor * el.scrollTop); + } + $(scrlEl).scroll(function() { + var el = this; + syncScrl(el); + setTimeout(function() { + syncScrl(el); + }); + }); +}, + +//get UI ready. provide backward compatibility. +updateUI: function() { + //file urls. + var furl = imce.conf.furl, isabs = furl.indexOf('://') > -1; + var absurls = imce.conf.absurls = imce.vars.absurls || imce.conf.absurls; + var host = location.host; + var baseurl = location.protocol + '//' + host; + if (furl.charAt(furl.length - 1) != '/') { + furl = imce.conf.furl = furl + '/'; + } + imce.conf.modfix = imce.conf.clean && furl.split('/')[3] === 'system'; + if (absurls && !isabs) { + imce.conf.furl = baseurl + furl; + } + else if (!absurls && isabs && furl.indexOf(baseurl) == 0) { + furl = furl.substr(baseurl.length); + // Server base url is defined with a port which is missing in current page url. + if (furl.charAt(0) === ':') { + furl = furl.replace(/^:\d*/, ''); + } + imce.conf.furl = furl; + } + //convert button elements to input elements. + imce.convertButtons(imce.FW); + //ops-list + $('#ops-list').removeClass('tabs secondary').addClass('clear-block clearfix'); + imce.opCloseLink = $(imce.newEl('a')).attr({id: 'op-close-link', href: '#', title: Drupal.t('Close')}).click(function() { + imce.vars.op && imce.opClick(imce.vars.op); + return false; + }).appendTo('#op-contents')[0]; + //navigation-header + if (!$('#navigation-header').length) { + $(imce.NW).children('.navigation-text').attr('id', 'navigation-header').wrapInner(''); + } + //log + $('#log-prv-wrapper').before($('#log-prv-wrapper > #preview-wrapper')).remove(); + $('#log-clearer').remove(); + //content resizer + $('#content-resizer').remove(); + //message-box + imce.msgBox = imce.el('message-box') || $(imce.newEl('div')).attr('id', 'message-box').prependTo('#imce-content')[0]; + //create help tab + var $hbox = $('#help-box'); + $hbox.is('a') && $hbox.replaceWith($(imce.newEl('div')).attr('id', 'help-box').append($hbox.children())); + imce.hooks.load.push(function() { + imce.opAdd({name: 'help', title: $('#help-box-title').remove().text(), content: $('#help-box').show()}); + }); + //add ie classes + imce.ie && $('html').addClass('ie') && imce.ie < 8 && $('html').addClass('ie-7'); + // enable box view for file list + imce.vars.boxW && imce.boxView(); + //scrolling file list + imce.syncScroll(imce.SBW, '#file-header-wrapper'); + imce.syncScroll(imce.SBW, '#dir-stat', true); + //scrolling directory tree + imce.syncScroll(imce.NW, '#navigation-header'); +} + +}; + +//initiate +$(document).ready(imce.initiate); + +})(jQuery); \ No newline at end of file diff --git a/sites/all/modules/imce/js/imce_extras.js b/sites/all/modules/imce/js/imce_extras.js new file mode 100644 index 0000000..b558cc5 --- /dev/null +++ b/sites/all/modules/imce/js/imce_extras.js @@ -0,0 +1,284 @@ +//This pack implemets: keyboard shortcuts, file sorting, resize bars, and inline thumbnail preview. + +(function($) { + +// add scale calculator for resizing. +imce.hooks.load.push(function () { + $('#edit-width, #edit-height').focus(function () { + var fid, r, w, isW, val; + if (fid = imce.vars.prvfid) { + isW = this.id == 'edit-width', val = imce.el(isW ? 'edit-height' : 'edit-width').value*1; + if (val && (w = imce.isImage(fid)) && (r = imce.fids[fid].cells[3].innerHTML*1 / w)) + this.value = Math.round(isW ? val/r : val*r); + } + }); +}); + +// Shortcuts +var F = null; +imce.initiateShortcuts = function () { + $(imce.NW).attr('tabindex', '0').keydown(function (e) { + if (F = imce.dirKeys['k'+ e.keyCode]) return F(e); + }); + $(imce.FLW).attr('tabindex', '0').keydown(function (e) { + if (F = imce.fileKeys['k'+ e.keyCode]) return F(e); + }).focus(); +}; + +//shortcut key-function pairs for directories +imce.dirKeys = { + k35: function (e) {//end-home. select first or last dir + var L = imce.tree['.'].li; + if (e.keyCode == 35) while (imce.hasC(L, 'expanded')) L = L.lastChild.lastChild; + $(L.childNodes[1]).click().focus(); + }, + k37: function (e) {//left-right. collapse-expand directories.(right may also move focus on files) + var L, B = imce.tree[imce.conf.dir], right = e.keyCode == 39; + if (B.ul && (right ^ imce.hasC(L = B.li, 'expanded')) ) $(L.firstChild).click(); + else if (right) $(imce.FLW).focus(); + }, + k38: function (e) {//up. select the previous directory + var B = imce.tree[imce.conf.dir]; + if (L = B.li.previousSibling) { + while (imce.hasC(L, 'expanded')) L = L.lastChild.lastChild; + $(L.childNodes[1]).click().focus(); + } + else if ((L = B.li.parentNode.parentNode) && L.tagName == 'LI') $(L.childNodes[1]).click().focus(); + }, + k40: function (e) {//down. select the next directory + var B = imce.tree[imce.conf.dir], L = B.li, U = B.ul; + if (U && imce.hasC(L, 'expanded')) $(U.firstChild.childNodes[1]).click().focus(); + else do {if (L.nextSibling) return $(L.nextSibling.childNodes[1]).click().focus(); + }while ((L = L.parentNode.parentNode).tagName == 'LI'); + } +}; +//add equal keys +imce.dirKeys.k36 = imce.dirKeys.k35; +imce.dirKeys.k39 = imce.dirKeys.k37; + +//shortcut key-function pairs for files +imce.fileKeys = { + k38: function (e) {//up-down. select previous-next row + var fid = imce.lastFid(), i = fid ? imce.fids[fid].rowIndex+e.keyCode-39 : 0; + imce.fileClick(imce.findex[i], e.ctrlKey, e.shiftKey); + }, + k35: function (e) {//end-home. select first or last row + imce.fileClick(imce.findex[e.keyCode == 35 ? imce.findex.length-1 : 0], e.ctrlKey, e.shiftKey); + }, + k13: function (e) {//enter-insert. send file to external app. + imce.send(imce.vars.prvfid); + return false; + }, + k37: function (e) {//left. focus on directories + $(imce.tree[imce.conf.dir].a).focus(); + }, + k65: function (e) {//ctrl+A to select all + if (e.ctrlKey && imce.findex.length) { + var fid = imce.findex[0].id; + imce.selected[fid] ? (imce.vars.lastfid = fid) : imce.fileClick(fid);//select first row + imce.fileClick(imce.findex[imce.findex.length-1], false, true);//shift+click last row + return false; + } + } +}; +//add equal keys +imce.fileKeys.k40 = imce.fileKeys.k38; +imce.fileKeys.k36 = imce.fileKeys.k35; +imce.fileKeys.k45 = imce.fileKeys.k13; +//add default operation keys. delete, R(esize), T(humbnails), U(pload) +$.each({k46: 'delete', k82: 'resize', k84: 'thumb', k85: 'upload'}, function (k, op) { + imce.fileKeys[k] = function (e) { + if (imce.ops[op] && !imce.ops[op].disabled) imce.opClick(op); + }; +}); + +//prepare column sorting +imce.initiateSorting = function() { + //add cache hook. cache the old directory's sort settings before the new one replaces it. + imce.hooks.cache.push(function (cache, newdir) { + cache.cid = imce.vars.cid, cache.dsc = imce.vars.dsc; + }); + //add navigation hook. refresh sorting after the new directory content is loaded. + imce.hooks.navigate.push(function (data, olddir, cached) { + cached ? imce.updateSortState(data.cid, data.dsc) : imce.firstSort(); + }); + imce.vars.cid = imce.cookie('imcecid') * 1; + imce.vars.dsc = imce.cookie('imcedsc') * 1; + imce.cols = imce.el('file-header').rows[0].cells; + $(imce.cols).click(function () {imce.columnSort(this.cellIndex, imce.hasC(this, 'asc'));}); + imce.firstSort(); +}; + +//sort the list for the first time +imce.firstSort = function() { + imce.columnSort(imce.vars.cid, imce.vars.dsc); +}; + +//sort file list according to column index. +imce.columnSort = function(cid, dsc) { + if (imce.findex.length < 2) return; + var func = 'sort'+ (cid == 0 ? 'Str' : 'Num') + (dsc ? 'Dsc' : 'Asc'); + var prop = cid == 2 || cid == 3 ? 'innerHTML' : 'id'; + //sort rows + imce.findex.sort(cid ? function(r1, r2) {return imce[func](r1.cells[cid][prop], r2.cells[cid][prop])} : function(r1, r2) {return imce[func](r1.id, r2.id)}); + //insert sorted rows + for (var row, i=0; row = imce.findex[i]; i++) { + imce.tbody.appendChild(row); + } + imce.updateSortState(cid, dsc); +}; + +//update column states +imce.updateSortState = function(cid, dsc) { + $(imce.cols[imce.vars.cid]).removeClass(imce.vars.dsc ? 'desc' : 'asc'); + $(imce.cols[cid]).addClass(dsc ? 'desc' : 'asc'); + imce.vars.cid != cid && imce.cookie('imcecid', imce.vars.cid = cid); + imce.vars.dsc != dsc && imce.cookie('imcedsc', (imce.vars.dsc = dsc) ? 1 : 0); +}; + +//sorters +imce.sortStrAsc = function(a, b) {return a.toLowerCase() < b.toLowerCase() ? -1 : 1;}; +imce.sortStrDsc = function(a, b) {return imce.sortStrAsc(b, a);}; +imce.sortNumAsc = function(a, b) {return a-b;}; +imce.sortNumDsc = function(a, b) {return b-a}; + +//set resizers for resizable areas and recall previous dimensions +imce.initiateResizeBars = function () { + imce.setResizer('#navigation-resizer', 'X', imce.NW, null, 1, function(p1, p2, m) { + p1 != p2 && imce.cookie('imcenww', p2); + }); + imce.setResizer('#browse-resizer', 'Y', imce.BW, imce.PW, 50, function(p1, p2, m) { + p1 != p2 && imce.cookie('imcebwh', p2); + }); + imce.recallDimensions(); +}; + +//set a resize bar +imce.setResizer = function (resizer, axis, area1, area2, Min, callback) { + var opt = axis == 'X' ? {pos: 'pageX', func: 'width'} : {pos: 'pageY', func: 'height'}; + var Min = Min || 0; + var $area1 = $(area1), $area2 = area2 ? $(area2) : null, $doc = $(document); + $(resizer).mousedown(function(e) { + var pos = e[opt.pos]; + var end = start = $area1[opt.func](); + var Max = $area2 ? start + $area2[opt.func]() : 1200; + var drag = function(e) { + end = Math.min(Max - Min, Math.max(start + e[opt.pos] - pos, Min)); + $area1[opt.func](end); + $area2 && $area2[opt.func](Max - end); + return false; + }; + var undrag = function(e) { + $doc.unbind('mousemove', drag).unbind('mouseup', undrag); + callback && callback(start, end, Max); + }; + $doc.mousemove(drag).mouseup(undrag); + return false; + }); +}; + +//get&set area dimensions of the last session from the cookie +imce.recallDimensions = function() { + var $body = $(document.body); + if (!$body.hasClass('imce')) return; + //row heights + imce.recallHeights(imce.cookie('imcebwh') * 1); + $(window).resize(function(){imce.recallHeights()}); + //navigation wrapper + var nwOldWidth = imce.cookie('imcenww') * 1; + nwOldWidth && $(imce.NW).width(Math.min(nwOldWidth, $body.width() - 10)); +}; + +//set row heights with respect to window height +imce.recallHeights = function(bwFixedHeight) { + //window & body dimensions + var winHeight = window.opera ? window.innerHeight : $(window).height(); + var bodyHeight = $(document.body).outerHeight(true); + var diff = winHeight - bodyHeight; + var bwHeight = $(imce.BW).height(), pwHeight = $(imce.PW).height(); + if (bwFixedHeight) { + //row heights + diff -= bwFixedHeight - bwHeight; + bwHeight = bwFixedHeight; + pwHeight += diff; + } + else { + diff = parseInt(diff/2); + bwHeight += diff; + pwHeight += diff; + } + $(imce.BW).height(bwHeight); + $(imce.PW).height(pwHeight); +}; + +//cookie get & set +imce.cookie = function (name, value) { + if (typeof(value) == 'undefined') {//get + return document.cookie ? imce.decode((document.cookie.match(new RegExp('(?:^|;) *' + name + '=([^;]*)(?:;|$)')) || ['', ''])[1].replace(/\+/g, '%20')) : ''; + } + document.cookie = name +'='+ encodeURIComponent(value) +'; expires='+ (new Date(new Date() * 1 + 15 * 86400000)).toUTCString() +'; path=' + Drupal.settings.basePath + 'imce';//set +}; + +//view thumbnails(smaller than tMaxW x tMaxH) inside the rows. +//Large images can also be previewed by setting imce.vars.prvstyle to a valid image style(imagecache preset) +imce.thumbRow = function (row) { + var w = row.cells[2].innerHTML * 1; + if (!w) return; + var h = row.cells[3].innerHTML * 1; + if (imce.vars.tMaxW < w || imce.vars.tMaxH < h) { + if (!imce.vars.prvstyle || imce.conf.dir.indexOf('styles') == 0) return; + var img = new Image(); + img.src = imce.imagestyleURL(imce.getURL(row.id), imce.vars.prvstyle); + img.className = 'imagestyle-' + imce.vars.prvstyle; + } + else { + var prvH = h, prvW = w; + if (imce.vars.prvW < w || imce.vars.prvH < h) { + if (h < w) { + prvW = imce.vars.prvW; + prvH = prvW*h/w; + } + else { + prvH = imce.vars.prvH; + prvW = prvH*w/h; + } + } + var img = new Image(prvW, prvH); + img.src = imce.getURL(row.id); + } + var cell = row.cells[0]; + cell.insertBefore(img, cell.firstChild); +}; + +//convert a file URL returned by imce.getURL() to an image style(imagecache preset) URL +imce.imagestyleURL = function (url, stylename) { + var len = imce.conf.furl.length - 1; + return url.substr(0, len) + '/styles/' + stylename + '/' + imce.conf.scheme + url.substr(len); +}; + +// replace table view with box view for file list +imce.boxView = function () { + var w = imce.vars.boxW, h = imce.vars.boxH; + if (!w || !h || imce.ie && imce.ie < 8) return; + var $body = $(document.body); + var toggle = function() { + $body.toggleClass('box-view'); + // refresh dom. required by all except FF. + $('#file-list').appendTo(imce.FW).appendTo(imce.FLW); + }; + $body.append(''); + imce.hooks.load.push(function() { + toggle(); + imce.SBW.scrollTop = 0; + imce.opAdd({name: 'changeview', title: Drupal.t('Change view'), func: toggle}); + }); + imce.hooks.list.push(imce.boxViewRow); +}; + +// process a row for box view. include all data in box title. +imce.boxViewRow = function (row) { + var s = ' | ', w = row.cells[2].innerHTML * 1, dim = w ? s + w + 'x' + row.cells[3].innerHTML * 1 : ''; + row.cells[0].title = imce.decode(row.id) + s + row.cells[1].innerHTML + (dim) + s + row.cells[4].innerHTML; +}; + +})(jQuery); \ No newline at end of file diff --git a/sites/all/modules/imce/js/imce_set_app.js b/sites/all/modules/imce/js/imce_set_app.js new file mode 100644 index 0000000..419f7df --- /dev/null +++ b/sites/all/modules/imce/js/imce_set_app.js @@ -0,0 +1,97 @@ +/* + * IMCE Integration by URL + * Ex-1: http://example.com/imce?app=XEditor|url@urlFieldId|width@widthFieldId|height@heightFieldId + * Creates "Insert file" operation tab, which fills the specified fields with url, width, height properties + * of the selected file in the parent window + * Ex-2: http://example.com/imce?app=XEditor|sendto@functionName + * "Insert file" operation calls parent window's functionName(file, imceWindow) + * Ex-3: http://example.com/imce?app=XEditor|imceload@functionName + * Parent window's functionName(imceWindow) is called as soon as IMCE UI is ready. Send to operation + * needs to be set manually. See imce.setSendTo() method in imce.js + */ + +(function($) { + +var appFields = {}, appWindow = (top.appiFrm||window).opener || parent; + +// Execute when imce loads. +imce.hooks.load.push(function(win) { + var index = location.href.lastIndexOf('app='); + if (index == -1) return; + var data = decodeURIComponent(location.href.substr(index + 4)).split('|'); + var arr, prop, str, func, appName = data.shift(); + // Extract fields + for (var i = 0, len = data.length; i < len; i++) { + str = data[i]; + if (!str.length) continue; + if (str.indexOf('&') != -1) str = str.split('&')[0]; + arr = str.split('@'); + if (arr.length > 1) { + prop = arr.shift(); + appFields[prop] = arr.join('@'); + } + } + // Run custom onload function if available + if (appFields.imceload && (func = isFunc(appFields.imceload))) { + func(win); + delete appFields.imceload; + } + // Set custom sendto function. appFinish is the default. + var sendtoFunc = appFields.url ? appFinish : false; + //check sendto@funcName syntax in URL + if (appFields.sendto && (func = isFunc(appFields.sendto))) { + sendtoFunc = func; + delete appFields.sendto; + } + // Check old method windowname+ImceFinish. + else if (win.name && (func = isFunc(win.name +'ImceFinish'))) { + sendtoFunc = func; + } + // Highlight file + if (appFields.url) { + // Support multiple url fields url@field1,field2.. + if (appFields.url.indexOf(',') > -1) { + var arr = appFields.url.split(','); + for (var i in arr) { + if ($('#'+ arr[i], appWindow.document).length) { + appFields.url = arr[i]; + break; + } + } + } + var filename = $('#'+ appFields.url, appWindow.document).val() || ''; + imce.highlight(filename.substr(filename.lastIndexOf('/')+1)); + } + // Set send to + sendtoFunc && imce.setSendTo(Drupal.t('Insert file'), sendtoFunc); +}); + +// Default sendTo function +var appFinish = function(file, win) { + var $doc = $(appWindow.document); + for (var i in appFields) { + $doc.find('#'+ appFields[i]).val(file[i]); + } + if (appFields.url) { + try{ + $doc.find('#'+ appFields.url).blur().change().focus(); + }catch(e){ + try{ + $doc.find('#'+ appFields.url).trigger('onblur').trigger('onchange').trigger('onfocus');//inline events for IE + }catch(e){} + } + } + appWindow.focus(); + win.close(); +}; + +// Checks if a string is a function name in the given scope. +// Returns function reference. Supports x.y.z notation. +var isFunc = function(str, scope) { + var obj = scope || appWindow; + var parts = str.split('.'), len = parts.length; + for (var i = 0; i < len && (obj = obj[parts[i]]); i++); + return obj && i == len && (typeof obj == 'function' || typeof obj != 'string' && !obj.nodeName && obj.constructor != Array && /^[\s[]?function/.test(obj.toString())) ? obj : false; +} + +})(jQuery); \ No newline at end of file diff --git a/sites/all/modules/imce/js/imce_set_inline.js b/sites/all/modules/imce/js/imce_set_inline.js new file mode 100644 index 0000000..08891a1 --- /dev/null +++ b/sites/all/modules/imce/js/imce_set_inline.js @@ -0,0 +1,58 @@ +(function($) { + +var ii = window.imceInline = {}; + +// Drupal behavior +Drupal.behaviors.imceInline = {attach: function(context, settings) { + $('div.imce-inline-wrapper', context).not('.processed').addClass('processed').show().find('a').click(function() { + var i = this.name.indexOf('-IMCE-'); + ii.activeTextarea = $('#'+ this.name.substr(0, i)).get(0); + ii.activeType = this.name.substr(i+6); + + if (typeof ii.pop == 'undefined' || ii.pop.closed) { + ii.pop = window.open(this.href + (this.href.indexOf('?') < 0 ? '?' : '&') +'app=nomatter|imceload@imceInline.load', '', 'width='+ 760 +',height='+ 560 +',resizable=1'); + } + + ii.pop.focus(); + return false; + }); +}}; + +//function to be executed when imce loads. +ii.load = function(win) { + win.imce.setSendTo(Drupal.t('Insert file'), ii.insert); + $(window).bind('unload', function() { + if (ii.pop && !ii.pop.closed) ii.pop.close(); + }); +}; + +//insert html at cursor position +ii.insertAtCursor = function (field, txt, type) { + field.focus(); + if ('undefined' != typeof(field.selectionStart)) { + if (type == 'link' && (field.selectionEnd-field.selectionStart)) { + txt = txt.split('">')[0] +'">'+ field.value.substring(field.selectionStart, field.selectionEnd) +''; + } + field.value = field.value.substring(0, field.selectionStart) + txt + field.value.substring(field.selectionEnd, field.value.length); + } + else if (document.selection) { + if (type == 'link' && document.selection.createRange().text.length) { + txt = txt.split('">')[0] +'">'+ document.selection.createRange().text +''; + } + document.selection.createRange().text = txt; + } + else { + field.value += txt; + } +}; + +//sendTo function +ii.insert = function (file, win) { + var type = ii.activeType == 'link' ? 'link' : (file.width ? 'image' : 'link'); + var html = type == 'image' ? (''+ file.name +'') : (''+ file.name +' ('+ file.size +')'); + ii.activeType = null; + win.blur(); + ii.insertAtCursor(ii.activeTextarea, html, type); +}; + +})(jQuery); \ No newline at end of file diff --git a/sites/all/modules/imce/js/jquery.form.js b/sites/all/modules/imce/js/jquery.form.js new file mode 100644 index 0000000..b750db6 --- /dev/null +++ b/sites/all/modules/imce/js/jquery.form.js @@ -0,0 +1,31 @@ +/*! + * jQuery Form Plugin + * version: 3.17 (25-SEP-2012) + * @requires jQuery v1.3.2 or later + */ +(function(c){'use strict';function v(a){var d=a.data;a.isDefaultPrevented()||(a.preventDefault(),c(a.target).ajaxSubmit(d))}function y(a){var d=a.target,g=c(d);if(!g.is(":submit,input:image")){d=g.closest(":submit");if(0===d.length)return;d=d[0]}var f=this;f.clk=d;"image"==d.type&&(void 0!==a.offsetX?(f.clk_x=a.offsetX,f.clk_y=a.offsetY):"function"==typeof c.fn.offset?(g=g.offset(),f.clk_x=a.pageX-g.left,f.clk_y=a.pageY-g.top):(f.clk_x=a.pageX-d.offsetLeft,f.clk_y=a.pageY-d.offsetTop));setTimeout(function(){f.clk= +f.clk_x=f.clk_y=null},100)}function s(){if(c.fn.ajaxSubmit.debug){var a="[jquery.form] "+Array.prototype.join.call(arguments,"");window.console&&window.console.log?window.console.log(a):window.opera&&window.opera.postError&&window.opera.postError(a)}}var x,z;x=void 0!==c("").get(0).files;z=void 0!==window.FormData;c.fn.ajaxSubmit=function(a){function d(b){b=c.param(b,a.traditional).replace(/\+/g," ").split("&");var f=b.length,h=[],d,e;for(d=0;d').val(e.extraData[n].value).appendTo(d)[0]): +p.push(c('').val(e.extraData[n]).appendTo(d)[0]));e.iframeTarget||(r.appendTo("body"),q.attachEvent?q.attachEvent("onload",g):q.addEventListener("load",g,!1));setTimeout(a,15);d.submit.call?d.submit():document.createElement("form").submit.call(d)}finally{d.action=k,d.target=b,d.enctype=l,c(p).remove()}}function g(a){if(!k.aborted&&!C){try{t=q.contentWindow?q.contentWindow.document:q.contentDocument?q.contentDocument:q.document}catch(b){s("cannot access response document: ", +b),a=x}if(a===y&&k)k.abort("timeout");else if(a==x&&k)k.abort("server abort");else if(t&&t.location.href!=e.iframeSrc||w){q.detachEvent?q.detachEvent("onload",g):q.removeEventListener("load",g,!1);a="success";var d;try{if(w)throw"timeout";var f="xml"==e.dataType||t.XMLDocument||c.isXMLDoc(t);s("isXml="+f);if(!f&&window.opera&&(null===t.body||!t.body.innerHTML)&&--E){s("requeing onLoad callback, DOM not available");setTimeout(g,250);return}var h=t.body?t.body:t.documentElement;k.responseText=h?h.innerHTML: +null;k.responseXML=t.XMLDocument?t.XMLDocument:t;f&&(e.dataType="xml");k.getResponseHeader=function(a){return{"content-type":e.dataType}[a.toLowerCase()]};h&&(k.status=Number(h.getAttribute("status"))||k.status,k.statusText=h.getAttribute("statusText")||k.statusText);var m=(e.dataType||"").toLowerCase(),n=/(json|script|text)/.test(m);if(n||e.textarea){var p=t.getElementsByTagName("textarea")[0];if(p)k.responseText=p.value,k.status=Number(p.getAttribute("status"))||k.status,k.statusText=p.getAttribute("statusText")|| +k.statusText;else if(n){var u=t.getElementsByTagName("pre")[0],A=t.getElementsByTagName("body")[0];u?k.responseText=u.textContent?u.textContent:u.innerText:A&&(k.responseText=A.textContent?A.textContent:A.innerText)}}else"xml"==m&&!k.responseXML&&k.responseText&&(k.responseXML=F(k.responseText));try{z=G(k,m,e)}catch(D){a="parsererror",k.error=d=D||a}}catch(B){s("error caught: ",B),a="error",k.error=d=B||a}k.aborted&&(s("upload aborted"),a=null);k.status&&(a=200<=k.status&&300>k.status||304===k.status? +"success":"error");"success"===a?(e.success&&e.success.call(e.context,z,"success",k),l&&c.event.trigger("ajaxSuccess",[k,e])):a&&(void 0===d&&(d=k.statusText),e.error&&e.error.call(e.context,k,a,d),l&&c.event.trigger("ajaxError",[k,e,d]));l&&c.event.trigger("ajaxComplete",[k,e]);l&&!--c.active&&c.event.trigger("ajaxStop");e.complete&&e.complete.call(e.context,k,a);C=!0;e.timeout&&clearTimeout(v);setTimeout(function(){e.iframeTarget||r.remove();k.responseXML=null},100)}}}var d=n[0],e,l,m,r,q,k,u,w, +v;if(b)for(b=0;b'),r.css({position:"absolute",top:"-1000px",left:"-1000px"}));q=r[0];k={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(a){var b= +"timeout"===a?"timeout":"aborted";s("aborting upload... "+b);this.aborted=1;try{q.contentWindow.document.execCommand&&q.contentWindow.document.execCommand("Stop")}catch(d){}q.src=e.iframeSrc;k.error=b;e.error&&e.error.call(e.context,k,b,a);l&&c.event.trigger("ajaxError",[k,e,b]);e.complete&&e.complete.call(e.context,k,b)}};(l=e.global)&&0===c.active++&&c.event.trigger("ajaxStart");l&&c.event.trigger("ajaxSend",[k,e]);if(e.beforeSend&&!1===e.beforeSend.call(e.context,k,e))e.global&&c.active--;else if(!k.aborted){(b= +d.clk)&&(u=b.name)&&!b.disabled&&(e.extraData=e.extraData||{},e.extraData[u]=b.value,"image"==b.type&&(e.extraData[u+".x"]=d.clk_x,e.extraData[u+".y"]=d.clk_y));var y=1,x=2;b=c("meta[name=csrf-token]").attr("content");(u=c("meta[name=csrf-param]").attr("content"))&&b&&(e.extraData=e.extraData||{},e.extraData[u]=b);e.forceSync?f():setTimeout(f,10);var z,t,E=50,C,F=c.parseXML||function(a,b){window.ActiveXObject?(b=new ActiveXObject("Microsoft.XMLDOM"),b.async="false",b.loadXML(a)):b=(new DOMParser).parseFromString(a, +"text/xml");return b&&b.documentElement&&"parsererror"!=b.documentElement.nodeName?b:null},H=c.parseJSON||function(a){return window.eval("("+a+")")},G=function(a,b,e){var d=a.getResponseHeader("content-type")||"",f="xml"===b||!b&&0<=d.indexOf("xml");a=f?a.responseXML:a.responseText;f&&"parsererror"===a.documentElement.nodeName&&c.error&&c.error("parsererror");e&&e.dataFilter&&(a=e.dataFilter(a,b));"string"===typeof a&&("json"===b||!b&&0<=d.indexOf("json")?a=H(a):("script"===b||!b&&0<=d.indexOf("javascript"))&& +c.globalEval(a));return a}}}if(!this.length)return s("ajaxSubmit: skipping submit process - no element selected"),this;var h,b,n=this;a?"function"===typeof a&&(a={success:a}):a={};h=a.type||n[0].method;b=a.url||n[0].action;(b=(b="string"===typeof b?c.trim(b):"")||window.location.href||"")&&(b=(b.match(/^([^#]+)/)||[])[1]);a=c.extend(!0,{url:b,success:c.ajaxSettings.success,type:h||c.ajaxSettings.type,iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},a);b={};this.trigger("form-pre-serialize", +[this,a,b]);if(b.veto)return s("ajaxSubmit: submit vetoed via form-pre-serialize trigger"),this;if(a.beforeSerialize&&!1===a.beforeSerialize(this,a))return s("ajaxSubmit: submit aborted via beforeSerialize callback"),this;var m=a.traditional;void 0===m&&(m=c.ajaxSettings.traditional);var p=[],l,r=this.formToArray(a.semantic,p);a.data&&(a.extraData=a.data,l=c.param(a.data,m));if(a.beforeSubmit&&!1===a.beforeSubmit(r,this,a))return s("ajaxSubmit: submit aborted via beforeSubmit callback"),this;this.trigger("form-submit-validate", +[r,this,a,b]);if(b.veto)return s("ajaxSubmit: submit vetoed via form-submit-validate trigger"),this;b=c.param(r,m);l&&(b=b?b+"&"+l:l);"GET"==a.type.toUpperCase()?(a.url+=(0<=a.url.indexOf("?")?"&":"?")+b,a.data=null):a.data=b;var w=[];a.resetForm&&w.push(function(){n.resetForm()});a.clearForm&&w.push(function(){n.clearForm(a.includeHidden)});if(!a.dataType&&a.target){var v=a.success||function(){};w.push(function(b){var d=a.replaceTarget?"replaceWith":"html";c(a.target)[d](b).each(v,arguments)})}else a.success&& +w.push(a.success);a.success=function(b,c,d){for(var f=a.context||this,e=0,g=w.length;eb)return null;for(var g=[],h=a.options,n=(f="select-one"==f)?b+1:h.length,b=f?b:0;b + + + +
+ +
+ +
+
!
+
+

:

+
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+

:

+
    +
  • +
  • +
  • +
  • +
+
+
+ +
+
+
+
+ +
+ +
+ + + + + +
+ +
+ + + + + + +
+
+ +
+ $imce_ref)); /* see imce-file-list-tpl.php */?> +
+ +
''. count($imce['files']) .'', + '!dirsize' => ''. format_size($imce['dirsize']) .'', + '!quota' => ''. ($imce['quota'] ? format_size($imce['quota']) : ($imce['tuquota'] ? format_size($imce['tuquota']) : t('unlimited quota'))) .'' + )); ?> +
+ +
+
+ +
+ +
+ +
+ +
+ +
\ No newline at end of file diff --git a/sites/all/modules/imce/tpl/imce-file-list.tpl.php b/sites/all/modules/imce/tpl/imce-file-list.tpl.php new file mode 100644 index 0000000..189eed4 --- /dev/null +++ b/sites/all/modules/imce/tpl/imce-file-list.tpl.php @@ -0,0 +1,25 @@ + + + $file) {?> + + + + + + + +
\ No newline at end of file diff --git a/sites/all/modules/imce/tpl/imce-page.tpl.php b/sites/all/modules/imce/tpl/imce-page.tpl.php new file mode 100644 index 0000000..cfe2185 --- /dev/null +++ b/sites/all/modules/imce/tpl/imce-page.tpl.php @@ -0,0 +1,21 @@ + + + + + <?php print t('File Browser'); ?> + + + + + + + + + +
+ + + + + diff --git a/sites/default/modules/features/popsu_actualites/popsu_actualites.features.field.inc b/sites/default/modules/features/popsu_actualites/popsu_actualites.features.field.inc deleted file mode 100644 index f53fc7e..0000000 --- a/sites/default/modules/features/popsu_actualites/popsu_actualites.features.field.inc +++ /dev/null @@ -1,426 +0,0 @@ - array( - 'active' => '1', - 'cardinality' => '1', - 'deleted' => '0', - 'entity_types' => array(), - 'field_name' => 'field_popsu_actu_body', - 'foreign keys' => array( - 'format' => array( - 'columns' => array( - 'format' => 'format', - ), - 'table' => 'filter_format', - ), - ), - 'indexes' => array( - 'format' => array( - 0 => 'format', - ), - ), - 'locked' => '0', - 'module' => 'text', - 'settings' => array(), - 'translatable' => '0', - 'type' => 'text_with_summary', - ), - 'field_instance' => array( - 'bundle' => 'popsu_actu', - 'default_value' => NULL, - 'deleted' => '0', - 'description' => '', - 'display' => array( - 'default' => array( - 'label' => 'above', - 'module' => 'text', - 'settings' => array(), - 'type' => 'text_default', - 'weight' => 1, - ), - 'teaser' => array( - 'label' => 'above', - 'settings' => array(), - 'type' => 'hidden', - 'weight' => 0, - ), - ), - 'entity_type' => 'node', - 'field_name' => 'field_popsu_actu_body', - 'label' => 'Texte de l\'actualité', - 'required' => 0, - 'settings' => array( - 'display_summary' => 0, - 'text_processing' => '1', - 'user_register_form' => FALSE, - ), - 'widget' => array( - 'active' => 1, - 'module' => 'text', - 'settings' => array( - 'rows' => '20', - 'summary_rows' => 5, - ), - 'type' => 'text_textarea_with_summary', - 'weight' => '12', - ), - ), - ); - - // Exported field: 'node-popsu_actu-field_popsu_actu_date'. - $fields['node-popsu_actu-field_popsu_actu_date'] = array( - 'field_config' => array( - 'active' => '1', - 'cardinality' => '1', - 'deleted' => '0', - 'entity_types' => array(), - 'field_name' => 'field_popsu_actu_date', - 'foreign keys' => array(), - 'indexes' => array(), - 'locked' => '0', - 'module' => 'date', - 'settings' => array( - 'cache_count' => '4', - 'cache_enabled' => 0, - 'granularity' => array( - 'day' => 'day', - 'hour' => 0, - 'minute' => 0, - 'month' => 'month', - 'second' => 0, - 'year' => 'year', - ), - 'timezone_db' => '', - 'todate' => '', - 'tz_handling' => 'none', - ), - 'translatable' => '0', - 'type' => 'datetime', - ), - 'field_instance' => array( - 'bundle' => 'popsu_actu', - 'deleted' => '0', - 'description' => 'Si vous souhaitez retarder la publication de cette actualité, choisissez une date dans le futur.', - 'display' => array( - 'default' => array( - 'label' => 'above', - 'module' => 'date', - 'settings' => array( - 'format_type' => 'long', - 'fromto' => 'both', - 'multiple_from' => '', - 'multiple_number' => '', - 'multiple_to' => '', - ), - 'type' => 'date_default', - 'weight' => 2, - ), - 'teaser' => array( - 'label' => 'above', - 'settings' => array(), - 'type' => 'hidden', - 'weight' => 0, - ), - ), - 'entity_type' => 'node', - 'field_name' => 'field_popsu_actu_date', - 'label' => 'Date de début de publication de l\'actualité sur la page d\'accueil', - 'required' => 1, - 'settings' => array( - 'default_value' => 'now', - 'default_value2' => 'same', - 'default_value_code' => '', - 'default_value_code2' => '', - 'user_register_form' => FALSE, - ), - 'widget' => array( - 'active' => 1, - 'module' => 'date', - 'settings' => array( - 'increment' => '15', - 'input_format' => 'd/m/Y - H:i:s', - 'input_format_custom' => '', - 'label_position' => 'above', - 'text_parts' => array(), - 'year_range' => '-3:+3', - ), - 'type' => 'date_popup', - 'weight' => '8', - ), - ), - ); - - // Exported field: 'node-popsu_actu-field_popsu_actu_date_fin'. - $fields['node-popsu_actu-field_popsu_actu_date_fin'] = array( - 'field_config' => array( - 'active' => '1', - 'cardinality' => '1', - 'deleted' => '0', - 'entity_types' => array(), - 'field_name' => 'field_popsu_actu_date_fin', - 'foreign keys' => array(), - 'indexes' => array(), - 'locked' => '0', - 'module' => 'date', - 'settings' => array( - 'cache_count' => '4', - 'cache_enabled' => 0, - 'granularity' => array( - 'day' => 'day', - 'hour' => 0, - 'minute' => 0, - 'month' => 'month', - 'second' => 0, - 'year' => 'year', - ), - 'timezone_db' => '', - 'todate' => '', - 'tz_handling' => 'none', - ), - 'translatable' => '0', - 'type' => 'datetime', - ), - 'field_instance' => array( - 'bundle' => 'popsu_actu', - 'deleted' => '0', - 'description' => 'Par défaut, les actualités restent 30 jours sur la page d\'accueil. Si vous souhaitez rallonger ce délai, modifier cette date.', - 'display' => array( - 'default' => array( - 'label' => 'above', - 'module' => 'date', - 'settings' => array( - 'format_type' => 'long', - 'fromto' => 'both', - 'multiple_from' => '', - 'multiple_number' => '', - 'multiple_to' => '', - ), - 'type' => 'date_default', - 'weight' => 5, - ), - 'teaser' => array( - 'label' => 'above', - 'settings' => array(), - 'type' => 'hidden', - 'weight' => 0, - ), - ), - 'entity_type' => 'node', - 'field_name' => 'field_popsu_actu_date_fin', - 'label' => 'Date de fin de publication de l\'actualité sur la page d\'accueil', - 'required' => 1, - 'settings' => array( - 'default_value' => 'strtotime', - 'default_value2' => 'same', - 'default_value_code' => '+ 30 days', - 'default_value_code2' => '', - 'user_register_form' => FALSE, - ), - 'widget' => array( - 'active' => 1, - 'module' => 'date', - 'settings' => array( - 'increment' => '15', - 'input_format' => 'd/m/Y - H:i:s', - 'input_format_custom' => '', - 'label_position' => 'above', - 'text_parts' => array(), - 'year_range' => '-3:+3', - ), - 'type' => 'date_popup', - 'weight' => '9', - ), - ), - ); - - // Exported field: 'node-popsu_actu-field_popsu_actu_image'. - $fields['node-popsu_actu-field_popsu_actu_image'] = array( - 'field_config' => array( - 'active' => '1', - 'cardinality' => '1', - 'deleted' => '0', - 'entity_types' => array(), - 'field_name' => 'field_popsu_actu_image', - 'foreign keys' => array( - 'fid' => array( - 'columns' => array( - 'fid' => 'fid', - ), - 'table' => 'file_managed', - ), - ), - 'indexes' => array( - 'fid' => array( - 0 => 'fid', - ), - ), - 'locked' => '0', - 'module' => 'image', - 'settings' => array( - 'default_image' => 0, - 'uri_scheme' => 'public', - ), - 'translatable' => '0', - 'type' => 'image', - ), - 'field_instance' => array( - 'bundle' => 'popsu_actu', - 'deleted' => '0', - 'description' => '', - 'display' => array( - 'default' => array( - 'label' => 'above', - 'module' => 'image', - 'settings' => array( - 'image_link' => '', - 'image_style' => '', - ), - 'type' => 'image', - 'weight' => 3, - ), - 'teaser' => array( - 'label' => 'above', - 'settings' => array(), - 'type' => 'hidden', - 'weight' => 0, - ), - ), - 'entity_type' => 'node', - 'field_name' => 'field_popsu_actu_image', - 'label' => 'Image de l\'actualité', - 'required' => 0, - 'settings' => array( - 'alt_field' => 0, - 'default_image' => 0, - 'file_directory' => '', - 'file_extensions' => 'png gif jpg jpeg', - 'filefield_paths' => array( - 'active_updating' => 0, - 'file_name' => array( - 'options' => array( - 'pathauto' => 1, - 'transliterate' => 1, - ), - 'value' => '[file:ffp-name-only-original].[file:ffp-extension-original]', - ), - 'file_path' => array( - 'options' => array( - 'pathauto' => 1, - 'transliterate' => 1, - ), - 'value' => 'nodes/[node:content-type]/[node:nid]/image', - ), - 'retroactive_update' => 0, - ), - 'max_filesize' => '', - 'max_resolution' => '', - 'min_resolution' => '', - 'title_field' => 1, - 'user_register_form' => FALSE, - ), - 'widget' => array( - 'active' => 1, - 'module' => 'image', - 'settings' => array( - 'preview_image_style' => 'thumbnail', - 'progress_indicator' => 'throbber', - ), - 'type' => 'image_image', - 'weight' => '4', - ), - ), - ); - - // Exported field: 'node-popsu_actu-field_popsu_actu_soustitre'. - $fields['node-popsu_actu-field_popsu_actu_soustitre'] = array( - 'field_config' => array( - 'active' => '1', - 'cardinality' => '1', - 'deleted' => '0', - 'entity_types' => array(), - 'field_name' => 'field_popsu_actu_soustitre', - 'foreign keys' => array( - 'format' => array( - 'columns' => array( - 'format' => 'format', - ), - 'table' => 'filter_format', - ), - ), - 'indexes' => array( - 'format' => array( - 0 => 'format', - ), - ), - 'locked' => '0', - 'module' => 'text', - 'settings' => array( - 'max_length' => '255', - ), - 'translatable' => '0', - 'type' => 'text', - ), - 'field_instance' => array( - 'bundle' => 'popsu_actu', - 'default_value' => NULL, - 'deleted' => '0', - 'description' => '', - 'display' => array( - 'default' => array( - 'label' => 'above', - 'module' => 'text', - 'settings' => array(), - 'type' => 'text_default', - 'weight' => 4, - ), - 'teaser' => array( - 'label' => 'above', - 'settings' => array(), - 'type' => 'hidden', - 'weight' => 0, - ), - ), - 'entity_type' => 'node', - 'field_name' => 'field_popsu_actu_soustitre', - 'label' => 'Sous-titre de l\'actualité', - 'required' => 0, - 'settings' => array( - 'text_processing' => '0', - 'user_register_form' => FALSE, - ), - 'widget' => array( - 'active' => 1, - 'module' => 'text', - 'settings' => array( - 'size' => '60', - ), - 'type' => 'text_textfield', - 'weight' => '7', - ), - ), - ); - - // Translatables - // Included for use with string extractors like potx. - t('Date de début de publication de l\'actualité sur la page d\'accueil'); - t('Date de fin de publication de l\'actualité sur la page d\'accueil'); - t('Image de l\'actualité'); - t('Par défaut, les actualités restent 30 jours sur la page d\'accueil. Si vous souhaitez rallonger ce délai, modifier cette date.'); - t('Si vous souhaitez retarder la publication de cette actualité, choisissez une date dans le futur.'); - t('Sous-titre de l\'actualité'); - t('Texte de l\'actualité'); - - return $fields; -} diff --git a/sites/default/modules/features/popsu_actualites/popsu_actualites.features.field_base.inc b/sites/default/modules/features/popsu_actualites/popsu_actualites.features.field_base.inc new file mode 100644 index 0000000..b51bd37 --- /dev/null +++ b/sites/default/modules/features/popsu_actualites/popsu_actualites.features.field_base.inc @@ -0,0 +1,182 @@ + 1, + 'cardinality' => -1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_actu_attachment', + 'indexes' => array( + 'fid' => array( + 0 => 'fid', + ), + ), + 'locked' => 0, + 'module' => 'file', + 'settings' => array( + 'display_default' => 0, + 'display_field' => 0, + 'uri_scheme' => 'public', + ), + 'translatable' => 0, + 'type' => 'file', + ); + + // Exported field_base: 'field_popsu_actu_body'. + $field_bases['field_popsu_actu_body'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_actu_body', + 'indexes' => array( + 'format' => array( + 0 => 'format', + ), + ), + 'locked' => 0, + 'module' => 'text', + 'settings' => array(), + 'translatable' => 0, + 'type' => 'text_with_summary', + ); + + // Exported field_base: 'field_popsu_actu_date'. + $field_bases['field_popsu_actu_date'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_actu_date', + 'indexes' => array(), + 'locked' => 0, + 'module' => 'date', + 'settings' => array( + 'cache_count' => 4, + 'cache_enabled' => 0, + 'granularity' => array( + 'day' => 'day', + 'hour' => 0, + 'minute' => 0, + 'month' => 'month', + 'second' => 0, + 'year' => 'year', + ), + 'timezone_db' => '', + 'todate' => '', + 'tz_handling' => 'none', + ), + 'translatable' => 0, + 'type' => 'datetime', + ); + + // Exported field_base: 'field_popsu_actu_date_fin'. + $field_bases['field_popsu_actu_date_fin'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_actu_date_fin', + 'indexes' => array(), + 'locked' => 0, + 'module' => 'date', + 'settings' => array( + 'cache_count' => 4, + 'cache_enabled' => 0, + 'granularity' => array( + 'day' => 'day', + 'hour' => 0, + 'minute' => 0, + 'month' => 'month', + 'second' => 0, + 'year' => 'year', + ), + 'timezone_db' => '', + 'todate' => '', + 'tz_handling' => 'none', + ), + 'translatable' => 0, + 'type' => 'datetime', + ); + + // Exported field_base: 'field_popsu_actu_enhome'. + $field_bases['field_popsu_actu_enhome'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_actu_enhome', + 'indexes' => array( + 'value' => array( + 0 => 'value', + ), + ), + 'locked' => 0, + 'module' => 'list', + 'settings' => array( + 'allowed_values' => array( + 0 => '', + 1 => 'Publié sur la page d\'accueil', + ), + 'allowed_values_function' => '', + ), + 'translatable' => 0, + 'type' => 'list_boolean', + ); + + // Exported field_base: 'field_popsu_actu_image'. + $field_bases['field_popsu_actu_image'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_actu_image', + 'indexes' => array( + 'fid' => array( + 0 => 'fid', + ), + ), + 'locked' => 0, + 'module' => 'image', + 'settings' => array( + 'default_image' => 0, + 'uri_scheme' => 'public', + ), + 'translatable' => 0, + 'type' => 'image', + ); + + // Exported field_base: 'field_popsu_actu_soustitre'. + $field_bases['field_popsu_actu_soustitre'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_actu_soustitre', + 'indexes' => array( + 'format' => array( + 0 => 'format', + ), + ), + 'locked' => 0, + 'module' => 'text', + 'settings' => array( + 'max_length' => 255, + ), + 'translatable' => 0, + 'type' => 'text', + ); + + return $field_bases; +} diff --git a/sites/default/modules/features/popsu_actualites/popsu_actualites.features.field_instance.inc b/sites/default/modules/features/popsu_actualites/popsu_actualites.features.field_instance.inc new file mode 100644 index 0000000..1769c8b --- /dev/null +++ b/sites/default/modules/features/popsu_actualites/popsu_actualites.features.field_instance.inc @@ -0,0 +1,404 @@ + 'popsu_actu', + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'file', + 'settings' => array(), + 'type' => 'file_default', + 'weight' => 6, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_actu_attachment', + 'label' => 'Pièces jointes à cette actualité', + 'required' => 0, + 'settings' => array( + 'description_field' => 1, + 'file_directory' => '', + 'file_extensions' => 'txt pdf zip rar xls doc xlsx docx ppt pptx', + 'filefield_paths' => array( + 'active_updating' => 0, + 'file_name' => array( + 'options' => array( + 'pathauto' => 1, + 'transliterate' => 1, + ), + 'value' => '[file:ffp-name-only-original].[file:ffp-extension-original]', + ), + 'file_path' => array( + 'options' => array( + 'pathauto' => 1, + 'transliterate' => 1, + ), + 'value' => 'nodes/[node:content-type]/[node:nid]/files', + ), + 'retroactive_update' => 0, + ), + 'max_filesize' => '', + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'file', + 'settings' => array( + 'insert' => 0, + 'insert_absolute' => FALSE, + 'insert_class' => '', + 'insert_default' => array( + 0 => 'auto', + ), + 'insert_styles' => array( + 0 => 'auto', + ), + 'insert_width' => '', + 'progress_indicator' => 'bar', + ), + 'type' => 'file_generic', + 'weight' => 3, + ), + ); + + // Exported field_instance: 'node-popsu_actu-field_popsu_actu_body'. + $field_instances['node-popsu_actu-field_popsu_actu_body'] = array( + 'bundle' => 'popsu_actu', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 1, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_actu_body', + 'label' => 'Texte de l\'actualité', + 'required' => 0, + 'settings' => array( + 'display_summary' => 0, + 'text_processing' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'text', + 'settings' => array( + 'rows' => 20, + 'summary_rows' => 5, + ), + 'type' => 'text_textarea_with_summary', + 'weight' => 12, + ), + ); + + // Exported field_instance: 'node-popsu_actu-field_popsu_actu_date'. + $field_instances['node-popsu_actu-field_popsu_actu_date'] = array( + 'bundle' => 'popsu_actu', + 'deleted' => 0, + 'description' => 'Si vous souhaitez retarder la publication de cette actualité, choisissez une date dans le futur.', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'date', + 'settings' => array( + 'format_type' => 'long', + 'fromto' => 'both', + 'multiple_from' => '', + 'multiple_number' => '', + 'multiple_to' => '', + ), + 'type' => 'date_default', + 'weight' => 2, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_actu_date', + 'label' => 'Date de début de validité de l\'actualité', + 'required' => 1, + 'settings' => array( + 'default_value' => 'now', + 'default_value2' => 'same', + 'default_value_code' => '', + 'default_value_code2' => '', + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'date', + 'settings' => array( + 'increment' => 15, + 'input_format' => 'd/m/Y - H:i:s', + 'input_format_custom' => '', + 'label_position' => 'above', + 'text_parts' => array(), + 'year_range' => '-3:+3', + ), + 'type' => 'date_popup', + 'weight' => 9, + ), + ); + + // Exported field_instance: 'node-popsu_actu-field_popsu_actu_date_fin'. + $field_instances['node-popsu_actu-field_popsu_actu_date_fin'] = array( + 'bundle' => 'popsu_actu', + 'deleted' => 0, + 'description' => 'Par défaut, les actualités restent 30 jours sur la page d\'accueil. Si vous souhaitez rallonger ce délai, modifier cette date.', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'date', + 'settings' => array( + 'format_type' => 'long', + 'fromto' => 'both', + 'multiple_from' => '', + 'multiple_number' => '', + 'multiple_to' => '', + ), + 'type' => 'date_default', + 'weight' => 5, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_actu_date_fin', + 'label' => 'Date de fin de validité de l\'actualité', + 'required' => 1, + 'settings' => array( + 'default_value' => 'strtotime', + 'default_value2' => 'same', + 'default_value_code' => '+ 30 days', + 'default_value_code2' => '', + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'date', + 'settings' => array( + 'increment' => 15, + 'input_format' => 'd/m/Y - H:i:s', + 'input_format_custom' => '', + 'label_position' => 'above', + 'text_parts' => array(), + 'year_range' => '-3:+3', + ), + 'type' => 'date_popup', + 'weight' => 10, + ), + ); + + // Exported field_instance: 'node-popsu_actu-field_popsu_actu_enhome'. + $field_instances['node-popsu_actu-field_popsu_actu_enhome'] = array( + 'bundle' => 'popsu_actu', + 'default_value' => array( + 0 => array( + 'value' => 1, + ), + ), + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 7, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_actu_enhome', + 'label' => 'Publier sur la page d\'accueil', + 'required' => 0, + 'settings' => array( + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'options', + 'settings' => array( + 'display_label' => 0, + ), + 'type' => 'options_onoff', + 'weight' => 8, + ), + ); + + // Exported field_instance: 'node-popsu_actu-field_popsu_actu_image'. + $field_instances['node-popsu_actu-field_popsu_actu_image'] = array( + 'bundle' => 'popsu_actu', + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'image', + 'settings' => array( + 'image_link' => '', + 'image_style' => '', + ), + 'type' => 'image', + 'weight' => 3, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_actu_image', + 'label' => 'Image de l\'actualité', + 'required' => 0, + 'settings' => array( + 'alt_field' => 0, + 'default_image' => 0, + 'file_directory' => '', + 'file_extensions' => 'png gif jpg jpeg', + 'filefield_paths' => array( + 'active_updating' => 0, + 'file_name' => array( + 'options' => array( + 'pathauto' => 1, + 'transliterate' => 1, + ), + 'value' => '[file:ffp-name-only-original].[file:ffp-extension-original]', + ), + 'file_path' => array( + 'options' => array( + 'pathauto' => 1, + 'transliterate' => 1, + ), + 'value' => 'nodes/[node:content-type]/[node:nid]/image', + ), + 'retroactive_update' => 0, + ), + 'max_filesize' => '', + 'max_resolution' => '', + 'min_resolution' => '', + 'title_field' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'image', + 'settings' => array( + 'insert' => 0, + 'insert_absolute' => FALSE, + 'insert_class' => '', + 'insert_default' => array( + 0 => 'auto', + ), + 'insert_styles' => array( + 0 => 'auto', + ), + 'insert_width' => '', + 'preview_image_style' => 'thumbnail', + 'progress_indicator' => 'throbber', + ), + 'type' => 'image_image', + 'weight' => 4, + ), + ); + + // Exported field_instance: 'node-popsu_actu-field_popsu_actu_soustitre'. + $field_instances['node-popsu_actu-field_popsu_actu_soustitre'] = array( + 'bundle' => 'popsu_actu', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 4, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_actu_soustitre', + 'label' => 'Sous-titre de l\'actualité', + 'required' => 0, + 'settings' => array( + 'text_processing' => 0, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'text', + 'settings' => array( + 'size' => 60, + ), + 'type' => 'text_textfield', + 'weight' => 7, + ), + ); + + // Translatables + // Included for use with string extractors like potx. + t('Date de début de validité de l\'actualité'); + t('Date de fin de validité de l\'actualité'); + t('Image de l\'actualité'); + t('Par défaut, les actualités restent 30 jours sur la page d\'accueil. Si vous souhaitez rallonger ce délai, modifier cette date.'); + t('Pièces jointes à cette actualité'); + t('Publier sur la page d\'accueil'); + t('Si vous souhaitez retarder la publication de cette actualité, choisissez une date dans le futur.'); + t('Sous-titre de l\'actualité'); + t('Texte de l\'actualité'); + + return $field_instances; +} diff --git a/sites/default/modules/features/popsu_actualites/popsu_actualites.features.inc b/sites/default/modules/features/popsu_actualites/popsu_actualites.features.inc index 7360562..ba7eec8 100644 --- a/sites/default/modules/features/popsu_actualites/popsu_actualites.features.inc +++ b/sites/default/modules/features/popsu_actualites/popsu_actualites.features.inc @@ -4,45 +4,22 @@ * popsu_actualites.features.inc */ -/** - * Implements hook_block_class_features_default_class(). - */ -function popsu_actualites_block_class_features_default_class() { - return array( - 'views:actualites-block_1' => array( - 'module' => 'views', - 'delta' => 'actualites-block_1', - 'css_classes' => 'left-nav-level-1', - ), - 'views:actualites-block_2' => array( - 'module' => 'views', - 'delta' => 'actualites-block_2', - 'css_classes' => 'left-nav-level-1', - ), - ); -} - /** * Implements hook_ctools_plugin_api(). */ -function popsu_actualites_ctools_plugin_api() { - list($module, $api) = func_get_args(); +function popsu_actualites_ctools_plugin_api($module = NULL, $api = NULL) { if ($module == "boxes" && $api == "box") { return array("version" => "1"); } - list($module, $api) = func_get_args(); if ($module == "context" && $api == "context") { return array("version" => "3"); } - list($module, $api) = func_get_args(); if ($module == "field_group" && $api == "field_group") { return array("version" => "1"); } - list($module, $api) = func_get_args(); if ($module == "page_manager" && $api == "pages_default") { return array("version" => "1"); } - list($module, $api) = func_get_args(); if ($module == "strongarm" && $api == "strongarm") { return array("version" => "1"); } @@ -51,8 +28,8 @@ function popsu_actualites_ctools_plugin_api() { /** * Implements hook_views_api(). */ -function popsu_actualites_views_api() { - return array("version" => "3.0"); +function popsu_actualites_views_api($module = NULL, $api = NULL) { + return array("api" => "3.0"); } /** @@ -63,44 +40,30 @@ function popsu_actualites_image_default_styles() { // Exported image style: popsu-actu-home. $styles['popsu-actu-home'] = array( - 'name' => 'popsu-actu-home', + 'label' => 'popsu-actu-home', 'effects' => array( 15 => array( - 'label' => 'Mise à l’échelle et recadrage', - 'help' => 'La mise à l\'échelle et le recadrage maintiendront les proportions originales de l\'image puis recadreront la dimension la plus large. C\'est très utile pour créer des vignettes carrées sans étirer les images.', - 'effect callback' => 'image_scale_and_crop_effect', - 'dimensions callback' => 'image_resize_dimensions', - 'form callback' => 'image_resize_form', - 'summary theme' => 'image_resize_summary', - 'module' => 'image', 'name' => 'image_scale_and_crop', 'data' => array( - 'width' => '206', - 'height' => '156', + 'width' => 206, + 'height' => 156, ), - 'weight' => '1', + 'weight' => 1, ), ), ); // Exported image style: popsu-actu-listing. $styles['popsu-actu-listing'] = array( - 'name' => 'popsu-actu-listing', + 'label' => 'popsu-actu-listing', 'effects' => array( 16 => array( - 'label' => 'Mise à l’échelle et recadrage', - 'help' => 'La mise à l\'échelle et le recadrage maintiendront les proportions originales de l\'image puis recadreront la dimension la plus large. C\'est très utile pour créer des vignettes carrées sans étirer les images.', - 'effect callback' => 'image_scale_and_crop_effect', - 'dimensions callback' => 'image_resize_dimensions', - 'form callback' => 'image_resize_form', - 'summary theme' => 'image_resize_summary', - 'module' => 'image', 'name' => 'image_scale_and_crop', 'data' => array( - 'width' => '220', - 'height' => '168', + 'width' => 220, + 'height' => 168, ), - 'weight' => '1', + 'weight' => 1, ), ), ); @@ -122,5 +85,6 @@ function popsu_actualites_node_info() { 'help' => '', ), ); + drupal_alter('node_info', $items); return $items; } diff --git a/sites/default/modules/features/popsu_actualites/popsu_actualites.field_group.inc b/sites/default/modules/features/popsu_actualites/popsu_actualites.field_group.inc index 7964b22..e54b3f7 100644 --- a/sites/default/modules/features/popsu_actualites/popsu_actualites.field_group.inc +++ b/sites/default/modules/features/popsu_actualites/popsu_actualites.field_group.inc @@ -26,7 +26,8 @@ function popsu_actualites_field_group_info() { 0 => 'field_popsu_actu_date', 1 => 'field_popsu_actu_soustitre', 2 => 'field_popsu_actu_date_fin', - 3 => 'title', + 3 => 'field_popsu_actu_enhome', + 4 => 'title', ), 'format_type' => 'tab', 'format_settings' => array( @@ -51,7 +52,7 @@ function popsu_actualites_field_group_info() { $field_group->parent_name = ''; $field_group->data = array( 'label' => 'Image', - 'weight' => '2', + 'weight' => '4', 'children' => array( 0 => 'field_popsu_actu_image', ), diff --git a/sites/default/modules/features/popsu_actualites/popsu_actualites.info b/sites/default/modules/features/popsu_actualites/popsu_actualites.info index 85298d4..051f58c 100644 --- a/sites/default/modules/features/popsu_actualites/popsu_actualites.info +++ b/sites/default/modules/features/popsu_actualites/popsu_actualites.info @@ -2,21 +2,17 @@ name = POPSU Actualités description = POPSU - Type de contenu Colloques core = 7.x package = POPSU -php = 5.2.4 version = 7.x-1.0-beta10 project = popsu_actualites -dependencies[] = ctools dependencies[] = date dependencies[] = field_group dependencies[] = filefield_paths dependencies[] = image +dependencies[] = list dependencies[] = page_manager dependencies[] = popsu_structure dependencies[] = strongarm -dependencies[] = views dependencies[] = views_content -features[block_class][] = views:actualites-block_1 -features[block_class][] = views:actualites-block_2 features[box][] = popsu_logo_popsuneutral features[context][] = popsu-actualites-listing features[context][] = popsu-actualites-node @@ -27,15 +23,24 @@ features[ctools][] = field_group:field_group:1 features[ctools][] = page_manager:pages_default:1 features[ctools][] = strongarm:strongarm:1 features[ctools][] = views:views_default:3.0 -features[features_api][] = api:1 -features[field][] = node-popsu_actu-field_popsu_actu_body -features[field][] = node-popsu_actu-field_popsu_actu_date -features[field][] = node-popsu_actu-field_popsu_actu_date_fin -features[field][] = node-popsu_actu-field_popsu_actu_image -features[field][] = node-popsu_actu-field_popsu_actu_soustitre +features[features_api][] = api:2 +features[field_base][] = field_popsu_actu_attachment +features[field_base][] = field_popsu_actu_body +features[field_base][] = field_popsu_actu_date +features[field_base][] = field_popsu_actu_date_fin +features[field_base][] = field_popsu_actu_enhome +features[field_base][] = field_popsu_actu_image +features[field_base][] = field_popsu_actu_soustitre features[field_group][] = group_popsu_actu_basic|node|popsu_actu|form features[field_group][] = group_popsu_actu_image|node|popsu_actu|form features[field_group][] = group_popsu_actu_texte|node|popsu_actu|form +features[field_instance][] = node-popsu_actu-field_popsu_actu_attachment +features[field_instance][] = node-popsu_actu-field_popsu_actu_body +features[field_instance][] = node-popsu_actu-field_popsu_actu_date +features[field_instance][] = node-popsu_actu-field_popsu_actu_date_fin +features[field_instance][] = node-popsu_actu-field_popsu_actu_enhome +features[field_instance][] = node-popsu_actu-field_popsu_actu_image +features[field_instance][] = node-popsu_actu-field_popsu_actu_soustitre features[image][] = popsu-actu-home features[image][] = popsu-actu-listing features[node][] = popsu_actu @@ -56,4 +61,7 @@ features[variable][] = page_title_type_popsu_actu features[variable][] = page_title_type_popsu_actu_showfield features[variable][] = pathauto_node_popsu_actu_pattern features[variable][] = publishcontent_popsu_actu +features[variable][] = xmlsitemap_settings_node_popsu_actu features[views_view][] = actualites +features_exclude[dependencies][views] = views +features_exclude[dependencies][panels] = panels diff --git a/sites/default/modules/features/popsu_actualites/popsu_actualites.pages_default.inc b/sites/default/modules/features/popsu_actualites/popsu_actualites.pages_default.inc index f711e37..053ed25 100644 --- a/sites/default/modules/features/popsu_actualites/popsu_actualites.pages_default.inc +++ b/sites/default/modules/features/popsu_actualites/popsu_actualites.pages_default.inc @@ -61,230 +61,241 @@ function popsu_actualites_default_page_manager_handlers() { ); $display->cache = array(); $display->title = ''; + $display->uuid = 'd0d44175-6be3-49eb-957a-3bd9b1d9c38c'; + $display->storage_type = 'page_manager'; + $display->storage_id = 'node_view_panel_context_12'; $display->content = array(); $display->panels = array(); - $pane = new stdClass(); - $pane->pid = 'new-1'; - $pane->panel = 'footer'; - $pane->type = 'entity_field'; - $pane->subtype = 'node:field_popsu_actu_soustitre'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'label' => 'title', - 'formatter' => 'text_default', - 'delta_limit' => 0, - 'delta_offset' => '0', - 'delta_reversed' => FALSE, - 'formatter_settings' => array(), - 'context' => 'argument_entity_id:node_1', - 'override_title' => 1, - 'override_title_text' => '', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array(); - $pane->extras = array(); - $pane->position = 0; - $pane->locks = array(); - $display->content['new-1'] = $pane; - $display->panels['footer'][0] = 'new-1'; - $pane = new stdClass(); - $pane->pid = 'new-2'; - $pane->panel = 'footer'; - $pane->type = 'entity_field'; - $pane->subtype = 'node:field_popsu_actu_date'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'label' => 'title', - 'formatter' => 'date_default', - 'delta_limit' => 0, - 'delta_offset' => '0', - 'delta_reversed' => FALSE, - 'formatter_settings' => array( - 'format_type' => 'popsu_yyyy_mm_dd', - 'multiple_number' => '', - 'multiple_from' => '', - 'multiple_to' => '', - 'fromto' => 'both', - ), - 'context' => 'argument_entity_id:node_1', - 'override_title' => 1, - 'override_title_text' => '', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array(); - $pane->extras = array(); - $pane->position = 1; - $pane->locks = array(); - $display->content['new-2'] = $pane; - $display->panels['footer'][1] = 'new-2'; - $pane = new stdClass(); - $pane->pid = 'new-3'; - $pane->panel = 'footer'; - $pane->type = 'entity_field'; - $pane->subtype = 'node:field_popsu_actu_body'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'label' => 'title', - 'formatter' => 'text_default', - 'delta_limit' => 0, - 'delta_offset' => '0', - 'delta_reversed' => FALSE, - 'formatter_settings' => array(), - 'context' => 'argument_entity_id:node_1', - 'override_title' => 1, - 'override_title_text' => '', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => '', - 'css_class' => 'layout-64p', - ); - $pane->extras = array(); - $pane->position = 2; - $pane->locks = array(); - $display->content['new-3'] = $pane; - $display->panels['footer'][2] = 'new-3'; - $pane = new stdClass(); - $pane->pid = 'new-4'; - $pane->panel = 'footer'; - $pane->type = 'views_panes'; - $pane->subtype = 'actualites-panel_pane_2'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'arguments' => array( - 'nid' => '%node:nid', - ), - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array(); - $pane->extras = array(); - $pane->position = 3; - $pane->locks = array(); - $display->content['new-4'] = $pane; - $display->panels['footer'][3] = 'new-4'; - $pane = new stdClass(); - $pane->pid = 'new-5'; - $pane->panel = 'footer'; - $pane->type = 'views_panes'; - $pane->subtype = 'actualites-panel_pane_3'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'arguments' => array( - 'nid' => '%node:nid', - ), - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array(); - $pane->extras = array(); - $pane->position = 4; - $pane->locks = array(); - $display->content['new-5'] = $pane; - $display->panels['footer'][4] = 'new-5'; - $pane = new stdClass(); - $pane->pid = 'new-6'; - $pane->panel = 'header'; - $pane->type = 'custom'; - $pane->subtype = 'custom'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'admin_title' => 'Actualités - Titre - A venir ou passées', - 'title' => '', - 'body' => '

Actualites a venir

+ $pane = new stdClass(); + $pane->pid = 'new-e40cf02e-a1a8-479b-a6e3-1bdba41e02f0'; + $pane->panel = 'footer'; + $pane->type = 'entity_field'; + $pane->subtype = 'node:field_popsu_actu_soustitre'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'label' => 'title', + 'formatter' => 'text_default', + 'delta_limit' => 0, + 'delta_offset' => '0', + 'delta_reversed' => FALSE, + 'formatter_settings' => array(), + 'context' => 'argument_entity_id:node_1', + 'override_title' => 1, + 'override_title_text' => '', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array(); + $pane->extras = array(); + $pane->position = 0; + $pane->locks = array(); + $pane->uuid = 'e40cf02e-a1a8-479b-a6e3-1bdba41e02f0'; + $display->content['new-e40cf02e-a1a8-479b-a6e3-1bdba41e02f0'] = $pane; + $display->panels['footer'][0] = 'new-e40cf02e-a1a8-479b-a6e3-1bdba41e02f0'; + $pane = new stdClass(); + $pane->pid = 'new-023bb002-6c73-45e4-8300-ebf1bb78fc6e'; + $pane->panel = 'footer'; + $pane->type = 'entity_field'; + $pane->subtype = 'node:field_popsu_actu_date'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'label' => 'title', + 'formatter' => 'date_default', + 'delta_limit' => 0, + 'delta_offset' => '0', + 'delta_reversed' => FALSE, + 'formatter_settings' => array( + 'format_type' => 'popsu_yyyy_mm_dd', + 'multiple_number' => '', + 'multiple_from' => '', + 'multiple_to' => '', + 'fromto' => 'both', + ), + 'context' => 'argument_entity_id:node_1', + 'override_title' => 1, + 'override_title_text' => '', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array(); + $pane->extras = array(); + $pane->position = 1; + $pane->locks = array(); + $pane->uuid = '023bb002-6c73-45e4-8300-ebf1bb78fc6e'; + $display->content['new-023bb002-6c73-45e4-8300-ebf1bb78fc6e'] = $pane; + $display->panels['footer'][1] = 'new-023bb002-6c73-45e4-8300-ebf1bb78fc6e'; + $pane = new stdClass(); + $pane->pid = 'new-87a6bcca-c696-4405-be4b-ed4516cf34a6'; + $pane->panel = 'footer'; + $pane->type = 'entity_field'; + $pane->subtype = 'node:field_popsu_actu_body'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'label' => 'title', + 'formatter' => 'text_default', + 'delta_limit' => 0, + 'delta_offset' => '0', + 'delta_reversed' => FALSE, + 'formatter_settings' => array(), + 'context' => 'argument_entity_id:node_1', + 'override_title' => 1, + 'override_title_text' => '', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => '', + 'css_class' => 'layout-64p', + ); + $pane->extras = array(); + $pane->position = 2; + $pane->locks = array(); + $pane->uuid = '87a6bcca-c696-4405-be4b-ed4516cf34a6'; + $display->content['new-87a6bcca-c696-4405-be4b-ed4516cf34a6'] = $pane; + $display->panels['footer'][2] = 'new-87a6bcca-c696-4405-be4b-ed4516cf34a6'; + $pane = new stdClass(); + $pane->pid = 'new-f3d686ff-7c21-413c-ab53-f51c34e5e775'; + $pane->panel = 'footer'; + $pane->type = 'views_panes'; + $pane->subtype = 'actualites-panel_pane_2'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'arguments' => array( + 'nid' => '%node:nid', + ), + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array(); + $pane->extras = array(); + $pane->position = 3; + $pane->locks = array(); + $pane->uuid = 'f3d686ff-7c21-413c-ab53-f51c34e5e775'; + $display->content['new-f3d686ff-7c21-413c-ab53-f51c34e5e775'] = $pane; + $display->panels['footer'][3] = 'new-f3d686ff-7c21-413c-ab53-f51c34e5e775'; + $pane = new stdClass(); + $pane->pid = 'new-fc2a42c0-dd25-4872-8f98-8ae2780e5116'; + $pane->panel = 'footer'; + $pane->type = 'views_panes'; + $pane->subtype = 'actualites-panel_pane_3'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'arguments' => array( + 'nid' => '%node:nid', + ), + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array(); + $pane->extras = array(); + $pane->position = 4; + $pane->locks = array(); + $pane->uuid = 'fc2a42c0-dd25-4872-8f98-8ae2780e5116'; + $display->content['new-fc2a42c0-dd25-4872-8f98-8ae2780e5116'] = $pane; + $display->panels['footer'][4] = 'new-fc2a42c0-dd25-4872-8f98-8ae2780e5116'; + $pane = new stdClass(); + $pane->pid = 'new-9fe66e75-0f7a-497c-9ffc-c21d5bf061c1'; + $pane->panel = 'header'; + $pane->type = 'custom'; + $pane->subtype = 'custom'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'admin_title' => 'Actualités - Titre - A venir ou passées', + 'title' => '', + 'body' => '

Actualites a venir

Actualites passees

', - 'format' => 'php_code', - 'substitute' => 1, - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array(); - $pane->extras = array(); - $pane->position = 0; - $pane->locks = array(); - $display->content['new-6'] = $pane; - $display->panels['header'][0] = 'new-6'; - $pane = new stdClass(); - $pane->pid = 'new-7'; - $pane->panel = 'header'; - $pane->type = 'node_title'; - $pane->subtype = 'node_title'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'link' => 0, - 'context' => 'argument_entity_id:node_1', - 'override_title' => 1, - 'override_title_text' => '', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => 'page-title-secondary-actu', - 'css_class' => 'page-title-secondary', - ); - $pane->extras = array(); - $pane->position = 1; - $pane->locks = array(); - $display->content['new-7'] = $pane; - $display->panels['header'][1] = 'new-7'; - $pane = new stdClass(); - $pane->pid = 'new-8'; - $pane->panel = 'left'; - $pane->type = 'entity_field'; - $pane->subtype = 'node:field_popsu_actu_image'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'label' => 'title', - 'formatter' => 'image', - 'delta_limit' => 0, - 'delta_offset' => '0', - 'delta_reversed' => FALSE, - 'formatter_settings' => array( - 'image_style' => '', - 'image_link' => '', - ), - 'context' => 'argument_entity_id:node_1', - 'override_title' => 1, - 'override_title_text' => '', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => 'panel-actu-grande-image', - 'css_class' => 'image-decallee', - ); - $pane->extras = array(); - $pane->position = 0; - $pane->locks = array(); - $display->content['new-8'] = $pane; - $display->panels['left'][0] = 'new-8'; + 'format' => 'php_code', + 'substitute' => 1, + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array(); + $pane->extras = array(); + $pane->position = 0; + $pane->locks = array(); + $pane->uuid = '9fe66e75-0f7a-497c-9ffc-c21d5bf061c1'; + $display->content['new-9fe66e75-0f7a-497c-9ffc-c21d5bf061c1'] = $pane; + $display->panels['header'][0] = 'new-9fe66e75-0f7a-497c-9ffc-c21d5bf061c1'; + $pane = new stdClass(); + $pane->pid = 'new-b0ef292b-5304-47f3-8b50-b3d901e52e00'; + $pane->panel = 'header'; + $pane->type = 'node_title'; + $pane->subtype = 'node_title'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'link' => 0, + 'context' => 'argument_entity_id:node_1', + 'override_title' => 1, + 'override_title_text' => '', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => 'page-title-secondary-actu', + 'css_class' => 'page-title-secondary', + ); + $pane->extras = array(); + $pane->position = 1; + $pane->locks = array(); + $pane->uuid = 'b0ef292b-5304-47f3-8b50-b3d901e52e00'; + $display->content['new-b0ef292b-5304-47f3-8b50-b3d901e52e00'] = $pane; + $display->panels['header'][1] = 'new-b0ef292b-5304-47f3-8b50-b3d901e52e00'; + $pane = new stdClass(); + $pane->pid = 'new-47e94db5-efe8-4cbc-9eed-ed063d49c319'; + $pane->panel = 'left'; + $pane->type = 'entity_field'; + $pane->subtype = 'node:field_popsu_actu_image'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'label' => 'title', + 'formatter' => 'image', + 'delta_limit' => 0, + 'delta_offset' => '0', + 'delta_reversed' => FALSE, + 'formatter_settings' => array( + 'image_style' => '', + 'image_link' => '', + ), + 'context' => 'argument_entity_id:node_1', + 'override_title' => 1, + 'override_title_text' => '', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => 'panel-actu-grande-image', + 'css_class' => 'image-decallee', + ); + $pane->extras = array(); + $pane->position = 0; + $pane->locks = array(); + $pane->uuid = '47e94db5-efe8-4cbc-9eed-ed063d49c319'; + $display->content['new-47e94db5-efe8-4cbc-9eed-ed063d49c319'] = $pane; + $display->panels['left'][0] = 'new-47e94db5-efe8-4cbc-9eed-ed063d49c319'; $display->hide_title = PANELS_TITLE_NONE; $display->title_pane = '0'; $handler->conf['display'] = $display; @@ -362,80 +373,85 @@ function popsu_actualites_default_page_manager_pages() { ); $display->cache = array(); $display->title = 'Actualités, appels d\'offre et consultations'; + $display->uuid = 'c6b465ec-1b7c-414a-848a-27b5bf692a45'; + $display->storage_type = 'page_manager'; + $display->storage_id = 'page_popsu_actualites_panel_context'; $display->content = array(); $display->panels = array(); - $pane = new stdClass(); - $pane->pid = 'new-1'; - $pane->panel = 'left'; - $pane->type = 'views'; - $pane->subtype = 'actualites'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'override_pager_settings' => 0, - 'use_pager' => 0, - 'nodes_per_page' => '0', - 'pager_id' => '0', - 'offset' => '0', - 'more_link' => 0, - 'feed_icons' => 0, - 'panel_args' => 0, - 'link_to_view' => 0, - 'args' => '', - 'url' => '', - 'display' => 'block_3', - 'override_title' => 1, - 'override_title_text' => 'Actualites a venir', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => '', - 'css_class' => 'listing-actu listing-actu-avenir', - ); - $pane->extras = array(); - $pane->position = 0; - $pane->locks = array(); - $display->content['new-1'] = $pane; - $display->panels['left'][0] = 'new-1'; - $pane = new stdClass(); - $pane->pid = 'new-2'; - $pane->panel = 'left'; - $pane->type = 'views'; - $pane->subtype = 'actualites'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'override_pager_settings' => 0, - 'use_pager' => 0, - 'nodes_per_page' => '0', - 'pager_id' => '0', - 'offset' => '0', - 'more_link' => 0, - 'feed_icons' => 0, - 'panel_args' => 0, - 'link_to_view' => 0, - 'args' => '', - 'url' => '', - 'display' => 'block_4', - 'override_title' => 1, - 'override_title_text' => 'Actualites archivees', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => 'pane-actu-passees', - 'css_class' => 'layout-88p listing-actu listing-actu-passe', - ); - $pane->extras = array(); - $pane->position = 1; - $pane->locks = array(); - $display->content['new-2'] = $pane; - $display->panels['left'][1] = 'new-2'; + $pane = new stdClass(); + $pane->pid = 'new-9871e640-6e35-4ffc-98ee-5ef37753686c'; + $pane->panel = 'left'; + $pane->type = 'views'; + $pane->subtype = 'actualites'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'override_pager_settings' => 0, + 'use_pager' => 0, + 'nodes_per_page' => '0', + 'pager_id' => '0', + 'offset' => '0', + 'more_link' => 0, + 'feed_icons' => 0, + 'panel_args' => 0, + 'link_to_view' => 0, + 'args' => '', + 'url' => '', + 'display' => 'block_3', + 'override_title' => 1, + 'override_title_text' => 'Actualités', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => '', + 'css_class' => 'listing-actu listing-actu-avenir', + ); + $pane->extras = array(); + $pane->position = 0; + $pane->locks = array(); + $pane->uuid = '9871e640-6e35-4ffc-98ee-5ef37753686c'; + $display->content['new-9871e640-6e35-4ffc-98ee-5ef37753686c'] = $pane; + $display->panels['left'][0] = 'new-9871e640-6e35-4ffc-98ee-5ef37753686c'; + $pane = new stdClass(); + $pane->pid = 'new-43500ad1-83c5-4fe7-9c81-782c0ca4d697'; + $pane->panel = 'left'; + $pane->type = 'views'; + $pane->subtype = 'actualites'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'override_pager_settings' => 0, + 'use_pager' => 0, + 'nodes_per_page' => '0', + 'pager_id' => '0', + 'offset' => '0', + 'more_link' => 0, + 'feed_icons' => 0, + 'panel_args' => 0, + 'link_to_view' => 0, + 'args' => '', + 'url' => '', + 'display' => 'block_4', + 'override_title' => 1, + 'override_title_text' => 'Actualites archivees', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => 'pane-actu-passees', + 'css_class' => 'layout-88p listing-actu listing-actu-passe', + ); + $pane->extras = array(); + $pane->position = 1; + $pane->locks = array(); + $pane->uuid = '43500ad1-83c5-4fe7-9c81-782c0ca4d697'; + $display->content['new-43500ad1-83c5-4fe7-9c81-782c0ca4d697'] = $pane; + $display->panels['left'][1] = 'new-43500ad1-83c5-4fe7-9c81-782c0ca4d697'; $display->hide_title = PANELS_TITLE_FIXED; $display->title_pane = '0'; $handler->conf['display'] = $display; diff --git a/sites/default/modules/features/popsu_actualites/popsu_actualites.strongarm.inc b/sites/default/modules/features/popsu_actualites/popsu_actualites.strongarm.inc index 0aaa34f..1a351ce 100644 --- a/sites/default/modules/features/popsu_actualites/popsu_actualites.strongarm.inc +++ b/sites/default/modules/features/popsu_actualites/popsu_actualites.strongarm.inc @@ -14,7 +14,7 @@ function popsu_actualites_strongarm() { $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ $strongarm->api_version = 1; $strongarm->name = 'additional_settings__active_tab_popsu_actu'; - $strongarm->value = 'edit-page-title'; + $strongarm->value = 'edit-xmlsitemap'; $export['additional_settings__active_tab_popsu_actu'] = $strongarm; $strongarm = new stdClass(); @@ -43,14 +43,39 @@ function popsu_actualites_strongarm() { $strongarm->api_version = 1; $strongarm->name = 'field_bundle_settings_node__popsu_actu'; $strongarm->value = array( - 'view_modes' => array(), + 'view_modes' => array( + 'teaser' => array( + 'custom_settings' => TRUE, + ), + 'full' => array( + 'custom_settings' => FALSE, + ), + 'rss' => array( + 'custom_settings' => FALSE, + ), + 'search_index' => array( + 'custom_settings' => FALSE, + ), + 'search_result' => array( + 'custom_settings' => FALSE, + ), + 'diff_standard' => array( + 'custom_settings' => FALSE, + ), + 'token' => array( + 'custom_settings' => FALSE, + ), + ), 'extra_fields' => array( 'form' => array( 'title' => array( 'weight' => '6', ), 'path' => array( - 'weight' => '3', + 'weight' => '5', + ), + 'xmlsitemap' => array( + 'weight' => '30', ), ), 'display' => array(), @@ -134,5 +159,15 @@ function popsu_actualites_strongarm() { $strongarm->value = 1; $export['publishcontent_popsu_actu'] = $strongarm; + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'xmlsitemap_settings_node_popsu_actu'; + $strongarm->value = array( + 'status' => '1', + 'priority' => '0.5', + ); + $export['xmlsitemap_settings_node_popsu_actu'] = $strongarm; + return $export; } diff --git a/sites/default/modules/features/popsu_actualites/popsu_actualites.views_default.inc b/sites/default/modules/features/popsu_actualites/popsu_actualites.views_default.inc index 63f00a3..3c53864 100644 --- a/sites/default/modules/features/popsu_actualites/popsu_actualites.views_default.inc +++ b/sites/default/modules/features/popsu_actualites/popsu_actualites.views_default.inc @@ -85,16 +85,16 @@ function popsu_actualites_views_default_views() { $handler->display->display_options['fields']['field_popsu_actu_soustitre']['label'] = ''; $handler->display->display_options['fields']['field_popsu_actu_soustitre']['exclude'] = TRUE; $handler->display->display_options['fields']['field_popsu_actu_soustitre']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['field_popsu_actu_soustitre']['alter']['text'] = '[field_popsu_actu_soustitre] - '; + $handler->display->display_options['fields']['field_popsu_actu_soustitre']['alter']['text'] = '[field_popsu_actu_soustitre]'; $handler->display->display_options['fields']['field_popsu_actu_soustitre']['element_label_colon'] = FALSE; $handler->display->display_options['fields']['field_popsu_actu_soustitre']['hide_empty'] = TRUE; - /* Champ: Contenu : Date de début de publication de l'actualité sur la page d'accueil */ + /* Champ: Contenu : Date de début de validité de l'actualité */ $handler->display->display_options['fields']['field_popsu_actu_date']['id'] = 'field_popsu_actu_date'; $handler->display->display_options['fields']['field_popsu_actu_date']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['fields']['field_popsu_actu_date']['field'] = 'field_popsu_actu_date'; $handler->display->display_options['fields']['field_popsu_actu_date']['label'] = ''; $handler->display->display_options['fields']['field_popsu_actu_date']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['field_popsu_actu_date']['alter']['text'] = '[field_popsu_actu_soustitre][field_popsu_actu_date]'; + $handler->display->display_options['fields']['field_popsu_actu_date']['alter']['text'] = '[field_popsu_actu_soustitre]'; $handler->display->display_options['fields']['field_popsu_actu_date']['element_label_colon'] = FALSE; $handler->display->display_options['fields']['field_popsu_actu_date']['settings'] = array( 'format_type' => 'short', @@ -133,7 +133,7 @@ function popsu_actualites_views_default_views() { $handler->display->display_options['fields']['view_node']['alter']['text'] = 'voir toutes les actualités'; $handler->display->display_options['fields']['view_node']['element_label_colon'] = FALSE; $handler->display->display_options['fields']['view_node']['text'] = 'voir toutes les actualités'; - /* Critère de tri: Contenu : Date de début de publication de l'actualité sur la page d'accueil (field_popsu_actu_date) */ + /* Critère de tri: Contenu : Date de début de validité de l'actualité (field_popsu_actu_date) */ $handler->display->display_options['sorts']['field_popsu_actu_date_value']['id'] = 'field_popsu_actu_date_value'; $handler->display->display_options['sorts']['field_popsu_actu_date_value']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['sorts']['field_popsu_actu_date_value']['field'] = 'field_popsu_actu_date_value'; @@ -169,7 +169,7 @@ function popsu_actualites_views_default_views() { $handler->display->display_options['pager']['options']['items_per_page'] = '1'; $handler->display->display_options['pager']['options']['offset'] = '0'; $handler->display->display_options['defaults']['sorts'] = FALSE; - /* Critère de tri: Contenu : Date de début de publication de l'actualité sur la page d'accueil (field_popsu_actu_date) */ + /* Critère de tri: Contenu : Date de début de validité de l'actualité (field_popsu_actu_date) */ $handler->display->display_options['sorts']['field_popsu_actu_date_value']['id'] = 'field_popsu_actu_date_value'; $handler->display->display_options['sorts']['field_popsu_actu_date_value']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['sorts']['field_popsu_actu_date_value']['field'] = 'field_popsu_actu_date_value'; @@ -189,18 +189,25 @@ function popsu_actualites_views_default_views() { $handler->display->display_options['filters']['type']['value'] = array( 'popsu_actu' => 'popsu_actu', ); - /* Critère de filtrage: Contenu : Date de début de publication de l'actualité sur la page d'accueil (field_popsu_actu_date) */ + /* Critère de filtrage: Contenu : Date de début de validité de l'actualité (field_popsu_actu_date) */ $handler->display->display_options['filters']['field_popsu_actu_date_value']['id'] = 'field_popsu_actu_date_value'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['field'] = 'field_popsu_actu_date_value'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['operator'] = '<='; $handler->display->display_options['filters']['field_popsu_actu_date_value']['default_date'] = 'now'; - /* Critère de filtrage: Contenu : Date de fin de publication de l'actualité sur la page d'accueil (field_popsu_actu_date_fin) */ + /* Critère de filtrage: Contenu : Date de fin de validité de l'actualité (field_popsu_actu_date_fin) */ $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['id'] = 'field_popsu_actu_date_fin_value'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['table'] = 'field_data_field_popsu_actu_date_fin'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['field'] = 'field_popsu_actu_date_fin_value'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['operator'] = '>='; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['default_date'] = 'now'; + /* Critère de filtrage: Contenu : Publier sur la page d'accueil (field_popsu_actu_enhome) */ + $handler->display->display_options['filters']['field_popsu_actu_enhome_value']['id'] = 'field_popsu_actu_enhome_value'; + $handler->display->display_options['filters']['field_popsu_actu_enhome_value']['table'] = 'field_data_field_popsu_actu_enhome'; + $handler->display->display_options['filters']['field_popsu_actu_enhome_value']['field'] = 'field_popsu_actu_enhome_value'; + $handler->display->display_options['filters']['field_popsu_actu_enhome_value']['value'] = array( + 1 => '1', + ); $handler->display->display_options['pane_category']['name'] = 'Volets de vue'; $handler->display->display_options['link_to_view'] = '0'; @@ -238,7 +245,7 @@ function popsu_actualites_views_default_views() { $handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE; $handler->display->display_options['fields']['title']['element_label_colon'] = FALSE; $handler->display->display_options['defaults']['sorts'] = FALSE; - /* Critère de tri: Contenu : Date de début de publication de l'actualité sur la page d'accueil (field_popsu_actu_date) */ + /* Critère de tri: Contenu : Date de début de validité de l'actualité (field_popsu_actu_date) */ $handler->display->display_options['sorts']['field_popsu_actu_date_value']['id'] = 'field_popsu_actu_date_value'; $handler->display->display_options['sorts']['field_popsu_actu_date_value']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['sorts']['field_popsu_actu_date_value']['field'] = 'field_popsu_actu_date_value'; @@ -258,13 +265,13 @@ function popsu_actualites_views_default_views() { $handler->display->display_options['filters']['type']['value'] = array( 'popsu_actu' => 'popsu_actu', ); - /* Critère de filtrage: Contenu : Date de fin de publication de l'actualité sur la page d'accueil (field_popsu_actu_date_fin) */ + /* Critère de filtrage: Contenu : Date de fin de validité de l'actualité (field_popsu_actu_date_fin) */ $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['id'] = 'field_popsu_actu_date_fin_value'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['table'] = 'field_data_field_popsu_actu_date_fin'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['field'] = 'field_popsu_actu_date_fin_value'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['operator'] = '>'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['default_date'] = 'now'; - /* Critère de filtrage: Contenu : Date de début de publication de l'actualité sur la page d'accueil (field_popsu_actu_date) */ + /* Critère de filtrage: Contenu : Date de début de validité de l'actualité (field_popsu_actu_date) */ $handler->display->display_options['filters']['field_popsu_actu_date_value']['id'] = 'field_popsu_actu_date_value'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['field'] = 'field_popsu_actu_date_value'; @@ -321,13 +328,13 @@ function popsu_actualites_views_default_views() { $handler->display->display_options['filters']['type']['value'] = array( 'popsu_actu' => 'popsu_actu', ); - /* Critère de filtrage: Contenu : Date de fin de publication de l'actualité sur la page d'accueil (field_popsu_actu_date_fin) */ + /* Critère de filtrage: Contenu : Date de fin de validité de l'actualité (field_popsu_actu_date_fin) */ $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['id'] = 'field_popsu_actu_date_fin_value'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['table'] = 'field_data_field_popsu_actu_date_fin'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['field'] = 'field_popsu_actu_date_fin_value'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['operator'] = '<='; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['default_date'] = 'now'; - /* Critère de filtrage: Contenu : Date de début de publication de l'actualité sur la page d'accueil (field_popsu_actu_date) */ + /* Critère de filtrage: Contenu : Date de début de validité de l'actualité (field_popsu_actu_date) */ $handler->display->display_options['filters']['field_popsu_actu_date_value']['id'] = 'field_popsu_actu_date_value'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['field'] = 'field_popsu_actu_date_value'; @@ -458,7 +465,7 @@ display: none; $handler->display->display_options['filters']['type']['value'] = array( 'popsu_actu' => 'popsu_actu', ); - /* Critère de filtrage: Contenu : Date de début de publication de l'actualité sur la page d'accueil (field_popsu_actu_date) */ + /* Critère de filtrage: Contenu : Date de début de validité de l'actualité (field_popsu_actu_date) */ $handler->display->display_options['filters']['field_popsu_actu_date_value']['id'] = 'field_popsu_actu_date_value'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['field'] = 'field_popsu_actu_date_value'; @@ -479,7 +486,7 @@ display: none; /* Display: Actualites A venir Block */ $handler = $view->new_display('block', 'Actualites A venir Block', 'block_3'); $handler->display->display_options['defaults']['title'] = FALSE; - $handler->display->display_options['title'] = 'Actualites a venir'; + $handler->display->display_options['title'] = 'Actualités, appels d\'offre et consultations'; $handler->display->display_options['defaults']['css_class'] = FALSE; $handler->display->display_options['defaults']['hide_admin_links'] = FALSE; $handler->display->display_options['defaults']['pager'] = FALSE; @@ -510,7 +517,7 @@ display: none; $handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE; $handler->display->display_options['fields']['title']['element_label_colon'] = FALSE; $handler->display->display_options['fields']['title']['link_to_node'] = FALSE; - /* Champ: Contenu : Date de début de publication de l'actualité sur la page d'accueil */ + /* Champ: Contenu : Date de début de validité de l'actualité */ $handler->display->display_options['fields']['field_popsu_actu_date']['id'] = 'field_popsu_actu_date'; $handler->display->display_options['fields']['field_popsu_actu_date']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['fields']['field_popsu_actu_date']['field'] = 'field_popsu_actu_date'; @@ -524,7 +531,7 @@ display: none; 'multiple_from' => '', 'multiple_to' => '', ); - /* Champ: Contenu : Date de fin de publication de l'actualité sur la page d'accueil */ + /* Champ: Contenu : Date de fin de validité de l'actualité */ $handler->display->display_options['fields']['field_popsu_actu_date_fin']['id'] = 'field_popsu_actu_date_fin'; $handler->display->display_options['fields']['field_popsu_actu_date_fin']['table'] = 'field_data_field_popsu_actu_date_fin'; $handler->display->display_options['fields']['field_popsu_actu_date_fin']['field'] = 'field_popsu_actu_date_fin'; @@ -549,7 +556,7 @@ display: none; $handler->display->display_options['fields']['field_popsu_actu_soustitre']['field'] = 'field_popsu_actu_soustitre'; $handler->display->display_options['fields']['field_popsu_actu_soustitre']['label'] = ''; $handler->display->display_options['fields']['field_popsu_actu_soustitre']['alter']['alter_text'] = TRUE; - $handler->display->display_options['fields']['field_popsu_actu_soustitre']['alter']['text'] = '[field_popsu_actu_soustitre] - [field_popsu_actu_date_fin]'; + $handler->display->display_options['fields']['field_popsu_actu_soustitre']['alter']['text'] = '[field_popsu_actu_soustitre]'; $handler->display->display_options['fields']['field_popsu_actu_soustitre']['element_label_colon'] = FALSE; $handler->display->display_options['fields']['field_popsu_actu_soustitre']['empty'] = '[field_popsu_actu_date_fin]'; $handler->display->display_options['fields']['field_popsu_actu_soustitre']['hide_empty'] = TRUE; @@ -578,8 +585,33 @@ display: none; 'image_style' => 'popsu-actu-listing', 'image_link' => '', ); + /* Champ: Contenu : Pièces jointes à cette actualité */ + $handler->display->display_options['fields']['field_popsu_actu_attachment']['id'] = 'field_popsu_actu_attachment'; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['table'] = 'field_data_field_popsu_actu_attachment'; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['field'] = 'field_popsu_actu_attachment'; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['label'] = ''; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['click_sort_column'] = 'fid'; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['delta_offset'] = '0'; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['separator'] = ' '; + /* Champ: Contenu : Lien de modification */ + $handler->display->display_options['fields']['edit_node']['id'] = 'edit_node'; + $handler->display->display_options['fields']['edit_node']['table'] = 'views_entity_node'; + $handler->display->display_options['fields']['edit_node']['field'] = 'edit_node'; + $handler->display->display_options['fields']['edit_node']['label'] = ''; + $handler->display->display_options['fields']['edit_node']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['edit_node']['hide_empty'] = TRUE; + /* Champ: Contenu : Lien de publication */ + $handler->display->display_options['fields']['publishcontent']['id'] = 'publishcontent'; + $handler->display->display_options['fields']['publishcontent']['table'] = 'node'; + $handler->display->display_options['fields']['publishcontent']['field'] = 'publishcontent'; + $handler->display->display_options['fields']['publishcontent']['label'] = ''; + $handler->display->display_options['fields']['publishcontent']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['publishcontent']['hide_empty'] = TRUE; + $handler->display->display_options['fields']['publishcontent']['unpublish'] = 'Supprimer'; + $handler->display->display_options['fields']['publishcontent']['publish'] = 'Récupérer dans la corbeille'; $handler->display->display_options['defaults']['sorts'] = FALSE; - /* Critère de tri: Contenu : Date de début de publication de l'actualité sur la page d'accueil (field_popsu_actu_date) */ + /* Critère de tri: Contenu : Date de début de validité de l'actualité (field_popsu_actu_date) */ $handler->display->display_options['sorts']['field_popsu_actu_date_value']['id'] = 'field_popsu_actu_date_value'; $handler->display->display_options['sorts']['field_popsu_actu_date_value']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['sorts']['field_popsu_actu_date_value']['field'] = 'field_popsu_actu_date_value'; @@ -599,13 +631,13 @@ display: none; $handler->display->display_options['filters']['type']['value'] = array( 'popsu_actu' => 'popsu_actu', ); - /* Critère de filtrage: Contenu : Date de fin de publication de l'actualité sur la page d'accueil (field_popsu_actu_date_fin) */ + /* Critère de filtrage: Contenu : Date de fin de validité de l'actualité (field_popsu_actu_date_fin) */ $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['id'] = 'field_popsu_actu_date_fin_value'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['table'] = 'field_data_field_popsu_actu_date_fin'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['field'] = 'field_popsu_actu_date_fin_value'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['operator'] = '>'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['default_date'] = 'now'; - /* Critère de filtrage: Contenu : Date de début de publication de l'actualité sur la page d'accueil (field_popsu_actu_date) */ + /* Critère de filtrage: Contenu : Date de début de validité de l'actualité (field_popsu_actu_date) */ $handler->display->display_options['filters']['field_popsu_actu_date_value']['id'] = 'field_popsu_actu_date_value'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['field'] = 'field_popsu_actu_date_value'; @@ -658,7 +690,7 @@ display: none; $handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE; $handler->display->display_options['fields']['title']['element_label_colon'] = FALSE; $handler->display->display_options['fields']['title']['link_to_node'] = FALSE; - /* Champ: Contenu : Date de début de publication de l'actualité sur la page d'accueil */ + /* Champ: Contenu : Date de début de validité de l'actualité */ $handler->display->display_options['fields']['field_popsu_actu_date']['id'] = 'field_popsu_actu_date'; $handler->display->display_options['fields']['field_popsu_actu_date']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['fields']['field_popsu_actu_date']['field'] = 'field_popsu_actu_date'; @@ -672,7 +704,7 @@ display: none; 'multiple_from' => '', 'multiple_to' => '', ); - /* Champ: Contenu : Date de fin de publication de l'actualité sur la page d'accueil */ + /* Champ: Contenu : Date de fin de validité de l'actualité */ $handler->display->display_options['fields']['field_popsu_actu_date_fin']['id'] = 'field_popsu_actu_date_fin'; $handler->display->display_options['fields']['field_popsu_actu_date_fin']['table'] = 'field_data_field_popsu_actu_date_fin'; $handler->display->display_options['fields']['field_popsu_actu_date_fin']['field'] = 'field_popsu_actu_date_fin'; @@ -728,8 +760,33 @@ display: none; 'image_style' => 'popsu-actu-listing', 'image_link' => '', ); + /* Champ: Contenu : Pièces jointes à cette actualité */ + $handler->display->display_options['fields']['field_popsu_actu_attachment']['id'] = 'field_popsu_actu_attachment'; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['table'] = 'field_data_field_popsu_actu_attachment'; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['field'] = 'field_popsu_actu_attachment'; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['label'] = ''; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['click_sort_column'] = 'fid'; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['delta_offset'] = '0'; + $handler->display->display_options['fields']['field_popsu_actu_attachment']['separator'] = ' '; + /* Champ: Contenu : Lien de modification */ + $handler->display->display_options['fields']['edit_node']['id'] = 'edit_node'; + $handler->display->display_options['fields']['edit_node']['table'] = 'views_entity_node'; + $handler->display->display_options['fields']['edit_node']['field'] = 'edit_node'; + $handler->display->display_options['fields']['edit_node']['label'] = ''; + $handler->display->display_options['fields']['edit_node']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['edit_node']['hide_empty'] = TRUE; + /* Champ: Contenu : Lien de publication */ + $handler->display->display_options['fields']['publishcontent']['id'] = 'publishcontent'; + $handler->display->display_options['fields']['publishcontent']['table'] = 'node'; + $handler->display->display_options['fields']['publishcontent']['field'] = 'publishcontent'; + $handler->display->display_options['fields']['publishcontent']['label'] = ''; + $handler->display->display_options['fields']['publishcontent']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['publishcontent']['hide_empty'] = TRUE; + $handler->display->display_options['fields']['publishcontent']['unpublish'] = 'Supprimer'; + $handler->display->display_options['fields']['publishcontent']['publish'] = 'Récupérer dans la corbeille'; $handler->display->display_options['defaults']['sorts'] = FALSE; - /* Critère de tri: Contenu : Date de début de publication de l'actualité sur la page d'accueil (field_popsu_actu_date) */ + /* Critère de tri: Contenu : Date de début de validité de l'actualité (field_popsu_actu_date) */ $handler->display->display_options['sorts']['field_popsu_actu_date_value']['id'] = 'field_popsu_actu_date_value'; $handler->display->display_options['sorts']['field_popsu_actu_date_value']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['sorts']['field_popsu_actu_date_value']['field'] = 'field_popsu_actu_date_value'; @@ -749,13 +806,13 @@ display: none; $handler->display->display_options['filters']['type']['value'] = array( 'popsu_actu' => 'popsu_actu', ); - /* Critère de filtrage: Contenu : Date de fin de publication de l'actualité sur la page d'accueil (field_popsu_actu_date_fin) */ + /* Critère de filtrage: Contenu : Date de fin de validité de l'actualité (field_popsu_actu_date_fin) */ $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['id'] = 'field_popsu_actu_date_fin_value'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['table'] = 'field_data_field_popsu_actu_date_fin'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['field'] = 'field_popsu_actu_date_fin_value'; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['operator'] = '<='; $handler->display->display_options['filters']['field_popsu_actu_date_fin_value']['default_date'] = 'now'; - /* Critère de filtrage: Contenu : Date de début de publication de l'actualité sur la page d'accueil (field_popsu_actu_date) */ + /* Critère de filtrage: Contenu : Date de début de validité de l'actualité (field_popsu_actu_date) */ $handler->display->display_options['filters']['field_popsu_actu_date_value']['id'] = 'field_popsu_actu_date_value'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['table'] = 'field_data_field_popsu_actu_date'; $handler->display->display_options['filters']['field_popsu_actu_date_value']['field'] = 'field_popsu_actu_date_value'; @@ -780,8 +837,7 @@ display: none; t('dernier »'), t('/actualites'), t('[title]'), - t('[field_popsu_actu_soustitre] - '), - t('[field_popsu_actu_soustitre][field_popsu_actu_date]'), + t('[field_popsu_actu_soustitre]'), t('[field_popsu_actu_body]'), t('Modifier cette actu'), t('voir toutes les actualités'), @@ -801,13 +857,15 @@ display: none; t('Tout'), t('Actualites CSS titre switcher'), t('Actualites A venir Block'), + t('Actualités, appels d\'offre et consultations'), t('du [field_popsu_actu_date] au [field_popsu_actu_date_fin]'), t('[field_popsu_actu_date]'), - t('[field_popsu_actu_soustitre] - [field_popsu_actu_date_fin]'), t('[field_popsu_actu_date_fin]'), t('
[field_popsu_actu_image]
[field_popsu_actu_body]
'), t('[field_popsu_actu_body]'), + t('Supprimer'), + t('Récupérer dans la corbeille'), t('POPSU - Actualites - Block A venir'), t('Actualites Passees Block'), t('
[title]
diff --git a/sites/default/modules/features/popsu_structure/popsu_structure.box.inc b/sites/default/modules/features/popsu_structure/popsu_structure.box.inc index 0b691cb..5eca706 100644 --- a/sites/default/modules/features/popsu_structure/popsu_structure.box.inc +++ b/sites/default/modules/features/popsu_structure/popsu_structure.box.inc @@ -19,21 +19,19 @@ function popsu_structure_default_box() { $box->description = 'Google Analytics tracking code'; $box->options = array( 'body' => array( - 'value' => '', 'format' => 'php_code', ), + 'additional_classes' => '', ); $export['popsu_google_analytics'] = $box; @@ -46,9 +44,9 @@ function popsu_structure_default_box() { $box->description = 'POPSU Logo Baseline (box)'; $box->options = array( 'body' => array( - 'value' => 'PLATE-FORME
-D’OBSERVATION
-DES PROJETS
+ 'value' => 'PLATE-FORME
+D’OBSERVATION
+DES PROJETS
DE STRATÉGIES URBAINES', 'format' => 'php_code', ), @@ -103,6 +101,55 @@ DE STRATÉGIES URBAINES', ); $export['popsu_logo_popsueurope'] = $box; + $box = new stdClass(); + $box->disabled = FALSE; /* Edit this to true to make a default box disabled initially */ + $box->api_version = 1; + $box->delta = 'popsu_logo_popsumetropoles'; + $box->plugin_key = 'simple'; + $box->title = ''; + $box->description = 'POPSU Logo POPSU Metropoles (box)'; + $box->options = array( + 'body' => array( + 'value' => '', + 'format' => 'php_code', + ), + 'additional_classes' => '', + ); + $export['popsu_logo_popsumetropoles'] = $box; + + $box = new stdClass(); + $box->disabled = FALSE; /* Edit this to true to make a default box disabled initially */ + $box->api_version = 1; + $box->delta = 'popsu_logo_popsumonde'; + $box->plugin_key = 'simple'; + $box->title = ''; + $box->description = 'POPSU Logo POPSU Monde (box)'; + $box->options = array( + 'body' => array( + 'value' => ' +', + 'format' => 'php_code', + ), + 'additional_classes' => '', + ); + $export['popsu_logo_popsumonde'] = $box; + + $box = new stdClass(); + $box->disabled = FALSE; /* Edit this to true to make a default box disabled initially */ + $box->api_version = 1; + $box->delta = 'popsu_logo_popsuterrritoires'; + $box->plugin_key = 'simple'; + $box->title = ''; + $box->description = 'POPSU Logo POPSU Territoires (box)'; + $box->options = array( + 'body' => array( + 'value' => '', + 'format' => 'php_code', + ), + 'additional_classes' => '', + ); + $export['popsu_logo_popsuterrritoires'] = $box; + $box = new stdClass(); $box->disabled = FALSE; /* Edit this to true to make a default box disabled initially */ $box->api_version = 1; @@ -112,8 +159,8 @@ DE STRATÉGIES URBAINES', $box->description = 'POPSU Trigger de menu niveau 1 (box)'; $box->options = array( 'body' => array( - 'value' => ' - + 'value' => ' + ', 'format' => 'php_code', ), diff --git a/sites/default/modules/features/popsu_structure/popsu_structure.context.inc b/sites/default/modules/features/popsu_structure/popsu_structure.context.inc index 8076b98..8630417 100644 --- a/sites/default/modules/features/popsu_structure/popsu_structure.context.inc +++ b/sites/default/modules/features/popsu_structure/popsu_structure.context.inc @@ -32,18 +32,18 @@ function popsu_structure_context_default_contexts() { 'region' => 'content', 'weight' => '-10', ), - 'menu-menu-popsu-menu-footer' => array( - 'module' => 'menu', - 'delta' => 'menu-popsu-menu-footer', - 'region' => 'footer', - 'weight' => '-10', - ), 'menu-menu-popsu-footer-droite' => array( 'module' => 'menu', 'delta' => 'menu-popsu-footer-droite', 'region' => 'footer', 'weight' => '-10', ), + 'menu-menu-popsu-menu-footer' => array( + 'module' => 'menu', + 'delta' => 'menu-popsu-menu-footer', + 'region' => 'footer', + 'weight' => '-10', + ), ), ), ); diff --git a/sites/default/modules/features/popsu_structure/popsu_structure.features.inc b/sites/default/modules/features/popsu_structure/popsu_structure.features.inc index 1e2a0d7..90fae00 100644 --- a/sites/default/modules/features/popsu_structure/popsu_structure.features.inc +++ b/sites/default/modules/features/popsu_structure/popsu_structure.features.inc @@ -4,71 +4,19 @@ * popsu_structure.features.inc */ -/** - * Implements hook_block_class_features_default_class(). - */ -function popsu_structure_block_class_features_default_class() { - return array( - 'menu:menu-popsu-menu-footer' => array( - 'module' => 'menu', - 'delta' => 'menu-popsu-menu-footer', - 'css_classes' => 'menu-footer menu-inline', - ), - 'menu:menu-popus-menu-header' => array( - 'module' => 'menu', - 'delta' => 'menu-popus-menu-header', - 'css_classes' => 'span1 menu-header', - ), - 'menu_block:1' => array( - 'module' => 'menu_block', - 'delta' => '1', - 'css_classes' => 'left-nav left-nav-level-2', - ), - 'menu_block:2' => array( - 'module' => 'menu_block', - 'delta' => '2', - 'css_classes' => 'left-nav left-nav-level-0', - ), - 'menu_block:3' => array( - 'module' => 'menu_block', - 'delta' => '3', - 'css_classes' => 'left-nav left-nav-level-1', - ), - 'menu_block:4' => array( - 'module' => 'menu_block', - 'delta' => '4', - 'css_classes' => 'left-nav left-nav-level-1', - ), - 'menu_block:5' => array( - 'module' => 'menu_block', - 'delta' => '5', - 'css_classes' => 'left-nav left-nav-level-2', - ), - 'menu_block:6' => array( - 'module' => 'menu_block', - 'delta' => '6', - 'css_classes' => 'left-nav left-nav-level-1', - ), - ); -} - /** * Implements hook_ctools_plugin_api(). */ -function popsu_structure_ctools_plugin_api() { - list($module, $api) = func_get_args(); +function popsu_structure_ctools_plugin_api($module = NULL, $api = NULL) { if ($module == "boxes" && $api == "box") { return array("version" => "1"); } - list($module, $api) = func_get_args(); if ($module == "context" && $api == "context") { return array("version" => "3"); } - list($module, $api) = func_get_args(); if ($module == "panels" && $api == "layouts") { return array("version" => "1"); } - list($module, $api) = func_get_args(); if ($module == "strongarm" && $api == "strongarm") { return array("version" => "1"); } diff --git a/sites/default/modules/features/popsu_structure/popsu_structure.info b/sites/default/modules/features/popsu_structure/popsu_structure.info index 55a6158..2a47ada 100644 --- a/sites/default/modules/features/popsu_structure/popsu_structure.info +++ b/sites/default/modules/features/popsu_structure/popsu_structure.info @@ -2,7 +2,6 @@ name = POPSU Structure du site description = POPSU - Structure du site core = 7.x package = POPSU -php = 5.2.4 version = 7.x-1.0-beta9 project = popsu_structure dependencies[] = block @@ -22,19 +21,14 @@ dependencies[] = search dependencies[] = uuid dependencies[] = uuid_features dependencies[] = uuid_path -features[block_class][] = menu:menu-popsu-menu-footer -features[block_class][] = menu:menu-popus-menu-header -features[block_class][] = menu_block:1 -features[block_class][] = menu_block:2 -features[block_class][] = menu_block:3 -features[block_class][] = menu_block:4 -features[block_class][] = menu_block:5 -features[block_class][] = menu_block:6 features[box][] = popsu_google_analytics features[box][] = popsu_logo_baseline features[box][] = popsu_logo_popsu1 features[box][] = popsu_logo_popsu2 features[box][] = popsu_logo_popsueurope +features[box][] = popsu_logo_popsumetropoles +features[box][] = popsu_logo_popsumonde +features[box][] = popsu_logo_popsuterrritoires features[box][] = popsu_menu_trigger features[context][] = popsu-structure-global features[context][] = popsu-structure-homepage @@ -43,5 +37,5 @@ features[ctools][] = boxes:box:1 features[ctools][] = context:context:3 features[ctools][] = panels:layouts:1 features[ctools][] = strongarm:strongarm:1 -features[features_api][] = api:1 +features[features_api][] = api:2 features[panels_layout][] = popsu_70_30_accordion diff --git a/sites/default/modules/features/popsu_villes/popsu_villes.features.field_base.inc b/sites/default/modules/features/popsu_villes/popsu_villes.features.field_base.inc new file mode 100644 index 0000000..14ebb33 --- /dev/null +++ b/sites/default/modules/features/popsu_villes/popsu_villes.features.field_base.inc @@ -0,0 +1,210 @@ + 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_ville_body', + 'indexes' => array( + 'format' => array( + 0 => 'format', + ), + ), + 'locked' => 0, + 'module' => 'text', + 'settings' => array(), + 'translatable' => 0, + 'type' => 'text_with_summary', + ); + + // Exported field_base: 'field_popsu_ville_coordinateur'. + $field_bases['field_popsu_ville_coordinateur'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_ville_coordinateur', + 'indexes' => array( + 'format' => array( + 0 => 'format', + ), + ), + 'locked' => 0, + 'module' => 'text', + 'settings' => array(), + 'translatable' => 0, + 'type' => 'text_long', + ); + + // Exported field_base: 'field_popsu_ville_equipe'. + $field_bases['field_popsu_ville_equipe'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_ville_equipe', + 'indexes' => array( + 'format' => array( + 0 => 'format', + ), + ), + 'locked' => 0, + 'module' => 'text', + 'settings' => array(), + 'translatable' => 0, + 'type' => 'text_long', + ); + + // Exported field_base: 'field_popsu_ville_images_illustr'. + $field_bases['field_popsu_ville_images_illustr'] = array( + 'active' => 1, + 'cardinality' => -1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_ville_images_illustr', + 'indexes' => array( + 'fid' => array( + 0 => 'fid', + ), + ), + 'locked' => 0, + 'module' => 'image', + 'settings' => array( + 'default_image' => 0, + 'uri_scheme' => 'public', + ), + 'translatable' => 0, + 'type' => 'image', + ); + + // Exported field_base: 'field_popsu_ville_images_small'. + $field_bases['field_popsu_ville_images_small'] = array( + 'active' => 1, + 'cardinality' => -1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_ville_images_small', + 'indexes' => array( + 'fid' => array( + 0 => 'fid', + ), + ), + 'locked' => 0, + 'module' => 'image', + 'settings' => array( + 'default_image' => 0, + 'uri_scheme' => 'public', + ), + 'translatable' => 0, + 'type' => 'image', + ); + + // Exported field_base: 'field_popsu_ville_partenairesimg'. + $field_bases['field_popsu_ville_partenairesimg'] = array( + 'active' => 1, + 'cardinality' => -1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_ville_partenairesimg', + 'indexes' => array( + 'fid' => array( + 0 => 'fid', + ), + ), + 'locked' => 0, + 'module' => 'image', + 'settings' => array( + 'default_image' => 0, + 'uri_scheme' => 'public', + ), + 'translatable' => 0, + 'type' => 'image', + ); + + // Exported field_base: 'field_popsu_ville_partenairestxt'. + $field_bases['field_popsu_ville_partenairestxt'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_ville_partenairestxt', + 'indexes' => array( + 'format' => array( + 0 => 'format', + ), + ), + 'locked' => 0, + 'module' => 'text', + 'settings' => array(), + 'translatable' => 0, + 'type' => 'text_long', + ); + + // Exported field_base: 'field_popsu_ville_popsu'. + $field_bases['field_popsu_ville_popsu'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_ville_popsu', + 'indexes' => array( + 'tid' => array( + 0 => 'tid', + ), + ), + 'locked' => 0, + 'module' => 'taxonomy', + 'settings' => array( + 'allowed_values' => array( + 0 => array( + 'vocabulary' => 'popsu_popsu', + 'parent' => 0, + ), + ), + 'options_list_callback' => 'i18n_taxonomy_allowed_values', + ), + 'translatable' => 0, + 'type' => 'taxonomy_term_reference', + ); + + // Exported field_base: 'field_popsu_ville_ville'. + $field_bases['field_popsu_ville_ville'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_popsu_ville_ville', + 'indexes' => array( + 'tid' => array( + 0 => 'tid', + ), + ), + 'locked' => 0, + 'module' => 'taxonomy', + 'settings' => array( + 'allowed_values' => array( + 0 => array( + 'vocabulary' => 'popsu_villes', + 'parent' => 0, + ), + ), + 'options_list_callback' => 'i18n_taxonomy_allowed_values', + ), + 'translatable' => 0, + 'type' => 'taxonomy_term_reference', + ); + + return $field_bases; +} diff --git a/sites/default/modules/features/popsu_villes/popsu_villes.features.field_instance.inc b/sites/default/modules/features/popsu_villes/popsu_villes.features.field_instance.inc new file mode 100644 index 0000000..3109361 --- /dev/null +++ b/sites/default/modules/features/popsu_villes/popsu_villes.features.field_instance.inc @@ -0,0 +1,489 @@ + 'popsu_ville', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 0, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_ville_body', + 'label' => 'Texte d\'introduction', + 'required' => 0, + 'settings' => array( + 'display_summary' => 0, + 'text_processing' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'text', + 'settings' => array( + 'rows' => 20, + 'summary_rows' => 5, + ), + 'type' => 'text_textarea_with_summary', + 'weight' => 2, + ), + ); + + // Exported field_instance: 'node-popsu_ville-field_popsu_ville_coordinateur'. + $field_instances['node-popsu_ville-field_popsu_ville_coordinateur'] = array( + 'bundle' => 'popsu_ville', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 2, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_ville_coordinateur', + 'label' => 'Coordinateur des acteurs', + 'required' => 0, + 'settings' => array( + 'text_processing' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'text', + 'settings' => array( + 'rows' => 5, + ), + 'type' => 'text_textarea', + 'weight' => 4, + ), + ); + + // Exported field_instance: 'node-popsu_ville-field_popsu_ville_equipe'. + $field_instances['node-popsu_ville-field_popsu_ville_equipe'] = array( + 'bundle' => 'popsu_ville', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 1, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_ville_equipe', + 'label' => 'Equipe de recherche', + 'required' => 0, + 'settings' => array( + 'text_processing' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'text', + 'settings' => array( + 'rows' => 5, + ), + 'type' => 'text_textarea', + 'weight' => 3, + ), + ); + + // Exported field_instance: + // 'node-popsu_ville-field_popsu_ville_images_illustr'. + $field_instances['node-popsu_ville-field_popsu_ville_images_illustr'] = array( + 'bundle' => 'popsu_ville', + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 3, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_ville_images_illustr', + 'label' => 'Grandes images d\'illustration', + 'required' => 0, + 'settings' => array( + 'alt_field' => 0, + 'default_image' => 0, + 'file_directory' => '', + 'file_extensions' => 'png gif jpg jpeg', + 'filefield_paths' => array( + 'active_updating' => 0, + 'file_name' => array( + 'options' => array( + 'pathauto' => 1, + 'transliterate' => 1, + ), + 'value' => '[file:ffp-name-only-original].[file:ffp-extension-original]', + ), + 'file_path' => array( + 'options' => array( + 'pathauto' => 1, + 'transliterate' => 1, + ), + 'value' => 'nodes/[node:content-type]/[node:nid]/illustr', + ), + 'retroactive_update' => 0, + ), + 'max_filesize' => '', + 'max_resolution' => '', + 'min_resolution' => '', + 'title_field' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'image', + 'settings' => array( + 'insert' => 0, + 'insert_absolute' => FALSE, + 'insert_class' => '', + 'insert_default' => array( + 0 => 'auto', + ), + 'insert_styles' => array( + 0 => 'auto', + ), + 'insert_width' => '', + 'preview_image_style' => 'thumbnail', + 'progress_indicator' => 'throbber', + ), + 'type' => 'image_image', + 'weight' => 5, + ), + ); + + // Exported field_instance: 'node-popsu_ville-field_popsu_ville_images_small'. + $field_instances['node-popsu_ville-field_popsu_ville_images_small'] = array( + 'bundle' => 'popsu_ville', + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 4, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_ville_images_small', + 'label' => 'Petites images d\'illustration', + 'required' => 0, + 'settings' => array( + 'alt_field' => 0, + 'default_image' => 0, + 'file_directory' => '', + 'file_extensions' => 'png gif jpg jpeg', + 'filefield_paths' => array( + 'active_updating' => 0, + 'file_name' => array( + 'options' => array( + 'pathauto' => 1, + 'transliterate' => 1, + ), + 'value' => '[file:ffp-name-only-original].[file:ffp-extension-original]', + ), + 'file_path' => array( + 'options' => array( + 'pathauto' => 1, + 'transliterate' => 1, + ), + 'value' => 'nodes/[node:content-type]/[node:nid]/small', + ), + 'retroactive_update' => 0, + ), + 'max_filesize' => '', + 'max_resolution' => '', + 'min_resolution' => '', + 'title_field' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'image', + 'settings' => array( + 'insert' => 0, + 'insert_absolute' => FALSE, + 'insert_class' => '', + 'insert_default' => array( + 0 => 'auto', + ), + 'insert_styles' => array( + 0 => 'auto', + ), + 'insert_width' => '', + 'preview_image_style' => 'thumbnail', + 'progress_indicator' => 'throbber', + ), + 'type' => 'image_image', + 'weight' => 6, + ), + ); + + // Exported field_instance: + // 'node-popsu_ville-field_popsu_ville_partenairesimg'. + $field_instances['node-popsu_ville-field_popsu_ville_partenairesimg'] = array( + 'bundle' => 'popsu_ville', + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 8, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_ville_partenairesimg', + 'label' => 'Logos des partenaires', + 'required' => 0, + 'settings' => array( + 'alt_field' => 0, + 'default_image' => 0, + 'file_directory' => '', + 'file_extensions' => 'png gif jpg jpeg', + 'filefield_paths' => array( + 'active_updating' => 0, + 'file_name' => array( + 'options' => array( + 'pathauto' => 1, + 'transliterate' => 1, + ), + 'value' => '[file:ffp-name-only-original].[file:ffp-extension-original]', + ), + 'file_path' => array( + 'options' => array( + 'pathauto' => 1, + 'transliterate' => 1, + ), + 'value' => 'nodes/[node:content-type]/[node:nid]/partenaireslogo', + ), + 'retroactive_update' => 0, + ), + 'max_filesize' => '', + 'max_resolution' => '', + 'min_resolution' => '', + 'title_field' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'image', + 'settings' => array( + 'insert' => 0, + 'insert_absolute' => FALSE, + 'insert_class' => '', + 'insert_default' => array( + 0 => 'auto', + ), + 'insert_styles' => array( + 0 => 'auto', + ), + 'insert_width' => '', + 'preview_image_style' => 'thumbnail', + 'progress_indicator' => 'throbber', + ), + 'type' => 'image_image', + 'weight' => 7, + ), + ); + + // Exported field_instance: + // 'node-popsu_ville-field_popsu_ville_partenairestxt'. + $field_instances['node-popsu_ville-field_popsu_ville_partenairestxt'] = array( + 'bundle' => 'popsu_ville', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 7, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_ville_partenairestxt', + 'label' => 'Texte des partenaires', + 'required' => 0, + 'settings' => array( + 'text_processing' => 0, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'text', + 'settings' => array( + 'rows' => 5, + ), + 'type' => 'text_textarea', + 'weight' => 8, + ), + ); + + // Exported field_instance: 'node-popsu_ville-field_popsu_ville_popsu'. + $field_instances['node-popsu_ville-field_popsu_ville_popsu'] = array( + 'bundle' => 'popsu_ville', + 'default_value' => array( + 0 => array( + 'tid' => 1, + ), + ), + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 5, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_ville_popsu', + 'label' => 'POPSU', + 'required' => 1, + 'settings' => array( + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'options', + 'settings' => array(), + 'type' => 'options_select', + 'weight' => 1, + ), + ); + + // Exported field_instance: 'node-popsu_ville-field_popsu_ville_ville'. + $field_instances['node-popsu_ville-field_popsu_ville_ville'] = array( + 'bundle' => 'popsu_ville', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 6, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_popsu_ville_ville', + 'label' => 'Ville', + 'required' => 1, + 'settings' => array( + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'options', + 'settings' => array(), + 'type' => 'options_select', + 'weight' => 2, + ), + ); + + // Translatables + // Included for use with string extractors like potx. + t('Coordinateur des acteurs'); + t('Equipe de recherche'); + t('Grandes images d\'illustration'); + t('Logos des partenaires'); + t('POPSU'); + t('Petites images d\'illustration'); + t('Texte d\'introduction'); + t('Texte des partenaires'); + t('Ville'); + + return $field_instances; +} diff --git a/sites/default/modules/features/popsu_villes/popsu_villes.features.inc b/sites/default/modules/features/popsu_villes/popsu_villes.features.inc index 75571b9..813f4d9 100644 --- a/sites/default/modules/features/popsu_villes/popsu_villes.features.inc +++ b/sites/default/modules/features/popsu_villes/popsu_villes.features.inc @@ -7,24 +7,19 @@ /** * Implements hook_ctools_plugin_api(). */ -function popsu_villes_ctools_plugin_api() { - list($module, $api) = func_get_args(); +function popsu_villes_ctools_plugin_api($module = NULL, $api = NULL) { if ($module == "boxes" && $api == "box") { return array("version" => "1"); } - list($module, $api) = func_get_args(); if ($module == "context" && $api == "context") { return array("version" => "3"); } - list($module, $api) = func_get_args(); if ($module == "field_group" && $api == "field_group") { return array("version" => "1"); } - list($module, $api) = func_get_args(); if ($module == "page_manager" && $api == "pages_default") { return array("version" => "1"); } - list($module, $api) = func_get_args(); if ($module == "strongarm" && $api == "strongarm") { return array("version" => "1"); } @@ -33,8 +28,8 @@ function popsu_villes_ctools_plugin_api() { /** * Implements hook_views_api(). */ -function popsu_villes_views_api() { - return array("version" => "3.0"); +function popsu_villes_views_api($module = NULL, $api = NULL) { + return array("api" => "3.0"); } /** @@ -45,47 +40,30 @@ function popsu_villes_image_default_styles() { // Exported image style: popsu-villes-grande-image. $styles['popsu-villes-grande-image'] = array( - 'name' => 'popsu-villes-grande-image', + 'label' => 'popsu-villes-grande-image', 'effects' => array( - 2 => array( - 'label' => 'Adaptive', - 'help' => 'Adaptive image scale according to client resolution.', - 'effect callback' => 'image_scale_effect', - 'dimensions callback' => 'image_scale_dimensions', - 'form callback' => 'adaptive_image_scale_form', - 'summary theme' => 'adaptive_image_scale_summary', - 'module' => 'adaptive_image', - 'name' => 'adaptive_image', + 21 => array( + 'name' => 'image_scale_and_crop', 'data' => array( - 'resolutions' => '1382, 992, 768, 480', - 'mobile_first' => 1, - 'height' => '', - 'width' => '1382', - 'upscale' => '', + 'width' => 485, + 'height' => 324, ), - 'weight' => '2', + 'weight' => 1, ), ), ); // Exported image style: popsu-villes-listing-small. $styles['popsu-villes-listing-small'] = array( - 'name' => 'popsu-villes-listing-small', + 'label' => 'popsu-villes-listing-small', 'effects' => array( 5 => array( - 'label' => 'Mise à l’échelle et recadrage', - 'help' => 'La mise à l\'échelle et le recadrage maintiendront les proportions originales de l\'image puis recadreront la dimension la plus large. C\'est très utile pour créer des vignettes carrées sans étirer les images.', - 'effect callback' => 'image_scale_and_crop_effect', - 'dimensions callback' => 'image_resize_dimensions', - 'form callback' => 'image_resize_form', - 'summary theme' => 'image_resize_summary', - 'module' => 'image', 'name' => 'image_scale_and_crop', 'data' => array( - 'width' => '101', - 'height' => '87', + 'width' => 101, + 'height' => 87, ), - 'weight' => '1', + 'weight' => 1, ), ), ); @@ -107,5 +85,6 @@ function popsu_villes_node_info() { 'help' => '', ), ); + drupal_alter('node_info', $items); return $items; } diff --git a/sites/default/modules/features/popsu_villes/popsu_villes.info b/sites/default/modules/features/popsu_villes/popsu_villes.info index 4642a2e..5b5f268 100644 --- a/sites/default/modules/features/popsu_villes/popsu_villes.info +++ b/sites/default/modules/features/popsu_villes/popsu_villes.info @@ -2,7 +2,6 @@ name = POPSU Villes description = POPSU - Type de contenu Villes core = 7.x package = POPSU -php = 5.2.4 version = 7.x-1.0-beta9 project = popsu_villes dependencies[] = block @@ -13,6 +12,7 @@ dependencies[] = field_group dependencies[] = filefield_paths dependencies[] = image dependencies[] = menu_block +dependencies[] = node dependencies[] = page_manager dependencies[] = popsu_structure dependencies[] = popsu_taxonomies @@ -28,20 +28,31 @@ features[ctools][] = field_group:field_group:1 features[ctools][] = page_manager:pages_default:1 features[ctools][] = strongarm:strongarm:1 features[ctools][] = views:views_default:3.0 -features[features_api][] = api:1 -features[field][] = node-popsu_ville-field_popsu_ville_body -features[field][] = node-popsu_ville-field_popsu_ville_coordinateur -features[field][] = node-popsu_ville-field_popsu_ville_equipe -features[field][] = node-popsu_ville-field_popsu_ville_images_illustr -features[field][] = node-popsu_ville-field_popsu_ville_images_small -features[field][] = node-popsu_ville-field_popsu_ville_partenairesimg -features[field][] = node-popsu_ville-field_popsu_ville_partenairestxt +features[features_api][] = api:2 +features[field_base][] = field_popsu_ville_body +features[field_base][] = field_popsu_ville_coordinateur +features[field_base][] = field_popsu_ville_equipe +features[field_base][] = field_popsu_ville_images_illustr +features[field_base][] = field_popsu_ville_images_small +features[field_base][] = field_popsu_ville_partenairesimg +features[field_base][] = field_popsu_ville_partenairestxt +features[field_base][] = field_popsu_ville_popsu +features[field_base][] = field_popsu_ville_ville features[field_group][] = group_popsu_ville_basic|node|popsu_ville|form features[field_group][] = group_popsu_ville_coordo|node|popsu_ville|form features[field_group][] = group_popsu_ville_equipe|node|popsu_ville|form features[field_group][] = group_popsu_ville_images|node|popsu_ville|form features[field_group][] = group_popsu_ville_intro|node|popsu_ville|form features[field_group][] = group_popsu_ville_partenaires|node|popsu_ville|form +features[field_instance][] = node-popsu_ville-field_popsu_ville_body +features[field_instance][] = node-popsu_ville-field_popsu_ville_coordinateur +features[field_instance][] = node-popsu_ville-field_popsu_ville_equipe +features[field_instance][] = node-popsu_ville-field_popsu_ville_images_illustr +features[field_instance][] = node-popsu_ville-field_popsu_ville_images_small +features[field_instance][] = node-popsu_ville-field_popsu_ville_partenairesimg +features[field_instance][] = node-popsu_ville-field_popsu_ville_partenairestxt +features[field_instance][] = node-popsu_ville-field_popsu_ville_popsu +features[field_instance][] = node-popsu_ville-field_popsu_ville_ville features[image][] = popsu-villes-grande-image features[image][] = popsu-villes-listing-small features[node][] = popsu_ville @@ -53,4 +64,5 @@ features[variable][] = menu_parent_popsu_ville features[variable][] = node_options_popsu_ville features[variable][] = node_preview_popsu_ville features[variable][] = node_submitted_popsu_ville +features[variable][] = xmlsitemap_settings_node_popsu_ville features[views_view][] = villes diff --git a/sites/default/modules/features/popsu_villes/popsu_villes.pages_default.inc b/sites/default/modules/features/popsu_villes/popsu_villes.pages_default.inc index b7c5e13..15085fa 100644 --- a/sites/default/modules/features/popsu_villes/popsu_villes.pages_default.inc +++ b/sites/default/modules/features/popsu_villes/popsu_villes.pages_default.inc @@ -77,303 +77,343 @@ function popsu_villes_default_page_manager_handlers() { ); $display->cache = array(); $display->title = '%node:title'; + $display->uuid = '2a15c48c-e269-41d7-900d-2968a7252ef3'; + $display->storage_type = 'page_manager'; + $display->storage_id = 'node_view_panel_context_2'; $display->content = array(); $display->panels = array(); - $pane = new stdClass(); - $pane->pid = 'new-1'; - $pane->panel = 'footer'; - $pane->type = 'views_panes'; - $pane->subtype = 'colloques-panel_pane_1'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'arguments' => array( - 'field_popsu_colloque_ville_tid' => '%taxonomy_term:tid', - 'field_popsu_colloque_popsu_tid' => '%taxonomy_term_2:tid', - ), - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => 'pane-colloque', - 'css_class' => 'pane-74-26', - ); - $pane->extras = array(); - $pane->position = 0; - $pane->locks = array(); - $display->content['new-1'] = $pane; - $display->panels['footer'][0] = 'new-1'; - $pane = new stdClass(); - $pane->pid = 'new-2'; - $pane->panel = 'footer'; - $pane->type = 'views_panes'; - $pane->subtype = 'publications-panel_pane_1'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'arguments' => array( - 'field_popsu_publication_ville_tid' => '%taxonomy_term:tid', - 'field_popsu_publication_popsu_tid' => '%taxonomy_term_2:tid', - ), - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => 'pane-publication', - 'css_class' => 'layout-88p pane-74-26 clearfix', - ); - $pane->extras = array(); - $pane->position = 1; - $pane->locks = array(); - $display->content['new-2'] = $pane; - $display->panels['footer'][1] = 'new-2'; - $pane = new stdClass(); - $pane->pid = 'new-3'; - $pane->panel = 'footer'; - $pane->type = 'custom'; - $pane->subtype = 'custom'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'admin_title' => 'POPSU Fermeture de liste', - 'title' => '', - 'body' => '
', - 'format' => 'php_code', - 'substitute' => 0, - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => '', - 'css_class' => 'border-last layout-64-5p', - ); - $pane->extras = array(); - $pane->position = 2; - $pane->locks = array(); - $display->content['new-3'] = $pane; - $display->panels['footer'][2] = 'new-3'; - $pane = new stdClass(); - $pane->pid = 'new-4'; - $pane->panel = 'left'; - $pane->type = 'entity_field'; - $pane->subtype = 'node:field_popsu_ville_images_illustr'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'label' => 'title', - 'formatter' => 'image', - 'delta_limit' => '0', - 'delta_offset' => '0', - 'delta_reversed' => 0, - 'formatter_settings' => array( - 'image_style' => 'popsu-villes-grande-image', - 'image_link' => '', - ), - 'context' => 'argument_entity_id:node_1', - 'override_title' => 1, - 'override_title_text' => '', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => 'panel-ville-grande-image', - 'css_class' => 'image-decallee', - ); - $pane->extras = array(); - $pane->position = 0; - $pane->locks = array(); - $display->content['new-4'] = $pane; - $display->panels['left'][0] = 'new-4'; - $pane = new stdClass(); - $pane->pid = 'new-5'; - $pane->panel = 'left'; - $pane->type = 'entity_field'; - $pane->subtype = 'node:field_popsu_ville_body'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'label' => 'title', - 'formatter' => 'text_default', - 'delta_limit' => 0, - 'delta_offset' => '0', - 'delta_reversed' => FALSE, - 'formatter_settings' => array(), - 'context' => 'argument_entity_id:node_1', - 'override_title' => 1, - 'override_title_text' => '', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => 'panel-ville-texte-intro', - 'css_class' => 'layout-88p', - ); - $pane->extras = array(); - $pane->position = 1; - $pane->locks = array(); - $display->content['new-5'] = $pane; - $display->panels['left'][1] = 'new-5'; - $pane = new stdClass(); - $pane->pid = 'new-6'; - $pane->panel = 'right'; - $pane->type = 'entity_field'; - $pane->subtype = 'node:field_popsu_ville_equipe'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'label' => 'title', - 'formatter' => 'text_default', - 'delta_limit' => 0, - 'delta_offset' => '0', - 'delta_reversed' => FALSE, - 'formatter_settings' => array(), - 'context' => 'argument_entity_id:node_1', - 'override_title' => 0, - 'override_title_text' => '', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => 'accordion-h2-ville-equipe', - 'css_class' => 'accordion-h2-ex accordion-h2-panel', - ); - $pane->extras = array(); - $pane->position = 0; - $pane->locks = array(); - $display->content['new-6'] = $pane; - $display->panels['right'][0] = 'new-6'; - $pane = new stdClass(); - $pane->pid = 'new-7'; - $pane->panel = 'right'; - $pane->type = 'entity_field'; - $pane->subtype = 'node:field_popsu_ville_coordinateur'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'label' => 'title', - 'formatter' => 'text_default', - 'delta_limit' => 0, - 'delta_offset' => '0', - 'delta_reversed' => FALSE, - 'formatter_settings' => array(), - 'context' => 'argument_entity_id:node_1', - 'override_title' => 1, - 'override_title_text' => 'Coordinateur
des acteurs', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => 'accordion-h2-ville-coordinateur', - 'css_class' => 'accordion-h2-ex accordion-h2-panel', - ); - $pane->extras = array(); - $pane->position = 1; - $pane->locks = array(); - $display->content['new-7'] = $pane; - $display->panels['right'][1] = 'new-7'; - $pane = new stdClass(); - $pane->pid = 'new-8'; - $pane->panel = 'right'; - $pane->type = 'entity_field'; - $pane->subtype = 'node:field_popsu_ville_partenairesimg'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'label' => 'title', - 'formatter' => 'image', - 'delta_limit' => '0', - 'delta_offset' => '0', - 'delta_reversed' => 0, - 'formatter_settings' => array( - 'image_style' => '', - 'image_link' => '', - ), - 'context' => 'argument_entity_id:node_1', - 'override_title' => 1, - 'override_title_text' => 'Partenaires', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => 'accordion-h2-ville-partenaires', - 'css_class' => 'accordion-h2-ex accordion-h2-panel', - ); - $pane->extras = array(); - $pane->position = 2; - $pane->locks = array(); - $display->content['new-8'] = $pane; - $display->panels['right'][2] = 'new-8'; - $pane = new stdClass(); - $pane->pid = 'new-9'; - $pane->panel = 'right'; - $pane->type = 'custom'; - $pane->subtype = 'custom'; - $pane->shown = TRUE; - $pane->access = array(); - $pane->configuration = array( - 'admin_title' => 'POPSU Fermeture de liste', - 'title' => '', - 'body' => '
', - 'format' => 'php_code', - 'substitute' => 0, - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => '', - 'css_class' => 'border-last', - ); - $pane->extras = array(); - $pane->position = 3; - $pane->locks = array(); - $display->content['new-9'] = $pane; - $display->panels['right'][3] = 'new-9'; - $pane = new stdClass(); - $pane->pid = 'new-10'; - $pane->panel = 'top'; - $pane->type = 'node_links'; - $pane->subtype = 'node_links'; - $pane->shown = FALSE; - $pane->access = array(); - $pane->configuration = array( - 'override_title' => 0, - 'override_title_text' => '', - 'build_mode' => 'full', - 'identifier' => '', - 'link' => 1, - 'context' => 'argument_entity_id:node_1', - ); - $pane->cache = array(); - $pane->style = array( - 'settings' => NULL, - ); - $pane->css = array( - 'css_id' => '', - 'css_class' => 'admin-add-item', - ); - $pane->extras = array(); - $pane->position = 0; - $pane->locks = array(); - $display->content['new-10'] = $pane; - $display->panels['top'][0] = 'new-10'; + $pane = new stdClass(); + $pane->pid = 'new-19dd72c5-0fb3-4d57-a1d9-dec43cd726bb'; + $pane->panel = 'footer'; + $pane->type = 'views_panes'; + $pane->subtype = 'colloques-panel_pane_1'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'arguments' => array( + 'field_popsu_colloque_ville_tid' => '%taxonomy_term:tid', + 'field_popsu_colloque_popsu_tid' => '%taxonomy_term_2:tid', + ), + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => 'pane-colloque', + 'css_class' => 'pane-74-26', + ); + $pane->extras = array(); + $pane->position = 0; + $pane->locks = array(); + $pane->uuid = '19dd72c5-0fb3-4d57-a1d9-dec43cd726bb'; + $display->content['new-19dd72c5-0fb3-4d57-a1d9-dec43cd726bb'] = $pane; + $display->panels['footer'][0] = 'new-19dd72c5-0fb3-4d57-a1d9-dec43cd726bb'; + $pane = new stdClass(); + $pane->pid = 'new-20e52524-8591-4ca9-9cf9-b0812e4c1b22'; + $pane->panel = 'footer'; + $pane->type = 'views_panes'; + $pane->subtype = 'publications-panel_pane_1'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'arguments' => array( + 'field_popsu_publication_ville_tid' => '%taxonomy_term:tid', + 'field_popsu_publication_popsu_tid' => '%taxonomy_term_2:tid', + ), + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => 'pane-publication', + 'css_class' => 'layout-88p pane-74-26 clearfix', + ); + $pane->extras = array(); + $pane->position = 1; + $pane->locks = array(); + $pane->uuid = '20e52524-8591-4ca9-9cf9-b0812e4c1b22'; + $display->content['new-20e52524-8591-4ca9-9cf9-b0812e4c1b22'] = $pane; + $display->panels['footer'][1] = 'new-20e52524-8591-4ca9-9cf9-b0812e4c1b22'; + $pane = new stdClass(); + $pane->pid = 'new-0847f350-e4ae-4918-94a5-88bbb2d8d2fb'; + $pane->panel = 'footer'; + $pane->type = 'custom'; + $pane->subtype = 'custom'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'admin_title' => 'POPSU Fermeture de liste', + 'title' => '', + 'body' => '
', + 'format' => 'php_code', + 'substitute' => 0, + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => '', + 'css_class' => 'border-last layout-64-5p', + ); + $pane->extras = array(); + $pane->position = 2; + $pane->locks = array(); + $pane->uuid = '0847f350-e4ae-4918-94a5-88bbb2d8d2fb'; + $display->content['new-0847f350-e4ae-4918-94a5-88bbb2d8d2fb'] = $pane; + $display->panels['footer'][2] = 'new-0847f350-e4ae-4918-94a5-88bbb2d8d2fb'; + $pane = new stdClass(); + $pane->pid = 'new-4d97b26b-b3c7-4cf9-859f-7c86e93f4610'; + $pane->panel = 'left'; + $pane->type = 'entity_field'; + $pane->subtype = 'node:field_popsu_ville_images_illustr'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'label' => 'title', + 'formatter' => 'image', + 'delta_limit' => '0', + 'delta_offset' => '0', + 'delta_reversed' => 0, + 'formatter_settings' => array( + 'image_style' => 'popsu-villes-grande-image', + 'image_link' => '', + ), + 'context' => 'argument_entity_id:node_1', + 'override_title' => 1, + 'override_title_text' => '', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => 'panel-ville-grande-image', + 'css_class' => 'image-decallee captioned', + ); + $pane->extras = array(); + $pane->position = 0; + $pane->locks = array(); + $pane->uuid = '4d97b26b-b3c7-4cf9-859f-7c86e93f4610'; + $display->content['new-4d97b26b-b3c7-4cf9-859f-7c86e93f4610'] = $pane; + $display->panels['left'][0] = 'new-4d97b26b-b3c7-4cf9-859f-7c86e93f4610'; + $pane = new stdClass(); + $pane->pid = 'new-95496ef6-19e2-49c4-8c59-f3d251199a84'; + $pane->panel = 'left'; + $pane->type = 'entity_field'; + $pane->subtype = 'node:field_popsu_ville_body'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'label' => 'title', + 'formatter' => 'text_default', + 'delta_limit' => 0, + 'delta_offset' => '0', + 'delta_reversed' => FALSE, + 'formatter_settings' => array(), + 'context' => 'argument_entity_id:node_1', + 'override_title' => 1, + 'override_title_text' => '', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => 'panel-ville-texte-intro', + 'css_class' => 'layout-88p', + ); + $pane->extras = array(); + $pane->position = 1; + $pane->locks = array(); + $pane->uuid = '95496ef6-19e2-49c4-8c59-f3d251199a84'; + $display->content['new-95496ef6-19e2-49c4-8c59-f3d251199a84'] = $pane; + $display->panels['left'][1] = 'new-95496ef6-19e2-49c4-8c59-f3d251199a84'; + $pane = new stdClass(); + $pane->pid = 'new-8633443c-8d55-49e3-9e83-f316d9a5e06c'; + $pane->panel = 'right'; + $pane->type = 'entity_field'; + $pane->subtype = 'node:field_popsu_ville_equipe'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'label' => 'title', + 'formatter' => 'text_default', + 'delta_limit' => 0, + 'delta_offset' => '0', + 'delta_reversed' => FALSE, + 'formatter_settings' => array(), + 'context' => 'argument_entity_id:node_1', + 'override_title' => 0, + 'override_title_text' => '', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => 'accordion-h2-ville-equipe', + 'css_class' => 'accordion-h2-ex accordion-h2-panel', + ); + $pane->extras = array(); + $pane->position = 0; + $pane->locks = array(); + $pane->uuid = '8633443c-8d55-49e3-9e83-f316d9a5e06c'; + $display->content['new-8633443c-8d55-49e3-9e83-f316d9a5e06c'] = $pane; + $display->panels['right'][0] = 'new-8633443c-8d55-49e3-9e83-f316d9a5e06c'; + $pane = new stdClass(); + $pane->pid = 'new-b7d934ba-cbdf-49d0-be81-f39b3cfc5f4c'; + $pane->panel = 'right'; + $pane->type = 'entity_field'; + $pane->subtype = 'node:field_popsu_ville_coordinateur'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'label' => 'title', + 'formatter' => 'text_default', + 'delta_limit' => 0, + 'delta_offset' => '0', + 'delta_reversed' => FALSE, + 'formatter_settings' => array(), + 'context' => 'argument_entity_id:node_1', + 'override_title' => 1, + 'override_title_text' => 'Coordinateur
des acteurs', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => 'accordion-h2-ville-coordinateur', + 'css_class' => 'accordion-h2-ex accordion-h2-panel', + ); + $pane->extras = array(); + $pane->position = 1; + $pane->locks = array(); + $pane->uuid = 'b7d934ba-cbdf-49d0-be81-f39b3cfc5f4c'; + $display->content['new-b7d934ba-cbdf-49d0-be81-f39b3cfc5f4c'] = $pane; + $display->panels['right'][1] = 'new-b7d934ba-cbdf-49d0-be81-f39b3cfc5f4c'; + $pane = new stdClass(); + $pane->pid = 'new-80da3ac7-1847-46ac-a958-ce6eec560906'; + $pane->panel = 'right'; + $pane->type = 'entity_field'; + $pane->subtype = 'node:field_popsu_ville_partenairesimg'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'label' => 'title', + 'formatter' => 'image', + 'delta_limit' => '0', + 'delta_offset' => '0', + 'delta_reversed' => 0, + 'formatter_settings' => array( + 'image_style' => '', + 'image_link' => '', + ), + 'context' => 'argument_entity_id:node_1', + 'override_title' => 1, + 'override_title_text' => 'Partenaires', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => 'accordion-h2-ville-partenaires', + 'css_class' => 'accordion-h2-ex accordion-h2-panel', + ); + $pane->extras = array(); + $pane->position = 2; + $pane->locks = array(); + $pane->uuid = '80da3ac7-1847-46ac-a958-ce6eec560906'; + $display->content['new-80da3ac7-1847-46ac-a958-ce6eec560906'] = $pane; + $display->panels['right'][2] = 'new-80da3ac7-1847-46ac-a958-ce6eec560906'; + $pane = new stdClass(); + $pane->pid = 'new-7189d45f-6e1c-4fdf-9918-d16b4faa24a8'; + $pane->panel = 'right'; + $pane->type = 'views_panes'; + $pane->subtype = 'documents-panel_pane_2'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'arguments' => array( + 'field_popsu_doc_parent_nid' => '%node:nid', + 'field_popsu_doc_type_tid' => '52', + ), + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => 'accordion-h2-documents', + 'css_class' => 'accordion-h2 accordion-h2-panel', + ); + $pane->extras = array(); + $pane->position = 3; + $pane->locks = array(); + $pane->uuid = '7189d45f-6e1c-4fdf-9918-d16b4faa24a8'; + $display->content['new-7189d45f-6e1c-4fdf-9918-d16b4faa24a8'] = $pane; + $display->panels['right'][3] = 'new-7189d45f-6e1c-4fdf-9918-d16b4faa24a8'; + $pane = new stdClass(); + $pane->pid = 'new-beaed20f-342d-4553-ad2e-9527df2d46e1'; + $pane->panel = 'right'; + $pane->type = 'custom'; + $pane->subtype = 'custom'; + $pane->shown = TRUE; + $pane->access = array(); + $pane->configuration = array( + 'admin_title' => 'POPSU Fermeture de liste', + 'title' => '', + 'body' => '
', + 'format' => 'php_code', + 'substitute' => 0, + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => '', + 'css_class' => 'border-last', + ); + $pane->extras = array(); + $pane->position = 4; + $pane->locks = array(); + $pane->uuid = 'beaed20f-342d-4553-ad2e-9527df2d46e1'; + $display->content['new-beaed20f-342d-4553-ad2e-9527df2d46e1'] = $pane; + $display->panels['right'][4] = 'new-beaed20f-342d-4553-ad2e-9527df2d46e1'; + $pane = new stdClass(); + $pane->pid = 'new-c976aec7-6650-4c5c-bb9c-4a44e7872566'; + $pane->panel = 'top'; + $pane->type = 'node_links'; + $pane->subtype = 'node_links'; + $pane->shown = FALSE; + $pane->access = array(); + $pane->configuration = array( + 'override_title' => 0, + 'override_title_text' => '', + 'build_mode' => 'full', + 'identifier' => '', + 'link' => 1, + 'context' => 'argument_entity_id:node_1', + ); + $pane->cache = array(); + $pane->style = array( + 'settings' => NULL, + ); + $pane->css = array( + 'css_id' => '', + 'css_class' => 'admin-add-item', + ); + $pane->extras = array(); + $pane->position = 0; + $pane->locks = array(); + $pane->uuid = 'c976aec7-6650-4c5c-bb9c-4a44e7872566'; + $display->content['new-c976aec7-6650-4c5c-bb9c-4a44e7872566'] = $pane; + $display->panels['top'][0] = 'new-c976aec7-6650-4c5c-bb9c-4a44e7872566'; $display->hide_title = PANELS_TITLE_FIXED; $display->title_pane = '0'; $handler->conf['display'] = $display; diff --git a/sites/default/modules/features/popsu_villes/popsu_villes.strongarm.inc b/sites/default/modules/features/popsu_villes/popsu_villes.strongarm.inc index 44b80e4..f954a5b 100644 --- a/sites/default/modules/features/popsu_villes/popsu_villes.strongarm.inc +++ b/sites/default/modules/features/popsu_villes/popsu_villes.strongarm.inc @@ -34,6 +34,9 @@ function popsu_villes_strongarm() { 'token' => array( 'custom_settings' => FALSE, ), + 'diff_standard' => array( + 'custom_settings' => FALSE, + ), ), 'extra_fields' => array( 'form' => array( @@ -97,5 +100,15 @@ function popsu_villes_strongarm() { $strongarm->value = 0; $export['node_submitted_popsu_ville'] = $strongarm; + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'xmlsitemap_settings_node_popsu_ville'; + $strongarm->value = array( + 'status' => '1', + 'priority' => '0.8', + ); + $export['xmlsitemap_settings_node_popsu_ville'] = $strongarm; + return $export; } diff --git a/sites/default/modules/features/popsu_villes/popsu_villes.views_default.inc b/sites/default/modules/features/popsu_villes/popsu_villes.views_default.inc index 2c3ca2a..7173afe 100644 --- a/sites/default/modules/features/popsu_villes/popsu_villes.views_default.inc +++ b/sites/default/modules/features/popsu_villes/popsu_villes.views_default.inc @@ -66,13 +66,11 @@ function popsu_villes_views_default_views() { $handler = $view->new_display('page', 'Page', 'page_1'); $handler->display->display_options['defaults']['title'] = FALSE; $handler->display->display_options['title'] = 'Villes'; - $handler->display->display_options['defaults']['hide_admin_links'] = FALSE; $handler->display->display_options['path'] = 'villes'; /* Display: Villes par POPSU Pane */ $handler = $view->new_display('panel_pane', 'Villes par POPSU Pane', 'panel_pane_1'); $handler->display->display_options['defaults']['css_class'] = FALSE; - $handler->display->display_options['defaults']['hide_admin_links'] = FALSE; $handler->display->display_options['defaults']['style_plugin'] = FALSE; $handler->display->display_options['style_plugin'] = 'list'; $handler->display->display_options['style_options']['row_class'] = 'span2'; @@ -141,7 +139,6 @@ function popsu_villes_views_default_views() { /* Display: Villes par ThemeTrans Pane */ $handler = $view->new_display('panel_pane', 'Villes par ThemeTrans Pane', 'panel_pane_2'); $handler->display->display_options['defaults']['css_class'] = FALSE; - $handler->display->display_options['defaults']['hide_admin_links'] = FALSE; $handler->display->display_options['defaults']['style_plugin'] = FALSE; $handler->display->display_options['style_plugin'] = 'list'; $handler->display->display_options['style_options']['row_class'] = 'span2'; diff --git a/sites/default/themes/popsu/css/screen.css b/sites/default/themes/popsu/css/screen.css index 5836172..4391243 100644 --- a/sites/default/themes/popsu/css/screen.css +++ b/sites/default/themes/popsu/css/screen.css @@ -711,7 +711,12 @@ a:hover { margin-left: 100px; } /* line 555, ../../vendor/gems/compass_twitter_bootstrap-2.0.3/stylesheets/compass_twitter_bootstrap/_mixins.scss */ -.span2, body.context-popsu-1 #header-wrapper #block-boxes-popsu_logo_popsu2, body.context-popsu-1 #header-wrapper #block-boxes-popsu_logo_popsueurope, body.context-popsu-2 #header-wrapper #block-boxes-popsu_logo_popsu1, body.context-popsu-2 #header-wrapper #block-boxes-popsu_logo_popsueurope, body.context-popsu-europe #header-wrapper #block-boxes-popsu_logo_popsu1, body.context-popsu-europe #header-wrapper #block-boxes-popsu_logo_popsu2 { +.span2, body.context-popsu-1 #header-wrapper #block-boxes-popsu_logo_popsu2, +body.context-popsu-1 #header-wrapper #block-boxes-popsu_logo_popsueurope, +body.context-popsu-2 #header-wrapper #block-boxes-popsu_logo_popsu1, +body.context-popsu-2 #header-wrapper #block-boxes-popsu_logo_popsueurope, +body.context-popsu-europe #header-wrapper #block-boxes-popsu_logo_popsu1, +body.context-popsu-europe #header-wrapper #block-boxes-popsu_logo_popsu2 { width: 140px; } /* line 556, ../../vendor/gems/compass_twitter_bootstrap-2.0.3/stylesheets/compass_twitter_bootstrap/_mixins.scss */ @@ -727,7 +732,15 @@ a:hover { margin-left: 260px; } /* line 555, ../../vendor/gems/compass_twitter_bootstrap-2.0.3/stylesheets/compass_twitter_bootstrap/_mixins.scss */ -.span4, body.context-popsu-1 #header-wrapper #block-boxes-popsu_logo_popsu1, body.context-popsu-2 #header-wrapper #block-boxes-popsu_logo_popsu2, body.context-popsu-europe #header-wrapper #block-boxes-popsu_logo_popsueurope, body.popsu-actu-section #header-wrapper #boxes-box-popsu_logo_popsuneutral, #main-wrapper #sidebar-first { +.span4, +body.context-popsu-1 #header-wrapper #block-boxes-popsu_logo_popsu1, +body.context-popsu-2 #header-wrapper #block-boxes-popsu_logo_popsu2, +body.context-popsu-europe #header-wrapper #block-boxes-popsu_logo_popsueurope, +body.context-popsu-monde #header-wrapper #block-boxes-popsu_logo_popsumonde, +body.context-popsu-territoires #header-wrapper #block-boxes-popsu_logo_popsuterrritoires, +body.context-popsu-metropoles #header-wrapper #block-boxes-popsu_logo_popsumetropoles, +body.popsu-actu-section #header-wrapper #boxes-box-popsu_logo_popsuneutral, +#main-wrapper #sidebar-first { width: 300px; } /* line 556, ../../vendor/gems/compass_twitter_bootstrap-2.0.3/stylesheets/compass_twitter_bootstrap/_mixins.scss */ diff --git a/sites/default/themes/popsu/img/body-pattern-wide-trans.png b/sites/default/themes/popsu/img/body-pattern-wide-trans.png index 1b4a87075ac577715b79609efdea9c1d538b2f89..d8cdc7a3feb019974f17ac8e9842790bb83ed52c 100644 GIT binary patch literal 51505 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 DD+Y42 literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/carte/points/points_carte_2-3-5.png b/sites/default/themes/popsu/img/carte/points/points_carte_2-3-5.png new file mode 100644 index 0000000000000000000000000000000000000000..8a1c7a09f0bd94bf7fd6758562cbafb44926ba3b GIT binary patch literal 777 zcmV+k1NQuhP)P000>X1^@s6#OZ}&00009a7bBm000XU z000XU0RWnu7ytkO8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0+vZc zK~#9!oR-gP6HySyXMbg5+t{GipT(xOy$B^L3fhBs_M!(71R>@R5N&T>BsXtu#6Q61 zCY}P~$x9KbqJoJ+(MH?a&?S|aZcAJ@n{49jnq7CZ@4du+VR@T3v+uKSX5MVLR;vXx z&15D{;Sja%XA^~mPWzqP_gwqKM-LWg>u{YATsVe93azlSbLdBb&;S>t94Mz zX22FbAizjehrvEJ#HlWo6tY6zfLG5n_+7@tQ#wO<&jmOaKMp4+4ioKIU7WM$EDc~u zkOkrbf;eQ4@AB)gR44(Z0|2pvt7_8)*fH%3kz*|!b?+@uMGcgC+J#{Av+|O3EFWI# zK2KiYK#ItIfD{9c_a`H_w9(mGa=x~Lpm_(h{-qv#>#*p8q|i8s;*o$)QE|IM(%ZWN zUHIb7#O39D@wri3#$4BYHaR>Aa_B7RJDXr=C1^Dpe*3^MjKs!nynS*1NoNWBq^!iX zfk+%6f@h?$X@fXU#y3CY`ba}oCB^X!?I5U*VUs`%?X_){Ur-{QlR&F-jh=;xiEl65 zO&saVI6gJ2vRVyGUl(V%&N*6d$inWFAx-kE7QG9ldxqeaedne}P2+R9o^#^K4fB)i zQ4#_3G$Y?7iPnRo?O1P9axlsQblnMIXU_jDl@=P3{s=GtF%|>Ml6pKO00000NkvXX Hu0mjf*4tln literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/carte/points/points_carte_2-5.png b/sites/default/themes/popsu/img/carte/points/points_carte_2-5.png new file mode 100644 index 0000000000000000000000000000000000000000..e99374981eee59b080d77e4f9fbf60de765f0685 GIT binary patch literal 959 zcmV;w13>(VP)P000;W1^@s654Bdt00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;sg^F3ko^7AJzZ>158Oo zK~zY`?Ud1LTtyVde`jXy?xsna>^4o?CB~K}tgTO06Oo2uixnSy6I+YmTi>f7hzk0o zrJ$mq;EN#mAVow(5!7mJL2DF*P_d*TVw6pqXiZ{vZ+GvVIX*;VvU~FnNPlmaGjqT5 zeRF1n7WN-{$0f;9kD6pqRr|p>Av7^&Hf?nOdi3~*&27U!btTK;fCeq8V#VNrc^k}tCHpR)dAcUa;oQE_59aob&faA#M^!iUmmqv3 zmiG!B=HnM0np|oV**o^ycD#QA!YQDz(Vqbl>MP&j!?zr`H&D5=fVI#f1VSvr>$$wV zbo%(!IRFb#Ir4UANb08`JO$+11(djciMW2AG`Ydl<&^Fo!}bA329dx>2*}|_`^GPx z{i9(4isi%iq2W287tr+%MRFv~Y3j9egb*Xf5k*4vXHR)gL{G^O!UhpVunI$IQ)h0e zbo^*5hu-Yg&^!rxfBQKZAW*MgAW3Erv1?@w;8S7uZ4ufU*eYEjB&Bk0+=Mh9MD<|1 zYeh^B?-%gtHBf1t6Ryvv{IwJ?maOfd45@OfQM6B?k`=Dt@O}vmHAJMX-y3ltt}8~^ zjFJX+8AU9R&t4;dN7ZLmg9i=TYH&Rca0aCYEM%_Yyt| zBve7ivs?si;%qdfp@UQ{Y0T4hebssVl&=A!z_#{t>A<=oX*x$UUZL1;Ir4BPTZ?TMan*$~C5C5Ter)RV zwP&UF`-JxFxM$i%T@$F5fxWFl&J{t+&B4k-W9&hVN;_=303e1ht(7OMzbt-s`HQ-) zi2y9lp4Z-;V>8xm`2@m65m`aRArgzoG{{+@^z{C_=U*Jy^XJ!I8Aj*>ya*}qy>)WZ zMfTOWmRx!3@oLC?>i=cv;421Ir(i)uP({TXcBYfxoCwdnTd}o<&j}b5#DFRx%A3ZS hMFzX5YBSJVYx@`?Ze002ovPDHLkV1n2vxP|}# literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/carte/points/points_carte_5.png b/sites/default/themes/popsu/img/carte/points/points_carte_5.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b84625232e123f160788f706bc99db5751a9d5 GIT binary patch literal 531 zcmV+u0_^>XP)P000;W1^@s654Bdt00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;sg^F1u$VZ>*@di0ia1l zK~zY`?Uc_;R8bg)pZAVnWKiG)BQa8Hp)F>o_!C^E)S~<=f}lvFm3u)_)U{jPyKo_i zL6R7{a6sIs4Kah#2$@7Rq0aeQ)Iz4q+&kBu_%6Sf^F8N$=bTrBP(%CJeaTCK)q$>o z6$E)hTc7u?q>I^SuH1T+Gn+cz+%#fO!1_V0V97J~0cZnw3(S359m-S;Y3dwLVmt>1 z4XVl>RhsqWjqa?x-1M_!e#OR~$vDo2fY*Q*VxlQCOT=$KT06`x9F>~B4P3D}01Q%@ z9=qb{3qRvONJHmTi)ZR1Xhgof)ZN%M(G>`hxfIYwB-tIz^_EtBcI$2d$!HL2G46%A zldGIh*F!+``<##;fe^#xfiDpON1#lYacu$Vh>#qx5(vp|r_-RtNC>f3$QRxPLQcQV zI4L%VG+QBJSunky89oUWD~Gv-Z}IwvJ7$&unuCHASe7xeyZY*V=QWb1e*m|+ Ve>hge*q{Ia002ovPDHLkV1krW=lK8t literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/icons/facebook.png b/sites/default/themes/popsu/img/icons/facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..7b52e1458d51879487df30c1569aaa46683df092 GIT binary patch literal 516 zcmV+f0{i`mP)Fz&N@;@h-yl1{25>9sDUsIf8W_nN zNCQ}ubZllwax%4^fs&*f;8!62tJr7T5H73MrKB?-+lgnHTJ@AZvHX+kM3x|}l=-qRUaJ^PV*u$88~+m7@;Hx`_FvMv z?yT?ZOTcLyh@^Ug{1$+|52i0000 z{@+=@bB^I82{Y?*p9Dz)z|4@8eeqOaK5!RM3k(MY{08g=wg8`)*@0ZVNAH0Y(0K`4 z_QjHrlnS3E1={aZl4eWVrk+u!q>m-d$i=TDlXQio@sgHGs*YPUSkgU7fscS5>Wmda ze@l8<(p3T20sfmaB`x=L8@k}~#j_=KNLmobTnRx}OZrNErzMhZkaVY{#gcYLHs`u7 z3`iOzX{9eZDXFfM;Dh&$l=Ov4OP!Jyn|W4<^N zcpa#g^tPFuC`P#Ru+<-U3>a4;(49a7Z~%A_xEZ(|I0`(F6@Qhax;*OAE@_>lnW4HC zqWXcF-!17t301sJ((%Z%eUhdUsF;BBdHAgY9syQLS}5sCGs{Y@P}`plOe$ft91zi_ zeZT@U`{@$DZt&B4xRa+Pt(SCvRFb{ffIh_RLTHDi+hQY>q%o2%^y0@FCA}xn> z)rHbwGGb;OlC}VE0E>$7;&iB0zzE=aXC{dQ|7lNT;%(f+S&gKDW_AX66Ifj$X3W(u z3E(X`fd>i7T%cLftH4-K^OjTDbTpR}wQS|X4-4xe_Ho2*by$T0pJrw|bJ<`vq2Ckv ztUoZhf~9>1Xw7w~N(B#(0|&W$Xg6>!E|f(Rm~(!1yN=R}ZA#=AOL~80fisRT)crHLx|V%+zDx!56;+-l>o*ZEaB6Dhzl~k?Hh= z=7TZ@{U@-}%o=(s?QSV3J&*TNZ8_4?u%lZviuAEpc~7cbXp5u?MF$;Y^GJG9(k@A7 zyqWla(H=>&3k7Yx0Ut~drM*-&AGpyy{wQEbLUw%^c*)E@Ol(3cZg;)qyDcF}AIr|@ z6mv?WSD+;gm-L{d?-K&uBIOlAP6hD@1x3NQ_rMW#2F1pNUl1D2TCk#O|0uapKROM0A4 z71evEy+qSMrmH!x3{ueDo+fWHvx7Z3Viu(8 zfohKhW{?@dn(whWN!mqbFyU+9XERf&Kxb_{T5TESHhr&aL2U`ao&`1mYaMt~=x<7y zoLCqdA{#J>%#8SCV2)q2==&7nVLvx-_G(EB(CR0_k^|0}vc_nD@$ZzwU@{YsQ+-2f z-1%MYj<7$O`Ic7T81SqAJp}Cc>lB$zY@3<2=X-Z4=^v$_h)IJX?L7bh002ovPDHLk FV1kvC%;f+8 literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/icons/youtube-white.png b/sites/default/themes/popsu/img/icons/youtube-white.png new file mode 100644 index 0000000000000000000000000000000000000000..5522a61326a9681aff98cdedd09a437549149855 GIT binary patch literal 8316 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 P-8ulQsjtzXZWr}GCcxhc literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/logos/logo-pages-froides-avec-baseline.png b/sites/default/themes/popsu/img/logos/logo-pages-froides-avec-baseline.png index 9ac3ae63688a18146352ee4ff1631b0e5801ffdd..9240cca6e25c218f7406b1b7163c80f46649d367 100644 GIT binary patch literal 15210 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 WG2!!(JAeOLm6v%hT_$N5@P7a|mhU70 diff --git a/sites/default/themes/popsu/img/logos/logo-pages-froides-avec-baseline_OLD.png b/sites/default/themes/popsu/img/logos/logo-pages-froides-avec-baseline_OLD.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac3ae63688a18146352ee4ff1631b0e5801ffdd GIT binary patch literal 11042 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 WG2!!(JAeOLm6v%hT_$N5@P7a|mhU70 literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/logos/popsu1/logo-small-home-trans-old.png b/sites/default/themes/popsu/img/logos/popsu1/logo-small-home-trans-old.png new file mode 100644 index 0000000000000000000000000000000000000000..21ea9ff699474657664e92610d99d3329b22a79a GIT binary patch literal 2987 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 z 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 Roz0(f3lkgMHDhATe*pcYDLMcE literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/logos/popsu2/logo-small-home-trans.png b/sites/default/themes/popsu/img/logos/popsu2/logo-small-home-trans.png index f567e9c311a8c458ec443930667805fc215cc5c3..711233301a32dfffb54a5834ae44806cfca7288e 100644 GIT binary patch literal 8734 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

o1ZTefl9sj({`~ECICSLs zM;eDBskGMbcpyz)Hz`{X1UybZHNJXe(Y-P+5@aONi6F?xqKAlQBm3LmCK2sG7G<28 zh9qj3*24ulS=7)JC*oc4wphsX```YOPfq-1k@ct=Z5>^_`r4ndsl5ZQ*T>G?duVKG zW@6$d1K0XEfA%zeS1)s|=MukDR5owzA`l4PMU|~Pxq-d-`CFQeusq9I3zguJsx1t& z!q`kdC1V~4JsdPdBEC&*tlf*p5u(=LO4Q#-$Xkm;byG3R)CM=;n5-dRns`V%0=2#l zJkI67D~du(TPLx20!flcG&R$`Z3ita8}a%4WYTF$C7qf`lu)>a*0xP_ZQIWK|MoAO zKJ^93sVNM@xILkZZQdLoV*ur2Rr@>zdMR7DafL-l&DFfOk2Y)`X|mXn3~0UK!Jc$tz&Ea7|}p{ z*_-J0_;~HjpYg&=uONydvMi%%4irVfvMfeMhWYh>eLy17NOMaIZjXmlGRfTR47P3K z_4yD*anZv)9z;o^=hAsj9RG+^DoHMv30o5TaA{sD z<;q=zLB#F$5C{Yj#pM~et{0h_oZ$4y&pG?Gh{xwgQB+F0PI@jyAQa}v(HHUi{HUtR zzWoOo8y#U}u#Z3f;W%ebpTejZWYROJs)GZEkJ8-Ia?f*qa1e6ETMSKIV4*bf@I_13 zh=sQx;-Vq6>7mM^Dm&rF@$>&ga^Xt=nrn{m z#?HT^rEc3YVa~KFqHO47^3xPbw~#~`pQ{G1GmI!o2)Em} zEQ`sBn`AQ?1W_OoiBc1Z-gj~=%OaCWlS(GZX0sTkfh@}egF))*8u0pj%YIiX>7=Ho znVwEkDwPlg0e>J!EEdP(^{%-WtlASwV*~UOsr;NRy&D5WJ%4cwl^ndN13{H@jKTm=;b_lec?yhSP=vfRaTKD^@-gaS}_QQ zS)ou`pkgl9SY~pAe0ud?@eW6RlmUc2adxyGqc+g^#1@3D7z9nxXs+8rV(JjXb006! zQ@uRL$js+I$~gf=3b427ukkr+p6H4^c{OeykG8P4?M<@931;%AZ)f#3wq04bDs@e+ zqu#dz%eF`tM#z_M+-PwT8YS#vwQY~Og8smv%nld~9BcHKJX zRugP%e2M0|4pc>3TATE8ky5#c4S1dYC%!oNkyO->FUo=TH<-`gWIXf7`^p!BAmfnh zkwquEF}rG7D~TRjBhS+w-@a6I42v4R$Eo0P`gmIGkyKPkl!!++a;W_;IB{u;bn((X z6Ikon$+pBXf}UDNr+XNiyTp8=!46Ld8m!tV}M50gJo?@=7I#k!fvzQvbA z^As!Ni)yD5r!Dd_yINnNrM?qIR_RDQM=Jdi*T&B>I&+cfg`S75C!*kBQ|(a_(bi>N zPzB*WVae+X(A{#7nOoyrP5z32qm}OXPuS7=Jdr^Cl4z&MDlUhI4K;vU>kL^-N(`H{Feg@wtOM3no17|G+cM3WGO$=(~A_L`^%JV%>OM{s-m_wryit z2I+-a#%G4Pk-Em<^eJZYmoV)-0y2kN|DL1WZ{hcZsvxY?^m376DUaLXU1BjSl|pib zEYs-;#!`J;oBA5dGB~#FZ)lHqKUJsp*Byk%HQTl*l=7q(W--hPkwC+$D;BCCtQi=K z=RSo86aiO3sM`7|1Jx<0f>5<82vrcORt2F7Le;7u{At<$1G0?i{*yTi_y7O^07*qo IM6N<$g8VSHRsaA1 literal 3081 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 Roz0(f3lkgMHDhATe*pcYDLMcE diff --git a/sites/default/themes/popsu/img/logos/popsueurope/logo-small-home-trans-old.png b/sites/default/themes/popsu/img/logos/popsueurope/logo-small-home-trans-old.png new file mode 100644 index 0000000000000000000000000000000000000000..071eefae53787ffc715fe65cf817fa9a79edb450 GIT binary patch literal 3455 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 literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/logos/popsueurope/logo-small-home-trans.png b/sites/default/themes/popsu/img/logos/popsueurope/logo-small-home-trans.png index 071eefae53787ffc715fe65cf817fa9a79edb450..7e6f2d2415ae92b41c83aabad6d75f320204b3c3 100644 GIT binary patch literal 10370 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 literal 3455 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 diff --git a/sites/default/themes/popsu/img/logos/popsumetropoles/logo-sidebar-trans.png b/sites/default/themes/popsu/img/logos/popsumetropoles/logo-sidebar-trans.png new file mode 100644 index 0000000000000000000000000000000000000000..1a8208f88a7324dec32467c8f41566be7dcd5fc9 GIT binary patch literal 14082 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 N002ovPDHLkV1g9*GG71y literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/logos/popsumetropoles/logo-small-trans_new.png b/sites/default/themes/popsu/img/logos/popsumetropoles/logo-small-trans_new.png new file mode 100644 index 0000000000000000000000000000000000000000..a07d6b67b73ddeb2be4fd8749ad031167ba51223 GIT binary patch literal 3175 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 N002ovPDHLkV1g9*GG71y literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/logos/popsumetropoles/logo-small-trans_old.png b/sites/default/themes/popsu/img/logos/popsumetropoles/logo-small-trans_old.png new file mode 100644 index 0000000000000000000000000000000000000000..7a1d9bf7a810836356d3977dd7a027e531fa8418 GIT binary patch literal 7092 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 Hv(Ntnf9?mV literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/logos/popsumonde/logo-sidebar-trans.png b/sites/default/themes/popsu/img/logos/popsumonde/logo-sidebar-trans.png new file mode 100644 index 0000000000000000000000000000000000000000..1e64f3dee71468166bc83dff685fa214b58e9660 GIT binary patch literal 9933 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 literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/logos/popsumonde/logo-small-home-trans.png b/sites/default/themes/popsu/img/logos/popsumonde/logo-small-home-trans.png new file mode 100644 index 0000000000000000000000000000000000000000..4f2e4a570a8e31d0da666d32d7b06c064ff3d89b GIT binary patch literal 10188 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 literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/logos/popsuterritoires/logo-sidebar-trans.png b/sites/default/themes/popsu/img/logos/popsuterritoires/logo-sidebar-trans.png new file mode 100644 index 0000000000000000000000000000000000000000..f1e045aa07d0009ca8b7e6d6bfd48f65eda293a1 GIT binary patch literal 10584 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¬j3J#)Q)led%B8I(UcX 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 RB=`UT002ovPDHLkV1g(`dE)>8 literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/img/logos/popsuterritoires/logo-small-trans.png b/sites/default/themes/popsu/img/logos/popsuterritoires/logo-small-trans.png new file mode 100644 index 0000000000000000000000000000000000000000..1898b41396e1ec247775ccb847919194fccb9174 GIT binary patch literal 2944 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 OqG_n=s#Gaih5rYISCE|m literal 0 HcmV?d00001 diff --git a/sites/default/themes/popsu/js/script.js b/sites/default/themes/popsu/js/script.js index cf59885..92b63ae 100644 --- a/sites/default/themes/popsu/js/script.js +++ b/sites/default/themes/popsu/js/script.js @@ -120,6 +120,7 @@ trigger: "hover", content: "

" }); /* BRUXELLES */ @@ -163,6 +164,7 @@ trigger: "hover", content: "" }); /* Hambourg */ @@ -189,6 +191,7 @@ "
  • POPSU France 1
  • " + "
  • POPSU France 2
  • " + "
  • POPSU Europe
  • " + + "
  • POPSU Métropoles
  • " + "" }); /* LONDRES */ @@ -207,6 +210,7 @@ "
  • POPSU France 1
  • " + "
  • POPSU France 2
  • " + "
  • POPSU Europe
  • " + + "
  • POPSU Métropoles
  • " + "" }); /* MALAGA */ @@ -225,6 +229,7 @@ "
  • POPSU France 1
  • " + "
  • POPSU France 2
  • " + "
  • POPSU Europe
  • " + + "
  • POPSU Métropoles
  • " + "" }); @@ -243,6 +248,7 @@ content: "" }); @@ -265,6 +271,7 @@ "
  • POPSU France 1
  • " + "
  • POPSU France 2
  • " + "
  • POPSU Europe
  • " + + "
  • POPSU Métropoles
  • " + "" }); @@ -295,6 +302,7 @@ content: "" }); @@ -316,6 +324,7 @@ content: "" }); @@ -357,6 +366,7 @@ "
  • POPSU France 1
  • " + "
  • POPSU France 2
  • " + "
  • POPSU Europe
  • " + + "
  • POPSU Métropoles
  • " + "" }); @@ -380,6 +390,68 @@ "" }); + /* Brest */ + $("#point-nid-1093").popover({ + title: false, + trigger: "hover", + content: "" + }); + + /* Rouen */ + $("#point-nid-1099").popover({ + title: false, + trigger: "hover", + content: "" + }); + + /* Clermont-ferrand */ + $("#point-nid-1094").popover({ + title: false, + trigger: "hover", + content: "" + }); + + /* Dijon */ + $("#point-nid-1095").popover({ + title: false, + trigger: "hover", + content: "" + }); + + /* Nice */ + $("#point-nid-1098").popover({ + title: false, + trigger: "hover", + content: "" + }); + + /* Metz */ + $("#point-nid-1097").popover({ + title: false, + trigger: "hover", + content: "" + }); + + /* Nancy */ + $("#point-nid-1102").popover({ + title: false, + trigger: "hover", + content: "" + }); $.each($(".captioned img"), function(legend, item) { @@ -394,24 +466,3 @@ }); })(jQuery); - - - - - - - - - - - - - - - - - - - - - diff --git a/sites/default/themes/popsu/less/content-all.css.less b/sites/default/themes/popsu/less/content-all.css.less index f532c0d..a482bab 100644 --- a/sites/default/themes/popsu/less/content-all.css.less +++ b/sites/default/themes/popsu/less/content-all.css.less @@ -202,15 +202,17 @@ table.views-view-grid tbody tr td.col-last { cursor: text; } #accordion-h2-partenaires, -#accordion-h2-popsueurope-home, +// #accordion-h2-popsuterritoires-home, +#accordion-h2-popsumonde-home, #accordion-h2-liste-themes-trans { border-bottom: 1px solid #000; margin-bottom: 22px; } #accordion-h2-partenaires, -#accordion-h2-projetseurope, -#accordion-h2-popsueurope-home { +// #accordion-h2-popsuterritoires-home, +// #accordion-h2-popsueurope-home, +#accordion-h2-popsumonde-home{ padding-bottom: 5px; } @@ -549,7 +551,10 @@ ul.document-files { body.path-popsu-europe-accueil, body.path-popsu1-accueil, -body.path-popsu2-accueil { +body.path-popsu2-accueil, +body.path-popsu-territoires-accueil, +body.path-popsu-monde-accueil, +body.path-popsu-metropoles-accueil { #content-wrapper { h1#page-title { display: none; @@ -682,27 +687,35 @@ body.front { #logo-home-popsu1 ul.logos { background: url(../img/logos/popsu1/logo-small-home-trans.png) no-repeat top center; } - #logo-home-popsu2 ul.logos { background: url(../img/logos/popsu2/logo-small-home-trans.png) no-repeat top center; } - #logo-home-popsueurope ul.logos { background: url(../img/logos/popsueurope/logo-small-home-trans.png) no-repeat top center; margin-right: 0; } - ul.logos li { - display: none; + #logo-home-popsuterritoires ul.logos { + background: url(../img/logos/popsuterritoires/logo-small-home-trans.png) no-repeat top center; } + #logo-home-popsumetropoles ul.logos { + background: url(../img/logos/popsumetropoles/logo-small-home-trans.png) no-repeat top center; + } + #logo-home-popsumonde ul.logos { + background: url(../img/logos/popsumonde/logo-small-home-trans.png) no-repeat top center; + margin-right: 0; + } + ul.logos li {display: none;} #logo-home-popsu1 ul.logos:hover, #logo-home-popsu2 ul.logos:hover, - #logo-home-popsueurope ul.logos:hover { + #logo-home-popsueurope ul.logos:hover, + #logo-home-popsuterritoires ul.logos:hover, + #logo-home-popsumetropoles ul.logos:hover, + #logo-home-popsumonde ul.logos:hover{ background: none; } ul.logos:hover li { display: block; } - } #logos-partenaires-home { @@ -791,8 +804,6 @@ body.front { // background-size: contain; // } - - .col-logo { margin-top: 20px; margin-left: 50px; @@ -1090,6 +1101,24 @@ body.logged-in #content-tabs ul.tabs.primary { .POPSU1.POPSU2.POPSU.Europe .map-title { background-image: url("../img/carte/points/points_carte_1-2-3.png"); } + .POPSU1.POPSU2.Métropoles .map-title { + background-image: url("../img/carte/points/points_carte_1-2-5.png"); + } + .Métropoles .map-title { + background-image: url("../img/carte/points/points_carte_5.png"); + } + .POPSU1.POPSU2.POPSU.Europe.Métropoles .map-title { + background-image: url("../img/carte/points/points_carte_1-2-3-5.png"); + } + .POPSU1.POPSU.Europe.Métropoles .map-title { + background-image: url("../img/carte/points/points_carte_1-3-5.png"); + } + .POPSU2.POPSU.Europe.Métropoles .map-title { + background-image: url("../img/carte/points/points_carte_2-3-5.png"); + } + .POPSU2.POPSU.Métropoles .map-title { + background-image: url("../img/carte/points/points_carte_2-5.png"); + } @@ -1202,8 +1231,8 @@ body.logged-in #content-tabs ul.tabs.primary { .map-title { background-position: top left; padding-bottom: 0; - padding-left: 28px; - padding-top: 7px; + padding-left: 30px; + padding-top: 11px; } } /* Londres */ @@ -1225,7 +1254,6 @@ body.logged-in #content-tabs ul.tabs.primary { #point-nid-882.placement-carte { margin-left: 280px; /* -55 */ margin-top: 597px; /* -172 */ - .map-title { background-position: top left; padding-bottom: 10px; @@ -1313,8 +1341,14 @@ body.logged-in #content-tabs ul.tabs.primary { } /* Strasbourg */ #point-nid-888.placement-carte { - margin-left: 335px; - margin-top: 331px; + margin-left: 291px; + margin-top: 351px; + .map-title { + background-position: top right; + padding-bottom: 10px; + padding-right: 25px; + padding-top: 1px; + } } /* Stuttgrat */ #point-nid-1031.placement-carte { @@ -1333,8 +1367,6 @@ body.logged-in #content-tabs ul.tabs.primary { #point-nid-889.placement-carte { margin-left: 300px; margin-top: 620px; - - .map-title { background-position: top left; padding-bottom: 10px; @@ -1357,6 +1389,49 @@ body.logged-in #content-tabs ul.tabs.primary { margin-left: 607px; margin-top: 383px; } + /* Clermont-ferrand */ + #point-nid-1094.placement-carte { + margin-left: 160px; + margin-top: 430px; + } + /* Rouen */ + #point-nid-1099.placement-carte { + margin-left: 200px; + margin-top: 290px; + } + /* Nice */ + #point-nid-1098.placement-carte { + margin-left: 368px; + margin-top: 575px; + } + /* Metz */ + #point-nid-1097.placement-carte { + margin-left: 329px; + margin-top: 293px; + } + /* Dijon */ + #point-nid-1095.placement-carte { + margin-left: 280px; + margin-top: 397px; + } + /* Brest */ + #point-nid-1093.placement-carte { + margin-left: 32px; + margin-top: 286px; + } + /* Nancy */ + #point-nid-1102.placement-carte { + margin-left: 296px; + margin-top: 331px; + .map-title { + background-position: top right; + padding-bottom: 10px; + padding-right: 25px; + padding-top: 1px; + } + } + + diff --git a/sites/default/themes/popsu/less/layout.css.less b/sites/default/themes/popsu/less/layout.css.less index 78ac9a6..1dc1153 100644 --- a/sites/default/themes/popsu/less/layout.css.less +++ b/sites/default/themes/popsu/less/layout.css.less @@ -23,7 +23,7 @@ body.front #global-wrapper { } body.front #global-wrapper-secondary { - background: url(../img/carte/fond_pageaccueil_final.png) no-repeat center -145px; + background: url(../img/carte/fond_pageaccueil_final.png) no-repeat center -46px; } @@ -76,6 +76,18 @@ body.context-popsu-2 #content-inner h1#page-title { color: @vert_popsu2; } +body.context-popsu-territoires #content-inner h1#page-title { + color: @rouge_popsuterritoires; +} + +body.context-popsu-metropoles #content-inner h1#page-title { + color: @bleu_popsumetropoles; +} + +body.context-popsu-monde #content-inner h1#page-title { + color: @beige_popsumonde; +} + h2 { line-height: 1.3em; @@ -192,6 +204,32 @@ body.page-user #page { float: right; display: block; }*/ + + a.social{ + display: inline-block; + vertical-align:baseline; + width:15px; height:15px; + overflow: hidden; + text-indent: 40px; + // line-height: 1; + margin-top:-2px; + white-space: nowrap; + background-position: center; + background-repeat: no-repeat; + background-size: contain; + } + a.twitter{ + background-image: url('../img/icons/twitter.png'); + } + a.facebook{ + background-image: url('../img/icons/facebook.png'); + } + a.social.youtube{ + background-image: url('../img/icons/youtube-white.png'); + width:20px; + } + + li.last { float: right; display: block; @@ -278,20 +316,20 @@ body.page-user #page { } } -body.context-popsu-europe #sidebar-first .left-nav-level-1 ul.menu { +.menu-popsu-sidebar(@col){ li { - color: @gris_popsueurope; + color: @col; a, .nolink { - color: @gris_popsueurope; + color: @col; } ul li a { color: #fff; } ul li a:hover { - color: @gris_popsueurope; + color: @col; } ul li.active a { font-family: OpenSansBold, verdana,arial,helvetica,sans-serif; @@ -299,10 +337,23 @@ body.context-popsu-europe #sidebar-first .left-nav-level-1 ul.menu { } li.active a.active { - color: @gris_popsueurope; + color: @col; } } +body.context-popsu-monde #sidebar-first .left-nav-level-1 ul.menu { + .menu-popsu-sidebar(@beige_popsumonde); +} +body.context-popsu-territoires #sidebar-first .left-nav-level-1 ul.menu { + .menu-popsu-sidebar(@rouge_popsuterritoires); +} +body.context-popsu-metropoles #sidebar-first .left-nav-level-1 ul.menu { + .menu-popsu-sidebar(@bleu_popsumetropoles); +} +body.context-popsu-europe #sidebar-first .left-nav-level-1 ul.menu { + .menu-popsu-sidebar(@gris_popsueurope); +} + body.context-popsu-2 #sidebar-first .left-nav-level-1 ul.menu { li { @@ -465,8 +516,6 @@ body.context-popsu { margin: 0px; padding: 0px; } - - #block-boxes-popsu_logo_baseline { float: left; background: #000 url(../img/logos/baseline.png) no-repeat top left; @@ -479,17 +528,14 @@ body.context-popsu { display: none; } } - .block-wrapper.first { float: left; - .block-boxes { background: url(../img/pixels/sidebar-default-trans.png); margin: 0 5px 0 15px; /* padding-bottom: 27px; */ padding-bottom: 0px; } - } } } @@ -502,74 +548,52 @@ body.sidebar-double.context-popsu-2 #header-wrapper .block-wrapper.first .block- } +.logo_box(@bgimg, @w:60px, @h:65px, @mrg:64px, @float:true){ + + + & when (@float = true) { + width:auto!important; + float:right; + margin-right: 25px; + } + .block-inner { + /*padding: 0 1px 0 0;*/ + a.logo { + display: block; + float: right; + margin: @mrg 0 0 0; + + width: @w; + height: @h; + background: url(@bgimg) no-repeat; + background-size: contain; + // background-position: center; + background-position: right; + text-indent: -999px; + overflow: hidden; + } + } +} + body.context-popsu-1 { #header-wrapper { #block-boxes-popsu_logo_popsu1 { - /* popsu1 */ - - - .block-inner { - /*padding: 0 1px 0 0;*/ - - a.logo { - display: block; - float: right; - margin: 40px 0 0 0; - - width: 193px; - height: 131px; - background: url(../img/logos/popsu1/logo-sidebar-trans.png) no-repeat; - text-indent: -999px; - overflow: hidden; - } - - } + .logo_box('../img/logos/popsu1/logo-sidebar-trans.png', 193px, 131px, 40px, false); } #block-boxes-popsu_logo_popsu2 { - /* popsu2 */ - float: right; - - .block-inner { - - a.logo { - display: block; - margin: 64px 0 0 0; - - width: 101px; - height: 65px; - background: url(../img/logos/popsu2/logo-small-trans.png) no-repeat; - text-indent: -999px; - overflow: hidden; - - float: right; - } - } + .logo_box('../img/logos/popsu2/logo-small-trans.png'); } #block-boxes-popsu_logo_popsueurope { - /* popsu Europe */ - float: right; - - .block-inner { - a.logo { - display: block; - margin: 64px 0 0 0; - - width: 101px; - height: 65px; - background: url(../img/logos/popsueurope/logo-small-trans.png) no-repeat; - text-indent: -999px; - overflow: hidden; - - float: right; - } - } + .logo_box('../img/logos/popsueurope/logo-small-trans.png'); } - #block-boxes-popsu_logo_baseline { - /* baseline */ - .block-inner { - - - } + #block-boxes-popsu_logo_popsuterrritoires { + .logo_box('../img/logos/popsuterritoires/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsumonde { + .logo_box('../img/logos/popsumonde/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsumetropoles{ + .logo_box('../img/logos/popsumetropoles/logo-small-trans.png'); } } } @@ -577,130 +601,127 @@ body.context-popsu-1 { body.context-popsu-2 { #header-wrapper { #block-boxes-popsu_logo_popsu1 { - float: right; - - .block-inner { - a.logo { - display: block; - margin: 64px 0 0 0; - - width: 101px; - height: 65px; - background: url(../img/logos/popsu1/logo-small-trans.png) no-repeat; - text-indent: -999px; - overflow: hidden; - - float: right; - } - } + .logo_box('../img/logos/popsu1/logo-small-trans.png'); } #block-boxes-popsu_logo_popsu2 { - - .block-inner { - a.logo { - display: block; - float: right; - margin: 40px 0 0 0; - - width: 193px; - height: 131px; - background: url(../img/logos/popsu2/logo-sidebar-trans.png) no-repeat; - text-indent: -999px; - overflow: hidden; - } - } + .logo_box('../img/logos/popsu2/logo-sidebar-trans.png', 193px, 131px, 40px, false); } #block-boxes-popsu_logo_popsueurope { - float: right; - - .block-inner { - a.logo { - display: block; - margin: 64px 0 0 0; - - width: 101px; - height: 65px; - background: url(../img/logos/popsueurope/logo-small-trans.png) no-repeat; - text-indent: -999px; - overflow: hidden; - - float: right; - } - } + .logo_box('../img/logos/popsueurope/logo-small-trans.png'); } - #block-boxes-popsu_logo_baseline { - - .block-inner { - - } + #block-boxes-popsu_logo_popsuterrritoires { + .logo_box('../img/logos/popsuterritoires/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsumonde { + .logo_box('../img/logos/popsumonde/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsumetropoles{ + .logo_box('../img/logos/popsumetropoles/logo-small-trans.png'); } } } - body.context-popsu-europe { #header-wrapper { #block-boxes-popsu_logo_popsu1 { - float: right; - - .block-inner { - a.logo { - display: block; - margin: 64px 0 0 0; - - width: 101px; - height: 65px; - background: url(../img/logos/popsu1/logo-small-trans.png) no-repeat; - text-indent: -999px; - overflow: hidden; - - float: right; - } - } + .logo_box('../img/logos/popsu1/logo-small-trans.png'); } #block-boxes-popsu_logo_popsu2 { - float: right; - - .block-inner { - a.logo { - display: block; - margin: 64px 0 0 0; - - width: 101px; - height: 65px; - background: url(../img/logos/popsu2/logo-small-trans.png) no-repeat; - text-indent: -999px; - overflow: hidden; - - float: right; - } - } + .logo_box('../img/logos/popsu2/logo-small-trans.png'); } #block-boxes-popsu_logo_popsueurope { - - .block-inner { - a.logo { - display: block; - float: right; - margin: 40px 0 0 0; - - width: 193px; - height: 131px; - background: url(../img/logos/popsueurope/logo-sidebar-trans.png) no-repeat; - text-indent: -999px; - overflow: hidden; - } - } + .logo_box('../img/logos/popsueurope/logo-sidebar-trans.png', 193px, 131px, 40px, false); } - #block-boxes-popsu_logo_baseline { - - .block-inner { - - } + #block-boxes-popsu_logo_popsuterrritoires { + .logo_box('../img/logos/popsuterritoires/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsumonde { + .logo_box('../img/logos/popsumonde/logo-sidebar-trans.png'); + } + #block-boxes-popsu_logo_popsumetropoles{ + .logo_box('../img/logos/popsumetropoles/logo-small-trans.png'); } } } +body.context-popsu-monde { + #header-wrapper { + #block-boxes-popsu_logo_popsu1 { + .logo_box('../img/logos/popsu1/logo-sidebar-trans.png'); + } + #block-boxes-popsu_logo_popsu2 { + .logo_box('../img/logos/popsu2/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsueurope { + .logo_box('../img/logos/popsueurope/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsuterrritoires { + .logo_box('../img/logos/popsuterritoires/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsumonde { + // width:300px; + .logo_box('../img/logos/popsumonde/logo-sidebar-trans.png', 193px, 131px, 40px, false); + } + #block-boxes-popsu_logo_popsumetropoles{ + .logo_box('../img/logos/popsumetropoles/logo-small-trans.png'); + } + #block-boxes-popsu_logo_baseline { + .block-inner {} + } + } +} + +body.context-popsu-metropoles { + #header-wrapper { + #block-boxes-popsu_logo_popsu1 { + .logo_box('../img/logos/popsu1/logo-sidebar-trans.png'); + } + #block-boxes-popsu_logo_popsu2 { + .logo_box('../img/logos/popsu2/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsueurope { + .logo_box('../img/logos/popsueurope/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsuterrritoires { + .logo_box('../img/logos/popsuterritoires/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsumonde { + .logo_box('../img/logos/popsumonde/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsumetropoles{ + .logo_box('../img/logos/popsumetropoles/logo-sidebar-trans.png', 193px, 131px, 40px, false); + } + #block-boxes-popsu_logo_baseline { + .block-inner {} + } + } +} + +body.context-popsu-territoires { + #header-wrapper { + #block-boxes-popsu_logo_popsu1 { + .logo_box('../img/logos/popsu1/logo-sidebar-trans.png'); + } + #block-boxes-popsu_logo_popsu2 { + .logo_box('../img/logos/popsu2/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsueurope { + .logo_box('../img/logos/popsueurope/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsuterrritoires { + .logo_box('../img/logos/popsuterritoires/logo-sidebar-trans.png', 193px, 131px, 40px, false); + } + #block-boxes-popsu_logo_popsumonde { + .logo_box('../img/logos/popsumonde/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsumetropoles{ + .logo_box('../img/logos/popsumetropoles/logo-small-trans.png'); + } + #block-boxes-popsu_logo_baseline { + .block-inner {} + } + } +} #boxes-box-popsu_menu_trigger { background: #000000; @@ -749,14 +770,8 @@ body.context-popsu-europe { } } - - - - .breadcrumb { display: none; } - - body.context-popsu #header-wrapper .menu-header .block-inner { padding: 0; background: none; @@ -780,7 +795,6 @@ body.context-popsu #header-wrapper .menu-header .block-inner { } } - .openlayers-container { border: 1px solid #999; @@ -852,8 +866,6 @@ body.context-popsu #header-wrapper .menu-header .block-inner { color: #1A171B; } - - body.popsu-neutral-section { #main-wrapper #content-wrapper { width: 96%; @@ -902,22 +914,18 @@ body.popsu-neutral-section { } } - - body.popsu-neutral-section { #header-wrapper { #boxes-box-popsu_logo_popsuneutral { - /* popsu1 */ + /* mainlogo */ float: left; margin-left: 65px; - + // .logo_box('../img/logos/logo-pages-froides-avec-baseline.png', 349px, 150px, 24px); .boxes-box-content { margin: 0 5px 0 15px; - /* padding-bottom: 27px; */ + // /* padding-bottom: 27px; */ padding-bottom: 0px; - - a.logo { display: block; float: right; @@ -929,7 +937,6 @@ body.popsu-neutral-section { text-indent: -999px; overflow: hidden; } - } } } @@ -938,64 +945,22 @@ body.popsu-actu-section, body.popsu-neutral-section { #header-wrapper { #block-boxes-popsu_logo_popsu1 { - /* popsu1 */ - float: right; - margin-right: 25px; - - .block-inner { - a.logo { - display: block; - margin: 64px 0 0 0; - - width: 101px; - height: 65px; - background: url(../img/logos/popsu1/logo-small-trans.png) no-repeat; - text-indent: -999px; - overflow: hidden; - - float: right; - } - } + .logo_box('../img/logos/popsu1/logo-small-trans.png'); } #block-boxes-popsu_logo_popsu2 { - /* popsu2 */ - float: right; - margin-right: 25px; - - .block-inner { - - a.logo { - display: block; - margin: 64px 0 0 0; - - width: 101px; - height: 65px; - background: url(../img/logos/popsu2/logo-small-trans.png) no-repeat; - text-indent: -999px; - overflow: hidden; - - float: right; - } - } + .logo_box('../img/logos/popsu2/logo-small-trans.png'); } #block-boxes-popsu_logo_popsueurope { - /* popsu Europe */ - float: right; - - .block-inner { - a.logo { - display: block; - margin: 64px 0 0 0; - - width: 101px; - height: 65px; - background: url(../img/logos/popsueurope/logo-small-trans.png) no-repeat; - text-indent: -999px; - overflow: hidden; - - float: right; - } - } + .logo_box('../img/logos/popsueurope/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsuterrritoires{ + .logo_box('../img/logos/popsuterritoires/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsumonde{ + .logo_box('../img/logos/popsumonde/logo-small-trans.png'); + } + #block-boxes-popsu_logo_popsumetropoles{ + .logo_box('../img/logos/popsumetropoles/logo-small-trans.png'); } } } @@ -1339,5 +1304,3 @@ body.page-recherche.popsu-neutral-section #main-wrapper #content-wrapper #conten body.node-type-popsu-ville .captioned .flex-caption { margin-top: -20px; } - - diff --git a/sites/default/themes/popsu/less/lib.less b/sites/default/themes/popsu/less/lib.less index f1927be..a8194f5 100644 --- a/sites/default/themes/popsu/less/lib.less +++ b/sites/default/themes/popsu/less/lib.less @@ -3,3 +3,6 @@ @vert_popsu2: #71a024; @gris_popsueurope: #6e6c78; @gris_neutral: #999999; +@beige_popsumonde:#baa580; +@rouge_popsuterritoires:#d90e29; +@bleu_popsumetropoles:#23398d; diff --git a/sites/default/themes/popsu/less/wide.less b/sites/default/themes/popsu/less/wide.less index 0de611a..c46fc70 100644 --- a/sites/default/themes/popsu/less/wide.less +++ b/sites/default/themes/popsu/less/wide.less @@ -2,14 +2,14 @@ @media only screen and (min-width: 1200px) { /* ---------------------------------------------------------------------------*/ - - + + #page { - - + + width: 1090px; - + #main-wrapper { #sidebar-first { margin-left: 75px; @@ -24,7 +24,7 @@ } #block-boxes-popsu_logo_popsueurope { /* attention au contexte POPSU ! */ - margin-right: 75px; + // margin-right: 75px; } } #main-wrapper { @@ -36,7 +36,7 @@ body.front #page { - #main-wrapper { + #main-wrapper { #content-wrapper { margin-left: 90px; width: 86%; @@ -45,7 +45,7 @@ body.front #page { } body.popsu-neutral-section { - #main-wrapper { + #main-wrapper { #content-wrapper { margin-left: 90px; width: 83%; @@ -57,18 +57,18 @@ body.popsu-actu-section { #header-wrapper { #boxes-box-popsu_logo_popsuneutral .boxes-box-content { width: 280px; - + a.logo { margin-left: 74px; } } - + #block-boxes-popsu_logo_baseline { margin-left: 16px; } - + } - + } @@ -76,10 +76,17 @@ body.popsu-actu-section { body.context-popsu-europe #page #header-wrapper { #block-boxes-popsu_logo_popsueurope { - margin-right: 0; + margin-right: 0; } #block-boxes-popsu_logo_popsu2 { - margin-right: 75px; + // margin-right: 75px; + } +} + + +body.context-popsu-monde #page #header-wrapper { + #block-boxes-popsu_logo_popsumonde { + margin-right: 0; } } @@ -93,7 +100,7 @@ body.sidebar-double { #footer-wrapper #footer .region-footer { width: 1090px; } - + #page { width: 1090px; @@ -104,12 +111,12 @@ body.sidebar-double { } /*#content-wrapper { width: 620px; - }*/ + }*/ } #header-wrapper { .block-wrapper.first { margin-left: 0px; - + .block-boxes { background: url(../img/pixels/sidebar-default-trans.png); } @@ -122,7 +129,7 @@ body.sidebar-double { #sidebar-first { #block-menu_block-3 { display: block; - + width: 55%; float: left; background: url(../img/pixels/sidebar-default-trans.png); @@ -133,15 +140,15 @@ body.sidebar-double { min-height: 600px; background: url(../img/pixels/sidebar-popsu1-bis-trans.png); } - - - - - + + + + + } - + } - + } body.sidebar-double.context-popsu-2 #sidebar-first { @@ -166,35 +173,35 @@ body.sidebar-double.context-popsu-1 #sidebar-first .left-nav-level-1 ul.menu { li .nolink, li a { color: @bleu_popsu1; - + } li ul li a:hover { color: @bleu_popsu1; } - + li.active-trail { - - + + a.active-trail { color: @bleu_popsu1; background: url(../img/nav-active-trans.png) no-repeat center right; - margin-right: -15px; + margin-right: -15px; display: block; } } -} +} + - body #block-boxes-popsu_menu_trigger { - display: none; -} + display: none; +} #content-inner .popsu-74-26-stacked .panels-flexible-column-first .field-type-image { margin-left: -23px; @@ -206,4 +213,4 @@ body #block-boxes-popsu_menu_trigger { /* ---------------------------------------------------------------------------*/ } -/* 1200 styles ---------------------------------------------------------------*/ \ No newline at end of file +/* 1200 styles ---------------------------------------------------------------*/ diff --git a/themes/bartik/bartik.info b/themes/bartik/bartik.info index 7633680..a49c03e 100644 --- a/themes/bartik/bartik.info +++ b/themes/bartik/bartik.info @@ -34,8 +34,7 @@ regions[footer] = Footer settings[shortcut_module_link] = 0 -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/themes/garland/garland.info b/themes/garland/garland.info index 3a81d19..b211949 100644 --- a/themes/garland/garland.info +++ b/themes/garland/garland.info @@ -7,8 +7,7 @@ stylesheets[all][] = style.css stylesheets[print][] = print.css settings[garland_width] = fluid -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/themes/seven/seven.info b/themes/seven/seven.info index ce455f5..8b1eb06 100644 --- a/themes/seven/seven.info +++ b/themes/seven/seven.info @@ -13,8 +13,7 @@ regions[page_bottom] = Page bottom regions[sidebar_first] = First sidebar regions_hidden[] = sidebar_first -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284" diff --git a/themes/stark/stark.info b/themes/stark/stark.info index 6c1bc20..e5c5bea 100644 --- a/themes/stark/stark.info +++ b/themes/stark/stark.info @@ -5,8 +5,7 @@ version = VERSION core = 7.x stylesheets[all][] = layout.css -; Information added by Drupal.org packaging script on 2018-03-28 -version = "7.58" +; Information added by Drupal.org packaging script on 2018-04-25 +version = "7.59" project = "drupal" -datestamp = "1522264019" - +datestamp = "1524673284"