]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/display.php
Minor fixes for new cached markup.
[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.42 2003-02-21 04:12:05 dairiki Exp $');
4
5 require_once('lib/Template.php');
6
7 /**
8  * Guess a short description of the page.
9  *
10  * Algorithm:
11  *
12  * This algorithm was suggested on MeatballWiki by
13  * Alex Schroeder <kensanata@yahoo.com>.
14  *
15  * Use the first paragraph in the page which contains at least two
16  * sentences.
17  *
18  * @see http://www.usemod.com/cgi-bin/mb.pl?MeatballWikiSuggestions
19  */
20 function GleanDescription ($rev) {
21     $two_sentences
22         = pcre_fix_posix_classes("/[.?!]\s+[[:upper:])]"
23                                  . ".*"
24                                  . "[.?!]\s*([[:upper:])]|$)/sx");
25     // Escape strings
26     $content = preg_replace("/(['\"])/", "\$1", $rev->getPackedContent());
27
28     // Iterate through paragraphs.
29     while (preg_match('/(?: ^ \w .* $ \n? )+/mx', $content, $m)) {
30         $paragraph = $m[0];
31
32         // Return paragraph if it contains at least two sentences.
33         if (preg_match($two_sentences, $paragraph)) {
34             return preg_replace("/\s*\n\s*/", " ", trim($paragraph));
35         }
36
37         $content = substr(strstr($content, $paragraph), strlen($paragraph));
38     }
39     return '';
40 }
41
42
43 /** Make a link back to redirecting page.
44  *
45  * @param $pagename string  Name of redirecting page.
46  * @return XmlContent Link to the redirecting page.
47  */
48 function RedirectorLink($pagename) {
49     $url = WikiURL($pagename, array('redirectfrom' => ''));
50     return HTML::a(array('class' => 'redirectfrom wiki',
51                          'href' => $url),
52                    $pagename);
53 }
54
55     
56 function actionPage(&$request, $action) {
57     global $Theme;
58
59     $pagename = $request->getArg('pagename');
60     $version = $request->getArg('version');
61
62     $page = $request->getPage();
63     $revision = $page->getCurrentRevision();
64
65     $dbi = $request->getDbh();
66     $actionpage = $dbi->getPage($action);
67     $actionrev = $actionpage->getCurrentRevision();
68
69     // $splitname = split_pagename($pagename);
70
71     $pagetitle = HTML(fmt("%s: %s", $actionpage->getName(),
72                           $Theme->linkExistingWikiWord($pagename, false, $version)));
73
74     $validators = new HTTP_ValidatorSet(array('pageversion' => $revision->getVersion(),
75                                               '%mtime' => $revision->get('mtime')));
76                                         
77     $request->appendValidators(array('pagerev' => $revision->getVersion(),
78                                      '%mtime' => $revision->get('mtime')));
79     $request->appendValidators(array('actionpagerev' => $actionrev->getVersion(),
80                                      '%mtime' => $actionrev->get('mtime')));
81
82     $transformedContent = $actionrev->getTransformedContent();
83     $template = Template('browse', array('CONTENT' => $transformedContent));
84
85     header("Content-Type: text/html; charset=" . CHARSET);
86     GeneratePage($template, $pagetitle, $revision);
87     $request->checkValidators();
88     flush();
89 }
90
91 function displayPage(&$request, $tmpl = 'browse') {
92     $pagename = $request->getArg('pagename');
93     $version = $request->getArg('version');
94     $page = $request->getPage();
95     if ($version) {
96         $revision = $page->getRevision($version);
97         if (!$revision)
98             NoSuchRevision($request, $page, $version);
99     }
100     else {
101         $revision = $page->getCurrentRevision();
102     }
103
104     $splitname = split_pagename($pagename);
105     if (isSubPage($pagename)) {
106         $pages = explode(SUBPAGE_SEPARATOR,$pagename);
107         $last_page = array_pop($pages); // deletes last element from array as side-effect
108         $pagetitle = HTML::span(HTML::a(array('href' => WikiURL($pages[0]),
109                                               'class' => 'pagetitle'
110                                               ),
111                                         split_pagename($pages[0] . SUBPAGE_SEPARATOR)));
112         $first_pages = $pages[0] . SUBPAGE_SEPARATOR;
113         array_shift($pages);
114         foreach ($pages as $p)  {
115             $pagetitle->pushContent(HTML::a(array('href' => WikiURL($first_pages . $p),
116                                                   'class' => 'backlinks'),
117                                        split_pagename($p . SUBPAGE_SEPARATOR)));
118             $first_pages .= $p . SUBPAGE_SEPARATOR;
119         }
120         $backlink = HTML::a(array('href' => WikiURL($pagename,
121                                                     array('action' => _("BackLinks"))),
122                                   'class' => 'backlinks'),
123                             split_pagename($last_page));
124         $backlink->addTooltip(sprintf(_("BackLinks for %s"), $pagename));
125         $pagetitle->pushContent($backlink);
126     } else {
127         $pagetitle = HTML::a(array('href' => WikiURL($pagename,
128                                                      array('action' => _("BackLinks"))),
129                                    'class' => 'backlinks'),
130                              $splitname);
131         $pagetitle->addTooltip(sprintf(_("BackLinks for %s"), $pagename));
132     }
133
134     $redirect_from = $request->getArg('redirectfrom');
135     if ($redirect_from) {
136         $redirect_from = fmt("Redirected from %s", RedirectorLink($redirect_from));
137     }
138
139     //include_once('lib/BlockParser.php');
140
141     $request->appendValidators(array('pagerev' => $revision->getVersion(),
142                                      '%mtime' => $revision->get('mtime')));
143
144     if ($frame = $request->getArg('frame')) {
145         if (in_array($frame, array('body','browse','editpage')))
146             $template = Template($frame, array('CONTENT' => $revision->getTransformedContent()));
147         elseif ($frame == 'top')
148             $template = Template($frame, array('framesrc' => $request->getArg('framesrc')));
149         else
150             $template = Template($frame);
151     } else {
152         $transformedContent = $revision->getTransformedContent();
153         $template = Template('browse', array('CONTENT' => $transformedContent));
154     }
155
156     header("Content-Type: text/html; charset=" . CHARSET); // FIXME: this gets done twice?
157     
158     GeneratePage($template, $pagetitle, $revision,
159                  array('ROBOTS_META'    => 'index,follow',
160                        'PAGE_DESCRIPTION' => GleanDescription($revision),
161                        'REDIRECT_FROM' => $redirect_from));
162     $request->checkValidators();
163     flush();
164     $page->increaseHitCount();
165 }
166
167 // For emacs users
168 // Local Variables:
169 // mode: php
170 // tab-width: 8
171 // c-basic-offset: 4
172 // c-hanging-comment-ender-p: nil
173 // indent-tabs-mode: nil
174 // End:
175 ?>