1<?php
2// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
3//
4// All Rights Reserved. See copyright.txt for details and a complete list of authors.
5// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
6// $Id$
7
8function wikiplugin_wikidiff_info()
9{
10	global $prefs;
11
12	return [
13		'name' => tra('Wiki Diff'),
14		'documentation' => 'PluginWikidiff',
15		'description' => tra('Display the differences between two wiki objects'),
16		'prefs' => [ 'wikiplugin_wikidiff', 'feature_wiki' ],
17		'iconname' => 'code-fork',
18		'introduced' => 15.3,
19		'format' => 'html',
20		'extraparams' => true,
21		'params' => [
22			'object_id' => [
23				'required' => true,
24				'name' => tra('Object Id'),
25				'description' => tra('Object to do a diff on (page name for wiki pages)'),
26				'since' => 15.3,
27				'default' => '',
28				'filter' => 'text',
29			],
30			'object_type' => [
31				'required' => false,
32				'name' => tra('Object Type'),
33				'description' => tra('Object type (wiki pages only)'),
34				'since' => 15.3,
35				'default' => 'wiki page',
36				'filter' => 'text',
37				'options' => [
38					['text' => '', 'value' => ''],
39					['text' => tra('Wiki Page'), 'value' => 'wiki page'],
40				]
41			],
42			'oldver' => [
43				'required' => true,
44				'name' => tra('Old version'),
45				'description' => tra('Integer for old version number, or date') ,
46				'since' => 15.3,
47				'filter' => 'text',
48				'default' => '',
49			],
50			'newver' => [
51				'required' => false,
52				'name' => tra('New version'),
53				'description' => tra('Integer for old version number, or date') . ' - ' . tra('Leave empty for current version') ,
54				'since' => 15.3,
55				'filter' => 'text',
56				'default' => '',
57			],
58			'diff_style' => [
59				'required' => false,
60				'name' => tra('Diff Style'),
61				'description' => tr('Defaults to "diff style" preference if empty'),
62				'since' => '15.3',
63				'filter' => 'text',
64				'default' => $prefs['default_wiki_diff_style'],
65				'options' => [
66					['text' => '', 'value' => ''],
67					['text' => tra('HTML diff'), 'value' => 'htmldiff'],
68					['text' => tra('Side-by-side diff'), 'value' => 'sidediff'],
69					['text' => tra('Side-by-side diff by characters'), 'value' => 'sidediff-char'],
70					['text' => tra('Inline diff'), 'value' => 'inlinediff'],
71					['text' => tra('Inline diff by characters'), 'value' => 'inlinediff-char'],
72					['text' => tra('Full side-by-side diff'), 'value' => 'sidediff-full'],
73					['text' => tra('Full side-by-side diff by characters'), 'value' => 'sidediff-full-char'],
74					['text' => tra('Full inline diff'), 'value' => 'inlinediff-full'],
75					['text' => tra('Full inline diff by characters'), 'value' => 'inlinediff-full-char'],
76					['text' => tra('Unified diff'), 'value' => 'unidiff'],
77					['text' => tra('Side-by-side view'), 'value' => 'sideview'],
78				],
79			],
80			'show_version_info' => [
81				'required' => false,
82				'name' => tra('Show version info'),
83				'description' => tra('Show the heading "Comparing version X with version Y"'),
84				'since' => 15.3,
85				'default' => 'n',
86				'filter' => 'text',
87				'options' => [
88					['text' => '', 'value' => ''],
89					['text' => tra('No'), 'value' => 'n'],
90					['text' => tra('Yes'), 'value' => 'y'],
91				]
92			],
93			'pagedenied_text' => [
94				'required' => false,
95				'name' => tr('Permission denied message'),
96				'description' => tr('Text to show when the page exists but the user has insufficient permissions to see it.'),
97				'since' => '18.0',
98				'filter' => 'text',
99				'default' => '',
100			],
101			'pagenotapproved_text' => [
102				'required' => false,
103				'name' => tr('No version approved error message'),
104				'description' => tr('Text to show when the page exists but no version is approved.'),
105				'since' => '18.0',
106				'filter' => 'text',
107				'default' => "You don't have permission to see this content, because it hasn't been approved",
108			],
109		]
110	];
111}
112
113function wikiplugin_wikidiff($data, $params)
114{
115	global $prefs;
116	// TODO refactor: defaults for plugins?
117	$defaults = [];
118	$plugininfo = wikiplugin_wikidiff_info();
119	foreach ($plugininfo['params'] as $key => $param) {
120		$defaults["$key"] = $param['default'];
121	}
122	$params = array_merge($defaults, $params);
123
124	$tikilib = TikiLib::lib('tiki');
125	$perms = $tikilib->get_perm_object($params['object_id'], $params['object_type']);
126	if ($perms['tiki_p_view'] != 'y') {
127		$text = $params['pagedenied_text'];
128		return($text);
129	}
130
131	if ($prefs['flaggedrev_approval'] == 'y') {
132		$flaggedrevisionlib = TikiLib::lib('flaggedrevision');
133		if ($flaggedrevisionlib->page_requires_approval($params['object_id'])) {
134			if (! $flaggedrevisionlib->version_is_flagged($params['object_id'], $params['oldver'], 'moderation', 'OK')) {
135				// If oldver (required) is not approved, display error message
136				$text = $params['pagenotapproved_text'];
137				return($text);
138			}
139			if (isset($params['newver']) && ! empty($params['newver'])) {
140				// If specific version is specified, check if it has been approved
141				if (! $flaggedrevisionlib->version_is_flagged($params['object_id'], $params['newver'], 'moderation', 'OK')) {
142					return($params['pagenotapproved_text']);
143				}
144			} else {
145				// No version provided, get latest approved version
146				if ($version_info = $flaggedrevisionlib->get_version_with($params['object_id'], 'moderation', 'OK')) {
147					$params['newver'] = (int)$version_info['version'];
148					if ($params['newver'] < (int)$params['oldver']) {
149						return($params['pagenotapproved_text']);
150					}
151				}
152			}
153		}
154	}
155
156	// Note: the underlying param is the opposite: hide_version_info
157	$params['show_version_info'] = $params['show_version_info'] !== 'n';
158
159	$smarty = TikiLib::lib('smarty');
160	$smarty->loadPlugin('smarty_function_wikidiff');
161
162	$ret = smarty_function_wikidiff($params, $smarty->getEmptyInternalTemplate());
163	return $ret;
164}
165