LegacyAssetsTrait.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. /**
  3. * @package Grav\Common\Assets\Traits
  4. *
  5. * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Common\Assets\Traits;
  9. use Grav\Common\Assets;
  10. use function count;
  11. use function is_array;
  12. use function is_int;
  13. /**
  14. * Trait LegacyAssetsTrait
  15. * @package Grav\Common\Assets\Traits
  16. */
  17. trait LegacyAssetsTrait
  18. {
  19. /**
  20. * @param array $args
  21. * @param string $type
  22. * @return array
  23. */
  24. protected function unifyLegacyArguments($args, $type = Assets::CSS_TYPE)
  25. {
  26. // First argument is always the asset
  27. array_shift($args);
  28. if (count($args) === 0) {
  29. return [];
  30. }
  31. // New options array format
  32. if (count($args) === 1 && is_array($args[0])) {
  33. return $args[0];
  34. }
  35. // Handle obscure case where options array is mixed with a priority
  36. if (count($args) === 2 && is_array($args[0]) && is_int($args[1])) {
  37. $arguments = $args[0];
  38. $arguments['priority'] = $args[1];
  39. return $arguments;
  40. }
  41. switch ($type) {
  42. case (Assets::JS_TYPE):
  43. $defaults = ['priority' => null, 'pipeline' => true, 'loading' => null, 'group' => null];
  44. $arguments = $this->createArgumentsFromLegacy($args, $defaults);
  45. break;
  46. case (Assets::INLINE_JS_TYPE):
  47. $defaults = ['priority' => null, 'group' => null, 'attributes' => null];
  48. $arguments = $this->createArgumentsFromLegacy($args, $defaults);
  49. // special case to handle old attributes being passed in
  50. if (isset($arguments['attributes'])) {
  51. $old_attributes = $arguments['attributes'];
  52. if (is_array($old_attributes)) {
  53. $arguments = array_merge($arguments, $old_attributes);
  54. } else {
  55. $arguments['type'] = $old_attributes;
  56. }
  57. }
  58. unset($arguments['attributes']);
  59. break;
  60. case (Assets::INLINE_CSS_TYPE):
  61. $defaults = ['priority' => null, 'group' => null];
  62. $arguments = $this->createArgumentsFromLegacy($args, $defaults);
  63. break;
  64. default:
  65. case (Assets::CSS_TYPE):
  66. $defaults = ['priority' => null, 'pipeline' => true, 'group' => null, 'loading' => null];
  67. $arguments = $this->createArgumentsFromLegacy($args, $defaults);
  68. }
  69. return $arguments;
  70. }
  71. /**
  72. * @param array $args
  73. * @param array $defaults
  74. * @return array
  75. */
  76. protected function createArgumentsFromLegacy(array $args, array $defaults)
  77. {
  78. // Remove arguments with old default values.
  79. $arguments = [];
  80. foreach ($args as $arg) {
  81. $default = current($defaults);
  82. if ($arg !== $default) {
  83. $arguments[key($defaults)] = $arg;
  84. }
  85. next($defaults);
  86. }
  87. return $arguments;
  88. }
  89. /**
  90. * Convenience wrapper for async loading of JavaScript
  91. *
  92. * @param string|array $asset
  93. * @param int $priority
  94. * @param bool $pipeline
  95. * @param string $group name of the group
  96. * @return Assets
  97. * @deprecated Please use dynamic method with ['loading' => 'async'].
  98. */
  99. public function addAsyncJs($asset, $priority = 10, $pipeline = true, $group = 'head')
  100. {
  101. user_error(__CLASS__ . '::' . __FUNCTION__ . '() is deprecated since Grav 1.6, use dynamic method with [\'loading\' => \'async\']', E_USER_DEPRECATED);
  102. return $this->addJs($asset, $priority, $pipeline, 'async', $group);
  103. }
  104. /**
  105. * Convenience wrapper for deferred loading of JavaScript
  106. *
  107. * @param string|array $asset
  108. * @param int $priority
  109. * @param bool $pipeline
  110. * @param string $group name of the group
  111. * @return Assets
  112. * @deprecated Please use dynamic method with ['loading' => 'defer'].
  113. */
  114. public function addDeferJs($asset, $priority = 10, $pipeline = true, $group = 'head')
  115. {
  116. user_error(__CLASS__ . '::' . __FUNCTION__ . '() is deprecated since Grav 1.6, use dynamic method with [\'loading\' => \'defer\']', E_USER_DEPRECATED);
  117. return $this->addJs($asset, $priority, $pipeline, 'defer', $group);
  118. }
  119. }