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