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