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