*/
class action_plugin_tablewidth extends DokuWiki_Action_Plugin {
/**
* Register callbacks
*/
public function register(Doku_Event_Handler $controller) {
$controller->register_hook('RENDERER_CONTENT_POSTPROCESS', 'AFTER', $this, 'replaceComments');
}
/**
* Replace table-width comments by HTML
*/
public function replaceComments(&$event, $param) {
if ($event->data[0] == 'xhtml') {
$pattern = '/(\n)([^\n]*
)(\s*data[1], $match, $flags) > 0) {
$start = 0;
$html = '';
foreach ($match as $data) {
$html .= substr($event->data[1], $start, $data[0][1] - $start);
$html .= $this->processTable($data);
$start = $data[0][1] + strlen($data[0][0]);
}
$event->data[1] = $html . substr($event->data[1], $start);;
}
}
}
/**
* Convert table-width comments and table mark-up into final HTML
*/
private function processTable($data) {
preg_match('//', $data[1][0], $match);
$width = preg_split('/\s+/', $match[1]);
$tableWidth = array_shift($width);
if ($tableWidth != '-') {
$table = $this->styleTable($data[2][0], $tableWidth);
}
else {
$table = $data[2][0];
}
return $table . $this->renderColumns($width) . $data[3][0];
}
/**
* Add width style to the table
*/
private function styleTable($html, $width) {
preg_match('/^([^\n]*)$/', $html, $match);
$entry = $match[1];
$attributes = $match[2];
$exit = $match[3];
$widthStyle = 'min-width: 0px; width: ' . $width . ';';
if (preg_match('/(.*?style\s*=\s*(["\']).*?)(\2.*)/', $attributes, $match) == 1) {
$attributes = $match[1] . '; ' . $widthStyle . $match[3];
}
else {
$attributes .= ' style="' . $widthStyle . '"';
}
return $entry . $attributes . $exit;
}
/**
* Render column tags
*/
private function renderColumns($width) {
$html = DOKU_LF;
foreach ($width as $w) {
if ($w != '-') {
$html .= '';
}
else {
$html .= '';
}
}
return $html;
}
}