xref: /vim-8.2.3635/runtime/autoload/tohtml.vim (revision 6c391a74)
1b02cbe34SBram Moolenaar" Vim autoload file for the tohtml plugin.
2349b2fb0SBram Moolenaar" Maintainer: Ben Fritz <[email protected]>
309c6f265SBram Moolenaar" Last Change: 2019 Aug 16
4b02cbe34SBram Moolenaar"
5349b2fb0SBram Moolenaar" Additional contributors:
6349b2fb0SBram Moolenaar"
7349b2fb0SBram Moolenaar"	      Original by Bram Moolenaar <[email protected]>
8b02cbe34SBram Moolenaar"	      Diff2HTML() added by Christian Brabandt <[email protected]>
9349b2fb0SBram Moolenaar"
10349b2fb0SBram Moolenaar"	      See Mercurial change logs for more!
11349b2fb0SBram Moolenaar
12349b2fb0SBram Moolenaar" this file uses line continuations
13349b2fb0SBram Moolenaarlet s:cpo_sav = &cpo
146c35beaaSBram Moolenaarset cpo&vim
15b02cbe34SBram Moolenaar
16166af9bbSBram Moolenaar" Automatically find charsets from all encodings supported natively by Vim. With
17166af9bbSBram Moolenaar" the 8bit- and 2byte- prefixes, Vim can actually support more encodings than
18166af9bbSBram Moolenaar" this. Let the user specify these however since they won't be supported on
198e5af3e5SBram Moolenaar" every system.
20166af9bbSBram Moolenaar"
21166af9bbSBram Moolenaar" Note, not all of Vim's supported encodings have a charset to use.
22166af9bbSBram Moolenaar"
23166af9bbSBram Moolenaar" Names in this list are from:
24166af9bbSBram Moolenaar"   http://www.iana.org/assignments/character-sets
25166af9bbSBram Moolenaar" g:tohtml#encoding_to_charset: {{{
26166af9bbSBram Moolenaarlet g:tohtml#encoding_to_charset = {
27166af9bbSBram Moolenaar      \ 'latin1' : 'ISO-8859-1',
28166af9bbSBram Moolenaar      \ 'iso-8859-2' : 'ISO-8859-2',
29166af9bbSBram Moolenaar      \ 'iso-8859-3' : 'ISO-8859-3',
30166af9bbSBram Moolenaar      \ 'iso-8859-4' : 'ISO-8859-4',
31166af9bbSBram Moolenaar      \ 'iso-8859-5' : 'ISO-8859-5',
32166af9bbSBram Moolenaar      \ 'iso-8859-6' : 'ISO-8859-6',
33166af9bbSBram Moolenaar      \ 'iso-8859-7' : 'ISO-8859-7',
34166af9bbSBram Moolenaar      \ 'iso-8859-8' : 'ISO-8859-8',
35166af9bbSBram Moolenaar      \ 'iso-8859-9' : 'ISO-8859-9',
36166af9bbSBram Moolenaar      \ 'iso-8859-10' : '',
37166af9bbSBram Moolenaar      \ 'iso-8859-13' : 'ISO-8859-13',
38166af9bbSBram Moolenaar      \ 'iso-8859-14' : '',
39166af9bbSBram Moolenaar      \ 'iso-8859-15' : 'ISO-8859-15',
40166af9bbSBram Moolenaar      \ 'koi8-r' : 'KOI8-R',
41166af9bbSBram Moolenaar      \ 'koi8-u' : 'KOI8-U',
42166af9bbSBram Moolenaar      \ 'macroman' : 'macintosh',
43166af9bbSBram Moolenaar      \ 'cp437' : '',
44166af9bbSBram Moolenaar      \ 'cp775' : '',
45166af9bbSBram Moolenaar      \ 'cp850' : '',
46166af9bbSBram Moolenaar      \ 'cp852' : '',
47166af9bbSBram Moolenaar      \ 'cp855' : '',
48166af9bbSBram Moolenaar      \ 'cp857' : '',
49166af9bbSBram Moolenaar      \ 'cp860' : '',
50166af9bbSBram Moolenaar      \ 'cp861' : '',
51166af9bbSBram Moolenaar      \ 'cp862' : '',
52166af9bbSBram Moolenaar      \ 'cp863' : '',
53166af9bbSBram Moolenaar      \ 'cp865' : '',
54166af9bbSBram Moolenaar      \ 'cp866' : 'IBM866',
55166af9bbSBram Moolenaar      \ 'cp869' : '',
56166af9bbSBram Moolenaar      \ 'cp874' : '',
57166af9bbSBram Moolenaar      \ 'cp1250' : 'windows-1250',
58166af9bbSBram Moolenaar      \ 'cp1251' : 'windows-1251',
59166af9bbSBram Moolenaar      \ 'cp1253' : 'windows-1253',
60166af9bbSBram Moolenaar      \ 'cp1254' : 'windows-1254',
61166af9bbSBram Moolenaar      \ 'cp1255' : 'windows-1255',
62166af9bbSBram Moolenaar      \ 'cp1256' : 'windows-1256',
63166af9bbSBram Moolenaar      \ 'cp1257' : 'windows-1257',
64166af9bbSBram Moolenaar      \ 'cp1258' : 'windows-1258',
65166af9bbSBram Moolenaar      \ 'euc-jp' : 'EUC-JP',
66166af9bbSBram Moolenaar      \ 'sjis' : 'Shift_JIS',
67166af9bbSBram Moolenaar      \ 'cp932' : 'Shift_JIS',
68166af9bbSBram Moolenaar      \ 'cp949' : '',
69166af9bbSBram Moolenaar      \ 'euc-kr' : 'EUC-KR',
70166af9bbSBram Moolenaar      \ 'cp936' : 'GBK',
71166af9bbSBram Moolenaar      \ 'euc-cn' : 'GB2312',
72166af9bbSBram Moolenaar      \ 'big5' : 'Big5',
73166af9bbSBram Moolenaar      \ 'cp950' : 'Big5',
74166af9bbSBram Moolenaar      \ 'utf-8' : 'UTF-8',
75166af9bbSBram Moolenaar      \ 'ucs-2' : 'UTF-8',
76166af9bbSBram Moolenaar      \ 'ucs-2le' : 'UTF-8',
77166af9bbSBram Moolenaar      \ 'utf-16' : 'UTF-8',
78166af9bbSBram Moolenaar      \ 'utf-16le' : 'UTF-8',
79166af9bbSBram Moolenaar      \ 'ucs-4' : 'UTF-8',
80166af9bbSBram Moolenaar      \ 'ucs-4le' : 'UTF-8',
81166af9bbSBram Moolenaar      \ }
82166af9bbSBram Moolenaarlockvar g:tohtml#encoding_to_charset
83166af9bbSBram Moolenaar" Notes:
84166af9bbSBram Moolenaar"   1. All UCS/UTF are converted to UTF-8 because it is much better supported
85166af9bbSBram Moolenaar"   2. Any blank spaces are there because Vim supports it but at least one major
86166af9bbSBram Moolenaar"      web browser does not according to http://wiki.whatwg.org/wiki/Web_Encodings.
87166af9bbSBram Moolenaar" }}}
88166af9bbSBram Moolenaar
89166af9bbSBram Moolenaar" Only automatically find encodings supported natively by Vim, let the user
90166af9bbSBram Moolenaar" specify the encoding if it's not natively supported. This function is only
91166af9bbSBram Moolenaar" used when the user specifies the charset, they better know what they are
92166af9bbSBram Moolenaar" doing!
93166af9bbSBram Moolenaar"
94166af9bbSBram Moolenaar" Names in this list are from:
95166af9bbSBram Moolenaar"   http://www.iana.org/assignments/character-sets
96166af9bbSBram Moolenaar" g:tohtml#charset_to_encoding: {{{
97166af9bbSBram Moolenaarlet g:tohtml#charset_to_encoding = {
98166af9bbSBram Moolenaar      \ 'iso_8859-1:1987' : 'latin1',
99166af9bbSBram Moolenaar      \ 'iso-ir-100' : 'latin1',
100166af9bbSBram Moolenaar      \ 'iso_8859-1' : 'latin1',
101166af9bbSBram Moolenaar      \ 'iso-8859-1' : 'latin1',
102166af9bbSBram Moolenaar      \ 'latin1' : 'latin1',
103166af9bbSBram Moolenaar      \ 'l1' : 'latin1',
104166af9bbSBram Moolenaar      \ 'ibm819' : 'latin1',
105166af9bbSBram Moolenaar      \ 'cp819' : 'latin1',
106166af9bbSBram Moolenaar      \ 'csisolatin1' : 'latin1',
107166af9bbSBram Moolenaar      \ 'iso_8859-2:1987' : 'iso-8859-2',
108166af9bbSBram Moolenaar      \ 'iso-ir-101' : 'iso-8859-2',
109166af9bbSBram Moolenaar      \ 'iso_8859-2' : 'iso-8859-2',
110166af9bbSBram Moolenaar      \ 'iso-8859-2' : 'iso-8859-2',
111166af9bbSBram Moolenaar      \ 'latin2' : 'iso-8859-2',
112166af9bbSBram Moolenaar      \ 'l2' : 'iso-8859-2',
113166af9bbSBram Moolenaar      \ 'csisolatin2' : 'iso-8859-2',
114166af9bbSBram Moolenaar      \ 'iso_8859-3:1988' : 'iso-8859-3',
115166af9bbSBram Moolenaar      \ 'iso-ir-109' : 'iso-8859-3',
116166af9bbSBram Moolenaar      \ 'iso_8859-3' : 'iso-8859-3',
117166af9bbSBram Moolenaar      \ 'iso-8859-3' : 'iso-8859-3',
118166af9bbSBram Moolenaar      \ 'latin3' : 'iso-8859-3',
119166af9bbSBram Moolenaar      \ 'l3' : 'iso-8859-3',
120166af9bbSBram Moolenaar      \ 'csisolatin3' : 'iso-8859-3',
121166af9bbSBram Moolenaar      \ 'iso_8859-4:1988' : 'iso-8859-4',
122166af9bbSBram Moolenaar      \ 'iso-ir-110' : 'iso-8859-4',
123166af9bbSBram Moolenaar      \ 'iso_8859-4' : 'iso-8859-4',
124166af9bbSBram Moolenaar      \ 'iso-8859-4' : 'iso-8859-4',
125166af9bbSBram Moolenaar      \ 'latin4' : 'iso-8859-4',
126166af9bbSBram Moolenaar      \ 'l4' : 'iso-8859-4',
127166af9bbSBram Moolenaar      \ 'csisolatin4' : 'iso-8859-4',
128166af9bbSBram Moolenaar      \ 'iso_8859-5:1988' : 'iso-8859-5',
129166af9bbSBram Moolenaar      \ 'iso-ir-144' : 'iso-8859-5',
130166af9bbSBram Moolenaar      \ 'iso_8859-5' : 'iso-8859-5',
131166af9bbSBram Moolenaar      \ 'iso-8859-5' : 'iso-8859-5',
132166af9bbSBram Moolenaar      \ 'cyrillic' : 'iso-8859-5',
133166af9bbSBram Moolenaar      \ 'csisolatincyrillic' : 'iso-8859-5',
134166af9bbSBram Moolenaar      \ 'iso_8859-6:1987' : 'iso-8859-6',
135166af9bbSBram Moolenaar      \ 'iso-ir-127' : 'iso-8859-6',
136166af9bbSBram Moolenaar      \ 'iso_8859-6' : 'iso-8859-6',
137166af9bbSBram Moolenaar      \ 'iso-8859-6' : 'iso-8859-6',
138166af9bbSBram Moolenaar      \ 'ecma-114' : 'iso-8859-6',
139166af9bbSBram Moolenaar      \ 'asmo-708' : 'iso-8859-6',
140166af9bbSBram Moolenaar      \ 'arabic' : 'iso-8859-6',
141166af9bbSBram Moolenaar      \ 'csisolatinarabic' : 'iso-8859-6',
142166af9bbSBram Moolenaar      \ 'iso_8859-7:1987' : 'iso-8859-7',
143166af9bbSBram Moolenaar      \ 'iso-ir-126' : 'iso-8859-7',
144166af9bbSBram Moolenaar      \ 'iso_8859-7' : 'iso-8859-7',
145166af9bbSBram Moolenaar      \ 'iso-8859-7' : 'iso-8859-7',
146166af9bbSBram Moolenaar      \ 'elot_928' : 'iso-8859-7',
147166af9bbSBram Moolenaar      \ 'ecma-118' : 'iso-8859-7',
148166af9bbSBram Moolenaar      \ 'greek' : 'iso-8859-7',
149166af9bbSBram Moolenaar      \ 'greek8' : 'iso-8859-7',
150166af9bbSBram Moolenaar      \ 'csisolatingreek' : 'iso-8859-7',
151166af9bbSBram Moolenaar      \ 'iso_8859-8:1988' : 'iso-8859-8',
152166af9bbSBram Moolenaar      \ 'iso-ir-138' : 'iso-8859-8',
153166af9bbSBram Moolenaar      \ 'iso_8859-8' : 'iso-8859-8',
154166af9bbSBram Moolenaar      \ 'iso-8859-8' : 'iso-8859-8',
155166af9bbSBram Moolenaar      \ 'hebrew' : 'iso-8859-8',
156166af9bbSBram Moolenaar      \ 'csisolatinhebrew' : 'iso-8859-8',
157166af9bbSBram Moolenaar      \ 'iso_8859-9:1989' : 'iso-8859-9',
158166af9bbSBram Moolenaar      \ 'iso-ir-148' : 'iso-8859-9',
159166af9bbSBram Moolenaar      \ 'iso_8859-9' : 'iso-8859-9',
160166af9bbSBram Moolenaar      \ 'iso-8859-9' : 'iso-8859-9',
161166af9bbSBram Moolenaar      \ 'latin5' : 'iso-8859-9',
162166af9bbSBram Moolenaar      \ 'l5' : 'iso-8859-9',
163166af9bbSBram Moolenaar      \ 'csisolatin5' : 'iso-8859-9',
164166af9bbSBram Moolenaar      \ 'iso-8859-10' : 'iso-8859-10',
165166af9bbSBram Moolenaar      \ 'iso-ir-157' : 'iso-8859-10',
166166af9bbSBram Moolenaar      \ 'l6' : 'iso-8859-10',
167166af9bbSBram Moolenaar      \ 'iso_8859-10:1992' : 'iso-8859-10',
168166af9bbSBram Moolenaar      \ 'csisolatin6' : 'iso-8859-10',
169166af9bbSBram Moolenaar      \ 'latin6' : 'iso-8859-10',
170166af9bbSBram Moolenaar      \ 'iso-8859-13' : 'iso-8859-13',
171166af9bbSBram Moolenaar      \ 'iso-8859-14' : 'iso-8859-14',
172166af9bbSBram Moolenaar      \ 'iso-ir-199' : 'iso-8859-14',
173166af9bbSBram Moolenaar      \ 'iso_8859-14:1998' : 'iso-8859-14',
174166af9bbSBram Moolenaar      \ 'iso_8859-14' : 'iso-8859-14',
175166af9bbSBram Moolenaar      \ 'latin8' : 'iso-8859-14',
176166af9bbSBram Moolenaar      \ 'iso-celtic' : 'iso-8859-14',
177166af9bbSBram Moolenaar      \ 'l8' : 'iso-8859-14',
178166af9bbSBram Moolenaar      \ 'iso-8859-15' : 'iso-8859-15',
179166af9bbSBram Moolenaar      \ 'iso_8859-15' : 'iso-8859-15',
180166af9bbSBram Moolenaar      \ 'latin-9' : 'iso-8859-15',
181166af9bbSBram Moolenaar      \ 'koi8-r' : 'koi8-r',
182166af9bbSBram Moolenaar      \ 'cskoi8r' : 'koi8-r',
183166af9bbSBram Moolenaar      \ 'koi8-u' : 'koi8-u',
184166af9bbSBram Moolenaar      \ 'macintosh' : 'macroman',
185166af9bbSBram Moolenaar      \ 'mac' : 'macroman',
186166af9bbSBram Moolenaar      \ 'csmacintosh' : 'macroman',
187166af9bbSBram Moolenaar      \ 'ibm437' : 'cp437',
188166af9bbSBram Moolenaar      \ 'cp437' : 'cp437',
189166af9bbSBram Moolenaar      \ '437' : 'cp437',
190166af9bbSBram Moolenaar      \ 'cspc8codepage437' : 'cp437',
191166af9bbSBram Moolenaar      \ 'ibm775' : 'cp775',
192166af9bbSBram Moolenaar      \ 'cp775' : 'cp775',
193166af9bbSBram Moolenaar      \ 'cspc775baltic' : 'cp775',
194166af9bbSBram Moolenaar      \ 'ibm850' : 'cp850',
195166af9bbSBram Moolenaar      \ 'cp850' : 'cp850',
196166af9bbSBram Moolenaar      \ '850' : 'cp850',
197166af9bbSBram Moolenaar      \ 'cspc850multilingual' : 'cp850',
198166af9bbSBram Moolenaar      \ 'ibm852' : 'cp852',
199166af9bbSBram Moolenaar      \ 'cp852' : 'cp852',
200166af9bbSBram Moolenaar      \ '852' : 'cp852',
201166af9bbSBram Moolenaar      \ 'cspcp852' : 'cp852',
202166af9bbSBram Moolenaar      \ 'ibm855' : 'cp855',
203166af9bbSBram Moolenaar      \ 'cp855' : 'cp855',
204166af9bbSBram Moolenaar      \ '855' : 'cp855',
205166af9bbSBram Moolenaar      \ 'csibm855' : 'cp855',
206166af9bbSBram Moolenaar      \ 'ibm857' : 'cp857',
207166af9bbSBram Moolenaar      \ 'cp857' : 'cp857',
208166af9bbSBram Moolenaar      \ '857' : 'cp857',
209166af9bbSBram Moolenaar      \ 'csibm857' : 'cp857',
210166af9bbSBram Moolenaar      \ 'ibm860' : 'cp860',
211166af9bbSBram Moolenaar      \ 'cp860' : 'cp860',
212166af9bbSBram Moolenaar      \ '860' : 'cp860',
213166af9bbSBram Moolenaar      \ 'csibm860' : 'cp860',
214166af9bbSBram Moolenaar      \ 'ibm861' : 'cp861',
215166af9bbSBram Moolenaar      \ 'cp861' : 'cp861',
216166af9bbSBram Moolenaar      \ '861' : 'cp861',
217166af9bbSBram Moolenaar      \ 'cp-is' : 'cp861',
218166af9bbSBram Moolenaar      \ 'csibm861' : 'cp861',
219166af9bbSBram Moolenaar      \ 'ibm862' : 'cp862',
220166af9bbSBram Moolenaar      \ 'cp862' : 'cp862',
221166af9bbSBram Moolenaar      \ '862' : 'cp862',
222166af9bbSBram Moolenaar      \ 'cspc862latinhebrew' : 'cp862',
223166af9bbSBram Moolenaar      \ 'ibm863' : 'cp863',
224166af9bbSBram Moolenaar      \ 'cp863' : 'cp863',
225166af9bbSBram Moolenaar      \ '863' : 'cp863',
226166af9bbSBram Moolenaar      \ 'csibm863' : 'cp863',
227166af9bbSBram Moolenaar      \ 'ibm865' : 'cp865',
228166af9bbSBram Moolenaar      \ 'cp865' : 'cp865',
229166af9bbSBram Moolenaar      \ '865' : 'cp865',
230166af9bbSBram Moolenaar      \ 'csibm865' : 'cp865',
231166af9bbSBram Moolenaar      \ 'ibm866' : 'cp866',
232166af9bbSBram Moolenaar      \ 'cp866' : 'cp866',
233166af9bbSBram Moolenaar      \ '866' : 'cp866',
234166af9bbSBram Moolenaar      \ 'csibm866' : 'cp866',
235166af9bbSBram Moolenaar      \ 'ibm869' : 'cp869',
236166af9bbSBram Moolenaar      \ 'cp869' : 'cp869',
237166af9bbSBram Moolenaar      \ '869' : 'cp869',
238166af9bbSBram Moolenaar      \ 'cp-gr' : 'cp869',
239166af9bbSBram Moolenaar      \ 'csibm869' : 'cp869',
240166af9bbSBram Moolenaar      \ 'windows-1250' : 'cp1250',
241166af9bbSBram Moolenaar      \ 'windows-1251' : 'cp1251',
242166af9bbSBram Moolenaar      \ 'windows-1253' : 'cp1253',
243166af9bbSBram Moolenaar      \ 'windows-1254' : 'cp1254',
244166af9bbSBram Moolenaar      \ 'windows-1255' : 'cp1255',
245166af9bbSBram Moolenaar      \ 'windows-1256' : 'cp1256',
246166af9bbSBram Moolenaar      \ 'windows-1257' : 'cp1257',
247166af9bbSBram Moolenaar      \ 'windows-1258' : 'cp1258',
248166af9bbSBram Moolenaar      \ 'extended_unix_code_packed_format_for_japanese' : 'euc-jp',
249166af9bbSBram Moolenaar      \ 'cseucpkdfmtjapanese' : 'euc-jp',
250166af9bbSBram Moolenaar      \ 'euc-jp' : 'euc-jp',
251166af9bbSBram Moolenaar      \ 'shift_jis' : 'sjis',
252166af9bbSBram Moolenaar      \ 'ms_kanji' : 'sjis',
253166af9bbSBram Moolenaar      \ 'sjis' : 'sjis',
254166af9bbSBram Moolenaar      \ 'csshiftjis' : 'sjis',
255166af9bbSBram Moolenaar      \ 'ibm-thai' : 'cp874',
256166af9bbSBram Moolenaar      \ 'csibmthai' : 'cp874',
257166af9bbSBram Moolenaar      \ 'ks_c_5601-1987' : 'cp949',
258166af9bbSBram Moolenaar      \ 'iso-ir-149' : 'cp949',
259166af9bbSBram Moolenaar      \ 'ks_c_5601-1989' : 'cp949',
260166af9bbSBram Moolenaar      \ 'ksc_5601' : 'cp949',
261166af9bbSBram Moolenaar      \ 'korean' : 'cp949',
262166af9bbSBram Moolenaar      \ 'csksc56011987' : 'cp949',
263166af9bbSBram Moolenaar      \ 'euc-kr' : 'euc-kr',
264166af9bbSBram Moolenaar      \ 'cseuckr' : 'euc-kr',
265166af9bbSBram Moolenaar      \ 'gbk' : 'cp936',
266166af9bbSBram Moolenaar      \ 'cp936' : 'cp936',
267166af9bbSBram Moolenaar      \ 'ms936' : 'cp936',
268166af9bbSBram Moolenaar      \ 'windows-936' : 'cp936',
269166af9bbSBram Moolenaar      \ 'gb_2312-80' : 'euc-cn',
270166af9bbSBram Moolenaar      \ 'iso-ir-58' : 'euc-cn',
271166af9bbSBram Moolenaar      \ 'chinese' : 'euc-cn',
272166af9bbSBram Moolenaar      \ 'csiso58gb231280' : 'euc-cn',
273166af9bbSBram Moolenaar      \ 'big5' : 'big5',
274166af9bbSBram Moolenaar      \ 'csbig5' : 'big5',
275166af9bbSBram Moolenaar      \ 'utf-8' : 'utf-8',
276166af9bbSBram Moolenaar      \ 'iso-10646-ucs-2' : 'ucs-2',
277166af9bbSBram Moolenaar      \ 'csunicode' : 'ucs-2',
278166af9bbSBram Moolenaar      \ 'utf-16' : 'utf-16',
279166af9bbSBram Moolenaar      \ 'utf-16be' : 'utf-16',
280166af9bbSBram Moolenaar      \ 'utf-16le' : 'utf-16le',
281166af9bbSBram Moolenaar      \ 'utf-32' : 'ucs-4',
282166af9bbSBram Moolenaar      \ 'utf-32be' : 'ucs-4',
283166af9bbSBram Moolenaar      \ 'utf-32le' : 'ucs-4le',
284166af9bbSBram Moolenaar      \ 'iso-10646-ucs-4' : 'ucs-4',
285166af9bbSBram Moolenaar      \ 'csucs4' : 'ucs-4'
286166af9bbSBram Moolenaar      \ }
287166af9bbSBram Moolenaarlockvar g:tohtml#charset_to_encoding
288166af9bbSBram Moolenaar"}}}
289166af9bbSBram Moolenaar
290166af9bbSBram Moolenaarfunc! tohtml#Convert2HTML(line1, line2) "{{{
291076e8b2aSBram Moolenaar  let s:settings = tohtml#GetUserSettings()
292349b2fb0SBram Moolenaar
293166af9bbSBram Moolenaar  if !&diff || s:settings.diff_one_file "{{{
294b02cbe34SBram Moolenaar    if a:line2 >= a:line1
295b02cbe34SBram Moolenaar      let g:html_start_line = a:line1
296b02cbe34SBram Moolenaar      let g:html_end_line = a:line2
297b02cbe34SBram Moolenaar    else
298b02cbe34SBram Moolenaar      let g:html_start_line = a:line2
299b02cbe34SBram Moolenaar      let g:html_end_line = a:line1
300b02cbe34SBram Moolenaar    endif
301166af9bbSBram Moolenaar    runtime syntax/2html.vim "}}}
302166af9bbSBram Moolenaar  else "{{{
303b02cbe34SBram Moolenaar    let win_list = []
304b02cbe34SBram Moolenaar    let buf_list = []
30560cce2fbSBram Moolenaar    windo if &diff | call add(win_list, winbufnr(0)) | endif
306076e8b2aSBram Moolenaar    let s:settings.whole_filler = 1
307349b2fb0SBram Moolenaar    let g:html_diff_win_num = 0
308b02cbe34SBram Moolenaar    for window in win_list
309166af9bbSBram Moolenaar      " switch to the next buffer to convert
310b02cbe34SBram Moolenaar      exe ":" . bufwinnr(window) . "wincmd w"
311166af9bbSBram Moolenaar
312166af9bbSBram Moolenaar      " figure out whether current charset and encoding will work, if not
313166af9bbSBram Moolenaar      " default to UTF-8
314166af9bbSBram Moolenaar      if !exists('g:html_use_encoding') &&
3158e5af3e5SBram Moolenaar	    \ (((&l:fileencoding=='' || (&l:buftype!='' && &l:buftype!=?'help'))
3168e5af3e5SBram Moolenaar	    \      && &encoding!=?s:settings.vim_encoding)
3178e5af3e5SBram Moolenaar	    \ || &l:fileencoding!='' && &l:fileencoding!=?s:settings.vim_encoding)
318166af9bbSBram Moolenaar	echohl WarningMsg
319166af9bbSBram Moolenaar	echomsg "TOhtml: mismatched file encodings in Diff buffers, using UTF-8"
320166af9bbSBram Moolenaar	echohl None
321166af9bbSBram Moolenaar	let s:settings.vim_encoding = 'utf-8'
322166af9bbSBram Moolenaar	let s:settings.encoding = 'UTF-8'
323166af9bbSBram Moolenaar      endif
324166af9bbSBram Moolenaar
325166af9bbSBram Moolenaar      " set up for diff-mode conversion
326b02cbe34SBram Moolenaar      let g:html_start_line = 1
327b02cbe34SBram Moolenaar      let g:html_end_line = line('$')
328349b2fb0SBram Moolenaar      let g:html_diff_win_num += 1
329166af9bbSBram Moolenaar
330166af9bbSBram Moolenaar      " convert this file
331b02cbe34SBram Moolenaar      runtime syntax/2html.vim
332166af9bbSBram Moolenaar
333166af9bbSBram Moolenaar      " remember the HTML buffer for later combination
334b02cbe34SBram Moolenaar      call add(buf_list, bufnr('%'))
335b02cbe34SBram Moolenaar    endfor
336349b2fb0SBram Moolenaar    unlet g:html_diff_win_num
337b02cbe34SBram Moolenaar    call tohtml#Diff2HTML(win_list, buf_list)
338166af9bbSBram Moolenaar  endif "}}}
339b02cbe34SBram Moolenaar
340b02cbe34SBram Moolenaar  unlet g:html_start_line
341b02cbe34SBram Moolenaar  unlet g:html_end_line
342076e8b2aSBram Moolenaar  unlet s:settings
343166af9bbSBram Moolenaarendfunc "}}}
344b02cbe34SBram Moolenaar
345166af9bbSBram Moolenaarfunc! tohtml#Diff2HTML(win_list, buf_list) "{{{
346bebca9daSBram Moolenaar  let xml_line = ""
347bebca9daSBram Moolenaar  let tag_close = '>'
348bebca9daSBram Moolenaar
3498df7f888SBram Moolenaar  let s:old_paste = &paste
3508df7f888SBram Moolenaar  set paste
3518df7f888SBram Moolenaar  let s:old_magic = &magic
3528df7f888SBram Moolenaar  set magic
3538df7f888SBram Moolenaar
354bebca9daSBram Moolenaar  if s:settings.use_xhtml
355bebca9daSBram Moolenaar    if s:settings.encoding != ""
356bebca9daSBram Moolenaar      let xml_line = "<?xml version=\"1.0\" encoding=\"" . s:settings.encoding . "\"?>"
357bebca9daSBram Moolenaar    else
358bebca9daSBram Moolenaar      let xml_line = "<?xml version=\"1.0\"?>"
359bebca9daSBram Moolenaar    endif
360bebca9daSBram Moolenaar    let tag_close = ' />'
361bebca9daSBram Moolenaar  endif
362bebca9daSBram Moolenaar
363bebca9daSBram Moolenaar  let style = [s:settings.use_xhtml ? "" : '-->']
3648ada2ccaSBram Moolenaar  let body_line = ''
3658ada2ccaSBram Moolenaar
366b02cbe34SBram Moolenaar  let html = []
36709c6f265SBram Moolenaar  let s:html5 = 0
368bebca9daSBram Moolenaar  if s:settings.use_xhtml
369bebca9daSBram Moolenaar    call add(html, xml_line)
370bebca9daSBram Moolenaar  endif
371bebca9daSBram Moolenaar  if s:settings.use_xhtml
372bebca9daSBram Moolenaar    call add(html, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">")
373bebca9daSBram Moolenaar    call add(html, '<html xmlns="http://www.w3.org/1999/xhtml">')
374bebca9daSBram Moolenaar  elseif s:settings.use_css && !s:settings.no_pre
37509c6f265SBram Moolenaar    call add(html, "<!DOCTYPE html>")
376bebca9daSBram Moolenaar    call add(html, '<html>')
37709c6f265SBram Moolenaar    let s:html5 = 1
378bebca9daSBram Moolenaar  else
379b02cbe34SBram Moolenaar    call add(html, '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"')
380b02cbe34SBram Moolenaar    call add(html, '  "http://www.w3.org/TR/html4/loose.dtd">')
381b02cbe34SBram Moolenaar    call add(html, '<html>')
382bebca9daSBram Moolenaar  endif
383b02cbe34SBram Moolenaar  call add(html, '<head>')
384bebca9daSBram Moolenaar
385bebca9daSBram Moolenaar  " include encoding as close to the top as possible, but only if not already
386166af9bbSBram Moolenaar  " contained in XML information
387bebca9daSBram Moolenaar  if s:settings.encoding != "" && !s:settings.use_xhtml
38809c6f265SBram Moolenaar    if s:html5
38909c6f265SBram Moolenaar      call add(html, '<meta charset="' . s:settings.encoding . '"' . tag_close)
39009c6f265SBram Moolenaar    else
391bebca9daSBram Moolenaar      call add(html, "<meta http-equiv=\"content-type\" content=\"text/html; charset=" . s:settings.encoding . '"' . tag_close)
392bebca9daSBram Moolenaar    endif
39309c6f265SBram Moolenaar  endif
394bebca9daSBram Moolenaar
395b02cbe34SBram Moolenaar  call add(html, '<title>diff</title>')
396bebca9daSBram Moolenaar  call add(html, '<meta name="Generator" content="Vim/'.v:version/100.'.'.v:version%100.'"'.tag_close)
397bebca9daSBram Moolenaar  call add(html, '<meta name="plugin-version" content="'.g:loaded_2html_plugin.'"'.tag_close)
398bebca9daSBram Moolenaar  call add(html, '<meta name="settings" content="'.
399bebca9daSBram Moolenaar	\ join(filter(keys(s:settings),'s:settings[v:val]'),',').
4006c35beaaSBram Moolenaar	\ ',prevent_copy='.s:settings.prevent_copy.
40109c6f265SBram Moolenaar	\ ',use_input_for_pc='.s:settings.use_input_for_pc.
402bebca9daSBram Moolenaar	\ '"'.tag_close)
4036c35beaaSBram Moolenaar  call add(html, '<meta name="colorscheme" content="'.
4046c35beaaSBram Moolenaar	\ (exists('g:colors_name')
4056c35beaaSBram Moolenaar	\ ? g:colors_name
4066c35beaaSBram Moolenaar	\ : 'none'). '"'.tag_close)
407349b2fb0SBram Moolenaar
408b02cbe34SBram Moolenaar  call add(html, '</head>')
4098ada2ccaSBram Moolenaar  let body_line_num = len(html)
41031c31679SBram Moolenaar  call add(html, '<body'.(s:settings.line_ids ? ' onload="JumpToLine();"' : '').'>')
41109c6f265SBram Moolenaar  call add(html, "<table ".(s:settings.use_css? "" : "border='1' width='100%' ")."id='vimCodeElement".s:settings.id_suffix."'>")
412349b2fb0SBram Moolenaar
413b02cbe34SBram Moolenaar  call add(html, '<tr>')
414b02cbe34SBram Moolenaar  for buf in a:win_list
415b02cbe34SBram Moolenaar    call add(html, '<th>'.bufname(buf).'</th>')
416b02cbe34SBram Moolenaar  endfor
417b02cbe34SBram Moolenaar  call add(html, '</tr><tr>')
418b02cbe34SBram Moolenaar
4198ada2ccaSBram Moolenaar  let diff_style_start = 0
4208ada2ccaSBram Moolenaar  let insert_index = 0
4218ada2ccaSBram Moolenaar
422b02cbe34SBram Moolenaar  for buf in a:buf_list
423b02cbe34SBram Moolenaar    let temp = []
424b02cbe34SBram Moolenaar    exe bufwinnr(buf) . 'wincmd w'
425b02cbe34SBram Moolenaar
426349b2fb0SBram Moolenaar    " If text is folded because of user foldmethod settings, etc. we don't want
427349b2fb0SBram Moolenaar    " to act on everything in a fold by mistake.
428349b2fb0SBram Moolenaar    setlocal nofoldenable
429349b2fb0SBram Moolenaar
4308ada2ccaSBram Moolenaar    " When not using CSS or when using xhtml, the <body> line can be important.
4318ada2ccaSBram Moolenaar    " Assume it will be the same for all buffers and grab it from the first
4328ada2ccaSBram Moolenaar    " buffer. Similarly, need to grab the body end line as well.
4338ada2ccaSBram Moolenaar    if body_line == ''
4348ada2ccaSBram Moolenaar      1
4358ada2ccaSBram Moolenaar      call search('<body')
4368ada2ccaSBram Moolenaar      let body_line = getline('.')
4378ada2ccaSBram Moolenaar      $
4388ada2ccaSBram Moolenaar      call search('</body>', 'b')
4398ada2ccaSBram Moolenaar      let s:body_end_line = getline('.')
4408ada2ccaSBram Moolenaar    endif
4418ada2ccaSBram Moolenaar
442166af9bbSBram Moolenaar    " Grab the style information. Some of this will be duplicated so only insert
443166af9bbSBram Moolenaar    " it if it's not already there. {{{
444b02cbe34SBram Moolenaar    1
44509c6f265SBram Moolenaar    let style_start = search('^<style\( type="text/css"\)\?>')
446b02cbe34SBram Moolenaar    1
447b02cbe34SBram Moolenaar    let style_end = search('^</style>')
448b02cbe34SBram Moolenaar    if style_start > 0 && style_end > 0
4498ada2ccaSBram Moolenaar      let buf_styles = getline(style_start + 1, style_end - 1)
4508ada2ccaSBram Moolenaar      for a_style in buf_styles
4518ada2ccaSBram Moolenaar	if index(style, a_style) == -1
4528ada2ccaSBram Moolenaar	  if diff_style_start == 0
4538ada2ccaSBram Moolenaar	    if a_style =~ '\<Diff\(Change\|Text\|Add\|Delete\)'
4548ada2ccaSBram Moolenaar	      let diff_style_start = len(style)-1
4558ada2ccaSBram Moolenaar	    endif
4568ada2ccaSBram Moolenaar	  endif
4578ada2ccaSBram Moolenaar	  call insert(style, a_style, insert_index)
4588ada2ccaSBram Moolenaar	  let insert_index += 1
4598ada2ccaSBram Moolenaar	endif
4608ada2ccaSBram Moolenaar      endfor
461166af9bbSBram Moolenaar    endif " }}}
4628ada2ccaSBram Moolenaar
463166af9bbSBram Moolenaar    " everything new will get added before the diff styles so diff highlight
464166af9bbSBram Moolenaar    " properly overrides normal highlight
4658ada2ccaSBram Moolenaar    if diff_style_start != 0
4668ada2ccaSBram Moolenaar      let insert_index = diff_style_start
467b02cbe34SBram Moolenaar    endif
468b02cbe34SBram Moolenaar
4696c35beaaSBram Moolenaar    " Delete those parts that are not needed so we can include the rest into the
4706c35beaaSBram Moolenaar    " resulting table.
4716c35beaaSBram Moolenaar    1,/^<body.*\%(\n<!--.*-->\_s\+.*id='oneCharWidth'.*\_s\+.*id='oneInputWidth'.*\_s\+.*id='oneEmWidth'\)\?\zs/d_
472b02cbe34SBram Moolenaar    $
473b02cbe34SBram Moolenaar    ?</body>?,$d_
474b02cbe34SBram Moolenaar    let temp = getline(1,'$')
4756c35beaaSBram Moolenaar    " clean out id on the main content container because we already set it on
4766c35beaaSBram Moolenaar    " the table
47731c31679SBram Moolenaar    let temp[0] = substitute(temp[0], " id='vimCodeElement[^']*'", "", "")
478b02cbe34SBram Moolenaar    " undo deletion of start and end part
479b02cbe34SBram Moolenaar    " so we can later save the file as valid html
480349b2fb0SBram Moolenaar    " TODO: restore using grabbed lines if undolevel is 1?
4816c35beaaSBram Moolenaar    normal! 2u
482bebca9daSBram Moolenaar    if s:settings.use_css
48309c6f265SBram Moolenaar      call add(html, '<td><div>')
484bebca9daSBram Moolenaar    elseif s:settings.use_xhtml
485bebca9daSBram Moolenaar      call add(html, '<td nowrap="nowrap" valign="top"><div>')
486bebca9daSBram Moolenaar    else
487349b2fb0SBram Moolenaar      call add(html, '<td nowrap valign="top"><div>')
488bebca9daSBram Moolenaar    endif
489b02cbe34SBram Moolenaar    let html += temp
490349b2fb0SBram Moolenaar    call add(html, '</div></td>')
491b02cbe34SBram Moolenaar
492b02cbe34SBram Moolenaar    " Close this buffer
493349b2fb0SBram Moolenaar    " TODO: the comment above says we're going to allow saving the file
494349b2fb0SBram Moolenaar    " later...but here we discard it?
495b02cbe34SBram Moolenaar    quit!
496b02cbe34SBram Moolenaar  endfor
497b02cbe34SBram Moolenaar
4988ada2ccaSBram Moolenaar  let html[body_line_num] = body_line
4998ada2ccaSBram Moolenaar
500b02cbe34SBram Moolenaar  call add(html, '</tr>')
501b02cbe34SBram Moolenaar  call add(html, '</table>')
5028ada2ccaSBram Moolenaar  call add(html, s:body_end_line)
503b02cbe34SBram Moolenaar  call add(html, '</html>')
504b02cbe34SBram Moolenaar
505543b7ef7SBram Moolenaar  " The generated HTML is admittedly ugly and takes a LONG time to fold.
506543b7ef7SBram Moolenaar  " Make sure the user doesn't do syntax folding when loading a generated file,
507543b7ef7SBram Moolenaar  " using a modeline.
508543b7ef7SBram Moolenaar  call add(html, '<!-- vim: set foldmethod=manual : -->')
509543b7ef7SBram Moolenaar
510b02cbe34SBram Moolenaar  let i = 1
511bebca9daSBram Moolenaar  let name = "Diff" . (s:settings.use_xhtml ? ".xhtml" : ".html")
512349b2fb0SBram Moolenaar  " Find an unused file name if current file name is already in use
513b02cbe34SBram Moolenaar  while filereadable(name)
514bebca9daSBram Moolenaar    let name = substitute(name, '\d*\.x\?html$', '', '') . i . '.' . fnamemodify(copy(name), ":t:e")
515b02cbe34SBram Moolenaar    let i += 1
516349b2fb0SBram Moolenaar  endwhile
51709c6f265SBram Moolenaar
51809c6f265SBram Moolenaar  let s:ei_sav = &eventignore
51909c6f265SBram Moolenaar  set eventignore+=FileType
520349b2fb0SBram Moolenaar  exe "topleft new " . name
52109c6f265SBram Moolenaar  let &eventignore=s:ei_sav
52209c6f265SBram Moolenaar  unlet s:ei_sav
52309c6f265SBram Moolenaar
524349b2fb0SBram Moolenaar  setlocal modifiable
525349b2fb0SBram Moolenaar
526349b2fb0SBram Moolenaar  " just in case some user autocmd creates content in the new buffer, make sure
527349b2fb0SBram Moolenaar  " it is empty before proceeding
528349b2fb0SBram Moolenaar  %d
529166af9bbSBram Moolenaar
530166af9bbSBram Moolenaar  " set the fileencoding to match the charset we'll be using
531166af9bbSBram Moolenaar  let &l:fileencoding=s:settings.vim_encoding
532166af9bbSBram Moolenaar
533166af9bbSBram Moolenaar  " According to http://www.w3.org/TR/html4/charset.html#doc-char-set, the byte
534166af9bbSBram Moolenaar  " order mark is highly recommend on the web when using multibyte encodings. But,
535166af9bbSBram Moolenaar  " it is not a good idea to include it on UTF-8 files. Otherwise, let Vim
536166af9bbSBram Moolenaar  " determine when it is actually inserted.
537166af9bbSBram Moolenaar  if s:settings.vim_encoding == 'utf-8'
538166af9bbSBram Moolenaar    setlocal nobomb
539166af9bbSBram Moolenaar  else
540166af9bbSBram Moolenaar    setlocal bomb
541166af9bbSBram Moolenaar  endif
542166af9bbSBram Moolenaar
543b02cbe34SBram Moolenaar  call append(0, html)
544349b2fb0SBram Moolenaar
545b02cbe34SBram Moolenaar  if len(style) > 0
546b02cbe34SBram Moolenaar    1
547349b2fb0SBram Moolenaar    let style_start = search('^</head>')-1
548349b2fb0SBram Moolenaar
5496c35beaaSBram Moolenaar    " add required javascript in reverse order so we can just call append again
5506c35beaaSBram Moolenaar    " and again without adjusting {{{
5516c35beaaSBram Moolenaar
55209c6f265SBram Moolenaar    let s:uses_script = s:settings.dynamic_folds || s:settings.line_ids
553f0d58efcSBram Moolenaar
554f0d58efcSBram Moolenaar    " insert script closing tag if needed
555f0d58efcSBram Moolenaar    if s:uses_script
5566c35beaaSBram Moolenaar      call append(style_start, [
5576c35beaaSBram Moolenaar	    \ '',
5586c35beaaSBram Moolenaar	    \ s:settings.use_xhtml ? '//]]>' : '-->',
5596c35beaaSBram Moolenaar	    \ "</script>"
5606c35beaaSBram Moolenaar	    \ ])
561f0d58efcSBram Moolenaar    endif
5626c35beaaSBram Moolenaar
563543b7ef7SBram Moolenaar    " insert javascript to get IDs from line numbers, and to open a fold before
564543b7ef7SBram Moolenaar    " jumping to any lines contained therein
565f0d58efcSBram Moolenaar    if s:settings.line_ids
566543b7ef7SBram Moolenaar      call append(style_start, [
567543b7ef7SBram Moolenaar	    \ "  /* Always jump to new location even if the line was hidden inside a fold, or",
568543b7ef7SBram Moolenaar	    \ "   * we corrected the raw number to a line ID.",
569543b7ef7SBram Moolenaar	    \ "   */",
570543b7ef7SBram Moolenaar	    \ "  if (lineElem) {",
571543b7ef7SBram Moolenaar	    \ "    lineElem.scrollIntoView(true);",
572543b7ef7SBram Moolenaar	    \ "  }",
573543b7ef7SBram Moolenaar	    \ "  return true;",
574543b7ef7SBram Moolenaar	    \ "}",
575543b7ef7SBram Moolenaar	    \ "if ('onhashchange' in window) {",
576543b7ef7SBram Moolenaar	    \ "  window.onhashchange = JumpToLine;",
577543b7ef7SBram Moolenaar	    \ "}"
578543b7ef7SBram Moolenaar	    \ ])
579f0d58efcSBram Moolenaar
580543b7ef7SBram Moolenaar      if s:settings.dynamic_folds
581543b7ef7SBram Moolenaar	call append(style_start, [
582543b7ef7SBram Moolenaar	      \ "",
583543b7ef7SBram Moolenaar	      \ "  /* navigate upwards in the DOM tree to open all folds containing the line */",
584543b7ef7SBram Moolenaar	      \ "  var node = lineElem;",
58531c31679SBram Moolenaar	      \ "  while (node && node.id != 'vimCodeElement".s:settings.id_suffix."')",
586543b7ef7SBram Moolenaar	      \ "  {",
587543b7ef7SBram Moolenaar	      \ "    if (node.className == 'closed-fold')",
588543b7ef7SBram Moolenaar	      \ "    {",
589543b7ef7SBram Moolenaar	      \ "      /* toggle open the fold ID (remove window ID) */",
590543b7ef7SBram Moolenaar	      \ "      toggleFold(node.id.substr(4));",
591543b7ef7SBram Moolenaar	      \ "    }",
592543b7ef7SBram Moolenaar	      \ "    node = node.parentNode;",
593543b7ef7SBram Moolenaar	      \ "  }",
594543b7ef7SBram Moolenaar	      \ ])
595543b7ef7SBram Moolenaar      endif
596f0d58efcSBram Moolenaar    endif
597f0d58efcSBram Moolenaar
598f0d58efcSBram Moolenaar    if s:settings.line_ids
599543b7ef7SBram Moolenaar      call append(style_start, [
600543b7ef7SBram Moolenaar	    \ "",
601543b7ef7SBram Moolenaar	    \ "/* function to open any folds containing a jumped-to line before jumping to it */",
602543b7ef7SBram Moolenaar	    \ "function JumpToLine()",
603543b7ef7SBram Moolenaar	    \ "{",
604543b7ef7SBram Moolenaar	    \ "  var lineNum;",
605543b7ef7SBram Moolenaar	    \ "  lineNum = window.location.hash;",
606543b7ef7SBram Moolenaar	    \ "  lineNum = lineNum.substr(1); /* strip off '#' */",
607543b7ef7SBram Moolenaar	    \ "",
608543b7ef7SBram Moolenaar	    \ "  if (lineNum.indexOf('L') == -1) {",
609543b7ef7SBram Moolenaar	    \ "    lineNum = 'L'+lineNum;",
610543b7ef7SBram Moolenaar	    \ "  }",
611543b7ef7SBram Moolenaar	    \ "  if (lineNum.indexOf('W') == -1) {",
612543b7ef7SBram Moolenaar	    \ "    lineNum = 'W1'+lineNum;",
613543b7ef7SBram Moolenaar	    \ "  }",
614f0d58efcSBram Moolenaar	    \ "  var lineElem = document.getElementById(lineNum);"
615543b7ef7SBram Moolenaar	    \ ])
616f0d58efcSBram Moolenaar    endif
6176c35beaaSBram Moolenaar
618349b2fb0SBram Moolenaar    " Insert javascript to toggle matching folds open and closed in all windows,
6196c35beaaSBram Moolenaar    " if dynamic folding is active.
620076e8b2aSBram Moolenaar    if s:settings.dynamic_folds
621349b2fb0SBram Moolenaar      call append(style_start, [
622349b2fb0SBram Moolenaar	    \  "  function toggleFold(objID)",
623349b2fb0SBram Moolenaar	    \  "  {",
6247c86f4ccSBram Moolenaar	    \  "    for (win_num = 1; win_num <= ".len(a:buf_list)."; win_num++)",
625349b2fb0SBram Moolenaar	    \  "    {",
626349b2fb0SBram Moolenaar	    \  "      var fold;",
627349b2fb0SBram Moolenaar	    \  '      fold = document.getElementById("win"+win_num+objID);',
628349b2fb0SBram Moolenaar	    \  "      if(fold.className == 'closed-fold')",
629349b2fb0SBram Moolenaar	    \  "      {",
630349b2fb0SBram Moolenaar	    \  "        fold.className = 'open-fold';",
631349b2fb0SBram Moolenaar	    \  "      }",
632349b2fb0SBram Moolenaar	    \  "      else if (fold.className == 'open-fold')",
633349b2fb0SBram Moolenaar	    \  "      {",
634349b2fb0SBram Moolenaar	    \  "        fold.className = 'closed-fold';",
635349b2fb0SBram Moolenaar	    \  "      }",
636349b2fb0SBram Moolenaar	    \  "    }",
637349b2fb0SBram Moolenaar	    \  "  }",
638349b2fb0SBram Moolenaar	    \ ])
6396c35beaaSBram Moolenaar    endif
6406c35beaaSBram Moolenaar
641f0d58efcSBram Moolenaar    if s:uses_script
64209c6f265SBram Moolenaar      " insert script tag if needed
6436c35beaaSBram Moolenaar      call append(style_start, [
64409c6f265SBram Moolenaar	    \ "<script" . (s:html5 ? "" : " type='text/javascript'") . ">",
6456c35beaaSBram Moolenaar	    \ s:settings.use_xhtml ? '//<![CDATA[' : "<!--"])
646f0d58efcSBram Moolenaar    endif
647349b2fb0SBram Moolenaar
648349b2fb0SBram Moolenaar    " Insert styles from all the generated html documents and additional styles
649349b2fb0SBram Moolenaar    " for the table-based layout of the side-by-side diff. The diff should take
650349b2fb0SBram Moolenaar    " up the full browser window (but not more), and be static in size,
651349b2fb0SBram Moolenaar    " horizontally scrollable when the lines are too long. Otherwise, the diff
652166af9bbSBram Moolenaar    " is pretty useless for really long lines. {{{
653076e8b2aSBram Moolenaar    if s:settings.use_css
654bebca9daSBram Moolenaar      call append(style_start,
65509c6f265SBram Moolenaar	    \ ['<style' . (s:html5 ? '' : 'type="text/css"') . '>']+
656bebca9daSBram Moolenaar	    \ style+
657bebca9daSBram Moolenaar	    \ [ s:settings.use_xhtml ? '' : '<!--',
658349b2fb0SBram Moolenaar	    \   'table { table-layout: fixed; }',
659349b2fb0SBram Moolenaar	    \   'html, body, table, tbody { width: 100%; margin: 0; padding: 0; }',
66009c6f265SBram Moolenaar	    \   'table, td, th { border: 1px solid; }',
66109c6f265SBram Moolenaar	    \   'td { vertical-align: top; }',
662349b2fb0SBram Moolenaar	    \   'th, td { width: '.printf("%.1f",100.0/len(a:win_list)).'%; }',
663349b2fb0SBram Moolenaar	    \   'td div { overflow: auto; }',
664bebca9daSBram Moolenaar	    \   s:settings.use_xhtml ? '' : '-->',
665349b2fb0SBram Moolenaar	    \   '</style>'
666349b2fb0SBram Moolenaar	    \])
667166af9bbSBram Moolenaar    endif "}}}
668b02cbe34SBram Moolenaar  endif
6698df7f888SBram Moolenaar
6708df7f888SBram Moolenaar  let &paste = s:old_paste
6718df7f888SBram Moolenaar  let &magic = s:old_magic
672166af9bbSBram Moolenaarendfunc "}}}
673349b2fb0SBram Moolenaar
674076e8b2aSBram Moolenaar" Gets a single user option and sets it in the passed-in Dict, or gives it the
675076e8b2aSBram Moolenaar" default value if the option doesn't actually exist.
676166af9bbSBram Moolenaarfunc! tohtml#GetOption(settings, option, default) "{{{
677076e8b2aSBram Moolenaar  if exists('g:html_'.a:option)
678076e8b2aSBram Moolenaar    let a:settings[a:option] = g:html_{a:option}
679076e8b2aSBram Moolenaar  else
680076e8b2aSBram Moolenaar    let a:settings[a:option] = a:default
681076e8b2aSBram Moolenaar  endif
682166af9bbSBram Moolenaarendfunc "}}}
683076e8b2aSBram Moolenaar
684076e8b2aSBram Moolenaar" returns a Dict containing the values of all user options for 2html, including
685076e8b2aSBram Moolenaar" default values for those not given an explicit value by the user. Discards the
686076e8b2aSBram Moolenaar" html_ prefix of the option for nicer looking code.
687166af9bbSBram Moolenaarfunc! tohtml#GetUserSettings() "{{{
688076e8b2aSBram Moolenaar  if exists('s:settings')
689076e8b2aSBram Moolenaar    " just restore the known options if we've already retrieved them
690076e8b2aSBram Moolenaar    return s:settings
691076e8b2aSBram Moolenaar  else
692076e8b2aSBram Moolenaar    " otherwise figure out which options are set
693076e8b2aSBram Moolenaar    let user_settings = {}
694076e8b2aSBram Moolenaar
695076e8b2aSBram Moolenaar    " Define the correct option if the old option name exists and we haven't
696*6c391a74SBram Moolenaar    " already defined the correct one. Maybe I'll put out a warning message about
697076e8b2aSBram Moolenaar    " this sometime and remove the old option entirely at some even later time,
698076e8b2aSBram Moolenaar    " but for now just silently accept the old option.
699076e8b2aSBram Moolenaar    if exists('g:use_xhtml') && !exists("g:html_use_xhtml")
700076e8b2aSBram Moolenaar      let g:html_use_xhtml = g:use_xhtml
701076e8b2aSBram Moolenaar    endif
702076e8b2aSBram Moolenaar
703166af9bbSBram Moolenaar    " get current option settings with appropriate defaults {{{
704076e8b2aSBram Moolenaar    call tohtml#GetOption(user_settings,       'no_progress', !has("statusline") )
705076e8b2aSBram Moolenaar    call tohtml#GetOption(user_settings,     'diff_one_file', 0 )
706076e8b2aSBram Moolenaar    call tohtml#GetOption(user_settings,      'number_lines', &number )
7078e5af3e5SBram Moolenaar    call tohtml#GetOption(user_settings,          'pre_wrap', &wrap )
708076e8b2aSBram Moolenaar    call tohtml#GetOption(user_settings,           'use_css', 1 )
709076e8b2aSBram Moolenaar    call tohtml#GetOption(user_settings,    'ignore_conceal', 0 )
710076e8b2aSBram Moolenaar    call tohtml#GetOption(user_settings,    'ignore_folding', 0 )
711076e8b2aSBram Moolenaar    call tohtml#GetOption(user_settings,     'dynamic_folds', 0 )
7126c35beaaSBram Moolenaar    call tohtml#GetOption(user_settings,     'no_foldcolumn', user_settings.ignore_folding)
713076e8b2aSBram Moolenaar    call tohtml#GetOption(user_settings,      'hover_unfold', 0 )
714076e8b2aSBram Moolenaar    call tohtml#GetOption(user_settings,            'no_pre', 0 )
7156c35beaaSBram Moolenaar    call tohtml#GetOption(user_settings,        'no_invalid', 0 )
716076e8b2aSBram Moolenaar    call tohtml#GetOption(user_settings,      'whole_filler', 0 )
717076e8b2aSBram Moolenaar    call tohtml#GetOption(user_settings,         'use_xhtml', 0 )
71831c31679SBram Moolenaar    call tohtml#GetOption(user_settings,          'line_ids', user_settings.number_lines )
71909c6f265SBram Moolenaar    call tohtml#GetOption(user_settings, 'use_input_for_pc', 'fallback')
720166af9bbSBram Moolenaar    " }}}
721076e8b2aSBram Moolenaar
722166af9bbSBram Moolenaar    " override those settings that need it {{{
723076e8b2aSBram Moolenaar
724bebca9daSBram Moolenaar    " hover opening implies dynamic folding
725bebca9daSBram Moolenaar    if user_settings.hover_unfold
726bebca9daSBram Moolenaar      let user_settings.dynamic_folds = 1
727bebca9daSBram Moolenaar    endif
728bebca9daSBram Moolenaar
729076e8b2aSBram Moolenaar    " ignore folding overrides dynamic folding
730076e8b2aSBram Moolenaar    if user_settings.ignore_folding && user_settings.dynamic_folds
731076e8b2aSBram Moolenaar      let user_settings.dynamic_folds = 0
732076e8b2aSBram Moolenaar      let user_settings.hover_unfold = 0
733076e8b2aSBram Moolenaar    endif
734349b2fb0SBram Moolenaar
735349b2fb0SBram Moolenaar    " dynamic folding with no foldcolumn implies hover opens
736076e8b2aSBram Moolenaar    if user_settings.dynamic_folds && user_settings.no_foldcolumn
737076e8b2aSBram Moolenaar      let user_settings.hover_unfold = 1
738349b2fb0SBram Moolenaar    endif
739349b2fb0SBram Moolenaar
740349b2fb0SBram Moolenaar    " dynamic folding implies css
741076e8b2aSBram Moolenaar    if user_settings.dynamic_folds
742076e8b2aSBram Moolenaar      let user_settings.use_css = 1
7436c35beaaSBram Moolenaar    else
7446c35beaaSBram Moolenaar      let user_settings.no_foldcolumn = 1 " won't do anything but for consistency and for the test suite
745349b2fb0SBram Moolenaar    endif
746349b2fb0SBram Moolenaar
747076e8b2aSBram Moolenaar    " if we're not using CSS we cannot use a pre section because <font> tags
748076e8b2aSBram Moolenaar    " aren't allowed inside a <pre> block
749076e8b2aSBram Moolenaar    if !user_settings.use_css
750076e8b2aSBram Moolenaar      let user_settings.no_pre = 1
7518e5af3e5SBram Moolenaar    endif
7528e5af3e5SBram Moolenaar
7538e5af3e5SBram Moolenaar    " pre_wrap doesn't do anything if not using pre or not using CSS
7548e5af3e5SBram Moolenaar    if user_settings.no_pre || !user_settings.use_css
7558e5af3e5SBram Moolenaar      let user_settings.pre_wrap=0
7568e5af3e5SBram Moolenaar    endif
7578e5af3e5SBram Moolenaar    "}}}
758166af9bbSBram Moolenaar
7592a8a3ecbSBram Moolenaar    " set up expand_tabs option after all the overrides so we know the
7602a8a3ecbSBram Moolenaar    " appropriate defaults {{{
7612a8a3ecbSBram Moolenaar    if user_settings.no_pre == 0
7622a8a3ecbSBram Moolenaar      call tohtml#GetOption(user_settings,
7632a8a3ecbSBram Moolenaar	    \ 'expand_tabs',
764f0d58efcSBram Moolenaar	    \ &expandtab || &ts != 8 || &vts != '' || user_settings.number_lines ||
7652a8a3ecbSBram Moolenaar	    \   (user_settings.dynamic_folds && !user_settings.no_foldcolumn))
7662a8a3ecbSBram Moolenaar    else
7672a8a3ecbSBram Moolenaar      let user_settings.expand_tabs = 1
7682a8a3ecbSBram Moolenaar    endif
7692a8a3ecbSBram Moolenaar    " }}}
7702a8a3ecbSBram Moolenaar
7716c35beaaSBram Moolenaar    " textual options
772166af9bbSBram Moolenaar    if exists("g:html_use_encoding") "{{{
773166af9bbSBram Moolenaar      " user specified the desired MIME charset, figure out proper
774166af9bbSBram Moolenaar      " 'fileencoding' from it or warn the user if we cannot
775166af9bbSBram Moolenaar      let user_settings.encoding = g:html_use_encoding
776166af9bbSBram Moolenaar      let user_settings.vim_encoding = tohtml#EncodingFromCharset(g:html_use_encoding)
777166af9bbSBram Moolenaar      if user_settings.vim_encoding == ''
778166af9bbSBram Moolenaar	echohl WarningMsg
779166af9bbSBram Moolenaar	echomsg "TOhtml: file encoding for"
780166af9bbSBram Moolenaar	      \ g:html_use_encoding
781166af9bbSBram Moolenaar	      \ "unknown, please set 'fileencoding'"
782166af9bbSBram Moolenaar	echohl None
783166af9bbSBram Moolenaar      endif
784166af9bbSBram Moolenaar    else
785166af9bbSBram Moolenaar      " Figure out proper MIME charset from 'fileencoding' if possible
786166af9bbSBram Moolenaar      if &l:fileencoding != ''
7878e5af3e5SBram Moolenaar	" If the buffer is not a "normal" type, the 'fileencoding' value may not
7888e5af3e5SBram Moolenaar	" be trusted; since the buffer should not be written the fileencoding is
7898e5af3e5SBram Moolenaar	" not intended to be used.
7908e5af3e5SBram Moolenaar	if &l:buftype=='' || &l:buftype==?'help'
791166af9bbSBram Moolenaar	  let user_settings.vim_encoding = &l:fileencoding
792166af9bbSBram Moolenaar	  call tohtml#CharsetFromEncoding(user_settings)
7938e5af3e5SBram Moolenaar	else
7948e5af3e5SBram Moolenaar	  let user_settings.encoding = '' " trigger detection using &encoding
7958e5af3e5SBram Moolenaar	endif
796076e8b2aSBram Moolenaar      endif
797349b2fb0SBram Moolenaar
798166af9bbSBram Moolenaar      " else from 'encoding' if possible
799166af9bbSBram Moolenaar      if &l:fileencoding == '' || user_settings.encoding == ''
800166af9bbSBram Moolenaar	let user_settings.vim_encoding = &encoding
801166af9bbSBram Moolenaar	call tohtml#CharsetFromEncoding(user_settings)
802bebca9daSBram Moolenaar      endif
803166af9bbSBram Moolenaar
804166af9bbSBram Moolenaar      " else default to UTF-8 and warn user
805166af9bbSBram Moolenaar      if user_settings.encoding == ''
806166af9bbSBram Moolenaar	let user_settings.vim_encoding = 'utf-8'
807bebca9daSBram Moolenaar	let user_settings.encoding = 'UTF-8'
808166af9bbSBram Moolenaar	echohl WarningMsg
809166af9bbSBram Moolenaar	echomsg "TOhtml: couldn't determine MIME charset, using UTF-8"
810166af9bbSBram Moolenaar	echohl None
811bebca9daSBram Moolenaar      endif
812166af9bbSBram Moolenaar    endif "}}}
813bebca9daSBram Moolenaar
8146c35beaaSBram Moolenaar    " Default to making nothing uncopyable, because we default to
8156c35beaaSBram Moolenaar    " not-standards way of doing things, and also because Microsoft Word and
8166c35beaaSBram Moolenaar    " others paste the <input> elements anyway.
8176c35beaaSBram Moolenaar    "
8186c35beaaSBram Moolenaar    " html_prevent_copy only has an effect when using CSS.
8196c35beaaSBram Moolenaar    "
8206c35beaaSBram Moolenaar    " All options:
8216c35beaaSBram Moolenaar    "	  f - fold column
8226c35beaaSBram Moolenaar    "	  n - line numbers (also within fold text)
8236c35beaaSBram Moolenaar    "	  t - fold text
8246c35beaaSBram Moolenaar    "	  d - diff filler
8256c35beaaSBram Moolenaar    "	  c - concealed text (reserved future)
8266c35beaaSBram Moolenaar    "	  l - listchars (reserved possible future)
8276c35beaaSBram Moolenaar    "	  s - signs (reserved possible future)
8286c35beaaSBram Moolenaar    "
8296c35beaaSBram Moolenaar    " Normal text is always selectable.
8306c35beaaSBram Moolenaar    let user_settings.prevent_copy = ""
8316c35beaaSBram Moolenaar    if user_settings.use_css
8326c35beaaSBram Moolenaar      if exists("g:html_prevent_copy")
8336c35beaaSBram Moolenaar	if user_settings.dynamic_folds && !user_settings.no_foldcolumn && g:html_prevent_copy =~# 'f'
8346c35beaaSBram Moolenaar	  let user_settings.prevent_copy .= 'f'
8356c35beaaSBram Moolenaar	endif
8366c35beaaSBram Moolenaar	if user_settings.number_lines && g:html_prevent_copy =~# 'n'
8376c35beaaSBram Moolenaar	  let user_settings.prevent_copy .= 'n'
8386c35beaaSBram Moolenaar	endif
8396c35beaaSBram Moolenaar	if &diff && g:html_prevent_copy =~# 'd'
8406c35beaaSBram Moolenaar	  let user_settings.prevent_copy .= 'd'
8416c35beaaSBram Moolenaar	endif
8426c35beaaSBram Moolenaar	if !user_settings.ignore_folding && g:html_prevent_copy =~# 't'
8436c35beaaSBram Moolenaar	  let user_settings.prevent_copy .= 't'
8446c35beaaSBram Moolenaar	endif
8456c35beaaSBram Moolenaar      else
8466c35beaaSBram Moolenaar	let user_settings.prevent_copy = ""
8476c35beaaSBram Moolenaar      endif
8486c35beaaSBram Moolenaar    endif
8496c35beaaSBram Moolenaar    if empty(user_settings.prevent_copy)
8506c35beaaSBram Moolenaar      let user_settings.no_invalid = 0
8516c35beaaSBram Moolenaar    endif
8526c35beaaSBram Moolenaar
85309c6f265SBram Moolenaar    " enforce valid values for use_input_for_pc
85409c6f265SBram Moolenaar    if user_settings.use_input_for_pc !~# 'fallback\|none\|all'
85509c6f265SBram Moolenaar      let user_settings.use_input_for_pc = 'fallback'
85609c6f265SBram Moolenaar      echohl WarningMsg
85709c6f265SBram Moolenaar      echomsg '2html: "' . g:html_use_input_for_pc . '" is not valid for g:html_use_input_for_pc'
85809c6f265SBram Moolenaar      echomsg '2html: defaulting to "' . user_settings.use_input_for_pc . '"'
85909c6f265SBram Moolenaar      echohl None
86009c6f265SBram Moolenaar      sleep 3
86109c6f265SBram Moolenaar    endif
86209c6f265SBram Moolenaar
86331c31679SBram Moolenaar    if exists('g:html_id_expr')
86431c31679SBram Moolenaar      let user_settings.id_suffix = eval(g:html_id_expr)
86531c31679SBram Moolenaar      if user_settings.id_suffix !~ '^[-_:.A-Za-z0-9]*$'
86631c31679SBram Moolenaar	echohl WarningMsg
86731c31679SBram Moolenaar	echomsg '2html: g:html_id_expr evaluated to invalid string for HTML id attributes'
86831c31679SBram Moolenaar	echomsg '2html: Omitting user-specified suffix'
86931c31679SBram Moolenaar	echohl None
87031c31679SBram Moolenaar	sleep 3
87131c31679SBram Moolenaar	let user_settings.id_suffix=""
87231c31679SBram Moolenaar      endif
87331c31679SBram Moolenaar    else
87431c31679SBram Moolenaar      let user_settings.id_suffix=""
87531c31679SBram Moolenaar    endif
87631c31679SBram Moolenaar
877bebca9daSBram Moolenaar    " TODO: font
878bebca9daSBram Moolenaar
879076e8b2aSBram Moolenaar    return user_settings
880349b2fb0SBram Moolenaar  endif
881166af9bbSBram Moolenaarendfunc "}}}
882166af9bbSBram Moolenaar
883166af9bbSBram Moolenaar" get the proper HTML charset name from a Vim encoding option.
884166af9bbSBram Moolenaarfunction! tohtml#CharsetFromEncoding(settings) "{{{
885166af9bbSBram Moolenaar  let l:vim_encoding = a:settings.vim_encoding
886166af9bbSBram Moolenaar  if exists('g:html_charset_override') && has_key(g:html_charset_override, l:vim_encoding)
887166af9bbSBram Moolenaar    let a:settings.encoding = g:html_charset_override[l:vim_encoding]
888166af9bbSBram Moolenaar  else
889166af9bbSBram Moolenaar    if l:vim_encoding =~ '^8bit\|^2byte'
890166af9bbSBram Moolenaar      " 8bit- and 2byte- prefixes are to indicate encodings available on the
891166af9bbSBram Moolenaar      " system that Vim will convert with iconv(), look up just the encoding name,
892166af9bbSBram Moolenaar      " not Vim's prefix.
893166af9bbSBram Moolenaar      let l:vim_encoding = substitute(l:vim_encoding, '^8bit-\|^2byte-', '', '')
894166af9bbSBram Moolenaar    endif
895166af9bbSBram Moolenaar    if has_key(g:tohtml#encoding_to_charset, l:vim_encoding)
896166af9bbSBram Moolenaar      let a:settings.encoding = g:tohtml#encoding_to_charset[l:vim_encoding]
897166af9bbSBram Moolenaar    else
898166af9bbSBram Moolenaar      let a:settings.encoding = ""
899166af9bbSBram Moolenaar    endif
900166af9bbSBram Moolenaar  endif
901166af9bbSBram Moolenaar  if a:settings.encoding != ""
902166af9bbSBram Moolenaar    let l:vim_encoding = tohtml#EncodingFromCharset(a:settings.encoding)
903166af9bbSBram Moolenaar    if l:vim_encoding != ""
904166af9bbSBram Moolenaar      " if the Vim encoding to HTML encoding conversion is set up (by default or
905166af9bbSBram Moolenaar      " by the user) to convert to a different encoding, we need to also change
906166af9bbSBram Moolenaar      " the Vim encoding of the new buffer
907166af9bbSBram Moolenaar      let a:settings.vim_encoding = l:vim_encoding
908166af9bbSBram Moolenaar    endif
909166af9bbSBram Moolenaar  endif
910166af9bbSBram Moolenaarendfun "}}}
911166af9bbSBram Moolenaar
912166af9bbSBram Moolenaar" Get the proper Vim encoding option setting from an HTML charset name.
913166af9bbSBram Moolenaarfunction! tohtml#EncodingFromCharset(encoding) "{{{
914166af9bbSBram Moolenaar  if exists('g:html_encoding_override') && has_key(g:html_encoding_override, a:encoding)
915166af9bbSBram Moolenaar    return g:html_encoding_override[a:encoding]
916166af9bbSBram Moolenaar  elseif has_key(g:tohtml#charset_to_encoding, tolower(a:encoding))
917166af9bbSBram Moolenaar    return g:tohtml#charset_to_encoding[tolower(a:encoding)]
918166af9bbSBram Moolenaar  else
919166af9bbSBram Moolenaar    return ""
920166af9bbSBram Moolenaar  endif
921166af9bbSBram Moolenaarendfun "}}}
922349b2fb0SBram Moolenaar
923349b2fb0SBram Moolenaarlet &cpo = s:cpo_sav
924349b2fb0SBram Moolenaarunlet s:cpo_sav
925349b2fb0SBram Moolenaar
926349b2fb0SBram Moolenaar" Make sure any patches will probably use consistent indent
927166af9bbSBram Moolenaar"   vim: ts=8 sw=2 sts=2 noet fdm=marker
928