]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/display.php
added SubPages support: see SUBPAGE_SEPERATOR in index.php
[SourceForge/phpwiki.git] / lib / display.php
1 <?php
2 // display.php: fetch page or get default content
3 rcs_id('$Id: display.php,v 1.31 2002-08-17 15:52:51 rurban Exp $');
4
5 require_once('lib/Template.php');
6 require_once('lib/BlockParser.php');
7
8 /**
9  * Guess a short description of the page.
10  *
11  * Algorithm:
12  *
13  * This algorithm was suggested on MeatballWiki by
14  * Alex Schroeder <kensanata@yahoo.com>.
15  *
16  * Use the first paragraph in the page which contains at least two
17  * sentences.
18  *
19  * @see http://www.usemod.com/cgi-bin/mb.pl?MeatballWikiSuggestions
20  */
21 function GleanDescription ($rev) {
22     $two_sentences
23         = pcre_fix_posix_classes("/[.?!]\s+[[:upper:])]"
24                                  . ".*"
25                                  . "[.?!]\s*([[:upper:])]|$)/sx");
26
27     $content = $rev->getPackedContent();
28
29     // Iterate through paragraphs.
30     while (preg_match('/(?: ^ \w .* $ \n? )+/mx', $content, $m)) {
31         $paragraph = $m[0];
32
33         // Return paragraph if it contains at least two sentences.
34         if (preg_match($two_sentences, $paragraph)) {
35             return preg_replace("/\s*\n\s*/", " ", trim($paragraph));
36         }
37
38         $content = substr(strstr($content, $paragraph), strlen($paragraph));
39     }
40     return '';
41 }
42
43
44 function actionPage(&$request, $action) {
45     global $Theme;
46
47     $pagename = $request->getArg('pagename');
48     $version = $request->getArg('version');
49
50     $page = $request->getPage();
51     $revision = $page->getCurrentRevision();
52
53     $dbi = $request->getDbh();
54     $actionpage = $dbi->getPage($action);
55     $actionrev = $actionpage->getCurrentRevision();
56
57     $pagetitle = HTML(fmt("%s: %s", $actionpage->getName(),
58                           $Theme->linkExistingWikiWord($pagename, false, $version)));
59
60     require_once('lib/PageType.php');
61     $transformedContent = PageType($actionrev);
62     $template = Template('browse', array('CONTENT' => $transformedContent));
63
64     header("Content-Type: text/html; charset=" . CHARSET);
65     header("Last-Modified: ".Rfc2822DateTime($revision->get('mtime')));
66
67     GeneratePage($template, $pagetitle, $revision);
68     flush();
69 }
70
71 function displayPage(&$request, $tmpl = 'browse') {
72     $pagename = $request->getArg('pagename');
73     $version = $request->getArg('version');
74     $page = $request->getPage();
75     if ($version) {
76         $revision = $page->getRevision($version);
77         if (!$revision)
78             NoSuchRevision($request, $page, $version);
79     }
80     else {
81         $revision = $page->getCurrentRevision();
82     }
83
84     $splitname = split_pagename($pagename);
85     if (strchr($pagename, '/')) {
86         $pages = explode('/',$pagename);
87         $last_page = array_pop($pages); // deletes last element from array as side-effect
88         $pagetitle = HTML::span(HTML::a(array('href' => WikiURL($pages[0]),
89                                               //'class' => 'backlinks'
90                                               ),
91                                         split_pagename($pages[0] . '/')));
92         $first_pages = $pages[0] . '/';
93         array_shift($pages);
94         foreach ($pages as $p)  {
95             $pagetitle->pushContent(HTML::a(array('href' => WikiURL($first_pages . $p),
96                                              'class' => 'backlinks'),
97                                        split_pagename($p . '/')));
98             $first_pages .= $p . '/';
99         }
100         $backlink = HTML::a(array('href' => WikiURL($pagename,
101                                                     array('action' => _("BackLinks"))),
102                                   'class' => 'backlinks'),
103                             split_pagename($last_page));
104         $backlink->addTooltip(sprintf(_("BackLinks for %s"), $pagename));
105         $pagetitle->pushContent($backlink);
106     } else {
107         $pagetitle = HTML::a(array('href' => WikiURL($pagename,
108                                                      array('action' => _("BackLinks"))),
109                                    'class' => 'backlinks'),
110                              $splitname);
111         $pagetitle->addTooltip(sprintf(_("BackLinks for %s"), $pagename));
112     }
113
114     include_once('lib/BlockParser.php');
115
116     require_once('lib/PageType.php');
117     $transformedContent = PageType($revision);
118     $template = Template('browse', array('CONTENT' => $transformedContent));
119
120     header("Content-Type: text/html; charset=" . CHARSET);
121     // don't clobber date header given by RC
122     if ( ! ($pagename == _("RecentChanges") || $pagename == _("RecentEdits")) )
123         header("Last-Modified: ".Rfc2822DateTime($revision->get('mtime')));
124
125     GeneratePage($template, $pagetitle, $revision,
126                  array('ROBOTS_META'    => 'index,follow',
127                        'PAGE_DESCRIPTION' => GleanDescription($revision)));
128     flush();
129
130     $page->increaseHitCount();
131 }
132
133 // For emacs users
134 // Local Variables:
135 // mode: php
136 // tab-width: 8
137 // c-basic-offset: 4
138 // c-hanging-comment-ender-p: nil
139 // indent-tabs-mode: nil
140 // End:
141 ?>