summaryrefslogtreecommitdiff
path: root/modules/title.module
blob: 78b7177c4841449563afb97c7491d35420daeb77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
// $Id$

/**
 * Implementation of hook_help().
 */
function title_help($section) {
  switch ($section) {
    case 'admin/system/modules#description':
      return t('Enables users to link to stories, articles or similar content by title.');
    case 'filter#short-tip' :
      return t('<a href=\"%title-help\">Link to content</a> on this site using <em>[title|text]</em>.', array("%title-help" => url('filter/tips', NULL, 'filter-title')));
    case 'filter#long-tip' :
      return '<p>' . t('You may quickly link to content on the site using this syntax: <em>[title|text]</em>. This will generate a link labeled "text" to the content with the title "title". If you omit "|text", the label becomes "title".') . '</p>';
  }
}

/**
 * Implementation of hook_link().
 */
function title_link($type) {
  if ($type == 'system') {
    menu('title', t('search'), user_access('access content') ? 'title_page' : MENU_DENIED, 0, MENU_HIDE, MENU_LOCKED);
  }
}

/**
 * Menu callback; displays the matching node or a list of search results.
 */
function title_page($query) {
  $title = urldecode($query);
  $result = db_query("SELECT n.*, u.name, u.uid FROM {node} n INNER JOIN {users} u ON n.uid = u.uid WHERE n.title = '%s' AND n.status = 1 ORDER BY n.created DESC", $title);

  $title = trim(str_replace(array('_', '%', '*'), ' ', $title));
  if (db_num_rows($result) == 0) {
    // No node with exact title found; try a substring.
    $result = db_query("SELECT n.*, u.name, u.uid FROM {node} n INNER JOIN {users} u ON n.uid = u.uid WHERE n.title LIKE '%%%s%%' AND n.status = 1 ORDER BY n.created DESC", $title);
  }

  if (db_num_rows($result) == 0 && module_exist('search')) {
    // Still no matches, so return a full-text search.
    search_view($title);
  }
  else if (db_num_rows($result) == 1) {
    $node = db_fetch_object($result);
    $node = node_load(array('nid' => $node->nid));
    print theme('page', node_show($node, NULL), $node->title);
  }
  else {
    $header = array(t('Type'), t('Title'), t('Author'));
    while ($node = db_fetch_object($result)) {
      $type = ucfirst(module_invoke($node->type, 'node', 'name'));
      $title = l($node->title, "node/view/$node->nid");
      $author = format_name($node);
      $rows[] = array(array('data' => $type, 'class' => 'type'), array('data' => $title, 'class' => 'content'), array('data' => $author, 'class' => 'author'));
    }

    $output  = '<div id="title">';
    $output .= theme('table', $header, $rows);
    $output .= '</div>';

    drupal_set_title(t('Matching Posts'));
    print theme('page', $output);
  }
}

/**
 * Implementation of hook_filter().
 */
function title_filter($op, $text = '', $node = NULL) {
  switch ($op) {
    case 'name':
      return t('Title filter');
    case 'process':
      return _title_filter_process($text);
    case 'settings':
      return _title_filter_settings($text);
    default:
      return $text;
  }
}

/**
 * Filter [Node title|Description] links. '|Description' is optional.
 */
function _title_filter_process($text) {
  $pattern = '\[([^\|\]\n]+)(?>\|?)([^\]\n]*)\]';
  // $1 == title: matches at least 1 char up to the first '|' or ']'.
  // $2 == text: matches all after a following '|' (if there is) up to the next ']'.
  //   May include '|'s.
  $replacement = 'l(\'$2\' ? \'$2\' : \'$1\', \'title/\'. urlencode(\'$1\'))';
  return preg_replace("/$pattern/e", $replacement, $text);
}

function _title_filter_settings() {
  return form_group(t('Title filter'), t('Wiki-like [node title|text] links are enabled. These shortcuts generate a link labeled "text" to the node with the title "node title". If you omit "|text", the label becomes "node title". You may use a substring of a node title if desired. When multiple matching titles are found, a list of matching nodes will be displayed. If no matching titles are found, a full-text search is returned.'));
}

?>