Fossil SCM
Applied a patch by forum user vor0nwe to allow the WYSIWYG wiki page editor to work in the face of the new CSP restrictions on inline JavaScript. The patch and explicit license for inclusion in Fossil are here: https://fossil-scm.org/forum/forumpost/6985a4754e
Commit
543cdd4770efd184a81e6aa29280f42a5cba2977190dca3adcf436cd3c139cda
Parent
fac3d6b0d46af62…
2 files changed
+1
-1
+63
-41
+1
-1
| --- src/wiki.c | ||
| +++ src/wiki.c | ||
| @@ -611,11 +611,11 @@ | ||
| 611 | 611 | } |
| 612 | 612 | @ <input type="submit" name="preview" value="Preview Your Changes" /> |
| 613 | 613 | }else{ |
| 614 | 614 | /* Wysiwyg editing */ |
| 615 | 615 | Blob html, temp; |
| 616 | - form_begin("onsubmit='wysiwygSubmit()'", "%R/wikiedit"); | |
| 616 | + form_begin("", "%R/wikiedit"); | |
| 617 | 617 | @ <div> |
| 618 | 618 | @ <input type="hidden" name="wysiwyg" value="1" /> |
| 619 | 619 | blob_zero(&temp); |
| 620 | 620 | wiki_convert(&wiki, &temp, 0); |
| 621 | 621 | blob_zero(&html); |
| 622 | 622 |
| --- src/wiki.c | |
| +++ src/wiki.c | |
| @@ -611,11 +611,11 @@ | |
| 611 | } |
| 612 | @ <input type="submit" name="preview" value="Preview Your Changes" /> |
| 613 | }else{ |
| 614 | /* Wysiwyg editing */ |
| 615 | Blob html, temp; |
| 616 | form_begin("onsubmit='wysiwygSubmit()'", "%R/wikiedit"); |
| 617 | @ <div> |
| 618 | @ <input type="hidden" name="wysiwyg" value="1" /> |
| 619 | blob_zero(&temp); |
| 620 | wiki_convert(&wiki, &temp, 0); |
| 621 | blob_zero(&html); |
| 622 |
| --- src/wiki.c | |
| +++ src/wiki.c | |
| @@ -611,11 +611,11 @@ | |
| 611 | } |
| 612 | @ <input type="submit" name="preview" value="Preview Your Changes" /> |
| 613 | }else{ |
| 614 | /* Wysiwyg editing */ |
| 615 | Blob html, temp; |
| 616 | form_begin("", "%R/wikiedit"); |
| 617 | @ <div> |
| 618 | @ <input type="hidden" name="wysiwyg" value="1" /> |
| 619 | blob_zero(&temp); |
| 620 | wiki_convert(&wiki, &temp, 0); |
| 621 | blob_zero(&html); |
| 622 |
+63
-41
| --- src/wysiwyg.c | ||
| +++ src/wysiwyg.c | ||
| @@ -49,17 +49,16 @@ | ||
| 49 | 49 | @ #editMode label { cursor: pointer; } |
| 50 | 50 | @ </style> |
| 51 | 51 | |
| 52 | 52 | @ <input id="wysiwygValue" type="hidden" name="%s(zId)"> |
| 53 | 53 | @ <div id="editModeDiv">Edit mode: |
| 54 | - @ <select id="editMode" size=1 onchange="setDocMode(this.selectedIndex)"> | |
| 54 | + @ <select id="editMode" size=1> | |
| 55 | 55 | @ <option value="0">WYSIWYG</option> |
| 56 | 56 | @ <option value="1">Raw HTML</option> |
| 57 | 57 | @ </select></div> |
| 58 | 58 | @ <div id="toolBar1"> |
| 59 | - @ <select onchange="formatDoc('formatblock',this[this.selectedIndex].value); | |
| 60 | - @ this.selectedIndex=0;"> | |
| 59 | + @ <select class="format" data-format="formatblock"> | |
| 61 | 60 | @ <option selected>- formatting -</option> |
| 62 | 61 | @ <option value="h1">Title 1 <h1></option> |
| 63 | 62 | @ <option value="h2">Title 2 <h2></option> |
| 64 | 63 | @ <option value="h3">Title 3 <h3></option> |
| 65 | 64 | @ <option value="h4">Title 4 <h4></option> |
| @@ -66,52 +65,48 @@ | ||
| 66 | 65 | @ <option value="h5">Title 5 <h5></option> |
| 67 | 66 | @ <option value="h6">Subtitle <h6></option> |
| 68 | 67 | @ <option value="p">Paragraph <p></option> |
| 69 | 68 | @ <option value="pre">Preformatted <pre></option> |
| 70 | 69 | @ </select> |
| 71 | - @ <select onchange="formatDoc('fontname',this[this.selectedIndex].value); | |
| 72 | - @ this.selectedIndex=0;"> | |
| 70 | + @ <select class="format" data-format="fontname"> | |
| 73 | 71 | @ <option class="heading" selected>- font -</option> |
| 74 | 72 | @ <option>Arial</option> |
| 75 | 73 | @ <option>Arial Black</option> |
| 76 | 74 | @ <option>Courier New</option> |
| 77 | 75 | @ <option>Times New Roman</option> |
| 78 | 76 | @ </select> |
| 79 | - @ <select onchange="formatDoc('fontsize',this[this.selectedIndex].value); | |
| 80 | - @ this.selectedIndex=0;"> | |
| 77 | + @ <select class="format" data-format="fontsize"> | |
| 81 | 78 | @ <option class="heading" selected>- size -</option> |
| 82 | 79 | @ <option value="1">Very small</option> |
| 83 | 80 | @ <option value="2">A bit small</option> |
| 84 | 81 | @ <option value="3">Normal</option> |
| 85 | 82 | @ <option value="4">Medium-large</option> |
| 86 | 83 | @ <option value="5">Big</option> |
| 87 | 84 | @ <option value="6">Very big</option> |
| 88 | 85 | @ <option value="7">Maximum</option> |
| 89 | 86 | @ </select> |
| 90 | - @ <select onchange="formatDoc('forecolor',this[this.selectedIndex].value); | |
| 91 | - @ this.selectedIndex=0;"> | |
| 87 | + @ <select class="format" data-format="forecolor"> | |
| 92 | 88 | @ <option class="heading" selected>- color -</option> |
| 93 | 89 | @ <option value="red">Red</option> |
| 94 | 90 | @ <option value="blue">Blue</option> |
| 95 | 91 | @ <option value="green">Green</option> |
| 96 | 92 | @ <option value="black">Black</option> |
| 97 | 93 | @ </select> |
| 98 | 94 | @ </div> |
| 99 | 95 | @ <div id="toolBar2"> |
| 100 | - @ <img class="intLink" title="Undo" onclick="formatDoc('undo');" | |
| 96 | + @ <img class="intLink" title="Undo" data-format="undo" | |
| 101 | 97 | @ src="data:image/gif;base64,R0lGODlhFgAWAOMKADljwliE33mOrpGjuYKl8aezxqPD+7 |
| 102 | 98 | @ /I19DV3NHa7P///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARR8MlJq704680 |
| 103 | 99 | @ 7TkaYeJJBnES4EeUJvIGapWYAC0CsocQ7SDlWJkAkCA6ToMYWIARGQF3mRQVIEjkkSVLIbSfE |
| 104 | 100 | @ whdRIH4fh/DZMICe3/C4nBQBADs="> |
| 105 | 101 | |
| 106 | - @ <img class="intLink" title="Redo" onclick="formatDoc('redo');" | |
| 102 | + @ <img class="intLink" title="Redo" data-format="redo" | |
| 107 | 103 | @ src="data:image/gif;base64,R0lGODlhFgAWAMIHAB1ChDljwl9vj1iE34Kl8aPD+7/I1/ |
| 108 | 104 | @ ///yH5BAEKAAcALAAAAAAWABYAAANKeLrc/jDKSesyphi7SiEgsVXZEATDICqBVJjpqWZt9Na |
| 109 | 105 | @ EDNbQK1wCQsxlYnxMAImhyDoFAElJasRRvAZVRqqQXUy7Cgx4TC6bswkAOw=="> |
| 110 | 106 | |
| 111 | - @ <img class="intLink" title="Remove formatting" | |
| 112 | - @ onclick="formatDoc('removeFormat')" | |
| 107 | + @ <img class="intLink" title="Remove formatting" data-format="removeFormat" | |
| 113 | 108 | @ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AA |
| 114 | 109 | @ AABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwA |
| 115 | 110 | @ AAAd0SU1FB9oECQMCKPI8CIIAAAAIdEVYdENvbW1lbnQA9syWvwAAAuhJREFUOMtjYBgFxAB5 |
| 116 | 111 | @ 01ZWBvVaL2nHnlmk6mXCJbF69zU+Hz/9fB5O1lx+bg45qhl8/fYr5it3XrP/YWTUvvvk3VeqG |
| 117 | 112 | @ Xz70TvbJy8+Wv39+2/Hz19/mGwjZzuTYjALuoBv9jImaXHeyD3H7kU8fPj2ICML8z92dlbtMz |
| @@ -126,98 +121,87 @@ | ||
| 126 | 121 | @ b/mZm0JcT5Lj+89+Ybm6zz95oMh7s4XbygN3Sluq4Mj5K8iKMgP4f0////fv77//8nLy+7MCc |
| 127 | 122 | @ XmyYDAwODS9jM9tcvPypd35pne3ljdjvj26+H2dhYpuENikgfvQeXNmSl3tqepxXsqhXPyc66 |
| 128 | 123 | @ 6s+fv1fMdKR3TK72zpix8nTc7bdfhfkEeVbC9KhbK/9iYWHiErbu6MWbY/7//8/4//9/pgOnH |
| 129 | 124 | @ 6jGVazvFDRtq2VgiBIZrUTIBgCk+ivHvuEKwAAAAABJRU5ErkJggg=="> |
| 130 | 125 | |
| 131 | - @ <img class="intLink" title="Bold" onclick="formatDoc('bold');" | |
| 126 | + @ <img class="intLink" title="Bold" data-format="bold" | |
| 132 | 127 | @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB |
| 133 | 128 | @ YAQAInhI+pa+H9mJy0LhdgtrxzDG5WGFVk6aXqyk6Y9kXvKKNuLbb6zgMFADs=" /> |
| 134 | 129 | |
| 135 | - @ <img class="intLink" title="Italic" onclick="formatDoc('italic');" | |
| 130 | + @ <img class="intLink" title="Italic" data-format="italic" | |
| 136 | 131 | @ src="data:image/gif;base64,R0lGODlhFgAWAKEDAAAAAF9vj5WIbf///yH5BAEAAAMALA |
| 137 | 132 | @ AAAAAWABYAAAIjnI+py+0Po5x0gXvruEKHrF2BB1YiCWgbMFIYpsbyTNd2UwAAOw==" /> |
| 138 | 133 | |
| 139 | - @ <img class="intLink" title="Underline" onclick="formatDoc('underline');" | |
| 134 | + @ <img class="intLink" title="Underline" data-format="underline" | |
| 140 | 135 | @ src="data:image/gif;base64,R0lGODlhFgAWAKECAAAAAF9vj////////yH5BAEAAAIALA |
| 141 | 136 | @ AAAAAWABYAAAIrlI+py+0Po5zUgAsEzvEeL4Ea15EiJJ5PSqJmuwKBEKgxVuXWtun+DwxCCgA |
| 142 | 137 | @ 7" /> |
| 143 | 138 | |
| 144 | - @ <img class="intLink" title="Left align" | |
| 145 | - @ onclick="formatDoc('justifyleft');" | |
| 139 | + @ <img class="intLink" title="Left align" data-format="justifyleft" | |
| 146 | 140 | @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB |
| 147 | 141 | @ YAQAIghI+py+0Po5y02ouz3jL4D4JMGELkGYxo+qzl4nKyXAAAOw==" /> |
| 148 | 142 | |
| 149 | - @ <img class="intLink" title="Center align" | |
| 150 | - @ onclick="formatDoc('justifycenter');" | |
| 143 | + @ <img class="intLink" title="Center align" data-format="justifycenter" | |
| 151 | 144 | @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB |
| 152 | 145 | @ YAQAIfhI+py+0Po5y02ouz3jL4D4JOGI7kaZ5Bqn4sycVbAQA7" /> |
| 153 | 146 | |
| 154 | - @ <img class="intLink" title="Right align" | |
| 155 | - @ onclick="formatDoc('justifyright');" | |
| 147 | + @ <img class="intLink" title="Right align" data-format="justifyright" | |
| 156 | 148 | @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB |
| 157 | 149 | @ YAQAIghI+py+0Po5y02ouz3jL4D4JQGDLkGYxouqzl43JyVgAAOw==" /> |
| 158 | 150 | @ <img class="intLink" title="Numbered list" |
| 159 | - @ onclick="formatDoc('insertorderedlist');" | |
| 151 | + @ data-format="insertorderedlist" | |
| 160 | 152 | @ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAADljwliE35GjuaezxtHa7P//// |
| 161 | 153 | @ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKSespwjoRFvggCBUBoTFBeq6QIAysQnRHaEO |
| 162 | 154 | @ zyaZ07Lu9lUBnC0UGQU1K52s6n5oEADs=" /> |
| 163 | 155 | |
| 164 | - @ <img class="intLink" title="Dotted list" | |
| 165 | - @ onclick="formatDoc('insertunorderedlist');" | |
| 156 | + @ <img class="intLink" title="Dotted list" | |
| 157 | + @ data-format="insertunorderedlist" | |
| 166 | 158 | @ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAAB1ChF9vj1iE33mOrqezxv//// |
| 167 | 159 | @ ///yH5BAEAAAcALAAAAAAWABYAAAMyeLrc/jDKSesppNhGRlBAKIZRERBbqm6YtnbfMY7lud6 |
| 168 | 160 | @ 4UwiuKnigGQliQuWOyKQykgAAOw==" /> |
| 169 | 161 | |
| 170 | - @ <img class="intLink" title="Quote" | |
| 171 | - @ onclick="formatDoc('formatblock','blockquote');" | |
| 162 | + @ <img class="intLink" title="Quote" data-format="formatblock" | |
| 172 | 163 | @ src="data:image/gif;base64,R0lGODlhFgAWAIQXAC1NqjFRjkBgmT9nqUJnsk9xrFJ7u2 |
| 173 | 164 | @ R9qmKBt1iGzHmOrm6Sz4OXw3Odz4Cl2ZSnw6KxyqO306K63bG70bTB0rDI3bvI4P///////// |
| 174 | 165 | @ //////////////////////////yH5BAEKAB8ALAAAAAAWABYAAAVP4CeOZGmeaKqubEs2Cekk |
| 175 | 166 | @ ErvEI1zZuOgYFlakECEZFi0GgTGKEBATFmJAVXweVOoKEQgABB9IQDCmrLpjETrQQlhHjINrT |
| 176 | 167 | @ q/b7/i8fp8PAQA7" /> |
| 177 | 168 | |
| 178 | - @ <img class="intLink" title="Delete indentation" | |
| 179 | - @ onclick="formatDoc('outdent');" | |
| 169 | + @ <img class="intLink" title="Delete indentation" data-format="outdent" | |
| 180 | 170 | @ src="data:image/gif;base64,R0lGODlhFgAWAMIHAAAAADljwliE35GjuaezxtDV3NHa7P |
| 181 | 171 | @ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKCQG9F2i7u8agQgyK1z2EIBil+TWqEMxhMcz |
| 182 | 172 | @ sYVJ3e4ahk+sFnAgtxSQDqWw6n5cEADs=" /> |
| 183 | 173 | |
| 184 | - @ <img class="intLink" title="Add indentation" | |
| 185 | - @ onclick="formatDoc('indent');" | |
| 174 | + @ <img class="intLink" title="Add indentation" data-format="indent" | |
| 186 | 175 | @ src="data:image/gif;base64,R0lGODlhFgAWAOMIAAAAADljwl9vj1iE35GjuaezxtDV3N |
| 187 | 176 | @ Ha7P///////////////////////////////yH5BAEAAAgALAAAAAAWABYAAAQ7EMlJq704650 |
| 188 | 177 | @ B/x8gemMpgugwHJNZXodKsO5oqUOgo5KhBwWESyMQsCRDHu9VOyk5TM9zSpFSr9gsJwIAOw=="> |
| 189 | 178 | |
| 190 | - @ <img class="intLink" title="Hyperlink" | |
| 191 | - @ onclick="var sLnk=prompt('Target URL:',''); | |
| 192 | - @ if(sLnk&&sLnk!=''){formatDoc('createlink',sLnk)}" | |
| 179 | + @ <img class="intLink" title="Hyperlink" data-format="createlink" | |
| 193 | 180 | @ src="data:image/gif;base64,R0lGODlhFgAWAOMKAB1ChDRLY19vj3mOrpGjuaezxrCztb |
| 194 | 181 | @ /I19Ha7Pv8/f///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARY8MlJq704682 |
| 195 | 182 | @ 7/2BYIQVhHg9pEgVGIklyDEUBy/RlE4FQF4dCj2AQXAiJQDCWQCAEBwIioEMQBgSAFhDAGghG |
| 196 | 183 | @ i9XgHAhMNoSZgJkJei33UESv2+/4vD4TAQA7" /> |
| 197 | 184 | |
| 198 | 185 | #if 0 /* Cut/Copy/Paste requires special browser permissions for security |
| 199 | 186 | ** reasons. So omit these buttons */ |
| 200 | - @ <img class="intLink" title="Cut" | |
| 201 | - @ onclick="formatDoc('cut');" | |
| 187 | + @ <img class="intLink" title="Cut" data-format="cut" | |
| 202 | 188 | @ src="data:image/gif;base64,R0lGODlhFgAWAIQSAB1ChBFNsRJTySJYwjljwkxwl19vj1 |
| 203 | 189 | @ dusYODhl6MnHmOrpqbmpGjuaezxrCztcDCxL/I18rL1P///////////////////////////// |
| 204 | 190 | @ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAVu4CeOZGmeaKqubDs6TNnE |
| 205 | 191 | @ bGNApNG0kbGMi5trwcA9GArXh+FAfBAw5UexUDAQESkRsfhJPwaH4YsEGAAJGisRGAQY7UCC9 |
| 206 | 192 | @ ZAXBB+74LGCRxIEHwAHdWooDgGJcwpxDisQBQRjIgkDCVlfmZqbmiEAOw==" /> |
| 207 | 193 | |
| 208 | - @ <img class="intLink" title="Copy" | |
| 209 | - @ onclick="formatDoc('copy');" | |
| 194 | + @ <img class="intLink" title="Copy" data-format="copy" | |
| 210 | 195 | @ src="data:image/gif;base64,R0lGODlhFgAWAIQcAB1ChBFNsTRLYyJYwjljwl9vj1iE31 |
| 211 | 196 | @ iGzF6MnHWX9HOdz5GjuYCl2YKl8ZOt4qezxqK63aK/9KPD+7DI3b/I17LM/MrL1MLY9NHa7OP |
| 212 | 197 | @ s++bx/Pv8/f///////////////yH5BAEAAB8ALAAAAAAWABYAAAWG4CeOZGmeaKqubOum1SQ/ |
| 213 | 198 | @ kPVOW749BeVSus2CgrCxHptLBbOQxCSNCCaF1GUqwQbBd0JGJAyGJJiobE+LnCaDcXAaEoxhQ |
| 214 | 199 | @ ACgNw0FQx9kP+wmaRgYFBQNeAoGihCAJQsCkJAKOhgXEw8BLQYciooHf5o7EA+kC40qBKkAAA |
| 215 | 200 | @ Grpy+wsbKzIiEAOw==" /> |
| 216 | 201 | |
| 217 | - @ <img class="intLink" title="Paste" | |
| 218 | - @ onclick="formatDoc('paste');" | |
| 202 | + @ <img class="intLink" title="Paste" data-format="paste" | |
| 219 | 203 | @ src="data:image/gif;base64,R0lGODlhFgAWAIQUAD04KTRLY2tXQF9vj414WZWIbXmOrp |
| 220 | 204 | @ qbmpGjudClFaezxsa0cb/I1+3YitHa7PrkIPHvbuPs+/fvrvv8/f///////////////////// |
| 221 | 205 | @ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAWN4CeOZGmeaKqubGsusPvB |
| 222 | 206 | @ SyFJjVDs6nJLB0khR4AkBCmfsCGBQAoCwjF5gwquVykSFbwZE+AwIBV0GhFog2EwIDchjwRiQ |
| 223 | 207 | @ o9E2Fx4XD5R+B0DDAEnBXBhBhN2DgwDAQFjJYVhCQYRfgoIDGiQJAWTCQMRiwwMfgicnVcAAA |
| @@ -224,20 +208,58 @@ | ||
| 224 | 208 | @ MOaK+bLAOrtLUyt7i5uiUhADs=" /> |
| 225 | 209 | #endif |
| 226 | 210 | |
| 227 | 211 | @ </div> |
| 228 | 212 | @ <div id="wysiwygBox" |
| 229 | - @ style="resize:both; overflow:auto; width: %d(w)em; height: %d(h)em;" | |
| 213 | + @ style="resize:both;overflow:auto;width:95%%;min-height:%d(h)em;" | |
| 230 | 214 | @ contenteditable="true">%s(zContent)</div> |
| 231 | 215 | @ <script nonce="%h(style_nonce())"> |
| 232 | 216 | @ var oDoc; |
| 233 | 217 | @ |
| 234 | 218 | @ /* Initialize the document editor */ |
| 235 | 219 | @ function initDoc() { |
| 220 | + @ initEventHandlers(); | |
| 236 | 221 | @ oDoc = document.getElementById("wysiwygBox"); |
| 237 | 222 | @ if (!isWysiwyg()) { setDocMode(true); } |
| 238 | 223 | @ } |
| 224 | + @ | |
| 225 | + @ function initEventHandlers() { | |
| 226 | + @ document.querySelector('form').onsubmit = wysiwygSubmit; | |
| 227 | + @ document.querySelector('#editMode').onchange = function() { | |
| 228 | + @ setDocMode(this.selectedIndex) | |
| 229 | + @ }; | |
| 230 | + @ var controls = document.querySelectorAll('select.format'); | |
| 231 | + @ for(var i = 0; i < controls.length; i++) { | |
| 232 | + @ controls[i].onchange = handleDropDown; | |
| 233 | + @ } | |
| 234 | + @ controls = document.querySelectorAll('.intLink'); | |
| 235 | + @ for(i = 0; i < controls.length; i++) { | |
| 236 | + @ controls[i].onclick = handleFormatButton; | |
| 237 | + @ } | |
| 238 | + @ | |
| 239 | + @ function handleDropDown() { | |
| 240 | + @ formatDoc(this.dataset.format,this[this.selectedIndex].value); | |
| 241 | + @ this.selectedIndex = 0; | |
| 242 | + @ } | |
| 243 | + @ | |
| 244 | + @ function handleFormatButton() { | |
| 245 | + @ var extra; | |
| 246 | + @ switch (this.dataset.format) { | |
| 247 | + @ case 'createlink': | |
| 248 | + @ var sLnk = prompt('Target URL:',''); | |
| 249 | + @ if(sLnk && sLnk != '') | |
| 250 | + @ { | |
| 251 | + @ extra = sLnk; | |
| 252 | + @ } | |
| 253 | + @ break; | |
| 254 | + @ case 'formatblock': | |
| 255 | + @ extra = 'blockquote'; | |
| 256 | + @ break; | |
| 257 | + @ } | |
| 258 | + @ formatDoc(this.dataset.format, extra); | |
| 259 | + @ } | |
| 260 | + @ } | |
| 239 | 261 | @ |
| 240 | 262 | @ /* Return true if the document editor is in WYSIWYG mode. Return |
| 241 | 263 | @ ** false if it is in Markup mode */ |
| 242 | 264 | @ function isWysiwyg() { |
| 243 | 265 | @ return document.getElementById("editMode").selectedIndex==0; |
| 244 | 266 |
| --- src/wysiwyg.c | |
| +++ src/wysiwyg.c | |
| @@ -49,17 +49,16 @@ | |
| 49 | @ #editMode label { cursor: pointer; } |
| 50 | @ </style> |
| 51 | |
| 52 | @ <input id="wysiwygValue" type="hidden" name="%s(zId)"> |
| 53 | @ <div id="editModeDiv">Edit mode: |
| 54 | @ <select id="editMode" size=1 onchange="setDocMode(this.selectedIndex)"> |
| 55 | @ <option value="0">WYSIWYG</option> |
| 56 | @ <option value="1">Raw HTML</option> |
| 57 | @ </select></div> |
| 58 | @ <div id="toolBar1"> |
| 59 | @ <select onchange="formatDoc('formatblock',this[this.selectedIndex].value); |
| 60 | @ this.selectedIndex=0;"> |
| 61 | @ <option selected>- formatting -</option> |
| 62 | @ <option value="h1">Title 1 <h1></option> |
| 63 | @ <option value="h2">Title 2 <h2></option> |
| 64 | @ <option value="h3">Title 3 <h3></option> |
| 65 | @ <option value="h4">Title 4 <h4></option> |
| @@ -66,52 +65,48 @@ | |
| 66 | @ <option value="h5">Title 5 <h5></option> |
| 67 | @ <option value="h6">Subtitle <h6></option> |
| 68 | @ <option value="p">Paragraph <p></option> |
| 69 | @ <option value="pre">Preformatted <pre></option> |
| 70 | @ </select> |
| 71 | @ <select onchange="formatDoc('fontname',this[this.selectedIndex].value); |
| 72 | @ this.selectedIndex=0;"> |
| 73 | @ <option class="heading" selected>- font -</option> |
| 74 | @ <option>Arial</option> |
| 75 | @ <option>Arial Black</option> |
| 76 | @ <option>Courier New</option> |
| 77 | @ <option>Times New Roman</option> |
| 78 | @ </select> |
| 79 | @ <select onchange="formatDoc('fontsize',this[this.selectedIndex].value); |
| 80 | @ this.selectedIndex=0;"> |
| 81 | @ <option class="heading" selected>- size -</option> |
| 82 | @ <option value="1">Very small</option> |
| 83 | @ <option value="2">A bit small</option> |
| 84 | @ <option value="3">Normal</option> |
| 85 | @ <option value="4">Medium-large</option> |
| 86 | @ <option value="5">Big</option> |
| 87 | @ <option value="6">Very big</option> |
| 88 | @ <option value="7">Maximum</option> |
| 89 | @ </select> |
| 90 | @ <select onchange="formatDoc('forecolor',this[this.selectedIndex].value); |
| 91 | @ this.selectedIndex=0;"> |
| 92 | @ <option class="heading" selected>- color -</option> |
| 93 | @ <option value="red">Red</option> |
| 94 | @ <option value="blue">Blue</option> |
| 95 | @ <option value="green">Green</option> |
| 96 | @ <option value="black">Black</option> |
| 97 | @ </select> |
| 98 | @ </div> |
| 99 | @ <div id="toolBar2"> |
| 100 | @ <img class="intLink" title="Undo" onclick="formatDoc('undo');" |
| 101 | @ src="data:image/gif;base64,R0lGODlhFgAWAOMKADljwliE33mOrpGjuYKl8aezxqPD+7 |
| 102 | @ /I19DV3NHa7P///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARR8MlJq704680 |
| 103 | @ 7TkaYeJJBnES4EeUJvIGapWYAC0CsocQ7SDlWJkAkCA6ToMYWIARGQF3mRQVIEjkkSVLIbSfE |
| 104 | @ whdRIH4fh/DZMICe3/C4nBQBADs="> |
| 105 | |
| 106 | @ <img class="intLink" title="Redo" onclick="formatDoc('redo');" |
| 107 | @ src="data:image/gif;base64,R0lGODlhFgAWAMIHAB1ChDljwl9vj1iE34Kl8aPD+7/I1/ |
| 108 | @ ///yH5BAEKAAcALAAAAAAWABYAAANKeLrc/jDKSesyphi7SiEgsVXZEATDICqBVJjpqWZt9Na |
| 109 | @ EDNbQK1wCQsxlYnxMAImhyDoFAElJasRRvAZVRqqQXUy7Cgx4TC6bswkAOw=="> |
| 110 | |
| 111 | @ <img class="intLink" title="Remove formatting" |
| 112 | @ onclick="formatDoc('removeFormat')" |
| 113 | @ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AA |
| 114 | @ AABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwA |
| 115 | @ AAAd0SU1FB9oECQMCKPI8CIIAAAAIdEVYdENvbW1lbnQA9syWvwAAAuhJREFUOMtjYBgFxAB5 |
| 116 | @ 01ZWBvVaL2nHnlmk6mXCJbF69zU+Hz/9fB5O1lx+bg45qhl8/fYr5it3XrP/YWTUvvvk3VeqG |
| 117 | @ Xz70TvbJy8+Wv39+2/Hz19/mGwjZzuTYjALuoBv9jImaXHeyD3H7kU8fPj2ICML8z92dlbtMz |
| @@ -126,98 +121,87 @@ | |
| 126 | @ b/mZm0JcT5Lj+89+Ybm6zz95oMh7s4XbygN3Sluq4Mj5K8iKMgP4f0////fv77//8nLy+7MCc |
| 127 | @ XmyYDAwODS9jM9tcvPypd35pne3ljdjvj26+H2dhYpuENikgfvQeXNmSl3tqepxXsqhXPyc66 |
| 128 | @ 6s+fv1fMdKR3TK72zpix8nTc7bdfhfkEeVbC9KhbK/9iYWHiErbu6MWbY/7//8/4//9/pgOnH |
| 129 | @ 6jGVazvFDRtq2VgiBIZrUTIBgCk+ivHvuEKwAAAAABJRU5ErkJggg=="> |
| 130 | |
| 131 | @ <img class="intLink" title="Bold" onclick="formatDoc('bold');" |
| 132 | @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB |
| 133 | @ YAQAInhI+pa+H9mJy0LhdgtrxzDG5WGFVk6aXqyk6Y9kXvKKNuLbb6zgMFADs=" /> |
| 134 | |
| 135 | @ <img class="intLink" title="Italic" onclick="formatDoc('italic');" |
| 136 | @ src="data:image/gif;base64,R0lGODlhFgAWAKEDAAAAAF9vj5WIbf///yH5BAEAAAMALA |
| 137 | @ AAAAAWABYAAAIjnI+py+0Po5x0gXvruEKHrF2BB1YiCWgbMFIYpsbyTNd2UwAAOw==" /> |
| 138 | |
| 139 | @ <img class="intLink" title="Underline" onclick="formatDoc('underline');" |
| 140 | @ src="data:image/gif;base64,R0lGODlhFgAWAKECAAAAAF9vj////////yH5BAEAAAIALA |
| 141 | @ AAAAAWABYAAAIrlI+py+0Po5zUgAsEzvEeL4Ea15EiJJ5PSqJmuwKBEKgxVuXWtun+DwxCCgA |
| 142 | @ 7" /> |
| 143 | |
| 144 | @ <img class="intLink" title="Left align" |
| 145 | @ onclick="formatDoc('justifyleft');" |
| 146 | @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB |
| 147 | @ YAQAIghI+py+0Po5y02ouz3jL4D4JMGELkGYxo+qzl4nKyXAAAOw==" /> |
| 148 | |
| 149 | @ <img class="intLink" title="Center align" |
| 150 | @ onclick="formatDoc('justifycenter');" |
| 151 | @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB |
| 152 | @ YAQAIfhI+py+0Po5y02ouz3jL4D4JOGI7kaZ5Bqn4sycVbAQA7" /> |
| 153 | |
| 154 | @ <img class="intLink" title="Right align" |
| 155 | @ onclick="formatDoc('justifyright');" |
| 156 | @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB |
| 157 | @ YAQAIghI+py+0Po5y02ouz3jL4D4JQGDLkGYxouqzl43JyVgAAOw==" /> |
| 158 | @ <img class="intLink" title="Numbered list" |
| 159 | @ onclick="formatDoc('insertorderedlist');" |
| 160 | @ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAADljwliE35GjuaezxtHa7P//// |
| 161 | @ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKSespwjoRFvggCBUBoTFBeq6QIAysQnRHaEO |
| 162 | @ zyaZ07Lu9lUBnC0UGQU1K52s6n5oEADs=" /> |
| 163 | |
| 164 | @ <img class="intLink" title="Dotted list" |
| 165 | @ onclick="formatDoc('insertunorderedlist');" |
| 166 | @ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAAB1ChF9vj1iE33mOrqezxv//// |
| 167 | @ ///yH5BAEAAAcALAAAAAAWABYAAAMyeLrc/jDKSesppNhGRlBAKIZRERBbqm6YtnbfMY7lud6 |
| 168 | @ 4UwiuKnigGQliQuWOyKQykgAAOw==" /> |
| 169 | |
| 170 | @ <img class="intLink" title="Quote" |
| 171 | @ onclick="formatDoc('formatblock','blockquote');" |
| 172 | @ src="data:image/gif;base64,R0lGODlhFgAWAIQXAC1NqjFRjkBgmT9nqUJnsk9xrFJ7u2 |
| 173 | @ R9qmKBt1iGzHmOrm6Sz4OXw3Odz4Cl2ZSnw6KxyqO306K63bG70bTB0rDI3bvI4P///////// |
| 174 | @ //////////////////////////yH5BAEKAB8ALAAAAAAWABYAAAVP4CeOZGmeaKqubEs2Cekk |
| 175 | @ ErvEI1zZuOgYFlakECEZFi0GgTGKEBATFmJAVXweVOoKEQgABB9IQDCmrLpjETrQQlhHjINrT |
| 176 | @ q/b7/i8fp8PAQA7" /> |
| 177 | |
| 178 | @ <img class="intLink" title="Delete indentation" |
| 179 | @ onclick="formatDoc('outdent');" |
| 180 | @ src="data:image/gif;base64,R0lGODlhFgAWAMIHAAAAADljwliE35GjuaezxtDV3NHa7P |
| 181 | @ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKCQG9F2i7u8agQgyK1z2EIBil+TWqEMxhMcz |
| 182 | @ sYVJ3e4ahk+sFnAgtxSQDqWw6n5cEADs=" /> |
| 183 | |
| 184 | @ <img class="intLink" title="Add indentation" |
| 185 | @ onclick="formatDoc('indent');" |
| 186 | @ src="data:image/gif;base64,R0lGODlhFgAWAOMIAAAAADljwl9vj1iE35GjuaezxtDV3N |
| 187 | @ Ha7P///////////////////////////////yH5BAEAAAgALAAAAAAWABYAAAQ7EMlJq704650 |
| 188 | @ B/x8gemMpgugwHJNZXodKsO5oqUOgo5KhBwWESyMQsCRDHu9VOyk5TM9zSpFSr9gsJwIAOw=="> |
| 189 | |
| 190 | @ <img class="intLink" title="Hyperlink" |
| 191 | @ onclick="var sLnk=prompt('Target URL:',''); |
| 192 | @ if(sLnk&&sLnk!=''){formatDoc('createlink',sLnk)}" |
| 193 | @ src="data:image/gif;base64,R0lGODlhFgAWAOMKAB1ChDRLY19vj3mOrpGjuaezxrCztb |
| 194 | @ /I19Ha7Pv8/f///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARY8MlJq704682 |
| 195 | @ 7/2BYIQVhHg9pEgVGIklyDEUBy/RlE4FQF4dCj2AQXAiJQDCWQCAEBwIioEMQBgSAFhDAGghG |
| 196 | @ i9XgHAhMNoSZgJkJei33UESv2+/4vD4TAQA7" /> |
| 197 | |
| 198 | #if 0 /* Cut/Copy/Paste requires special browser permissions for security |
| 199 | ** reasons. So omit these buttons */ |
| 200 | @ <img class="intLink" title="Cut" |
| 201 | @ onclick="formatDoc('cut');" |
| 202 | @ src="data:image/gif;base64,R0lGODlhFgAWAIQSAB1ChBFNsRJTySJYwjljwkxwl19vj1 |
| 203 | @ dusYODhl6MnHmOrpqbmpGjuaezxrCztcDCxL/I18rL1P///////////////////////////// |
| 204 | @ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAVu4CeOZGmeaKqubDs6TNnE |
| 205 | @ bGNApNG0kbGMi5trwcA9GArXh+FAfBAw5UexUDAQESkRsfhJPwaH4YsEGAAJGisRGAQY7UCC9 |
| 206 | @ ZAXBB+74LGCRxIEHwAHdWooDgGJcwpxDisQBQRjIgkDCVlfmZqbmiEAOw==" /> |
| 207 | |
| 208 | @ <img class="intLink" title="Copy" |
| 209 | @ onclick="formatDoc('copy');" |
| 210 | @ src="data:image/gif;base64,R0lGODlhFgAWAIQcAB1ChBFNsTRLYyJYwjljwl9vj1iE31 |
| 211 | @ iGzF6MnHWX9HOdz5GjuYCl2YKl8ZOt4qezxqK63aK/9KPD+7DI3b/I17LM/MrL1MLY9NHa7OP |
| 212 | @ s++bx/Pv8/f///////////////yH5BAEAAB8ALAAAAAAWABYAAAWG4CeOZGmeaKqubOum1SQ/ |
| 213 | @ kPVOW749BeVSus2CgrCxHptLBbOQxCSNCCaF1GUqwQbBd0JGJAyGJJiobE+LnCaDcXAaEoxhQ |
| 214 | @ ACgNw0FQx9kP+wmaRgYFBQNeAoGihCAJQsCkJAKOhgXEw8BLQYciooHf5o7EA+kC40qBKkAAA |
| 215 | @ Grpy+wsbKzIiEAOw==" /> |
| 216 | |
| 217 | @ <img class="intLink" title="Paste" |
| 218 | @ onclick="formatDoc('paste');" |
| 219 | @ src="data:image/gif;base64,R0lGODlhFgAWAIQUAD04KTRLY2tXQF9vj414WZWIbXmOrp |
| 220 | @ qbmpGjudClFaezxsa0cb/I1+3YitHa7PrkIPHvbuPs+/fvrvv8/f///////////////////// |
| 221 | @ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAWN4CeOZGmeaKqubGsusPvB |
| 222 | @ SyFJjVDs6nJLB0khR4AkBCmfsCGBQAoCwjF5gwquVykSFbwZE+AwIBV0GhFog2EwIDchjwRiQ |
| 223 | @ o9E2Fx4XD5R+B0DDAEnBXBhBhN2DgwDAQFjJYVhCQYRfgoIDGiQJAWTCQMRiwwMfgicnVcAAA |
| @@ -224,20 +208,58 @@ | |
| 224 | @ MOaK+bLAOrtLUyt7i5uiUhADs=" /> |
| 225 | #endif |
| 226 | |
| 227 | @ </div> |
| 228 | @ <div id="wysiwygBox" |
| 229 | @ style="resize:both; overflow:auto; width: %d(w)em; height: %d(h)em;" |
| 230 | @ contenteditable="true">%s(zContent)</div> |
| 231 | @ <script nonce="%h(style_nonce())"> |
| 232 | @ var oDoc; |
| 233 | @ |
| 234 | @ /* Initialize the document editor */ |
| 235 | @ function initDoc() { |
| 236 | @ oDoc = document.getElementById("wysiwygBox"); |
| 237 | @ if (!isWysiwyg()) { setDocMode(true); } |
| 238 | @ } |
| 239 | @ |
| 240 | @ /* Return true if the document editor is in WYSIWYG mode. Return |
| 241 | @ ** false if it is in Markup mode */ |
| 242 | @ function isWysiwyg() { |
| 243 | @ return document.getElementById("editMode").selectedIndex==0; |
| 244 |
| --- src/wysiwyg.c | |
| +++ src/wysiwyg.c | |
| @@ -49,17 +49,16 @@ | |
| 49 | @ #editMode label { cursor: pointer; } |
| 50 | @ </style> |
| 51 | |
| 52 | @ <input id="wysiwygValue" type="hidden" name="%s(zId)"> |
| 53 | @ <div id="editModeDiv">Edit mode: |
| 54 | @ <select id="editMode" size=1> |
| 55 | @ <option value="0">WYSIWYG</option> |
| 56 | @ <option value="1">Raw HTML</option> |
| 57 | @ </select></div> |
| 58 | @ <div id="toolBar1"> |
| 59 | @ <select class="format" data-format="formatblock"> |
| 60 | @ <option selected>- formatting -</option> |
| 61 | @ <option value="h1">Title 1 <h1></option> |
| 62 | @ <option value="h2">Title 2 <h2></option> |
| 63 | @ <option value="h3">Title 3 <h3></option> |
| 64 | @ <option value="h4">Title 4 <h4></option> |
| @@ -66,52 +65,48 @@ | |
| 65 | @ <option value="h5">Title 5 <h5></option> |
| 66 | @ <option value="h6">Subtitle <h6></option> |
| 67 | @ <option value="p">Paragraph <p></option> |
| 68 | @ <option value="pre">Preformatted <pre></option> |
| 69 | @ </select> |
| 70 | @ <select class="format" data-format="fontname"> |
| 71 | @ <option class="heading" selected>- font -</option> |
| 72 | @ <option>Arial</option> |
| 73 | @ <option>Arial Black</option> |
| 74 | @ <option>Courier New</option> |
| 75 | @ <option>Times New Roman</option> |
| 76 | @ </select> |
| 77 | @ <select class="format" data-format="fontsize"> |
| 78 | @ <option class="heading" selected>- size -</option> |
| 79 | @ <option value="1">Very small</option> |
| 80 | @ <option value="2">A bit small</option> |
| 81 | @ <option value="3">Normal</option> |
| 82 | @ <option value="4">Medium-large</option> |
| 83 | @ <option value="5">Big</option> |
| 84 | @ <option value="6">Very big</option> |
| 85 | @ <option value="7">Maximum</option> |
| 86 | @ </select> |
| 87 | @ <select class="format" data-format="forecolor"> |
| 88 | @ <option class="heading" selected>- color -</option> |
| 89 | @ <option value="red">Red</option> |
| 90 | @ <option value="blue">Blue</option> |
| 91 | @ <option value="green">Green</option> |
| 92 | @ <option value="black">Black</option> |
| 93 | @ </select> |
| 94 | @ </div> |
| 95 | @ <div id="toolBar2"> |
| 96 | @ <img class="intLink" title="Undo" data-format="undo" |
| 97 | @ src="data:image/gif;base64,R0lGODlhFgAWAOMKADljwliE33mOrpGjuYKl8aezxqPD+7 |
| 98 | @ /I19DV3NHa7P///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARR8MlJq704680 |
| 99 | @ 7TkaYeJJBnES4EeUJvIGapWYAC0CsocQ7SDlWJkAkCA6ToMYWIARGQF3mRQVIEjkkSVLIbSfE |
| 100 | @ whdRIH4fh/DZMICe3/C4nBQBADs="> |
| 101 | |
| 102 | @ <img class="intLink" title="Redo" data-format="redo" |
| 103 | @ src="data:image/gif;base64,R0lGODlhFgAWAMIHAB1ChDljwl9vj1iE34Kl8aPD+7/I1/ |
| 104 | @ ///yH5BAEKAAcALAAAAAAWABYAAANKeLrc/jDKSesyphi7SiEgsVXZEATDICqBVJjpqWZt9Na |
| 105 | @ EDNbQK1wCQsxlYnxMAImhyDoFAElJasRRvAZVRqqQXUy7Cgx4TC6bswkAOw=="> |
| 106 | |
| 107 | @ <img class="intLink" title="Remove formatting" data-format="removeFormat" |
| 108 | @ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AA |
| 109 | @ AABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwA |
| 110 | @ AAAd0SU1FB9oECQMCKPI8CIIAAAAIdEVYdENvbW1lbnQA9syWvwAAAuhJREFUOMtjYBgFxAB5 |
| 111 | @ 01ZWBvVaL2nHnlmk6mXCJbF69zU+Hz/9fB5O1lx+bg45qhl8/fYr5it3XrP/YWTUvvvk3VeqG |
| 112 | @ Xz70TvbJy8+Wv39+2/Hz19/mGwjZzuTYjALuoBv9jImaXHeyD3H7kU8fPj2ICML8z92dlbtMz |
| @@ -126,98 +121,87 @@ | |
| 121 | @ b/mZm0JcT5Lj+89+Ybm6zz95oMh7s4XbygN3Sluq4Mj5K8iKMgP4f0////fv77//8nLy+7MCc |
| 122 | @ XmyYDAwODS9jM9tcvPypd35pne3ljdjvj26+H2dhYpuENikgfvQeXNmSl3tqepxXsqhXPyc66 |
| 123 | @ 6s+fv1fMdKR3TK72zpix8nTc7bdfhfkEeVbC9KhbK/9iYWHiErbu6MWbY/7//8/4//9/pgOnH |
| 124 | @ 6jGVazvFDRtq2VgiBIZrUTIBgCk+ivHvuEKwAAAAABJRU5ErkJggg=="> |
| 125 | |
| 126 | @ <img class="intLink" title="Bold" data-format="bold" |
| 127 | @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB |
| 128 | @ YAQAInhI+pa+H9mJy0LhdgtrxzDG5WGFVk6aXqyk6Y9kXvKKNuLbb6zgMFADs=" /> |
| 129 | |
| 130 | @ <img class="intLink" title="Italic" data-format="italic" |
| 131 | @ src="data:image/gif;base64,R0lGODlhFgAWAKEDAAAAAF9vj5WIbf///yH5BAEAAAMALA |
| 132 | @ AAAAAWABYAAAIjnI+py+0Po5x0gXvruEKHrF2BB1YiCWgbMFIYpsbyTNd2UwAAOw==" /> |
| 133 | |
| 134 | @ <img class="intLink" title="Underline" data-format="underline" |
| 135 | @ src="data:image/gif;base64,R0lGODlhFgAWAKECAAAAAF9vj////////yH5BAEAAAIALA |
| 136 | @ AAAAAWABYAAAIrlI+py+0Po5zUgAsEzvEeL4Ea15EiJJ5PSqJmuwKBEKgxVuXWtun+DwxCCgA |
| 137 | @ 7" /> |
| 138 | |
| 139 | @ <img class="intLink" title="Left align" data-format="justifyleft" |
| 140 | @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB |
| 141 | @ YAQAIghI+py+0Po5y02ouz3jL4D4JMGELkGYxo+qzl4nKyXAAAOw==" /> |
| 142 | |
| 143 | @ <img class="intLink" title="Center align" data-format="justifycenter" |
| 144 | @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB |
| 145 | @ YAQAIfhI+py+0Po5y02ouz3jL4D4JOGI7kaZ5Bqn4sycVbAQA7" /> |
| 146 | |
| 147 | @ <img class="intLink" title="Right align" data-format="justifyright" |
| 148 | @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB |
| 149 | @ YAQAIghI+py+0Po5y02ouz3jL4D4JQGDLkGYxouqzl43JyVgAAOw==" /> |
| 150 | @ <img class="intLink" title="Numbered list" |
| 151 | @ data-format="insertorderedlist" |
| 152 | @ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAADljwliE35GjuaezxtHa7P//// |
| 153 | @ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKSespwjoRFvggCBUBoTFBeq6QIAysQnRHaEO |
| 154 | @ zyaZ07Lu9lUBnC0UGQU1K52s6n5oEADs=" /> |
| 155 | |
| 156 | @ <img class="intLink" title="Dotted list" |
| 157 | @ data-format="insertunorderedlist" |
| 158 | @ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAAB1ChF9vj1iE33mOrqezxv//// |
| 159 | @ ///yH5BAEAAAcALAAAAAAWABYAAAMyeLrc/jDKSesppNhGRlBAKIZRERBbqm6YtnbfMY7lud6 |
| 160 | @ 4UwiuKnigGQliQuWOyKQykgAAOw==" /> |
| 161 | |
| 162 | @ <img class="intLink" title="Quote" data-format="formatblock" |
| 163 | @ src="data:image/gif;base64,R0lGODlhFgAWAIQXAC1NqjFRjkBgmT9nqUJnsk9xrFJ7u2 |
| 164 | @ R9qmKBt1iGzHmOrm6Sz4OXw3Odz4Cl2ZSnw6KxyqO306K63bG70bTB0rDI3bvI4P///////// |
| 165 | @ //////////////////////////yH5BAEKAB8ALAAAAAAWABYAAAVP4CeOZGmeaKqubEs2Cekk |
| 166 | @ ErvEI1zZuOgYFlakECEZFi0GgTGKEBATFmJAVXweVOoKEQgABB9IQDCmrLpjETrQQlhHjINrT |
| 167 | @ q/b7/i8fp8PAQA7" /> |
| 168 | |
| 169 | @ <img class="intLink" title="Delete indentation" data-format="outdent" |
| 170 | @ src="data:image/gif;base64,R0lGODlhFgAWAMIHAAAAADljwliE35GjuaezxtDV3NHa7P |
| 171 | @ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKCQG9F2i7u8agQgyK1z2EIBil+TWqEMxhMcz |
| 172 | @ sYVJ3e4ahk+sFnAgtxSQDqWw6n5cEADs=" /> |
| 173 | |
| 174 | @ <img class="intLink" title="Add indentation" data-format="indent" |
| 175 | @ src="data:image/gif;base64,R0lGODlhFgAWAOMIAAAAADljwl9vj1iE35GjuaezxtDV3N |
| 176 | @ Ha7P///////////////////////////////yH5BAEAAAgALAAAAAAWABYAAAQ7EMlJq704650 |
| 177 | @ B/x8gemMpgugwHJNZXodKsO5oqUOgo5KhBwWESyMQsCRDHu9VOyk5TM9zSpFSr9gsJwIAOw=="> |
| 178 | |
| 179 | @ <img class="intLink" title="Hyperlink" data-format="createlink" |
| 180 | @ src="data:image/gif;base64,R0lGODlhFgAWAOMKAB1ChDRLY19vj3mOrpGjuaezxrCztb |
| 181 | @ /I19Ha7Pv8/f///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARY8MlJq704682 |
| 182 | @ 7/2BYIQVhHg9pEgVGIklyDEUBy/RlE4FQF4dCj2AQXAiJQDCWQCAEBwIioEMQBgSAFhDAGghG |
| 183 | @ i9XgHAhMNoSZgJkJei33UESv2+/4vD4TAQA7" /> |
| 184 | |
| 185 | #if 0 /* Cut/Copy/Paste requires special browser permissions for security |
| 186 | ** reasons. So omit these buttons */ |
| 187 | @ <img class="intLink" title="Cut" data-format="cut" |
| 188 | @ src="data:image/gif;base64,R0lGODlhFgAWAIQSAB1ChBFNsRJTySJYwjljwkxwl19vj1 |
| 189 | @ dusYODhl6MnHmOrpqbmpGjuaezxrCztcDCxL/I18rL1P///////////////////////////// |
| 190 | @ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAVu4CeOZGmeaKqubDs6TNnE |
| 191 | @ bGNApNG0kbGMi5trwcA9GArXh+FAfBAw5UexUDAQESkRsfhJPwaH4YsEGAAJGisRGAQY7UCC9 |
| 192 | @ ZAXBB+74LGCRxIEHwAHdWooDgGJcwpxDisQBQRjIgkDCVlfmZqbmiEAOw==" /> |
| 193 | |
| 194 | @ <img class="intLink" title="Copy" data-format="copy" |
| 195 | @ src="data:image/gif;base64,R0lGODlhFgAWAIQcAB1ChBFNsTRLYyJYwjljwl9vj1iE31 |
| 196 | @ iGzF6MnHWX9HOdz5GjuYCl2YKl8ZOt4qezxqK63aK/9KPD+7DI3b/I17LM/MrL1MLY9NHa7OP |
| 197 | @ s++bx/Pv8/f///////////////yH5BAEAAB8ALAAAAAAWABYAAAWG4CeOZGmeaKqubOum1SQ/ |
| 198 | @ kPVOW749BeVSus2CgrCxHptLBbOQxCSNCCaF1GUqwQbBd0JGJAyGJJiobE+LnCaDcXAaEoxhQ |
| 199 | @ ACgNw0FQx9kP+wmaRgYFBQNeAoGihCAJQsCkJAKOhgXEw8BLQYciooHf5o7EA+kC40qBKkAAA |
| 200 | @ Grpy+wsbKzIiEAOw==" /> |
| 201 | |
| 202 | @ <img class="intLink" title="Paste" data-format="paste" |
| 203 | @ src="data:image/gif;base64,R0lGODlhFgAWAIQUAD04KTRLY2tXQF9vj414WZWIbXmOrp |
| 204 | @ qbmpGjudClFaezxsa0cb/I1+3YitHa7PrkIPHvbuPs+/fvrvv8/f///////////////////// |
| 205 | @ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAWN4CeOZGmeaKqubGsusPvB |
| 206 | @ SyFJjVDs6nJLB0khR4AkBCmfsCGBQAoCwjF5gwquVykSFbwZE+AwIBV0GhFog2EwIDchjwRiQ |
| 207 | @ o9E2Fx4XD5R+B0DDAEnBXBhBhN2DgwDAQFjJYVhCQYRfgoIDGiQJAWTCQMRiwwMfgicnVcAAA |
| @@ -224,20 +208,58 @@ | |
| 208 | @ MOaK+bLAOrtLUyt7i5uiUhADs=" /> |
| 209 | #endif |
| 210 | |
| 211 | @ </div> |
| 212 | @ <div id="wysiwygBox" |
| 213 | @ style="resize:both;overflow:auto;width:95%%;min-height:%d(h)em;" |
| 214 | @ contenteditable="true">%s(zContent)</div> |
| 215 | @ <script nonce="%h(style_nonce())"> |
| 216 | @ var oDoc; |
| 217 | @ |
| 218 | @ /* Initialize the document editor */ |
| 219 | @ function initDoc() { |
| 220 | @ initEventHandlers(); |
| 221 | @ oDoc = document.getElementById("wysiwygBox"); |
| 222 | @ if (!isWysiwyg()) { setDocMode(true); } |
| 223 | @ } |
| 224 | @ |
| 225 | @ function initEventHandlers() { |
| 226 | @ document.querySelector('form').onsubmit = wysiwygSubmit; |
| 227 | @ document.querySelector('#editMode').onchange = function() { |
| 228 | @ setDocMode(this.selectedIndex) |
| 229 | @ }; |
| 230 | @ var controls = document.querySelectorAll('select.format'); |
| 231 | @ for(var i = 0; i < controls.length; i++) { |
| 232 | @ controls[i].onchange = handleDropDown; |
| 233 | @ } |
| 234 | @ controls = document.querySelectorAll('.intLink'); |
| 235 | @ for(i = 0; i < controls.length; i++) { |
| 236 | @ controls[i].onclick = handleFormatButton; |
| 237 | @ } |
| 238 | @ |
| 239 | @ function handleDropDown() { |
| 240 | @ formatDoc(this.dataset.format,this[this.selectedIndex].value); |
| 241 | @ this.selectedIndex = 0; |
| 242 | @ } |
| 243 | @ |
| 244 | @ function handleFormatButton() { |
| 245 | @ var extra; |
| 246 | @ switch (this.dataset.format) { |
| 247 | @ case 'createlink': |
| 248 | @ var sLnk = prompt('Target URL:',''); |
| 249 | @ if(sLnk && sLnk != '') |
| 250 | @ { |
| 251 | @ extra = sLnk; |
| 252 | @ } |
| 253 | @ break; |
| 254 | @ case 'formatblock': |
| 255 | @ extra = 'blockquote'; |
| 256 | @ break; |
| 257 | @ } |
| 258 | @ formatDoc(this.dataset.format, extra); |
| 259 | @ } |
| 260 | @ } |
| 261 | @ |
| 262 | @ /* Return true if the document editor is in WYSIWYG mode. Return |
| 263 | @ ** false if it is in Markup mode */ |
| 264 | @ function isWysiwyg() { |
| 265 | @ return document.getElementById("editMode").selectedIndex==0; |
| 266 |