" Vim syntax support file
" Maintainer: Bram Moolenaar <Bram@vim.org>
" Last Change: 2000 Jan 14
" Transform a file into HTML, using the current syntax highlighting.
" function to produce text with HTML codes for attributes and colors
"
" a:attr contains 'U' for underline, 'I' for italic and 'B' for bold
" a:fg foregound color name
" a:bg background color name
" a:txt text
"
" the big return statement concatenates:
" - the code to start underline/italic/bold, substituting each 'U', 'I' or 'B'
" by the same character inside <>
" - the code to start the background color
" - the code to start the foreground color
" - the text, where each '&', '<', '>' and '"' is translated for their special
" meaning. A CTRL-L is translated into a page break
" - the code to end the foreground color
" - the code to end the background color
" - the code to end underline/italic/bold, substituting each 'U', 'I' or 'B'
" by the same character inside </>, in reverse order
function! HTMLPutText(attr, bg, fg, txt)
let bgs = "" " code for background color start
let bge = "" " code for background color end
if a:bg != ""
let bgs = '<SPAN style="background-color: ' . a:bg . '">'
let bge = '</SPAN>'
endif
let fgs = "" " code for foreground color start
let fge = "" " code for foreground color end
if a:fg != ""
let fgs = '<FONT color=' . a:fg . ">"
let fge = '</FONT>'
endif
return substitute(a:attr, '.', '<&>', 'g') . bgs . fgs . substitute(substitute(substitute(substitute(substitute(a:txt, '&', '\&', 'g'), '<', '\<', 'g'), '>', '\>', 'g'), '"', '\"', 'g'), "\x0c", '<HR class=PAGE-BREAK>', 'g') . fge . bge . substitute(a:attr[2] . a:attr[1] . a:attr[0], '.', '</&>', 'g')
endfun
if &t_Co == 8
let cterm_color0 = "#808080"
let cterm_color1 = "#ff6060"
let cterm_color2 = "#00ff00"
let cterm_color3 = "#ffff00"
let cterm_color4 = "#8080ff"
let cterm_color5 = "#ff40ff"
let cterm_color6 = "#00ffff"
let cterm_color7 = "#ffffff"
else
let cterm_color0 = "#000000"
let cterm_color1 = "#c00000"
let cterm_color2 = "#008000"
let cterm_color3 = "#804000"
let cterm_color4 = "#0000c0"
let cterm_color5 = "#c000c0"
let cterm_color6 = "#008080"
let cterm_color7 = "#c0c0c0"
let cterm_color8 = "#808080"
let cterm_color9 = "#ff6060"
let cterm_color10 = "#00ff00"
let cterm_color11 = "#ffff00"
let cterm_color12 = "#8080ff"
let cterm_color13 = "#ff40ff"
let cterm_color14 = "#00ffff"
let cterm_color15 = "#ffffff"
endif
function! HTMLColor(c)
if exists("g:cterm_color" . a:c)
execute "return g:cterm_color" . a:c
else
return ""
endif
endfun
" Set some options to make it work faster.
" Expand tabs in original buffer to get 'tabstop' correctly used.
let old_title = &title
let old_icon = &icon
let old_paste = &paste
let old_et = &et
set notitle noicon paste et
" Split window to create a buffer with the HTML file.
if expand("%") == ""
new Untitled.html
else
new %.html
endif
1,$d
set noet
" Find out the background and foreground color.
if has("gui_running")
let bg = synIDattr(highlightID("Normal"), "bg#", "gui")
let fg = synIDattr(highlightID("Normal"), "fg#", "gui")
else
let bg = HTMLColor(synIDattr(highlightID("Normal"), "bg", "cterm"))
let fg = HTMLColor(synIDattr(highlightID("Normal"), "fg", "cterm"))
endif
if bg == ""
if &background == "dark"
let bg = "#000000"
if fg == ""
let fg = "#FFFFFF"
endif
else
let bg = "#FFFFFF"
if fg == ""
let fg = "#000000"
endif
endif
endif
" Insert HTML header, with the background color. Add the foreground color
" only when it is defined.
exe "normal a<HTML>\n<HEAD>\n<TITLE>".expand("%:t")."</TITLE>\n</HEAD>\n<BODY BGcolor=".bg."\e"
if fg != ""
exe "normal a TEXT=".fg."\e"
endif
exe "normal a>\n<PRE>\n\e"
exe "normal \<C-W>p"
" Some 'constants' for ease of addressing with []
let uline = "U"
let bld = "B"
let itl = "I"
" Loop over all lines in the original text
let end = line("$")
let lnum = 1
while lnum <= end
" Get the current line, with tabs expanded to spaces when needed
let line = getline(lnum)
if match(line, "\t") >= 0
exe lnum . "retab!"
let did_retab = 1
let line = getline(lnum)
else
let did_retab = 0
endif
let len = strlen(line)
let new = ""
if exists("html_number_color")
let new = '<FONT COLOR=' . html_number_color . '>' . strpart(' ', 0, strlen(line("$")) - strlen(lnum)) . lnum . '</FONT> '
endif
" Loop over each character in the line
let col = 1
while col <= len
let startcol = col " The start column for processing text
let id = synID(lnum, col, 1)
let col = col + 1
" Speed loop (it's small - that's the trick)
" Go along till we find a change in synID
while col <= len && id == synID(lnum, col, 1) | let col = col + 1 | endwhile
" output the text with the same synID, with all its attributes
" The first part turns attributes into [U][I][B]
let id = synIDtrans(id)
if has("gui_running")
let new = new . HTMLPutText(uline[synIDattr(id, "underline", "gui") - 1] . itl[synIDattr(id, "italic", "gui") - 1] . bld[synIDattr(id, "bold", "gui") - 1], synIDattr(id, "bg#", "gui"), synIDattr(id, "fg#", "gui"), strpart(line, startcol - 1, col - startcol))
else
let new = new . HTMLPutText(uline[synIDattr(id, "underline", "cterm") - 1] . itl[synIDattr(id, "italic", "cterm") - 1] . bld[synIDattr(id, "bold", "cterm") - 1], HTMLColor(synIDattr(id, "bg", "cterm")), HTMLColor(synIDattr(id, "fg", "cterm")), strpart(line, startcol - 1, col - startcol))
endif
if col > len
break
endif
endwhile
if did_retab
undo
endif
exe "normal \<C-W>pa" . strtrans(new) . "\n\e\<C-W>p"
let lnum = lnum + 1
+
endwhile
" Finish with the last line
exe "normal \<C-W>pa</PRE>\n</BODY>\n</HTML>\e"
let &title = old_title
let &icon = old_icon
let &paste = old_paste
exe "normal \<C-W>p"
let &et = old_et
exe "normal \<C-W>p"
" In case they didn't get used
let startcol = 0
let id = 0
unlet uline bld itl lnum end col startcol line len new id
unlet old_title old_icon old_paste old_et did_retab bg fg
unlet cterm_color0 cterm_color1 cterm_color2 cterm_color3
unlet cterm_color4 cterm_color5 cterm_color6 cterm_color7
if &t_Co != 8
unlet cterm_color8 cterm_color9 cterm_color10 cterm_color11
unlet cterm_color12 cterm_color13 cterm_color14 cterm_color15
endif
delfunc HTMLPutText
delfunc HTMLColor