PageRenderTime 45ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/main/lib/web/webpacker/converter.php

https://gitlab.com/alexprowars/bitrix
PHP | 223 lines | 165 code | 27 blank | 31 comment | 17 complexity | 502fc9224af790218eacaae4cd432a0a MD5 | raw file
  1. <?php
  2. namespace Bitrix\Main\Web\WebPacker;
  3. use Bitrix\Main\InvalidOperationException;
  4. use Bitrix\Main\Localization\Loc;
  5. use Bitrix\Main\Web\Json;
  6. /**
  7. * Class Converter
  8. *
  9. * @package Bitrix\Main\Web\WebPacker
  10. */
  11. class Converter
  12. {
  13. const CORE_EXTENSION = 'ui.webpacker';
  14. protected static $hasCoreExtension = false;
  15. /**
  16. * Stringify module.
  17. *
  18. * @param Builder $builder Builder.
  19. * @return string
  20. */
  21. public static function stringify(Builder $builder)
  22. {
  23. self::$hasCoreExtension = $builder->hasCoreExtension();
  24. if (self::$hasCoreExtension)
  25. {
  26. $content = Json::encode([
  27. 'address' => Builder::getDefaultSiteUri()
  28. ]);
  29. $content = "var webPacker = $content;" . self::getEol();
  30. }
  31. else
  32. {
  33. $content = '';
  34. }
  35. foreach ($builder->getModules() as $module)
  36. {
  37. $moduleContent = self::encodeModule($module);
  38. $content .= self::wrap($moduleContent) . self::getEol();
  39. }
  40. return self::wrap($content);
  41. }
  42. /**
  43. * Wrap by closure.
  44. *
  45. * @param string $content Content.
  46. * @return string
  47. */
  48. protected static function wrap($content)
  49. {
  50. return <<<EOD
  51. ;(function () {
  52. $content
  53. })();
  54. EOD;
  55. }
  56. /**
  57. * Encode module.
  58. *
  59. * @param Module $module Module.
  60. * @return string
  61. */
  62. protected static function encodeModule(Module $module)
  63. {
  64. $name = $module->getName();
  65. $content = '';
  66. if (!self::isCoreExtension($name) && self::$hasCoreExtension)
  67. {
  68. $name = \CUtil::jsEscape($name);
  69. $content = "var module = new webPacker.module('$name');" . self::getEol(1);
  70. if ($module->getProfile())
  71. {
  72. $properties = $module->getProfile()->getProperties();
  73. if (count($properties) > 0)
  74. {
  75. $properties = Json::encode($properties);
  76. $content .= "module.setProperties($properties);" . self::getEol(1);
  77. }
  78. }
  79. }
  80. if ($module->getPackage())
  81. {
  82. $content .= self::encodePackage($module->getPackage(), $module->getProfile());
  83. }
  84. if ($module->getProfile())
  85. {
  86. $method = $module->getProfile()->getCallMethod();
  87. if ($method)
  88. {
  89. $parameter = $module->getProfile()->getCallParameter();
  90. $parameter = $parameter ? Json::encode($parameter) : '{}';
  91. $content .= "$method($parameter);";
  92. }
  93. }
  94. return $content;
  95. }
  96. /**
  97. * Encode resource package.
  98. *
  99. * @param Resource\Package $package Package.
  100. * @param Resource\Profile $profile Profile.
  101. * @return string
  102. */
  103. protected static function encodePackage(Resource\Package $package, Resource\Profile $profile = null)
  104. {
  105. $content = '';
  106. foreach ($package::getOrderedTypeList() as $type)
  107. {
  108. $assets = $package->getAssets($type);
  109. if (empty($assets))
  110. {
  111. continue;
  112. }
  113. switch ($type)
  114. {
  115. case Resource\Asset::CSS:
  116. case Resource\Asset::LAYOUT:
  117. if (!self::$hasCoreExtension)
  118. {
  119. throw new InvalidOperationException("Resource of type `$type` not allowed without core extension.");
  120. }
  121. $resources = $list = Json::encode($package->toArray($type));
  122. $content .= "module.loadResources($resources);" . self::getEol();
  123. break;
  124. case Resource\Asset::JS:
  125. foreach ($assets as $asset)
  126. {
  127. $content .= $asset->getContent() . self::getEol();
  128. }
  129. break;
  130. case Resource\Asset::LANG:
  131. if (!self::$hasCoreExtension)
  132. {
  133. throw new InvalidOperationException("Resource of type `$type` not allowed without core extension.");
  134. }
  135. $messages = [];
  136. $languages = [];
  137. $language = ($profile ? $profile->getLanguage() : null) ?: Loc::getCurrentLang();
  138. $isAllLangs = $profile ? $profile->isAllLangs() : false;
  139. foreach ($assets as $asset)
  140. {
  141. /** @var Resource\LangAsset $asset */
  142. $mess = $asset->useAllLangs($isAllLangs)->getContent();
  143. if (!is_array($mess))
  144. {
  145. break;
  146. }
  147. if ($profile)
  148. {
  149. foreach ($mess as $messLanguage => $messList)
  150. {
  151. $messList = Resource\LangAsset::deletePrefixes(
  152. $messList,
  153. $profile->getDeleteLangPrefixes()
  154. );
  155. if ($profile->isLangCamelCase())
  156. {
  157. $messList = Resource\LangAsset::toCamelCase($messList);
  158. }
  159. if (!is_array($messages[$messLanguage]))
  160. {
  161. $messages[$messLanguage] = [];
  162. }
  163. $messages[$messLanguage] = array_merge(
  164. $messages[$messLanguage],
  165. $messList
  166. );
  167. }
  168. }
  169. $languages = array_unique(array_merge(
  170. $languages,
  171. array_keys($messages)
  172. ));
  173. }
  174. if (count($messages) === 1)
  175. {
  176. $messages = current($messages);
  177. }
  178. $messages = Json::encode($messages);
  179. $languages = Json::encode($languages);
  180. $content .= "module.language = \"$language\";" . self::getEol(1);
  181. $content .= "module.languages = $languages;" . self::getEol(1);
  182. $content .= "module.messages = $messages;" . self::getEol();
  183. break;
  184. }
  185. }
  186. return $content;
  187. }
  188. protected static function getEol($multiplier = 2)
  189. {
  190. return str_repeat("\n", $multiplier);
  191. }
  192. protected static function isCoreExtension($name)
  193. {
  194. return self::CORE_EXTENSION === $name;
  195. }
  196. }