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 = "{$last_tag}>{$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 = "{$last_tag}>{$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 = "{$last_tag}>{$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','',$output);
-
- // special case: don't return empty table
- if( $output == "" ) {
- $output = '';
- }
-
- return $output;
- }
-
+ }
}