xref: /vim-8.2.3635/runtime/plugin/tohtml.vim (revision 6c391a74)
1" Vim plugin for converting a syntax highlighted file to HTML.
2" Maintainer: Ben Fritz <[email protected]>
3" Last Change: 2019 Nov 13
4"
5" The core of the code is in $VIMRUNTIME/autoload/tohtml.vim and
6" $VIMRUNTIME/syntax/2html.vim
7"
8if exists('g:loaded_2html_plugin')
9  finish
10endif
11let g:loaded_2html_plugin = 'vim8.1_v2'
12
13"
14" Changelog: {{{
15"   8.1_v2  (this version): - Fix Bitbucket issue #19: fix calculation of tab
16"                             stop position to use in expanding a tab, when that
17"                             tab occurs after a syntax match which in turn
18"                             comes after previously expanded tabs.
19"                           - Set eventignore while splitting a window for the
20"                             destination file to ignore FileType events;
21"                             speeds up processing when the destination file
22"                             already exists and HTML highlight takes too long.
23"                           - Fix Bitbucket issue #20: progress bar could not be
24"                             seen when DiffDelete background color matched
25"                             StatusLine background color. Added TOhtmlProgress
26"                             highlight group for manual user override, but
27"                             calculate it to be visible compared to StatusLine
28"                             by default.
29"                           - Fix Bitbucket issue #1: Remove workaround for old
30"                             browsers which don't support 'ch' CSS unit, since
31"                             all modern browsers, including IE>=9, support it.
32"                           - Fix Bitbucket issue #10: support termguicolors
33"                           - Fix Bitbucket issue #21: default to using
34"                             generated content instead of <input> tags for
35"                             uncopyable text, so that text is correctly
36"                             prevented from being copied in chrome. Use
37"                             g:html_use_input_for_pc option to control the
38"                             method used.
39"                           - Switch to HTML5 to allow using vnu as a validator
40"                             in unit test.
41"                           - Fix fallback sizing of <input> tags for browsers
42"                             without "ch" support.
43"                           - Fix cursor on unselectable diff filler text.
44"   8.1_v1  (Vim 8.1.0528): - Fix Bitbucket issue #6: Don't generate empty
45"                             script tag.
46"                           - Fix Bitbucket issue #5: javascript should
47"                             declare variables with "var".
48"                           - Fix Bitbucket issue #13: errors thrown sourcing
49"                             2html.vim directly when plugins not loaded.
50"                           - Fix Bitbucket issue #16: support 'vartabstop'.
51"
52"   7.4 updates: {{{
53"   7.4_v2  (Vim 7.4.0899): Fix error raised when converting a diff containing
54"                           an empty buffer. Jan Stocker: allow g:html_font to
55"                           take a list so it is easier to specfiy fallback
56"                           fonts in the generated CSS.
57"   7.4_v1  (Vim 7.4.0000): Fix modeline mangling for new "Vim:" format, and
58"			    also for version-specific modelines like "vim>703:".
59"}}}
60"
61"   7.3 updates: {{{
62"   7.3_v14 (Vim 7.3.1246): Allow suppressing line number anchors using
63"			    g:html_line_ids=0. Allow customizing
64"			    important IDs (like line IDs and fold IDs) using
65"			    g:html_id_expr evaluated when the buffer conversion
66"			    is started.
67"   7.3_v13 (Vim 7.3.1088): Keep foldmethod at manual in the generated file and
68"			    insert modeline to set it to manual.
69"			    Fix bug: diff mode with 2 unsaved buffers creates a
70"			    duplicate of one buffer instead of including both.
71"			    Add anchors to each line so you can put '#L123'
72"			    or '#123' at the end of the URL to jump to line 123
73"			    (idea by Andy Spencer). Add javascript to open folds
74"			    to show the anchor being jumped to if it is hidden.
75"			    Fix XML validation error: &nsbp; not part of XML.
76"			    Allow TOhtml to chain together with other commands
77"			    using |.
78"   7.3_v12 (Vim 7.3.0616): Fix modeline mangling to also work for when multiple
79"			    highlight groups make up the start-of-modeline text.
80"			    Improve render time of page with uncopyable regions
81"			    by not using one-input-per-char. Change name of
82"			    uncopyable option from html_unselectable to
83"			    html_prevent_copy. Added html_no_invalid option and
84"			    default to inserting invalid markup for uncopyable
85"			    regions to prevent MS Word from pasting undeletable
86"			    <input> elements. Fix 'cpo' handling (Thilo Six).
87"		 7.3_v12b1: Add html_unselectable option. Rework logic to
88"			    eliminate post-processing substitute commands in
89"			    favor of doing the work up front. Remove unnecessary
90"			    special treatment of 'LineNr' highlight group. Minor
91"			    speed improvements. Fix modeline mangling in
92"			    generated output so it works for text in the first
93"			    column. Fix missing line number and fold column in
94"			    diff filler lines. Fix that some fonts have a 1px
95"			    gap (using a dirty hack, improvements welcome). Add
96"			    "colorscheme" meta tag. Does NOT include support for
97"			    the new default foldtext added in v11, as the patch
98"			    adding it has not yet been included in Vim.
99"   7.3_v11 ( unreleased ): Support new default foldtext from patch by Christian
100"			    Brabandt in
101"			    http://groups.google.com/d/topic/vim_dev/B6FSGfq9VoI/discussion.
102"			    This patch has not yet been included in Vim, thus
103"			    these changes are removed in the next version.
104"   7.3_v10 (Vim 7.3.0227): Fix error E684 when converting a range wholly inside
105"			    multiple nested folds with dynamic folding on.
106"			    Also fix problem with foldtext in this situation.
107"   7.3_v9  (Vim 7.3.0170): Add html_pre_wrap option active with html_use_css
108"			    and without html_no_pre, default value same as
109"			    'wrap' option, (Andy Spencer). Don't use
110"			    'fileencoding' for converted document encoding if
111"			    'buftype' indicates a special buffer which isn't
112"			    written.
113"   7.3_v8  (Vim 7.3.0100): Add html_expand_tabs option to allow leaving tab
114"			    characters in generated output (Andy Spencer).
115"			    Escape text that looks like a modeline so Vim
116"			    doesn't use anything in the converted HTML as a
117"			    modeline. Bugfixes: Fix folding when a fold starts
118"			    before the conversion range. Remove fold column when
119"			    there are no folds.
120"   7.3_v7  (Vim 7-3-0063): see betas released on vim_dev below:
121"		  7.3_v7b3: Fixed bug, convert Unicode to UTF-8 all the way.
122"		  7.3_v7b2: Remove automatic detection of encodings that are not
123"			    supported by all major browsers according to
124"			    http://wiki.whatwg.org/wiki/Web_Encodings and
125"			    convert to UTF-8 for all Unicode encodings. Make
126"			    HTML encoding to Vim encoding detection be
127"			    case-insensitive for built-in pairs.
128"		  7.3_v7b1: Remove use of setwinvar() function which cannot be
129"			    called in restricted mode (Andy Spencer). Use
130"			    'fencoding' instead of 'encoding' to determine by
131"			    charset, and make sure the 'fenc' of the generated
132"			    file matches its indicated charset. Add charsets for
133"			    all of Vim's natively supported encodings.
134"   7.3_v6  (Vim 7.3.0000): Really fix bug with 'nowrapscan', 'magic' and other
135"			    user settings interfering with diff mode generation,
136"			    trailing whitespace (e.g. line number column) when
137"			    using html_no_pre, and bugs when using
138"			    html_hover_unfold.
139"   7.3_v5  ( unreleased ): Fix bug with 'nowrapscan' and also with out-of-sync
140"			    folds in diff mode when first line was folded.
141"   7.3_v4  (Vim 7.3.0000): Bugfixes, especially for xhtml markup, and diff mode
142"   7.3_v3  (Vim 7.3.0000): Refactor option handling and make html_use_css
143"			    default to true when not set to anything. Use strict
144"			    doctypes where possible. Rename use_xhtml option to
145"			    html_use_xhtml for consistency. Use .xhtml extension
146"			    when using this option. Add meta tag for settings.
147"   7.3_v2  (Vim 7.3.0000): Fix syntax highlighting in diff mode to use both the
148"			    diff colors and the normal syntax colors
149"   7.3_v1  (Vim 7.3.0000): Add conceal support and meta tags in output
150"}}}
151"}}}
152
153" TODO: {{{
154"   * Check the issue tracker:
155"     https://bitbucket.org/fritzophrenic/vim-tohtml/issues?status=new&status=open
156"   * Options for generating the CSS in external style sheets. New :TOcss
157"     command to convert the current color scheme into a (mostly) generic CSS
158"     stylesheet which can be re-used. Alternate stylesheet support? Good start
159"     by Erik Falor
160"     ( https://groups.google.com/d/topic/vim_use/7XTmC4D22dU/discussion ).
161"   * Add optional argument to :TOhtml command to specify mode (gui, cterm,
162"     term) to use for the styling. Suggestion by "nacitar".
163"   * Add way to override or specify which RGB colors map to the color numbers
164"     in cterm. Get better defaults than just guessing? Suggestion by "nacitar".
165"   * Disable filetype detection until after all processing is done.
166"   * Add option for not generating the hyperlink on stuff that looks like a
167"     URL? Or just color the link to fit with the colorscheme (and only special
168"     when hovering)?
169"   * Bug: Opera does not allow printing more than one page if uncopyable
170"     regions is turned on. Possible solution: Add normal text line numbers with
171"     display:none, set to display:inline for print style sheets, and hide
172"     <input> elements for print, to allow Opera printing multiple pages (and
173"     other uncopyable areas?). May need to make the new text invisible to IE
174"     with conditional comments to prevent copying it, IE for some reason likes
175"     to copy hidden text. Other browsers too?
176"   * Bug: still a 1px gap throughout the fold column when html_prevent_copy is
177"     "fn" in some browsers. Specifically, in Chromium on Ubuntu (but not Chrome
178"     on Windows). Perhaps it is font related?
179"   * Bug: still some gaps in the fold column when html_prevent_copy contains
180"     'd' and showing the whole diff (observed in multiple browsers). Only gaps
181"     on diff lines though.
182"   * Undercurl support via CSS3, with fallback to dotted or something:
183"	https://groups.google.com/d/topic/vim_use/BzXA6He1pHg/discussion
184"   * Redo updates for modified default foldtext (v11) when/if the patch is
185"     accepted to modify it.
186"   * Test case +diff_one_file-dynamic_folds+expand_tabs-hover_unfold
187"		+ignore_conceal-ignore_folding+no_foldcolumn+no_pre+no_progress
188"		+number_lines-pre_wrap-use_css+use_xhtml+whole_filler.xhtml
189"     does not show the whole diff filler as it is supposed to?
190"   * Bug: when 'isprint' is wrong for the current encoding, will generate
191"     invalid content. Can/should anything be done about this? Maybe a separate
192"     plugin to correct 'isprint' based on encoding?
193"   * Check to see if the windows-125\d encodings actually work in Unix without
194"     the 8bit- prefix. Add prefix to autoload dictionaries for Unix if not.
195"   * Font auto-detection similar to
196"     http://www.vim.org/scripts/script.php?script_id=2384 but for a variety of
197"     platforms.
198"   * Pull in code from http://www.vim.org/scripts/script.php?script_id=3113 :
199"	- listchars support
200"	- full-line background highlight
201"	- other?
202"   * Make it so deleted lines in a diff don't create side-scrolling (get it
203"     free with full-line background highlight above).
204"   * Restore open/closed folds and cursor position after processing each file
205"     with option not to restore for speed increase.
206"   * Add extra meta info (generation time, etc.)?
207"   * Tidy up so we can use strict doctype in even more situations
208"   * Implementation detail: add threshold for writing the lines to the html
209"     buffer before we're done (5000 or so lines should do it)
210"   * TODO comments for code cleanup scattered throughout
211"}}}
212
213" Define the :TOhtml command when:
214" - 'compatible' is not set
215" - this plugin or user override was not already loaded
216" - user commands are available. {{{
217if !&cp && !exists(":TOhtml") && has("user_commands")
218  command -range=% -bar TOhtml :call tohtml#Convert2HTML(<line1>, <line2>)
219endif "}}}
220
221" Make sure any patches will probably use consistent indent
222"   vim: ts=8 sw=2 sts=2 noet fdm=marker
223