blob: 270891abcf02e8f7ef9033282f30e2dafec3d326 [file] [log] [blame]
Bram Moolenaarb02cbe32010-07-11 22:38:52 +02001" Vim autoload file for the tohtml plugin.
Bram Moolenaar349b2fb2010-07-16 20:35:36 +02002" Maintainer: Ben Fritz <fritzophrenic@gmail.com>
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003" Last Change: 2019 Aug 16
Bram Moolenaarb02cbe32010-07-11 22:38:52 +02004"
Bram Moolenaar349b2fb2010-07-16 20:35:36 +02005" Additional contributors:
6"
Bram Moolenaar7c86f4c2010-07-18 14:07:22 +02007" Original by Bram Moolenaar <Bram@vim.org>
8" Diff2HTML() added by Christian Brabandt <cb@256bit.org>
Bram Moolenaar349b2fb2010-07-16 20:35:36 +02009"
Bram Moolenaar7c86f4c2010-07-18 14:07:22 +020010" See Mercurial change logs for more!
11
Bram Moolenaar349b2fb2010-07-16 20:35:36 +020012" this file uses line continuations
13let s:cpo_sav = &cpo
Bram Moolenaar6c35bea2012-07-25 17:49:10 +020014set cpo&vim
Bram Moolenaarb02cbe32010-07-11 22:38:52 +020015
Bram Moolenaar166af9b2010-11-16 20:34:40 +010016" Automatically find charsets from all encodings supported natively by Vim. With
17" the 8bit- and 2byte- prefixes, Vim can actually support more encodings than
18" this. Let the user specify these however since they won't be supported on
Bram Moolenaar8e5af3e2011-04-28 19:02:44 +020019" every system.
Bram Moolenaar166af9b2010-11-16 20:34:40 +010020"
21" Note, not all of Vim's supported encodings have a charset to use.
22"
23" Names in this list are from:
24" http://www.iana.org/assignments/character-sets
25" g:tohtml#encoding_to_charset: {{{
26let g:tohtml#encoding_to_charset = {
27 \ 'latin1' : 'ISO-8859-1',
28 \ 'iso-8859-2' : 'ISO-8859-2',
29 \ 'iso-8859-3' : 'ISO-8859-3',
30 \ 'iso-8859-4' : 'ISO-8859-4',
31 \ 'iso-8859-5' : 'ISO-8859-5',
32 \ 'iso-8859-6' : 'ISO-8859-6',
33 \ 'iso-8859-7' : 'ISO-8859-7',
34 \ 'iso-8859-8' : 'ISO-8859-8',
35 \ 'iso-8859-9' : 'ISO-8859-9',
36 \ 'iso-8859-10' : '',
37 \ 'iso-8859-13' : 'ISO-8859-13',
38 \ 'iso-8859-14' : '',
39 \ 'iso-8859-15' : 'ISO-8859-15',
40 \ 'koi8-r' : 'KOI8-R',
41 \ 'koi8-u' : 'KOI8-U',
42 \ 'macroman' : 'macintosh',
43 \ 'cp437' : '',
44 \ 'cp775' : '',
45 \ 'cp850' : '',
46 \ 'cp852' : '',
47 \ 'cp855' : '',
48 \ 'cp857' : '',
49 \ 'cp860' : '',
50 \ 'cp861' : '',
51 \ 'cp862' : '',
52 \ 'cp863' : '',
53 \ 'cp865' : '',
54 \ 'cp866' : 'IBM866',
55 \ 'cp869' : '',
56 \ 'cp874' : '',
57 \ 'cp1250' : 'windows-1250',
58 \ 'cp1251' : 'windows-1251',
59 \ 'cp1253' : 'windows-1253',
60 \ 'cp1254' : 'windows-1254',
61 \ 'cp1255' : 'windows-1255',
62 \ 'cp1256' : 'windows-1256',
63 \ 'cp1257' : 'windows-1257',
64 \ 'cp1258' : 'windows-1258',
65 \ 'euc-jp' : 'EUC-JP',
66 \ 'sjis' : 'Shift_JIS',
67 \ 'cp932' : 'Shift_JIS',
68 \ 'cp949' : '',
69 \ 'euc-kr' : 'EUC-KR',
70 \ 'cp936' : 'GBK',
71 \ 'euc-cn' : 'GB2312',
72 \ 'big5' : 'Big5',
73 \ 'cp950' : 'Big5',
74 \ 'utf-8' : 'UTF-8',
75 \ 'ucs-2' : 'UTF-8',
76 \ 'ucs-2le' : 'UTF-8',
77 \ 'utf-16' : 'UTF-8',
78 \ 'utf-16le' : 'UTF-8',
79 \ 'ucs-4' : 'UTF-8',
80 \ 'ucs-4le' : 'UTF-8',
81 \ }
82lockvar g:tohtml#encoding_to_charset
83" Notes:
84" 1. All UCS/UTF are converted to UTF-8 because it is much better supported
85" 2. Any blank spaces are there because Vim supports it but at least one major
86" web browser does not according to http://wiki.whatwg.org/wiki/Web_Encodings.
87" }}}
88
89" Only automatically find encodings supported natively by Vim, let the user
90" specify the encoding if it's not natively supported. This function is only
91" used when the user specifies the charset, they better know what they are
92" doing!
93"
94" Names in this list are from:
95" http://www.iana.org/assignments/character-sets
96" g:tohtml#charset_to_encoding: {{{
97let g:tohtml#charset_to_encoding = {
98 \ 'iso_8859-1:1987' : 'latin1',
99 \ 'iso-ir-100' : 'latin1',
100 \ 'iso_8859-1' : 'latin1',
101 \ 'iso-8859-1' : 'latin1',
102 \ 'latin1' : 'latin1',
103 \ 'l1' : 'latin1',
104 \ 'ibm819' : 'latin1',
105 \ 'cp819' : 'latin1',
106 \ 'csisolatin1' : 'latin1',
107 \ 'iso_8859-2:1987' : 'iso-8859-2',
108 \ 'iso-ir-101' : 'iso-8859-2',
109 \ 'iso_8859-2' : 'iso-8859-2',
110 \ 'iso-8859-2' : 'iso-8859-2',
111 \ 'latin2' : 'iso-8859-2',
112 \ 'l2' : 'iso-8859-2',
113 \ 'csisolatin2' : 'iso-8859-2',
114 \ 'iso_8859-3:1988' : 'iso-8859-3',
115 \ 'iso-ir-109' : 'iso-8859-3',
116 \ 'iso_8859-3' : 'iso-8859-3',
117 \ 'iso-8859-3' : 'iso-8859-3',
118 \ 'latin3' : 'iso-8859-3',
119 \ 'l3' : 'iso-8859-3',
120 \ 'csisolatin3' : 'iso-8859-3',
121 \ 'iso_8859-4:1988' : 'iso-8859-4',
122 \ 'iso-ir-110' : 'iso-8859-4',
123 \ 'iso_8859-4' : 'iso-8859-4',
124 \ 'iso-8859-4' : 'iso-8859-4',
125 \ 'latin4' : 'iso-8859-4',
126 \ 'l4' : 'iso-8859-4',
127 \ 'csisolatin4' : 'iso-8859-4',
128 \ 'iso_8859-5:1988' : 'iso-8859-5',
129 \ 'iso-ir-144' : 'iso-8859-5',
130 \ 'iso_8859-5' : 'iso-8859-5',
131 \ 'iso-8859-5' : 'iso-8859-5',
132 \ 'cyrillic' : 'iso-8859-5',
133 \ 'csisolatincyrillic' : 'iso-8859-5',
134 \ 'iso_8859-6:1987' : 'iso-8859-6',
135 \ 'iso-ir-127' : 'iso-8859-6',
136 \ 'iso_8859-6' : 'iso-8859-6',
137 \ 'iso-8859-6' : 'iso-8859-6',
138 \ 'ecma-114' : 'iso-8859-6',
139 \ 'asmo-708' : 'iso-8859-6',
140 \ 'arabic' : 'iso-8859-6',
141 \ 'csisolatinarabic' : 'iso-8859-6',
142 \ 'iso_8859-7:1987' : 'iso-8859-7',
143 \ 'iso-ir-126' : 'iso-8859-7',
144 \ 'iso_8859-7' : 'iso-8859-7',
145 \ 'iso-8859-7' : 'iso-8859-7',
146 \ 'elot_928' : 'iso-8859-7',
147 \ 'ecma-118' : 'iso-8859-7',
148 \ 'greek' : 'iso-8859-7',
149 \ 'greek8' : 'iso-8859-7',
150 \ 'csisolatingreek' : 'iso-8859-7',
151 \ 'iso_8859-8:1988' : 'iso-8859-8',
152 \ 'iso-ir-138' : 'iso-8859-8',
153 \ 'iso_8859-8' : 'iso-8859-8',
154 \ 'iso-8859-8' : 'iso-8859-8',
155 \ 'hebrew' : 'iso-8859-8',
156 \ 'csisolatinhebrew' : 'iso-8859-8',
157 \ 'iso_8859-9:1989' : 'iso-8859-9',
158 \ 'iso-ir-148' : 'iso-8859-9',
159 \ 'iso_8859-9' : 'iso-8859-9',
160 \ 'iso-8859-9' : 'iso-8859-9',
161 \ 'latin5' : 'iso-8859-9',
162 \ 'l5' : 'iso-8859-9',
163 \ 'csisolatin5' : 'iso-8859-9',
164 \ 'iso-8859-10' : 'iso-8859-10',
165 \ 'iso-ir-157' : 'iso-8859-10',
166 \ 'l6' : 'iso-8859-10',
167 \ 'iso_8859-10:1992' : 'iso-8859-10',
168 \ 'csisolatin6' : 'iso-8859-10',
169 \ 'latin6' : 'iso-8859-10',
170 \ 'iso-8859-13' : 'iso-8859-13',
171 \ 'iso-8859-14' : 'iso-8859-14',
172 \ 'iso-ir-199' : 'iso-8859-14',
173 \ 'iso_8859-14:1998' : 'iso-8859-14',
174 \ 'iso_8859-14' : 'iso-8859-14',
175 \ 'latin8' : 'iso-8859-14',
176 \ 'iso-celtic' : 'iso-8859-14',
177 \ 'l8' : 'iso-8859-14',
178 \ 'iso-8859-15' : 'iso-8859-15',
179 \ 'iso_8859-15' : 'iso-8859-15',
180 \ 'latin-9' : 'iso-8859-15',
181 \ 'koi8-r' : 'koi8-r',
182 \ 'cskoi8r' : 'koi8-r',
183 \ 'koi8-u' : 'koi8-u',
184 \ 'macintosh' : 'macroman',
185 \ 'mac' : 'macroman',
186 \ 'csmacintosh' : 'macroman',
187 \ 'ibm437' : 'cp437',
188 \ 'cp437' : 'cp437',
189 \ '437' : 'cp437',
190 \ 'cspc8codepage437' : 'cp437',
191 \ 'ibm775' : 'cp775',
192 \ 'cp775' : 'cp775',
193 \ 'cspc775baltic' : 'cp775',
194 \ 'ibm850' : 'cp850',
195 \ 'cp850' : 'cp850',
196 \ '850' : 'cp850',
197 \ 'cspc850multilingual' : 'cp850',
198 \ 'ibm852' : 'cp852',
199 \ 'cp852' : 'cp852',
200 \ '852' : 'cp852',
201 \ 'cspcp852' : 'cp852',
202 \ 'ibm855' : 'cp855',
203 \ 'cp855' : 'cp855',
204 \ '855' : 'cp855',
205 \ 'csibm855' : 'cp855',
206 \ 'ibm857' : 'cp857',
207 \ 'cp857' : 'cp857',
208 \ '857' : 'cp857',
209 \ 'csibm857' : 'cp857',
210 \ 'ibm860' : 'cp860',
211 \ 'cp860' : 'cp860',
212 \ '860' : 'cp860',
213 \ 'csibm860' : 'cp860',
214 \ 'ibm861' : 'cp861',
215 \ 'cp861' : 'cp861',
216 \ '861' : 'cp861',
217 \ 'cp-is' : 'cp861',
218 \ 'csibm861' : 'cp861',
219 \ 'ibm862' : 'cp862',
220 \ 'cp862' : 'cp862',
221 \ '862' : 'cp862',
222 \ 'cspc862latinhebrew' : 'cp862',
223 \ 'ibm863' : 'cp863',
224 \ 'cp863' : 'cp863',
225 \ '863' : 'cp863',
226 \ 'csibm863' : 'cp863',
227 \ 'ibm865' : 'cp865',
228 \ 'cp865' : 'cp865',
229 \ '865' : 'cp865',
230 \ 'csibm865' : 'cp865',
231 \ 'ibm866' : 'cp866',
232 \ 'cp866' : 'cp866',
233 \ '866' : 'cp866',
234 \ 'csibm866' : 'cp866',
235 \ 'ibm869' : 'cp869',
236 \ 'cp869' : 'cp869',
237 \ '869' : 'cp869',
238 \ 'cp-gr' : 'cp869',
239 \ 'csibm869' : 'cp869',
240 \ 'windows-1250' : 'cp1250',
241 \ 'windows-1251' : 'cp1251',
242 \ 'windows-1253' : 'cp1253',
243 \ 'windows-1254' : 'cp1254',
244 \ 'windows-1255' : 'cp1255',
245 \ 'windows-1256' : 'cp1256',
246 \ 'windows-1257' : 'cp1257',
247 \ 'windows-1258' : 'cp1258',
248 \ 'extended_unix_code_packed_format_for_japanese' : 'euc-jp',
249 \ 'cseucpkdfmtjapanese' : 'euc-jp',
250 \ 'euc-jp' : 'euc-jp',
251 \ 'shift_jis' : 'sjis',
252 \ 'ms_kanji' : 'sjis',
253 \ 'sjis' : 'sjis',
254 \ 'csshiftjis' : 'sjis',
255 \ 'ibm-thai' : 'cp874',
256 \ 'csibmthai' : 'cp874',
257 \ 'ks_c_5601-1987' : 'cp949',
258 \ 'iso-ir-149' : 'cp949',
259 \ 'ks_c_5601-1989' : 'cp949',
260 \ 'ksc_5601' : 'cp949',
261 \ 'korean' : 'cp949',
262 \ 'csksc56011987' : 'cp949',
263 \ 'euc-kr' : 'euc-kr',
264 \ 'cseuckr' : 'euc-kr',
265 \ 'gbk' : 'cp936',
266 \ 'cp936' : 'cp936',
267 \ 'ms936' : 'cp936',
268 \ 'windows-936' : 'cp936',
269 \ 'gb_2312-80' : 'euc-cn',
270 \ 'iso-ir-58' : 'euc-cn',
271 \ 'chinese' : 'euc-cn',
272 \ 'csiso58gb231280' : 'euc-cn',
273 \ 'big5' : 'big5',
274 \ 'csbig5' : 'big5',
275 \ 'utf-8' : 'utf-8',
276 \ 'iso-10646-ucs-2' : 'ucs-2',
277 \ 'csunicode' : 'ucs-2',
278 \ 'utf-16' : 'utf-16',
279 \ 'utf-16be' : 'utf-16',
280 \ 'utf-16le' : 'utf-16le',
281 \ 'utf-32' : 'ucs-4',
282 \ 'utf-32be' : 'ucs-4',
283 \ 'utf-32le' : 'ucs-4le',
284 \ 'iso-10646-ucs-4' : 'ucs-4',
285 \ 'csucs4' : 'ucs-4'
286 \ }
287lockvar g:tohtml#charset_to_encoding
288"}}}
289
290func! tohtml#Convert2HTML(line1, line2) "{{{
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200291 let s:settings = tohtml#GetUserSettings()
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200292
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100293 if !&diff || s:settings.diff_one_file "{{{
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200294 if a:line2 >= a:line1
295 let g:html_start_line = a:line1
296 let g:html_end_line = a:line2
297 else
298 let g:html_start_line = a:line2
299 let g:html_end_line = a:line1
300 endif
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100301 runtime syntax/2html.vim "}}}
302 else "{{{
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200303 let win_list = []
304 let buf_list = []
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200305 windo if &diff | call add(win_list, winbufnr(0)) | endif
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200306 let s:settings.whole_filler = 1
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200307 let g:html_diff_win_num = 0
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200308 for window in win_list
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100309 " switch to the next buffer to convert
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200310 exe ":" . bufwinnr(window) . "wincmd w"
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100311
312 " figure out whether current charset and encoding will work, if not
313 " default to UTF-8
314 if !exists('g:html_use_encoding') &&
Bram Moolenaar8e5af3e2011-04-28 19:02:44 +0200315 \ (((&l:fileencoding=='' || (&l:buftype!='' && &l:buftype!=?'help'))
316 \ && &encoding!=?s:settings.vim_encoding)
317 \ || &l:fileencoding!='' && &l:fileencoding!=?s:settings.vim_encoding)
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100318 echohl WarningMsg
319 echomsg "TOhtml: mismatched file encodings in Diff buffers, using UTF-8"
320 echohl None
321 let s:settings.vim_encoding = 'utf-8'
322 let s:settings.encoding = 'UTF-8'
323 endif
324
325 " set up for diff-mode conversion
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200326 let g:html_start_line = 1
327 let g:html_end_line = line('$')
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200328 let g:html_diff_win_num += 1
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100329
330 " convert this file
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200331 runtime syntax/2html.vim
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100332
333 " remember the HTML buffer for later combination
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200334 call add(buf_list, bufnr('%'))
335 endfor
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200336 unlet g:html_diff_win_num
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200337 call tohtml#Diff2HTML(win_list, buf_list)
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100338 endif "}}}
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200339
340 unlet g:html_start_line
341 unlet g:html_end_line
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200342 unlet s:settings
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100343endfunc "}}}
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200344
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100345func! tohtml#Diff2HTML(win_list, buf_list) "{{{
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200346 let xml_line = ""
347 let tag_close = '>'
348
Bram Moolenaar8df7f882010-08-13 11:30:02 +0200349 let s:old_paste = &paste
350 set paste
351 let s:old_magic = &magic
352 set magic
353
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200354 if s:settings.use_xhtml
355 if s:settings.encoding != ""
356 let xml_line = "<?xml version=\"1.0\" encoding=\"" . s:settings.encoding . "\"?>"
357 else
358 let xml_line = "<?xml version=\"1.0\"?>"
359 endif
360 let tag_close = ' />'
361 endif
362
363 let style = [s:settings.use_xhtml ? "" : '-->']
Bram Moolenaar8ada2cc2010-07-29 20:43:36 +0200364 let body_line = ''
365
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200366 let html = []
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100367 let s:html5 = 0
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200368 if s:settings.use_xhtml
369 call add(html, xml_line)
370 endif
371 if s:settings.use_xhtml
372 call add(html, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">")
373 call add(html, '<html xmlns="http://www.w3.org/1999/xhtml">')
374 elseif s:settings.use_css && !s:settings.no_pre
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100375 call add(html, "<!DOCTYPE html>")
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200376 call add(html, '<html>')
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100377 let s:html5 = 1
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200378 else
379 call add(html, '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"')
380 call add(html, ' "http://www.w3.org/TR/html4/loose.dtd">')
381 call add(html, '<html>')
382 endif
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200383 call add(html, '<head>')
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200384
385 " include encoding as close to the top as possible, but only if not already
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100386 " contained in XML information
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200387 if s:settings.encoding != "" && !s:settings.use_xhtml
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100388 if s:html5
389 call add(html, '<meta charset="' . s:settings.encoding . '"' . tag_close)
390 else
391 call add(html, "<meta http-equiv=\"content-type\" content=\"text/html; charset=" . s:settings.encoding . '"' . tag_close)
392 endif
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200393 endif
394
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200395 call add(html, '<title>diff</title>')
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200396 call add(html, '<meta name="Generator" content="Vim/'.v:version/100.'.'.v:version%100.'"'.tag_close)
397 call add(html, '<meta name="plugin-version" content="'.g:loaded_2html_plugin.'"'.tag_close)
398 call add(html, '<meta name="settings" content="'.
399 \ join(filter(keys(s:settings),'s:settings[v:val]'),',').
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200400 \ ',prevent_copy='.s:settings.prevent_copy.
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100401 \ ',use_input_for_pc='.s:settings.use_input_for_pc.
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200402 \ '"'.tag_close)
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200403 call add(html, '<meta name="colorscheme" content="'.
404 \ (exists('g:colors_name')
405 \ ? g:colors_name
406 \ : 'none'). '"'.tag_close)
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200407
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200408 call add(html, '</head>')
Bram Moolenaar8ada2cc2010-07-29 20:43:36 +0200409 let body_line_num = len(html)
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100410 call add(html, '<body'.(s:settings.line_ids ? ' onload="JumpToLine();"' : '').'>')
411 call add(html, "<table ".(s:settings.use_css? "" : "border='1' width='100%' ")."id='vimCodeElement".s:settings.id_suffix."'>")
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200412
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200413 call add(html, '<tr>')
414 for buf in a:win_list
415 call add(html, '<th>'.bufname(buf).'</th>')
416 endfor
417 call add(html, '</tr><tr>')
418
Bram Moolenaar8ada2cc2010-07-29 20:43:36 +0200419 let diff_style_start = 0
420 let insert_index = 0
421
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200422 for buf in a:buf_list
423 let temp = []
424 exe bufwinnr(buf) . 'wincmd w'
425
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200426 " If text is folded because of user foldmethod settings, etc. we don't want
427 " to act on everything in a fold by mistake.
428 setlocal nofoldenable
429
Bram Moolenaar8ada2cc2010-07-29 20:43:36 +0200430 " When not using CSS or when using xhtml, the <body> line can be important.
431 " Assume it will be the same for all buffers and grab it from the first
432 " buffer. Similarly, need to grab the body end line as well.
433 if body_line == ''
434 1
435 call search('<body')
436 let body_line = getline('.')
437 $
438 call search('</body>', 'b')
439 let s:body_end_line = getline('.')
440 endif
441
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100442 " Grab the style information. Some of this will be duplicated so only insert
443 " it if it's not already there. {{{
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200444 1
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100445 let style_start = search('^<style\( type="text/css"\)\?>')
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200446 1
447 let style_end = search('^</style>')
448 if style_start > 0 && style_end > 0
Bram Moolenaar8ada2cc2010-07-29 20:43:36 +0200449 let buf_styles = getline(style_start + 1, style_end - 1)
450 for a_style in buf_styles
451 if index(style, a_style) == -1
452 if diff_style_start == 0
453 if a_style =~ '\<Diff\(Change\|Text\|Add\|Delete\)'
454 let diff_style_start = len(style)-1
455 endif
456 endif
457 call insert(style, a_style, insert_index)
458 let insert_index += 1
459 endif
460 endfor
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100461 endif " }}}
Bram Moolenaar8ada2cc2010-07-29 20:43:36 +0200462
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100463 " everything new will get added before the diff styles so diff highlight
464 " properly overrides normal highlight
Bram Moolenaar8ada2cc2010-07-29 20:43:36 +0200465 if diff_style_start != 0
466 let insert_index = diff_style_start
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200467 endif
468
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200469 " Delete those parts that are not needed so we can include the rest into the
470 " resulting table.
471 1,/^<body.*\%(\n<!--.*-->\_s\+.*id='oneCharWidth'.*\_s\+.*id='oneInputWidth'.*\_s\+.*id='oneEmWidth'\)\?\zs/d_
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200472 $
473 ?</body>?,$d_
474 let temp = getline(1,'$')
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200475 " clean out id on the main content container because we already set it on
476 " the table
Bram Moolenaar31c31672013-06-26 13:28:14 +0200477 let temp[0] = substitute(temp[0], " id='vimCodeElement[^']*'", "", "")
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200478 " undo deletion of start and end part
479 " so we can later save the file as valid html
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200480 " TODO: restore using grabbed lines if undolevel is 1?
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200481 normal! 2u
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200482 if s:settings.use_css
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100483 call add(html, '<td><div>')
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200484 elseif s:settings.use_xhtml
485 call add(html, '<td nowrap="nowrap" valign="top"><div>')
486 else
487 call add(html, '<td nowrap valign="top"><div>')
488 endif
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200489 let html += temp
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200490 call add(html, '</div></td>')
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200491
492 " Close this buffer
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200493 " TODO: the comment above says we're going to allow saving the file
494 " later...but here we discard it?
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200495 quit!
496 endfor
497
Bram Moolenaar8ada2cc2010-07-29 20:43:36 +0200498 let html[body_line_num] = body_line
499
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200500 call add(html, '</tr>')
501 call add(html, '</table>')
Bram Moolenaar8ada2cc2010-07-29 20:43:36 +0200502 call add(html, s:body_end_line)
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200503 call add(html, '</html>')
504
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200505 " The generated HTML is admittedly ugly and takes a LONG time to fold.
506 " Make sure the user doesn't do syntax folding when loading a generated file,
507 " using a modeline.
508 call add(html, '<!-- vim: set foldmethod=manual : -->')
509
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200510 let i = 1
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200511 let name = "Diff" . (s:settings.use_xhtml ? ".xhtml" : ".html")
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200512 " Find an unused file name if current file name is already in use
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200513 while filereadable(name)
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200514 let name = substitute(name, '\d*\.x\?html$', '', '') . i . '.' . fnamemodify(copy(name), ":t:e")
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200515 let i += 1
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200516 endwhile
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100517
518 let s:ei_sav = &eventignore
519 set eventignore+=FileType
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200520 exe "topleft new " . name
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100521 let &eventignore=s:ei_sav
522 unlet s:ei_sav
523
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200524 setlocal modifiable
525
526 " just in case some user autocmd creates content in the new buffer, make sure
527 " it is empty before proceeding
528 %d
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100529
530 " set the fileencoding to match the charset we'll be using
531 let &l:fileencoding=s:settings.vim_encoding
532
533 " According to http://www.w3.org/TR/html4/charset.html#doc-char-set, the byte
534 " order mark is highly recommend on the web when using multibyte encodings. But,
535 " it is not a good idea to include it on UTF-8 files. Otherwise, let Vim
536 " determine when it is actually inserted.
537 if s:settings.vim_encoding == 'utf-8'
538 setlocal nobomb
539 else
540 setlocal bomb
541 endif
542
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200543 call append(0, html)
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200544
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200545 if len(style) > 0
546 1
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200547 let style_start = search('^</head>')-1
548
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200549 " add required javascript in reverse order so we can just call append again
550 " and again without adjusting {{{
551
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100552 let s:uses_script = s:settings.dynamic_folds || s:settings.line_ids
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +0100553
554 " insert script closing tag if needed
555 if s:uses_script
556 call append(style_start, [
557 \ '',
558 \ s:settings.use_xhtml ? '//]]>' : '-->',
559 \ "</script>"
560 \ ])
561 endif
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200562
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200563 " insert javascript to get IDs from line numbers, and to open a fold before
564 " jumping to any lines contained therein
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +0100565 if s:settings.line_ids
566 call append(style_start, [
567 \ " /* Always jump to new location even if the line was hidden inside a fold, or",
568 \ " * we corrected the raw number to a line ID.",
569 \ " */",
570 \ " if (lineElem) {",
571 \ " lineElem.scrollIntoView(true);",
572 \ " }",
573 \ " return true;",
574 \ "}",
575 \ "if ('onhashchange' in window) {",
576 \ " window.onhashchange = JumpToLine;",
577 \ "}"
578 \ ])
579
580 if s:settings.dynamic_folds
581 call append(style_start, [
582 \ "",
583 \ " /* navigate upwards in the DOM tree to open all folds containing the line */",
584 \ " var node = lineElem;",
585 \ " while (node && node.id != 'vimCodeElement".s:settings.id_suffix."')",
586 \ " {",
587 \ " if (node.className == 'closed-fold')",
588 \ " {",
589 \ " /* toggle open the fold ID (remove window ID) */",
590 \ " toggleFold(node.id.substr(4));",
591 \ " }",
592 \ " node = node.parentNode;",
593 \ " }",
594 \ ])
595 endif
596 endif
597
598 if s:settings.line_ids
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200599 call append(style_start, [
600 \ "",
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +0100601 \ "/* function to open any folds containing a jumped-to line before jumping to it */",
602 \ "function JumpToLine()",
603 \ "{",
604 \ " var lineNum;",
605 \ " lineNum = window.location.hash;",
606 \ " lineNum = lineNum.substr(1); /* strip off '#' */",
607 \ "",
608 \ " if (lineNum.indexOf('L') == -1) {",
609 \ " lineNum = 'L'+lineNum;",
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200610 \ " }",
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +0100611 \ " if (lineNum.indexOf('W') == -1) {",
612 \ " lineNum = 'W1'+lineNum;",
613 \ " }",
614 \ " var lineElem = document.getElementById(lineNum);"
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200615 \ ])
616 endif
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200617
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200618 " Insert javascript to toggle matching folds open and closed in all windows,
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200619 " if dynamic folding is active.
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200620 if s:settings.dynamic_folds
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200621 call append(style_start, [
Bram Moolenaar7c86f4c2010-07-18 14:07:22 +0200622 \ " function toggleFold(objID)",
623 \ " {",
624 \ " for (win_num = 1; win_num <= ".len(a:buf_list)."; win_num++)",
625 \ " {",
626 \ " var fold;",
627 \ ' fold = document.getElementById("win"+win_num+objID);',
628 \ " if(fold.className == 'closed-fold')",
629 \ " {",
630 \ " fold.className = 'open-fold';",
631 \ " }",
632 \ " else if (fold.className == 'open-fold')",
633 \ " {",
634 \ " fold.className = 'closed-fold';",
635 \ " }",
636 \ " }",
637 \ " }",
Bram Moolenaar7c86f4c2010-07-18 14:07:22 +0200638 \ ])
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200639 endif
640
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +0100641 if s:uses_script
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100642 " insert script tag if needed
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +0100643 call append(style_start, [
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100644 \ "<script" . (s:html5 ? "" : " type='text/javascript'") . ">",
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +0100645 \ s:settings.use_xhtml ? '//<![CDATA[' : "<!--"])
646 endif
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200647
648 " Insert styles from all the generated html documents and additional styles
649 " for the table-based layout of the side-by-side diff. The diff should take
650 " up the full browser window (but not more), and be static in size,
651 " horizontally scrollable when the lines are too long. Otherwise, the diff
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100652 " is pretty useless for really long lines. {{{
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200653 if s:settings.use_css
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200654 call append(style_start,
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100655 \ ['<style' . (s:html5 ? '' : 'type="text/css"') . '>']+
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200656 \ style+
657 \ [ s:settings.use_xhtml ? '' : '<!--',
658 \ 'table { table-layout: fixed; }',
659 \ 'html, body, table, tbody { width: 100%; margin: 0; padding: 0; }',
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100660 \ 'table, td, th { border: 1px solid; }',
661 \ 'td { vertical-align: top; }',
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200662 \ 'th, td { width: '.printf("%.1f",100.0/len(a:win_list)).'%; }',
663 \ 'td div { overflow: auto; }',
664 \ s:settings.use_xhtml ? '' : '-->',
665 \ '</style>'
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100666 \])
667 endif "}}}
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200668 endif
Bram Moolenaar8df7f882010-08-13 11:30:02 +0200669
670 let &paste = s:old_paste
671 let &magic = s:old_magic
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100672endfunc "}}}
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200673
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200674" Gets a single user option and sets it in the passed-in Dict, or gives it the
675" default value if the option doesn't actually exist.
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100676func! tohtml#GetOption(settings, option, default) "{{{
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200677 if exists('g:html_'.a:option)
678 let a:settings[a:option] = g:html_{a:option}
679 else
680 let a:settings[a:option] = a:default
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200681 endif
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100682endfunc "}}}
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200683
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200684" returns a Dict containing the values of all user options for 2html, including
685" default values for those not given an explicit value by the user. Discards the
686" html_ prefix of the option for nicer looking code.
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100687func! tohtml#GetUserSettings() "{{{
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200688 if exists('s:settings')
689 " just restore the known options if we've already retrieved them
690 return s:settings
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200691 else
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200692 " otherwise figure out which options are set
693 let user_settings = {}
694
695 " Define the correct option if the old option name exists and we haven't
Bram Moolenaar6c391a72021-09-09 21:55:11 +0200696 " already defined the correct one. Maybe I'll put out a warning message about
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200697 " this sometime and remove the old option entirely at some even later time,
698 " but for now just silently accept the old option.
699 if exists('g:use_xhtml') && !exists("g:html_use_xhtml")
700 let g:html_use_xhtml = g:use_xhtml
701 endif
702
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100703 " get current option settings with appropriate defaults {{{
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100704 call tohtml#GetOption(user_settings, 'no_progress', !has("statusline") )
705 call tohtml#GetOption(user_settings, 'diff_one_file', 0 )
706 call tohtml#GetOption(user_settings, 'number_lines', &number )
707 call tohtml#GetOption(user_settings, 'pre_wrap', &wrap )
708 call tohtml#GetOption(user_settings, 'use_css', 1 )
709 call tohtml#GetOption(user_settings, 'ignore_conceal', 0 )
710 call tohtml#GetOption(user_settings, 'ignore_folding', 0 )
711 call tohtml#GetOption(user_settings, 'dynamic_folds', 0 )
712 call tohtml#GetOption(user_settings, 'no_foldcolumn', user_settings.ignore_folding)
713 call tohtml#GetOption(user_settings, 'hover_unfold', 0 )
714 call tohtml#GetOption(user_settings, 'no_pre', 0 )
Bram Moolenaar6ebe4f92022-10-28 20:47:54 +0100715 call tohtml#GetOption(user_settings, 'no_doc', 0 )
716 call tohtml#GetOption(user_settings, 'no_links', 0 )
717 call tohtml#GetOption(user_settings, 'no_modeline', 0 )
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100718 call tohtml#GetOption(user_settings, 'no_invalid', 0 )
719 call tohtml#GetOption(user_settings, 'whole_filler', 0 )
720 call tohtml#GetOption(user_settings, 'use_xhtml', 0 )
721 call tohtml#GetOption(user_settings, 'line_ids', user_settings.number_lines )
722 call tohtml#GetOption(user_settings, 'use_input_for_pc', 'fallback')
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100723 " }}}
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200724
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100725 " override those settings that need it {{{
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200726
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200727 " hover opening implies dynamic folding
728 if user_settings.hover_unfold
729 let user_settings.dynamic_folds = 1
730 endif
731
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200732 " ignore folding overrides dynamic folding
733 if user_settings.ignore_folding && user_settings.dynamic_folds
734 let user_settings.dynamic_folds = 0
735 let user_settings.hover_unfold = 0
736 endif
737
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200738 " dynamic folding with no foldcolumn implies hover opens
739 if user_settings.dynamic_folds && user_settings.no_foldcolumn
740 let user_settings.hover_unfold = 1
741 endif
742
743 " dynamic folding implies css
744 if user_settings.dynamic_folds
745 let user_settings.use_css = 1
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200746 else
747 let user_settings.no_foldcolumn = 1 " won't do anything but for consistency and for the test suite
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200748 endif
749
750 " if we're not using CSS we cannot use a pre section because <font> tags
751 " aren't allowed inside a <pre> block
752 if !user_settings.use_css
753 let user_settings.no_pre = 1
Bram Moolenaar8e5af3e2011-04-28 19:02:44 +0200754 endif
755
756 " pre_wrap doesn't do anything if not using pre or not using CSS
757 if user_settings.no_pre || !user_settings.use_css
Bram Moolenaar6ebe4f92022-10-28 20:47:54 +0100758 let user_settings.pre_wrap = 0
Bram Moolenaar8e5af3e2011-04-28 19:02:44 +0200759 endif
760 "}}}
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200761
Bram Moolenaar2a8a3ec2011-01-08 16:06:37 +0100762 " set up expand_tabs option after all the overrides so we know the
763 " appropriate defaults {{{
764 if user_settings.no_pre == 0
765 call tohtml#GetOption(user_settings,
766 \ 'expand_tabs',
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +0100767 \ &expandtab || &ts != 8 || &vts != '' || user_settings.number_lines ||
Bram Moolenaar2a8a3ec2011-01-08 16:06:37 +0100768 \ (user_settings.dynamic_folds && !user_settings.no_foldcolumn))
769 else
770 let user_settings.expand_tabs = 1
771 endif
772 " }}}
773
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200774 " textual options
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100775 if exists("g:html_use_encoding") "{{{
776 " user specified the desired MIME charset, figure out proper
777 " 'fileencoding' from it or warn the user if we cannot
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200778 let user_settings.encoding = g:html_use_encoding
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100779 let user_settings.vim_encoding = tohtml#EncodingFromCharset(g:html_use_encoding)
780 if user_settings.vim_encoding == ''
781 echohl WarningMsg
782 echomsg "TOhtml: file encoding for"
783 \ g:html_use_encoding
784 \ "unknown, please set 'fileencoding'"
785 echohl None
786 endif
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200787 else
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100788 " Figure out proper MIME charset from 'fileencoding' if possible
Bram Moolenaar8e5af3e2011-04-28 19:02:44 +0200789 if &l:fileencoding != ''
790 " If the buffer is not a "normal" type, the 'fileencoding' value may not
791 " be trusted; since the buffer should not be written the fileencoding is
792 " not intended to be used.
793 if &l:buftype=='' || &l:buftype==?'help'
794 let user_settings.vim_encoding = &l:fileencoding
795 call tohtml#CharsetFromEncoding(user_settings)
796 else
797 let user_settings.encoding = '' " trigger detection using &encoding
798 endif
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200799 endif
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100800
801 " else from 'encoding' if possible
802 if &l:fileencoding == '' || user_settings.encoding == ''
803 let user_settings.vim_encoding = &encoding
804 call tohtml#CharsetFromEncoding(user_settings)
805 endif
806
807 " else default to UTF-8 and warn user
808 if user_settings.encoding == ''
809 let user_settings.vim_encoding = 'utf-8'
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200810 let user_settings.encoding = 'UTF-8'
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100811 echohl WarningMsg
812 echomsg "TOhtml: couldn't determine MIME charset, using UTF-8"
813 echohl None
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200814 endif
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100815 endif "}}}
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200816
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200817 " Default to making nothing uncopyable, because we default to
818 " not-standards way of doing things, and also because Microsoft Word and
819 " others paste the <input> elements anyway.
820 "
821 " html_prevent_copy only has an effect when using CSS.
822 "
823 " All options:
824 " f - fold column
825 " n - line numbers (also within fold text)
826 " t - fold text
827 " d - diff filler
828 " c - concealed text (reserved future)
829 " l - listchars (reserved possible future)
830 " s - signs (reserved possible future)
831 "
832 " Normal text is always selectable.
833 let user_settings.prevent_copy = ""
834 if user_settings.use_css
835 if exists("g:html_prevent_copy")
836 if user_settings.dynamic_folds && !user_settings.no_foldcolumn && g:html_prevent_copy =~# 'f'
837 let user_settings.prevent_copy .= 'f'
838 endif
839 if user_settings.number_lines && g:html_prevent_copy =~# 'n'
840 let user_settings.prevent_copy .= 'n'
841 endif
842 if &diff && g:html_prevent_copy =~# 'd'
843 let user_settings.prevent_copy .= 'd'
844 endif
845 if !user_settings.ignore_folding && g:html_prevent_copy =~# 't'
846 let user_settings.prevent_copy .= 't'
847 endif
848 else
849 let user_settings.prevent_copy = ""
850 endif
851 endif
852 if empty(user_settings.prevent_copy)
853 let user_settings.no_invalid = 0
854 endif
855
Bram Moolenaar09c6f262019-11-17 15:55:14 +0100856 " enforce valid values for use_input_for_pc
857 if user_settings.use_input_for_pc !~# 'fallback\|none\|all'
858 let user_settings.use_input_for_pc = 'fallback'
859 echohl WarningMsg
860 echomsg '2html: "' . g:html_use_input_for_pc . '" is not valid for g:html_use_input_for_pc'
861 echomsg '2html: defaulting to "' . user_settings.use_input_for_pc . '"'
862 echohl None
863 sleep 3
864 endif
865
Bram Moolenaar31c31672013-06-26 13:28:14 +0200866 if exists('g:html_id_expr')
867 let user_settings.id_suffix = eval(g:html_id_expr)
868 if user_settings.id_suffix !~ '^[-_:.A-Za-z0-9]*$'
869 echohl WarningMsg
870 echomsg '2html: g:html_id_expr evaluated to invalid string for HTML id attributes'
871 echomsg '2html: Omitting user-specified suffix'
872 echohl None
873 sleep 3
874 let user_settings.id_suffix=""
875 endif
876 else
877 let user_settings.id_suffix=""
878 endif
879
Bram Moolenaarbebca9d2010-08-07 15:47:30 +0200880 " TODO: font
881
Bram Moolenaar076e8b22010-08-05 21:54:00 +0200882 return user_settings
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200883 endif
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100884endfunc "}}}
885
886" get the proper HTML charset name from a Vim encoding option.
887function! tohtml#CharsetFromEncoding(settings) "{{{
888 let l:vim_encoding = a:settings.vim_encoding
889 if exists('g:html_charset_override') && has_key(g:html_charset_override, l:vim_encoding)
890 let a:settings.encoding = g:html_charset_override[l:vim_encoding]
891 else
892 if l:vim_encoding =~ '^8bit\|^2byte'
893 " 8bit- and 2byte- prefixes are to indicate encodings available on the
894 " system that Vim will convert with iconv(), look up just the encoding name,
895 " not Vim's prefix.
896 let l:vim_encoding = substitute(l:vim_encoding, '^8bit-\|^2byte-', '', '')
897 endif
898 if has_key(g:tohtml#encoding_to_charset, l:vim_encoding)
899 let a:settings.encoding = g:tohtml#encoding_to_charset[l:vim_encoding]
900 else
901 let a:settings.encoding = ""
902 endif
903 endif
904 if a:settings.encoding != ""
905 let l:vim_encoding = tohtml#EncodingFromCharset(a:settings.encoding)
906 if l:vim_encoding != ""
907 " if the Vim encoding to HTML encoding conversion is set up (by default or
908 " by the user) to convert to a different encoding, we need to also change
909 " the Vim encoding of the new buffer
910 let a:settings.vim_encoding = l:vim_encoding
911 endif
912 endif
913endfun "}}}
914
915" Get the proper Vim encoding option setting from an HTML charset name.
916function! tohtml#EncodingFromCharset(encoding) "{{{
917 if exists('g:html_encoding_override') && has_key(g:html_encoding_override, a:encoding)
918 return g:html_encoding_override[a:encoding]
919 elseif has_key(g:tohtml#charset_to_encoding, tolower(a:encoding))
920 return g:tohtml#charset_to_encoding[tolower(a:encoding)]
921 else
922 return ""
923 endif
924endfun "}}}
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200925
926let &cpo = s:cpo_sav
927unlet s:cpo_sav
928
929" Make sure any patches will probably use consistent indent
Bram Moolenaar166af9b2010-11-16 20:34:40 +0100930" vim: ts=8 sw=2 sts=2 noet fdm=marker