1
0
Fork 0
dokuwiki-plugins-extra/plugins/55/edittable/renderer/json.php
Daniel Baumann 778f9ac0bf
Adding edittable version 2023-01-14 (66785d9).
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-03-24 19:33:14 +01:00

153 lines
4.7 KiB
PHP

<?php
/**
* Table Renderer for Table Editor
*
* This renderer will use the inverse renderer to create Wiki text for everything inside the table. The table
* it self is stored in two arrays which then can be outputted as JSON.
*
* @author Andreas Gohr <gohr@cosmocode.de>
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*/
// must be run within Dokuwiki
if (!defined('DOKU_INC')) die();
require_once DOKU_PLUGIN . "/edittable/renderer/inverse.php";
class renderer_plugin_edittable_json extends renderer_plugin_edittable_inverse {
/** @var array holds the data cells */
private $tdata = array();
/** @var array holds the cell meta data */
private $tmeta = array();
/** @var array holds the meta data of the current cell */
private $tmetacell = array();
/** @var int current row */
private $current_row = -1;
/** @var int current column */
private $current_col = 0;
/**
* Returns the whole table data as two dimensional array
*
* @return array
*/
public function getDataJSON() {
return json_encode($this->tdata);
}
/**
* Returns meta data for all cells in a two dimensional array of arrays
*
* @return array
*/
public function getMetaJSON() {
return json_encode($this->tmeta);
}
// renderer functions below
function table_open($maxcols = null, $numrows = null, $pos = null) {
// FIXME: is this needed somewhere? $this->_counter['table_begin_pos'] = strlen($this->doc);
}
function table_close($pos = null) {
}
function tablerow_open() {
// move counters
$this->current_row++;
$this->current_col = 0;
}
function tablerow_close() {
// resort just for better debug readability
ksort($this->tdata[$this->current_row]);
ksort($this->tmeta[$this->current_row]);
}
function tableheader_open($colspan = 1, $align = null, $rowspan = 1) {
$this->_tablefield_open('th', $colspan, $align, $rowspan);
}
function tableheader_close() {
$this->_tablefield_close();
}
function tablecell_open($colspan = 1, $align = null, $rowspan = 1) {
$this->_tablefield_open('td', $colspan, $align, $rowspan);
}
function tablecell_close() {
$this->_tablefield_close();
}
/**
* Used for a opening THs and TDs
*
* @param $tag
* @param $colspan
* @param $align
* @param $rowspan
*/
private function _tablefield_open($tag, $colspan, $align, $rowspan) {
// skip cells that already exist - those are previous (span) cells!
while(isset($this->tmeta[$this->current_row][$this->current_col])) {
$this->current_col++;
}
// remember these, we use them when closing
$this->tmetacell = array();
$this->tmetacell['tag'] = $tag;
$this->tmetacell['colspan'] = $colspan;
$this->tmetacell['rowspan'] = $rowspan;
$this->tmetacell['align'] = $align;
// empty $doc
$this->doc = '';
}
/**
* Used for closing THs and TDs
*/
private function _tablefield_close() {
// these have been set to the correct cell already
$row = $this->current_row;
$col = $this->current_col;
$this->tdata[$row][$col] = trim(str_replace("\n", ' ', $this->doc)); // no newlines in table cells!
$this->tmeta[$row][$col] = $this->tmetacell; // as remembered in the open call
// now fill up missing span cells
{
$rowspan = $this->tmetacell['rowspan'];
$colspan = $this->tmetacell['colspan'];
for($c = 1; $c < $colspan; $c++) {
// hide colspanned cell in same row
$this->tmeta[$row][$col + $c]['hide'] = true;
$this->tmeta[$row][$col + $c]['rowspan'] = 1;
$this->tmeta[$row][$col + $c]['colspan'] = 1;
$this->tdata[$row][$col + $c] = '';
// hide colspanned rows below if rowspan is in effect as well
for($r = 1; $r < $rowspan; $r++) {
$this->tmeta[$row + $r][$col + $c]['hide'] = true;
$this->tmeta[$row + $r][$col + $c]['rowspan'] = 1;
$this->tmeta[$row + $r][$col + $c]['colspan'] = 1;
$this->tdata[$row + $r][$col + $c] = '';
}
}
// hide rowspanned columns
for($r = 1; $r < $rowspan; $r++) {
$this->tmeta[$row + $r][$col]['hide'] = true;
$this->tmeta[$row + $r][$col]['rowspan'] = 1;
$this->tmeta[$row + $r][$col]['colspan'] = 1;
$this->tdata[$row + $r][$col] = ':::';
}
}
}
}