';
danielebarchiesi@4: if (isset($element['title'])) {
danielebarchiesi@4: $output .= '
' . drupal_render($element['title']) . '
';
danielebarchiesi@4: }
danielebarchiesi@4: $output .= '
'. drupal_render($element['url']) . '
';
danielebarchiesi@4: $output .= '
';
danielebarchiesi@4: if (!empty($element['attributes']['target'])) {
danielebarchiesi@4: $output .= '' . drupal_render($element['attributes']['target']) . '
';
danielebarchiesi@4: }
danielebarchiesi@4: if (!empty($element['attributes']['title'])) {
danielebarchiesi@4: $output .= '' . drupal_render($element['attributes']['title']) . '
';
danielebarchiesi@4: }
danielebarchiesi@4: return $output;
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Implements hook_element_info().
danielebarchiesi@4: */
danielebarchiesi@4: function link_element_info() {
danielebarchiesi@4: $elements = array();
danielebarchiesi@4: $elements['link_field'] = array(
danielebarchiesi@4: '#input' => TRUE,
danielebarchiesi@4: '#process' => array('link_field_process'),
danielebarchiesi@4: '#theme' => 'link_field',
danielebarchiesi@4: '#theme_wrappers' => array('form_element'),
danielebarchiesi@4: );
danielebarchiesi@4: return $elements;
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Returns the default attributes and their values.
danielebarchiesi@4: */
danielebarchiesi@4: function _link_default_attributes() {
danielebarchiesi@4: return array(
danielebarchiesi@4: 'target' => LINK_TARGET_DEFAULT,
danielebarchiesi@4: 'class' => '',
danielebarchiesi@4: 'rel' => '',
danielebarchiesi@4: );
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Processes the link type element before displaying the field.
danielebarchiesi@4: *
danielebarchiesi@4: * Build the form element. When creating a form using FAPI #process,
danielebarchiesi@4: * note that $element['#value'] is already set.
danielebarchiesi@4: *
danielebarchiesi@4: * The $fields array is in $complete_form['#field_info'][$element['#field_name']].
danielebarchiesi@4: */
danielebarchiesi@4: function link_field_process($element, $form_state, $complete_form) {
danielebarchiesi@4: $instance = field_widget_instance($element, $form_state);
danielebarchiesi@4: $settings = $instance['settings'];
danielebarchiesi@4: $element['url'] = array(
danielebarchiesi@4: '#type' => 'textfield',
danielebarchiesi@4: '#maxlength' => LINK_URL_MAX_LENGTH,
danielebarchiesi@4: '#title' => t('URL'),
danielebarchiesi@4: '#required' => ($element['#delta'] == 0 && $settings['url'] !== 'optional') ? $element['#required'] : FALSE,
danielebarchiesi@4: '#default_value' => isset($element['#value']['url']) ? $element['#value']['url'] : NULL,
danielebarchiesi@4: );
danielebarchiesi@4: if ($settings['title'] !== 'none' && $settings['title'] !== 'value') {
danielebarchiesi@4: $element['title'] = array(
danielebarchiesi@4: '#type' => 'textfield',
danielebarchiesi@4: '#maxlength' => $settings['title_maxlength'],
danielebarchiesi@4: '#title' => t('Title'),
danielebarchiesi@4: '#description' => t('The link title is limited to @maxlength characters maximum.', array('@maxlength' => $settings['title_maxlength'])),
danielebarchiesi@4: '#required' => ($settings['title'] == 'required' && (($element['#delta'] == 0 && $element['#required']) || !empty($element['#value']['url']))) ? TRUE : FALSE,
danielebarchiesi@4: '#default_value' => isset($element['#value']['title']) ? $element['#value']['title'] : NULL,
danielebarchiesi@4: );
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: // Initialize field attributes as an array if it is not an array yet.
danielebarchiesi@4: if (!is_array($settings['attributes'])) {
danielebarchiesi@4: $settings['attributes'] = array();
danielebarchiesi@4: }
danielebarchiesi@4: // Add default attributes.
danielebarchiesi@4: $settings['attributes'] += _link_default_attributes();
danielebarchiesi@4: $attributes = isset($element['#value']['attributes']) ? $element['#value']['attributes'] : $settings['attributes'];
danielebarchiesi@4: if (!empty($settings['attributes']['target']) && $settings['attributes']['target'] == LINK_TARGET_USER) {
danielebarchiesi@4: $element['attributes']['target'] = array(
danielebarchiesi@4: '#type' => 'checkbox',
danielebarchiesi@4: '#title' => t('Open URL in a New Window'),
danielebarchiesi@4: '#return_value' => LINK_TARGET_NEW_WINDOW,
danielebarchiesi@4: '#default_value' => isset($attributes['target']) ? $attributes['target'] : FALSE,
danielebarchiesi@4: );
danielebarchiesi@4: }
danielebarchiesi@4: if (!empty($settings['attributes']['configurable_title']) && $settings['attributes']['configurable_title'] == 1) {
danielebarchiesi@4: $element['attributes']['title'] = array(
danielebarchiesi@4: '#type' => 'textfield',
danielebarchiesi@4: '#title' => t('Link "title" attribute'),
danielebarchiesi@4: '#default_value' => isset($attributes['title']) ? $attributes['title'] : '',
danielebarchiesi@4: '#field_prefix' => 'title = "',
danielebarchiesi@4: '#field_suffix' => '"',
danielebarchiesi@4: );
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: // If the title field is avaliable or there are field accepts multiple values
danielebarchiesi@4: // then allow the individual field items display the required asterisk if needed.
danielebarchiesi@4: if (isset($element['title']) || isset($element['_weight'])) {
danielebarchiesi@4: // To prevent an extra required indicator, disable the required flag on the
danielebarchiesi@4: // base element since all the sub-fields are already required if desired.
danielebarchiesi@4: $element['#required'] = FALSE;
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: return $element;
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Implements hook_field_formatter_info().
danielebarchiesi@4: */
danielebarchiesi@4: function link_field_formatter_info() {
danielebarchiesi@4: return array(
danielebarchiesi@4: 'link_default' => array(
danielebarchiesi@4: 'label' => t('Title, as link (default)'),
danielebarchiesi@4: 'field types' => array('link_field'),
danielebarchiesi@4: 'multiple values' => FIELD_BEHAVIOR_DEFAULT,
danielebarchiesi@4: ),
danielebarchiesi@4: 'link_title_plain' => array(
danielebarchiesi@4: 'label' => t('Title, as plain text'),
danielebarchiesi@4: 'field types' => array('link_field'),
danielebarchiesi@4: 'multiple values' => FIELD_BEHAVIOR_DEFAULT,
danielebarchiesi@4: ),
danielebarchiesi@4: 'link_url' => array(
danielebarchiesi@4: 'label' => t('URL, as link'),
danielebarchiesi@4: 'field types' => array('link_field'),
danielebarchiesi@4: 'multiple values' => FIELD_BEHAVIOR_DEFAULT,
danielebarchiesi@4: ),
danielebarchiesi@4: 'link_plain' => array(
danielebarchiesi@4: 'label' => t('URL, as plain text'),
danielebarchiesi@4: 'field types' => array('link_field'),
danielebarchiesi@4: 'multiple values' => FIELD_BEHAVIOR_DEFAULT,
danielebarchiesi@4: ),
danielebarchiesi@4: 'link_absolute' => array(
danielebarchiesi@4: 'label' => t('URL, absolute'),
danielebarchiesi@4: 'field types' => array('link_field'),
danielebarchiesi@4: 'multiple values' => FIELD_BEHAVIOR_DEFAULT,
danielebarchiesi@4: ),
danielebarchiesi@4: 'link_domain' => array(
danielebarchiesi@4: 'label' => t('Domain, as link'),
danielebarchiesi@4: 'field types' => array('link_field'),
danielebarchiesi@4: 'multiple values' => FIELD_BEHAVIOR_DEFAULT,
danielebarchiesi@4: 'settings' => array(
danielebarchiesi@4: 'strip_www' => FALSE,
danielebarchiesi@4: ),
danielebarchiesi@4: ),
danielebarchiesi@4: 'link_short' => array(
danielebarchiesi@4: 'label' => t('Short, as link with title "Link"'),
danielebarchiesi@4: 'field types' => array('link_field'),
danielebarchiesi@4: 'multiple values' => FIELD_BEHAVIOR_DEFAULT,
danielebarchiesi@4: ),
danielebarchiesi@4: 'link_label' => array(
danielebarchiesi@4: 'label' => t('Label, as link with label as title'),
danielebarchiesi@4: 'field types' => array('link_field'),
danielebarchiesi@4: 'multiple values' => FIELD_BEHAVIOR_DEFAULT,
danielebarchiesi@4: ),
danielebarchiesi@4: 'link_separate' => array(
danielebarchiesi@4: 'label' => t('Separate title and URL'),
danielebarchiesi@4: 'field types' => array('link_field'),
danielebarchiesi@4: 'multiple values' => FIELD_BEHAVIOR_DEFAULT,
danielebarchiesi@4: ),
danielebarchiesi@4: );
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Implements hook_field_formatter_settings_form().
danielebarchiesi@4: */
danielebarchiesi@4: function link_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
danielebarchiesi@4: $display = $instance['display'][$view_mode];
danielebarchiesi@4: $settings = $display['settings'];
danielebarchiesi@4: $element = array();
danielebarchiesi@4: if ($display['type'] == 'link_domain') {
danielebarchiesi@4: $element['strip_www'] = array(
danielebarchiesi@4: '#title' => t('Strip www. from domain'),
danielebarchiesi@4: '#type' => 'checkbox',
danielebarchiesi@4: '#default_value' => $settings['strip_www'],
danielebarchiesi@4: );
danielebarchiesi@4: }
danielebarchiesi@4: return $element;
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Implements hook_field_formatter_settings_summary().
danielebarchiesi@4: */
danielebarchiesi@4: function link_field_formatter_settings_summary($field, $instance, $view_mode) {
danielebarchiesi@4: $display = $instance['display'][$view_mode];
danielebarchiesi@4: $settings = $display['settings'];
danielebarchiesi@4: if ($display['type'] == 'link_domain') {
danielebarchiesi@4: if ($display['settings']['strip_www']) {
danielebarchiesi@4: return t('Strip www. from domain');
danielebarchiesi@4: }
danielebarchiesi@4: else {
danielebarchiesi@4: return t('Leave www. in domain');
danielebarchiesi@4: }
danielebarchiesi@4: }
danielebarchiesi@4: return '';
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Implements hook_field_formatter_view().
danielebarchiesi@4: */
danielebarchiesi@4: function link_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
danielebarchiesi@4: $elements = array();
danielebarchiesi@4: foreach ($items as $delta => $item) {
danielebarchiesi@4: $elements[$delta] = array(
danielebarchiesi@4: '#theme' => 'link_formatter_' . $display['type'],
danielebarchiesi@4: '#element' => $item,
danielebarchiesi@4: '#field' => $instance,
danielebarchiesi@4: '#display' => $display,
danielebarchiesi@4: );
danielebarchiesi@4: }
danielebarchiesi@4: return $elements;
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Formats a link.
danielebarchiesi@4: */
danielebarchiesi@4: function theme_link_formatter_link_default($vars) {
danielebarchiesi@4: $link_options = $vars['element'];
danielebarchiesi@4: unset($link_options['title']);
danielebarchiesi@4: unset($link_options['url']);
danielebarchiesi@4:
danielebarchiesi@4: if (isset($link_options['attributes']['class'])) {
danielebarchiesi@4: $link_options['attributes']['class'] = array($link_options['attributes']['class']);
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: // Display a normal link if both title and URL are available.
danielebarchiesi@4: if (!empty($vars['element']['title']) && !empty($vars['element']['url'])) {
danielebarchiesi@4: return l($vars['element']['title'], $vars['element']['url'], $link_options);
danielebarchiesi@4: }
danielebarchiesi@4: // If only a title, display the title.
danielebarchiesi@4: elseif (!empty($vars['element']['title'])) {
danielebarchiesi@4: return check_plain($vars['element']['title']);
danielebarchiesi@4: }
danielebarchiesi@4: elseif (!empty($vars['element']['url'])) {
danielebarchiesi@4: return l($vars['element']['title'], $vars['element']['url'], $link_options);
danielebarchiesi@4: }
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Formats a link (or its title) as plain text.
danielebarchiesi@4: */
danielebarchiesi@4: function theme_link_formatter_link_plain($vars) {
danielebarchiesi@4: $link_options = $vars['element'];
danielebarchiesi@4: if (isset($link_options['title'])) {
danielebarchiesi@4: unset($link_options['title']);
danielebarchiesi@4: }
danielebarchiesi@4: else {
danielebarchiesi@4: $vars['element']['title'] = '';
danielebarchiesi@4: }
danielebarchiesi@4: unset($link_options['url']);
danielebarchiesi@4: return empty($vars['element']['url']) ? check_plain($vars['element']['title']) : url($vars['element']['url'], $link_options);
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Formats a link as an absolute URL
danielebarchiesi@4: */
danielebarchiesi@4: function theme_link_formatter_link_absolute($vars) {
danielebarchiesi@4: $absolute = array('absolute' => TRUE);
danielebarchiesi@4: return empty($vars['element']['url']) ? '' : url($vars['element']['url'], $absolute + $vars['element']);
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Formats a link using the URL's domain for it's link text.
danielebarchiesi@4: */
danielebarchiesi@4: function theme_link_formatter_link_domain($vars) {
danielebarchiesi@4: $link_options = $vars['element'];
danielebarchiesi@4: unset($link_options['title']);
danielebarchiesi@4: unset($link_options['url']);
danielebarchiesi@4: $domain = parse_url($vars['element']['display_url'], PHP_URL_HOST);
danielebarchiesi@4: if (!empty($vars['display']['settings']['strip_www'])) {
danielebarchiesi@4: $domain = str_replace('www.', '', $domain);
danielebarchiesi@4: }
danielebarchiesi@4: return $vars['element']['url'] ? l($domain, $vars['element']['url'], $link_options) : '';
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Formats a link's title as plain text.
danielebarchiesi@4: */
danielebarchiesi@4: function theme_link_formatter_link_title_plain($vars) {
danielebarchiesi@4: return empty($vars['element']['title']) ? '' : check_plain($vars['element']['title']);
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Formats a link using an alternate display URL for its link text.
danielebarchiesi@4: */
danielebarchiesi@4: function theme_link_formatter_link_url($vars) {
danielebarchiesi@4: $link_options = $vars['element'];
danielebarchiesi@4: unset($link_options['title']);
danielebarchiesi@4: unset($link_options['url']);
danielebarchiesi@4: return $vars['element']['url'] ? l($vars['element']['display_url'], $vars['element']['url'], $link_options) : '';
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Formats a link using "Link" as the link text.
danielebarchiesi@4: */
danielebarchiesi@4: function theme_link_formatter_link_short($vars) {
danielebarchiesi@4: $link_options = $vars['element'];
danielebarchiesi@4: unset($link_options['title']);
danielebarchiesi@4: unset($link_options['url']);
danielebarchiesi@4: return $vars['element']['url'] ? l(t('Link'), $vars['element']['url'], $link_options) : '';
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Formats a link using the field's label as link text.
danielebarchiesi@4: */
danielebarchiesi@4: function theme_link_formatter_link_label($vars) {
danielebarchiesi@4: $link_options = $vars['element'];
danielebarchiesi@4: unset($link_options['title']);
danielebarchiesi@4: unset($link_options['url']);
danielebarchiesi@4: return $vars['element']['url'] ? l($vars['field']['label'], $vars['element']['url'], $link_options) : '';
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Formats a link as separate title and URL elements.
danielebarchiesi@4: */
danielebarchiesi@4: function theme_link_formatter_link_separate($vars) {
danielebarchiesi@4: $class = empty($vars['element']['attributes']['class']) ? '' : ' ' . $vars['element']['attributes']['class'];
danielebarchiesi@4: unset($vars['element']['attributes']['class']);
danielebarchiesi@4: $link_options = $vars['element'];
danielebarchiesi@4: unset($link_options['title']);
danielebarchiesi@4: unset($link_options['url']);
danielebarchiesi@4: $title = empty($vars['element']['title']) ? '' : check_plain($vars['element']['title']);
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * @TODO static html markup looks not very elegant
danielebarchiesi@4: * needs smarter output solution and an optional title/url seperator
danielebarchiesi@4: */
danielebarchiesi@4: $url_parts = _link_parse_url($vars['element']['url']);
danielebarchiesi@4: $output = '';
danielebarchiesi@4: $output .= '';
danielebarchiesi@4: if (!empty($title)) {
danielebarchiesi@4: $output .= '
' . $title . '
';
danielebarchiesi@4: }
danielebarchiesi@4: $output .= '
' . l($url_parts['url'], $vars['element']['url'], $link_options) . '
';
danielebarchiesi@4: $output .= '
';
danielebarchiesi@4: return $output;
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Implements hook_token_list().
danielebarchiesi@4: */
danielebarchiesi@4: function link_token_list($type = 'all') {
danielebarchiesi@4: if ($type === 'field' || $type === 'all') {
danielebarchiesi@4: $tokens = array();
danielebarchiesi@4: $tokens['link']['url'] = t("Link URL");
danielebarchiesi@4: $tokens['link']['title'] = t("Link title");
danielebarchiesi@4: $tokens['link']['view'] = t("Formatted html link");
danielebarchiesi@4: return $tokens;
danielebarchiesi@4: }
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: function link_token_values($type, $object = NULL) {
danielebarchiesi@4: if ($type === 'field') {
danielebarchiesi@4: $item = $object[0];
danielebarchiesi@4:
danielebarchiesi@4: $tokens['url'] = $item['url'];
danielebarchiesi@4: $tokens['title'] = $item['title'];
danielebarchiesi@4: $tokens['view'] = isset($item['view']) ? $item['view'] : '';
danielebarchiesi@4:
danielebarchiesi@4: return $tokens;
danielebarchiesi@4: }
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Implements hook_views_api().
danielebarchiesi@4: */
danielebarchiesi@4: function link_views_api() {
danielebarchiesi@4: return array(
danielebarchiesi@4: 'api' => 2,
danielebarchiesi@4: 'path' => drupal_get_path('module', 'link') . '/views',
danielebarchiesi@4: );
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Forms a valid URL if possible from an entered address.
danielebarchiesi@4: *
danielebarchiesi@4: * Trims whitespace and automatically adds an http:// to addresses without a
danielebarchiesi@4: * protocol specified
danielebarchiesi@4: *
danielebarchiesi@4: * @param string $url
danielebarchiesi@4: * @param string $protocol
danielebarchiesi@4: * The protocol to be prepended to the url if one is not specified
danielebarchiesi@4: */
danielebarchiesi@4: function link_cleanup_url($url, $protocol = 'http') {
danielebarchiesi@4: $url = trim($url);
danielebarchiesi@4: $type = link_validate_url($url);
danielebarchiesi@4:
danielebarchiesi@4: if ($type === LINK_EXTERNAL) {
danielebarchiesi@4: // Check if there is no protocol specified.
danielebarchiesi@4: $protocol_match = preg_match("/^([a-z0-9][a-z0-9\.\-_]*:\/\/)/i", $url);
danielebarchiesi@4: if (empty($protocol_match)) {
danielebarchiesi@4: // But should there be? Add an automatic http:// if it starts with a domain name.
danielebarchiesi@4: $LINK_DOMAINS = _link_domains();
danielebarchiesi@4: $domain_match = preg_match('/^(([a-z0-9]([a-z0-9\-_]*\.)+)(' . $LINK_DOMAINS . '|[a-z]{2}))/i', $url);
danielebarchiesi@4: if (!empty($domain_match)) {
danielebarchiesi@4: $url = $protocol . "://" . $url;
danielebarchiesi@4: }
danielebarchiesi@4: }
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: return $url;
danielebarchiesi@4: }
danielebarchiesi@4:
danielebarchiesi@4: /**
danielebarchiesi@4: * Validates a URL.
danielebarchiesi@4: *
danielebarchiesi@4: * Accepts all URLs following RFC 1738 standard for URL formation and all e-mail
danielebarchiesi@4: * addresses following the RFC 2368 standard for mailto address formation.
danielebarchiesi@4: *
danielebarchiesi@4: * @param string $text
danielebarchiesi@4: *
danielebarchiesi@4: * @return mixed
danielebarchiesi@4: * Returns boolean FALSE if the URL is not valid. On success, returns one of
danielebarchiesi@4: * the LINK_(linktype) constants.
danielebarchiesi@4: */
danielebarchiesi@4: function link_validate_url($text) {
danielebarchiesi@4: // @TODO Complete letters.
danielebarchiesi@4: $LINK_ICHARS_DOMAIN = (string) html_entity_decode(implode("", array(
danielebarchiesi@4: "æ", // æ
danielebarchiesi@4: "Æ", // Æ
danielebarchiesi@4: "À", // À
danielebarchiesi@4: "à", // à
danielebarchiesi@4: "Á", // Á
danielebarchiesi@4: "á", // á
danielebarchiesi@4: "Â", // Â
danielebarchiesi@4: "â", // â
danielebarchiesi@4: "å", // å
danielebarchiesi@4: "Å", // Å
danielebarchiesi@4: "ä", // ä
danielebarchiesi@4: "Ä", // Ä
danielebarchiesi@4: "Ç", // Ç
danielebarchiesi@4: "ç", // ç
danielebarchiesi@4: "Ð", // Ð
danielebarchiesi@4: "ð", // ð
danielebarchiesi@4: "È", // È
danielebarchiesi@4: "è", // è
danielebarchiesi@4: "É", // É
danielebarchiesi@4: "é", // é
danielebarchiesi@4: "Ê", // Ê
danielebarchiesi@4: "ê", // ê
danielebarchiesi@4: "Ë", // Ë
danielebarchiesi@4: "ë", // ë
danielebarchiesi@4: "Î", // Î
danielebarchiesi@4: "î", // î
danielebarchiesi@4: "Ï", // Ï
danielebarchiesi@4: "ï", // ï
danielebarchiesi@4: "ø", // ø
danielebarchiesi@4: "Ø", // Ø
danielebarchiesi@4: "ö", // ö
danielebarchiesi@4: "Ö", // Ö
danielebarchiesi@4: "Ô", // Ô
danielebarchiesi@4: "ô", // ô
danielebarchiesi@4: "Õ", // Õ
danielebarchiesi@4: "õ", // õ
danielebarchiesi@4: "Œ", // Œ
danielebarchiesi@4: "œ", // œ
danielebarchiesi@4: "ü", // ü
danielebarchiesi@4: "Ü", // Ü
danielebarchiesi@4: "Ù", // Ù
danielebarchiesi@4: "ù", // ù
danielebarchiesi@4: "Û", // Û
danielebarchiesi@4: "û", // û
danielebarchiesi@4: "Ÿ", // Ÿ
danielebarchiesi@4: "ÿ", // ÿ
danielebarchiesi@4: "Ñ", // Ñ
danielebarchiesi@4: "ñ", // ñ
danielebarchiesi@4: "þ", // þ
danielebarchiesi@4: "Þ", // Þ
danielebarchiesi@4: "ý", // ý
danielebarchiesi@4: "Ý", // Ý
danielebarchiesi@4: "¿", // ¿
danielebarchiesi@4: )), ENT_QUOTES, 'UTF-8');
danielebarchiesi@4:
danielebarchiesi@4: $LINK_ICHARS = $LINK_ICHARS_DOMAIN . (string) html_entity_decode(implode("", array(
danielebarchiesi@4: "ß", // ß
danielebarchiesi@4: )), ENT_QUOTES, 'UTF-8');
danielebarchiesi@4: $allowed_protocols = variable_get('filter_allowed_protocols', array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'mailto', 'irc', 'ssh', 'sftp', 'webcal'));
danielebarchiesi@4: $LINK_DOMAINS = _link_domains();
danielebarchiesi@4:
danielebarchiesi@4: // Starting a parenthesis group with (?: means that it is grouped, but is not captured
danielebarchiesi@4: $protocol = '((?:' . implode("|", $allowed_protocols) . '):\/\/)';
danielebarchiesi@4: $authentication = "(?:(?:(?:[\w\.\-\+!$&'\(\)*\+,;=" . $LINK_ICHARS . "]|%[0-9a-f]{2})+(?::(?:[\w" . $LINK_ICHARS . "\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})*)?)?@)";
danielebarchiesi@4: $domain = '(?:(?:[a-z0-9' . $LINK_ICHARS_DOMAIN . ']([a-z0-9' . $LINK_ICHARS_DOMAIN . '\-_\[\]])*)(\.(([a-z0-9' . $LINK_ICHARS_DOMAIN . '\-_\[\]])+\.)*(' . $LINK_DOMAINS . '|[a-z]{2}))?)';
danielebarchiesi@4: $ipv4 = '(?:[0-9]{1,3}(\.[0-9]{1,3}){3})';
danielebarchiesi@4: $ipv6 = '(?:[0-9a-fA-F]{1,4}(\:[0-9a-fA-F]{1,4}){7})';
danielebarchiesi@4: $port = '(?::([0-9]{1,5}))';
danielebarchiesi@4:
danielebarchiesi@4: // Pattern specific to external links.
danielebarchiesi@4: $external_pattern = '/^' . $protocol . '?' . $authentication . '?(' . $domain . '|' . $ipv4 . '|' . $ipv6 . ' |localhost)' . $port . '?';
danielebarchiesi@4:
danielebarchiesi@4: // Pattern specific to internal links.
danielebarchiesi@4: $internal_pattern = "/^(?:[a-z0-9" . $LINK_ICHARS . "_\-+\[\] ]+)";
danielebarchiesi@4: $internal_pattern_file = "/^(?:[a-z0-9" . $LINK_ICHARS . "_\-+\[\]\. \/\(\)][a-z0-9" . $LINK_ICHARS . "_\-+\[\]\. \(\)][a-z0-9" . $LINK_ICHARS . "_\-+\[\]\. \/\(\)]+)$/i";
danielebarchiesi@4:
danielebarchiesi@4: $directories = "(?:\/[a-z0-9" . $LINK_ICHARS . "_\-\.~+%=&,$'#!():;*@\[\]]*)*";
danielebarchiesi@4: // Yes, four backslashes == a single backslash.
danielebarchiesi@4: $query = "(?:\/?\?([?a-z0-9" . $LINK_ICHARS . "+_|\-\.~\/\\\\%=&,$'():;*@\[\]{} ]*))";
danielebarchiesi@4: $anchor = "(?:#[a-z0-9" . $LINK_ICHARS . "_\-\.~+%=&,$'():;*@\[\]\/\?]*)";
danielebarchiesi@4:
danielebarchiesi@4: // The rest of the path for a standard URL.
danielebarchiesi@4: $end = $directories . '?' . $query . '?' . $anchor . '?' . '$/i';
danielebarchiesi@4:
danielebarchiesi@4: $message_id = '[^@].*@' . $domain;
danielebarchiesi@4: $newsgroup_name = '(?:[0-9a-z+-]*\.)*[0-9a-z+-]*';
danielebarchiesi@4: $news_pattern = '/^news:(' . $newsgroup_name . '|' . $message_id . ')$/i';
danielebarchiesi@4:
danielebarchiesi@4: $user = '[a-zA-Z0-9' . $LINK_ICHARS . '_\-\.\+\^!#\$%&*+\/\=\?\`\|\{\}~\'\[\]]+';
danielebarchiesi@4: $email_pattern = '/^mailto:' . $user . '@'.'(?:' . $domain . '|' . $ipv4 . '|' . $ipv6 . '|localhost)' . $query . '?$/';
danielebarchiesi@4:
danielebarchiesi@4: if (strpos($text, '