Version: 1.3

Type: Class

Category: HTML

License: GNU General Public License

Description: PHP Class to build tables without tag "<table>". Usefull for building text/plain tables.



<?
# class.tb_simul.php
# PHP Class to build tables without tag "<table>"
# Warning: Use only with monospace fonts!
# benadin <benadin@ukr.net> , www.benadin.info
# Version 1.3
#
# Copyright (c) 2005 Alexander S. Filatov
# Permission granted to use and modify this library so long as the
# copyright above is maintained, modifications are documented

# Usage #
# include_once "class.tb_simul.php";
# $tb = new tb_simul(array (
# 	'col 1' => 3, // define column 'col 1' 3 symbols width
# 	'col_2' => 10,
# 	'col_3' => 5,
# ));
# $tb->row_sep_flag = 0;
# $tb->br = "\r\n";
# $tb->echo_mode = 0;
# $tb->build_header();
# $tb->build_row(array("#1", "this is row 1", "..."));
# $tb->build_row(array("#2", "this - row 2", "text will be wrapped!"));
# $tb->build_footer();
# echo $tb->result;

class tb_simul {
	var $row_sep_flag; // show or not rows separator, default 0
	var $result; // if no direct echo, lets store to $this->total_tb

	function tb_simul($tb_fields=array(), $sep="|", $sep2 = "-", $br = "<br>", $space="&nbsp;", $echo_mode = 1, $html_mode = 1) {
		$this->tb_fields = $tb_fields; // array of tb_field => width
		//$this->tb_cols_count = sizeof($this->tb_fields);
		$this->sep = $sep; // separator between columns;
		$this->sep2 = $sep2; // separator between rows;
		$this->br = $br;
		$this->space = $space;
		$this->echo_mode = $echo_mode;
		$this->tb_total_width = 1;
		$this->v_line = "+";
		$this->row_sep_flag = 0;
		foreach ($this->tb_fields as $tb_field => $width) {
			$this->v_line .= str_repeat($this->sep2, $width + strlen($this->sep) - 1)."+";
			$this->tb_total_width += $width + strlen($this->sep);
		}
		$this->reset_data();
	}

	function reset_data() {
		$this->result = "";
	}

	function set_txt_mode() {
		$this->html_mode = 0;
		$this->br = "\r\n";
		$this->space = " ";
	}

	function add($txt) {
		if ($this->echo_mode) echo $txt;
		else $this->result .= $txt;
	}

	function build_header() {
		$this->add( $this->v_line() );
		$this->build_simple_row(array_keys($this->tb_fields));
		$this->add( $this->v_line() );
	}

	function build_footer() {
		if (!$this->row_sep_flag) $this->add( $this->v_line() );
	}

	function build_simple_row($data_arr) {
		$data_arr = $this->padding_arr($data_arr);
		$i = 0;
		$this->add( $this->sep );
		foreach ($this->tb_fields as $tb_field => $width)
			$this->add( $this->fix_str($data_arr[$i++], $width) );
		$this->add( $this->br );
	}

	function build_row($data_arr) {
		$data_arr = $this->padding_arr($data_arr);
		$new_data_arr = array();
		$new_data_flag = 0;
		$i = 0;
		$this->add( $this->sep );
		foreach ($this->tb_fields as $tb_field => $width) {
			$data_item = $data_arr[$i++];
			$sub_item = "";
			if (strlen($data_item) > $width) {
				$sub_item = substr($data_item, $width - 1); // -1 - to padd 1
				$data_item = substr($data_item, 0, $width - 1);
				$new_data_flag = 1;
			}
			$new_data_arr[] = $sub_item;
			$this->add( $this->fix_str($data_item, $width) );
		}
		$this->add( $this->br );
		if ($this->row_sep_flag && !$new_data_flag) $this->add( $this->v_line() );
		if ($new_data_flag) // recursive
			$this->build_row($new_data_arr);
	}

	function build_rows($rows_arr) {
		foreach ($rows_arr as $row_data)
			$this->build_row($row_data);
	}

	function v_line() {
		return $this->v_line.$this->br;
		//return str_repeat($this->sep2, $this->tb_total_width);
	}

	function fix_str($text, $width) {
		$text = $text;
		if ($this->html_mode) $text = htmlspecialchars($text);
		$count = $width - strlen($text);
		$text = str_replace(array("\r\n","\t"), array($this->space.$this->space, $this->space), $text);
		if ($count < 0) $count = 0;
		return $text.str_repeat($this->space, $count).$this->sep;
	}

	function padding_arr($data_arr) {
		$pad_data_arr = array();
		foreach ($data_arr as $item)
			$pad_data_arr[] = $this->padding($item);
		return $pad_data_arr;
	}

	# making space padding
	function padding($txt) {
		return $this->space.$txt.$this->space;
	}

}
?>