From c72f6d0930f65ffa969b51f07cfc5c5c0e1154c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20B=C3=B6hler?= Date: Mon, 13 Jul 2015 13:29:59 +0200 Subject: [PATCH 1/8] Add preliminary support for odt export in datatable and datalist --- helper.php | 17 ++++-- syntax/list.php | 108 ++++++++++++++++++++++++++++++------ syntax/table.php | 139 ++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 217 insertions(+), 47 deletions(-) diff --git a/helper.php b/helper.php index 51752b8..d85acc2 100644 --- a/helper.php +++ b/helper.php @@ -220,7 +220,7 @@ public function ensureAbsoluteId($id) { * @param Doku_Renderer_xhtml $R * @return string */ - function _formatData($column, $value, Doku_Renderer_xhtml $R) { + function _formatData($column, $value, Doku_Renderer $R) { global $conf; $vals = explode("\n", $value); $outs = array(); @@ -274,16 +274,25 @@ function _formatData($column, $value, Doku_Renderer_xhtml $R) { case 'mail': list($id, $title) = explode(' ', $val, 2); $id = $this->_addPrePostFixes($column['type'], $id); - $id = obfuscate(hsc($id)); + if($R->getFormat() == 'xhtml') // Don't obfuscate for ODT export + $id = obfuscate(hsc($id)); if(!$title) { $title = $id; } else { $title = hsc($title); } - if($conf['mailguard'] == 'visible') { + if(($conf['mailguard'] == 'visible') && ($R->getFormat() == 'xhtml')) { $id = rawurlencode($id); } - $outs[] = '' . $title . ''; + switch($R->getFormat()) + { + case 'xhtml': + $outs[] = '' . $title . ''; + break; + case 'odt': + $R->emaillink($id, $title); + break; + } break; case 'url': $val = $this->_addPrePostFixes($column['type'], $val); diff --git a/syntax/list.php b/syntax/list.php index c13d0b3..22f7362 100644 --- a/syntax/list.php +++ b/syntax/list.php @@ -20,10 +20,54 @@ function connectTo($mode) { $this->Lexer->addSpecialPattern('----+ *datalist(?: [ a-zA-Z0-9_]*)?-+\n.*?\n----+', $mode, 'plugin_data_list'); } - protected $before_item = '
  • '; - protected $after_item = '
  • '; - protected $before_val = ''; - protected $after_val = ' '; + protected function before_item(Doku_Renderer $R) + { + switch($R->getFormat()) + { + case 'xhtml': + $R->doc .= '
  • '; + break; + case 'odt': + $R->listitem_open(); + $R->listcontent_open(); + break; + } + return true; + } + + protected function after_item(Doku_Renderer $R) + { + switch($R->getFormat()) + { + case 'xhtml': + $R->doc .= '
  • '; + break; + case 'odt': + $R->listcontent_close(); + $R->listitem_close(); + break; + } + return true; + } + + protected function before_val($class, Doku_Renderer $R) + { + return true; + } + + protected function after_val(Doku_Renderer $R) + { + switch($R->getFormat()) + { + case 'xhtml': + $R->doc .= ' '; + break; + case 'odt': + $R->doc .= ' '; + break; + } + return true; + } /** * Before value in listitem @@ -32,11 +76,11 @@ function connectTo($mode) { * @param int $colno column number * @return string */ - protected function beforeVal(&$data, $colno) { + protected function beforeVal(&$data, $colno, $class, Doku_Renderer $R) { if($data['sepbyheaders'] AND $colno === 0) { - return $data['headers'][$colno]; + $R->doc .= $data['headers'][$colno]; } else { - return $this->before_val; + $this->before_val($class, $R); } } @@ -47,11 +91,11 @@ protected function beforeVal(&$data, $colno) { * @param int $colno * @return string */ - protected function afterVal(&$data, $colno) { + protected function afterVal(&$data, $colno, Doku_Renderer $R) { if($data['sepbyheaders']) { - return $data['headers'][$colno + 1]; + $R->doc .= $data['headers'][$colno + 1]; } else { - return $this->after_val; + $this->after_val($R); } } @@ -62,8 +106,17 @@ protected function afterVal(&$data, $colno) { * @param array $data instruction by handler * @return string html of table header */ - function preList($clist, $data) { - return '
    '; + break; + case 'odt': + $R->listu_close(); + break; + } + return true; } } diff --git a/syntax/table.php b/syntax/table.php index ef98106..42e84a9 100644 --- a/syntax/table.php +++ b/syntax/table.php @@ -223,10 +223,63 @@ function handle($match, $state, $pos, Doku_Handler $handler) { return $data; } - protected $before_item = ''; - protected $after_item = ''; - protected $before_val = ''; - protected $after_val = ''; + protected function before_item(Doku_Renderer $R) + { + switch($R->getFormat()) + { + case 'xhtml': + $R->doc .= ''; + break; + case 'odt': + $R->tablerow_open(); + break; + } + return true; + } + + protected function after_item(Doku_Renderer $R) + { + switch($R->getFormat()) + { + case 'xhtml': + $R->doc .= ''; + break; + case 'odt': + $R->tablerow_close(); + break; + } + return true; + } + + protected function before_val($class, Doku_Renderer $R) + { + switch($R->getFormat()) + { + case 'xhtml': + $R->doc .= sprintf("", $class); + break; + case 'odt': + $R->tablecell_open(); + $R->p_open(); + break; + } + return true; + } + + protected function after_val(Doku_Renderer $R) + { + switch($R->getFormat()) + { + case 'xhtml': + $R->doc .= ''; + break; + case 'odt': + $R->p_close(); + $R->tablecell_close(); + break; + } + return true; + } /** * Handles the actual output creation. @@ -237,7 +290,7 @@ function handle($match, $state, $pos, Doku_Handler $handler) { * @return boolean rendered correctly? (however, returned value is not used at the moment) */ function render($format, Doku_Renderer $R, $data) { - if($format != 'xhtml') return false; + if(($format != 'xhtml') && ($format != 'odt')) return false; /** @var Doku_Renderer_xhtml $R */ if(is_null($data)) return false; @@ -286,28 +339,27 @@ function render($format, Doku_Renderer $R, $data) { } //start table/list - $R->doc .= $this->preList($clist, $data); + $this->preList($clist, $data, $R); foreach($rows as $rownum => $row) { // build data rows - $R->doc .= $this->before_item; + $this->before_item($R); if($data['rownumbers']) { - $R->doc .= sprintf($this->before_val, 'class="' . $classes[0] . '"'); + $this->before_val('class="' . $classes[0] . '"', $R); $R->doc .= $rownum + 1; - $R->doc .= $this->after_val; + $this->after_val($R); } foreach(array_values($row) as $num => $cval) { $num_rn = $num + $offset; - $R->doc .= sprintf($this->beforeVal($data, $num_rn), 'class="' . $classes[$num_rn] . '"'); + $this->beforeVal($data, $num_rn, 'class="' . $classes[$num_rn] . '"', $R); $R->doc .= $this->dthlp->_formatData( $data['cols'][$clist[$num]], $cval, $R ); - $R->doc .= $this->afterVal($data, $num_rn); - + $this->afterVal($data, $num_rn, $R); // clean currency symbols $nval = str_replace('$€₤', '', $cval); $nval = str_replace('/ [A-Z]{0,3}$/', '', $nval); @@ -323,9 +375,9 @@ function render($format, Doku_Renderer $R, $data) { } } - $R->doc .= $this->after_item; + $this->after_item($R); } - $R->doc .= $this->postList($data, $cnt); + $this->postList($data, $cnt, $R); return true; } @@ -337,8 +389,8 @@ function render($format, Doku_Renderer $R, $data) { * @param int $colno column number * @return string */ - protected function beforeVal(&$data, $colno) { - return $this->before_val; + protected function beforeVal(&$data, $colno, $class, Doku_Renderer $R) { + return $this->before_val($class, $R); } /** @@ -348,8 +400,8 @@ protected function beforeVal(&$data, $colno) { * @param int $colno * @return string */ - protected function afterVal(&$data, $colno) { - return $this->after_val; + protected function afterVal(&$data, $colno, Doku_Renderer $R) { + return $this->after_val($R); } /** @@ -359,7 +411,7 @@ protected function afterVal(&$data, $colno) { * @param array $data instruction by handler * @return string html of table header */ - function preList($clist, $data) { + function preList($clist, $data, Doku_Renderer $R) { global $ID; global $conf; @@ -459,7 +511,33 @@ function preList($clist, $data) { $text .= ''; } - return $text; + switch($R->getFormat()) + { + case 'xhtml': + $R->doc .= $text; + break; + case 'odt': + $R->p_close(); + $ncols = count($data['headers']); + if($data['rownumbers']) + $ncols += 1; + $R->table_open($ncols); + $R->tablerow_open(); + if($data['rownumbers']) + { + $R->tableheader_open(); + $R->tableheader_close(); + } + foreach($data['headers'] as $num => $head) + { + $R->tableheader_open(); + $R->doc .= $head; + $R->tableheader_close(); + } + $R->tablerow_close(); + break; + } + return true; } /** @@ -469,14 +547,15 @@ function preList($clist, $data) { * @param array $clist keys of the columns * @param Doku_Renderer $R */ - function nullList($data, $clist, $R) { - $R->doc .= $this->preList($clist, $data); + function nullList($data, $clist, Doku_Renderer $R) { + $this->preList($clist, $data, $R); $R->tablerow_open(); $R->tablecell_open(count($clist), 'center'); $R->cdata($this->getLang('none')); $R->tablecell_close(); $R->tablerow_close(); - $R->doc .= ''; + $this->postList($R); + return true; } /** @@ -486,7 +565,7 @@ function nullList($data, $clist, $R) { * @param int $rowcnt number of rows * @return string html of table footer */ - function postList($data, $rowcnt) { + function postList($data, $rowcnt, Doku_Renderer $R) { global $ID; $text = ''; // if summarize was set, add sums @@ -550,7 +629,17 @@ function postList($data, $rowcnt) { } $text .= ''; - return $text; + + switch($R->getFormat()) + { + case 'xhtml': + $R->doc .= $text; + break; + case 'odt': + $R->table_close(); + break; + } + return true; } /** From 3bcf52f4e23761fd32011469ba2c572953fa6bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20B=C3=B6hler?= Date: Mon, 13 Jul 2015 14:17:29 +0200 Subject: [PATCH 2/8] Fix empty list output --- syntax/table.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/table.php b/syntax/table.php index 42e84a9..aac7e02 100644 --- a/syntax/table.php +++ b/syntax/table.php @@ -554,7 +554,7 @@ function nullList($data, $clist, Doku_Renderer $R) { $R->cdata($this->getLang('none')); $R->tablecell_close(); $R->tablerow_close(); - $this->postList($R); + $this->postList($data, 0, $R); return true; } From ad3b9a2ad82dd7b3eac6ff23280dd993057b5993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20B=C3=B6hler?= Date: Tue, 14 Jul 2015 10:07:23 +0200 Subject: [PATCH 3/8] Nearly fix remaining options in _formatData --- helper.php | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/helper.php b/helper.php index d85acc2..d787b9d 100644 --- a/helper.php +++ b/helper.php @@ -274,29 +274,16 @@ function _formatData($column, $value, Doku_Renderer $R) { case 'mail': list($id, $title) = explode(' ', $val, 2); $id = $this->_addPrePostFixes($column['type'], $id); - if($R->getFormat() == 'xhtml') // Don't obfuscate for ODT export - $id = obfuscate(hsc($id)); if(!$title) { $title = $id; } else { $title = hsc($title); } - if(($conf['mailguard'] == 'visible') && ($R->getFormat() == 'xhtml')) { - $id = rawurlencode($id); - } - switch($R->getFormat()) - { - case 'xhtml': - $outs[] = '' . $title . ''; - break; - case 'odt': - $R->emaillink($id, $title); - break; - } + $outs[] = $R->emaillink($id, $title); break; case 'url': $val = $this->_addPrePostFixes($column['type'], $val); - $outs[] = $this->external_link($val, false, 'urlextern'); + $outs[] = $R->externallink($val); break; case 'tag': // per default use keyname as target page, but prefix on aliases @@ -306,9 +293,12 @@ function _formatData($column, $value, Doku_Renderer $R) { $target = $this->_addPrePostFixes($column['type'], ''); } - $outs[] = '' . hsc($val) . ''; + $params = buildURLparams($this->_getTagUrlparam($column, $val)); + $url = str_replace('/', ':', cleanID($target)) . '?' . $params; + // FIXME: The title is lost when moving to $R->internallink, + // but this syntax is required to support different renderers. + // $title = sprintf($this->getLang('tagfilter'), hsc($val)); + $R->internallink($url, hsc($val)); break; case 'timestamp': $outs[] = dformat($val); @@ -335,7 +325,7 @@ function _formatData($column, $value, Doku_Renderer $R) { } $instructions = array_slice($allinstructions, $wraps, -$wraps); - $outs[] = p_render('xhtml', $instructions, $byref_ignore); + $outs[] = p_render($R->getFormat(), $instructions, $byref_ignore); $ID = $oldid; break; default: From 5cf7853679f58e930e75f56bbd442409df65f14f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20B=C3=B6hler?= Date: Wed, 15 Jul 2015 19:15:43 +0200 Subject: [PATCH 4/8] Render only to $outs[], instead of directly to the renderer --- helper.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/helper.php b/helper.php index d787b9d..afaa79d 100644 --- a/helper.php +++ b/helper.php @@ -279,11 +279,11 @@ function _formatData($column, $value, Doku_Renderer $R) { } else { $title = hsc($title); } - $outs[] = $R->emaillink($id, $title); + $outs[] = $R->emaillink($id, $title, true); break; case 'url': $val = $this->_addPrePostFixes($column['type'], $val); - $outs[] = $R->externallink($val); + $outs[] = $R->externallink($val, null, true); break; case 'tag': // per default use keyname as target page, but prefix on aliases @@ -298,7 +298,7 @@ function _formatData($column, $value, Doku_Renderer $R) { // FIXME: The title is lost when moving to $R->internallink, // but this syntax is required to support different renderers. // $title = sprintf($this->getLang('tagfilter'), hsc($val)); - $R->internallink($url, hsc($val)); + $outs[] = $R->internallink($url, hsc($val), true); break; case 'timestamp': $outs[] = dformat($val); From 783d290fdf342c51ed77b286ecab6823e6cfff45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20B=C3=B6hler?= Date: Wed, 29 Jul 2015 14:27:04 +0200 Subject: [PATCH 5/8] Update documentation and remove useless 'return true' --- helper.php | 4 ++-- syntax/list.php | 53 +++++++++++++++++++++++++++++--------------- syntax/table.php | 57 ++++++++++++++++++++++++++++++------------------ 3 files changed, 73 insertions(+), 41 deletions(-) diff --git a/helper.php b/helper.php index afaa79d..9714c9f 100644 --- a/helper.php +++ b/helper.php @@ -213,11 +213,11 @@ public function ensureAbsoluteId($id) { } /** - * Return XHTML formated data, depending on column type + * Return formated data, depending on column type * * @param array $column * @param string $value - * @param Doku_Renderer_xhtml $R + * @param Doku_Renderer $R * @return string */ function _formatData($column, $value, Doku_Renderer $R) { diff --git a/syntax/list.php b/syntax/list.php index 22f7362..37fc6c3 100644 --- a/syntax/list.php +++ b/syntax/list.php @@ -20,6 +20,11 @@ function connectTo($mode) { $this->Lexer->addSpecialPattern('----+ *datalist(?: [ a-zA-Z0-9_]*)?-+\n.*?\n----+', $mode, 'plugin_data_list'); } + /** + * Before item in list + * + * @param Doku_Renderer $R + */ protected function before_item(Doku_Renderer $R) { switch($R->getFormat()) @@ -32,9 +37,13 @@ protected function before_item(Doku_Renderer $R) $R->listcontent_open(); break; } - return true; } + /** + * After item in list + * + * @param Doku_Renderer $R + */ protected function after_item(Doku_Renderer $R) { switch($R->getFormat()) @@ -47,14 +56,24 @@ protected function after_item(Doku_Renderer $R) $R->listitem_close(); break; } - return true; } + /** + * Before value in listitem + * + * @param string $class The CSS class + * @param Doku_Renderer $R + */ protected function before_val($class, Doku_Renderer $R) { - return true; + return; } + /** + * After value in listitem + * + * @param Doku_Renderer $R + */ protected function after_val(Doku_Renderer $R) { switch($R->getFormat()) @@ -66,15 +85,15 @@ protected function after_val(Doku_Renderer $R) $R->doc .= ' '; break; } - return true; } /** * Before value in listitem * - * @param array $data instructions by handler - * @param int $colno column number - * @return string + * @param array $data instructions by handler + * @param int $colno column number + * @param string $class the xhtml class + * @param Doku_Renderer $R the current DokuWiki renderer */ protected function beforeVal(&$data, $colno, $class, Doku_Renderer $R) { if($data['sepbyheaders'] AND $colno === 0) { @@ -87,9 +106,9 @@ protected function beforeVal(&$data, $colno, $class, Doku_Renderer $R) { /** * After value in listitem * - * @param array $data - * @param int $colno - * @return string + * @param array $data + * @param int $colno + * @param Doku_Renderer $R */ protected function afterVal(&$data, $colno, Doku_Renderer $R) { if($data['sepbyheaders']) { @@ -102,9 +121,9 @@ protected function afterVal(&$data, $colno, Doku_Renderer $R) { /** * Create list header * - * @param array $clist keys of the columns - * @param array $data instruction by handler - * @return string html of table header + * @param array $clist keys of the columns + * @param array $data instruction by handler + * @param Doku_Renderer $R the current DokuWiki renderer */ function preList($clist, $data, Doku_Renderer $R) { switch($R->getFormat()) @@ -116,7 +135,6 @@ function preList($clist, $data, Doku_Renderer $R) { $R->listu_open(); break; } - return true; } /** @@ -145,9 +163,9 @@ function nullList($data, $clist, Doku_Renderer $R) { /** * Create list footer * - * @param array $data instruction by handler() - * @param int $rowcnt number of rows - * @return string html of table footer + * @param array $data instruction by handler() + * @param int $rowcnt number of rows + * @param Doku_Renderer $R the current DokuWiki renderer */ function postList($data, $rowcnt, Doku_Renderer $R) { switch($R->getFormat()) @@ -159,7 +177,6 @@ function postList($data, $rowcnt, Doku_Renderer $R) { $R->listu_close(); break; } - return true; } } diff --git a/syntax/table.php b/syntax/table.php index aac7e02..9c79779 100644 --- a/syntax/table.php +++ b/syntax/table.php @@ -223,6 +223,11 @@ function handle($match, $state, $pos, Doku_Handler $handler) { return $data; } + /** + * Before item in list + * + * @param Doku_Renderer $R + */ protected function before_item(Doku_Renderer $R) { switch($R->getFormat()) @@ -234,9 +239,13 @@ protected function before_item(Doku_Renderer $R) $R->tablerow_open(); break; } - return true; } + /** + * After item in list + * + * @param Doku_Renderer $R + */ protected function after_item(Doku_Renderer $R) { switch($R->getFormat()) @@ -248,9 +257,14 @@ protected function after_item(Doku_Renderer $R) $R->tablerow_close(); break; } - return true; } + /** + * Before value in listitem + * + * @param string $class The CSS class + * @param Doku_Renderer $R + */ protected function before_val($class, Doku_Renderer $R) { switch($R->getFormat()) @@ -263,9 +277,13 @@ protected function before_val($class, Doku_Renderer $R) $R->p_open(); break; } - return true; } + /** + * After value in listitem + * + * @param Doku_Renderer $R + */ protected function after_val(Doku_Renderer $R) { switch($R->getFormat()) @@ -278,7 +296,6 @@ protected function after_val(Doku_Renderer $R) $R->tablecell_close(); break; } - return true; } /** @@ -385,31 +402,32 @@ function render($format, Doku_Renderer $R, $data) { /** * Before value in table cell * - * @param array $data instructions by handler - * @param int $colno column number - * @return string + * @param array $data instructions by handler + * @param int $colno column number + * @param string $class the xhtml class + * @param Doku_Renderer $R the current DokuWiki renderer */ protected function beforeVal(&$data, $colno, $class, Doku_Renderer $R) { - return $this->before_val($class, $R); + $this->before_val($class, $R); } /** * After value in table cell * - * @param array $data - * @param int $colno - * @return string + * @param array $data + * @param int $colno + * @param Doku_Renderer $R */ protected function afterVal(&$data, $colno, Doku_Renderer $R) { - return $this->after_val($R); + $this->after_val($R); } /** * Create table header * - * @param array $clist keys of the columns - * @param array $data instruction by handler - * @return string html of table header + * @param array $clist keys of the columns + * @param array $data instruction by handler + * @param Doku_Renderer $R the current DokuWiki renderer */ function preList($clist, $data, Doku_Renderer $R) { global $ID; @@ -537,7 +555,6 @@ function preList($clist, $data, Doku_Renderer $R) { $R->tablerow_close(); break; } - return true; } /** @@ -555,15 +572,14 @@ function nullList($data, $clist, Doku_Renderer $R) { $R->tablecell_close(); $R->tablerow_close(); $this->postList($data, 0, $R); - return true; } /** * Create table footer * - * @param array $data instruction by handler() - * @param int $rowcnt number of rows - * @return string html of table footer + * @param array $data instruction by handler() + * @param int $rowcnt number of rows + * @param Doku_Renderer $R the current DokuWiki renderer */ function postList($data, $rowcnt, Doku_Renderer $R) { global $ID; @@ -639,7 +655,6 @@ function postList($data, $rowcnt, Doku_Renderer $R) { $R->table_close(); break; } - return true; } /** From c888f359186fd453852e7a87aea0037c34eb40dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20B=C3=B6hler?= Date: Wed, 29 Jul 2015 14:54:18 +0200 Subject: [PATCH 6/8] Choose old/new formatting method based on DokuWiki version --- helper.php | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 174 insertions(+), 1 deletion(-) diff --git a/helper.php b/helper.php index 9714c9f..010a417 100644 --- a/helper.php +++ b/helper.php @@ -212,6 +212,179 @@ public function ensureAbsoluteId($id) { return $id; } + /** + * Return formated data, depending on column type and DokuWiki version + * + * @param array $column + * @param string $value + * @param Doku_Renderer $R + * @return string + */ + function _formatData($column, $value, Doku_Renderer $R) + { + $dwVersion = getVersionData(); + if(isset($dwVersion['date'])) + { + preg_match('/(\d+)-(\d+)-(\d+)/',$dwVersion['date'],$dwDate); + if(mktime(0, 0, 0, $dwDate[2], $dwDate[3], $dwDate[1]) > mktime(0, 0, 0, 07, 19, 2015)) + { + return $this->_formatDataNew($column, $value, $R); + } + } + return $this->_formatDataOld($column, $value, $R); + } + + /** + * Return XHTML formated data, depending on column type + * + * @param array $column + * @param string $value + * @param Doku_Renderer $R + * @return string + */ + function _formatDataOld($column, $value, Doku_Renderer $R) { + global $conf; + $vals = explode("\n", $value); + $outs = array(); + + //multivalued line from db result for pageid and wiki has only in first value the ID + $storedID = ''; + + foreach($vals as $val) { + $val = trim($val); + if($val == '') continue; + + $type = $column['type']; + if(is_array($type)) { + $type = $type['type']; + } + switch($type) { + case 'page': + $val = $this->_addPrePostFixes($column['type'], $val); + $val = $this->ensureAbsoluteId($val); + $outs[] = $R->internallink($val, null, null, true); + break; + case 'title': + list($id, $title) = explode('|', $val, 2); + $id = $this->_addPrePostFixes($column['type'], $id); + $id = $this->ensureAbsoluteId($id); + $outs[] = $R->internallink($id, $title, null, true); + break; + case 'pageid': + list($id, $title) = explode('|', $val, 2); + + //use ID from first value of the multivalued line + if($title == null) { + $title = $id; + if(!empty($storedID)) { + $id = $storedID; + } + } else { + $storedID = $id; + } + + $id = $this->_addPrePostFixes($column['type'], $id); + + $outs[] = $R->internallink($id, $title, null, true); + break; + case 'nspage': + // no prefix/postfix here + $val = ':' . $column['key'] . ":$val"; + + $outs[] = $R->internallink($val, null, null, true); + break; + case 'mail': + list($id, $title) = explode(' ', $val, 2); + $id = $this->_addPrePostFixes($column['type'], $id); + $id = obfuscate(hsc($id)); + if(!$title) { + $title = $id; + } else { + $title = hsc($title); + } + if($conf['mailguard'] == 'visible') { + $id = rawurlencode($id); + } + $outs[] = '' . $title . ''; + break; + case 'url': + $val = $this->_addPrePostFixes($column['type'], $val); + $outs[] = $this->external_link($val, false, 'urlextern'); + break; + case 'tag': + // per default use keyname as target page, but prefix on aliases + if(!is_array($column['type'])) { + $target = $column['key'] . ':'; + } else { + $target = $this->_addPrePostFixes($column['type'], ''); + } + + $outs[] = '' . hsc($val) . ''; + break; + case 'timestamp': + $outs[] = dformat($val); + break; + case 'wiki': + global $ID; + $oldid = $ID; + list($ID, $data) = explode('|', $val, 2); + + //use ID from first value of the multivalued line + if($data == null) { + $data = $ID; + $ID = $storedID; + } else { + $storedID = $ID; + } + $data = $this->_addPrePostFixes($column['type'], $data); + + // Trim document_{start,end}, p_{open,close} from instructions + $allinstructions = p_get_instructions($data); + $wraps = 1; + if(isset($allinstructions[1]) && $allinstructions[1][0] == 'p_open') { + $wraps ++; + } + $instructions = array_slice($allinstructions, $wraps, -$wraps); + + $outs[] = p_render('xhtml', $instructions, $byref_ignore); + $ID = $oldid; + break; + default: + $val = $this->_addPrePostFixes($column['type'], $val); + //type '_img' or '_img' + if(substr($type, 0, 3) == 'img') { + $width = (int) substr($type, 3); + if(!$width) { + $width = $this->getConf('image_width'); + } + + list($mediaid, $title) = explode('|', $val, 2); + if($title === null) { + $title = $column['key'] . ': ' . basename(str_replace(':', '/', $mediaid)); + } else { + $title = trim($title); + } + + if(media_isexternal($val)) { + $html = $R->externalmedia($mediaid, $title, $align = null, $width, $height = null, $cache = null, $linking = 'direct', true); + } else { + $html = $R->internalmedia($mediaid, $title, $align = null, $width, $height = null, $cache = null, $linking = 'direct', true); + } + if(strpos($html, 'mediafile') === false) { + $html = str_replace('href', 'rel="lightbox" href', $html); + } + + $outs[] = $html; + } else { + $outs[] = hsc($val); + } + } + } + return join(', ', $outs); + } + /** * Return formated data, depending on column type * @@ -220,7 +393,7 @@ public function ensureAbsoluteId($id) { * @param Doku_Renderer $R * @return string */ - function _formatData($column, $value, Doku_Renderer $R) { + function _formatDataNew($column, $value, Doku_Renderer $R) { global $conf; $vals = explode("\n", $value); $outs = array(); From 37c355cb267ff2b57eb6c6e373426ddf4a68b097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20B=C3=B6hler?= Date: Fri, 31 Jul 2015 08:43:02 +0200 Subject: [PATCH 7/8] Fix remaining tests and add a new test for external URL generation --- _test/helper.test.php | 24 ++++++++++++++++++++---- helper.php | 22 ++++++++++++++++------ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/_test/helper.test.php b/_test/helper.test.php index c85c59e..7cba7ac 100644 --- a/_test/helper.test.php +++ b/_test/helper.test.php @@ -133,6 +133,18 @@ function testFormatData() { $helper = new helper_plugin_data(); $renderer = new data_dummy_renderer(); + $dwVersion = getVersionData(); + + $matchString = 'http://www.dokuwiki.org'; + if(isset($dwVersion['date'])) + { + preg_match('/(\d+)-(\d+)-(\d+)/',$dwVersion['date'],$dwDate); + if(mktime(0, 0, 0, $dwDate[2], $dwDate[3], $dwDate[1]) > mktime(0, 0, 0, 07, 19, 2015)) + { + $matchString = 'http://www.dokuwiki.org'; + } + } + $this->assertEquals('value1, value2, val', $helper->_formatData(array('type' => ''), "value1\n value2\n val", $renderer)); @@ -156,16 +168,20 @@ function testFormatData() { $helper->_formatData(array('type' => 'mail'), "pa:ge some user", $renderer)); $conf['mailguard'] = 'visible'; - $this->assertEquals('pa:ge', + $this->assertEquals('pa:ge', $helper->_formatData(array('type' => 'mail'), "pa:ge", $renderer)); - $this->assertEquals('some user', + $this->assertEquals('some user', $helper->_formatData(array('type' => 'mail'), "pa:ge some user", $renderer)); - $this->assertEquals('url', + $this->assertEquals('url', $helper->_formatData(array('type' => 'url'), "url", $renderer)); - $this->assertEquals('value', + // This test's output is different across dokuwiki versions (order of arguments) + $this->assertEquals($matchString, + $helper->_formatData(array('type' => 'url'), "http://www.dokuwiki.org", $renderer)); + + $this->assertEquals('link: ?dataflt%5B0%5D=_%3Dvalue value', $helper->_formatData(array('type' => 'tag'), "value", $renderer)); $this->assertEquals(strftime('%Y/%m/%d %H:%M', 1234567), diff --git a/helper.php b/helper.php index 010a417..771601c 100644 --- a/helper.php +++ b/helper.php @@ -297,6 +297,7 @@ function _formatDataOld($column, $value, Doku_Renderer $R) { list($id, $title) = explode(' ', $val, 2); $id = $this->_addPrePostFixes($column['type'], $id); $id = obfuscate(hsc($id)); + $titleId = $id; if(!$title) { $title = $id; } else { @@ -305,11 +306,21 @@ function _formatDataOld($column, $value, Doku_Renderer $R) { if($conf['mailguard'] == 'visible') { $id = rawurlencode($id); } - $outs[] = '' . $title . ''; + $outs[] = '' . $title . ''; break; case 'url': $val = $this->_addPrePostFixes($column['type'], $val); - $outs[] = $this->external_link($val, false, 'urlextern'); + $url = $val; + $schemes = getSchemes(); + list($scheme) = explode('://', $url); + if(!in_array($scheme, $schemes)) $url = ''; + + // is there still an URL? + if(!$url) { + $outs[] = $val; + } else { + $outs[] = $this->external_link($val, false, 'urlextern'); + } break; case 'tag': // per default use keyname as target page, but prefix on aliases @@ -318,10 +329,9 @@ function _formatDataOld($column, $value, Doku_Renderer $R) { } else { $target = $this->_addPrePostFixes($column['type'], ''); } - - $outs[] = '' . hsc($val) . ''; + $params = buildURLparams($this->_getTagUrlparam($column, $val)); + $url = str_replace('/', ':', cleanID($target)) . '?' . $params; + $outs[] = $R->internallink($url, hsc($val), true); break; case 'timestamp': $outs[] = dformat($val); From 25f9fa9458d18b14d174c98e3657eb5b458516a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20B=C3=B6hler?= Date: Fri, 31 Jul 2015 08:58:28 +0200 Subject: [PATCH 8/8] Update date in conditional statement --- _test/helper.test.php | 2 +- helper.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_test/helper.test.php b/_test/helper.test.php index 7cba7ac..9be35c3 100644 --- a/_test/helper.test.php +++ b/_test/helper.test.php @@ -139,7 +139,7 @@ function testFormatData() { if(isset($dwVersion['date'])) { preg_match('/(\d+)-(\d+)-(\d+)/',$dwVersion['date'],$dwDate); - if(mktime(0, 0, 0, $dwDate[2], $dwDate[3], $dwDate[1]) > mktime(0, 0, 0, 07, 19, 2015)) + if(mktime(0, 0, 0, $dwDate[2], $dwDate[3], $dwDate[1]) > mktime(0, 0, 0, 7, 30, 2015)) { $matchString = 'http://www.dokuwiki.org'; } diff --git a/helper.php b/helper.php index 771601c..b7bbec4 100644 --- a/helper.php +++ b/helper.php @@ -226,7 +226,7 @@ function _formatData($column, $value, Doku_Renderer $R) if(isset($dwVersion['date'])) { preg_match('/(\d+)-(\d+)-(\d+)/',$dwVersion['date'],$dwDate); - if(mktime(0, 0, 0, $dwDate[2], $dwDate[3], $dwDate[1]) > mktime(0, 0, 0, 07, 19, 2015)) + if(mktime(0, 0, 0, $dwDate[2], $dwDate[3], $dwDate[1]) > mktime(0, 0, 0, 7, 30, 2015)) { return $this->_formatDataNew($column, $value, $R); }