source: trunk/include/functions_html.inc.php @ 1830

Last change on this file since 1830 was 1830, checked in by vdigital, 17 years ago

0000645: HTML Conformity (Temporary fixed)
Description 1- tags.php/tags.tpl Need to be fixed more... see FIXME in tags.tpl
when no tags are available.

2- search.php => Remove class="bouton" : Done

0000648: CSS Conformity (1) (Partly fixed)

Description
clear/theme.css + dark/theme
54 #content UL.thumbnails SPAN.wrap2:hover Propriété érronée : background-color AntiqueWhite n'est pas une valeur de color : AntiqueWhite
60 #content UL.thumbnailCategories DIV.thumbnailCategory:hover Propriété érronée : background-color AntiqueWhite n'est pas une valeur de color : AntiqueWhite
66 #content UL.thumbnailCategories DIV.thumbnailCategory:hover A Propriété érronée : background-color AntiqueWhite n'est pas une valeur de color : AntiqueWhite

wipi/theme.css et p0w0
274 .2nmore En CSS1, il était possible d'avoir un nom de classe commençant par un chiffre (".55xx") sauf s'il s'agissait d'une dimension (".55cm"). En CSS2, de tels noms sont analysés comme étant des dimensions inconnues, pour permettre l'ajout de nouvelles unités).To make ".2nmore" a valid class, CSS2 requires the first digit to be escaped (".\32nmore")

w0p0
247 Le pseudo-élément ::after ne peut apparaitre dans le contexte css2
247 #content H2 Propriété érronée : content leader(dotted) n'est pas une valeur de content : leader(dotted)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.2 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | PhpWebGallery - a PHP based picture gallery                           |
4// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
5// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
6// +-----------------------------------------------------------------------+
7// | branch        : BSF (Best So Far)
8// | last update   : $Date: 2007-02-16 21:28:50 +0000 (Fri, 16 Feb 2007) $
9// | last modifier : $Author: vdigital $
10// | revision      : $Revision: 1830 $
11// +-----------------------------------------------------------------------+
12// | This program is free software; you can redistribute it and/or modify  |
13// | it under the terms of the GNU General Public License as published by  |
14// | the Free Software Foundation                                          |
15// |                                                                       |
16// | This program is distributed in the hope that it will be useful, but   |
17// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
18// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
19// | General Public License for more details.                              |
20// |                                                                       |
21// | You should have received a copy of the GNU General Public License     |
22// | along with this program; if not, write to the Free Software           |
23// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
24// | USA.                                                                  |
25// +-----------------------------------------------------------------------+
26
27function get_icon($date, $is_child_date = false)
28{
29  global $page, $user, $lang;
30
31  if (empty($date))
32  {
33    return '';
34  }
35
36  if (isset($page['get_icon_cache'][$date]))
37  {
38    if (! $page['get_icon_cache'][$date] )
39      return '';
40    return $page['get_icon_cache']['_icons_'][$is_child_date];
41  }
42
43  if (!preg_match('/^(\d{4})-(\d{2})-(\d{2})/', $date, $matches))
44  {// date can be empty, no icon to display
45    $page['get_icon_cache'][$date] = false;
46    return '';
47  }
48
49  list($devnull, $year, $month, $day) = $matches;
50  $unixtime = mktime( 0, 0, 0, $month, $day, $year );
51  if ($unixtime === false  // PHP 5.1.0 and above
52      or $unixtime === -1) // PHP prior to 5.1.0
53  {
54    $page['get_icon_cache'][$date] = false;
55    return '';
56  }
57
58  $diff = time() - $unixtime;
59  $day_in_seconds = 24*60*60;
60  $page['get_icon_cache'][$date] = false;
61  if ( $diff < $user['recent_period'] * $day_in_seconds )
62  {
63    if ( !isset($page['get_icon_cache']['_icons_'] ) )
64    {
65      $icons = array(false => 'recent', true => 'recent_by_child' );
66      $title = $lang['recent_image'].'&nbsp;'.$user['recent_period']
67          .'&nbsp;'.$lang['days'];
68      foreach ($icons as $key => $icon)
69      {
70        $icon_url = get_themeconf('icon_dir').'/'.$icon.'.png';
71        $size = getimagesize( PHPWG_ROOT_PATH.$icon_url );
72        $icon_url = get_root_url().$icon_url;
73        $output = '<img title="'.$title.'" src="'.$icon_url.'" class="icon" style="border:0;';
74        $output.= 'height:'.$size[1].'px;width:'.$size[0].'px" alt="(!)" />';
75        $page['get_icon_cache']['_icons_'][$key] = $output;
76      }
77    }
78    $page['get_icon_cache'][$date] = true;
79  }
80  if (! $page['get_icon_cache'][$date] )
81    return '';
82  return $page['get_icon_cache']['_icons_'][$is_child_date];
83}
84
85
86function create_navigation_bar(
87  $url, $nb_element, $start, $nb_element_page, $clean_url = false
88  )
89{
90  global $lang, $conf;
91
92  $pages_around = $conf['paginate_pages_around'];
93  $start_str = $clean_url ? '/start-' :
94    ( ( strstr($url, '?')===false ? '?':'&amp;') . 'start=' );
95
96  $navbar = '';
97
98  // current page detection
99  if (!isset($start)
100      or !is_numeric($start)
101      or (is_numeric($start) and $start < 0))
102  {
103    $start = 0;
104  }
105
106  // navigation bar useful only if more than one page to display !
107  if ($nb_element > $nb_element_page)
108  {
109    // current page and last page
110    $cur_page = ceil($start / $nb_element_page) + 1;
111    $maximum = ceil($nb_element / $nb_element_page);
112
113    // link to first page ?
114    if ($cur_page != 1)
115    {
116      $navbar.=
117        '<a href="'.$url.'" rel="start">'
118        .$lang['first_page']
119        .'</a>';
120    }
121    else
122    {
123      $navbar.= $lang['first_page'];
124    }
125    $navbar.= ' | ';
126    // link on previous page ?
127    if ($start != 0)
128    {
129      $previous = $start - $nb_element_page;
130
131      $navbar.=
132        '<a href="'
133        .$url.($previous > 0 ? $start_str.$previous : '')
134        .'" rel="prev">'
135        .$lang['previous_page']
136        .'</a>';
137    }
138    else
139    {
140      $navbar.= $lang['previous_page'];
141    }
142    $navbar.= ' |';
143
144    if ($cur_page > $pages_around + 1)
145    {
146      $navbar.= '&nbsp;<a href="'.$url.'">1</a>';
147
148      if ($cur_page > $pages_around + 2)
149      {
150        $navbar.= ' ...';
151      }
152    }
153
154    // inspired from punbb source code
155    for ($i = $cur_page - $pages_around, $stop = $cur_page + $pages_around + 1;
156         $i < $stop;
157         $i++)
158    {
159      if ($i < 1 or $i > $maximum)
160      {
161        continue;
162      }
163      else if ($i != $cur_page)
164      {
165        $temp_start = ($i - 1) * $nb_element_page;
166
167        $navbar.=
168          '&nbsp;'
169          .'<a href="'.$url
170          .($temp_start > 0 ? $start_str.$temp_start : '')
171          .'">'
172          .$i
173          .'</a>';
174      }
175      else
176      {
177        $navbar.=
178          '&nbsp;'
179          .'<span class="pageNumberSelected">'
180          .$i
181          .'</span>';
182      }
183    }
184
185    if ($cur_page < ($maximum - $pages_around))
186    {
187      $temp_start = ($maximum - 1) * $nb_element_page;
188
189      if ($cur_page < ($maximum - $pages_around - 1))
190      {
191        $navbar.= ' ...';
192      }
193
194      $navbar.= ' <a href="'.$url.$start_str.$temp_start.'">'.$maximum.'</a>';
195    }
196
197    $navbar.= ' | ';
198    // link on next page ?
199    if ($nb_element > $nb_element_page
200        and $start + $nb_element_page < $nb_element)
201    {
202      $next = $start + $nb_element_page;
203
204      $navbar.=
205        '<a href="'.$url.$start_str.$next.'" rel="next">'
206        .$lang['next_page']
207        .'</a>';
208    }
209    else
210    {
211      $navbar.= $lang['next_page'];
212    }
213
214    $navbar.= ' | ';
215    // link to last page ?
216    if ($cur_page != $maximum)
217    {
218      $temp_start = ($maximum - 1) * $nb_element_page;
219
220      $navbar.=
221        '<a href="'.$url.$start_str.$temp_start.'" rel="last">'
222        .$lang['last_page']
223        .'</a>';
224    }
225    else
226    {
227      $navbar.= $lang['last_page'];
228    }
229  }
230  return $navbar;
231}
232
233//
234// Pick a language, any language ...
235//
236function language_select($default, $select_name = "language")
237{
238  $available_lang = get_languages();
239
240  $lang_select = '<select name="' . $select_name . '">';
241  foreach ($available_lang as $code => $displayname)
242  {
243    $selected = ( strtolower($default) == strtolower($code) ) ? ' selected="selected"' : '';
244    $lang_select .= '<option value="' . $code . '"' . $selected . '>' . ucwords($displayname) . '</option>';
245  }
246  $lang_select .= '</select>';
247
248  return $lang_select;
249}
250
251/**
252 * returns the list of categories as a HTML string
253 *
254 * categories string returned contains categories as given in the input
255 * array $cat_informations. $cat_informations array must be an association
256 * of {category_id => category_name}. If url input parameter is null,
257 * returns only the categories name without links.
258 *
259 * @param array cat_informations
260 * @param string url
261 * @param boolean replace_space
262 * @return string
263 */
264function get_cat_display_name($cat_informations,
265                              $url = '',
266                              $replace_space = true)
267{
268  global $conf;
269
270  $output = '';
271  $is_first = true;
272  foreach ($cat_informations as $id => $name)
273  {
274    if ($is_first)
275    {
276      $is_first = false;
277    }
278    else
279    {
280      $output.= $conf['level_separator'];
281    }
282
283    if ( !isset($url) )
284    {
285      $output.= $name;
286    }
287    elseif ($url == '')
288    {
289      $output.= '<a href="'
290            .make_index_url(
291                array(
292                  'category'=>$id,
293                  'cat_name'=>$name
294                  )
295              )
296            .'">';
297      $output.= $name.'</a>';
298    }
299    else
300    {
301      $output.= '<a href="'.PHPWG_ROOT_PATH.$url.$id.'">';
302      $output.= $name.'</a>';
303    }
304  }
305  if ($replace_space)
306  {
307    return replace_space($output);
308  }
309  else
310  {
311    return $output;
312  }
313}
314
315/**
316 * returns the list of categories as a HTML string, with cache of names
317 *
318 * categories string returned contains categories as given in the input
319 * array $cat_informations. $uppercats is the list of category ids to
320 * display in the right order. If url input parameter is empty, returns only
321 * the categories name without links.
322 *
323 * @param string uppercats
324 * @param string url
325 * @param boolean replace_space
326 * @return string
327 */
328function get_cat_display_name_cache($uppercats,
329                                    $url = '',
330                                    $replace_space = true)
331{
332  global $cat_names, $conf;
333
334  if (!isset($cat_names))
335  {
336    $query = '
337SELECT id,name
338  FROM '.CATEGORIES_TABLE.'
339;';
340    $result = pwg_query($query);
341    while ($row = mysql_fetch_array($result))
342    {
343      $cat_names[$row['id']] = $row['name'];
344    }
345  }
346
347  $output = '';
348  $is_first = true;
349  foreach (explode(',', $uppercats) as $category_id)
350  {
351    $name = $cat_names[$category_id];
352
353    if ($is_first)
354    {
355      $is_first = false;
356    }
357    else
358    {
359      $output.= $conf['level_separator'];
360    }
361
362    if ( !isset($url) )
363    {
364      $output.= $name;
365    }
366    elseif ($url == '')
367    {
368      $output.= '
369<a href="'
370      .make_index_url(
371          array(
372            'category'=>$category_id,
373            'cat_name'=>$name
374            )
375        )
376      .'">'.$name.'</a>';
377    }
378    else
379    {
380      $output.= '
381<a href="'.PHPWG_ROOT_PATH.$url.$category_id.'">'.$name.'</a>';
382    }
383  }
384  if ($replace_space)
385  {
386    return replace_space($output);
387  }
388  else
389  {
390    return $output;
391  }
392}
393
394/**
395 * returns the HTML code for a category item in the menu (for the main page)
396 *
397 * HTML code generated uses logical list tags ul and each category is an
398 * item li. The paramter given is the category informations as an array,
399 * used keys are : id, name, nb_images, max_date_last, date_last
400 * count_images, count_categories
401 *
402 * @param array categories
403 * @return string
404 */
405function get_html_menu_category($categories)
406{
407  global $page, $lang;
408
409  $ref_level = 0;
410  $level = 0;
411  $menu = '';
412
413  // $page_cat value remains 0 for special sections
414  $page_cat = 0;
415  if (isset($page['category']))
416  {
417    $page_cat = $page['category'];
418  }
419
420  foreach ($categories as $category)
421  {
422    $level = substr_count($category['global_rank'], '.') + 1;
423    if ($level > $ref_level)
424    {
425      $menu.= "\n<ul>";
426    }
427    else if ($level == $ref_level)
428    {
429      $menu.= "\n</li>";
430    }
431    else if ($level < $ref_level)
432    {
433      // we may have to close more than one level at the same time...
434      $menu.= "\n</li>";
435      $menu.= str_repeat("\n</ul></li>",($ref_level-$level));
436    }
437    $ref_level = $level;
438
439    $menu.= "\n\n".'<li';
440    if ($category['id'] == $page_cat)
441    {
442      $menu.= ' class="selected"';
443    }
444    $menu.= '>';
445
446    $url = make_index_url(
447            array(
448              'category'=>$category['id'],
449              'cat_name'=>$category['name']
450              )
451            );
452
453    $menu.= "\n".'<a href="'.$url.'"';
454    if ($page_cat != 0
455        and $category['id'] == $page['cat_id_uppercat'])
456    {
457      $menu.= ' rel="up"';
458    }
459    $menu.= '>'.$category['name'].'</a>';
460
461    // Count of category is main
462    // if not picture on categorie, test on sub-categories
463    if (($category['nb_images'] > 0) or ($category['count_images'] > 0))
464    {
465      $menu.= "\n".'<span class="';
466      $menu.= ($category['nb_images'] > 0 ? "menuInfoCat"
467                                          : "menuInfoCatByChild").'"';
468      $menu.= ' title="';
469      $menu.= ' '.get_display_images_count
470                  (
471                    $category['nb_images'],
472                    $category['count_images'],
473                    $category['count_categories'],
474                    false
475                  ).'">';
476      $menu.= '['.($category['nb_images'] > 0 ? $category['nb_images']
477                                              : $category['count_images']).']';
478      $menu.= '</span>';
479    }
480    $child_date_last = @$category['max_date_last']> @$category['date_last'];
481    $menu.= get_icon($category['max_date_last'], $child_date_last);
482  }
483
484  $menu.= str_repeat("\n</li></ul>",($level));
485
486  return $menu;
487}
488
489/**
490 * returns HTMLized comment contents retrieved from database
491 *
492 * newlines becomes br tags, _word_ becomes underline, /word/ becomes
493 * italic, *word* becomes bolded
494 *
495 * @param string content
496 * @return string
497 */
498function parse_comment_content($content)
499{
500  $pattern = '/(https?:\/\/\S*)/';
501  $replacement = '<a href="$1" rel="nofollow">$1</a>';
502  $content = preg_replace($pattern, $replacement, $content);
503
504  $content = nl2br($content);
505
506  // replace _word_ by an underlined word
507  $pattern = '/\b_(\S*)_\b/';
508  $replacement = '<span style="text-decoration:underline;">$1</span>';
509  $content = preg_replace($pattern, $replacement, $content);
510
511  // replace *word* by a bolded word
512  $pattern = '/\b\*(\S*)\*\b/';
513  $replacement = '<span style="font-weight:bold;">$1</span>';
514  $content = preg_replace($pattern, $replacement, $content);
515
516  // replace /word/ by an italic word
517  $pattern = "/\/(\S*)\/(\s)/";
518  $replacement = '<span style="font-style:italic;">$1$2</span>';
519  $content = preg_replace($pattern, $replacement, $content);
520
521  $content = '<div>'.$content.'</div>';
522  return $content;
523}
524
525function get_cat_display_name_from_id($cat_id,
526                                      $url = '',
527                                      $replace_space = true)
528{
529  $cat_info = get_cat_info($cat_id);
530  return get_cat_display_name($cat_info['name'], $url, $replace_space);
531}
532
533/**
534 * Returns an HTML list of tags. It can be a multi select field or a list of
535 * checkboxes.
536 *
537 * @param string HTML field name
538 * @param array selected tag ids
539 * @return array
540 */
541function get_html_tag_selection(
542  $tags,
543  $fieldname,
544  $selecteds = array(),
545  $forbidden_categories = null
546  )
547{
548  global $conf;
549
550  if (count ($tags) == 0 )
551  {
552    return '';
553  }
554  $output = '<ul class="tagSelection">';
555  foreach ($tags as $tag)
556  {
557    $output.=
558      '<li>'
559      .'<label>'
560      .'<input type="checkbox" name="'.$fieldname.'[]"'
561      .' value="'.$tag['id'].'"'
562      ;
563
564    if (in_array($tag['id'], $selecteds))
565    {
566      $output.= ' checked="checked"';
567    }
568
569    $output.=
570      ' />'
571      .' '. $tag['name']
572      .'</label>'
573      .'</li>'
574      ."\n"
575      ;
576  }
577  $output.= '</ul>';
578
579  return $output;
580}
581
582function name_compare($a, $b)
583{
584  return strcmp(strtolower($a['name']), strtolower($b['name']));
585}
586
587/**
588 * exits the current script (either exit or redirect)
589 */
590function access_denied()
591{
592  global $user, $lang;
593
594  $login_url =
595      get_root_url().'identification.php?redirect='
596      .urlencode(urlencode($_SERVER['REQUEST_URI']));
597
598  if ( isset($user['is_the_guest']) and !$user['is_the_guest'] )
599  {
600    echo '<div style="text-align:center;">'.$lang['access_forbiden'].'<br />';
601    echo '<a href="'.get_root_url().'identification.php">'.$lang['identification'].'</a>&nbsp;';
602    echo '<a href="'.make_index_url().'">'.$lang['home'].'</a></div>';
603    exit();
604  }
605  else
606  {
607    set_status_header(401);
608    redirect_html($login_url);
609  }
610}
611
612/**
613 * exits the current script with 403 code
614 * @param string msg a message to display
615 * @param string alternate_url redirect to this url
616 */
617function page_forbidden($msg, $alternate_url=null)
618{
619  set_status_header(403);
620  if ($alternate_url==null)
621    $alternate_url = make_index_url();
622  redirect_html( $alternate_url,
623    '<div style="text-align:left; margin-left:5em;margin-bottom:5em;">
624<h1 style="text-align:left; font-size:36px;">Forbidden</h1><br/>'
625.$msg.'</div>',
626    5 );
627}
628
629/**
630 * exits the current script with 404 code when a page cannot be found
631 * @param string msg a message to display
632 * @param string alternate_url redirect to this url
633 */
634function page_not_found($msg, $alternate_url=null)
635{
636  set_status_header(404);
637  if ($alternate_url==null)
638    $alternate_url = make_index_url();
639  redirect_html( $alternate_url,
640    '<div style="text-align:left; margin-left:5em;margin-bottom:5em;">
641<h1 style="text-align:left; font-size:36px;">Page not found</h1><br/>'
642.$msg.'</div>',
643    5 );
644}
645
646/* returns the title to be displayed above thumbnails on tag page
647 */
648function get_tags_content_title()
649{
650  global $page;
651  $title = count($page['tags']) > 1 ? l10n('Tags') : l10n('Tag');
652  $title.= ' ';
653
654  for ($i=0; $i<count($page['tags']); $i++)
655  {
656    $title.= $i>0 ? ' + ' : '';
657
658    $title.=
659      '<a href="'
660      .make_index_url(
661        array(
662          'tags' => array( $page['tags'][$i] )
663          )
664        )
665      .'" title="'
666      .l10n('See pictures linked to this tag only')
667      .'">'
668      .$page['tags'][$i]['name']
669      .'</a>';
670
671    if ( count($page['tags'])>2 )
672    {
673      $other_tags = $page['tags'];
674      unset ( $other_tags[$i] );
675      $title.=
676        '<a href="'
677        .make_index_url(
678          array(
679            'tags' => $other_tags
680            )
681          )
682        .'" style="border:none;" title="'
683        .l10n('remove this tag')
684        .'"><img src="'
685        .get_root_url().get_themeconf('icon_dir').'/remove_s.png'
686        .'" alt="x" style="vertical-align:bottom;" class="button"/>'
687        .'</a>';
688    }
689
690  }
691  return $title;
692}
693
694/**
695  Sets the http status header (200,401,...)
696 */
697function set_status_header($code, $text='')
698{
699  if (empty($text))
700  {
701    switch ($code)
702    {
703      case 200: $text='OK';break;
704      case 301: $text='Moved permanently';break;
705      case 302: $text='Moved temporarily';break;
706      case 304: $text='Not modified';break;
707      case 400: $text='Bad request';break;
708      case 401: $text='Authorization required';break;
709      case 403: $text='Forbidden';break;
710      case 404: $text='Not found';break;
711    }
712  }
713  header("HTTP/1.1 $code $text");
714  header("Status: $code $text");
715  trigger_action('set_status_header', $code, $text);
716}
717
718/**
719 * set a class to display a counter
720 * .zero .one .plural
721 */
722function set_span_class($count)
723{
724  if ($count > 1) 
725  { 
726    return 'plural';
727  }
728  return ( $count == 0 ) ? 'zero':'one'; 
729}
730?>
Note: See TracBrowser for help on using the repository browser.