register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'add_php_data');
$controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handle_ajax');
$controller->register_hook('PARSER_WIKITEXT_PREPROCESS', 'AFTER', $this, 'parser_preprocess_handler');
$controller->register_hook('TOOLBAR_DEFINE', 'AFTER', $this, 'insert_button', array ());
}
public function insert_button (Doku_Event $event, $param) {
$event->data[] = array (
'type' => 'format',
'title' => $this->getLang('toolbar_insert_button'),
'icon' => '../../plugins/dtable/images/add_table.png',
'open' => '',
'close' => '',
'sample' => "\n^ ^ ^\n| | |\n| | |\n| | |\n"
);
}
function parser_preprocess_handler(&$event, $parm)
{
global $ID, $INFO;
$lines = explode("\n", $event->data);
$new_lines = array();
//determine dtable page
//only 100 dtables per page
$i = 0;
$dtable_pages = array();
foreach($lines as $line)
{
if(strpos($line, '') === 0) {
$new_lines[] = '';
$dtable_pages[$i] = $ID;
$i++;
} else
{
$new_lines[] = $line;
}
}
//it will make include plugin behaves correctly
p_set_metadata($INFO['id'] ?? null, array('dtable_pages' => $dtable_pages), false, false);
//mark dtables
//it will not work becouse section editing in dokuwiki needs no modified content.
if($this->getConf('all_tables'))
{
$new_lines = array();
$in_tab = 0;
$in_dtable_tag = 0;
foreach($lines as $line)
{
if(strpos($line, '') === 0)
$in_dtable_tag = 1;
if(strpos($line, '') === 0)
$in_dtable_tag = 0;
if(strpos($line, '|') !== 0 && $in_tab == 1 && $in_dtable_tag == 0)
{
$new_lines[] = '';
$in_tab = 0;
}
if(strpos($line, '^') === 0 && $in_tab == 0 && $in_dtable_tag == 0)
{
$new_lines[] = '';
$in_tab = 1;
}
$new_lines[] = $line;
}
$lines = $new_lines;
}
$event->data = implode("\n", $new_lines);
}
function add_php_data(&$event, $param) {
global $JSINFO, $ID;
if (auth_quickaclcheck($ID) >= AUTH_EDIT)
$JSINFO['write'] = true;
else
$JSINFO['write'] = false;
$JSINFO['disabled'] = explode(',', $this->getConf('disabled'));
$JSINFO['lang']['insert_before'] = $this->getLang('insert_before');
$JSINFO['lang']['insert_after'] = $this->getLang('insert_after');
$JSINFO['lang']['edit'] = $this->getLang('edit');
$JSINFO['lang']['remove'] = $this->getLang('remove');
$JSINFO['lang']['insert_col_left'] = $this->getLang('insert_col_left');
$JSINFO['lang']['insert_col_right'] = $this->getLang('insert_col_right');
$JSINFO['lang']['mark_row_as_header'] = $this->getLang('mark_row_as_header');
$JSINFO['lang']['mark_col_as_header'] = $this->getLang('mark_col_as_header');
$JSINFO['lang']['mark_cell_as_header'] = $this->getLang('mark_cell_as_header');
$JSINFO['lang']['mark_row_as_cell'] = $this->getLang('mark_row_as_cell');
$JSINFO['lang']['mark_col_as_cell'] = $this->getLang('mark_col_as_cell');
$JSINFO['lang']['mark_cell_as_cell'] = $this->getLang('mark_cell_as_cell');
$JSINFO['lang']['show_merged_rows'] = $this->getLang('show_merged_rows');
$JSINFO['lang']['lock_notify'] = str_replace(
array('%u', '%t'),
array('', ''),
$this->getLang('lock_notify'));
$JSINFO['lang']['unlock_notify'] = $this->getLang('unlock_notify');
}
function handle_ajax(&$event, $param)
{
global $conf;
switch($event->data)
{
case 'dtable':
$event->preventDefault();
$event->stopPropagation();
list($dtable_start_line, $dtable_page_id) = explode('_', $_POST['table'], 2);
$file = wikiFN( $dtable_page_id );
if( ! @file_exists( $file ) )
{
echo json_encode( array('type' => 'error', 'msg' => 'This page does not exist.') );
exit(0);
}
$dtable = plugin_load('helper', 'dtable');
$page_lines = explode( "\n", io_readFile( $file ) );
if(isset($_POST['remove']))
{
$scope = json_decode($_POST['remove'], true);
$lines_to_remove = array();
for ($i = $scope[0]; $i <= $scope[1]; $i++)
$lines_to_remove[] = $i;
$removed_line = '';
foreach ($lines_to_remove as $line) {
$removed_line .= $page_lines[ $line ]." ";
}
array_splice($page_lines, $scope[0], $scope[1] - $scope[0] + 1);
$new_cont = implode( "\n", $page_lines );
saveWikiText($dtable_page_id, $new_cont, $this->getLang('summary_remove').' '.$removed_line);
echo json_encode( array('type' => 'success', 'spans' =>
$dtable->get_spans($dtable_start_line, $page_lines, $dtable_page_id) ) );
} else
{
$cols = array();
$new_table_line = array();
foreach( $_POST as $k => $v )
{
if( strpos( $k, 'col' ) === 0)
{
//remove col from col12, col1 etc. to be 12 1
$cols[(int)substr($k, 3)] = json_decode($v, true);
}
}
ksort($cols);
//reset index
$cols = array_values($cols);
$j = 0;
for($i = 0; $i < count($cols); $i++) {
$class = $cols[$i][0];
$value = $cols[$i][1];
if ($value == '' && $j >= 1)
$new_table_line[$j-1][1]++;
else {
$type = $class == 'tablecell_open' ? '|' : '^';
$new_table_line[$j] = array(1, 1, $type, $value);
$j++;
}
}
$new_line = $dtable->format_row($cols);
if( isset( $_POST['add'] ) )
{
$action = 'add';
/*$table_line = (int) $_POST['add'] + 1;
$line_to_add = $dtable_start_line + $table_line;*/
$line_to_add = (int) $_POST['add'] + 1;
array_splice($page_lines, $line_to_add, 0, $new_line );
$line_nr = $line_to_add;
$info = $this->getLang('summary_add').' '.$new_line;
} elseif( isset( $_POST['edit'] ) )
{
$action = 'edit';
$scope = json_decode($_POST['edit'], true);
$lines_to_change = array();
for ($i = $scope[0]; $i <= $scope[1]; $i++)
$lines_to_change[] = $i;
$old_line= '';
foreach ($lines_to_change as $line) {
$old_line .= $page_lines[ $line ]." ";
}
//$old_line = $page_lines[ $line_to_change ];
array_splice($page_lines, $scope[0], $scope[1] - $scope[0] + 1, $new_line);
$line_nr = $scope[0];
$new_cont = implode( "\n", $page_lines );
$info = str_replace( array('%o', '%n'), array($old_line, $new_line), $this->getLang('summary_edit') );
}
$new_cont = implode( "\n", $page_lines );
saveWikiText($dtable_page_id, $new_cont, $info);
echo json_encode( array('type' => 'success', 'action' => $action, 'new_row' => $dtable->parse_line($new_line, $dtable_page_id), 'raw_row' => array($new_table_line, array($line_nr, $line_nr)), 'spans' => $dtable->get_spans($dtable_start_line, $page_lines, $dtable_page_id) ) );
}
break;
case 'dtable_page_lock':
$event->preventDefault();
$event->stopPropagation();
$ID = $_POST['page'];
lock($ID);
break;
case 'dtable_page_unlock':
$event->preventDefault();
$event->stopPropagation();
$ID = $_POST['page'];
unlock($ID);
break;
case 'dtable_is_page_locked':
$event->preventDefault();
$event->stopPropagation();
$ID = $_POST['page'];
$checklock = checklock($ID);
//check when lock expire
$lock_file = wikiLockFN($ID);
if(file_exists($lock_file))
{
$locktime = filemtime(wikiLockFN($ID));
//dokuwiki uses dformat here but we will use raw unix timesamp
$expire = $locktime + $conf['locktime'] - time();
} else
$expire = $conf['locktime'];
if($checklock === false)
echo json_encode(array('locked' => 0, 'time_left' => $expire));
else
echo json_encode(array('locked' => 1, 'who' => $checklock, 'time_left' => $expire));
break;
}
}
}