View difference between Paste ID: YhKEi5B7 and L4eiJUtZ
SHOW: | | - or go back to the newest paste.
1
<?php
2
/*
3
*	Project: Nebula Templating Engine
4
*	By: Mansoor Sayed
5
*
6
*
7
*/
8
if (!defined('NEBULA_DIR'))
9
	define('NEBULA_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR);
10
if(!defined('PHP'))
11
	define('PHP', ".php");
12
	
13
class Nebula
14
{
15
	var $LEFT_DELIMITER = '{-';		//Opening delimiter
16
	var $RIGHT_DELIMITER = '-}';	//Opening delimiter
17
	var $ERROR_REPORT = true;
18
	var $CACHE = true;  //enable/disable caching
19
	var $CACHE_DIR = 'Nebula_cache/';// relitive to the php file calling this class's location
20
	var $PLUGIN_DIR = 'Nebula_plugin/';
21
	var $TEMPLATE_DIR = 'template/';
22
	var $PLUGIN_SYNTX = 'plugin.';//Nebula_plugin_name()
23
	var $PLUGIN_FUNC_STNX = 'Nebula_plugin_'; //sintax for the main function of the plugin
24
	var $CACHE_FILE_SNTX = 'Nebula_cache.';//Nebula_cache_pagename()
25
	
26
	/*  END OF CONFIG */
27
	
28
	var $CONTLIST = array();
29
	var $PLUGINS = array();
30
	var $CONTROLS = array();
31
	var $CURRPAGE = ''; // for the use of any plugin
32
	protected static $erroflag = false;
33
	protected static $pagerro = array();
34
	var $CACHEINCLUDE = array();
35
36
	function start(){
37
		if(count($this->CONTLIST) == 0) //Checking to see if there is any content.
38
			$this->_reperro("Error! There is no content to display!");
39
		$curr_file = $this->CACHE_DIR .$this->CACHE_FILE_SNTX .$this->CURRPAGE .PHP;
40
		if($this->CACHE === true && file_exists($curr_file) == true)
41
			include_once($curr_file);
42
		else{
43
			$this->_load_plugins();
44
			$content = $this->_replace($this->_merge(array_reverse($this->CONTLIST)));
45
			if ($this->ERROR_REPORT == true)
46
				foreach(Nebula::$pagerro as $erro)
47
					$content = $erro . $content;
48
			$fh = fopen($curr_file, 'w');
49
			fwrite($fh, $content);
50
			fclose($fh);
51
			include_once($curr_file);
52
			if($this->CACHE === false)
53
				unlink($curr_file);
54
		}
55
	}
56
	function display($content){
57
	// will not import a file!!
58
		$this->CONTLIST[] = $content;
59
	}
60
	function display_file($file){// import a file as page content
61
		if (file_exists($file))
62
		{
63
			$this->CONTLIST[] = file_get_contents($file);
64
		}
65
		else
66
			$this->_reperro("Error! The file '" .$file ."' was not found!");
67
	}
68
	function _merge($parts){
69
		$content = '';
70
		foreach ($parts as $peep)
71
			$content .= $peep;
72
		return $content;
73
	}
74
	function _load_plugins(){// also, as of now, prepares the variable array list
75
		if ($handle = opendir($this->PLUGIN_DIR)){
76
			while (false !== ($file = readdir($handle))){
77
				if(false !== strstr($file, $this->PLUGIN_SYNTX)){
78
					$prt = explode('.', $file);
79
					$this->PLUGINS[$prt[1]] = $file;
80
				}
81
			}
82
			closedir($handle);
83
		}
84
	}
85
	function set_controls($controls){
86
		$this->CONTROLS[] = $controls;
87
	}
88
	function cache($pram = true){
89
		$this->CACHE = $pram;
90
	}
91
	function set_currpage($iden){
92
		$this->CURRPAGE = $iden;
93
	}
94
	function clearCache(){
95
		if ($handle = opendir($this->CACHE_DIR)){
96
			while (false !== ($file = readdir($handle))){
97
				if(false !== strstr($file, $this->CACHE_FILE_SNTX)){
98
					if(!unlink($this->CACHE_DIR .$file))
99
						$this->_reperro("Error! Cannot delete cache files \"" .$this->CACHE_DIR .$file ."\"<br/>");
100
				}
101
			}
102
			closedir($handle);	
103
			}
104
		else
105
			$this->_reperro("Error! Can't open Plugin directory! \"" .$this->CACHE_DIR ."\" Do you have permission? Does it exist?");
106
	}
107
	function clearPageCache($page){
108
		unlink($this->CACHE_DIR .$this->CACHE_FILE_SNTX .$page .PHP);
109
	}
110
	function _reperro($erro){
111
		Nebula::$erroflag = true;
112
		Nebula::$pagerro[] = $erro . "<br/>";
113
	}
114
	function _replace($content)	{// this will take an array of "list" of conditions (boolean) to be tested in the template
115
		$controls = array();
116
		$results = array();
117
		$subpat = "\s*IF\s*([A-Za-z0-9_]+)\s*(\>|\<|\=)\s*(\d|'true'|'false'|[A-Za-z0-9_]+)\s*DO\s*'(.*?)'\s*ELSE\s*'(.*?)'\s*";
118
		$pattern = '`' .$this->LEFT_DELIMITER ."\s*" .$subpat ."\s*" .$this->RIGHT_DELIMITER .'`i';
119
		$count = preg_match_all($pattern, $content, $results);
120
		foreach ($this->PLUGINS as $iden => $fileName){
121
			$pattern2 = '`' .$this->LEFT_DELIMITER .'\s*' .$iden .'\s*' .$this->RIGHT_DELIMITER .'`i';
122
			$replace2 = "' . " .$this->PLUGIN_SYNTX .$iden ."() . '";
123
			for ($i = 0; $i < $count; $i++){
124
				$results[4][$i] = preg_replace($pattern2, $replace2, $results[4][$i]);
125
				$results[5][$i] = preg_replace($pattern2, $replace2, $results[5][$i]);
126
			}
127
		}
128
		for ($i = 0; $i<$count; $i++){ // Making sure that there are no php syntax errors at runtime
129
			switch ($results[2][$i])
130
			{
131
			case '<':
132
				$op = '<';
133
				break;
134
			case '>':
135
				$op = '>';
136
				break;
137
			case '=':
138
				$op = '==';
139
				break;
140
				default:$op = '==';// for idk erro avoidence
141
				$this->_reperro("Invalid Operator!");
142
				break;
143
			}
144
			if (!isset($this->CONTROLS[0][$results[1][$i]]))
145
				continue;
146
			$content = str_replace($results[0][$i], '<?php 
147
									if($' .$results[1][$i] .$op .$results[3][$i] .')
148
									{
149
									echo \'' .$results[4][$i] .'\';' .'}
150
									else
151
									{
152
									echo \'' .$results[5][$i] .'\';'.'
153
									}?>', $content);	// Creating the test statement for compiling
154
		}
155
		$fakeray = array();
156
		$fakecounter = 0;
157
		$ifUsedCount = 0;
158
		$jumble = $this->LEFT_DELIMITER .'Place_Holder.' .rand() .$this->RIGHT_DELIMITER;
159
		$pattarn = '`' .$this->LEFT_DELIMITER ."\s*([A-Za-z0-9_]+)\s*" .$this->RIGHT_DELIMITER .'`i';
160
		$fake_pat = '`' .$this->LEFT_DELIMITER ."(.*)'(.*?)\{-\s*([A-Za-z0-9_]+)\s*-\}(.*?)'(.*)" .$this->RIGHT_DELIMITER .'`i';
161
		// For returning statements inside the two delimeters that do not make sense without changing it
162
		preg_match_all($fake_pat, $content, $fakeray);	
163
		$content = preg_replace($fake_pat, $jumble, $content, -1, $fakecounter);
164
		$includeprt = '<?php ';
165
		foreach ($this->PLUGINS as $iden => $arrayVar){
166
			$bob = explode('.', $arrayVar);
167
			$pattern = '`' .$this->LEFT_DELIMITER .$bob[1] .$this->RIGHT_DELIMITER .'`i';
168
			$replace = '<?php echo ' .$this->PLUGIN_FUNC_STNX .$iden .'(); ?>';
169
			$content = preg_replace($pattern, $replace, $content,-1,$ifUsedCount);
170
			if($ifUsedCount !=0) //this is used to include only the plugins that are used. for optomization...
171
				$includeprt .= 'include_once(\'' .$this->PLUGIN_DIR .$arrayVar .'\'); ';
172
		}
173
		$includeprt .= ' ?>';
174
		for ($i = 0; $i < $fakecounter; $i++)
175
			$content = preg_replace('`' .$jumble .'`', $fakeray[0][$i], $content);
176
		return $includeprt .$content;
177
	}
178
}
179
180
?>