blob: 56eb2c15bfbe8d26da010406f4e7784d764813e2 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim plugin for converting a syntax highlighted file to HTML.
Bram Moolenaar349b2fb2010-07-16 20:35:36 +02002" Maintainer: Ben Fritz <fritzophrenic@gmail.com>
fritzophrenic86cfb392023-09-08 12:20:01 -05003" Last Change: 2023 Sep 07
Bram Moolenaarb02cbe32010-07-11 22:38:52 +02004"
Bram Moolenaar349b2fb2010-07-16 20:35:36 +02005" The core of the code is in $VIMRUNTIME/autoload/tohtml.vim and
6" $VIMRUNTIME/syntax/2html.vim
Bram Moolenaar8ada2cc2010-07-29 20:43:36 +02007"
Bram Moolenaar7510fe72010-07-25 12:46:44 +02008if exists('g:loaded_2html_plugin')
9 finish
10endif
fritzophrenic86cfb392023-09-08 12:20:01 -050011let g:loaded_2html_plugin = 'vim9.0_v2'
Bram Moolenaar251e1912011-06-19 05:09:16 +020012
13"
Bram Moolenaar6c35bea2012-07-25 17:49:10 +020014" Changelog: {{{
fritzophrenic86cfb392023-09-08 12:20:01 -050015" 9.0_v2 (this version): - Warn if using deprecated g:use_xhtml option
16" - Change default g:html_use_input_for_pc to "none"
17" instead of "fallback". All modern browsers support
18" the "user-select: none" and "content:" CSS
19" properties so the older method relying on extra
20" markup and unspecified browser/app clipboard
21" handling is only needed in rare special cases.
22" - Fix SourceForge issue #33: generate diff filler
23" correctly when new lines have been added to or
24" removed from end of buffer.
25" - Fix SourceForge issue #32/Vim Github issue #8547:
26" use translated highlight ID for styling the
27" special-use group names (e.g. LineNr) used
28" directly by name in the 2html processing.
29" - Fix SourceForge issue #26, refactoring to use
30" :let-heredoc style string assignment and
31" additional fixes for ".." vs. "." style string
32" concatenation. Requires Vim v8.1.1354 or higher.
33" 9.0_v1 (Vim 9.0.1275): - Implement g:html_no_doc and g:html_no_modeline
Bram Moolenaarbe4e0162023-02-02 13:59:48 +000034" for diff mode. Add tests.
35" (Vim 9.0.1122): NOTE: no version string update for this version!
36" - Bugfix for variable name in g:html_no_doc
37" (Vim 9.0.0819): NOTE: no version string update for this version!
38" - Add options g:html_no_doc, g:html_no_lines,
39" and g:html_no_modeline (partially included in Vim
40" runtime prior to version string update).
41" - Updates for new Vim9 string append style (i.e. use
fritzophrenic86cfb392023-09-08 12:20:01 -050042" ".." instead of "."). Requires Vim version
43" 8.1.1114 or higher.
Bram Moolenaarbe4e0162023-02-02 13:59:48 +000044"
45" 8.1 updates: {{{
46" 8.1_v2 (Vim 8.1.2312): - Fix SourceForge issue #19: fix calculation of tab
Bram Moolenaar09c6f262019-11-17 15:55:14 +010047" stop position to use in expanding a tab, when that
48" tab occurs after a syntax match which in turn
49" comes after previously expanded tabs.
50" - Set eventignore while splitting a window for the
51" destination file to ignore FileType events;
52" speeds up processing when the destination file
53" already exists and HTML highlight takes too long.
Bram Moolenaarbe4e0162023-02-02 13:59:48 +000054" - Fix SourceForge issue #20: progress bar could not be
Bram Moolenaar09c6f262019-11-17 15:55:14 +010055" seen when DiffDelete background color matched
56" StatusLine background color. Added TOhtmlProgress
57" highlight group for manual user override, but
58" calculate it to be visible compared to StatusLine
59" by default.
Bram Moolenaarbe4e0162023-02-02 13:59:48 +000060" - Fix SourceForge issue #1: Remove workaround for old
Bram Moolenaar09c6f262019-11-17 15:55:14 +010061" browsers which don't support 'ch' CSS unit, since
62" all modern browsers, including IE>=9, support it.
Bram Moolenaarbe4e0162023-02-02 13:59:48 +000063" - Fix SourceForge issue #10: support termguicolors
64" - Fix SourceForge issue #21: default to using
Bram Moolenaar09c6f262019-11-17 15:55:14 +010065" generated content instead of <input> tags for
66" uncopyable text, so that text is correctly
67" prevented from being copied in chrome. Use
68" g:html_use_input_for_pc option to control the
69" method used.
70" - Switch to HTML5 to allow using vnu as a validator
71" in unit test.
72" - Fix fallback sizing of <input> tags for browsers
73" without "ch" support.
74" - Fix cursor on unselectable diff filler text.
Bram Moolenaarbe4e0162023-02-02 13:59:48 +000075" 8.1_v1 (Vim 8.1.0528): - Fix SourceForge issue #6: Don't generate empty
Bram Moolenaar09c6f262019-11-17 15:55:14 +010076" script tag.
Bram Moolenaarbe4e0162023-02-02 13:59:48 +000077" - Fix SourceForge issue #5: javascript should
Bram Moolenaar09c6f262019-11-17 15:55:14 +010078" declare variables with "var".
Bram Moolenaarbe4e0162023-02-02 13:59:48 +000079" - Fix SourceForge issue #13: errors thrown sourcing
Bram Moolenaar09c6f262019-11-17 15:55:14 +010080" 2html.vim directly when plugins not loaded.
Bram Moolenaarbe4e0162023-02-02 13:59:48 +000081" - Fix SourceForge issue #16: support 'vartabstop'.
82"}}}
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +010083"
84" 7.4 updates: {{{
85" 7.4_v2 (Vim 7.4.0899): Fix error raised when converting a diff containing
Bram Moolenaar60cce2f2015-10-13 23:21:27 +020086" an empty buffer. Jan Stocker: allow g:html_font to
87" take a list so it is easier to specfiy fallback
88" fonts in the generated CSS.
89" 7.4_v1 (Vim 7.4.0000): Fix modeline mangling for new "Vim:" format, and
Bram Moolenaardd007ed2013-07-09 15:44:17 +020090" also for version-specific modelines like "vim>703:".
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +010091"}}}
Bram Moolenaar6c35bea2012-07-25 17:49:10 +020092"
Bram Moolenaardd007ed2013-07-09 15:44:17 +020093" 7.3 updates: {{{
Bram Moolenaar60cce2f2015-10-13 23:21:27 +020094" 7.3_v14 (Vim 7.3.1246): Allow suppressing line number anchors using
Bram Moolenaar22dbc772013-06-28 18:44:48 +020095" g:html_line_ids=0. Allow customizing
96" important IDs (like line IDs and fold IDs) using
Bram Moolenaar6c391a72021-09-09 21:55:11 +020097" g:html_id_expr evaluated when the buffer conversion
Bram Moolenaar22dbc772013-06-28 18:44:48 +020098" is started.
Bram Moolenaar60cce2f2015-10-13 23:21:27 +020099" 7.3_v13 (Vim 7.3.1088): Keep foldmethod at manual in the generated file and
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200100" insert modeline to set it to manual.
101" Fix bug: diff mode with 2 unsaved buffers creates a
102" duplicate of one buffer instead of including both.
103" Add anchors to each line so you can put '#L123'
104" or '#123' at the end of the URL to jump to line 123
105" (idea by Andy Spencer). Add javascript to open folds
106" to show the anchor being jumped to if it is hidden.
107" Fix XML validation error: &nsbp; not part of XML.
108" Allow TOhtml to chain together with other commands
109" using |.
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200110" 7.3_v12 (Vim 7.3.0616): Fix modeline mangling to also work for when multiple
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200111" highlight groups make up the start-of-modeline text.
112" Improve render time of page with uncopyable regions
113" by not using one-input-per-char. Change name of
114" uncopyable option from html_unselectable to
115" html_prevent_copy. Added html_no_invalid option and
116" default to inserting invalid markup for uncopyable
117" regions to prevent MS Word from pasting undeletable
118" <input> elements. Fix 'cpo' handling (Thilo Six).
119" 7.3_v12b1: Add html_unselectable option. Rework logic to
120" eliminate post-processing substitute commands in
121" favor of doing the work up front. Remove unnecessary
122" special treatment of 'LineNr' highlight group. Minor
123" speed improvements. Fix modeline mangling in
124" generated output so it works for text in the first
125" column. Fix missing line number and fold column in
126" diff filler lines. Fix that some fonts have a 1px
127" gap (using a dirty hack, improvements welcome). Add
128" "colorscheme" meta tag. Does NOT include support for
129" the new default foldtext added in v11, as the patch
130" adding it has not yet been included in Vim.
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200131" 7.3_v11 ( unreleased ): Support new default foldtext from patch by Christian
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200132" Brabandt in
133" http://groups.google.com/d/topic/vim_dev/B6FSGfq9VoI/discussion.
134" This patch has not yet been included in Vim, thus
135" these changes are removed in the next version.
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200136" 7.3_v10 (Vim 7.3.0227): Fix error E684 when converting a range wholly inside
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200137" multiple nested folds with dynamic folding on.
138" Also fix problem with foldtext in this situation.
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200139" 7.3_v9 (Vim 7.3.0170): Add html_pre_wrap option active with html_use_css
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200140" and without html_no_pre, default value same as
141" 'wrap' option, (Andy Spencer). Don't use
142" 'fileencoding' for converted document encoding if
143" 'buftype' indicates a special buffer which isn't
144" written.
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200145" 7.3_v8 (Vim 7.3.0100): Add html_expand_tabs option to allow leaving tab
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200146" characters in generated output (Andy Spencer).
147" Escape text that looks like a modeline so Vim
148" doesn't use anything in the converted HTML as a
149" modeline. Bugfixes: Fix folding when a fold starts
150" before the conversion range. Remove fold column when
151" there are no folds.
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200152" 7.3_v7 (Vim 7-3-0063): see betas released on vim_dev below:
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200153" 7.3_v7b3: Fixed bug, convert Unicode to UTF-8 all the way.
154" 7.3_v7b2: Remove automatic detection of encodings that are not
155" supported by all major browsers according to
156" http://wiki.whatwg.org/wiki/Web_Encodings and
157" convert to UTF-8 for all Unicode encodings. Make
158" HTML encoding to Vim encoding detection be
159" case-insensitive for built-in pairs.
160" 7.3_v7b1: Remove use of setwinvar() function which cannot be
161" called in restricted mode (Andy Spencer). Use
162" 'fencoding' instead of 'encoding' to determine by
163" charset, and make sure the 'fenc' of the generated
164" file matches its indicated charset. Add charsets for
165" all of Vim's natively supported encodings.
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200166" 7.3_v6 (Vim 7.3.0000): Really fix bug with 'nowrapscan', 'magic' and other
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200167" user settings interfering with diff mode generation,
168" trailing whitespace (e.g. line number column) when
169" using html_no_pre, and bugs when using
170" html_hover_unfold.
Bram Moolenaar251e1912011-06-19 05:09:16 +0200171" 7.3_v5 ( unreleased ): Fix bug with 'nowrapscan' and also with out-of-sync
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200172" folds in diff mode when first line was folded.
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200173" 7.3_v4 (Vim 7.3.0000): Bugfixes, especially for xhtml markup, and diff mode
174" 7.3_v3 (Vim 7.3.0000): Refactor option handling and make html_use_css
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200175" default to true when not set to anything. Use strict
176" doctypes where possible. Rename use_xhtml option to
177" html_use_xhtml for consistency. Use .xhtml extension
178" when using this option. Add meta tag for settings.
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200179" 7.3_v2 (Vim 7.3.0000): Fix syntax highlighting in diff mode to use both the
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200180" diff colors and the normal syntax colors
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200181" 7.3_v1 (Vim 7.3.0000): Add conceal support and meta tags in output
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200182"}}}
Bram Moolenaardd007ed2013-07-09 15:44:17 +0200183"}}}
Bram Moolenaar7510fe72010-07-25 12:46:44 +0200184
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +0100185" TODO: {{{
186" * Check the issue tracker:
Bram Moolenaarbe4e0162023-02-02 13:59:48 +0000187" https://sourceforge.net/p/vim-tohtml/issues/search/?q=%21status%3Aclosed
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +0100188" * Options for generating the CSS in external style sheets. New :TOcss
189" command to convert the current color scheme into a (mostly) generic CSS
190" stylesheet which can be re-used. Alternate stylesheet support? Good start
191" by Erik Falor
192" ( https://groups.google.com/d/topic/vim_use/7XTmC4D22dU/discussion ).
193" * Add optional argument to :TOhtml command to specify mode (gui, cterm,
194" term) to use for the styling. Suggestion by "nacitar".
195" * Add way to override or specify which RGB colors map to the color numbers
196" in cterm. Get better defaults than just guessing? Suggestion by "nacitar".
197" * Disable filetype detection until after all processing is done.
198" * Add option for not generating the hyperlink on stuff that looks like a
199" URL? Or just color the link to fit with the colorscheme (and only special
200" when hovering)?
201" * Bug: Opera does not allow printing more than one page if uncopyable
202" regions is turned on. Possible solution: Add normal text line numbers with
203" display:none, set to display:inline for print style sheets, and hide
204" <input> elements for print, to allow Opera printing multiple pages (and
205" other uncopyable areas?). May need to make the new text invisible to IE
206" with conditional comments to prevent copying it, IE for some reason likes
207" to copy hidden text. Other browsers too?
208" * Bug: still a 1px gap throughout the fold column when html_prevent_copy is
209" "fn" in some browsers. Specifically, in Chromium on Ubuntu (but not Chrome
210" on Windows). Perhaps it is font related?
211" * Bug: still some gaps in the fold column when html_prevent_copy contains
212" 'd' and showing the whole diff (observed in multiple browsers). Only gaps
213" on diff lines though.
214" * Undercurl support via CSS3, with fallback to dotted or something:
215" https://groups.google.com/d/topic/vim_use/BzXA6He1pHg/discussion
216" * Redo updates for modified default foldtext (v11) when/if the patch is
217" accepted to modify it.
218" * Test case +diff_one_file-dynamic_folds+expand_tabs-hover_unfold
219" +ignore_conceal-ignore_folding+no_foldcolumn+no_pre+no_progress
220" +number_lines-pre_wrap-use_css+use_xhtml+whole_filler.xhtml
221" does not show the whole diff filler as it is supposed to?
222" * Bug: when 'isprint' is wrong for the current encoding, will generate
223" invalid content. Can/should anything be done about this? Maybe a separate
224" plugin to correct 'isprint' based on encoding?
225" * Check to see if the windows-125\d encodings actually work in Unix without
226" the 8bit- prefix. Add prefix to autoload dictionaries for Unix if not.
227" * Font auto-detection similar to
228" http://www.vim.org/scripts/script.php?script_id=2384 but for a variety of
229" platforms.
230" * Pull in code from http://www.vim.org/scripts/script.php?script_id=3113 :
231" - listchars support
232" - full-line background highlight
233" - other?
234" * Make it so deleted lines in a diff don't create side-scrolling (get it
235" free with full-line background highlight above).
236" * Restore open/closed folds and cursor position after processing each file
237" with option not to restore for speed increase.
238" * Add extra meta info (generation time, etc.)?
239" * Tidy up so we can use strict doctype in even more situations
240" * Implementation detail: add threshold for writing the lines to the html
241" buffer before we're done (5000 or so lines should do it)
242" * TODO comments for code cleanup scattered throughout
243"}}}
244
Bram Moolenaarb02cbe32010-07-11 22:38:52 +0200245" Define the :TOhtml command when:
246" - 'compatible' is not set
Bram Moolenaarf0d58ef2018-11-16 16:13:44 +0100247" - this plugin or user override was not already loaded
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200248" - user commands are available. {{{
Bram Moolenaar071d4272004-06-13 20:20:40 +0000249if !&cp && !exists(":TOhtml") && has("user_commands")
Bram Moolenaar543b7ef2013-06-01 14:50:56 +0200250 command -range=% -bar TOhtml :call tohtml#Convert2HTML(<line1>, <line2>)
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200251endif "}}}
Bram Moolenaar349b2fb2010-07-16 20:35:36 +0200252
253" Make sure any patches will probably use consistent indent
Bram Moolenaar6c35bea2012-07-25 17:49:10 +0200254" vim: ts=8 sw=2 sts=2 noet fdm=marker