diff --git a/index.php b/index.php index eb0f3ac..2067b1a 100644 --- a/index.php +++ b/index.php @@ -136,18 +136,20 @@ if (!$public){ // récupère, parse, modifie & enregistre les fichier CSS (et les fichiés liés) $n = 0; $count = count($liste_css); - while ( $n < $count ) { + while ( $n < $count and $n <300) { // no more than 300 ext files. $i = $n; $file = $liste_css[$i]; if ($data = get_external_file($file['url_fichier'], 3) and ($data !== FALSE) ) { if (preg_match('#(css|php|txt|html|xml|js)#', $file['url_fichier']) ) { $matches_url = array(); - preg_match_all('#url\s*\(("|\')?([^\'")]*)(\'|")?\)#i', $data, $matches_url, PREG_SET_ORDER); + preg_match_all('#url\s{0,}\(("|\')?([^\'")]{1,})(\'|")?\)#i', $data, $matches_url, PREG_SET_ORDER); $matches_url2 = array(); - preg_match_all('#@import\s*(url\()?["\']?([^\'"\(\);]*)["\']?\)?([^;]*);#i', $data, $matches_url2, PREG_SET_ORDER); + preg_match_all("#@import\s*(?:\"([^\">]*)\"?|'([^'>]*)'?)([^;]*)(;|$)#i", $data, $matches_url2, PREG_SET_ORDER); + $matches_url = array_merge($matches_url2, $matches_url); + // pour chaque URL/URI foreach ($matches_url as $j => $valuej) { @@ -161,14 +163,22 @@ if (!$public){ if (preg_match('#^https?://#', $matches_url[$j][2])) { $url_fichier = $matches_url[$j][2]; } + // abs url w/o protocole + elseif (preg_match('#^//#', $matches_url[$j][2])) { + $url_fichier = $url_p['s'].':'.$matches_url[$j][2]; + } + // rel url elseif (preg_match('#^/#', $matches_url[$j][2])) { $url_fichier = $url_p['s'].'://'.$url_p['h'].$matches_url[$j][2]; } + else { - $url_fichier = substr($file['url_fichier'], 0, -strlen($file['nom_fich_origine'])).$matches_url[$j][2]; + $endstr = ($w = strpos($file['url_fichier'], '?')) ? $w : strlen($file['url_fichier']); + $url_fichier = substr(substr($file['url_fichier'], 0, $endstr), 0, -strlen($file['nom_fich_origine'])).$matches_url[$j][2]; } // new rand name, for local storage. $nouveau_nom = rand_new_name($nom_fichier); + //echo '
'.$nouveau_nom."\n";
 							$add = TRUE;
 
 							// avoids downloading the same file twice. (yes, we re-use the same $retrievable ($files), why not ?)
@@ -220,7 +230,7 @@ if (!$public){
 			$GLOBALS['done']['lien'] = $GLOBALS['target_folder'].'/';			
 		}
 
-	}
+	}//die;
 
 
 	// in case of delete an entry
@@ -376,6 +386,10 @@ function list_retrievable_data($url, &$data) {
 	foreach($matches as $i => $value) {
 		$matches_url = array();
 		preg_match_all('#url\s*\(("|\')?([^\'")]*)(\'|")?\)#i', $matches[$i][1], $matches_url, PREG_SET_ORDER);
+		$matches_url2 = array();
+		preg_match_all("#@import\s*(\"([^\">]*)\"?|'([^'>]*)'?)([^;]*)(;|$)#i", $matches[$i][1], $matches_url2, PREG_SET_ORDER);
+		$matches_url = array_merge($matches_url2, $matches_url);
+		//echo '
';print_r($matches_url);die;
 
 		// pour chaque URL/URI
 		foreach ($matches_url as $j => $valuej) {
@@ -412,29 +426,50 @@ function absolutes_links(&$data) {
 	foreach($matches as $i => $link) {
 		$link[1] = trim($link[1]);
 		if (!preg_match('#^(([a-z]+://)|(\#))#', $link[1]) ) {
-			// absolute path w/o HTTP : add http.
-			if (preg_match('#^//#', $link[1])) {
-				$matches[$i][1] = $url_p['s'].':'.$link[1];
-			}
-			// absolute local path : add http://domainname.tld
-			elseif (preg_match('#^/#', $link[1])) {
-				$matches[$i][1] = $url_p['s'].'://'.$url_p['h'].$link[1];
-			}
-			// relative local path : add http://domainename.tld/path/
-			else {
-				$uuu = (strlen($url_p['file']) == 0 or preg_match('#/$#', $url_p['pat'])) ? $GLOBALS['url'] : substr($GLOBALS['url'], 0, -strlen($url_p['file'])) ;
-
-				$matches[$i][1] = $uuu.$link[1];
-			}
+			$matches[$i][1] = complete_url($link[1]);
 			$new_match = str_replace($matches[$i][2], $matches[$i][1], $matches[$i][0]);
 			$data = str_replace($matches[$i][0], $new_match, $data);
 		}
-
-
-
-
 	}
+}
 
+function complete_url($url) {
+	$home_p = url_parts();
+
+	$url = trim($url);
+	if ($url === '') {
+		return '';
+	}
+//	echo $url."\n\n\n";
+
+	$hash_pos = strrpos($url, '#');
+	$fragment = $hash_pos !== false ? '#' . substr($url, $hash_pos) : '';
+	$sep_pos  = strpos($url, '://');
+
+	if ($sep_pos === false || $sep_pos > 5) {
+		switch ($url{0}) {
+			// absolute path w/o HTTP and relatives paths
+			case '/':
+				$url = substr($url, 0, 2) === '//' ? $home_p['s'] . ':' . $url : $home_p['s'] . '://' . $home_p['h'] . $url;
+				break;
+			// php query string
+			case '?':
+				$url = $home_p['h'] . '/' . $home_p['file'] . $url;
+				break;
+			// html # particule
+			case '#':
+			// magnet & mailto
+			case 'm':
+			// javascript
+			case 'j':
+				break;
+			default:
+				$url = $home_p['h'] . '/' . $url;
+				break;
+		}
+	}
+//	echo $url."\n\n\n";
+	return $url;
 }
 
 function add_table_and_replace(&$data, $retrievable, &$match1, $match, $url_p, $type) {
@@ -490,7 +525,12 @@ function add_table_and_replace(&$data, $retrievable, &$match1, $match, $url_p, $
 
 	return $retrievable;
 }
-function rand_new_name($name) {return 'f_'.str_shuffle('abcd').mt_rand(100, 999).'--'.preg_replace('#[^\w.]#', '_', $name);}
+function rand_new_name($name) {
+	$name = substr($name, 0, (($w = strpos($name, '?')) ? $w : strlen($name)));
+	return 'f_'.str_shuffle('abcd').mt_rand(100, 999).'--'.preg_replace('#[^\w.]#', '_', substr($name, 15)).'.'.pathinfo($name, PATHINFO_EXTENSION);
+}
+
+
 if ($GLOBALS['done']['d'] !== FALSE) {
 	switch($GLOBALS['done']['d']) {
 		case 'ajout' :
@@ -560,8 +600,9 @@ if ($GLOBALS['done']['d'] !== FALSE) {
 			if (is_dir($GLOBALS['public_data_folder'].'/'.$liste_pages[$i]) and ($liste_pages[$i] != '.') and ($liste_pages[$i] != '..')) {
 				// each folder should contain such a file "index.ini".
 				$ini_file = $GLOBALS['public_data_folder'].'/'.$liste_pages[$i].'/index.ini';
-				$favicon=glob($GLOBALS['public_data_folder'].'/'.$liste_pages[$i].'/*favicon.*');
-				if (!empty($favicon)){$favicon=$favicon[0];}
+				$favicon = glob($GLOBALS['public_data_folder'].'/'.$liste_pages[$i].'/*favicon.*');
+
+				$favicon = (isset($favicon[0])) ? $favicon[0] : '';
 				if ( is_file($ini_file) and is_readable($ini_file) ) {
 					$infos = parse_ini_file($ini_file);
 				} else {
@@ -593,7 +634,7 @@ if ($GLOBALS['done']['d'] !== FALSE) {
 					// each folder should contain such a file "index.ini".
 					$ini_file = $GLOBALS['private_data_folder'].'/'.$liste_pages[$i].'/index.ini';
 					$favicon=glob($GLOBALS['private_data_folder'].'/'.$liste_pages[$i].'/*favicon.*');
-					if (!empty($favicon)){$favicon=$favicon[0];}
+					$favicon = (isset($favicon[0])) ? $favicon[0] : '';
 					if ( is_file($ini_file) and is_readable($ini_file) ) {
 						$infos = parse_ini_file($ini_file);
 					} else {