Mercurial Hosting > freedit
comparison src/bbcode/bbcode.js @ 52:9f8ebc757814
add convert urls
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 23 Nov 2022 23:29:16 -0700 |
parents | 78b2d6995244 |
children | cac477dd1f82 |
comparison
equal
deleted
inserted
replaced
51:78b2d6995244 | 52:9f8ebc757814 |
---|---|
68 <button type=button sup title="Superscript"><img src="/bbcode/icons/superscript.svg"></button> | 68 <button type=button sup title="Superscript"><img src="/bbcode/icons/superscript.svg"></button> |
69 <button type=button ul title="Bullet list"><img src="/bbcode/icons/format_list_bulleted.svg"></button> | 69 <button type=button ul title="Bullet list"><img src="/bbcode/icons/format_list_bulleted.svg"></button> |
70 <button type=button ol title="Numbered list"><img src="/bbcode/icons/format_list_numbered.svg"></button> | 70 <button type=button ol title="Numbered list"><img src="/bbcode/icons/format_list_numbered.svg"></button> |
71 <button type=button code_block title="Code block"><img src="/bbcode/icons/code_blocks.svg"></button> | 71 <button type=button code_block title="Code block"><img src="/bbcode/icons/code_blocks.svg"></button> |
72 <button type=button code_inline title="Inline code"><img src="/bbcode/icons/code.svg"></button> | 72 <button type=button code_inline title="Inline code"><img src="/bbcode/icons/code.svg"></button> |
73 <button type=button convert_urls checked title="Convert URLs"><img src="/bbcode/icons/media_link.svg"></button> | |
74 <input type=hidden name=convert_urls value=true> | |
73 <button type=button more checked title="More..."><img src="/bbcode/icons/more_horiz.svg"></button> | 75 <button type=button more checked title="More..."><img src="/bbcode/icons/more_horiz.svg"></button> |
74 <input type=file> | 76 <input type=file> |
75 <button type=button upload title="Upload File"><img src="/bbcode/icons/file_upload.svg"></button> | 77 <button type=button upload title="Upload File"><img src="/bbcode/icons/file_upload.svg"></button> |
76 <button type=button preview title="Preview"><img src="/bbcode/icons/preview.svg"></button> | 78 <button type=button preview title="Preview"><img src="/bbcode/icons/preview.svg"></button> |
77 ` ; | 79 ` ; |
90 </div> | 92 </div> |
91 ` ; | 93 ` ; |
92 div.innerHTML = html; | 94 div.innerHTML = html; |
93 | 95 |
94 let enabledInPreview = []; | 96 let enabledInPreview = []; |
97 let convertUrls = true; | |
95 | 98 |
96 if(save) { | 99 if(save) { |
97 let button = div.querySelector('button[save]'); | 100 let button = div.querySelector('button[save]'); |
98 button.onclick = save; | 101 button.onclick = function(event) { |
102 event.convertUrls = convertUrls; | |
103 save(event); | |
104 }; | |
99 enabledInPreview.push(button); | 105 enabledInPreview.push(button); |
100 } | 106 } |
101 if(cancel) { | 107 if(cancel) { |
102 let button = div.querySelector('button[cancel]'); | 108 let button = div.querySelector('button[cancel]'); |
103 button.onclick = cancel; | 109 button.onclick = cancel; |
112 } | 118 } |
113 }; | 119 }; |
114 textarea.oninput = fixTextarea; | 120 textarea.oninput = fixTextarea; |
115 fixTextarea(); | 121 fixTextarea(); |
116 | 122 |
123 function toggle(button) { | |
124 let checked = button.getAttribute('checked') !== null; | |
125 checked = !checked; // toggle | |
126 if( checked ) { | |
127 button.setAttribute('checked',''); | |
128 } else { | |
129 button.removeAttribute('checked'); | |
130 } | |
131 return checked; | |
132 } | |
133 | |
117 let moreButton = div.querySelector('button[more]'); | 134 let moreButton = div.querySelector('button[more]'); |
118 function more() { | 135 function more() { |
119 let button = moreButton; | 136 let checked = toggle(moreButton); |
120 let checked = button.getAttribute('checked') !== null; | 137 let buttons = moreButton.parentNode.querySelectorAll('button'); |
121 let buttons = button.parentNode.querySelectorAll('button'); | |
122 if( checked ) { | 138 if( checked ) { |
123 button.removeAttribute('checked'); | 139 for( let b of buttons ) { |
124 for( let b of buttons ) { | 140 if( b === moreButton ) |
125 if( b === button ) | 141 break; |
142 b.removeAttribute('hidden'); | |
143 } | |
144 } else { | |
145 for( let b of buttons ) { | |
146 if( b === moreButton ) | |
126 break; | 147 break; |
127 b.setAttribute('hidden',''); | 148 b.setAttribute('hidden',''); |
128 } | |
129 } else { | |
130 button.setAttribute('checked',''); | |
131 for( let b of buttons ) { | |
132 if( b === button ) | |
133 break; | |
134 b.removeAttribute('hidden'); | |
135 } | 149 } |
136 } | 150 } |
137 }; | 151 }; |
138 moreButton.onclick = more; | 152 moreButton.onclick = more; |
139 more(); | 153 more(); |
140 enabledInPreview.push(moreButton); | 154 enabledInPreview.push(moreButton); |
141 | 155 |
142 let divPreview = div.querySelector('div[preview]'); | 156 let divPreview = div.querySelector('div[preview]'); |
143 function contextPreview(html) { | 157 function contextPreview(bbcode,html) { |
158 textarea.value = bbcode; | |
144 divPreview.innerHTML = html; | 159 divPreview.innerHTML = html; |
145 } | 160 } |
146 let previewButton = div.querySelector('button[preview]'); | 161 let previewButton = div.querySelector('button[preview]'); |
147 function preview() { | 162 function preview() { |
148 let button = previewButton; | 163 let checked = toggle(previewButton); |
149 let checked = button.getAttribute('checked') !== null; | 164 let buttons = previewButton.parentNode.querySelectorAll('button'); |
150 let buttons = button.parentNode.querySelectorAll('button'); | |
151 if( checked ) { | 165 if( checked ) { |
152 button.removeAttribute('checked'); | 166 for( let b of buttons ) { |
167 if( !enabledInPreview.includes(b) ) | |
168 b.disabled = true; | |
169 } | |
170 textarea.style.display = 'none'; | |
171 divPreview.style.display = 'block'; | |
172 let url = '/bbcode/preview.js?text=' + encodeURIComponent(textarea.value) + '&convert_urls=' + convertUrls; | |
173 ajax( url, null, {preview: contextPreview} ); | |
174 } else { | |
153 for( let b of buttons ) { | 175 for( let b of buttons ) { |
154 b.disabled = false; | 176 b.disabled = false; |
155 } | 177 } |
156 textarea.style.display = 'initial'; | 178 textarea.style.display = 'initial'; |
157 divPreview.style.display = 'none'; | 179 divPreview.style.display = 'none'; |
158 textarea.focus(); | 180 textarea.focus(); |
159 } else { | |
160 window.enabledInPreview = enabledInPreview; | |
161 button.setAttribute('checked',''); | |
162 for( let b of buttons ) { | |
163 if( !enabledInPreview.includes(b) ) | |
164 b.disabled = true; | |
165 } | |
166 textarea.style.display = 'none'; | |
167 divPreview.style.display = 'block'; | |
168 let url = '/bbcode/preview.js?text=' + encodeURIComponent(textarea.value); | |
169 ajax( url, null, {preview: contextPreview} ); | |
170 } | 181 } |
171 } | 182 } |
172 previewButton.onclick = preview; | 183 previewButton.onclick = preview; |
173 enabledInPreview.push(previewButton); | 184 enabledInPreview.push(previewButton); |
185 | |
186 let convertUrlsButton = div.querySelector('button[convert_urls]'); | |
187 let convertUrlsInput = div.querySelector('input[name="convert_urls"]'); | |
188 function toggleConvertUrls() { | |
189 convertUrls = toggle(convertUrlsButton); | |
190 convertUrlsInput.value = convertUrls; | |
191 } | |
192 convertUrlsButton.onclick = toggleConvertUrls; | |
174 | 193 |
175 function add(tag,openTag,closeTag) { | 194 function add(tag,openTag,closeTag) { |
176 let button = div.querySelector('button['+tag+']'); | 195 let button = div.querySelector('button['+tag+']'); |
177 button.onclick = function() { | 196 button.onclick = function() { |
178 let start = textarea.selectionStart; | 197 let start = textarea.selectionStart; |