From ba1898695dc3a0807ac469bd3a8cec5c6507af73 Mon Sep 17 00:00:00 2001 From: wlx Date: Sun, 16 Oct 2011 14:53:15 +0000 Subject: [PATCH] use WikiFormat to deal with the table format --- .../default/controllers/DataController.php | 194 +----------------- 1 file changed, 5 insertions(+), 189 deletions(-) diff --git a/application/default/controllers/DataController.php b/application/default/controllers/DataController.php index bfa64c14..ed7ff408 100755 --- a/application/default/controllers/DataController.php +++ b/application/default/controllers/DataController.php @@ -189,7 +189,7 @@ class DataController extends Zend_Controller_Action $row=$state->fetchAll(); $sum=$row[0]['count']; $select=$db->select(); - $select->from('metadata','*')->order('title')->limitPage($page,$limit); + $select->from('metadata','*')->order('id desc')->limitPage($page,$limit); $this->view->metadata = $db->fetchAll($select); $this->view->page=new Pagination($sum,$page,$limit); } @@ -1389,8 +1389,9 @@ class DataController extends Zend_Controller_Action $dom = new DOMDocument(); $dom->loadXML($row['data']); - //提前对表格进行预处理 - $abs=$this->parseTable($this->view->escape($row["description"])); + //提前对表格进行预处理 + $wiki=new WikiFormat(); + $abs=$wiki->parseTable($this->view->escape($row["description"])); //处理外部链接 $abs=preg_replace('/\[\s*(http:\/\/.+?)\s+(.*?)\]/m','$2',$abs); $abs=str_replace(array("\r\n", "\n", "\r"),'

',$abs); @@ -1439,191 +1440,6 @@ class DataController extends Zend_Controller_Action ->setHeader('Cache-Control','must-revalidate, post-check=0, pre-check=0') ->setHeader('Pragma','public') ->setBody($content); - } - - - - - /** - * parse the wiki syntax used to render tables, code modified from mediawiki - * - * @private - */ - function parseTable ( $text ) { - $lines = explode ( "\n" , $text ); - $td_history = array (); // Is currently a td tag open? - $last_tag_history = array (); // Save history of last lag activated (td, th or caption) - $tr_history = array (); // Is currently a tr tag open? - $tr_attributes = array (); // history of tr attributes - $has_opened_tr = array(); // Did this table open a element? - $indent_level = 0; // indent level of the table - foreach ( $lines as $key => $line ) - { - $line = trim ( $line ); - - if( $line == '' ) { // empty line, go to next line - continue; - } - $first_character = $line{0}; - $matches = array(); - - if ( preg_match( '/^(:*)\{\|(.*)$/' , $line , $matches ) ) { - // First check if we are starting a new table - $indent_level = strlen( $matches[1] ); - - $lines[$key] = str_repeat( '

' , $indent_level ) . ""; - array_push ( $td_history , false ); - array_push ( $last_tag_history , '' ); - array_push ( $tr_history , false ); - array_push ( $tr_attributes , '' ); - array_push ( $has_opened_tr , false ); - } else if ( count ( $td_history ) == 0 ) { - // Don't do any of the following - continue; - } else if ( substr ( $line , 0 , 2 ) == '|}' ) { - // We are ending a table - $line = '' . substr ( $line , 2 ); - $last_tag = array_pop ( $last_tag_history ); - - if ( !array_pop ( $has_opened_tr ) ) { - $line = "{$line}"; - } - - if ( array_pop ( $tr_history ) ) { - $line = "{$line}"; - } - - if ( array_pop ( $td_history ) ) { - $line = "{$line}"; - } - array_pop ( $tr_attributes ); - $lines[$key] = $line . str_repeat( '
' , $indent_level ); - } else if ( substr ( $line , 0 , 2 ) == '|-' ) { - // Now we have a table row - $line = preg_replace( '#^\|-+#', '', $line ); - - $line = ''; - $last_tag = array_pop ( $last_tag_history ); - array_pop ( $has_opened_tr ); - array_push ( $has_opened_tr , true ); - - if ( array_pop ( $tr_history ) ) { - $line = ''; - } - - if ( array_pop ( $td_history ) ) { - $line = "{$line}"; - } - - $lines[$key] = $line; - array_push ( $tr_history , false ); - array_push ( $td_history , false ); - array_push ( $last_tag_history , '' ); - } - else if ( $first_character == '|' || $first_character == '!' || substr ( $line , 0 , 2 ) == '|+' ) { - // This might be cell elements, td, th or captions - if ( substr ( $line , 0 , 2 ) == '|+' ) { - $first_character = '+'; - $line = substr ( $line , 1 ); - } - - $line = substr ( $line , 1 ); - - if ( $first_character == '!' ) { - $line = str_replace ( '!!' , '||' , $line ); - } - - // Split up multiple cells on the same line. - // FIXME : This can result in improper nesting of tags processed - // by earlier parser steps, but should avoid splitting up eg - // attribute values containing literal "||". - $cells = explode( '||' , $line ); - - $lines[$key] = ''; - - // Loop through each table cell - foreach ( $cells as $cell ) - { - $previous = ''; - if ( $first_character != '+' ) - { - $tr_after = array_pop ( $tr_attributes ); - if ( !array_pop ( $tr_history ) ) { - $previous = "\n"; - } - array_push ( $tr_history , true ); - array_push ( $tr_attributes , '' ); - array_pop ( $has_opened_tr ); - array_push ( $has_opened_tr , true ); - } - - $last_tag = array_pop ( $last_tag_history ); - - if ( array_pop ( $td_history ) ) { - $previous = "{$previous}"; - } - - if ( $first_character == '|' ) { - $last_tag = 'td'; - } else if ( $first_character == '!' ) { - $last_tag = 'th'; - } else if ( $first_character == '+' ) { - $last_tag = 'caption'; - } else { - $last_tag = ''; - } - - array_push ( $last_tag_history , $last_tag ); - - // A cell could contain both parameters and data - $cell_data = explode ( '|' , $cell , 2 ); - - // Bug 553: Note that a '|' inside an invalid link should not - // be mistaken as delimiting cell parameters - if ( strpos( $cell_data[0], '[[' ) !== false ) { - $cell = "{$previous}<{$last_tag}>{$cell}"; - } else if ( count ( $cell_data ) == 1 ) - $cell = "{$previous}<{$last_tag}>{$cell_data[0]}"; - else { - $cell = "{$previous}<{$last_tag}>{$cell_data[1]}"; - } - - $lines[$key] .= $cell; - array_push ( $td_history , true ); - } - } - } - - // Closing open td, tr && table - while ( count ( $td_history ) > 0 ) - { - if ( array_pop ( $td_history ) ) { - $lines[] = '' ; - } - if ( array_pop ( $tr_history ) ) { - $lines[] = '' ; - } - if ( !array_pop ( $has_opened_tr ) ) { - $lines[] = "" ; - } - - $lines[] = '' ; - } - - $output = implode ( "\n" , $lines ) ; - - //@todo:移除
中所有的换行符 - //可能存在问题 - $output=preg_replace('/([a-zA-Z])>\n/m','$1>',$output); - $output=preg_replace('/\n<\//m','\n\n" ) { - $output = ''; - } - - return $output; - } - + } }