2 rcs_id('$Id: PageHistory.php,v 1.6 2002-01-18 00:28:43 dairiki Exp $');
5 require_once('lib/plugin/RecentChanges.php');
7 class _PageHistory_PageRevisionIter
8 extends WikiDB_PageRevisionIterator
10 function _PageHistory_PageRevisionIter($rev_iter, $params) {
12 $this->_iter = $rev_iter;
17 $this->_since = $since;
19 $this->_include_major = empty($exclude_major_revisions);
20 if (! $this->_include_major)
21 $this->_include_minor = true;
23 $this->_include_minor = !empty($include_minor_revisions);
25 if (empty($include_all_revisions))
27 else if (isset($limit))
28 $this->_limit = $limit;
35 if (isset($this->_limit)) {
36 if ($this->_limit <= 0) {
43 while ( ($rev = $this->_iter->next()) ) {
44 if (isset($this->_since) && $rev->get('mtime') < $this->_since) {
48 if ($rev->get('is_minor_edit') ? $this->_include_minor : $this->_include_major)
63 class _PageHistory_HtmlFormatter
64 extends _RecentChanges_HtmlFormatter
66 function include_versions_in_URLs() {
71 return sprintf(_("PageHistory for %s"),
72 LinkExistingWikiWord($this->_args['page']))
73 . "\n" . $this->rss_icon();
76 function _javascript($script) {
77 return Element('script', array('language' => 'JavaScript'),
78 "<!-- //\n$script\n// -->");
81 function description() {
82 // Doesn't work (PHP bug?): $desc = parent::description() . "\n";
83 $desc = _RecentChanges_HtmlFormatter::description() . "\n";
85 $desc .= $this->_javascript(sprintf('document.write("%s");',
86 _("Check any two boxes to compare revisions.")));
87 $button = Element('input', array('type' => 'submit',
88 'value' => _("compare revisions")));
89 $desc .= Element('noscript',
90 sprintf(_("Check any two boxes then %s."), $button));
96 function format ($changes) {
97 $this->_itemcount = 0;
99 $pagename = $this->_args['page'];
101 $html[] = _RecentChanges_HtmlFormatter::format($changes);
103 $html[] = Element('input', array('type' => 'hidden',
107 $action = WikiURL($pagename);
110 $action = SCRIPT_NAME;
111 $html[] = Element('input', array('type' => 'hidden',
112 'name' => 'pagename',
113 'value' => $pagename));
116 return Element('form', array('method' => 'get',
118 'name' => 'diff-select'),
121 . $this->_javascript('
122 var diffCkBoxes = document.forms["diff-select"].elements["versions[]"];
124 function diffCkBox_onclick() {
125 // If two checkboxes are checked, submit form
127 for (i = 0; i < diffCkBoxes.length; i++)
128 if (diffCkBoxes[i].checked && ++nchecked >= 2)
132 for (i = 0; i < diffCkBoxes.length; i++)
133 diffCkBoxes[i].onclick = diffCkBox_onclick;');
136 function diffLink ($rev) {
137 return Element('input', array('type' => 'checkbox',
138 'name' => 'versions[]',
139 'value' => $rev->getVersion()));
142 function pageLink ($rev) {
143 return QElement('a', array('href' => $this->pageURL($rev), 'class' => 'wiki'),
144 sprintf(_("Version %d"), $rev->getVersion()));
149 class _PageHistory_RssFormatter
150 extends _RecentChanges_RssFormatter
152 function include_versions_in_URLs() {
156 function image_properties () {
160 function textinput_properties () {
164 function channel_properties () {
167 $rc_url = WikiURL($request->getArg('pagename'), false, 'absurl');
169 $title = sprintf("%s: %s",
171 split_pagename($this->_args['page']));
173 return array('title' => $title,
174 'dc:description' => _("History of changes."),
176 'dc:date' => Iso8601DateTime(time()));
180 function item_properties ($rev) {
181 if (!($title = $this->summary($rev)))
182 $title = sprintf(_("Version %d"), $rev->getVersion());
184 return array( 'title' => $title,
185 'link' => $this->pageURL($rev),
186 'dc:date' => $this->time($rev),
187 'dc:contributor' => $rev->get('author'),
188 'wiki:version' => $rev->getVersion(),
189 'wiki:importance' => $this->importance($rev),
190 'wiki:status' => $this->status($rev),
191 'wiki:diff' => $this->diffURL($rev),
196 class WikiPlugin_PageHistory
197 extends WikiPlugin_RecentChanges
199 function getName () {
200 return _("PageHistory");
203 function getDescription () {
204 return sprintf(_("List PageHistory for %s"),'[pagename]');
207 function getDefaultArguments() {
208 return array('days' => false,
209 'show_minor' => true,
210 'show_major' => true,
216 function getDefaultFormArguments() {
217 $dflts = WikiPlugin_RecentChanges::getDefaultFormArguments();
218 $dflts['textinput'] = 'page';
222 function getMostRecentParams ($args) {
223 $params = WikiPlugin_RecentChanges::getMostRecentParams($args);
224 $params['include_all_revisions'] = true;
228 function getChanges ($dbi, $args) {
229 $page = $dbi->getPage($args['page']);
230 $iter = $page->getAllRevisions();
231 $params = $this->getMostRecentParams($args);
232 return new _PageHistory_PageRevisionIter($iter, $params);
235 function format ($changes, $args) {
237 $format = $args['format'];
239 $fmt_class = $Theme->getFormatter('PageHistory', $format);
241 if ($format == 'rss')
242 $fmt_class = '_PageHistory_RssFormatter';
244 $fmt_class = '_PageHistory_HtmlFormatter';
247 $fmt = new $fmt_class($args);
248 return $fmt->format($changes);
251 function run ($dbi, $argstr, $request) {
252 $args = $this->getArgs($argstr, $request);
253 if (empty($args['page']))
254 return $this->makeForm("", $request);
255 // Hack alert: format() is a NORETURN for rss formatters.
256 return $this->format($this->getChanges($dbi, $args), $args);
261 // (c-file-style: "gnu")
266 // c-hanging-comment-ender-p: nil
267 // indent-tabs-mode: nil