diff options
Diffstat (limited to '')
-rw-r--r-- | BSF/include/functions_url.inc.php | 740 |
1 files changed, 740 insertions, 0 deletions
diff --git a/BSF/include/functions_url.inc.php b/BSF/include/functions_url.inc.php new file mode 100644 index 000000000..fa7114dea --- /dev/null +++ b/BSF/include/functions_url.inc.php @@ -0,0 +1,740 @@ +<?php +// +-----------------------------------------------------------------------+ +// | Piwigo - a PHP based picture gallery | +// +-----------------------------------------------------------------------+ +// | Copyright(C) 2008 Piwigo Team http://piwigo.org | +// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net | +// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick | +// +-----------------------------------------------------------------------+ +// | This program is free software; you can redistribute it and/or modify | +// | it under the terms of the GNU General Public License as published by | +// | the Free Software Foundation | +// | | +// | This program is distributed in the hope that it will be useful, but | +// | WITHOUT ANY WARRANTY; without even the implied warranty of | +// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | +// | General Public License for more details. | +// | | +// | You should have received a copy of the GNU General Public License | +// | along with this program; if not, write to the Free Software | +// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | +// | USA. | +// +-----------------------------------------------------------------------+ + + +/** + * returns a prefix for each url link on displayed page + * and return an empty string for current path + * @return string + */ +function get_root_url() +{ + global $page; + if ( isset($page['root_path']) ) + { + $root_url = $page['root_path']; + } + else + {// TODO - add HERE the possibility to call PWG functions from external scripts + $root_url = PHPWG_ROOT_PATH; + } + if ( dirname($root_url)!='.' ) + { + return $root_url; + } + else + { + return (string)substr($root_url, 2); + } +} + +/** + * returns the absolute url to the root of PWG + * @param boolean with_scheme if false - does not add http://toto.com + */ +function get_absolute_root_url($with_scheme=true) +{ + // TODO - add HERE the possibility to call PWG functions from external scripts + $url = ''; + if ($with_scheme) + { + if (empty($_SERVER['HTTPS'])) + { + $url .= 'http://'; + } + else + { + $url .= 'https://'; + } + $url .= $_SERVER['HTTP_HOST']; + if ($_SERVER['SERVER_PORT'] != 80) + { + $url_port = ':'.$_SERVER['SERVER_PORT']; + if (strrchr($url, ':') != $url_port) + { + $url .= $url_port; + } + } + } + $url .= cookie_path(); + return $url; +} + +/** + * adds one or more _GET style parameters to an url + * example: add_url_params('/x', array('a'=>'b')) returns /x?a=b + * add_url_params('/x?cat_id=10', array('a'=>'b')) returns /x?cat_id=10&a=b + * @param string url + * @param array params + * @return string + */ +function add_url_params($url, $params) +{ + if ( !empty($params) ) + { + assert( is_array($params) ); + $is_first = true; + foreach($params as $param=>$val) + { + if ($is_first) + { + $is_first = false; + $url .= ( strstr($url, '?')===false ) ? '?' :'&'; + } + else + { + $url .= '&'; + } + $url .= $param; + if (isset($val)) + { + $url .= '='.$val; + } + } + } + return $url; +} + +/** + * build an index URL for a specific section + * + * @param array + * @return string + */ +function make_index_url($params = array()) +{ + global $conf; + $url = get_root_url().'index'; + if ($conf['php_extension_in_urls']) + { + $url .= '.php'; + } + if ($conf['question_mark_in_urls']) + { + $url .= '?'; + } + $url.= make_section_in_url($params); + $url = add_well_known_params_in_url($url, $params); + return $url; +} + +/** + * build an index URL with current page parameters, but with redefinitions + * and removes. + * + * duplicate_index_url( array( + * 'category' => array('id'=>12, 'name'=>'toto'), + * array('start') + * ) will create an index URL on the current section (categories), but on + * a redefined category and without the start URL parameter. + * + * @param array redefined keys + * @param array removed keys + * @return string + */ +function duplicate_index_url($redefined = array(), $removed = array()) +{ + return make_index_url( + params_for_duplication($redefined, $removed) + ); +} + +/** + * returns $page global array with key redefined and key removed + * + * @param array redefined keys + * @param array removed keys + * @return array + */ +function params_for_duplication($redefined, $removed) +{ + global $page; + + if (count($removed) > 0) + { + $params = array(); + + foreach ($page as $page_item_key => $page_item_value) + { + if (!in_array($page_item_key, $removed)) + { + $params[$page_item_key] = $page_item_value; + } + } + } + else + { + $params = $page; + } + + foreach ($redefined as $redefined_param => $redefined_value) + { + $params[$redefined_param] = $redefined_value; + } + + return $params; +} + +/** + * create a picture URL with current page parameters, but with redefinitions + * and removes. See duplicate_index_url. + * + * @param array redefined keys + * @param array removed keys + * @return string + */ +function duplicate_picture_url($redefined = array(), $removed = array()) +{ + return make_picture_url( + params_for_duplication($redefined, $removed) + ); +} + +/** + * create a picture URL on a specific section for a specific picture + * + * @param array + * @return string + */ +function make_picture_url($params) +{ + global $conf; + if (!isset($params['image_id'])) + { + die('make_picture_url: image_id is a required parameter'); + } + + $url = get_root_url().'picture'; + if ($conf['php_extension_in_urls']) + { + $url .= '.php'; + } + if ($conf['question_mark_in_urls']) + { + $url .= '?'; + } + $url.= '/'; + switch ( $conf['picture_url_style'] ) + { + case 'id-file': + $url .= $params['image_id']; + if ( isset($params['image_file']) ) + { + $url .= '-'.get_filename_wo_extension($params['image_file']); + } + break; + case 'file': + if ( isset($params['image_file']) ) + { + $fname_wo_ext = get_filename_wo_extension($params['image_file']); + if (! preg_match('/^\d+(-|$)/', $fname_wo_ext) ) + { + $url .= $fname_wo_ext; + break; + } + } + default: + $url .= $params['image_id']; + } + if ( !isset($params['category'] ) ) + {// make urls shorter ... + unset( $params['flat'] ); + } + $url .= make_section_in_url($params); + $url = add_well_known_params_in_url($url, $params); + return $url; +} + +/** + *adds to the url the chronology and start parameters +*/ +function add_well_known_params_in_url($url, $params) +{ + if ( isset($params['chronology_field']) ) + { + $url .= '/'. $params['chronology_field']; + $url .= '-'. $params['chronology_style']; + if ( isset($params['chronology_view']) ) + { + $url .= '-'. $params['chronology_view']; + } + if ( !empty($params['chronology_date']) ) + { + $url .= '-'. implode('-', $params['chronology_date'] ); + } + } + + if (isset($params['flat'])) + { + $url.= '/flat'; + } + + if (isset($params['start']) and $params['start'] > 0) + { + $url.= '/start-'.$params['start']; + } + return $url; +} + +/** + * return the section token of an index or picture URL. + * + * Depending on section, other parameters are required (see function code + * for details) + * + * @param array + * @return string + */ +function make_section_in_url($params) +{ + global $conf; + $section_string = ''; + + $section_of = array( + 'category' => 'categories', + 'tags' => 'tags', + 'list' => 'list', + 'search' => 'search', + ); + + foreach ($section_of as $param => $section) + { + if (isset($params[$param])) + { + $params['section'] = $section; + } + } + + if (!isset($params['section'])) + { + $params['section'] = 'none'; + } + + switch($params['section']) + { + case 'categories' : + { + if (!isset($params['category'])) + { + $section_string.= '/categories'; + } + else + { + is_array($params['category']) or trigger_error( + 'make_section_in_url wrong type for category', E_USER_WARNING + ); + is_numeric($params['category']['id']) or trigger_error( + 'make_section_in_url category id not numeric', E_USER_WARNING + ); + isset($params['category']['name']) or trigger_error( + 'make_section_in_url category name not set', E_USER_WARNING + ); + + array_key_exists('permalink', $params['category']) or trigger_error( + 'make_section_in_url category permalink not set', E_USER_WARNING + ); + + $section_string.= '/category/'; + if ( empty($params['category']['permalink']) ) + { + $section_string.= $params['category']['id']; + if ( $conf['category_url_style']=='id-name' ) + { + $section_string.= '-'.str2url($params['category']['name']); + } + } + else + { + $section_string.= $params['category']['permalink']; + } + } + + break; + } + case 'tags' : + { + if (!isset($params['tags']) or count($params['tags']) == 0) + { + die('make_section_in_url: require at least one tag'); + } + + $section_string.= '/tags'; + + foreach ($params['tags'] as $tag) + { + switch ( $conf['tag_url_style'] ) + { + case 'id': + $section_string.= '/'.$tag['id']; + break; + case 'tag': + if (isset($tag['url_name']) and !is_numeric($tag['url_name']) ) + { + $section_string.= '/'.$tag['url_name']; + break; + } + default: + $section_string.= '/'.$tag['id']; + if (isset($tag['url_name'])) + { + $section_string.= '-'.$tag['url_name']; + } + } + } + + break; + } + case 'search' : + { + if (!isset($params['search'])) + { + die('make_section_in_url: require a search identifier'); + } + + $section_string.= '/search/'.$params['search']; + + break; + } + case 'list' : + { + if (!isset($params['list'])) + { + die('make_section_in_url: require a list of items'); + } + + $section_string.= '/list/'.implode(',', $params['list']); + + break; + } + case 'none' : + { + break; + } + default : + { + $section_string.= '/'.$params['section']; + } + } + + return $section_string; +} + +/** + * the reverse of make_section_in_url + * returns the 'section' (categories/tags/...) and the data associated with it + * + * Depending on section, other parameters are returned (category/tags/list/...) + * + * @param array of url tokens to parse + * @param int the index in the array of url tokens; in/out + * @return array + */ +function parse_section_url( $tokens, &$next_token) +{ + $page=array(); + if (0 === strpos(@$tokens[$next_token], 'categor')) + { + $page['section'] = 'categories'; + $next_token++; + + if (isset($tokens[$next_token]) ) + { + if (preg_match('/^(\d+)(?:-(.+))?$/', $tokens[$next_token], $matches)) + { + if ( isset($matches[2]) ) + $page['hit_by']['cat_url_name'] = $matches[2]; + $page['category'] = $matches[1]; + $next_token++; + } + else + {// try a permalink + $maybe_permalinks = array(); + $current_token = $next_token; + while ( isset($tokens[$current_token]) + and strpos($tokens[$current_token], 'created-')!==0 + and strpos($tokens[$current_token], 'posted-')!==0 + and strpos($tokens[$next_token], 'start-')!==0 + and $tokens[$current_token] != 'flat') + { + if (empty($maybe_permalinks)) + { + array_push($maybe_permalinks, $tokens[$current_token]); + } + else + { + array_push($maybe_permalinks, + $maybe_permalinks[count($maybe_permalinks)-1] + . '/' . $tokens[$current_token] + ); + } + $current_token++; + } + + if ( count($maybe_permalinks) ) + { + $cat_id = get_cat_id_from_permalinks($maybe_permalinks, $perma_index); + if ( isset($cat_id) ) + { + $next_token += $perma_index+1; + $page['category'] = $cat_id; + $page['hit_by']['cat_permalink'] = $maybe_permalinks[$perma_index]; + } + else + { + page_not_found('Permalink for album not found'); + } + } + } + } + + if (isset($page['category'])) + { + $result = get_cat_info($page['category']); + if (empty($result)) + { + page_not_found('Requested category does not exist' ); + } + $page['category']=$result; + } + } + else if (0 === strpos(@$tokens[$next_token], 'tag')) + { + $page['section'] = 'tags'; + $page['tags'] = array(); + + $next_token++; + $i = $next_token; + + $requested_tag_ids = array(); + $requested_tag_url_names = array(); + + while (isset($tokens[$i])) + { + if ( preg_match('/^(created-|posted-|start-(\d)+)/', $tokens[$i]) ) + break; + + if ( preg_match('/^(\d+)(?:-(.*))?/', $tokens[$i], $matches) ) + { + array_push($requested_tag_ids, $matches[1]); + } + else + { + array_push($requested_tag_url_names, $tokens[$i]); + } + $i++; + } + $next_token = $i; + + if ( empty($requested_tag_ids) && empty($requested_tag_url_names) ) + { + bad_request('at least one tag required'); + } + + $page['tags'] = find_tags($requested_tag_ids, $requested_tag_url_names); + if ( empty($page['tags']) ) + { + page_not_found('Requested tag does not exist', get_root_url().'tags.php' ); + } + } + else if (0 === strpos(@$tokens[$next_token], 'fav')) + { + $page['section'] = 'favorites'; + $next_token++; + } + else if ('most_visited' == @$tokens[$next_token]) + { + $page['section'] = 'most_visited'; + $next_token++; + } + else if ('best_rated' == @$tokens[$next_token]) + { + $page['section'] = 'best_rated'; + $next_token++; + } + else if ('recent_pics' == @$tokens[$next_token]) + { + $page['section'] = 'recent_pics'; + $next_token++; + } + else if ('recent_cats' == @$tokens[$next_token]) + { + $page['section'] = 'recent_cats'; + $next_token++; + } + else if ('search' == @$tokens[$next_token]) + { + $page['section'] = 'search'; + $next_token++; + + preg_match('/(\d+)/', @$tokens[$next_token], $matches); + if (!isset($matches[1])) + { + bad_request('search identifier is missing'); + } + $page['search'] = $matches[1]; + $next_token++; + } + else if ('list' == @$tokens[$next_token]) + { + $page['section'] = 'list'; + $next_token++; + + $page['list'] = array(); + + // No pictures + if (empty($tokens[$next_token])) + { + // Add dummy element list + array_push($page['list'], -1); + } + // With pictures list + else + { + if (!preg_match('/^\d+(,\d+)*$/', $tokens[$next_token])) + { + bad_request('wrong format on list GET parameter'); + } + foreach (explode(',', $tokens[$next_token]) as $image_id) + { + array_push($page['list'], $image_id); + } + } + $next_token++; + } + return $page; +} + +/** + * the reverse of add_well_known_params_in_url + * parses start, flat and chronology from url tokens +*/ +function parse_well_known_params_url($tokens, &$i) +{ + $page = array(); + while (isset($tokens[$i])) + { + if (preg_match('/^start-(\d+)/', $tokens[$i], $matches)) + { + $page['start'] = $matches[1]; + } + + if ( 'flat' == $tokens[$i] ) + { + // indicate a special list of images + $page['flat'] = true; + } + + if (preg_match('/^(posted|created)/', $tokens[$i] )) + { + $chronology_tokens = explode('-', $tokens[$i] ); + + $page['chronology_field'] = $chronology_tokens[0]; + + array_shift($chronology_tokens); + $page['chronology_style'] = $chronology_tokens[0]; + + array_shift($chronology_tokens); + if ( count($chronology_tokens)>0 ) + { + if ('list'==$chronology_tokens[0] or + 'calendar'==$chronology_tokens[0]) + { + $page['chronology_view'] = $chronology_tokens[0]; + array_shift($chronology_tokens); + } + $page['chronology_date'] = $chronology_tokens; + } + } + $i++; + } + return $page; +} + +/** + * Indicate to build url with full path + * + * @param null + * @return null + */ +function set_make_full_url() +{ + global $page; + + if (!isset($page['save_root_path'])) + { + if (isset($page['root_path'])) + { + $page['save_root_path']['path'] = $page['root_path']; + } + $page['save_root_path']['count'] = 1; + $page['root_path'] = get_absolute_root_url(); + } + else + { + $page['save_root_path']['count'] += 1; + } +} + +/** + * Restore old parameter to build url with full path + * + * @param null + * @return null + */ +function unset_make_full_url() +{ + global $page; + + if (isset($page['save_root_path'])) + { + if ($page['save_root_path']['count'] == 1) + { + if (isset($page['save_root_path']['path'])) + { + $page['root_path'] = $page['save_root_path']['path']; + } + else + { + unset($page['root_path']); + } + unset($page['save_root_path']); + } + else + { + $page['save_root_path']['count'] -= 1; + } + } +} + +/** + * Embellish the url argument + * + * @param $url + * @return $url embellished + */ +function embellish_url($url) +{ + return str_replace('/./', '/', $url); +} + +?>
\ No newline at end of file |