This commit is contained in:
2024-05-20 15:37:46 +03:00
commit 00b7dbd0b7
10404 changed files with 3285853 additions and 0 deletions

View File

@ -0,0 +1,206 @@
<?php
namespace Nextend\Framework\WordPress;
use Nextend\Framework\Asset\AssetManager;
use Nextend\Framework\Pattern\SingletonTrait;
use Nextend\WordPress\OutputBuffer;
class AssetInjector {
use SingletonTrait;
private static $cssComment = '<!--n2css-->';
protected $js = '';
protected $css = '';
/**
* @var OutputBuffer
*/
protected $outputBuffer;
private $headTokens = array();
private $useAlternativeAction = false;
protected function init() {
if (is_admin()) {
$this->useAlternativeAction = true;
}
if (defined('WP_CLI') && WP_CLI) {
//Do not start output buffering while WP_CLI active
} else {
$this->outputBuffer = OutputBuffer::getInstance();
if (defined('SMART_SLIDER_OB_START') && SMART_SLIDER_OB_START >= 0) {
$this->outputBuffer->setExtraObStart(SMART_SLIDER_OB_START);
}
$this->addInjectCSSComment();
add_filter('wordpress_prepare_output', array(
$this,
'prepareOutput'
));
}
}
public function prepareOutput($buffer) {
static $once = false;
if (!$once) {
$once = true;
$this->finalizeCssJs();
if (!empty($this->css)) {
$n2cssPos = strpos($buffer, self::$cssComment);
if ($n2cssPos !== false) {
$buffer = substr_replace($buffer, $this->css, $n2cssPos, strlen(self::$cssComment));
$this->css = '';
} else {
$parts = preg_split('/<\/head[\s]*>/i', $buffer, 2);
// There might be no head and it would result a notice.
if (count($parts) == 2) {
list($head, $body) = $parts;
/**
* We must tokenize the HTML comments in the head to prepare for condition CSS/scripts
* Eg.: <!--[if lt IE 9]><link rel='stylesheet' href='ie8.css?ver=1.0' type='text/css' media='all'> <![endif]-->
*/
$head = preg_replace_callback('/<!--.*?-->/s', array(
$this,
'tokenizeHead'
), $head);
$head = preg_replace_callback('/<noscript>.*?<\/noscript>/s', array(
$this,
'tokenizeHead'
), $head);
$lastStylesheetPosition = strrpos($head, "<link rel='stylesheet'");
if ($lastStylesheetPosition === false) {
$lastStylesheetPosition = strrpos($head, "<link rel=\"stylesheet\"");
if ($lastStylesheetPosition === false) {
$lastStylesheetPosition = strrpos($head, "<link");
}
}
if ($lastStylesheetPosition !== false) {
/**
* Find the end of the tag <link tag
*/
$lastStylesheetPositionEnd = strpos($head, ">", $lastStylesheetPosition);
if ($lastStylesheetPositionEnd !== false) {
/**
* Insert CSS after the ending >
*/
$head = substr_replace($head, $this->css, $lastStylesheetPositionEnd + 1, 0);
$this->css = '';
/**
* Restore HTML comments
*/
$head = preg_replace_callback('/<!--TOKEN([0-9]+)-->/', array(
$this,
'restoreHeadTokens'
), $head);
$buffer = $head . '</head>' . $body;
}
}
}
}
}
if ($this->css != '' || $this->js != '') {
$parts = preg_split('/<\/head[\s]*>/', $buffer, 2);
return implode($this->css . $this->js . '</head>', $parts);
}
}
return $buffer;
}
public function tokenizeHead($matches) {
$index = count($this->headTokens);
$this->headTokens[$index] = $matches[0];
return '<!--TOKEN' . $index . '-->';
}
public function restoreHeadTokens($matches) {
return $this->headTokens[$matches[1]];
}
private function finalizeCssJs() {
static $finalized = false;
if (!$finalized) {
$finalized = true;
if (class_exists('\\Nextend\\Framework\\Asset\\AssetManager', false)) {
$this->css = AssetManager::getCSS();
$this->js = AssetManager::getJs();
}
}
return true;
}
public function addInjectCSSComment() {
if (!$this->useAlternativeAction) {
add_action('wp_print_scripts', array(
$this,
'injectCSSComment'
));
} else {
/**
* @see SSDEV-3909
* The Site editor fires the wp_print_scripts action inside a the wp.editSite.initializeEditor script.
* The Widgets editor fires the wp_print_scripts action inside a the wp.editWidgets.initialize script.
* The Customizer fires the wp_print_scripts action inside a the wp.customizeWidgets.initialize script.
*/
add_action('admin_head', array(
$this,
'injectCSSComment'
));
}
}
public function removeInjectCSSComment() {
if (!$this->useAlternativeAction) {
remove_action('wp_print_scripts', array(
$this,
'injectCSSComment'
));
} else {
/**
* @see SSDEV-3909
* The Site editor fires the wp_print_scripts action inside a the wp.editSite.initializeEditor script.
* The Widgets editor fires the wp_print_scripts action inside a the wp.editWidgets.initialize script.
* The Customizer fires the wp_print_scripts action inside a the wp.customizeWidgets.initialize script.
*/
remove_action('admin_head', array(
$this,
'injectCSSComment'
));
}
}
public function injectCSSComment() {
static $once;
if (!$once) {
echo wp_kses(self::$cssComment, array());
$once = true;
}
}
}