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 $');
5 require_once('lib/Template.php');
8 * Guess a short description of the page.
12 * This algorithm was suggested on MeatballWiki by
13 * Alex Schroeder <kensanata@yahoo.com>.
15 * Use the first paragraph in the page which contains at least two
18 * @see http://www.usemod.com/cgi-bin/mb.pl?MeatballWikiSuggestions
20 function GleanDescription ($rev) {
22 = pcre_fix_posix_classes("/[.?!]\s+[[:upper:])]"
24 . "[.?!]\s*([[:upper:])]|$)/sx");
26 $content = preg_replace("/(['\"])/", "\$1", $rev->getPackedContent());
28 // Iterate through paragraphs.
29 while (preg_match('/(?: ^ \w .* $ \n? )+/mx', $content, $m)) {
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));
37 $content = substr(strstr($content, $paragraph), strlen($paragraph));
43 /** Make a link back to redirecting page.
45 * @param $pagename string Name of redirecting page.
46 * @return XmlContent Link to the redirecting page.
48 function RedirectorLink($pagename) {
49 $url = WikiURL($pagename, array('redirectfrom' => ''));
50 return HTML::a(array('class' => 'redirectfrom wiki',
56 function actionPage(&$request, $action) {
59 $pagename = $request->getArg('pagename');
60 $version = $request->getArg('version');
62 $page = $request->getPage();
63 $revision = $page->getCurrentRevision();
65 $dbi = $request->getDbh();
66 $actionpage = $dbi->getPage($action);
67 $actionrev = $actionpage->getCurrentRevision();
69 // $splitname = split_pagename($pagename);
71 $pagetitle = HTML(fmt("%s: %s", $actionpage->getName(),
72 $Theme->linkExistingWikiWord($pagename, false, $version)));
74 $validators = new HTTP_ValidatorSet(array('pageversion' => $revision->getVersion(),
75 '%mtime' => $revision->get('mtime')));
77 $request->appendValidators(array('pagerev' => $revision->getVersion(),
78 '%mtime' => $revision->get('mtime')));
79 $request->appendValidators(array('actionpagerev' => $actionrev->getVersion(),
80 '%mtime' => $actionrev->get('mtime')));
82 $transformedContent = $actionrev->getTransformedContent();
83 $template = Template('browse', array('CONTENT' => $transformedContent));
85 header("Content-Type: text/html; charset=" . CHARSET);
86 GeneratePage($template, $pagetitle, $revision);
87 $request->checkValidators();
91 function displayPage(&$request, $tmpl = 'browse') {
92 $pagename = $request->getArg('pagename');
93 $version = $request->getArg('version');
94 $page = $request->getPage();
96 $revision = $page->getRevision($version);
98 NoSuchRevision($request, $page, $version);
101 $revision = $page->getCurrentRevision();
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'
111 split_pagename($pages[0] . SUBPAGE_SEPARATOR)));
112 $first_pages = $pages[0] . SUBPAGE_SEPARATOR;
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;
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);
127 $pagetitle = HTML::a(array('href' => WikiURL($pagename,
128 array('action' => _("BackLinks"))),
129 'class' => 'backlinks'),
131 $pagetitle->addTooltip(sprintf(_("BackLinks for %s"), $pagename));
134 $redirect_from = $request->getArg('redirectfrom');
135 if ($redirect_from) {
136 $redirect_from = fmt("Redirected from %s", RedirectorLink($redirect_from));
139 //include_once('lib/BlockParser.php');
141 $request->appendValidators(array('pagerev' => $revision->getVersion(),
142 '%mtime' => $revision->get('mtime')));
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')));
150 $template = Template($frame);
152 $transformedContent = $revision->getTransformedContent();
153 $template = Template('browse', array('CONTENT' => $transformedContent));
156 header("Content-Type: text/html; charset=" . CHARSET); // FIXME: this gets done twice?
158 GeneratePage($template, $pagetitle, $revision,
159 array('ROBOTS_META' => 'index,follow',
160 'PAGE_DESCRIPTION' => GleanDescription($revision),
161 'REDIRECT_FROM' => $redirect_from));
162 $request->checkValidators();
164 $page->increaseHitCount();
172 // c-hanging-comment-ender-p: nil
173 // indent-tabs-mode: nil