Returns HTML for a set of links.
$variables: An associative array containing:
If the 'href' element is supplied, the entire link array is passed to l() as its $options parameter.
When using a string it will be used as the text of the heading and the level will default to 'h2'. Headings should be used on navigation menus and any list of links that consistently appears on multiple pages. To make the heading invisible use the 'element-invisible' CSS class. Do not use 'display:none', which removes it from screen-readers and assistive technology. Headings allow screen-reader and keyboard only users to navigate to or skip the links. See http://juicystudio.com/article/screen-readers-display-none.php and http://www.w3.org/TR/WCAG-TECHS/H42.html for more information.
function theme_links($variables) {
$language_url = language(LANGUAGE_TYPE_URL);
$links = $variables['links'];
$attributes = $variables['attributes'];
$heading = $variables['heading'];
$output = '';
if (!empty($links)) {
// Prepend the heading to the list, if any.
if (!empty($heading)) {
// Convert a string heading into an array, using a H2 tag by default.
if (is_string($heading)) {
$heading = array(
'text' => $heading,
);
}
// Merge in default array properties into $heading.
$heading += array(
'level' => 'h2',
'attributes' => array(),
);
// @todo Remove backwards compatibility for $heading['class'].
if (isset($heading['class'])) {
$heading['attributes']['class'] = $heading['class'];
}
$output .= '<' . $heading['level'] . new Attribute($heading['attributes']) . '>';
$output .= check_plain($heading['text']);
$output .= '</' . $heading['level'] . '>';
}
$output .= '<ul' . new Attribute($attributes) . '>';
$num_links = count($links);
$i = 0;
foreach ($links as $key => $link) {
$i++;
$class = array();
// Use the array key as class name.
$class[] = drupal_html_class($key);
// Add odd/even, first, and last classes.
$class[] = $i % 2 ? 'odd' : 'even';
if ($i == 1) {
$class[] = 'first';
}
if ($i == $num_links) {
$class[] = 'last';
}
// Handle links.
if (isset($link['href'])) {
$is_current_path = $link['href'] == current_path() || $link['href'] == '<front>' && drupal_is_front_page();
$is_current_language = empty($link['language']) || $link['language']->langcode == $language_url->langcode;
if ($is_current_path && $is_current_language) {
$class[] = 'active';
}
// @todo Reconcile Views usage of 'ajax' as a boolean with the rest of
// core's usage of it as an array.
if (isset($link['ajax']) && is_array($link['ajax'])) {
// To attach Ajax behavior, render a link element, rather than just
// call l().
$link_element = array(
'#type' => 'link',
'#title' => $link['title'],
'#href' => $link['href'],
'#ajax' => $link['ajax'],
'#options' => array_diff_key($link, drupal_map_assoc(array(
'title',
'href',
'ajax',
))),
);
$item = drupal_render($link_element);
}
else {
// Pass in $link as $options, they share the same keys.
$item = l($link['title'], $link['href'], $link);
}
}
else {
// Merge in default array properties into $link.
$link += array(
'html' => FALSE,
'attributes' => array(),
);
$item = '<span' . new Attribute($link['attributes']) . '>';
$item .= $link['html'] ? $link['title'] : check_plain($link['title']);
$item .= '</span>';
}
$output .= '<li' . new Attribute(array(
'class' => $class,
)) . '>';
$output .= $item;
$output .= '</li>';
}
$output .= '</ul>';
}
return $output;
}