primo commit
This commit is contained in:
		
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 404 B | 
| @ -0,0 +1,52 @@ | ||||
| <?php  | ||||
| /** | ||||
|  * @version		6.2.6 tabulizer $ | ||||
|  * @package		tabulizer | ||||
|  * @copyright	Copyright © 2011 - All rights reserved. | ||||
|  * @license		GNU/GPL | ||||
|  * @author		Dimitrios Mourloukos | ||||
|  * @author mail	info@alterora.gr | ||||
|  * @website		www.tabulizer.com | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // no direct access | ||||
| defined( '_JEXEC' ) or die( 'Restricted access' ); | ||||
|  | ||||
| TabulizerPath::requireLib('tabulizer','common'); | ||||
| TabulizerPath::requireLib('convert','dialog'); | ||||
|  | ||||
| $jinput = JFactory::getApplication()->input; | ||||
|  | ||||
| $errors = array(); | ||||
|  | ||||
| if (get_magic_quotes_gpc()) { | ||||
| 	$text = stripslashes($jinput->post->get('raw_text','','raw')); | ||||
| 	$caption = stripslashes($jinput->post->getString('table_caption','')); | ||||
| } else { | ||||
| 	$text = $jinput->post->get('raw_text','','raw'); | ||||
| 	$caption = $jinput->post->getString('table_caption',''); | ||||
| } | ||||
| $separator = $jinput->post->getString('column_separator',''); | ||||
| $enclosure = $jinput->post->getString('column_enclosure',''); | ||||
| $ruleset_name  = $jinput->post->getString('ruleset_name',''); | ||||
| $ruleset_filename  = $jinput->post->getString('archive_filename',''); | ||||
| $use_comments = intval($jinput->post->getInt('use_comments',0)); | ||||
| $column_consistency = intval($jinput->post->getInt('column_consistency',0)); | ||||
| $metadata = array('caption'=>$caption); | ||||
|  | ||||
| $table = new Tabulizer(); | ||||
| if ($use_comments) $table->setComments(true); | ||||
| $html = $table->process($text, $separator, $enclosure, $column_consistency, $metadata, $ruleset_filename, $ruleset_name, $errors); | ||||
| 	 | ||||
| if (!empty($errors)) {	 | ||||
| 	$html = ERROR_CODE_PREFIX; | ||||
| 	foreach ($errors as $error) { | ||||
| 		$html .= '<error>'.$error.'</error>'; | ||||
| 	} | ||||
| }	 | ||||
|  | ||||
| jexit($html); | ||||
|  | ||||
| ?> | ||||
| @ -0,0 +1,46 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @version		6.2.6 tabulizer $ | ||||
|  * @package		tabulizer | ||||
|  * @copyright	Copyright © 2011 - All rights reserved. | ||||
|  * @license		GNU/GPL | ||||
|  * @author		Dimitrios Mourloukos | ||||
|  * @author mail	info@alterora.gr | ||||
|  * @website		www.tabulizer.com | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // no direct access | ||||
| defined( '_JEXEC' ) or die( 'Restricted access' ); | ||||
|  | ||||
| class DataSourceLoader { | ||||
|  | ||||
|     function getData($data_source_tag, $data_source_user_params) { | ||||
|         TabulizerPath::requireLib('data_source','common'); | ||||
|  | ||||
|         $output_str = TabulizerDataSource::getTableDataJSON($data_source_tag,$data_source_user_params); | ||||
|         jexit($output_str); | ||||
|     } | ||||
|  | ||||
|     function process() { | ||||
|         $data_source_tag = null; | ||||
|         $data_source_user_params = null; | ||||
|  | ||||
|         if (isset($_REQUEST['ds_tag'])) { | ||||
|             $data_source_tag = $_REQUEST['ds_tag']; | ||||
|         } | ||||
|         if (isset($_REQUEST['ds_user_params'])) { | ||||
|             $data_source_user_params = $_REQUEST['ds_user_params']; | ||||
|         } | ||||
|         if (preg_match('/^[a-zA-Z0-9\._\-]{2,128}$/i',$data_source_tag)) { | ||||
|             $this->getData($data_source_tag, $data_source_user_params); | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
|  | ||||
| $ds_loader = new DataSourceLoader(); | ||||
| $ds_loader->process(); | ||||
|  | ||||
| ?> | ||||
| @ -0,0 +1,101 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @version		6.2.6 tabulizer $ | ||||
|  * @package		tabulizer | ||||
|  * @copyright	Copyright © 2011 - All rights reserved. | ||||
|  * @license		GNU/GPL | ||||
|  * @author		Dimitrios Mourloukos | ||||
|  * @author mail	info@alterora.gr | ||||
|  * @website		www.tabulizer.com | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // no direct access | ||||
| defined( '_JEXEC' ) or die( 'Restricted access' ); | ||||
|  | ||||
| $jinput = JFactory::getApplication()->input; | ||||
| $clb_name = addslashes( $jinput->getString('clb_name','')); | ||||
|  | ||||
| $css_url = TabulizerPath::getURLPath('dialog.css', 'admin_css');  | ||||
| $js_url = TabulizerPath::getURLPath('jquery-1.6.4.min.js', 'admin_js'); | ||||
| $js_base64_url = TabulizerPath::getURLPath('base64_tools.js','admin_js'); | ||||
|  | ||||
| $page_title = JText::_('COM_TABULIZER_TITLE'); | ||||
|  | ||||
| $js_code = '					 | ||||
| 	function TabulizerInsertClick() {	  | ||||
|   	  var ds_tag = document.getElementById("ds_tag").value; | ||||
|   	  var ds_params = document.getElementById("ds_params").value; | ||||
| 	  if ((ds_tag)&&(ds_params!="")) { | ||||
| 	    ds_params = B64.encode(ds_params); | ||||
| 	    result = "{tabulizer:data_source["+ds_tag+"] user_params["+ds_params+"]}"; | ||||
| 	  } else if (ds_tag) { | ||||
| 	    result = "{tabulizer:data_source["+ds_tag+"]}"; | ||||
| 	  } | ||||
| 	   | ||||
| 	  window.opener.tabulizerdsClickCallback( "'.$clb_name.'", result ); | ||||
| 	  window.close(); | ||||
| 	} | ||||
|  | ||||
| 	function TabulizerCancelClick() { | ||||
| 	  window.close(); | ||||
| 	} | ||||
| '; | ||||
|  | ||||
| $document = JFactory::getDocument(); | ||||
| $document->addScript($js_url); | ||||
| $document->addScript($js_base64_url); | ||||
| $document->addStyleSheet($css_url); | ||||
|  | ||||
| TabulizerJS::addScriptDeclaration($js_code); | ||||
|  | ||||
| $document->setTitle($page_title); | ||||
|  | ||||
| $database = JFactory::getDBO(); | ||||
| $errors = array(); | ||||
| $html = ''; | ||||
| 				 | ||||
| $query = 'SELECT * FROM #__tabulizer_data_source WHERE 1 ORDER BY title ASC'; | ||||
| $database->setQuery($query); | ||||
| $data_sources = $database->loadObjectList(); | ||||
|  | ||||
| $user_params = TabulizerForm::getTextCtrl('ds_params', ''); | ||||
|  | ||||
| if (empty($data_sources)) { | ||||
| ?> | ||||
|  | ||||
| <form name="tabulizer_form" id="tabulizer_form" method="post" onSubmit="return false"> | ||||
| <div style="padding: 10px; background-color: #FFFFCC;"><?php echo JText::_('COM_TABULIZER_NO_DATA_SOURCES_WERE_FOUND_EDITOR_BTN');?></div> | ||||
| <br/> | ||||
| <input type="button" value="<?php echo  JText::_('COM_TABULIZER_CLOSE'); ?>" onClick="TabulizerCancelClick()" class="btn"> | ||||
| </td></tr> | ||||
| </table> | ||||
| <?php echo JHTML::_( 'form.token' ); ?> | ||||
| </form> | ||||
|  | ||||
| <?php | ||||
| } else { | ||||
| 	$options = array(); | ||||
| 	foreach ($data_sources as $data_source) { | ||||
| 		$options[$data_source->tag] = $data_source->title; | ||||
| 	} | ||||
| 	$data_sources_list = TabulizerForm::getSelectCtrl('ds_tag',null,$options); | ||||
| ?> | ||||
|  | ||||
| <form name="tabulizer_form" id="tabulizer_form" method="post" onSubmit="return false"> | ||||
| <table border="0" cellspacing="0" cellpadding="2" width="100%"> | ||||
| <tr><td><?php echo  JText::_('COM_TABULIZER_DATA_SOURCES'); ?>:</td><td><?php echo $data_sources_list; ?></td></tr> | ||||
| <tr><td><?php echo  JText::_('COM_TABULIZER_DATA_SOURCES_USER_PARAMS'); ?>:</td><td><?php echo $user_params; ?></td></tr> | ||||
| <tr><td colspan="2" align="left" valign="bottom" nowrap> | ||||
| <hr/> | ||||
| <input type="submit" value="<?php echo  JText::_('COM_TABULIZER_INSERT_TABLE'); ?>" onClick="TabulizerInsertClick()" class="btn"> | ||||
| <input type="button" value="<?php echo  JText::_('COM_TABULIZER_CANCEL_CONVERSION'); ?>" onClick="TabulizerCancelClick()" class="btn"> | ||||
| </td></tr> | ||||
| </table> | ||||
| <?php echo JHTML::_( 'form.token' ); ?> | ||||
| </form> | ||||
| 	 | ||||
| <?php | ||||
| } | ||||
| ?> | ||||
| @ -0,0 +1,736 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @version		6.2.6 tabulizer $ | ||||
|  * @package		tabulizer | ||||
|  * @copyright	Copyright © 2011 - All rights reserved. | ||||
|  * @license		GNU/GPL | ||||
|  * @author		Dimitrios Mourloukos | ||||
|  * @author mail	info@alterora.gr | ||||
|  * @website		www.tabulizer.com | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // no direct access | ||||
| defined( '_JEXEC' ) or die( 'Restricted access' ); | ||||
|  | ||||
| // increase memory and execution time limits | ||||
| TabulizerPerformance::increaseProcessingLimits(); | ||||
|  | ||||
| class ExportData { | ||||
|  | ||||
|     var $form_prefix = null; | ||||
|     var $export_source = null; | ||||
|     var $export_type = null; | ||||
|     var $export_output = null; | ||||
|     var $export_data = null; | ||||
|     var $export_filename = null; | ||||
|     var $export_email_recipients = null; | ||||
|     var $export_email_subject = null; | ||||
|     var $export_email_body = null; | ||||
|     var $export_dir = null; | ||||
|  | ||||
|     function getExportParams(&$error_msg) { | ||||
|         $this->form_prefix = $_REQUEST['form_prefix']; | ||||
|         if (empty($this->form_prefix)) { | ||||
|             $error_msg = 'The form prefix is empty!'; | ||||
|             return false; | ||||
|         } else { | ||||
|             $form_prefix = $this->form_prefix; | ||||
|         } | ||||
|  | ||||
|         if (!empty($_REQUEST[$form_prefix . '_exportsource'])) | ||||
|             $this->export_source = urldecode($_REQUEST[$form_prefix . '_exportsource']); | ||||
|         if (!empty($_REQUEST[$form_prefix . '_exporttype'])) | ||||
|             $this->export_type = $_REQUEST[$form_prefix . '_exporttype']; | ||||
|         if (!empty($_REQUEST[$form_prefix . '_exportoutput'])) | ||||
|             $this->export_output = $_REQUEST[$form_prefix . '_exportoutput']; | ||||
|         if (!empty($_REQUEST[$form_prefix . '_exportdata'])) { | ||||
|             $this->export_data = urldecode($_REQUEST[$form_prefix . '_exportdata']); | ||||
|             // handle magic quotes | ||||
|             if (get_magic_quotes_gpc()) { | ||||
|                 $this->export_data = stripslashes($this->export_data); | ||||
|             } | ||||
|         } | ||||
|         if (!empty($_REQUEST[$form_prefix . '_exportfile'])) { | ||||
|             $this->export_filename = urldecode($_REQUEST[$form_prefix . '_exportfile']); | ||||
|         } | ||||
|  | ||||
|         if (!empty($_REQUEST[$form_prefix . '_datasourcetag'])) { | ||||
|             TabulizerPath::requireLib('data_source','common'); | ||||
|             $data_source_tag = $_REQUEST[$form_prefix . '_datasourcetag']; | ||||
|             $data_source_user_params = $_REQUEST[$form_prefix . '_dsuserparams']; | ||||
|  | ||||
|             // get header row(s) first | ||||
|             $errors = array(); | ||||
|             $params = null; | ||||
|             $search_filters = array(); | ||||
|  | ||||
|             $results = TabulizerDataSource::getDataSourceContents($data_source_tag, $data_source_user_params, $search_filters, $params, $errors); | ||||
|             if (empty($results)) { | ||||
|                 $this->export_data = $error_msg; | ||||
|             } else { | ||||
|                 $delimiter = ','; | ||||
|                 // open raw memory as file, no need for temp files, be careful not to run out of memory thought */ | ||||
|                 $f = fopen('php://memory', 'w'); | ||||
|                 foreach ($results['rows'] as $line) { | ||||
|                     fputcsv($f, $line, $delimiter); | ||||
|                 } | ||||
|                 // rewind the "file" with the csv lines | ||||
|                 fseek($f, 0); | ||||
|                 $this->export_data = stream_get_contents($f); | ||||
|             } | ||||
|  | ||||
|             // now, get the rest of the data | ||||
|             $server_side = empty($params['server_side'])?false:true; | ||||
|  | ||||
|             if ($server_side) { | ||||
|                 // now, get the rest of the data | ||||
|                 $results = $this->getFilteredServerSideData($data_source_tag, $data_source_user_params, $error_msg); | ||||
|  | ||||
|                 if (empty($results)) { | ||||
|                     $this->export_data = $error_msg; | ||||
|                 } else { | ||||
|                     $delimiter = ','; | ||||
|                     // open raw memory as file, no need for temp files, be careful not to run out of memory thought */ | ||||
|                     $f = fopen('php://memory', 'w'); | ||||
|                     foreach ($results['rows'] as $line) { | ||||
|                         fputcsv($f, $line, $delimiter); | ||||
|                     } | ||||
|                     // rewind the "file" with the csv lines | ||||
|                     fseek($f, 0); | ||||
|                     $this->export_data .= stream_get_contents($f); | ||||
|                 } | ||||
|  | ||||
|             } else { | ||||
|                 $errors = array(); | ||||
|                 $params = null; | ||||
|                 $search_filters = array('all'=>1); | ||||
|  | ||||
|                 $results = TabulizerDataSource::getDataSourceContents($data_source_tag, $data_source_user_params, $search_filters, $params, $errors); | ||||
|                 if (empty($results)) { | ||||
|                     $this->export_data = $error_msg; | ||||
|                 } else { | ||||
|                     $delimiter = ','; | ||||
|                     // open raw memory as file, no need for temp files, be careful not to run out of memory thought */ | ||||
|                     $f = fopen('php://memory', 'w'); | ||||
|                     foreach ($results['rows'] as $line) { | ||||
|                         fputcsv($f, $line, $delimiter); | ||||
|                     } | ||||
|                     // rewind the "file" with the csv lines | ||||
|                     fseek($f, 0); | ||||
|                     $this->export_data .= stream_get_contents($f); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $email_export_permissions = TabulizerPermissions::getExportDataPermissions(); | ||||
|         $allow_recipients = $email_export_permissions['allow_recipients']; | ||||
|         $allow_subject = $email_export_permissions['allow_subject']; | ||||
|         $allow_body = $email_export_permissions['allow_body']; | ||||
|         if (!empty($_REQUEST[$form_prefix . '_exportemail_recipients']) && $allow_recipients) { | ||||
|             $this->export_email_recipients = urldecode($_REQUEST[$form_prefix . '_exportemail_recipients']); | ||||
|             $recipients = explode(',',$this->export_email_recipients); | ||||
|             $this->export_email_recipients = array(); | ||||
|             $regex = '/^[-0-9a-zA-Z.+_]+@[-0-9a-zA-Z.+_]+\.[a-zA-Z]{2,4}$/i'; | ||||
|             if (!empty($recipients)) { | ||||
|                 foreach ($recipients as $recipient) { | ||||
|                     $recipient = trim($recipient); | ||||
|                     if (preg_match($regex, $recipient)) $this->export_email_recipients[] = $recipient; | ||||
|                     if (count($this->export_email_recipients)>EXPORT_TABLE_EMAIL_RECIPIENTS_MAX_NUM) break; | ||||
|  | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         if (!empty($_REQUEST[$form_prefix . '_exportemail_subject']) && $allow_subject) { | ||||
|             $this->export_email_subject = urldecode($_REQUEST[$form_prefix . '_exportemail_subject']); | ||||
|             // handle magic quotes | ||||
|             if (get_magic_quotes_gpc()) { | ||||
|                 $this->export_email_subject = stripslashes($this->export_email_subject); | ||||
|             } | ||||
|             if (mb_strlen($this->export_email_subject)>EXPORT_TABLE_EMAIL_SUBJECT_MAX_SIZE) $this->export_email_subject = mb_substr($this->export_email_subject,0,EXPORT_TABLE_EMAIL_SUBJECT_MAX_SIZE); | ||||
|         } | ||||
|         if (!empty($_REQUEST[$form_prefix . '_exportemail_body']) && $allow_body) { | ||||
|             $this->export_email_body = urldecode($_REQUEST[$form_prefix . '_exportemail_body']); | ||||
|             // handle magic quotes | ||||
|             if (get_magic_quotes_gpc()) { | ||||
|                 $this->export_email_body = stripslashes($this->export_email_body); | ||||
|             } | ||||
|             if (mb_strlen($this->export_email_body)>EXPORT_TABLE_EMAIL_BODY_MAX_SIZE) $this->export_email_body = mb_substr($this->export_email_body,0,EXPORT_TABLE_EMAIL_BODY_MAX_SIZE); | ||||
|         } | ||||
|         $this->export_dir = TabulizerPath::getDirPath('temp'); | ||||
|  | ||||
|         // do some sanity checks on filename, if present | ||||
|         if (!empty($this->export_filename)) { | ||||
|             $filename_pattern = '/^([a-z0-9_\.]{2,128})$/i'; | ||||
|             if (!preg_match($filename_pattern, $this->export_filename)) { | ||||
|                 $error_msg = "Invalid filename {$this->export_filename} for the temporary export file!"; | ||||
|                 return false; | ||||
|             } | ||||
|             $export_filename  = $this->export_dir . $this->export_filename; | ||||
|             if (!file_exists($export_filename)) { | ||||
|                 $error_msg = "Temporary export file not found or could not be opened!"; | ||||
|                 return false; | ||||
|             } | ||||
|             $this->export_data = file_get_contents($export_filename); | ||||
|             if (empty($this->export_data)) { | ||||
|                 $error_msg = "Temporary export file contained no data!"; | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     function removeExportFile() { | ||||
|         $export_filename = $this->export_dir . $this->export_filename; | ||||
|         if (file_exists($export_filename)) { | ||||
|             @unlink($export_filename); | ||||
|             return true; | ||||
|         } else return false; | ||||
|     } | ||||
|  | ||||
|     function getFilteredServerSideData($data_source_tag, $data_source_user_params, &$error_msg) { | ||||
|         TabulizerPath::requireLib('tabulizer','common'); | ||||
|         $tab = new Tabulizer(); | ||||
|  | ||||
|         TabulizerPath::requireLib('server_side','common'); | ||||
|         $server_side_helper = new ServerSideHelper($data_source_tag, $data_source_user_params); | ||||
|         $server_side_helper->getQueryParams($server_side_query); | ||||
|  | ||||
|         $errors = array(); | ||||
|         $params = null; | ||||
|         $search_filters = null; | ||||
|  | ||||
|         if (!empty($server_side_query)) { | ||||
|             // see if you can avoid reading all data | ||||
|             if (empty($server_side_query['search']) && (empty($server_side_query['order_by']))) { | ||||
|                 if (!empty($server_side_query['pagination'])) { | ||||
|                     if (isset($server_side_query['pagination']['limit'])) { | ||||
|                         $limit_start = (isset($server_side_query['pagination']['limit_start']))?$server_side_query['pagination']['limit_start']:0; | ||||
|                         $limit = $server_side_query['pagination']['limit']; | ||||
|  | ||||
|                         $search_filters['limit_start'] = $limit_start; | ||||
|                         $search_filters['limit'] = $limit; | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 $search_filters['all'] = 1; | ||||
|             } | ||||
|  | ||||
|             TabulizerPath::requireLib('data_source','common'); | ||||
|             $results = TabulizerDataSource::getDataSourceContents($data_source_tag, $data_source_user_params, $search_filters, $params, $errors); | ||||
|  | ||||
|             if (empty($results)) { | ||||
|                 $error_msg = JText::_('COM_TABULIZER_DATA_SOURCE_ERROR_CAPTION'); | ||||
|                 return false; | ||||
|             } else { | ||||
|                 if (!empty($params['consistency'])) $tab->setColumnConsistency(true); | ||||
|  | ||||
|                 $rows = &$results['rows']; | ||||
|  | ||||
|                 $total_records = $results['total_rows']; | ||||
|                 $total_display_records = $results['total_rows']; | ||||
|                 $offset = 0; | ||||
|                 $length = 0; | ||||
|  | ||||
|                 if (!empty($server_side_query['search'])) { | ||||
|                     $unset_keys = array(); | ||||
|                     foreach ($rows as $row_id => $row) { | ||||
|                         $found = true; | ||||
|                         foreach ($server_side_query['search'] as $column_id => $search_options) { | ||||
|                             $match_op = $search_options['match']; | ||||
|                             if ($column_id == 'all') { | ||||
|                                 $search_string = implode('~',$row); | ||||
|                             } else if (isset($row[$column_id])) { | ||||
|                                 $search_string = $row[$column_id]; | ||||
|                             } else { | ||||
|                                 $search_string = null; | ||||
|                             } | ||||
|                             if (isset($search_string)) { | ||||
|                                 $search_string = trim(strip_tags($search_string)); | ||||
|                                 if ($search_string == '') $search_string = null; | ||||
|                             } | ||||
|  | ||||
|                             if (isset($search_string)) { | ||||
|                                 if ($match_op == 'smart') { | ||||
|                                     // smart filtering - match all values that contain the search word | ||||
|                                     if (mb_stripos($search_string,$search_options['value'])===false) { $found = false; break; } | ||||
|                                 } else if ($match_op == 'start_with') { | ||||
|                                     if (mb_stripos($search_string,$search_options['value'])!==0) { $found = false; break; } | ||||
|                                 } else if ($match_op == 'exact') { | ||||
|                                     $search_value = $search_options['value']; | ||||
|                                     $search_string = trim(strip_tags($search_string)); | ||||
|                                     if (mb_stripos($search_string,$search_value)===false) { $found = false; break; } | ||||
|                                     else { | ||||
|                                         $len1 = mb_strlen($search_string); | ||||
|                                         $len2 = mb_strlen($search_value); | ||||
|                                         if ($len1 != $len2) { $found = false; break; } | ||||
|                                     } | ||||
|                                 } else if ($match_op == 'numeric_int') { | ||||
|                                     if (is_numeric($search_string)) { | ||||
|                                         $search_string = intval($search_string); | ||||
|                                         if (!self::compareMatch($search_string, $search_options)) { $found = false; break; } | ||||
|                                     } else { $found = false; break; } | ||||
|                                 } else if ($match_op == 'numeric_period') { | ||||
|                                     $search_string = str_replace(',','',$search_string); | ||||
|                                     if (is_numeric($search_string)) { | ||||
|                                         $search_string = floatval($search_string); | ||||
|                                         if (!self::compareMatch($search_string, $search_options)) { $found = false; break; } | ||||
|                                     } else { $found = false; break; } | ||||
|                                 } else if ($match_op == 'numeric_comma') { | ||||
|                                     $search_string = str_replace(',','.',str_replace('.','',$search_string)); | ||||
|                                     if (is_numeric($search_string)) { | ||||
|                                         $search_string = floatval($search_string); | ||||
|                                         if (!self::compareMatch($search_string, $search_options)) { $found = false; break; } | ||||
|                                     } else { $found = false; break; } | ||||
|                                 } else if ($match_op == 'date_auto') { | ||||
|                                     $search_string = strtotime($search_string); | ||||
|                                     if (($search_string === false)||($search_string===-1)) { $found = false; break; } | ||||
|                                     else { | ||||
|                                         if (!self::compareMatch($search_string, $search_options)) { $found = false; break; } | ||||
|                                     } | ||||
|                                 } else if ($match_op == 'date_ymd') { | ||||
|                                     $parts = preg_split('#[-\.\/\\/]+#',$search_string); | ||||
|                                     if (count($parts)==3) { | ||||
|                                         $search_string = strtotime($parts[0].'-'.$parts[1].'-'.$parts[2]); | ||||
|                                         if (($search_string === false)||($search_string===-1)) { $found = false; break; } | ||||
|                                         else { | ||||
|                                             if (!self::compareMatch($search_string, $search_options)) { $found = false; break; } | ||||
|                                         } | ||||
|                                     } else { $found = false; break; } | ||||
|                                 } else if ($match_op == 'date_ydm') { | ||||
|                                     $parts = preg_split('#[-\.\/\\/]+#',$search_string); | ||||
|                                     if (count($parts)==3) { | ||||
|                                         $search_string = strtotime($parts[0].'-'.$parts[2].'-'.$parts[1]); | ||||
|                                         if (($search_string === false)||($search_string===-1)) { $found = false; break; } | ||||
|                                         else { | ||||
|                                             if (!self::compareMatch($search_string, $search_options)) { $found = false; break; } | ||||
|                                         } | ||||
|                                     } else { $found = false; break; } | ||||
|                                 } else if ($match_op == 'date_dmy') { | ||||
|                                     $parts = preg_split('#[-\.\/\\/]+#',$search_string); | ||||
|                                     if (count($parts)==3) { | ||||
|                                         $search_string = strtotime($parts[2].'-'.$parts[1].'-'.$parts[0]); | ||||
|                                         if (($search_string === false)||($search_string===-1)) { $found = false; break; } | ||||
|                                         else { | ||||
|                                             if (!self::compareMatch($search_string, $search_options)) { $found = false; break; } | ||||
|                                         } | ||||
|                                     } else { $found = false; break; } | ||||
|                                 } else if ($match_op == 'date_mdy') { | ||||
|                                     $parts = preg_split('#[-\.\/\\/]+#',$search_string); | ||||
|                                     if (count($parts)==3) { | ||||
|                                         $search_string = strtotime($parts[2].'-'.$parts[0].'-'.$parts[1]); | ||||
|                                         if (($search_string === false)||($search_string===-1)) { $found = false; break; } | ||||
|                                         else { | ||||
|                                             if (!self::compareMatch($search_string, $search_options)) { $found = false; break; } | ||||
|                                         } | ||||
|                                     } else { $found = false; break; } | ||||
|                                 } else { | ||||
|                                     // smart filtering - match all values that contain the search word | ||||
|                                     if (mb_stripos($search_string,$search_value)===false) { $found = false; break; } | ||||
|                                 } | ||||
|                             } else { | ||||
|                                 // do not match empty values | ||||
|                                 $found = false; | ||||
|                             } | ||||
|                         } | ||||
|                         if (!$found) $unset_keys[] = $row_id; | ||||
|                     } | ||||
|                     if (!empty($unset_keys)) { | ||||
|                         foreach ($unset_keys as $row_id) { | ||||
|                             unset($rows[$row_id]); | ||||
|                         } | ||||
|                     } | ||||
|                     $total_display_records = count($rows); | ||||
|                 } | ||||
|                 if (!empty($server_side_query['order_by'])) { | ||||
|                     $sort_helper = new SortingRowsHelper(); | ||||
|                     $sort_helper->setOrder($server_side_query['order_by']['column_id'], $server_side_query['order_by']['dir']); | ||||
|                     usort($rows, array($sort_helper, 'compare')); | ||||
|                 } | ||||
|                 if (!empty($server_side_query['pagination'])) { | ||||
|                     if (isset($server_side_query['pagination']['limit_start'])) { | ||||
|                         $offset = $server_side_query['pagination']['limit_start']; | ||||
|                     } else { | ||||
|                         $offset = 0; | ||||
|                     } | ||||
|                     if (isset($server_side_query['pagination']['limit'])) { | ||||
|                         $length = $server_side_query['pagination']['limit']; | ||||
|                         if ($length == 'all') $length= count($rows); | ||||
|                     } else { | ||||
|                         $length = null; | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 if (!empty($length)) { | ||||
|  | ||||
|                     if (isset($search_filters['all'])) { | ||||
|                         $lower_limit = $offset; | ||||
|                         $upper_limit = $offset + $length; | ||||
|                         $unset_keys = array(); | ||||
|  | ||||
|                         $row_counter = 0; | ||||
|                         foreach ($rows as $row_id => $row) { | ||||
|                             if (($row_counter<$lower_limit)||($row_counter>$upper_limit)) { | ||||
|                                 $unset_keys[] = $row_id ; | ||||
|                             } | ||||
|                             $row_counter++; | ||||
|                         } | ||||
|  | ||||
|                         if (!empty($unset_keys)) { | ||||
|                             foreach ($unset_keys as $row_id) { | ||||
|                                 unset($rows[$row_id]); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     if (count($rows)) { | ||||
|                         $server_data = array('rows'=>$rows); | ||||
|                         return $server_data; | ||||
|                     } else { | ||||
|                         $error_msg = JText::_('COM_TABULIZER_DATA_TABLE_FILTERING_RETURNED_ZERO_RECORDS'); | ||||
|                         return false; | ||||
|                     } | ||||
|                 } else { | ||||
|                     $error_msg = JText::_('COM_TABULIZER_SERVER_SIDE_PAGINATION_IS_MISSING'); | ||||
|                     return false; | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             $error_msg = JText::_('COM_TABULIZER_SERVER_SIDE_QUERY_IS_MISSING'); | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     function getExportData(&$error_msg) { | ||||
|         // remove temporary export file, its contents are already copied to export_data variable | ||||
|         $this->removeExportFile(); | ||||
|         switch ($this->export_type) { | ||||
|             case 'csv': $content_type = 'text/csv'; break; | ||||
|             case 'xls': $content_type = 'application/vnd.ms-excel'; break; | ||||
|             case 'xlsx': $content_type = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; break; | ||||
|             case 'pdf': $content_type = 'application/pdf'; break; | ||||
|             case 'png':	$content_type = 'image/png'; break; | ||||
|             case 'jpg': $content_type = 'image/jpeg'; break; | ||||
|             case 'gif': $content_type = 'image/gif'; break; | ||||
|             default: | ||||
|                 $error_msg = "Unknown export type {$this->export_type}!"; | ||||
|                 return false; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         header('Set-Cookie: fileDownload=true; path=/'); | ||||
|         header('Cache-Control: max-age=60, must-revalidate'); | ||||
|         header("Content-type: {$content_type}"); | ||||
|         header('Content-Disposition: attachment; filename="'.$this->export_filename.'"'); | ||||
|         //header("Pragma: no-cache"); | ||||
|         //header("Expires: 0"); | ||||
|  | ||||
|         jexit($this->export_data); | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     function num2alpha($n) { | ||||
|         $r = ''; | ||||
|         for ($i = 1; $n >= 0 && $i < 10; $i++) { | ||||
|             $r = chr(0x41 + ($n % pow(26, $i) / pow(26, $i - 1))) . $r; | ||||
|             $n -= pow(26, $i); | ||||
|         } | ||||
|         return $r; | ||||
|     } | ||||
|  | ||||
|     function getExcelCoord($row_id, $column_id) { | ||||
|         $column_alpha = $this->num2alpha($column_id-1); | ||||
|         return $column_alpha . $row_id; | ||||
|     } | ||||
|  | ||||
|     function cvs2Table($contents) { | ||||
|         $rows = array(); | ||||
|         $lines = explode("\n",$contents); | ||||
|         foreach ($lines as $line) { | ||||
|             if ($line != '') { | ||||
|                 $row = TabulizerString::my_str_getcsv( $line, ',', '"'); | ||||
|                 $rows[] = $row; | ||||
|             } | ||||
|         } | ||||
|         return $rows; | ||||
|     } | ||||
|  | ||||
|     function saveExportData(&$error_msg) { | ||||
|         switch ($this->export_type) { | ||||
|             case 'csv': | ||||
|                 $this->export_filename = 'table_' . rand() . '_' . time() . '.csv'; | ||||
|                 $export_data = $this->export_data; | ||||
|                 $export_filename = $this->export_dir . $this->export_filename; | ||||
|                 if (file_put_contents($export_filename, $export_data)) { | ||||
|                     return true; | ||||
|                 } else { | ||||
|                     $error_msg = sprintf(JText::_('COM_TABULIZER_EXPORT_ERROR_CANNOT_WRITE_EXPORT_FILE'), $this->export_dir); | ||||
|                     return false; | ||||
|                 } | ||||
|                 break; | ||||
|  | ||||
|             case 'xls': | ||||
|             case 'xlsx': | ||||
|             case 'pdf': | ||||
|                 # Include path | ||||
|                 $phpexcel_path = TabulizerPath::getDirPath('phpexcel'); | ||||
|                 set_include_path(get_include_path() . PATH_SEPARATOR . $phpexcel_path); | ||||
|  | ||||
|                 # PHPExcel_IOFactory | ||||
|                 require_once($phpexcel_path.DIRECTORY_SEPARATOR.'IOFactory.php'); | ||||
|  | ||||
|                 $this->export_filename = 'table_' . rand() . '_' . time() . '.'.$this->export_type; | ||||
|                 $export_data = $this->export_data; | ||||
|                 $export_filename = $this->export_dir . $this->export_filename; | ||||
|  | ||||
|                 $objPHPExcel = new PHPExcel(); | ||||
|                 $objPHPExcel->getActiveSheet()->setTitle('Table'); | ||||
|  | ||||
|                 $rows = $this->cvs2Table($export_data); | ||||
|  | ||||
|                 foreach ($rows as $row_id => $row) { | ||||
|                     foreach ($row as $column_id => $cell) { | ||||
|                         $cell_coord = $this->getExcelCoord($row_id+1, $column_id+1); | ||||
|                         $objPHPExcel->getActiveSheet()->setCellValue($cell_coord, $cell); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 switch ($this->export_type) { | ||||
|                     case 'xls': $outputFileType = 'Excel5'; break; | ||||
|                     case 'xlsx': $outputFileType = 'Excel2007'; break; | ||||
|                     case 'pdf': | ||||
|                         $rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF; | ||||
|                         $rendererLibraryPath = TabulizerPath::getDirPath('dompdf'); | ||||
|                         if ($rendererLibraryPath) { | ||||
|                             set_include_path(get_include_path() . PATH_SEPARATOR . $rendererLibraryPath); | ||||
|                             if (!PHPExcel_Settings::setPdfRenderer( | ||||
|                                 $rendererName, | ||||
|                                 $rendererLibraryPath | ||||
|                             )) { | ||||
|                                 $error_msg = JText::_('COM_TABULIZER_EXPORT_TABLE_PDF_LIBRARY_MISSING'); | ||||
|                                 return false; | ||||
|                             } | ||||
|                         } else { | ||||
|                             $error_msg = JText::_('COM_TABULIZER_EXPORT_TABLE_PDF_LIBRARY_MISSING'); | ||||
|                             return false; | ||||
|                         } | ||||
|  | ||||
|                         $outputFileType = 'PDF'; | ||||
|  | ||||
|                         $objPHPExcel->getActiveSheet(0)->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); | ||||
|                         $objPHPExcel->getActiveSheet(0)->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4); | ||||
|                         $objPHPExcel->getActiveSheet(0)->getPageSetup()->setFitToWidth(true); | ||||
|                         $objPHPExcel->getActiveSheet(0)->getPageSetup()->setFitToHeight(true); | ||||
|                         $objPHPExcel->getActiveSheet(0)->setShowGridlines(false); | ||||
|  | ||||
|                         break; | ||||
|                 } | ||||
|                 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $outputFileType); | ||||
|                 $objWriter->save($export_filename); | ||||
|  | ||||
|                 return true; | ||||
|  | ||||
|                 break; | ||||
|  | ||||
|             case 'png': | ||||
|                 $this->export_filename = 'graph_' . rand() . '_' . time() . '.png'; | ||||
|                 $export_data = str_replace(' ', '+', str_replace('data:image/png;base64,','',$this->export_data)); | ||||
|                 $export_data = base64_decode($export_data); | ||||
|                 $export_filename = $this->export_dir . $this->export_filename; | ||||
|                 if (file_put_contents($export_filename, $export_data)) { | ||||
|                     return true; | ||||
|                 } else { | ||||
|                     $error_msg = sprintf(JText::_('COM_TABULIZER_EXPORT_ERROR_CANNOT_WRITE_EXPORT_FILE'), $this->export_dir); | ||||
|                     return false; | ||||
|                 } | ||||
|                 break; | ||||
|  | ||||
|             case 'jpg': | ||||
|                 // save the image first as png | ||||
|                 $tmp_filename = $this->export_dir . 'graph_' . rand() . '_' . time() . '.png'; | ||||
|                 $export_data = str_replace(' ', '+', str_replace('data:image/png;base64,','',$this->export_data)); | ||||
|                 $export_data = base64_decode($export_data); | ||||
|                 if (file_put_contents($tmp_filename, $export_data)) { | ||||
|                     $image = imagecreatefrompng($tmp_filename); | ||||
|                     $bg = imagecreatetruecolor(imagesx($image), imagesy($image)); | ||||
|                     imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255)); | ||||
|                     imagealphablending($bg, TRUE); | ||||
|                     imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image)); | ||||
|                     imagedestroy($image); | ||||
|                     $quality = EXPORT_TABLE_IMAGE_QUALITY; | ||||
|                     $this->export_filename = 'graph_' . rand() . '_' . time() . '.jpg'; | ||||
|                     $export_filename = $this->export_dir . $this->export_filename; | ||||
|                     imagejpeg($bg, $export_filename, $quality); | ||||
|                     ImageDestroy($bg); | ||||
|                     @unlink($tmp_filename); | ||||
|                     return true; | ||||
|                 } else { | ||||
|                     $error_msg = sprintf(JText::_('COM_TABULIZER_EXPORT_ERROR_CANNOT_WRITE_EXPORT_FILE'), $this->export_dir); | ||||
|                     return false; | ||||
|                 } | ||||
|                 break; | ||||
|  | ||||
|             case 'gif': | ||||
|                 // save the image first as png | ||||
|                 $tmp_filename = $this->export_dir . 'graph_' . rand() . '_' . time() . '.png'; | ||||
|                 $export_data = str_replace(' ', '+', str_replace('data:image/png;base64,','',$this->export_data)); | ||||
|                 $export_data = base64_decode($export_data); | ||||
|                 if (file_put_contents($tmp_filename, $export_data)) { | ||||
|                     $image = imagecreatefrompng($tmp_filename); | ||||
|                     $this->export_filename = 'graph_' . rand() . '_' . time() . '.gif'; | ||||
|                     $export_filename = $this->export_dir . $this->export_filename; | ||||
|                     imagegif($image, $export_filename); | ||||
|                     imagedestroy($image); | ||||
|                     @unlink($tmp_filename); | ||||
|                     return true; | ||||
|                 } else { | ||||
|                     $error_msg = sprintf(JText::_('COM_TABULIZER_EXPORT_ERROR_CANNOT_WRITE_EXPORT_FILE'), $this->export_dir); | ||||
|                     return false; | ||||
|                 } | ||||
|                 break; | ||||
|  | ||||
|             default: | ||||
|                 $error_msg = "Unknown export type {$this->export_type}!"; | ||||
|                 return false; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     function emailExportData(&$error_msg) { | ||||
|  | ||||
|         $mailer = JFactory::getMailer(); | ||||
|  | ||||
|         // set sender | ||||
|         $sender_info = TabulizerInfo::getMailSenderInfo(); | ||||
|         $sender = array( $sender_info['email'], $sender_info['name']); | ||||
|         $mailer->setSender($sender); | ||||
|  | ||||
|         // set recipient | ||||
|         if (empty($this->export_email_recipients)) { | ||||
|             $user = JFactory::getUser(); | ||||
|             if ($user->guest) { | ||||
|                 $error_msg = JText::_('COM_TABULIZER_EXPORT_ERROR_USER_NOT_LOGGED_IN'); | ||||
|                 $this->removeExportFile(); | ||||
|                 return false; | ||||
|             } | ||||
|             $this->export_email_recipients = array($user->email); | ||||
|         } | ||||
|         $mailer->addRecipient($this->export_email_recipients); | ||||
|  | ||||
|         $export_filename = $this->export_dir . $this->export_filename; | ||||
|  | ||||
|         switch ($this->export_type) { | ||||
|             case 'csv': | ||||
|             case 'xls': | ||||
|             case 'xlsx': | ||||
|             case 'pdf': | ||||
|                 $subject = empty($this->export_email_subject)?JText::_('COM_TABULIZER_EXPORT_TABLE_EMAIL_SUBJECT'):$this->export_email_subject; | ||||
|                 $body_text = empty($this->export_email_body)?JText::_('COM_TABULIZER_EXPORT_TABLE_EMAIL_BODY'):$this->export_email_body; | ||||
|                 $body = '<div>'.$body_text.'<br/></div>'; | ||||
|                 // Attach file | ||||
|                 $mailer->addAttachment($export_filename); | ||||
|                 break; | ||||
|  | ||||
|             case 'png': | ||||
|             case 'jpg': | ||||
|             case 'gif': | ||||
|                 $subject = empty($this->export_email_subject)?JText::_('COM_TABULIZER_EXPORT_IMAGE_EMAIL_SUBJECT'):$this->export_email_subject; | ||||
|                 $body_text = empty($this->export_email_body)?JText::_('COM_TABULIZER_EXPORT_IMAGE_EMAIL_BODY'):$this->export_email_body; | ||||
|                 $body   = '<div>'.$body_text.'<br/><br/>' | ||||
|                     . '<img src="cid:graph_id" alt="Table Graph"/></div>'; | ||||
|                 // Add embedded image | ||||
|                 $image_type = ($this->export_type == 'jpg')?'jpeg':$this->export_type; | ||||
|                 $mailer->AddEmbeddedImage($export_filename, 'graph_id', $this->export_filename, 'base64', 'image/'.$image_type ); | ||||
|                 break; | ||||
|  | ||||
|             default: | ||||
|                 $error_msg = "Unknown export type {$this->export_type}!"; | ||||
|                 $this->removeExportFile(); | ||||
|                 return false; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         $mailer->setSubject($subject); | ||||
|         $mailer->setBody($body); | ||||
|         $mailer->isHTML(true); | ||||
|         $mailer->Encoding = 'base64'; | ||||
|  | ||||
|         $send = $mailer->Send(); | ||||
|         if ( $send !== true ) { | ||||
|             $error_msg = JText::_('COM_TABULIZER_EXPORT_ERROR_COULD_NOT_SEND_EMAIL'); | ||||
|             $this->removeExportFile(); | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         $this->removeExportFile(); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     function outputJSON($user_data, $error_flag) { | ||||
|         if ($error_flag) { | ||||
|             $output = $user_data; | ||||
|         } else { | ||||
|             $output = json_encode($user_data); | ||||
|         } | ||||
|         jexit($output); | ||||
|     } | ||||
|  | ||||
|     function outputFile($user_msg, $error_flag = true) { | ||||
|         if (!$error_flag) { | ||||
|             header('Set-Cookie: fileDownload=true; path=/'); | ||||
|         } | ||||
|         header('Cache-Control: max-age=60, must-revalidate'); | ||||
|         header("Content-Type: text/html; charset=utf-8"); | ||||
|         jexit($user_msg); | ||||
|     } | ||||
|  | ||||
|     function processRequest() { | ||||
|         // get export params | ||||
|         if (!$this->getExportParams($error_msg)) { | ||||
|             if (empty($this->export_filename)) { | ||||
|                 $this->outputJSON($error_msg, true); | ||||
|             } else { | ||||
|                 $this->outputFile($error_msg, true); | ||||
|             } | ||||
|             return false; | ||||
|         } | ||||
|         // see if filename is set | ||||
|         if (empty($this->export_filename)) { | ||||
|             if (!$this->saveExportData($error_msg)) { | ||||
|                 $this->outputJSON($error_msg, true); | ||||
|                 return false; | ||||
|             } else { | ||||
|                 $this->outputJSON(array('filename_tmp' => $this->export_filename), false); | ||||
|                 return true; | ||||
|             } | ||||
|         } else { | ||||
|             if ($this->export_output == 'email') { | ||||
|                 if (!$this->emailExportData($error_msg)) { | ||||
|                     $this->outputFile($error_msg, true); | ||||
|                     return false; | ||||
|                 } else { | ||||
|                     $this->outputFile(JText::_('COM_TABULIZER_EXPORT_EMAIL_SUCCESS_MESSAGE'), false); | ||||
|                 } | ||||
|             } else { | ||||
|                 if (!$this->getExportData($error_msg)) { | ||||
|                     $this->outputFile($error_msg, true); | ||||
|                     return false; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| $export_controller = new ExportData(); | ||||
| $export_controller->processRequest(); | ||||
|  | ||||
| ?> | ||||
| @ -0,0 +1,22 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @version		6.2.6 tabulizer $ | ||||
|  * @package		tabulizer | ||||
|  * @copyright	Copyright © 2011 - All rights reserved. | ||||
|  * @license		GNU/GPL | ||||
|  * @author		Dimitrios Mourloukos | ||||
|  * @author mail	info@alterora.gr | ||||
|  * @website		www.tabulizer.com | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // no direct access | ||||
| defined( '_JEXEC' ) or die( 'Restricted access' ); | ||||
|  | ||||
| TabulizerPath::requireLib('csv_extraction','common'); | ||||
|  | ||||
| $extractor = new CSVExtraction(); | ||||
| $extractor->processJSON(); | ||||
|  | ||||
| ?> | ||||
| @ -0,0 +1,22 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @version		6.2.6 tabulizer $ | ||||
|  * @package		tabulizer | ||||
|  * @copyright	Copyright © 2011 - All rights reserved. | ||||
|  * @license		GNU/GPL | ||||
|  * @author		Dimitrios Mourloukos | ||||
|  * @author mail	info@alterora.gr | ||||
|  * @website		www.tabulizer.com | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // no direct access | ||||
| defined( '_JEXEC' ) or die( 'Restricted access' ); | ||||
|  | ||||
| TabulizerPath::requireLib('excel_extraction','common'); | ||||
|  | ||||
| $extractor = new ExcelExtraction(); | ||||
| $extractor->processJSON(); | ||||
|  | ||||
| ?> | ||||
| @ -0,0 +1,22 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @version		6.2.6 tabulizer $ | ||||
|  * @package		tabulizer | ||||
|  * @copyright	Copyright © 2011 - All rights reserved. | ||||
|  * @license		GNU/GPL | ||||
|  * @author		Dimitrios Mourloukos | ||||
|  * @author mail	info@alterora.gr | ||||
|  * @website		www.tabulizer.com | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // no direct access | ||||
| defined( '_JEXEC' ) or die( 'Restricted access' ); | ||||
|  | ||||
| TabulizerPath::requireLib('grid_data_extraction','common'); | ||||
|  | ||||
| $extractor = new GridDataExtraction(); | ||||
| $extractor->processJSON(); | ||||
|  | ||||
| ?> | ||||
| @ -0,0 +1,569 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @version		6.2.6 tabulizer $ | ||||
|  * @package		tabulizer | ||||
|  * @copyright	Copyright © 2011 - All rights reserved. | ||||
|  * @license		GNU/GPL | ||||
|  * @author		Dimitrios Mourloukos | ||||
|  * @author mail	info@alterora.gr | ||||
|  * @website		www.tabulizer.com | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // no direct access | ||||
| defined( '_JEXEC' ) or die( 'Restricted access' ); | ||||
|  | ||||
| class TableExtraction { | ||||
| 	var $contents = null; | ||||
| 	var $caret_position = null; | ||||
| 	 | ||||
| 	function getInput(&$error_msg) { | ||||
| 		if (isset($_REQUEST['editor_content'])) { | ||||
| 			$this->contents = $_REQUEST['editor_content']; | ||||
| 			// remove unwanted slashes when magin quotes is on | ||||
| 			if (get_magic_quotes_gpc()) { | ||||
| 		    	$this->contents = stripslashes($this->contents); | ||||
| 			} | ||||
| 						 | ||||
| 			// remove unwanted carriage return chars | ||||
| 			$rcount = 0; | ||||
| 			$offset = 0;			 | ||||
| 			$pos = mb_strpos ( $this->contents, "\r\n", $offset); | ||||
| 			while ($pos) { | ||||
| 				$rcount++; | ||||
| 				$offset = $pos + 2; | ||||
| 				$pos = mb_strpos ( $this->contents, "\r\n", $offset); | ||||
| 			} | ||||
| 			if ($rcount) { | ||||
| 				$this->contents = str_replace("\r\n","\n",$this->contents); | ||||
| 			}									 | ||||
| 		} | ||||
| 		if (isset($_REQUEST['caret_position'])) { | ||||
| 			$this->caret_position = $_REQUEST['caret_position']; | ||||
| 			if (get_magic_quotes_gpc()) { | ||||
| 		    	$this->caret_position = stripslashes($this->caret_position); | ||||
| 			} | ||||
| 			$this->caret_position = intval($this->caret_position); | ||||
| 		} | ||||
| 		 | ||||
| 		if (empty($this->contents) || empty($this->caret_position)) { | ||||
| 			$error_msg = JText::_('COM_TABULIZER_INVALID_TABLE_SELECTION'); | ||||
| 			return false; | ||||
| 		} else return true;						 | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| 	function verifyPHPLibraries(&$error_msg) { | ||||
| 		if (!function_exists('libxml_use_internal_errors')) { | ||||
| 			$error_msg = sprintf(JText::_('COM_TABULIZER_XML_PARSER_MISSING'), 'libxml_use_internal_errors'); | ||||
| 			return false;			 | ||||
| 		} 					 | ||||
| 		return true; | ||||
| 	}	 | ||||
| 	 | ||||
| 	function process() { | ||||
| 		$error_msg = null; | ||||
| 		 | ||||
| 		if ($this->verifyPHPLibraries($error_msg)) {		 | ||||
| 			$this->getInput($error_msg);								 | ||||
| 		} | ||||
| 				 | ||||
| 		if (!$error_msg) {			 | ||||
| 			$extracted_data = array('table_caption'=>null, 'table_text'=>null, 'column_separator'=>null, 'column_enclosure'=>null, 'ruleset_archive'=>null, 'ruleset_name'=>null, 'range_from'=>null, 'range_to'=>null, 'error_msg'=>null); | ||||
| 			if ($this->extractTableData($extracted_data)) {				 | ||||
| 				$this->outputData($extracted_data);															 | ||||
| 			} else { | ||||
| 				$this->outputError($extracted_data['error_msg']); | ||||
| 			}	 | ||||
| 		} else { | ||||
| 			$this->outputError($error_msg); | ||||
| 		} | ||||
| 	}			 | ||||
| 	 | ||||
| 	function extractTableRowsAndColumns($rows, &$extracted_data) {			 | ||||
| 		$table_array = array(); | ||||
| 		$cell_values = array(); | ||||
| 		$row_id = 0; | ||||
| 		$sort_keys_flag = false; | ||||
| 		 | ||||
| 		foreach ($rows as $row) { | ||||
| 			$row_id++; | ||||
| 			if (empty($table_array[$row_id])) { | ||||
| 				$table_array[$row_id] = array();				 | ||||
| 			}	 | ||||
| 			$column_id = 0;			 | ||||
| 			foreach ($row as $cell) {				 | ||||
| 				$column_id++; | ||||
| 				while (isset($table_array[$row_id][$column_id])) $column_id++; | ||||
| 				$cell_value = str_replace("\n",'', $cell['value']); | ||||
| 				$table_array[$row_id][$column_id] = $cell_value;									 | ||||
| 				$cell_values[] = $cell_value; | ||||
| 				if ((!empty($cell['colspan'])) && (!empty($cell['rowspan']))) { | ||||
| 					$rowspan = $cell['rowspan']; | ||||
| 					$colspan = $cell['colspan'];															 | ||||
| 					for ($i=0;$i<$rowspan;$i++) { | ||||
| 						$row_id_span = $row_id + $i; | ||||
| 						if (empty($table_array[$row_id_span])) $table_array[$row_id_span] = array(); | ||||
| 						for ($j=0;$j<$colspan;$j++) { | ||||
| 							$column_id_span = $column_id + $j;						 | ||||
| 							$table_array[$row_id_span][$column_id_span] = ''; | ||||
| 						}						 | ||||
| 					} | ||||
| 					$table_array[$row_id][$column_id] = $cell_value; | ||||
| 					$column_id += $colspan; | ||||
| 					$sort_keys_flag = true;										 | ||||
| 				} else if (!empty($cell['colspan'])) { | ||||
| 					$span = $cell['colspan']; | ||||
| 					for ($i=1;$i<$span;$i++) { | ||||
| 						$column_id++;						 | ||||
| 						$table_array[$row_id][$column_id] = ''; | ||||
| 					} | ||||
| 				} else if (!empty($cell['rowspan'])) { | ||||
| 					$span = $cell['rowspan']; | ||||
| 					for ($i=1;$i<$span;$i++) { | ||||
| 						$row_id_span = $row_id + $i; | ||||
| 						if (empty($table_array[$row_id_span])) $table_array[$row_id_span] = array(); | ||||
| 						$table_array[$row_id_span][$column_id] = ''; | ||||
| 					} | ||||
| 					$sort_keys_flag = true; | ||||
| 				} | ||||
| 			} | ||||
| 		}		 | ||||
| 						 | ||||
| 		$column_separator_found = false;		 | ||||
| 		if (empty($cell_values)) { | ||||
| 			$extracted_data['error_msg'] = JText::_('COM_TABULIZER_INVALID_TABLE_SELECTION'); | ||||
| 			return false; | ||||
| 		} else {					 | ||||
| 			$separators = TabulizerUtils::getSeparatorList(true); | ||||
| 			foreach ($separators as $sep => $column_separator) { | ||||
| 				$valid = true; | ||||
| 				foreach ($cell_values as $value) { | ||||
| 					if (empty($value)) continue; | ||||
| 					if (strpos($value,$sep) !== false) { $valid = false; break; } | ||||
| 				} | ||||
| 				if ($valid) { | ||||
| 					$column_separator_found = true; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		# use text enclosure, if needed		 | ||||
| 		if (!$column_separator_found) { | ||||
| 			$column_separator = SEPARATOR_COMMA; | ||||
| 			$column_enclosure = ENCLOSURE_DOUBLE_QUOTES;			 | ||||
| 			$sep = ','; | ||||
| 			$enclosure = '"'; | ||||
| 			$escape = ENCLOSURE_ESCAPE;			 | ||||
| 		} else { | ||||
| 			$column_enclosure = ENCLOSURE_NONE; | ||||
| 			$enclosure = ''; | ||||
| 		}				 | ||||
| 		$sep = $enclosure . $sep . $enclosure;								 | ||||
| 		 | ||||
| 		$current_count = 0; | ||||
| 		$column_count = 0; | ||||
| 		$table_text = ''; | ||||
| 		foreach ($table_array as $row_id => $cells) { | ||||
| 			// sort array keys is needed, in case you have used colspan or rowspan | ||||
| 			if ($sort_keys_flag) { | ||||
| 				ksort($cells);  | ||||
| 			} | ||||
| 		 | ||||
| 			$current_count = count($cells); | ||||
| 			if (empty($column_count)) $column_count = $current_count; | ||||
| 			else if ($column_count != $current_count) { | ||||
| 				$extracted_data['error_msg'] = JText::_('COM_TABULIZER_INVALID_TABLE_SELECTION'); | ||||
| 				return false; | ||||
| 			}			 | ||||
| 			if ($column_enclosure != ENCLOSURE_NONE) { | ||||
| 				$ra = $escape . $enclosure; | ||||
| 				$rw = $enclosure; | ||||
| 				foreach ($cells as &$cell) { | ||||
| 					$cell = str_replace($rw, $ra, $cell); | ||||
| 				} | ||||
| 			}			 | ||||
| 			$table_text .= $enclosure. implode($sep,$cells) . $enclosure . "\n"; | ||||
| 		} | ||||
| 		 | ||||
| 		$extracted_data['table_text'] = $table_text; | ||||
| 		$extracted_data['column_separator'] = $column_separator;		 | ||||
| 		$extracted_data['column_enclosure'] = $column_enclosure;		 | ||||
| 		 | ||||
| 		return true; | ||||
| 								 | ||||
| 	}			 | ||||
| 		 | ||||
| 	function extractTableData(&$extracted_data) { | ||||
| 		 | ||||
| 		$contents = $this->contents;						 | ||||
| 		$caret_position = $this->caret_position; | ||||
| 		 | ||||
| 		$table_caption = ''; | ||||
| 		$ruleset_archive = ''; | ||||
| 		$ruleset_name = ''; | ||||
| 		 | ||||
| 		# search for table limits | ||||
| 		$range = array(); | ||||
| 		$range_stack = array(); | ||||
| 		$table_ranges = array(); | ||||
| 		 | ||||
| 		$pos = mb_stripos($contents, '<table'); | ||||
| 		while ($pos !== false) { | ||||
| 			$range[$pos] = 'open'; | ||||
| 			$pos = mb_stripos($contents, '<table', $pos + 6); | ||||
| 		} | ||||
| 		$pos = mb_stripos($contents, '</table'); | ||||
| 		while ($pos !== false) { | ||||
| 			$epos = mb_stripos($contents, '>', $pos + 7);  | ||||
| 			if ($epos) { | ||||
| 				$range[$epos] = 'close'; | ||||
| 				$pos = mb_stripos($contents, '</table', $epos + 1); | ||||
| 			} else { | ||||
| 				$pos = false; | ||||
| 			}				 | ||||
| 		} | ||||
| 		ksort($range); | ||||
| 		foreach ($range as $key => $value) { | ||||
| 			if ($value == 'open') {				 | ||||
| 				$limit = $key; | ||||
| 				array_push($range_stack, $limit); | ||||
| 			} else { | ||||
| 				$limit = array_pop($range_stack); | ||||
| 				if ($limit !== false) { | ||||
| 					$table_ranges[] = array('open' => $limit, 'close' => $key); | ||||
| 				}	 | ||||
| 			} | ||||
| 		} | ||||
| 		// check if you have an unclosed table | ||||
| 		if (count($range_stack)) { | ||||
| 			$limit = array_pop($range_stack); | ||||
| 			$table_ranges[] = array('open' => $limit, 'close' => mb_strlen($contents) - 1); | ||||
| 		} | ||||
| 		 | ||||
| 		$selected_range = array('from' => null, 'to' => null); | ||||
| 		if (count($table_ranges)) { | ||||
| 			foreach ($table_ranges as $table_range) { | ||||
| 				$range_from =  $table_range['open']; | ||||
| 				$range_to =  $table_range['close']; | ||||
| 				if (($caret_position > $range_from) && ($caret_position < $range_to)) { | ||||
| 					if (!isset($selected_range['from'])) { | ||||
| 						$selected_range['from'] = $range_from; | ||||
| 						$selected_range['to'] = $range_to; | ||||
| 					} else if ($selected_range['from'] < $range_from) { | ||||
| 						$selected_range['from'] = $range_from; | ||||
| 						$selected_range['to'] = $range_to;					 | ||||
| 					}	 | ||||
| 				} | ||||
| 			} | ||||
| 		}								 | ||||
| 		 | ||||
| 		if ((!isset($selected_range['from']))||(!isset($selected_range['to']))) { | ||||
| 			$extracted_data['error_msg'] = JText::_('COM_TABULIZER_INVALID_TABLE_SELECTION'); | ||||
| 			return false; | ||||
| 		} else { | ||||
| 			$range_from = $selected_range['from']; | ||||
| 			$range_to = $selected_range['to']; | ||||
| 			if ($range_to < $range_from) { | ||||
| 				$extracted_data['error_msg'] = JText::_('COM_TABULIZER_INVALID_TABLE_SELECTION'); | ||||
| 				return false;				 | ||||
| 			} else { | ||||
| 				$range_len = $range_to  - $range_from + 1; | ||||
| 				$table_source =  mb_substr ( $contents, $range_from, $range_len );									 | ||||
| 			} | ||||
| 		}		 | ||||
| 		 | ||||
| 		# load and normalize table contents | ||||
| 		$table_source = str_replace(array("\n", "\r"), " ", $table_source);  | ||||
| 		$rows = array(); | ||||
| 		 | ||||
| 		# mourlouk note: DOMDocument is not bahaving correctly, try to solve this by using the following char conversion				 | ||||
| 		$table_source = mb_convert_encoding($table_source, 'HTML-ENTITIES', 'UTF-8'); | ||||
| 		 | ||||
| 		$dom = new DOMDocument(); | ||||
| 		libxml_use_internal_errors(true); | ||||
| 		$dom->loadHTML('<?xml encoding="UTF-8">' . $table_source); | ||||
| 		 | ||||
| 		$table = $dom->getElementsByTagName('table')->item(0); | ||||
| 		 | ||||
|  | ||||
| 		if ($table->hasAttribute('data-ruleset')) {			 | ||||
| 			$data_ruleset = trim($table->getAttribute('data-ruleset'));			 | ||||
| 			list($ruleset_archive, $ruleset_name) = explode(':',$data_ruleset); | ||||
| 		} | ||||
|  | ||||
|         $error_msg = null; | ||||
|         $user_preferences = TabulizerInfo::getUserPreferences($error_msg); | ||||
|         $remove_leftovers = $user_preferences['retabulize_remove_leftovers']; | ||||
|         if ($table->hasAttribute('id') && $remove_leftovers) { | ||||
|             $table_id = trim($table->getAttribute('id')); | ||||
|             $directive_pos_start = null; | ||||
|             $directive_pos_end = mb_stripos($contents, 'id['.$table_id.']}'); | ||||
|             if ($directive_pos_end!==false) { | ||||
|                 $pos_offset = 0; | ||||
|                 $pos_start = mb_stripos($contents, '{tabulizer:', $pos_offset); | ||||
|                 while ($pos_start !== false) { | ||||
|                     if ($pos_start < $directive_pos_end) { | ||||
|                         $directive_pos_start = $pos_start; | ||||
|                         $pos_offset = $pos_start + 11; | ||||
|                         $pos_start = mb_stripos($contents, '{tabulizer:', $pos_offset); | ||||
|                     } else { | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (!empty($directive_pos_start)) { | ||||
|                 // try to locate unmatched HTML elements that will removed below the table | ||||
|                 $above_area = mb_substr($contents, $directive_pos_end + 19, $range_from - $directive_pos_end - 19); | ||||
|                 if (!empty($above_area)) { | ||||
|                     $above_area = str_replace(array("\n", "\r"), " ", $above_area); | ||||
|                     $above_area_len = mb_strlen($above_area); | ||||
|                     $open_tags = array(); | ||||
|                     $open_tag = $close_tag = $append_tag = false; | ||||
|                     $tag = ''; | ||||
|  | ||||
|                     for ($i=0;$i<$above_area_len;$i++) { | ||||
|                         $ch = mb_substr($above_area,$i,1); | ||||
|                         $chn = ($i == ($above_area_len - 1))?' ':mb_substr($above_area,$i+1,1); | ||||
|                         switch ($ch) { | ||||
|                             case '<': | ||||
|                                 if ($chn != '/') { | ||||
|                                     $open_tag = true; | ||||
|                                     $append_tag = true; | ||||
|                                     $tag = ''; | ||||
|                                 } else if ($chn == '/') { | ||||
|                                     $close_tag = true; | ||||
|                                     $append_tag = true; | ||||
|                                     $tag = ''; | ||||
|                                     $i++; | ||||
|                                 } | ||||
|                                 break; | ||||
|                             case '>': | ||||
|                                 if ($open_tag) { | ||||
|                                     $open_tags[] = strtolower($tag); | ||||
|                                     $open_tag = false; | ||||
|                                 } else if ($close_tag) { | ||||
|                                     $tag = strtolower($tag); | ||||
|                                     if (count($open_tags)) { | ||||
|                                         foreach ($open_tags as $ot_key => $ot_value) { | ||||
|                                             if ($ot_value == $tag) { | ||||
|                                                 unset($open_tags[$ot_key]); | ||||
|                                                 break; | ||||
|                                             } | ||||
|                                         } | ||||
|                                     } | ||||
|                                     $close_tag = false; | ||||
|                                 } | ||||
|                                 break; | ||||
|                             default: | ||||
|                                 if (($open_tag || $close_tag)) { | ||||
|                                     if ($ch == ' ') $append_tag = false; | ||||
|                                     if ($append_tag) $tag .= $ch; | ||||
|                                 } | ||||
|                                 break; | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     if (count($open_tags)>0) { | ||||
|                         $below_area = mb_substr($contents,$range_to+1); | ||||
|                         $below_area_len = mb_strlen($below_area); | ||||
|                         if ($below_area_len>0) { | ||||
|                             for ($i=0;$i<$below_area_len;$i++) { | ||||
|                                 $ch = mb_substr($below_area,$i,1); | ||||
|                                 $chn = ($i == ($below_area_len - 1))?' ':mb_substr($below_area,$i+1,1); | ||||
|                                 switch ($ch) { | ||||
|                                     case '<': | ||||
|                                         if ($chn != '/') { | ||||
|                                             $open_tag = true; | ||||
|                                             $append_tag = true; | ||||
|                                             $tag = ''; | ||||
|                                         } else if ($chn == '/') { | ||||
|                                             $close_tag = true; | ||||
|                                             $append_tag = true; | ||||
|                                             $tag = ''; | ||||
|                                             $i++; | ||||
|                                         } | ||||
|                                         break; | ||||
|                                     case '>': | ||||
|                                         if ($open_tag) { | ||||
|                                             $open_tags[] = strtolower($tag); | ||||
|                                             $open_tag = false; | ||||
|                                         } else if ($close_tag) { | ||||
|                                             $tag = strtolower($tag); | ||||
|                                             if (count($open_tags)) { | ||||
|                                                 foreach ($open_tags as $ot_key => $ot_value) { | ||||
|                                                     if ($ot_value == $tag) { | ||||
|                                                         unset($open_tags[$ot_key]); | ||||
|                                                         break; | ||||
|                                                     } | ||||
|                                                 } | ||||
|                                             } | ||||
|                                             $close_tag = false; | ||||
|                                             // check if we are done | ||||
|                                             if (count($open_tags)==0) { | ||||
|                                                 $range_to += $i + 1; | ||||
|                                                 $i = $below_area_len; | ||||
|                                             } | ||||
|                                         } | ||||
|                                         break; | ||||
|                                     default: | ||||
|                                         if (($open_tag || $close_tag)) { | ||||
|                                             if ($ch == ' ') $append_tag = false; | ||||
|                                             if ($append_tag) $tag .= $ch; | ||||
|                                         } | ||||
|                                         break; | ||||
|                                 } | ||||
|                             } | ||||
|  | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 $range_from = $directive_pos_start; | ||||
|             } | ||||
|         } | ||||
|  | ||||
| 		 | ||||
| 		/* | ||||
| 		Tag 	Description | ||||
| 		<table> 	Defines a table | ||||
| 		<th> 	Defines a header cell in a table | ||||
| 		<tr> 	Defines a row in a table | ||||
| 		<td> 	Defines a cell in a table | ||||
| 		<caption> 	Defines a table caption | ||||
| 		<colgroup> 	Specifies a group of one or more columns in a table for formatting | ||||
| 		<col> 	Specifies column properties for each column within a <colgroup> element | ||||
| 		<thead> 	Groups the header content in a table | ||||
| 		<tbody> 	Groups the body content in a table | ||||
| 		<tfoot> | ||||
| 		*/				 | ||||
| 		 | ||||
| 		$table_elements = array('head'=>array(),'body'=>array(),'foot'=>array()); | ||||
| 		 | ||||
| 		foreach($table->childNodes as $node) { | ||||
| 			if (is_object($node)) { | ||||
| 				$nodeName = strtoupper($node->nodeName); | ||||
| 				$table_section = null; | ||||
| 				switch ($nodeName) {					 | ||||
| 					case 'CAPTION': $table_caption = trim($node->nodeValue); | ||||
| 						break; | ||||
| 					case 'TBODY': if (empty($table_section)) $table_section = 'body';				 | ||||
| 					case 'THEAD': if (empty($table_section)) $table_section = 'head';	 | ||||
| 					case 'TFOOT': if (empty($table_section)) $table_section = 'foot';	 | ||||
| 						foreach ($node->childNodes as $tr) { | ||||
| 							if (is_object($tr)) { | ||||
| 								$cells = array(); | ||||
| 								foreach ($tr->childNodes as $td) { | ||||
| 									if (is_object($td)) { | ||||
| 										$tdName = strtoupper($td->nodeName); | ||||
| 										if (($tdName=='TD')||($tdName=='TH')) { | ||||
| 											$cell = array('value' => $dom->saveXML($td)); | ||||
| 											if ($td->hasAttribute('colspan')) { | ||||
| 												$cell['colspan'] = $td->getAttribute('colspan'); | ||||
| 											}	 | ||||
| 											if ($td->hasAttribute('rowspan')) { | ||||
| 												$cell['rowspan'] = $td->getAttribute('rowspan'); | ||||
| 											} | ||||
| 											if (preg_match('/^<td([^>]*)>(.+)<\/td>$/si',$cell['value'],$matches)) $cell['value'] = trim($matches[2]);		 | ||||
| 											else if (preg_match('/^<th([^>]*)>(.+)<\/th>$/si',$cell['value'],$matches)) $cell['value'] = trim($matches[2]);	 | ||||
| 											$cells[] = $cell;														 | ||||
| 										} | ||||
| 									}	 | ||||
| 								} | ||||
| 								$table_elements[$table_section][] = $cells; | ||||
| 							} | ||||
| 						} | ||||
| 						break; | ||||
| 					 | ||||
| 					case 'TR': | ||||
| 						$table_section = 'body';				 | ||||
| 						$tr = &$node; | ||||
| 						$cells = array(); | ||||
| 						foreach ($tr->childNodes as $td) { | ||||
| 							if (is_object($td)) { | ||||
| 								$tdName = strtoupper($td->nodeName); | ||||
| 								if (($tdName=='TD')||($tdName=='TH')) { | ||||
| 									$cell = array('value' => $dom->saveXML($td)); | ||||
| 									if ($td->hasAttribute('colspan')) { | ||||
| 										$cell['colspan'] = $td->getAttribute('colspan'); | ||||
| 									}	 | ||||
| 									if ($td->hasAttribute('rowspan')) { | ||||
| 										$cell['rowspan'] = $td->getAttribute('rowspan'); | ||||
| 									} | ||||
| 									if (preg_match('/^<td([^>]*)>(.+)<\/td>$/si',$cell['value'],$matches)) $cell['value'] = trim($matches[2]);		 | ||||
| 									else if (preg_match('/^<th([^>]*)>(.+)<\/th>$/si',$cell['value'],$matches)) $cell['value'] = trim($matches[2]);	 | ||||
| 									$cells[] = $cell;																 | ||||
| 								} | ||||
| 							}	 | ||||
| 						} | ||||
| 						$table_elements[$table_section][] = $cells;				 | ||||
| 						break; | ||||
| 						 | ||||
| 					default: | ||||
| 						// CAPTION | ||||
| 						// COLGROUP | ||||
| 						// do nothing | ||||
| 						break; | ||||
| 				}		 | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		$extracted_data['range_from'] = $range_from; | ||||
| 		$extracted_data['range_to'] = $range_to; | ||||
| 		if (!empty($table_caption)) $extracted_data['table_caption'] = $table_caption; | ||||
| 		if (!empty($ruleset_archive)) $extracted_data['ruleset_archive'] = $ruleset_archive;	 | ||||
| 		if (!empty($ruleset_name)) $extracted_data['ruleset_name'] = $ruleset_name;		 | ||||
| 		 | ||||
| 		$rows = array(); | ||||
| 		 | ||||
| 		foreach ($table_elements as $table_section => $table_rows) { | ||||
| 			if (!empty($table_rows)) { | ||||
| 				foreach ($table_rows as $table_row) { | ||||
|                     if (!empty($table_row)) { | ||||
|                         $rows[] = $table_row; | ||||
|                     } | ||||
| 				} | ||||
| 			} | ||||
| 		}								 | ||||
| 		 | ||||
| 		if ($rows) {							 | ||||
| 			return $this->extractTableRowsAndColumns($rows, $extracted_data); | ||||
| 		} else { | ||||
| 			// no rows | ||||
| 			return false; | ||||
| 		} | ||||
| 		 | ||||
| 	} | ||||
| 	 | ||||
| 	//function outputData($table_caption, $table_text, $column_separator, $range_from, $range_to, $error_msg) { | ||||
| 	function outputData($extracted_data) { | ||||
| 		if (!empty($extracted_data['error_msg'])) { | ||||
| 			$output = json_encode(array("error_msg" => $extracted_data['error_msg'])); | ||||
| 		} else { | ||||
| 			$output_array = array(); | ||||
| 			$keys = array('table_caption','table_text','column_separator','column_enclosure','ruleset_archive','ruleset_name','range_from','range_to'); | ||||
| 			foreach ($keys as $key) { | ||||
| 				if (isset($extracted_data[$key])) { | ||||
| 					$output_array[$key] = $extracted_data[$key]; | ||||
| 				} | ||||
| 			} | ||||
| 			$output = json_encode($output_array);			 | ||||
| 		} | ||||
| 		 | ||||
| 		jexit($output); | ||||
| 	} | ||||
| 	 | ||||
| 	function outputError($error_msg) { | ||||
| 		$output = json_encode(array("error_msg" => $error_msg));		 | ||||
| 		jexit($output); | ||||
| 	}	 | ||||
| 			 | ||||
| } | ||||
|  | ||||
| $form = new TableExtraction(); | ||||
| $form->process(); | ||||
|  | ||||
| ?> | ||||
| @ -0,0 +1,88 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @version		6.2.6 tabulizer $ | ||||
|  * @package		tabulizer | ||||
|  * @copyright	Copyright © 2011 - All rights reserved. | ||||
|  * @license		GNU/GPL | ||||
|  * @author		Dimitrios Mourloukos | ||||
|  * @author mail	info@alterora.gr | ||||
|  * @website		www.tabulizer.com | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // no direct access | ||||
| defined( '_JEXEC' ) or die( 'Restricted access' ); | ||||
|  | ||||
| function grabTableData() { | ||||
|     $jinput = JFactory::getApplication()->input; | ||||
|     $params['filepath'] = $jinput->getString('grab_url',''); | ||||
|     $params['table_order'] = $jinput->getString('grab_index',''); | ||||
|     $params['table_attribute_name'] = $jinput->getString('grab_attr_name',''); | ||||
|     $params['table_attribute_value'] = $jinput->getString('grab_attr_value',''); | ||||
|  | ||||
|     TabulizerPath::requireLib('html_extraction','common'); | ||||
|  | ||||
|     $grabber = new HTMLExtraction(); | ||||
|     $grabber->getTableRows($rows, $params, $error_msg); | ||||
|  | ||||
|     if (empty($error_msg)) { | ||||
|         $cell_values = array(); | ||||
|         foreach ($rows as $row) { | ||||
|             $cell_values[] = implode('', $row); | ||||
|         } | ||||
|  | ||||
|         $column_separator_found = false; | ||||
|         if (empty($cell_values)) { | ||||
|             $extracted_data['error_msg'] = JText::_('COM_TABULIZER_INVALID_TABLE_SELECTION'); | ||||
|             return false; | ||||
|         } else { | ||||
|             $separators = TabulizerUtils::getSeparatorList(true); | ||||
|             foreach ($separators as $sep => $column_separator) { | ||||
|                 $valid = true; | ||||
|                 foreach ($cell_values as $value) { | ||||
|                 if (empty($value)) continue; | ||||
|                 if (strpos($value,$sep) !== false) { $valid = false; break; } | ||||
|             } | ||||
|             if ($valid) { | ||||
|                 $column_separator_found = true; | ||||
|                 break; | ||||
|             } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         # use text enclosure, if needed | ||||
|         if (!$column_separator_found) { | ||||
|             $column_separator = SEPARATOR_COMMA; | ||||
|             $column_enclosure = ENCLOSURE_DOUBLE_QUOTES; | ||||
|             $sep = ','; | ||||
|             $enclosure = '"'; | ||||
|             $escape = ENCLOSURE_ESCAPE; | ||||
|         } else { | ||||
|             $column_enclosure = ENCLOSURE_NONE; | ||||
|             $enclosure = ''; | ||||
|         } | ||||
|         $sep = $enclosure . $sep . $enclosure; | ||||
|  | ||||
|         $table_text = ''; | ||||
|         foreach ($rows as $row_id => $cells) { | ||||
|             if ($column_enclosure != ENCLOSURE_NONE) { | ||||
|                 $ra = $escape . $enclosure; | ||||
|                 $rw = $enclosure; | ||||
|                 foreach ($cells as &$cell) { | ||||
|                     $cell = str_replace($rw, $ra, $cell); | ||||
|                 } | ||||
|             } | ||||
|             $table_text .= $enclosure. implode($sep,$cells) . $enclosure . "\n"; | ||||
|         } | ||||
|  | ||||
|         $json_response = json_encode(array('input_text'=>$table_text, 'input_separator'=>$column_separator, 'input_enclosure'=>$column_enclosure)); | ||||
|         jexit($json_response); | ||||
|     } else { | ||||
|         jexit($error_msg); | ||||
|     } | ||||
| } | ||||
|  | ||||
| grabTableData(); | ||||
|  | ||||
| ?> | ||||
| @ -0,0 +1,4 @@ | ||||
| <html> | ||||
| <body bgcolor="#FFFFFF"> | ||||
| </body> | ||||
| </html> | ||||
| @ -0,0 +1,22 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @version		6.2.6 tabulizer $ | ||||
|  * @package		tabulizer | ||||
|  * @copyright	Copyright © 2011 - All rights reserved. | ||||
|  * @license		GNU/GPL | ||||
|  * @author		Dimitrios Mourloukos | ||||
|  * @author mail	info@alterora.gr | ||||
|  * @website		www.tabulizer.com | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // no direct access | ||||
| defined( '_JEXEC' ) or die( 'Restricted access' ); | ||||
|  | ||||
| TabulizerPath::requireLib('grid_data_save','common'); | ||||
|  | ||||
| $extractor = new GridDataSave(); | ||||
| $extractor->processJSON(); | ||||
|  | ||||
| ?> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -0,0 +1,126 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @version		6.2.6 tabulizer $ | ||||
|  * @package		tabulizer | ||||
|  * @copyright	Copyright © 2011 - All rights reserved. | ||||
|  * @license		GNU/GPL | ||||
|  * @author		Dimitrios Mourloukos | ||||
|  * @author mail	info@alterora.gr | ||||
|  * @website		www.tabulizer.com | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // no direct access | ||||
| defined( '_JEXEC' ) or die( 'Restricted access' ); | ||||
|  | ||||
| class CSVUploader { | ||||
|  | ||||
| 	function file_upload_error_message($error_code) { | ||||
| 		$error_msg = ''; | ||||
| 		switch ($error_code) { | ||||
| 			case UPLOAD_ERR_INI_SIZE: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_UPLOAD_ERR_INI_SIZE'); | ||||
| 			case UPLOAD_ERR_FORM_SIZE: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_UPLOAD_ERR_FORM_SIZE'); | ||||
| 			case UPLOAD_ERR_PARTIAL: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_UPLOAD_ERR_PARTIAL'); | ||||
| 			case UPLOAD_ERR_NO_FILE: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_UPLOAD_ERR_NO_FILE'); | ||||
| 			case UPLOAD_ERR_NO_TMP_DIR: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_Missing a temporary folder'); | ||||
| 			case UPLOAD_ERR_CANT_WRITE: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_UPLOAD_ERR_CANT_WRITE'); | ||||
| 			case UPLOAD_ERR_EXTENSION: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_UPLOAD_ERR_EXTENSION'); | ||||
| 			default: | ||||
| 				$error_msg = 'Unknown upload error'; | ||||
| 		} | ||||
| 		return $error_msg; | ||||
| 	}  | ||||
| 	 | ||||
| 	function verifyUploadedFile(&$csv_filename, &$error_msg) { | ||||
|         $jinput = JFactory::getApplication()->input; | ||||
| 		$uploaded_fieldname = 'csv_file'; | ||||
|         $file = $jinput->files->get($uploaded_fieldname); | ||||
|         foreach ($file as $key => &$value) { | ||||
|             $value = trim(str_replace('>','',$value)); | ||||
|         } | ||||
|  | ||||
|         if ($file["error"] > 0) { | ||||
| 			$error_msg = sprintf(JText::_('COM_TABULIZER_CSV_UPLOAD_FAILED'),$this->file_upload_error_message($file["error"])); | ||||
| 			return false; | ||||
| 		} else { | ||||
| 			$uploaded_filename = $file['name']; | ||||
| 			$uploaded_file = $file['tmp_name']; | ||||
| 			$uploaded_size = $file["size"]; | ||||
| 			$uploaded_type = strtolower($file["type"]); | ||||
| 			 | ||||
| 			# sanity checks | ||||
| 			// 1. File size | ||||
| 			if ($uploaded_size > MAX_UPLOAD_CSV_FILE_SIZE) { | ||||
| 				$error_msg = sprintf(JText::_('COM_TABULIZER_CSV_UPLOAD_INVALID_FILE_SIZE'),MAX_UPLOAD_CSV_FILE_SIZE); | ||||
| 				return false; | ||||
| 			} | ||||
| 						 | ||||
| 			// 2. File type | ||||
| 			/* | ||||
| 			// Note: the official mine type is 'application/vnd.ms-excel' but each browser could set it's own variation | ||||
| 			// We decided to comment this check, because it's easily bypassed by changing the extension (xls), which is already checked at the client side. | ||||
| 			$valid_mime_types = array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/octet-stream');						 | ||||
| 			if (!in_array($uploaded_type, $valid_mime_types)) {  | ||||
| 				$error_msg = sprintf(JText::_('COM_TABULIZER_SHEET_UPLOAD_INVALID_FILE_TYPE'), $uploaded_type); | ||||
| 				return false; | ||||
| 			}  | ||||
| 			*/ | ||||
| 			 | ||||
| 			// 3. File extension | ||||
| 			$path_parts = pathinfo($uploaded_filename); | ||||
| 			$filename_ext = strtolower($path_parts['extension']); | ||||
| 			$valid_extensions = array('csv','txt','text'); | ||||
| 			if (!in_array($filename_ext, $valid_extensions)) { | ||||
| 				$error_msg = sprintf(JText::_('COM_TABULIZER_CSV_UPLOAD_INVALID_FILE_EXT'), $filename_ext); | ||||
| 				return false;				 | ||||
| 			} | ||||
| 			 | ||||
| 			# Copy file to temp dir | ||||
| 			$import_hash = time() . mt_rand(); | ||||
| 			$csv_filename = 'csv' . $import_hash . '.utemp.'. $filename_ext; | ||||
| 			$temp_filename_path = TabulizerPath::getFilePath($csv_filename, 'temp'); | ||||
| 			if(!move_uploaded_file($uploaded_file, $temp_filename_path)) {  | ||||
| 				$error_msg = sprintf(JText::_('COM_TABULIZER_CSV_UPLOAD_MOVE_FAILED'), $temp_filename_path); | ||||
| 				return false; | ||||
| 			}								 | ||||
| 		} | ||||
| 		 | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	function process() { | ||||
| 		$error_msg = null; | ||||
| 		$sheet_filename = null; | ||||
| 		 | ||||
| 		if ($this->verifyUploadedFile($sheet_filename, $error_msg)) { | ||||
| 			$this->outputData($sheet_filename, $error_msg); | ||||
| 		} else { | ||||
| 			$this->outputData(null, $error_msg); | ||||
| 		}		 | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
| 	function outputData($filename, $error_msg) { | ||||
| 		if (!empty($error_msg)) { | ||||
| 			$output = json_encode(array("error_msg" => $error_msg)); | ||||
| 		} else { | ||||
| 			$output = json_encode(array("filename" => $filename)); | ||||
| 		} | ||||
| 		 | ||||
| 		echo '<div id="upload_file_return">'.$output.'</div>'; | ||||
| 	} | ||||
| 			 | ||||
| } | ||||
|  | ||||
| $form = new CSVUploader(); | ||||
| $form->process(); | ||||
|  | ||||
| ?> | ||||
| @ -0,0 +1,126 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @version		6.2.6 tabulizer $ | ||||
|  * @package		tabulizer | ||||
|  * @copyright	Copyright © 2011 - All rights reserved. | ||||
|  * @license		GNU/GPL | ||||
|  * @author		Dimitrios Mourloukos | ||||
|  * @author mail	info@alterora.gr | ||||
|  * @website		www.tabulizer.com | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| // no direct access | ||||
| defined( '_JEXEC' ) or die( 'Restricted access' ); | ||||
|  | ||||
| class ExcelUploader {	 | ||||
|  | ||||
| 	function file_upload_error_message($error_code) { | ||||
| 		$error_msg = ''; | ||||
| 		switch ($error_code) { | ||||
| 			case UPLOAD_ERR_INI_SIZE: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_UPLOAD_ERR_INI_SIZE'); break; | ||||
| 			case UPLOAD_ERR_FORM_SIZE: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_UPLOAD_ERR_FORM_SIZE'); break; | ||||
| 			case UPLOAD_ERR_PARTIAL: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_UPLOAD_ERR_PARTIAL'); break; | ||||
| 			case UPLOAD_ERR_NO_FILE: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_UPLOAD_ERR_NO_FILE'); break; | ||||
| 			case UPLOAD_ERR_NO_TMP_DIR: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_Missing a temporary folder'); break; | ||||
| 			case UPLOAD_ERR_CANT_WRITE: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_UPLOAD_ERR_CANT_WRITE'); break; | ||||
| 			case UPLOAD_ERR_EXTENSION: | ||||
| 				$error_msg = JText::_('COM_TABULIZER_UPLOAD_ERR_EXTENSION'); break; | ||||
| 			default: | ||||
| 				$error_msg = 'Unknown upload error'; break; | ||||
| 		} | ||||
| 		return $error_msg; | ||||
| 	}  | ||||
| 	 | ||||
| 	function verifyUploadedFile(&$sheet_filename, &$error_msg) { | ||||
|         $jinput = JFactory::getApplication()->input; | ||||
| 		$uploaded_fieldname = 'sheet_file'; | ||||
|         $file = $jinput->files->get($uploaded_fieldname); | ||||
|         foreach ($file as $key => &$value) { | ||||
|             $value = trim(str_replace('>','',$value)); | ||||
|         } | ||||
|  | ||||
|         if ($file["error"] > 0) { | ||||
| 			$error_msg = sprintf(JText::_('COM_TABULIZER_SHEET_UPLOAD_FAILED'),$this->file_upload_error_message($file["error"])); | ||||
| 			return false; | ||||
| 		} else { | ||||
| 			$uploaded_filename = $file['name']; | ||||
| 			$uploaded_file = $file['tmp_name']; | ||||
| 			$uploaded_size = $file["size"]; | ||||
| 			$uploaded_type = strtolower($file["type"]); | ||||
| 			 | ||||
| 			# sanity checks | ||||
| 			// 1. File size | ||||
| 			if ($uploaded_size > MAX_UPLOAD_SHEET_FILE_SIZE) { | ||||
| 				$error_msg = sprintf(JText::_('COM_TABULIZER_SHEET_UPLOAD_INVALID_FILE_SIZE'),MAX_UPLOAD_SHEET_FILE_SIZE); | ||||
| 				return false; | ||||
| 			} | ||||
| 						 | ||||
| 			// 2. File type | ||||
| 			/* | ||||
| 			// Note: the official mine type is 'application/vnd.ms-excel' but each browser could set it's own variation | ||||
| 			// We decided to comment this check, because it's easily bypassed by changing the extension (xls), which is already checked at the client side. | ||||
| 			$valid_mime_types = array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/octet-stream');						 | ||||
| 			if (!in_array($uploaded_type, $valid_mime_types)) {  | ||||
| 				$error_msg = sprintf(JText::_('COM_TABULIZER_SHEET_UPLOAD_INVALID_FILE_TYPE'), $uploaded_type); | ||||
| 				return false; | ||||
| 			}  | ||||
| 			*/ | ||||
| 			 | ||||
| 			// 3. File extension | ||||
| 			$path_parts = pathinfo($uploaded_filename); | ||||
| 			$filename_ext = strtolower($path_parts['extension']); | ||||
| 			$valid_extensions = array('xls','xlsx','ods'); | ||||
| 			if (!in_array($filename_ext, $valid_extensions)) { | ||||
| 				$error_msg = sprintf(JText::_('COM_TABULIZER_SHEET_UPLOAD_INVALID_FILE_EXT'), $filename_ext); | ||||
| 				return false;				 | ||||
| 			} | ||||
| 			 | ||||
| 			# Copy file to temp dir | ||||
| 			$import_hash = time() . mt_rand(); | ||||
| 			$sheet_filename = 'sheet' . $import_hash . '.utemp.'. $filename_ext; | ||||
| 			$temp_filename_path = TabulizerPath::getFilePath($sheet_filename, 'sheet_upload'); | ||||
| 			if(!move_uploaded_file($uploaded_file, $temp_filename_path)) {  | ||||
| 				$error_msg = sprintf(JText::_('COM_TABULIZER_SHEET_UPLOAD_MOVE_FAILED'), $temp_filename_path); | ||||
| 				return false; | ||||
| 			}								 | ||||
| 		} | ||||
| 		 | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	function process() { | ||||
| 		$error_msg = null; | ||||
| 		$sheet_filename = null; | ||||
| 		 | ||||
| 		if ($this->verifyUploadedFile($sheet_filename, $error_msg)) { | ||||
| 			$this->outputData($sheet_filename, $error_msg); | ||||
| 		} else { | ||||
| 			$this->outputData(null, $error_msg); | ||||
| 		}		 | ||||
| 	} | ||||
|  | ||||
| 	 | ||||
| 	function outputData($filename, $error_msg) { | ||||
| 		if (!empty($error_msg)) { | ||||
| 			$output = json_encode(array("error_msg" => $error_msg)); | ||||
| 		} else { | ||||
| 			$output = json_encode(array("filename" => $filename)); | ||||
| 		} | ||||
| 		 | ||||
| 		echo '<div id="upload_file_return">'.$output.'</div>'; | ||||
| 	} | ||||
| 			 | ||||
| } | ||||
|  | ||||
| $form = new ExcelUploader(); | ||||
| $form->process(); | ||||
|  | ||||
| ?> | ||||
		Reference in New Issue
	
	Block a user