Added update support for styles (WIP)
[GitHub/WoltLab/WCF.git] / com.woltlab.wcf / templates / wysiwyg.tpl
1 <script data-relocate="true">
2 var __REDACTOR_ICON_PATH = '{@$__wcf->getPath()}icon/';
3 var __REDACTOR_BUTTONS = [ {implode from=$__wcf->getBBCodeHandler()->getButtonBBCodes() item=__bbcode}{ icon: '{$__bbcode->wysiwygIcon}', label: '{$__bbcode->buttonLabel|language}', name: '{$__bbcode->bbcodeTag}' }{/implode} ];
4 var __REDACTOR_SMILIES = { {implode from=$__wcf->getSmileyCache()->getCategorySmilies() item=smiley}'{@$smiley->smileyCode|encodeJS}': '{@$smiley->getURL()|encodeJS}'{/implode} };
5 var __REDACTOR_BBCODES = [ {implode from=$__wcf->getBBCodeHandler()->getBBCodes() item=__bbcode}'{@$__bbcode->bbcodeTag}'{/implode} ];
6 var __REDACTOR_SOURCE_BBCODES = [ {implode from=$__wcf->getBBCodeHandler()->getSourceBBCodes() item=__bbcode}'{@$__bbcode->bbcodeTag}'{/implode} ];
7 var __REDACTOR_CODE_HIGHLIGHTERS = { {implode from=$__wcf->getBBCodeHandler()->getHighlighters() item=__highlighter}'{@$__highlighter}': '{lang}wcf.bbcode.code.{@$__highlighter}.title{/lang}'{/implode} };
8 var __REDACTOR_AMD_DEPENDENCIES = { };
9
10 require(['Language', 'WoltLab/WCF/Bbcode/FromHtml', 'WoltLab/WCF/Bbcode/ToHtml'], function(Language, BbcodeFromHTML, BbcodeToHTML) {
11 __REDACTOR_AMD_DEPENDENCIES = {
12 BbcodeFromHTML: BbcodeFromHTML,
13 BbcodeToHTML: BbcodeToHTML
14 };
15
16 Language.addObject({
17 'wcf.attachment.dragAndDrop.dropHere': '{lang}wcf.attachment.dragAndDrop.dropHere{/lang}',
18 'wcf.attachment.dragAndDrop.dropNow': '{lang}wcf.attachment.dragAndDrop.dropNow{/lang}',
19 'wcf.bbcode.button.fontColor': '{lang}wcf.bbcode.button.fontColor{/lang}',
20 'wcf.bbcode.button.fontFamily': '{lang}wcf.bbcode.button.fontFamily{/lang}',
21 'wcf.bbcode.button.fontSize': '{lang}wcf.bbcode.button.fontSize{/lang}',
22 'wcf.bbcode.button.image': '{lang}wcf.bbcode.button.image{/lang}',
23 'wcf.bbcode.button.redo': '{lang}wcf.bbcode.button.redo{/lang}',
24 'wcf.bbcode.button.subscript': '{lang}wcf.bbcode.button.subscript{/lang}',
25 'wcf.bbcode.button.superscript': '{lang}wcf.bbcode.button.superscript{/lang}',
26 'wcf.bbcode.button.toggleBBCode': '{lang}wcf.bbcode.button.toggleBBCode{/lang}',
27 'wcf.bbcode.button.toggleHTML': '{lang}wcf.bbcode.button.toggleHTML{/lang}',
28 'wcf.bbcode.button.undo': '{lang}wcf.bbcode.button.undo{/lang}',
29 'wcf.bbcode.code': '{lang}wcf.bbcode.code{/lang}',
30 'wcf.bbcode.code.edit': '{lang}wcf.bbcode.code.edit{/lang}',
31 'wcf.bbcode.code.filename': '{lang}wcf.bbcode.code.filename{/lang}',
32 'wcf.bbcode.code.filename.description': '{lang}wcf.bbcode.code.filename.description{/lang}',
33 'wcf.bbcode.code.highlighter': '{lang}wcf.bbcode.code.highlighter{/lang}',
34 'wcf.bbcode.code.highlighter.description': '{lang}wcf.bbcode.code.highlighter.description{/lang}',
35 'wcf.bbcode.code.highlighter.none': '{lang}wcf.bbcode.code.highlighter.none{/lang}',
36 'wcf.bbcode.code.insert': '{lang}wcf.bbcode.code.insert{/lang}',
37 'wcf.bbcode.code.lineNumber': '{lang}wcf.bbcode.code.lineNumber{/lang}',
38 'wcf.bbcode.code.lineNumber.description': '{lang}wcf.bbcode.code.lineNumber.description{/lang}',
39 'wcf.bbcode.code.settings': '{lang}wcf.bbcode.code.settings{/lang}',
40 'wcf.bbcode.image.source': '{lang}wcf.bbcode.image.source{/lang}',
41 'wcf.bbcode.quote.edit': '{lang}wcf.bbcode.quote.edit{/lang}',
42 'wcf.bbcode.quote.edit.author': '{lang}wcf.bbcode.quote.edit.author{/lang}',
43 'wcf.bbcode.quote.edit.link': '{lang}wcf.bbcode.quote.edit.link{/lang}',
44 'wcf.bbcode.quote.insert': '{lang}wcf.bbcode.quote.insert{/lang}',
45 'wcf.bbcode.quote.title.clickToSet': '{lang}wcf.bbcode.quote.title.clickToSet{/lang}',
46 'wcf.bbcode.quote.title.javascript': '{lang}wcf.bbcode.quote.title.javascript{/lang}',
47 'wcf.global.noSelection': '{lang}wcf.global.noSelection{/lang}',
48 'wcf.message.autosave.prompt': '{lang}wcf.message.autosave.prompt{/lang}',
49 'wcf.message.autosave.prompt.confirm': '{lang}wcf.message.autosave.prompt.confirm{/lang}',
50 'wcf.message.autosave.prompt.discard': '{lang}wcf.message.autosave.prompt.discard{/lang}',
51 'wcf.message.autosave.restored': '{lang}wcf.message.autosave.restored{/lang}',
52 'wcf.message.autosave.restored.confirm': '{lang}wcf.message.autosave.restored.confirm{/lang}',
53 'wcf.message.autosave.restored.revert': '{lang}wcf.message.autosave.restored.revert{/lang}',
54 'wcf.message.autosave.restored.revert.confirmMessage': '{lang}wcf.message.autosave.restored.revert.confirmMessage{/lang}',
55 'wcf.message.autosave.restored.version': '{lang __literal=true}wcf.message.autosave.restored.version{/lang}',
56 'wcf.message.autosave.saved': '{lang}wcf.message.autosave.saved{/lang}'
57 });
58
59 var $editorName = '{if $wysiwygSelector|isset}{$wysiwygSelector|encodeJS}{else}text{/if}';
60 var $callbackIdentifier = 'Redactor_' + $editorName;
61
62 WCF.System.Dependency.Manager.setup($callbackIdentifier, function() {
63 var $textarea = $('#' + $editorName);
64 var $buttons = [ ];
65
66 {include file='wysiwygToolbar'}
67
68 var $autosave = $textarea.data('autosave');
69 var $autosaveLastEditTime = ($autosave && $textarea.data('autosaveLastEditTime')) ? (parseInt($textarea.data('autosaveLastEditTime')) || 0) : 0;
70 var $autosavePrompt = ($autosave && $textarea.data('autosavePrompt')) ? true : false;
71 var $config = {
72 autosave: false,
73 buttons: $buttons,
74 convertImageLinks: false,
75 convertUrlLinks: false,
76 convertVideoLinks: false,
77 direction: '{lang}wcf.global.pageDirection{/lang}',
78 lang: '{@$__wcf->getLanguage()->getFixedLanguageCode()}',
79 linebreaks: true,
80 maxHeight: 500,
81 minHeight: 200,
82 plugins: [ 'wutil', 'wautosave', 'wmonkeypatch', 'wbutton', 'wbbcode', 'wfontcolor', 'wfontfamily', 'wfontsize' ],
83 removeEmpty: false,
84 replaceDivs: false,
85 source: true,
86 tabifier: false,
87 toolbarFixed: false,
88 woltlab: {
89 autosave: {
90 active: ($autosave) ? true : false,
91 key: ($autosave) ? '{@$__wcf->getAutosavePrefix()}_' + $autosave : '',
92 lastEditTime: $autosaveLastEditTime,
93 prefix: '{@$__wcf->getAutosavePrefix()}',
94 prompt: $autosavePrompt,
95 saveOnInit: {if !$errorField|empty}true{else}false{/if}
96 },
97 originalValue: $textarea.val()
98 }
99 };
100
101 {if $__wcf->getBBCodeHandler()->isAvailableBBCode('table')}
102 $config.plugins.splice(2, 0, 'table');
103 {/if}
104
105 // TODO: is this still required?
106 if ($.browser.iOS) {
107 // using a zero-width space breaks iOS' detection of the start of a sentence, causing the first word to be lowercased
108 $config.emptyHtml = '<p><br></p>';
109 }
110
111 {if MODULE_ATTACHMENT && !$attachmentHandler|empty && $attachmentHandler->canUpload()}
112 $config.plugins.push('wupload');
113 $config.woltlab.attachmentUrl = '{link controller='Attachment' id=987654321}{/link}';
114 $config.woltlab.attachmentThumbnailUrl = '{link controller='Attachment' id=987654321}thumbnail=1{/link}';
115 {/if}
116
117 {event name='javascriptInit'}
118
119 // clear textarea before init
120 $textarea.val('');
121
122 $textarea.redactor($config);
123 });
124
125 head.load([
126 '{@$__wcf->getPath()}js/3rdParty/redactor/redactor{if !ENABLE_DEBUG_MODE}.min{/if}.js?v={@LAST_UPDATE_TIME}',
127 {if $__wcf->getLanguage()->getFixedLanguageCode() != 'en'}'{@$__wcf->getPath()}js/3rdParty/redactor/languages/{@$__wcf->getLanguage()->getFixedLanguageCode()}.js?v={@LAST_UPDATE_TIME}',{/if}
128 {if !ENABLE_DEBUG_MODE}
129 '{@$__wcf->getPath()}js/3rdParty/redactor/plugins/wcombined.min.js?v={@LAST_UPDATE_TIME}'
130 {else}
131 {* official *}
132 '{@$__wcf->getPath()}js/3rdParty/redactor/plugins/table.js?v={@LAST_UPDATE_TIME}',
133
134 {* WoltLab *}
135 '{@$__wcf->getPath()}js/3rdParty/redactor/plugins/wautosave.js?v={@LAST_UPDATE_TIME}',
136 '{@$__wcf->getPath()}js/3rdParty/redactor/plugins/wbbcode.js?v={@LAST_UPDATE_TIME}',
137 '{@$__wcf->getPath()}js/3rdParty/redactor/plugins/wbutton.js?v={@LAST_UPDATE_TIME}',
138 '{@$__wcf->getPath()}js/3rdParty/redactor/plugins/wfontcolor.js?v={@LAST_UPDATE_TIME}',
139 '{@$__wcf->getPath()}js/3rdParty/redactor/plugins/wfontfamily.js?v={@LAST_UPDATE_TIME}',
140 '{@$__wcf->getPath()}js/3rdParty/redactor/plugins/wfontsize.js?v={@LAST_UPDATE_TIME}',
141 '{@$__wcf->getPath()}js/3rdParty/redactor/plugins/wmonkeypatch.js?v={@LAST_UPDATE_TIME}',
142 '{@$__wcf->getPath()}js/3rdParty/redactor/plugins/wutil.js?v={@LAST_UPDATE_TIME}',
143 '{@$__wcf->getPath()}js/3rdParty/redactor/plugins/wupload.js?v={@LAST_UPDATE_TIME}'
144 {/if}
145 {event name='javascriptFiles'}
146 ], function() {
147 WCF.System.Dependency.Manager.invoke($callbackIdentifier);
148 });
149 });
150 </script>