1<?php
2
3/*
4 * This file is part of the symfony package.
5 * (c) 2004-2006 Fabien Potencier <fabien.potencier@symfony-project.com>
6 * (c) 2004 David Heinemeier Hansson
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12/**
13 * TagHelper defines some base helpers to construct html tags.
14 *
15 * @package    symfony
16 * @subpackage helper
17 * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
18 * @author     David Heinemeier Hansson
19 * @version    SVN: $Id$
20 */
21
22/**
23 * Constructs an html tag.
24 *
25 * @param  string $name     tag name
26 * @param  array  $options  tag options
27 * @param  bool   $open     true to leave tag open
28 * @return string
29 */
30function tag($name, $options = array(), $open = false)
31{
32  if (!$name)
33  {
34    return '';
35  }
36
37  return '<'.$name._tag_options($options).($open ? '>' : ' />');
38}
39
40function content_tag($name, $content = '', $options = array())
41{
42  if (!$name)
43  {
44    return '';
45  }
46
47  return '<'.$name._tag_options($options).'>'.$content.'</'.$name.'>';
48}
49
50function cdata_section($content)
51{
52  return "<![CDATA[$content]]>";
53}
54
55/**
56 * Wraps the content in conditional comments.
57 *
58 * @param  string $condition
59 * @param  string $content
60 *
61 * @return string
62 *
63 * @see http://msdn.microsoft.com/en-us/library/ms537512(VS.85).aspx
64 */
65function comment_as_conditional($condition, $content)
66{
67  return "<!--[if $condition]>$content<![endif]-->";
68}
69
70/**
71 * Escape carrier returns and single and double quotes for Javascript segments.
72 */
73function escape_javascript($javascript = '')
74{
75  $javascript = preg_replace('/\r\n|\n|\r/', "\\n", $javascript);
76  $javascript = preg_replace('/(["\'])/', '\\\\\1', $javascript);
77
78  return $javascript;
79}
80
81/**
82 * Escapes an HTML string.
83 *
84 * @param  string $html HTML string to escape
85 * @return string escaped string
86 */
87function escape_once($html)
88{
89  return fix_double_escape(htmlspecialchars($html, ENT_COMPAT, sfConfig::get('sf_charset')));
90}
91
92/**
93 * Fixes double escaped strings.
94 *
95 * @param  string $escaped HTML string to fix
96 * @return string fixed escaped string
97 */
98function fix_double_escape($escaped)
99{
100  return preg_replace('/&amp;([a-z]+|(#\d+)|(#x[\da-f]+));/i', '&$1;', $escaped);
101}
102
103function _tag_options($options = array())
104{
105  $options = _parse_attributes($options);
106
107  $html = '';
108  foreach ($options as $key => $value)
109  {
110    $html .= ' '.$key.'="'.escape_once($value).'"';
111  }
112
113  return $html;
114}
115
116function _parse_attributes($string)
117{
118  return is_array($string) ? $string : sfToolkit::stringToArray($string);
119}
120
121function _get_option(&$options, $name, $default = null)
122{
123  if (array_key_exists($name, $options))
124  {
125    $value = $options[$name];
126    unset($options[$name]);
127  }
128  else
129  {
130    $value = $default;
131  }
132
133  return $value;
134}
135
136/**
137 * Returns a formatted ID based on the <i>$name</i> parameter and optionally the <i>$value</i> parameter.
138 *
139 * This function determines the proper form field ID name based on the parameters. If a form field has an
140 * array value as a name we need to convert them to proper and unique IDs like so:
141 * <samp>
142 *  name[] => name (if value == null)
143 *  name[] => name_value (if value != null)
144 *  name[bob] => name_bob
145 *  name[item][total] => name_item_total
146 * </samp>
147 *
148 * <b>Examples:</b>
149 * <code>
150 *  echo get_id_from_name('status[]', '1');
151 * </code>
152 *
153 * @param  string $name   field name
154 * @param  string $value  field value
155 *
156 * @return string <select> tag populated with all the languages in the world.
157 */
158function get_id_from_name($name, $value = null)
159{
160  // check to see if we have an array variable for a field name
161  if (false !== strpos($name, '['))
162  {
163    $name = str_replace(array('[]', '][', '[', ']'), array((($value != null) ? '_'.$value : ''), '_', '_', ''), $name);
164  }
165
166  return $name;
167}
168
169/**
170 * Converts specific <i>$options</i> to their correct HTML format
171 *
172 * @param  array $options
173 * @return array returns properly formatted options
174 */
175function _convert_options($options)
176{
177  $options = _parse_attributes($options);
178
179  foreach (array('disabled', 'readonly', 'multiple') as $attribute)
180  {
181    if (array_key_exists($attribute, $options))
182    {
183      if ($options[$attribute])
184      {
185        $options[$attribute] = $attribute;
186      }
187      else
188      {
189        unset($options[$attribute]);
190      }
191    }
192  }
193
194  return $options;
195}
196