]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/PageType.php
fixed (again) the Double Page-Transformation bug. http://phpwiki.sourceforge.net...
[SourceForge/phpwiki.git] / lib / PageType.php
1 <?php rcs_id('$Id: PageType.php,v 1.12 2002-08-20 11:17:08 rurban 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     return $content_template->getContent();
71 }
72
73
74 /**
75  *
76  */
77 class PageType {
78     /**
79      * This is a simple WikiPage
80      */
81     var $_content = "";
82     var $_markup = false;
83     var $_divs = array();
84
85     function PageType (&$content, $markup) {
86         $this->_content = $content;
87         $this->_markup = $markup;
88         $this->_html = HTML();
89
90         $this->_defineSections();
91         $this->_populateSections();
92     }
93
94     function _defineSections() {
95         /**
96          * ... section_id => ('css_class', $this->_section_function)
97          */
98         $this->_divs = array('wikitext' => array('wikitext', $this->_extractText()));
99     }
100
101     function _populateSections() {
102         foreach ($this->_divs as $section => $data) {
103             list($class, $function) = $data;
104             if (!empty($function))
105                 $this->_html->pushContent(HTML::div(array('class' => $class), $function));
106         }
107     }
108
109     function _extractText() {
110         /**
111          * Custom text extractions might want to check if the section
112          * contains any text using trim() before returning any
113          * transformed text, to avoid displaying blank boxes.
114          * See interWikiMapPageType->_extractStartText()
115          * and interWikiMapPageType->_extractEndText() for examples.
116          */
117         return TransformText($this->_content, $this->_markup);
118     }
119
120     function getContent() {
121         return $this->_html;
122     }
123 };
124
125
126 class interWikiMapPageType extends PageType {
127
128     function _defineSections() {
129         /**
130          * section_id => ('css_class', $this->_section_function)
131          */
132         $this->_divs = array('interwikimap-header' => array('wikitext', $this->_extractStartText()),
133                              'interwikimap'        => array('wikitext', $this->_getMap()),
134                              'interwikimap-footer' => array('wikitext', $this->_extractEndText()));
135     }
136
137     function _getMap() {
138         global $request;
139         // let interwiki.php get the map
140         include_once("lib/interwiki.php");
141         $map = InterWikiMap::GetMap($request);
142         return $this->_arrayToTable($map->_map, $request);
143     }
144
145     function _arrayToTable ($array, &$request) {
146         $thead = HTML::thead();
147         $label[0] = _("Name");
148         $label[1] = _("InterWiki Address");
149         $thead->pushContent(HTML::tr(HTML::td($label[0]),
150                                      HTML::td($label[1])));
151
152         $tbody = HTML::tbody();
153         $dbi = $request->getDbh();
154         if ($array) {
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         }
165         $table = HTML::table();
166         $table->setAttr('class', 'interwiki-map');
167         $table->pushContent($thead);
168         $table->pushContent($tbody);
169
170         return $table;
171     }
172
173     function _extractStartText() {
174         // get the start block of text
175         $v = strpos($this->_content, "<verbatim>");
176         if ($v)
177             list($wikitext, $cruft) = explode("<verbatim>", $this->_content);
178         else
179             $wikitext = $this->_content;
180
181         if (trim($wikitext))
182             return TransformText($wikitext, $this->_markup);
183
184         return "";
185     }
186
187     function _extractEndText() {
188         // get the ending block of text
189         $v = strpos($this->_content, "</verbatim>");
190         if ($v) {
191             list($cruft, $endtext) = explode("</verbatim>", $this->_content);
192             if (trim($endtext))
193                 return TransformText($endtext, $this->_markup);
194         }
195         return "";
196     }
197
198 };
199
200
201 // Local Variables:
202 // mode: php
203 // tab-width: 8
204 // c-basic-offset: 4
205 // c-hanging-comment-ender-p: nil
206 // indent-tabs-mode: nil
207 // End:
208 ?>