]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/PageType.php
Fix for the double transformation bug which caused each page to be rendered twice...
[SourceForge/phpwiki.git] / lib / PageType.php
1 <?php rcs_id('$Id: PageType.php,v 1.10 2002-03-06 01:02:59 carstenklapp Exp $');
2 /*
3  Copyright 1999, 2000, 2001, 2002 $ThePhpWikiProgrammingTeam
4
5  This file is part of PhpWiki.
6
7  PhpWiki is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 2 of the License, or
10  (at your option) any later version.
11
12  PhpWiki is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  GNU General Public License for more details.
16
17  You should have received a copy of the GNU General Public License
18  along with PhpWiki; if not, write to the Free Software
19  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22
23 include_once('lib/BlockParser.php');
24
25
26 /**
27  * Get a PageType
28  *
29  * usage:
30  *
31  * require_once('lib/PageType.php');
32  * $transformedContent = PageType($pagerevisionhandle, $pagename, $markup);
33  *
34  * The pagename and markup args are only required when displaying the content
35  * for an edit preview, otherwise they will be extracted from the page $revision
36  * instance.
37  *
38  * See http://phpwiki.sourceforge.net/phpwiki/PageType
39  */
40 function PageType(&$rev, $pagename = false, $markup = false) {
41
42     if (isa($rev, 'WikiDB_PageRevision')) {
43         $text = $rev->getPackedContent();
44         $pagename = $rev->_pagename; //is this _ok?
45         $markup = $rev->get('markup');
46
47     } else {
48         // Hopefully only an edit preview gets us here, else we might be screwed.
49         if ($pagename == false) {
50             $error_text = "DEBUG: \$rev was not a 'WikiDB_PageRevision'. (Are you not previewing a page edit?)"; //debugging message only
51             trigger_error($error_text, E_USER_NOTICE);
52         }
53         $text = $rev;
54     }
55
56     // PageType currently only works with InterWikiMap.
57     // Once a contentType field has been implemented in the
58     // database then that can be used instead of this pagename check.
59     $i = _("InterWikiMap");
60     switch($pagename) {
61         case $i:
62             $ContentTemplateName = 'interwikimap';
63             $content_template = new interWikiMapPageType($text, $markup);
64             break;
65         default:
66             $ContentTemplateName = 'wikitext';
67             $content_template = new PageType($text, $markup);
68     }
69
70     // Start making the actual content
71     return $content_template->getContent();
72 }
73
74
75 /**
76  *
77  */
78 class PageType {
79     /**
80      * This is a simple WikiPage
81      */
82     var $_content = "";
83     var $_markup = false;
84     var $_divs = array();
85
86     function PageType (&$content, $markup) {
87         $this->_content = $content;
88         $this->_markup = $markup;
89         $this->_html = HTML();
90
91         $this->_defineSections();
92         $this->_populateSections();
93     }
94
95     function _defineSections() {
96         /**
97          * ... section_id => ('css_class', $this->_section_function)
98          */
99         $this->_divs = array('wikitext' => array('wikitext', $this->_extractText()));
100     }
101
102     function _populateSections() {
103         foreach ($this->_divs as $section => $data) {
104             list($class, $function) = $data;
105             if (!empty($function))
106                 $this->_html->pushContent(HTML::div(array('class' => $class), $function));
107         }
108     }
109
110     function _extractText() {
111         /**
112          * Custom text extractions might want to check if the section
113          * contains any text using trim() before returning any
114          * transformed text, to avoid displaying blank boxes.
115          * See interWikiMapPageType->_extractStartText()
116          * and interWikiMapPageType->_extractEndText() for examples.
117          */
118         return TransformText($this->_content, $this->_markup);
119     }
120
121     function getContent() {
122         return $this->_html;
123     }
124 };
125
126
127 class interWikiMapPageType extends PageType {
128
129     function _defineSections() {
130         /**
131          * section_id => ('css_class', $this->_section_function)
132          */
133         $this->_divs = array('interwikimap-header' => array('wikitext', $this->_extractStartText()),
134                              'interwikimap'        => array('wikitext', $this->_getMap()),
135                              'interwikimap-footer' => array('wikitext', $this->_extractEndText()));
136     }
137
138     function _getMap() {
139         global $request;
140         // let interwiki.php get the map
141         include_once("lib/interwiki.php");
142         $map = InterWikiMap::GetMap($request);
143         return $this->_arrayToTable($map->_map, $request);
144     }
145
146     function _arrayToTable ($array, &$request) {
147         $thead = HTML::thead();
148         $label[0] = _("Name");
149         $label[1] = _("InterWiki Address");
150         $thead->pushContent(HTML::tr(HTML::td($label[0]),
151                                      HTML::td($label[1])));
152
153         $tbody = HTML::tbody();
154         $dbi = $request->getDbh();
155         foreach ($array as $moniker => $interurl) {
156             if ($dbi->isWikiPage($moniker)) {
157                 $moniker = WikiLink($moniker);
158             }
159             $moniker = HTML::td(array('class' => 'interwiki-moniker'), $moniker);
160             $interurl = HTML::td(array('class' =>'interwiki-url'), HTML::tt($interurl));
161
162             $tbody->pushContent(HTML::tr($moniker, $interurl));
163         }
164         $table = HTML::table();
165         $table->setAttr('class', 'interwiki-map');
166         $table->pushContent($thead);
167         $table->pushContent($tbody);
168
169         return $table;
170     }
171
172     function _extractStartText() {
173         // get the start block of text
174         $v = strpos($this->_content, "<verbatim>");
175         if ($v)
176             list($wikitext, $cruft) = explode("<verbatim>", $this->_content);
177         else
178             $wikitext = $this->_content;
179
180         if (trim($wikitext))
181             return TransformText($wikitext, $this->_markup);
182
183         return "";
184     }
185
186     function _extractEndText() {
187         // get the ending block of text
188         $v = strpos($this->_content, "</verbatim>");
189         if ($v) {
190             list($cruft, $endtext) = explode("</verbatim>", $this->_content);
191             if (trim($endtext))
192                 return TransformText($endtext, $this->_markup);
193         }
194         return "";
195     }
196
197 };
198
199
200 // Local Variables:
201 // mode: php
202 // tab-width: 8
203 // c-basic-offset: 4
204 // c-hanging-comment-ender-p: nil
205 // indent-tabs-mode: nil
206 // End:
207 ?>