plugin_get_list();
foreach ($plugins as & $name) {
$name = "wikiplugin_$name";
}
if ($include_custom) {
$custom = Toolbar::getCustomList();
$plugins = array_merge($plugins, $custom);
}
return array_unique(
array_merge(
[
'-',
'|',
'bold',
'italic',
'underline',
'strike',
'code',
'sub',
'sup',
'tikilink',
'link',
'anchor',
'color',
'bgcolor',
'center',
'table',
'rule',
'pagebreak',
'box',
'email',
'h1',
'h2',
'h3',
'titlebar',
'pastlink',
'toc',
'list',
'numlist',
'specialchar',
'smiley',
'templates',
'cut',
'copy',
'paste',
'pastetext',
'pasteword',
'print',
'spellcheck',
'undo',
'redo',
'find',
'replace',
'selectall',
'removeformat',
'showblocks',
'left',
'right',
'full',
'indent',
'outdent',
'unlink',
'style',
'fontname',
'fontsize',
'format',
'source',
'fullscreen',
'help',
'tikiimage',
'tikifile',
'switcheditor',
'autosave',
'admintoolbar',
'nonparsed',
'bidiltr',
'bidirtl',
'screencapture',
'image',
'sheetsave', // spreadsheet ones
'addrow',
'addrowmulti',
'addrowbefore',
'deleterow',
'addcolumn',
'addcolumnbefore',
'deletecolumn',
'addcolumnmulti',
'sheetgetrange',
'sheetfind',
'sheetrefresh',
'sheetclose',
'objectlink',
'tikitable',
],
$plugins
)
);
}
public static function getCustomList()
{
global $prefs;
if (isset($prefs['toolbar_custom_list'])) {
$custom = @unserialize($prefs['toolbar_custom_list']);
sort($custom);
} else {
$custom = [];
}
return $custom;
}
public static function getCustomTool($name)
{
global $prefs;
if (isset($prefs["toolbar_tool_$name"])) {
$data = unserialize($prefs["toolbar_tool_$name"]);
$tag = Toolbar::fromData($name, $data);
return $tag;
} else {
return null;
}
}
public static function isCustomTool($name)
{
global $prefs;
return isset($prefs["toolbar_tool_$name"]);
}
public static function saveTool($name, $label, $icon = 'img/icons/shading.png', $token = '', $syntax = '', $type = 'Inline', $plugin = '')
{
global $tikilib;
$name = strtolower(TikiLib::remove_non_word_characters_and_accents($name));
$standard_names = Toolbar::getList(false);
$custom_list = Toolbar::getCustomList();
if (in_array($name, $standard_names)) { // don't allow custom tools with the same name as standard ones
$c = 1;
while (in_array($name . '_' . $c, $custom_list)) {
$c++;
}
$name = $name . '_' . $c;
}
$prefName = "toolbar_tool_$name";
$data = ['name' => $name, 'label' => $label, 'token' => $token, 'syntax' => $syntax, 'type' => $type, 'plugin' => $plugin];
if (strpos($icon, 'img/icons/') !== false) {
$data['icon'] = $icon;
} else {
$data['iconname'] = $icon;
}
$tikilib->set_preference($prefName, serialize($data));
if (! in_array($name, $custom_list)) {
$custom_list[] = $name;
$tikilib->set_preference('toolbar_custom_list', serialize($custom_list));
}
}
public static function deleteTool($name)
{
global $prefs, $tikilib;
$name = strtolower($name);
$prefName = "toolbar_tool_$name";
if (isset($prefs[$prefName])) {
$tikilib->delete_preference($prefName);
$list = [];
if (isset($prefs['toolbar_custom_list'])) {
$list = unserialize($prefs['toolbar_custom_list']);
}
if (in_array($name, $list)) {
$list = array_diff($list, [$name]);
$tikilib->set_preference('toolbar_custom_list', serialize($list));
}
}
}
public static function deleteAllCustomTools()
{
$tikilib = TikiLib::lib('tiki');
$tikilib->query('DELETE FROM `tiki_preferences` WHERE `name` LIKE \'toolbar_tool_%\'');
$tikilib->delete_preference('toolbar_custom_list');
}
public static function fromData($tagName, $data)
{
$tag = null;
switch ($data['type']) {
case 'Inline':
$tag = new ToolbarInline();
$tag->setSyntax($data['syntax']);
break;
case 'Block':
$tag = new ToolbarBlock();
$tag->setSyntax($data['syntax']);
break;
case 'LineBased':
$tag = new ToolbarLineBased();
$tag->setSyntax($data['syntax']);
break;
case 'Picker':
$tag = new ToolbarPicker();
break;
case 'Separator':
$tag = new ToolbarSeparator();
break;
case 'Spacer':
$tag = new ToolbarSpacer();
break;
case 'CkOnly':
$tag = new ToolbarCkOnly($tagName);
break;
case 'Fullscreen':
$tag = new ToolbarFullscreen();
break;
case 'TextareaResize':
$tag = new ToolbarTextareaResize();
break;
case 'Helptool':
$tag = new ToolbarHelptool();
break;
case 'FileGallery':
$tag = new ToolbarFileGallery();
break;
case 'Wikiplugin':
if (! isset($data['plugin'])) {
$data['plugin'] = '';
}
$tag = ToolbarWikiplugin::fromName('wikiplugin_' . $data['plugin']);
if (empty($tag)) {
$tag = new ToolbarWikiplugin();
}
break;
default:
$tag = new ToolbarInline();
break;
}
$tag->setLabel($data['label'])
->setWysiwygToken($data['token'])
->setIconName(! empty($data['iconname']) ? $data['iconname'] : 'help')
->setIcon(! empty($data['icon']) ? $data['icon'] : 'img/icons/shading.png')
->setType($data['type']);
return $tag;
}
abstract public function getWikiHtml($areaId);
public function isAccessible()
{
global $prefs;
foreach ($this->requiredPrefs as $prefName) {
if (! isset($prefs[$prefName]) || $prefs[$prefName] != 'y') {
return false;
}
}
return true;
}
protected function addRequiredPreference($prefName)
{
$this->requiredPrefs[] = $prefName;
}
protected function setIcon($icon)
{
$this->icon = $icon;
return $this;
}
protected function setIconName($iconname)
{
$this->iconname = $iconname;
return $this;
}
protected function setLabel($label)
{
$this->label = $label;
return $this;
}
protected function setWysiwygToken($token)
{
$this->wysiwyg = $token;
return $this;
}
protected function setSyntax($syntax)
{
return $this;
}
protected function setType($type)
{
$this->type = $type;
return $this;
}
public function getIcon()
{
return $this->icon;
}
public function getLabel()
{
return $this->label;
}
public function getWysiwygToken($areaId)
{
return $this->wysiwyg;
}
public function getWysiwygWikiToken($areaId) // wysiwyg_htmltowiki
{
return null;
}
public function getSyntax($areaId)
{
return '';
}
public function getType()
{
return $this->type;
}
public function getIconHtml()
{
if (! empty($this->iconname)) {
$iname = $this->iconname;
} elseif (! empty($this->icon)) {
$headerlib = TikiLib::lib('header');
return '';
} else {
$iname = 'help';
}
$smarty = TikiLib::lib('smarty');
$smarty->loadPlugin('smarty_function_icon');
return smarty_function_icon(['name' => $iname, 'ititle' => ':'
. htmlentities($this->getLabel(), ENT_QUOTES, 'UTF-8'), 'iclass' => 'tips bottom'], $smarty->getEmptyInternalTemplate());
}
public function getSelfLink($click, $title, $class)
{
global $prefs;
$smarty = TikiLib::lib('smarty');
$params = [];
$params['_onclick'] = $click . (substr($click, strlen($click) - 1) != ';' ? ';' : '') . 'return false;';
$params['_class'] = 'toolbar btn btn-sm px-2 tips bottom' . (! empty($class) ? ' ' . $class : '');
$params['_ajax'] = 'n';
$content = $title;
if ($this->iconname) {
$params['_icon_name'] = $this->iconname;
$colon = $prefs['javascript_enabled'] === 'y' ? ':' : '';
$params['_title'] = $colon . $title;
} else {
$params['_icon'] = $this->icon;
}
if (
strpos($class, 'qt-plugin') !== false && ($this->iconname == 'plugin'
|| $this->icon == 'img/icons/plugin.png')
) {
$params['_menu_text'] = 'y';
$params['_menu_icon'] = 'y';
}
$smarty->loadPlugin('smarty_block_self_link');
return smarty_block_self_link($params, $content, $smarty->getEmptyInternalTemplate());
}
protected function setupCKEditorTool($js, $name, $label = '', $icon = '')
{
if (empty($label)) {
$label = $name;
}
$label = addcslashes($label, "'");
TikiLib::lib('header')->add_js(
<<< JS
if (typeof window.CKEDITOR !== "undefined" && !window.CKEDITOR.plugins.get("{$name}")) {
window.CKEDITOR.config.extraPlugins += (window.CKEDITOR.config.extraPlugins ? ',{$name}' : '{$name}' );
window.CKEDITOR.plugins.add( '{$name}', {
init : function( editor ) {
var command = editor.addCommand( '{$name}', new window.CKEDITOR.command( editor , {
modes: { wysiwyg:1 },
exec: function (editor, data) {
{$js}
},
canUndo: false
}));
editor.ui.addButton( '{$name}', {
label : '{$label}',
command : '{$name}',
icon: editor.config._TikiRoot + '{$icon}'
});
}
});
}
JS
,
10
);
}
}
class ToolbarSeparator extends Toolbar
{
public function __construct()
{
$this->setWysiwygToken('-')
->setIcon('img/separator.gif')
->setType('Separator');
}
public function getWikiHtml($areaId)
{
return '|';
}
}
class ToolbarSpacer extends Toolbar
{
public function __construct()
{
$this->setWysiwygToken('|')
->setIcon('img/trans.png')
->setType('Spacer');
}
public function getWikiHtml($areaId)
{
return '||';
}
}
class ToolbarCkOnly extends Toolbar
{
public function __construct($token, $icon = '', $iconname = '')
{
if (empty($icon)) {
$img_path = 'img/ckeditor/' . strtolower($token) . '.png';
if (is_file($img_path)) {
$icon = $img_path;
} else {
$icon = 'img/icons/shading.png';
}
}
$this->setWysiwygToken($token)
->setIcon($icon)
->setIconName($iconname)
->setType('CkOnly');
}
public static function fromName($name, $is_html)
{
global $prefs;
switch ($name) {
case 'templates':
if ($prefs['feature_wiki_templates'] === 'y') {
return new self('Templates');
} else {
return null;
}
case 'cut':
return new self('Cut', null, 'scissors');
case 'copy':
return new self('Copy', null, 'copy');
case 'paste':
return new self('Paste', null, 'paste');
case 'pastetext':
return new self('PasteText', null, 'paste');
case 'pasteword':
return new self('PasteFromWord', null, 'paste');
case 'print':
return new self('Print', null, 'print');
case 'spellcheck':
return new self('SpellChecker', null, 'ok');
case 'undo':
return new self('Undo', null, 'undo');
case 'redo':
return new self('Redo', null, 'repeat');
case 'selectall':
return new self('SelectAll', null, 'selectall');
case 'removeformat':
return new self('RemoveFormat', null, 'erase');
case 'showblocks':
return new self('ShowBlocks', null, 'box');
case 'left':
return new self('JustifyLeft', null, 'align-left');
case 'right':
return new self('JustifyRight', null, 'align-right');
case 'full':
return new self('JustifyBlock', null, 'align-justify');
case 'indent':
return new self('Indent', null, 'indent');
case 'outdent':
return new self('Outdent', null, 'outdent');
case 'style':
return new self('Styles');
case 'fontname':
return new self('Font');
case 'fontsize':
return new self('FontSize');
case 'format':
return new self('Format');
case 'source':
global $tikilib, $user, $page;
$p = $prefs['wysiwyg_htmltowiki'] == 'y' ? 'tiki_p_wiki_view_source' : 'tiki_p_use_HTML';
if ($tikilib->user_has_perm_on_object($user, $page, 'wiki page', $p)) {
return new self('Source', null, 'code_file');
} else {
return null;
}
case 'autosave':
return new self('autosave', 'img/ckeditor/ajaxSaveDirty.gif', 'floppy');
case 'inlinesave':
return new self('Inline save', 'img/ckeditor/ajaxSaveDirty.gif');
case 'inlinecancel':
return new self('Inline cancel', 'img/icons/cross.png');
case 'sub':
return new self('Subscript', null, 'subscript');
case 'sup':
return new self('Superscript', null, 'subscript');
case 'anchor':
return new self('Anchor', null, 'anchor');
case 'bidiltr':
return new self('BidiLtr', null, 'arrow-right');
case 'bidirtl':
return new self('BidiRtl', null, 'arrow-left');
case 'image':
return new self('Image', null, 'image');
case 'table':
return $is_html ? new self('Table') : null;
case 'link':
return $is_html ? new self('Link') : null;
case 'unlink':
return new self('Unlink', null, 'unlink');
}
}
public function getWikiHtml($areaId)
{
return null;
}
public function getWysiwygToken($areaId)
{
if ($this->wysiwyg === 'Image') { // cke's own image tool
global $prefs;
$headerlib = TikiLib::lib('header');
// can't do upload the cke way yet
$url = 'tiki-list_file_gallery.php?galleryId=' . $prefs['home_file_gallery'] . '&filegals_manager=fgal_picker';
$headerlib->add_js('if (typeof window.CKEDITOR !== "undefined") {window.CKEDITOR.config.filebrowserBrowseUrl = "' . $url . '"}', 5);
}
return $this->wysiwyg;
}
public function getWysiwygWikiToken($areaId) // wysiwyg_htmltowiki
{
switch ($this->wysiwyg) {
case 'autosave':
case 'Copy':
case 'Cut':
case 'Format':
case 'JustifyLeft':
case 'Paste':
case 'PasteText':
case 'PasteFromWord':
case 'Redo':
case 'RemoveFormat':
case 'ShowBlocks':
case 'Source':
case 'Undo':
case 'Unlink':
return $this->wysiwyg;
break;
default:
return null;
}
}
public function getLabel()
{
return $this->wysiwyg;
}
public function getIconHtml()
{
if (! empty($this->iconname)) {
$smarty = TikiLib::lib('smarty');
$smarty->loadPlugin('smarty_function_icon');
return smarty_function_icon(['name' => $this->iconname, 'ititle' => ':'
. htmlentities($this->getLabel(), ENT_QUOTES, 'UTF-8'), 'iclass' => 'tips bottom'], $smarty->getEmptyInternalTemplate());
}
if ((! empty($this->icon) && $this->icon !== 'img/icons/shading.png') || in_array($this->label, ['Autosave'])) {
return parent::getIconHtml();
}
global $prefs;
$skin = $prefs['wysiwyg_toolbar_skin'];
$headerlib = TikiLib::lib('header');
$headerlib->add_cssfile('vendor_bundled/vendor/ckeditor/ckeditor/skins/' . $skin . '/editor.css');
$cls = strtolower($this->wysiwyg);
$headerlib->add_css(
'span.cke_skin_' . $skin . ' {border: none;background: none;padding:0;margin:0;}' .
'.toolbars-admin .row li.toolbar > span.cke_skin_' . $skin . ' {display: inline-block;}'
);
return '';
}
}
class ToolbarInline extends Toolbar
{
protected $syntax;
public static function fromName($tagName)
{
switch ($tagName) {
case 'bold':
$label = tra('Bold');
$icon = tra('img/icons/text_bold.png');
$iconname = 'bold';
$wysiwyg = 'Bold';
$syntax = '__text__';
break;
case 'italic':
$label = tra('Italic');
$icon = tra('img/icons/text_italic.png');
$iconname = 'italic';
$wysiwyg = 'Italic';
$syntax = "''text''";
break;
case 'underline':
$label = tra('Underline');
$icon = tra('img/icons/text_underline.png');
$iconname = 'underline';
$wysiwyg = 'Underline';
$syntax = "===text===";
break;
case 'strike':
$label = tra('Strikethrough');
$icon = tra('img/icons/text_strikethrough.png');
$iconname = 'strikethrough';
$wysiwyg = 'Strike';
$syntax = '--text--';
break;
case 'code':
$label = tra('Code');
$icon = tra('img/icons/page_white_code.png');
$iconname = 'code';
$wysiwyg = 'Code';
$syntax = '-+text+-';
break;
case 'nonparsed':
$label = tra('Non-parsed (wiki syntax does not apply)');
$icon = tra('img/icons/noparse.png');
$iconname = 'ban';
$wysiwyg = null;
$syntax = '~np~text~/np~';
break;
default:
return;
}
$tag = new self();
$tag->setLabel($label)
->setWysiwygToken($wysiwyg)
->setIconName(! empty($iconname) ? $iconname : 'help')
->setIcon(! empty($icon) ? $icon : 'img/icons/shading.png')
->setSyntax($syntax)
->setType('Inline');
return $tag;
}
public function getSyntax($areaId)
{
return $this->syntax;
}
public function setSyntax($syntax)
{
$this->syntax = $syntax;
return $this;
}
public function getWysiwygWikiToken($areaId) // wysiwyg_htmltowiki
{
return $this->getWysiwygToken($areaId);
}
public function getWikiHtml($areaId)
{
if ($this->syntax == '~np~text~/np~') { // closing ~/np~ tag breaks toolbar when inside nested plugins
return $this->getSelfLink(
'insertAt(\'' . $areaId . '\', \'~np~text~\'+\'/np~\');',
htmlentities($this->label, ENT_QUOTES, 'UTF-8'),
'qt-inline'
);
} else {
return $this->getSelfLink(
'insertAt(\'' . $areaId . '\', \'' . addslashes(htmlentities($this->syntax, ENT_COMPAT, 'UTF-8')) . '\');',
htmlentities($this->label, ENT_QUOTES, 'UTF-8'),
'qt-inline'
);
}
}
}
class ToolbarBlock extends ToolbarInline // Will change in the future
{
protected $syntax;
public static function fromName($tagName)
{
global $prefs;
$label = null;
$wysiwyg = null;
$syntax = null;
switch ($tagName) {
case 'center':
$label = tra('Align Center');
$iconname = 'align-center';
$wysiwyg = 'JustifyCenter';
if ($prefs['feature_use_three_colon_centertag'] == 'y') {
$syntax = ":::text:::";
} else {
$syntax = "::text::";
}
break;
case 'rule':
$label = tra('Horizontal Bar');
$iconname = 'horizontal-rule';
$wysiwyg = 'HorizontalRule';
$syntax = '---';
break;
case 'pagebreak':
$label = tra('Page Break');
$iconname = 'page-break';
$wysiwyg = 'PageBreak';
$syntax = '...page...';
break;
case 'box':
$label = tra('Box');
$iconname = 'box';
$wysiwyg = 'Box';
$syntax = '^text^';
break;
case 'email':
$label = tra('Email');
$iconname = 'envelope';
$wysiwyg = null;
$syntax = '[mailto:email@example.com|text]';
break;
case 'h1':
case 'h2':
case 'h3':
$label = tra('Heading') . ' ' . $tagName[1];
$iconname = $tagName;
$wysiwyg = null;
$syntax = str_repeat('!', $tagName[1]) . ' text';
break;
case 'titlebar':
$label = tra('Title bar');
$iconname = 'title';
$wysiwyg = null;
$syntax = '-=text=-';
break;
case 'toc':
$label = tra('Table of contents');
$iconname = 'book';
$wysiwyg = 'TOC';
$syntax = '{maketoc}';
break;
default:
return;
}
$tag = new self();
$tag->setLabel($label)
->setWysiwygToken($wysiwyg)
->setIconName(! empty($iconname) ? $iconname : 'help')
->setSyntax($syntax)
->setType('Block');
return $tag;
}
public function getWikiHtml($areaId)
{
if ($this->syntax == '...page...') { // for some reason breaks toolbar when inside nested plugins
return $this->getSelfLink(
'insertAt(\'' . $areaId . '\', \'...\'+\'page\'+\'...\');',
htmlentities($this->label, ENT_QUOTES, 'UTF-8'),
'qt-block'
);
} else {
return $this->getSelfLink(
'insertAt(\'' . $areaId . '\', \'' . addslashes(htmlentities($this->syntax, ENT_COMPAT, 'UTF-8')) . '\', true);',
htmlentities($this->label, ENT_QUOTES, 'UTF-8'),
'qt-block'
);
}
}
}
class ToolbarLineBased extends ToolbarInline // Will change in the future
{
protected $syntax;
public static function fromName($tagName)
{
switch ($tagName) {
case 'list':
$label = tra('Bullet List');
$iconname = 'list';
$wysiwyg = 'BulletedList';
$syntax = '* text';
break;
case 'numlist':
$label = tra('Numbered List');
$iconname = 'list-numbered';
$wysiwyg = 'NumberedList';
$syntax = '# text';
break;
case 'indent':
global $prefs;
return null;
break;
default:
return null;
}
$tag = new self();
$tag->setLabel($label)
->setWysiwygToken($wysiwyg)
->setIconName(! empty($iconname) ? $iconname : 'help')
->setSyntax($syntax)
->setType('LineBased');
return $tag;
}
public function getWikiHtml($areaId)
{
return $this->getSelfLink(
'insertAt(\'' . $areaId . '\', \'' . addslashes(htmlentities($this->syntax, ENT_COMPAT, 'UTF-8')) . '\', true, true);',
htmlentities($this->label, ENT_QUOTES, 'UTF-8'),
'qt-line'
);
}
}
class ToolbarPicker extends Toolbar
{
private $list;
private $name;
public static function fromName($tagName)
{
global $section, $prefs;
$headerlib = TikiLib::lib('header');
$tool_prefs = [];
$styleType = '';
switch ($tagName) {
case 'specialchar':
$wysiwyg = 'SpecialChar';
$label = tra('Special Characters');
$iconname = 'keyboard';
// Line taken from DokuWiki + some added chars for Tiki
$list = explode(' ', 'À à Á á  â à ã Ä ä Ǎ ǎ Ă ă Å å Ā ā Ą ą Æ æ Ć ć Ç ç Č č Ĉ ĉ Ċ ċ Ð đ ð Ď ď È è É é Ê ê Ë ë Ě ě Ē ē Ė ė Ę ę Ģ ģ Ĝ ĝ Ğ ğ Ġ ġ Ĥ ĥ Ì ì Í í Î î Ï ï Ǐ ǐ Ī ī İ ı Į į Ĵ ĵ Ķ ķ Ĺ ĺ Ļ ļ Ľ ľ Ł ł Ŀ ŀ Ń ń Ñ ñ Ņ ņ Ň ň Ò ò Ó ó Ô ô Õ õ Ö ö Ǒ ǒ Ō ō Ő ő Œ œ Ø ø Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ş ş Š š Ŝ ŝ Ţ ţ Ť ť Ù ù Ú ú Û û Ü ü Ǔ ǔ Ŭ ŭ Ū ū Ů ů ǖ ǘ ǚ ǜ Ų ų Ű ű Ŵ ŵ Ý ý Ÿ ÿ Ŷ ŷ Ź ź Ž ž Ż ż Þ þ ß Ħ ħ ¿ ¡ ¢ £ ¤ ¥ € ¦ § ª ¬ ¯ ° ± ÷ ‰ ¼ ½ ¾ ¹ ² ³ µ ¶ † ‡ · • º ∀ ∂ ∃ Ə ə ∅ ∇ ∈ ∉ ∋ ∏ ∑ ‾ − ∗ √ ∝ ∞ ∠ ∧ ∨ ∩ ∪ ∫ ∴ ∼ ≅ ≈ ≠ ≡ ≤ ≥ ⊂ ⊃ ⊄ ⊆ ⊇ ⊕ ⊗ ⊥ ⋅ ◊ ℘ ℑ ℜ ℵ ♠ ♣ ♥ ♦ 𝛼 𝛽 𝛤 𝛾 𝛥 𝛿 𝜀 𝜁 𝛨 𝜂 𝛩 𝜃 𝜄 𝜅 𝛬 𝜆 𝜇 𝜈 𝛯 𝜉 𝛱 𝜋 𝛳 𝜍 𝛴 𝜎 𝜏 𝜐 𝛷 𝜑 Χ 𝜒 𝛹 𝜓 𝛺 𝜔 𝛻 𝜕 ★ ☆ ☎ ☚ ☛ ☜ ☝ ☞ ☟ ☹ ☺ ✔ ✘ × „ “ ” ‚ ‘ ’ « » ‹ › — – … ← ↑ → ↓ ↔ ⇐ ⇑ ⇒ ⇓ ⇔ © ™ ® ′ ″ ^ @ % ~ | [ ] { } * #');
$list = array_combine($list, $list);
break;
case 'smiley':
$wysiwyg = 'Emoji';
$label = tra('Smileys');
$iconname = 'smile';
$rawList = [ 'biggrin', 'confused', 'cool', 'cry', 'eek', 'evil', 'exclaim', 'frown', 'idea', 'lol', 'mad', 'mrgreen', 'neutral', 'question', 'razz', 'redface', 'rolleyes', 'sad', 'smile', 'surprised', 'twisted', 'wink', 'arrow', 'santa' ];
$tool_prefs[] = 'feature_smileys';
$list = [];
foreach ($rawList as $smiley) {
$tra = htmlentities(tra($smiley), ENT_QUOTES, 'UTF-8');
$list["(:$smiley:)"] = '
';
}
break;
case 'color':
$wysiwyg = 'TextColor';
$label = tra('Foreground color');
$iconname = 'font-color';
$rawList = [];
$styleType = 'color';
$hex = ['0', '3', '6', '8', '9', 'C', 'F'];
$count_hex = count($hex);
for ($r = 0; $r < $count_hex; $r += 2) { // red
for ($g = 0; $g < $count_hex; $g += 2) { // green
for ($b = 0; $b < $count_hex; $b += 2) { // blue
$color = $hex[$r] . $hex[$g] . $hex[$b];
$rawList[] = $color;
}
}
}
$list = [];
foreach ($rawList as $color) {
$list["~~#$color:text~~"] = " ";
}
if ($section == 'sheet') {
$list['reset'] = "";
}
break;
case 'bgcolor':
$label = tra('Background Color');
$iconname = 'background-color';
$wysiwyg = 'BGColor';
$styleType = 'background-color';
$rawList = [];
$hex = ['0', '3', '6', '8', '9', 'C', 'F'];
$count_hex = count($hex);
for ($r = 0; $r < $count_hex; $r += 2) { // red
for ($g = 0; $g < $count_hex; $g += 2) { // green
for ($b = 0; $b < $count_hex; $b += 2) { // blue
$color = $hex[$r] . $hex[$g] . $hex[$b];
$rawList[] = $color;
}
}
}
$list = [];
foreach ($rawList as $color) {
$list["~~black,#$color:text~~"] = " ";
}
if ($section == 'sheet') {
$list['reset'] = "";
}
break;
default:
return;
}
$tag = new self();
$tag->setWysiwygToken($wysiwyg)
->setLabel($label)
->setIconName(! empty($iconname) ? $iconname : 'help')
->setList($list)
->setType('Picker')
->setName($tagName)
->setStyleType($styleType);
foreach ($tool_prefs as $pref) {
$tag->addRequiredPreference($pref);
}
global $toolbarPickerIndex;
++$toolbarPickerIndex;
$tag->index = $toolbarPickerIndex;
ToolbarPicker::setupJs();
return $tag;
}
public function setName($name)
{
$this->name = $name;
return $this;
}
public function getWysiwygWikiToken($areaId) // wysiwyg_htmltowiki
{
switch ($this->wysiwyg) {
case 'BGColor':
case 'TextColor':
case 'SpecialChar':
case 'Emoji':
return $this->wysiwyg;
break;
default:
return null;
}
}
public function setList($list)
{
$this->list = $list;
return $this;
}
protected function setSyntax($syntax)
{
$this->syntax = $syntax;
return $this;
}
public function getSyntax($areaId = '$areaId')
{
global $section;
if ($section == 'sheet') {
return 'displayPicker( this, \'' . $this->name . '\', \'' . $areaId . '\', true, \'' . $this->styleType . '\' )'; // is enclosed in double quotes later
} else {
return 'displayPicker( this, \'' . $this->name . '\', \'' . $areaId . '\' )'; // is enclosed in double quotes later
}
}
private static function setupJs()
{
static $pickerAdded = false;
if (! $pickerAdded) {
TikiLib::lib('header')->add_jsfile('lib/jquery_tiki/tiki-toolbars.js');
$pickerAdded = true;
}
}
public function getWikiHtml($areaId)
{
global $prefs;
$headerlib = TikiLib::lib('header');
$headerlib->add_js("if (! window.pickerData) { window.pickerData = {}; } window.pickerData['$this->name'] = " . str_replace('\/', '/', json_encode($this->list)) . ";");
return $this->getSelfLink(
$this->getSyntax($areaId),
htmlentities($this->label, ENT_QUOTES, 'UTF-8'),
'qt-picker'
);
}
protected function setStyleType($type)
{
$this->styleType = $type;
return $this;
}
}
class ToolbarDialog extends Toolbar
{
private $list;
private $index;
private $name;
public static function fromName($tagName)
{
global $prefs;
$tool_prefs = [];
switch ($tagName) {
case 'tikilink':
$label = tra('Wiki Link');
$iconname = 'link';
$icon = tra('img/icons/page_link.png');
$wysiwyg = ''; // cke link dialog now adapted for wiki links
$list = [tra("Wiki Link"),
'',
'',
'',
'',
$prefs['wikiplugin_alink'] == 'y' ? '' : '',
$prefs['wikiplugin_alink'] == 'y' ? '' : '',
$prefs['feature_semantic'] == 'y' ? '' : '',
$prefs['feature_semantic'] == 'y' ? '' : '',
'{"open": function () { dialogInternalLinkOpen(area_id); },
"buttons": { "' . tra("Cancel") . '": function() { dialogSharedClose(area_id,this); },' .
'"' . tra("Insert") . '": function() { dialogInternalLinkInsert(area_id,this); }}}'
];
break;
case 'objectlink':
$types = TikiLib::lib('unifiedsearch')->getSupportedTypes();
$options = '';
foreach ($types as $type => $title) {
$options .= '';
}
$label = tra('Object Link');
$iconname = 'link-external-alt';
$icon = tra('img/icons/page_link.png');
$wysiwyg = '';
$smarty = TikiLib::lib('smarty');
$smarty->loadPlugin('smarty_function_object_selector');
$object_selector = smarty_function_object_selector([
'_id' => 'tbOLinkObjectSelector',
'_class' => 'ui-widget-content ui-corner-all',
// '_format' => '{title}',
'_filter' => ['type' => ''],
'_parent' => 'tbOLinkObjectType',
'_parentkey' => 'type',
], $smarty->getEmptyInternalTemplate());
$list = [tra('Object Link'),
'',
'',
'',
'',
'',
$object_selector,
// '',
'{"open": function () { dialogObjectLinkOpen(area_id); },
"buttons": { "' . tra("Cancel") . '": function() { dialogSharedClose(area_id,this); },' .
'"' . tra("Insert") . '": function() { dialogObjectLinkInsert(area_id,this); }}}'
];
break;
case 'link':
$wysiwyg = 'Link';
$label = tra('External Link');
$iconname = 'link-external';
$icon = tra('img/icons/world_link.png');
$list = [tra('External Link'),
'',
'',
'',
'',
'',
'',
$prefs['cachepages'] == 'y' ? '
' : '',
$prefs['cachepages'] == 'y' ? '' : '',
'{"width": 300, "open": function () { dialogExternalLinkOpen( area_id ) },
"buttons": { "' . tra("Cancel") . '": function() { dialogSharedClose(area_id,this); },' .
'"' . tra("Insert") . '": function() { dialogExternalLinkInsert(area_id,this) }}}'
];
break;
case 'table':
case 'tikitable':
$iconname = 'table';
$icon = tra('img/icons/table.png');
$wysiwyg = 'Table';
$label = tra('Table Builder');
$list = [tra('Table Builder'),
'{"open": function () { dialogTableOpen(area_id,this); },
"width": 320, "buttons": { "' . tra("Cancel") . '": function() { dialogSharedClose(area_id,this); },' .
'"' . tra("Insert") . '": function() { dialogTableInsert(area_id,this); }}}'
];
break;
case 'find':
$icon = tra('img/icons/find.png');
$iconname = 'search';
$wysiwyg = 'Find';
$label = tra('Find Text');
$list = [tra('Find Text'),
'',
'',
'',
'',
'
' . tra("Note: Uses regular expressions") . '
', // TODO add option to not '{"open": function() { dialogFindOpen(area_id); },' . '"buttons": { "' . tra("Close") . '": function() { dialogSharedClose(area_id,this); },' . '"' . tra("Find") . '": function() { dialogFindFind(area_id); }}}' ]; break; case 'replace': $icon = tra('img/icons/text_replace.png'); $iconname = 'repeat'; $wysiwyg = 'Replace'; $label = tra('Text Replace'); $tool_prefs[] = 'feature_wiki_replace'; $list = [tra('Text Replace'), '', '', '', '', '', '', '' . tra("Note: Uses regular expressions") . '
', // TODO add option to not '{"open": function() { dialogReplaceOpen(area_id); },' . '"buttons": { "' . tra("Close") . '": function() { dialogSharedClose(area_id,this); },' . '"' . tra("Replace") . '": function() { dialogReplaceReplace(area_id); }}}' ]; break; default: return; } $tag = new self(); $tag->name = $tagName; $tag->setWysiwygToken($wysiwyg) ->setLabel($label) ->setIconName(! empty($iconname) ? $iconname : 'help') ->setIcon(! empty($icon) ? $icon : 'img/icons/shading.png') ->setList($list) ->setType('Dialog'); foreach ($tool_prefs as $pref) { $tag->addRequiredPreference($pref); } global $toolbarDialogIndex; ++$toolbarDialogIndex; $tag->index = $toolbarDialogIndex; ToolbarDialog::setupJs(); return $tag; } public function setList($list) { $this->list = $list; return $this; } protected function setSyntax($syntax) { $this->syntax = $syntax; return $this; } public function getSyntax($areaId = '$areaId') { return 'displayDialog( this, ' . $this->index . ', \'' . $areaId . '\')'; } public static function setupJs() { TikiLib::lib('header')->add_jsfile('lib/jquery_tiki/tiki-toolbars.js'); } public function getWikiHtml($areaId) { $headerlib = TikiLib::lib('header'); $headerlib->add_js("if (! window.dialogData) { window.dialogData = {}; } window.dialogData[$this->index] = " . json_encode($this->list) . ";", 1 + $this->index); return $this->getSelfLink( $this->getSyntax($areaId), htmlentities($this->label, ENT_QUOTES, 'UTF-8'), 'qt-picker' ); } public function getWysiwygToken($areaId) { if (! empty($this->wysiwyg)) { TikiLib::lib('header')->add_js( "window.dialogData[$this->index] = " . json_encode($this->list) . ";", 1 + $this->index ); $syntax = str_replace('\'' . $areaId . '\'', 'editor.name', $this->getSyntax($areaId)); $this->setupCKEditorTool($syntax, $this->wysiwyg, $this->label, $this->icon); } return $this->wysiwyg; } public function getWysiwygWikiToken($areaId) // wysiwyg_htmltowiki { switch ($this->name) { case 'tikilink': $this->wysiwyg = 'tikilink'; break; case 'objectlink': $this->wysiwyg = 'objectlink'; break; case 'table': $this->wysiwyg = 'tikitable'; break; case 'link': $this->wysiwyg = 'externallink'; break; default: return $this->wysiwyg; } return $this->getWysiwygToken($areaId); } } class ToolbarFullscreen extends Toolbar { public function __construct() { $this->setLabel(tra('Full-screen edit')) ->setIconName('fullscreen') ->setWysiwygToken('Maximize') ->setType('Fullscreen'); } public function getWikiHtml($areaId) { return $this->getSelfLink( 'toggleFullScreen(\'' . $areaId . '\');return false;', htmlentities($this->label, ENT_QUOTES, 'UTF-8'), 'qt-fullscreen' ); } public function getWysiwygWikiToken($areaId) // wysiwyg_htmltowiki { return $this->getWysiwygToken($areaId); } } class ToolbarHelptool extends Toolbar { public function __construct() { $this->setLabel(tra('Wiki Help')) ->setIcon('img/icons/help.png') ->setType('Helptool'); } public function getWikiHtml($areaId) { global $section; $smarty = TikiLib::lib('smarty'); $servicelib = TikiLib::lib('service'); $params = ['controller' => 'edit', 'action' => 'help', 'modal' => 1]; $params['wiki'] = 1; $params['plugins'] = 1; $params['areaId'] = $areaId; if ($GLOBALS['section'] == 'sheet') { $params['sheet'] = 1; } $smarty->loadPlugin('smarty_function_icon'); $icon = smarty_function_icon(['name' => 'help'], $smarty->getEmptyInternalTemplate()); $url = $servicelib->getUrl($params); $help = tra('Help'); return "$icon"; } public function getWysiwygToken($areaId) { global $section; $servicelib = TikiLib::lib('service'); $params = ['controller' => 'edit', 'action' => 'help', 'modal' => 1]; $params['wysiwyg'] = 1; $params['plugins'] = 1; if ($section == 'sheet') { $params['sheet'] = 1; } // multiple ckeditors share the same toolbar commands, so area_id (editor.name) must be added when clicked $params['areaId'] = ''; // this must be last param $this->setLabel(tra('WYSIWYG Help')); $this->setIconName('help'); $name = 'tikihelp'; $js = '$.openModal({show: true, remote: "' . $servicelib->getUrl($params) . '" + editor.name});'; $this->setupCKEditorTool($js, $name, $this->label, $this->icon); return $name; } public function getWysiwygWikiToken($areaId) // wysiwyg_htmltowiki { return $this->getWysiwygToken($areaId); } } class ToolbarFileGallery extends Toolbar { private $name; public function __construct() { $this->setLabel(tra('Choose or upload images')) ->setIconName('image') ->setIcon(tra('img/icons/pictures.png')) ->setWysiwygToken('tikiimage') ->setType('FileGallery') ->addRequiredPreference('feature_filegals_manager'); } public function getSyntax($areaId) { global $prefs; $smarty = TikiLib::lib('smarty'); if ($prefs['fgal_elfinder_feature'] !== 'y' || $prefs['fgal_elfinder_on_toolbar'] !== 'y') { $smarty->loadPlugin('smarty_function_filegal_manager_url'); return 'openFgalsWindow(\'' . htmlentities(smarty_function_filegal_manager_url(['area_id' => $areaId], $smarty->getEmptyInternalTemplate())) . '\', true);'; } else { TikiLib::lib('header')->add_jq_onready( 'window.handleFinderInsertAt = function (file, elfinder, area_id) { $.getJSON($.service("file_finder", "finder"), { cmd: "tikiFileFromHash", hash: file.hash }, function (data) { $(window).data("elFinderDialog").dialog("close"); $($(window).data("elFinderDialog")).remove(); $(window).data("elFinderDialog", null); window.insertAt(area_id, data.wiki_syntax); return false; } ); };' ); $smarty->loadPlugin('smarty_function_ticket'); return ' var area_id = (typeof editor === \'undefined\' ? \'' . $areaId . '\' : editor.name); openElFinderDialog( this, { defaultGalleryId: ' . (empty($prefs['home_file_gallery']) ? $prefs['fgal_root_id'] : $prefs['home_file_gallery']) . ', deepGallerySearch: true, ticket: \'' . smarty_function_ticket(['mode' => 'get'], $smarty) . '\', getFileCallback: function(file,elfinder) { window.handleFinderInsertAt(file,elfinder,area_id); }, eventOrigin:this, uploadCallback: function (data) { if (data.data.added.length === 1 && confirm(tr(\'Do you want to use this file in your page?\'))) { window.handleFinderInsertAt(data.data.added[0],window.elFinder,area_id); } } } );'; } } public function getWikiHtml($areaId) { return $this->getSelfLink($this->getSyntax($areaId), htmlentities($this->label, ENT_QUOTES, 'UTF-8'), 'qt-filegal'); } public function getWysiwygToken($areaId) { if (! empty($this->wysiwyg)) { $this->name = $this->wysiwyg; // temp $exec_js = str_replace('&', '&', $this->getSyntax($areaId)); // odd? $this->setupCKEditorTool($exec_js, $this->name, $this->label, $this->icon); } return $this->wysiwyg; } public function getWysiwygWikiToken($areaId) // wysiwyg_htmltowiki { return $this->getWysiwygToken($areaId); } public function isAccessible() { return parent::isAccessible(); } } class ToolbarFileGalleryFile extends ToolbarFileGallery { public function __construct() { $this->setLabel(tra('Choose or upload files')) ->setIconName('upload') ->setWysiwygToken('tikifile') ->setType('FileGallery') ->addRequiredPreference('feature_filegals_manager'); } public function getSyntax($areaId) { $smarty = TikiLib::lib('smarty'); $smarty->loadPlugin('smarty_function_filegal_manager_url'); return 'openFgalsWindow(\'' . htmlentities(smarty_function_filegal_manager_url(['area_id' => $areaId], $smarty->getEmptyInternalTemplate())) . '&insertion_syntax=file\', true);'; } } class ToolbarSwitchEditor extends Toolbar { private $name; public function __construct() { $this->setLabel(tra('Switch Editor (wiki or WYSIWYG)')) ->setIconName('pencil') ->setIcon(tra('img/icons/pencil_go.png')) ->setWysiwygToken('tikiswitch') ->setType('SwitchEditor') ->addRequiredPreference('feature_wysiwyg'); } public function getWikiHtml($areaId) { return $this->getSelfLink( 'switchEditor(\'wysiwyg\', $(this).parents(\'form\')[0]);', htmlentities($this->label, ENT_QUOTES, 'UTF-8'), 'qt-switcheditor' ); } public function getWysiwygToken($areaId) { global $prefs; if (! empty($this->wysiwyg)) { $this->name = $this->wysiwyg; // temp if ($prefs['feature_wysiwyg'] == 'y' && $prefs['wysiwyg_optional'] == 'y') { $js = "switchEditor('wiki', $('#$areaId').parents('form')[0]);"; $this->setupCKEditorTool($js, $this->name, $this->label, $this->icon); } } return $this->wysiwyg; } public function getWysiwygWikiToken($areaId) // wysiwyg_htmltowiki { return $this->getWysiwygToken($areaId); } public function isAccessible() { global $tiki_p_edit_switch_mode; return parent::isAccessible() && ! isset($_REQUEST['hdr']) && // or in section edit $tiki_p_edit_switch_mode === 'y'; // or no perm (new in 7.1) } /* function getLabel() { return $this->label; } */ } class ToolbarAdmin extends Toolbar { private $name; public function __construct() { $this->setLabel(tra('Admin Toolbars')) ->setIconName('wrench') ->setIcon(tra('img/icons/wrench.png')) ->setWysiwygToken('admintoolbar') ->setType('admintoolbar'); //->addRequiredPreference('feature_wysiwyg'); } public function getWikiHtml($areaId) { return $this->getSelfLink( 'admintoolbar();', htmlentities($this->label, ENT_QUOTES, 'UTF-8'), 'qt-admintoolbar' ); } public function getWysiwygToken($areaId) { global $prefs; if (! empty($this->wysiwyg)) { $this->name = $this->wysiwyg; // temp if ($prefs['feature_wysiwyg'] == 'y') { $js = "admintoolbar();"; $this->setupCKEditorTool($js, $this->name, $this->label, $this->icon); } } return $this->wysiwyg; } public function getWysiwygWikiToken($areaId) // wysiwyg_htmltowiki { return $this->getWysiwygToken($areaId); } } class ToolbarWikiplugin extends Toolbar { private $pluginName; public static function fromName($name) { global $tikilib; $parserlib = TikiLib::lib('parser'); if (substr($name, 0, 11) == 'wikiplugin_') { $name = substr($name, 11); if ($info = $parserlib->plugin_info($name)) { $tag = new self(); $tag->setLabel(str_ireplace('wikiplugin_', '', $info['name'])) ->setWysiwygToken(str_replace(' ', '_', $info['name'])) ->setPluginName($name) ->setType('Wikiplugin'); if (! empty($info['iconname'])) { $tag->setIconName($info['iconname']); } elseif (! empty($info['icon'])) { $tag->setIcon($info['icon']); } else { $tag->setIcon('img/icons/plugin.png'); } TikiLib::lib('header')->add_jsfile('lib/jquery_tiki/tiki-toolbars.js'); return $tag; } } } public function setPluginName($name) { $this->pluginName = $name; return $this; } public function getPluginName() { return $this->pluginName; } public function isAccessible() { global $tikilib; $parserlib = TikiLib::lib('parser'); $dummy_output = ''; return parent::isAccessible() && $parserlib->plugin_enabled($this->pluginName, $dummy_output); } private static function getToken($name) { switch ($name) { case 'flash': return 'Flash'; } } public function getWikiHtml($areaId) { return $this->getSelfLink( 'popupPluginForm(\'' . $areaId . '\',\'' . $this->pluginName . '\')', htmlentities($this->label, ENT_QUOTES, 'UTF-8'), 'qt-plugin' ); } public function getWysiwygToken($areaId, $add_js = true) { if (! empty($this->wysiwyg) && $add_js) { $js = "popupPluginForm(editor.name,'{$this->pluginName}');"; //CKEditor needs image icons so get legacy plugin icons for the toolbar if (! $this->icon && ! empty($this->iconname)) { $iconsetlib = TikiLib::lib('iconset'); $legacy = $iconsetlib->loadFile('themes/base_files/iconsets/legacy.php'); if (array_key_exists($this->iconname, $legacy['icons'])) { $iconinfo = $legacy['icons'][$this->iconname]; } elseif (in_array($this->iconname, $legacy['defaults'])) { $iconinfo['id'] = $this->iconname; } if (isset($iconinfo)) { $prepend = isset($iconinfo['prepend']) ? $iconinfo['prepend'] : 'img/icons/'; $append = isset($iconinfo['append']) ? $iconinfo['append'] : '.png'; $iconpath = $prepend . $iconinfo['id'] . $append; } else { $iconpath = 'img/icons/plugin.png'; } } $this->setupCKEditorTool($js, $this->wysiwyg, $this->label, $iconpath); } return $this->wysiwyg; } public function getWysiwygWikiToken($areaId, $add_js = true) // wysiwyg_htmltowiki { switch ($this->pluginName) { case 'img': $this->wysiwyg = 'wikiplugin_img'; // don't use ckeditor's html image dialog break; default: } return $this->getWysiwygToken($areaId, $add_js); } } class ToolbarSheet extends Toolbar { protected $syntax; public static function fromName($tagName) { switch ($tagName) { case 'sheetsave': $label = tra('Save Sheet'); $iconname = 'floppy'; $syntax = ' $("#saveState").hide(); $.sheet.saveSheet($.sheet.tikiSheet, function() { $.sheet.manageState($.sheet.tikiSheet, true); });'; break; case 'addrow': $label = tra('Add row after selection or to the end if no selection'); $icon = tra('img/icons/sheet_row_add.png'); $syntax = 'sheetInstance.controlFactory.addRow();'; // add row after end to workaround bug in jquery.sheet.js 1.0.2 break; // TODO fix properly for 5.1 case 'addrowmulti': $label = tra('Add multiple rows after selection or to the end if no selection'); $icon = tra('img/icons/sheet_row_add_multi.png'); $syntax = 'sheetInstance.controlFactory.addRowMulti();'; break; case 'addrowbefore': $label = tra('Add row before selection or to end if no selection'); $icon = tra('img/icons/sheet_row_add.png'); $syntax = 'sheetInstance.controlFactory.addRow(null, true);'; // add row after end to workaround bug in jquery.sheet.js 1.0.2 break; case 'deleterow': $label = tra('Delete selected row'); $icon = tra('img/icons/sheet_row_delete.png'); $syntax = 'sheetInstance.deleteRow();'; break; case 'addcolumn': $label = tra('Add column after selection or to the end if no selection'); $icon = tra('img/icons/sheet_col_add.png'); $syntax = 'sheetInstance.controlFactory.addColumn();'; // add col before current or at end if none selected break; case 'deletecolumn': $label = tra('Delete selected column'); $icon = tra('img/icons/sheet_col_delete.png'); $syntax = 'sheetInstance.deleteColumn();'; break; case 'addcolumnmulti': $label = tra('Add multiple columns after selection or to the end if no selection'); $icon = tra('img/icons/sheet_col_add_multi.png'); $syntax = 'sheetInstance.controlFactory.addColumnMulti();'; break; case 'addcolumnbefore': $label = tra('Add column before selection or to the end if no selection'); $icon = tra('img/icons/sheet_col_add.png'); $syntax = 'sheetInstance.controlFactory.addColumn(null, true);'; // add col before current or at end if none selected break; case 'sheetgetrange': $label = tra('Get Cell Range'); $icon = tra('img/icons/sheet_get_range.png'); $syntax = 'sheetInstance.getTdRange(null, sheetInstance.obj.formula().val()); return false;'; break; case 'sheetfind': $label = tra('Find'); $iconname = 'search'; $syntax = 'sheetInstance.cellFind();'; break; case 'sheetrefresh': $label = tra('Refresh calculations'); $iconname = 'refresh'; $syntax = 'sheetInstance.calc();'; break; case 'sheetclose': $label = tra('Finish editing'); $iconname = 'delete'; $syntax = '$.sheet.manageState(sheetInstance.obj.parent(), true);'; // temporary workaround TODO properly break; case 'bold': $label = tra('Bold'); $iconname = 'bold'; $wysiwyg = 'Bold'; $syntax = 'sheetInstance.cellStyleToggle("styleBold");'; break; case 'italic': $label = tra('Italic'); $iconname = 'italic'; $wysiwyg = 'Italic'; $syntax = 'sheetInstance.cellStyleToggle("styleItalics");'; break; case 'underline': $label = tra('Underline'); $iconname = 'underline'; $wysiwyg = 'Underline'; $syntax = 'sheetInstance.cellStyleToggle("styleUnderline");'; break; case 'strike': $label = tra('Strikethrough'); $iconname = 'strikethrough'; $wysiwyg = 'Strike'; $syntax = 'sheetInstance.cellStyleToggle("styleLineThrough");'; break; case 'center': $label = tra('Align Center'); $iconname = 'align-center'; $syntax = 'sheetInstance.cellStyleToggle("styleCenter");'; break; default: return; } $tag = new self(); $tag->setLabel($label) ->setSyntax($syntax) ->setType('Sheet'); if (! empty($iconname)) { $tag->setIconName(! empty($iconname) ? $iconname : 'help'); } if (! empty($icon)) { $tag->setIcon(! empty($icon) ? $icon : 'img/icons/shading.png'); } return $tag; } public function getSyntax($areaId) { return $this->syntax; } protected function setSyntax($syntax) { $this->syntax = $syntax; return $this; } public function getWikiHtml($areaId) { return $this->getSelfLink( addslashes(htmlentities($this->syntax, ENT_COMPAT, 'UTF-8')), htmlentities($this->label, ENT_QUOTES, 'UTF-8'), 'qt-sheet' ); } } class ToolbarsList { private $lines = []; private $wysiwyg = false; private $is_html = false; private function __construct() { } /*** * @param array $params params from smarty_function_toolbars * @param array $tags_to_hide list of tools not to show * @return ToolbarsList */ public static function fromPreference($params, $tags_to_hide = []) { global $tikilib; $global = $tikilib->get_preference('toolbar_global' . ($params['comments'] === 'y' ? '_comments' : '')); $local = $tikilib->get_preference('toolbar_' . $params['section'] . ($params['comments'] === 'y' ? '_comments' : ''), $global); foreach ($tags_to_hide as $name) { $local = str_replace($name, '', $local); } if ($params['section'] === 'wysiwyg_plugin') { // quick fix to prevent nested wysiwyg plugins (messy) $local = str_replace('wikiplugin_wysiwyg', '', $local); } $local = str_replace([',,', '|,', ',|', ',/', '/,'], [',', '|', '|', '/', '/'], $local); return self::fromPreferenceString($local, $params); } public static function fromPreferenceString($string, $params) { global $toolbarPickerIndex; $toolbarPickerIndex = -1; $list = new self(); $list->wysiwyg = (isset($params['_wysiwyg']) && $params['_wysiwyg'] === 'y'); $list->is_html = ! empty($params['_is_html']); $string = preg_replace('/\s+/', '', $string); foreach (explode('/', $string) as $line) { $bits = explode('|', $line); if (count($bits) > 1) { $list->addLine(explode(',', $bits[0]), explode(',', $bits[1])); } else { $list->addLine(explode(',', $bits[0])); } } return $list; } public function addTag($name, $unique = false) { if ($unique && $this->contains($name)) { return false; } $this->lines[count($this->lines) - 1][0][0][] = Toolbar::getTag($name); return true; } public function insertTag($name, $unique = false) { if ($unique && $this->contains($name)) { return false; } array_unshift($this->lines[0][0][0], Toolbar::getTag($name)); return true; } private function addLine(array $tags, array $rtags = []) { $elements = []; $j = count($rtags) > 0 ? 2 : 1; for ($i = 0; $i < $j; $i++) { $group = []; $elements[$i] = []; if ($i == 0) { $thetags = $tags; } else { $thetags = $rtags; } foreach ($thetags as $tagName) { if ($tagName === '-' || $tagName === '|') { if (count($group)) { $elements[$i][] = $group; $group = []; } } else { if ( ( $tag = Toolbar::getTag($tagName, $this->wysiwyg, $this->is_html) ) && $tag->isAccessible() ) { $group[] = $tag; } } } if (count($group)) { $elements[$i][] = $group; } } if (count($elements)) { $this->lines[] = $elements; } } public function getWysiwygArray($areaId, $isHtml = true) { $lines = []; foreach ($this->lines as $line) { $lineOut = []; foreach ($line as $bit) { foreach ($bit as $group) { $group_count = 0; foreach ($group as $tag) { if ($isHtml) { if ($token = $tag->getWysiwygToken($areaId)) { $lineOut[] = $token; $group_count++; } } else { if ($token = $tag->getWysiwygWikiToken($areaId)) { $lineOut[] = $token; $group_count++; } } } if ($group_count) { // don't add separators for empty groups $lineOut[] = '-'; } } } $lineOut = array_slice($lineOut, 0, -1); if (count($lineOut)) { $lines[] = [$lineOut]; } } return $lines; } public function getWikiHtml($areaId, $comments = '') { global $tiki_p_admin, $tiki_p_admin_toolbars, $section, $prefs; $headerlib = TikiLib::lib('header'); $smarty = TikiLib::lib('smarty'); $html = ''; $c = 0; foreach ($this->lines as $line) { $lineHtml = ''; $right = ''; if (count($line) == 1) { $line[1] = []; } // $line[0] is left part, $line[1] right floated section for ($bitx = 0, $bitxcount_line = count($line); $bitx < $bitxcount_line; $bitx++) { $lineBit = ''; /*if ($c == 0 && $bitx == 1 && ($tiki_p_admin == 'y' or $tiki_p_admin_toolbars == 'y')) { $params = array('_script' => 'tiki-admin_toolbars.php', '_onclick' => 'needToConfirm = true;', '_class' => 'toolbar', '_icon' => 'wrench', '_ajax' => 'n'); if (isset($comments) && $comments == 'y') $params['comments'] = 'on'; if (isset($section)) $params['section'] = $section; $content = tra('Admin Toolbars'); $right .= smarty_block_self_link($params, $content, $smarty); }*/ foreach ($line[$bitx] as $group) { $groupHtml = ''; foreach ($group as $tag) { $groupHtml .= $tag->getWikiHtml($areaId); } if (! empty($groupHtml)) { $param = ' class="toolbar-list"'; $lineBit .= "$groupHtml"; } if ($bitx == 1) { if (! empty($right)) { $right = ''; } $lineHtml = "