contentClass = $contentClass;
$this->m_queries = $this->getMQKeys();
}
public function roundKB($size) {
$kb = round($size, 2);
return $kb . ' KB';
}
// We need m_queries, which is not available on the fronted preferences
public function getMQKeys(){
$p = get_option('preferences_themer_loader');
if ($p){
return $p['m_queries'];
}
return null;
}
public function getKeyFromQuery($query){
$key = 'all-devices';
if ($this->m_queries && $query !== $key){
foreach ($this->m_queries as $mq_key => $array){
if (trim($query) === trim($array['query'])){
return $mq_key;
}
}
}
return $key;
}
public function generateHTML($debugAmends, &$modList, &$profiler, &$memoryProfiler, &$clientSide, &$logsArray, &$lazy) {
$display = '';
$devData = '';
// show debug data
if ($debugAmends){
// Performance table (time + memory)
$zeroClientMods = empty($clientSide['clientModsCount']) ? 1 : 0;
$zeroServerMods = empty($clientSide['serverModsCount']) ? 1 : 0;
$zeroMods = $zeroClientMods && $zeroServerMods;
// --- Time ---
$assetPrepTime = !$zeroMods && isset($profiler['preparing_client_side_assets']['total_time'])
? $profiler['preparing_client_side_assets']['total_time'] * 1000 // to ms
: 0;
$assetPrepLabel = round($assetPrepTime, 2).' ms';
$htmlModsLabel = $zeroServerMods ? '0 ms' : 'checking...';
$totalModsLabel = $zeroServerMods ? $assetPrepLabel : 'checking...';
// --- Memory (avg net retained + max peak overhead) ---
$assetPrepMemDelta = !$zeroMods && isset($memoryProfiler['preparing_client_side_assets']['avg_delta'])
? $memoryProfiler['preparing_client_side_assets']['avg_delta']
: 0;
$assetPrepMemDeltaLabel = $this->formatBytes($assetPrepMemDelta);
$htmlAdjustMemDeltaLabel = $zeroServerMods
? $this->formatBytes(0)
: 'checking...';
$totalMemDeltaLabel = $zeroServerMods
? $assetPrepMemDeltaLabel
: 'checking...';
$assetPrepPeak = isset($memoryProfiler['preparing_client_side_assets']['max_peak_window'])
? $memoryProfiler['preparing_client_side_assets']['max_peak_window']
: 0;
$assetPrepPeakLabel = $this->formatBytes($assetPrepPeak);
$htmlAdjustPeakLabel = $zeroServerMods
? $this->formatBytes(0)
: 'checking...';
$totalPeak = $zeroServerMods
? $assetPrepPeakLabel
: 'checking...';
// --- Table HTML ---
$performance = '
';
/*
* Net Memory Retained:
'.$assetPrepMemDeltaLabel.'
'.$htmlAdjustMemDeltaLabel.'
'.$totalMemDeltaLabel.'
Peak Extra Allocation:
'.$assetPrepPeakLabel.'
'.$htmlAdjustPeakLabel.'
'.$totalPeak.'
*/
// User CSS (todo need to include MT CSS)
$css = implode("\n", $clientSide['css']);
// JS functions and file contents
$js = !$zeroClientMods && $clientSide['inline_functions']
? "// Inline JS Functions \n" . $clientSide['inline_functions']
: '';
foreach ($clientSide['js'] as $slug){
$js.= "// ".$slug.".js\n" .
file_get_contents($this->contentClass->getLocalJsFile($slug, 0, 0, 1)) . "\n\n";
}
$this->contentClass->accumulateSizeKB(
'user_css',
$clientSide,
$css
);
$this->contentClass->accumulateSizeKB(
'user_js',
$clientSide,
$js
);
$asset_size = $clientSide['asset_size'];
$totalSize = 0;
if (!$zeroClientMods){
foreach ($asset_size as $key => $value){
if ($key === 'debug_only_data'){
$totalSize -= $value;
} else {
$totalSize += $value;
}
}
}
$size = '
CSS
JS
JS Packages
Modifications JSON
Amender Scripts
Total Size
'.$this->roundKB($asset_size['user_css']).'
'.$this->roundKB($asset_size['user_js']).'
'.$this->roundKB($asset_size['user_packages']).'
'.
($zeroClientMods
? '0 KB'
: $this->roundKB($asset_size['amender_inline'] - $asset_size['debug_only_data'])
)
.'
'.
($zeroClientMods
? '0 KB'
: $this->roundKB($asset_size['amender_packages'])
)
.'
'.$this->roundKB($totalSize).'
';
$user_packages = '
Package
Size
Version
URL
';
$hasPackages = false;
// Show message about no modifications if relevant
if ($zeroMods){
$table = 'No modifications have been made.';
}
else {
$table = '
Edit
Event
Devices
Selector
Action
Aspect
Content
';
//$debugRows = array();
/*foreach ($modList as $item){
$item[3] = esc_html($item[3]);
//$debugRows[] = $item;
$table.=
'
serverHTMLReady
'.esc_html($item[6]).'
'.esc_html($item[5]).'
'.esc_html($item[1]['action']).'
'.esc_html($item[1]['aspect']).'
'.esc_html($item[3]).'
';
}*/
// Server and client side amendments (always dyn when reviewing)
foreach ($clientSide['mods'] as $event => $devices){
foreach ($devices as $query => $selectors){
foreach ($selectors as $selectorId => $data){
foreach ($data['mods'] as $index => $modData){
$mod = $modData['mod'];
$table.=
'
Edit
'.esc_html($event).'
'.esc_html($query).'
'.esc_html($data['selectorCode']).'
'.esc_html($mod['action']).'
'.esc_html($mod['aspect']).'
'.esc_html($modData['debugValue']).'
';
}
}
}
}
$table.= '
';
}
// List packages, including size breakdown
foreach ($clientSide['import_map'] as $packageName => $one){
$dep = $this->contentClass->getDependencyInfo($packageName);
$dep['deliveryUrl'] = $this->contentClass->deliveryUrl(
$dep,
$dep['value'],
$this->contentClass->assetClass->micro_root_dir . 'mt/js/'.$this->contentClass->assetClass->fileStub.'/npm/'
);
$url = $dep['deliveryUrl'];
$user_packages.= '
'.$dep['value'].'
'.$dep['size'].' KB
'.$dep['version'].'
';
$hasPackages = true;
/*$devData.= '
Package: '.esc_html($packageName).'
'.esc_html(print_r($dep, 1)).'
';*/
}
$user_packages.= '
Total
'.$this->roundKB($asset_size['user_packages']).'
';
// Dev only
if ($this->contentClass->devMode){
$devData.= 'Dev clientSide
'.esc_html(print_r($clientSide, 1)).'
';
// Lazyloaded content
$devData.= 'Lazy content
'.esc_html(print_r($lazy, 1)).'
';
}
$packagesList = $hasPackages
? '
JS Packages
'.$user_packages.'
'
: '';
// '.print_r($debugRows, 1).'
$display.= '
Server-side Performance
'.$performance.'
Asset Size
'.$size.'
Modifications
'.$table.'
'.($css
? '
CSS
'
: '').
($js
? '
JS
'
: '').'
' . $packagesList . $devData.'
';
}
// Show errors
if (count($logsArray)){
$heading = 'Amender errors ('.count($logsArray).')
';
$logs = '';
foreach ($logsArray as $item){
$data = $item['data']
? ''.esc_html(print_r($item['data'], 1)).'
'
: '';
$logs.= '
'.$item['message'].'
'.$data.'
';
}
$display.= '
';
}
return $display;
}
}