]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/display.php
Refactor the HTTP validator generation/checking code.
[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.41 2003-02-16 20:04:47 dairiki 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     // Escape strings
27     $content = preg_replace("/(['\"])/", "\$1", $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 /** Make a link back to redirecting page.
45  *
46  * @param $pagename string  Name of redirecting page.
47  * @return XmlContent Link to the redirecting page.
48  */
49 function RedirectorLink($pagename) {
50     $url = WikiURL($pagename, array('redirectfrom' => ''));
51     return HTML::a(array('class' => 'redirectfrom wiki',
52                          'href' => $url),
53                    $pagename);
54 }
55
56     
57 function actionPage(&$request, $action) {
58     global $Theme;
59
60     $pagename = $request->getArg('pagename');
61     $version = $request->getArg('version');
62
63     $page = $request->getPage();
64     $revision = $page->getCurrentRevision();
65
66     $dbi = $request->getDbh();
67     $actionpage = $dbi->getPage($action);
68     $actionrev = $actionpage->getCurrentRevision();
69
70     // $splitname = split_pagename($pagename);
71
72     $pagetitle = HTML(fmt("%s: %s", $actionpage->getName(),
73                           $Theme->linkExistingWikiWord($pagename, false, $version)));
74
75     $validators = new HTTP_ValidatorSet(array('pageversion' => $revision->getVersion(),
76                                               '%mtime' => $revision->get('mtime')));
77                                         
78     $request->appendValidators(array('pagerev' => $revision->getVersion(),
79                                      '%mtime' => $revision->get('mtime')));
80     $request->appendValidators(array('actionpagerev' => $actionrev->getVersion(),
81                                      '%mtime' => $actionrev->get('mtime')));
82
83     require_once('lib/PageType.php');
84     $transformedContent = PageType($actionrev);
85     $template = Template('browse', array('CONTENT' => $transformedContent));
86
87     header("Content-Type: text/html; charset=" . CHARSET);
88     $request->checkValidators();
89     
90     // $template = Template('browse', array('CONTENT' => TransformText($actionrev)));
91     
92     GeneratePage($template, $pagetitle, $revision);
93     flush();
94 }
95
96 function displayPage(&$request, $tmpl = 'browse') {
97     $pagename = $request->getArg('pagename');
98     $version = $request->getArg('version');
99     $page = $request->getPage();
100     if ($version) {
101         $revision = $page->getRevision($version);
102         if (!$revision)
103             NoSuchRevision($request, $page, $version);
104     }
105     else {
106         $revision = $page->getCurrentRevision();
107     }
108
109     $splitname = split_pagename($pagename);
110     if (isSubPage($pagename)) {
111         $pages = explode(SUBPAGE_SEPARATOR,$pagename);
112         $last_page = array_pop($pages); // deletes last element from array as side-effect
113         $pagetitle = HTML::span(HTML::a(array('href' => WikiURL($pages[0]),
114                                               'class' => 'pagetitle'
115                                               ),
116                                         split_pagename($pages[0] . SUBPAGE_SEPARATOR)));
117         $first_pages = $pages[0] . SUBPAGE_SEPARATOR;
118         array_shift($pages);
119         foreach ($pages as $p)  {
120             $pagetitle->pushContent(HTML::a(array('href' => WikiURL($first_pages . $p),
121                                                   'class' => 'backlinks'),
122                                        split_pagename($p . SUBPAGE_SEPARATOR)));
123             $first_pages .= $p . SUBPAGE_SEPARATOR;
124         }
125         $backlink = HTML::a(array('href' => WikiURL($pagename,
126                                                     array('action' => _("BackLinks"))),
127                                   'class' => 'backlinks'),
128                             split_pagename($last_page));
129         $backlink->addTooltip(sprintf(_("BackLinks for %s"), $pagename));
130         $pagetitle->pushContent($backlink);
131     } else {
132         $pagetitle = HTML::a(array('href' => WikiURL($pagename,
133                                                      array('action' => _("BackLinks"))),
134                                    'class' => 'backlinks'),
135                              $splitname);
136         $pagetitle->addTooltip(sprintf(_("BackLinks for %s"), $pagename));
137     }
138
139     $redirect_from = $request->getArg('redirectfrom');
140     if ($redirect_from) {
141         $redirect_from = fmt("Redirected from %s", RedirectorLink($redirect_from));
142     }
143
144     //include_once('lib/BlockParser.php');
145
146     $request->appendValidators(array('pagerev' => $revision->getVersion(),
147                                      '%mtime' => $revision->get('mtime')));
148
149     require_once('lib/PageType.php');
150     if ($frame = $request->getArg('frame')) {
151         if (in_array($frame, array('body','browse','editpage')))
152             $template = Template($frame, array('CONTENT' => PageType($revision)));
153         elseif ($frame == 'top')
154             $template = Template($frame, array('framesrc' => $request->getArg('framesrc')));
155         else
156             $template = Template($frame);
157     } else {
158         $transformedContent = PageType($revision);
159         $template = Template('browse', array('CONTENT' => $transformedContent));
160     }
161
162     header("Content-Type: text/html; charset=" . CHARSET); // FIXME: this gets done twice?
163     $request->checkValidators();
164     
165     GeneratePage($template, $pagetitle, $revision,
166                  array('ROBOTS_META'    => 'index,follow',
167                        'PAGE_DESCRIPTION' => GleanDescription($revision),
168                        'REDIRECT_FROM' => $redirect_from));
169     flush();
170
171     $page->increaseHitCount();
172 }
173
174 // For emacs users
175 // Local Variables:
176 // mode: php
177 // tab-width: 8
178 // c-basic-offset: 4
179 // c-hanging-comment-ender-p: nil
180 // indent-tabs-mode: nil
181 // End:
182 ?>