$attributes['tableWidth'],
'max-width' => $attributes['tableWidth'],
'color' => $attributes['fontColor'] ?? '',
'font-size' => $attributes['fontSize'] ?? '',
'--tableberg-global-link-color' => $attributes['linkColor'] ?? '',
'--tableberg-even-bg' => $even_row_bg,
'--tableberg-odd-bg' => $odd_row_bg,
'--tableberg-header-bg' => $header_bg,
'--tableberg-footer-bg' => $footer_bg,
'border-spacing' => ($table_spacing['top'] ?? 0) . ' ' . ($table_spacing['left'] ?? 0),
]
+ Utils::get_spacing_style($attributes['cellPadding'], '--tableberg-cell-padding')
+ $inner_border_variables
+ $cell_radius;
foreach (['top', 'left'] as $k) {
if (isset($cellSpacing[$k]) && $cellSpacing[$k] !== '0') {
$separateBorder = true;
}
}
if ($separateBorder) {
$styles['border-collapse'] = 'separate';
} else {
$styles += $table_border_css;
$styles['border-collapse'] = 'collapse';
}
return Utils::generate_css_string($styles);
}
/**
* Class if styling is applied.
*
* @param array $attributes The block attributes.
* @return array CSS classes based on attributes.
*/
public function get_style_class($attributes)
{
$table_width = $attributes['tableWidth'];
$enable_inner_border = $attributes['enableInnerBorder'];
$classes = array();
if ($enable_inner_border) {
$classes[] = 'has-inner-border';
}
$is_value_empty = function ($value) {
return (
is_null($value) ||
false === $value ||
trim($value) === '' ||
trim($value) === 'undefined undefined undefined' ||
empty ($value)
);
};
if (!$is_value_empty($table_width)) {
$classes[] = 'has-table-width';
}
return $classes;
}
private static function setRowColSizes($content, $attributes)
{
$heights = $attributes['rowHeights'];
$widths = $attributes['colWidths'];
$lastIdx = 0;
foreach ($heights as $height) {
$idx = strpos($content, '
';
if ($attributes['fixedColWidth']) {
$cols = sizeof($widths);
$w = 100 / $cols.'%';
for ($i = 0; $i < $cols; $i++) {
$colgroup .= "";
}
} else {
foreach ($widths as $w) {
$colgroup .= "";
}
}
$colgroup .= '';
$content = HtmlUtils::insert_inside_tag($content, 'table', $colgroup);
return $content;
}
private function even_odd_rows($attributes, $content)
{
$even_color = Utils::get_background_color($attributes, 'evenRowBackgroundColor', 'evenRowBackgroundGradient');
$odd_color = Utils::get_background_color($attributes, 'oddRowBackgroundColor', 'oddRowBackgroundGradient');
if (!$even_color && !$odd_color) {
return $content;
}
$cursor = 0;
$i = 0;
$end = $attributes['rows'] - 1;
if ($attributes['enableTableHeader']) {
$i = 1;
$content = HtmlUtils::append_attr_value($content, 'tr', '', 'class', 0, $cursor);
}
if ($attributes['enableTableFooter']) {
$end -= 1;
}
for (; $i <= $end; $i++) {
$content = HtmlUtils::append_attr_value($content, 'tr', $i % 2 ? 'tableberg-even-row' : 'tableberg-odd-row', 'class', $cursor + 1, $cursor);
}
return $content;
}
private static function get_responsiveness_metadata($attributes, $device)
{
if (!isset($attributes["responsive"])) {
return '';
}
$responsive = $attributes["responsive"]["breakpoints"];
$str = " ";
if (isset($responsive[$device]) && $responsive[$device]["enabled"]) {
$deviceOpts = $responsive[$device];
$str .= 'data-tableberg-' . $device . '-width="' . $deviceOpts["maxWidth"] . '" ';
$str .= 'data-tableberg-' . $device . '-mode="' . $deviceOpts["mode"] . '" ';
$str .= 'data-tableberg-' . $device . '-direction="' . $deviceOpts["direction"] . '" ';
$str .= 'data-tableberg-' . $device . '-count="' . $deviceOpts["stackCount"] . '" ';
if ($deviceOpts["headerAsCol"] && $attributes['enableTableHeader']) {
$str .= 'data-tableberg-' . $device . '-header="' . $deviceOpts["headerAsCol"] . '" ';
}
}
return $str;
}
/**
* Renders the custom table block on the server.
*
* @param array $attributes The block attributes.
* @param string $content The block content.
* @param WP_Block $block The block object.
* @return string Returns the HTML content for the custom table block.
*/
public function render_tableberg_table_block($attributes, $content, $block)
{
$table_class_names = $this->get_style_class($attributes);
$table_style = $this->get_styles($attributes);
$table_attrs = 'class = "' . esc_attr(trim(join(' ', $table_class_names))) . '" style="' . $table_style . '"';
$content = HtmlUtils::insert_inside_tag($content, 'table', '
');
$content = HtmlUtils::replace_attrs_of_tag($content, 'table', $table_attrs);
$content = HtmlUtils::replace_closing_tag($content, 'table', '');
if ($attributes['enableTableHeader']) {
$content = HtmlUtils::append_attr_value($content, 'tr', ' tableberg-header', 'class');
$bg_color = Utils::get_background_color($attributes, 'headerBackgroundColor', 'headerBackgroundGradient');
if ($bg_color) {
$bg_color = esc_attr($bg_color);
$content = HtmlUtils::append_attr_value($content, 'tr', "background: {$bg_color} !important;", 'style');
}
}
if ($attributes['enableTableFooter']) {
$footer_idx = strrpos($content, ' trim(join(' ', $wrapper_classes)),
]);
return '' . $content . '
';
}
/**
* Register the block.
*/
public function block_registration()
{
$tableberg_assets = new \Tableberg\Assets();
$tableberg_assets->register_blocks_assets();
if (!is_admin()) {
$tableberg_assets->register_frontend_assets();
}
$jsonPath = TABLEBERG_DIR_PATH . 'build/block.json';
$attrs = json_decode(file_get_contents($jsonPath), true)['attributes'];
register_block_type_from_metadata(
$jsonPath,
[
'attributes' => $attrs,
'render_callback' => array($this, 'render_tableberg_table_block'),
]
);
}
}