aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAshkan Kiani <ashkan.k.kiani@gmail.com>2019-10-17 16:26:20 -0700
committerAshkan Kiani <ashkan.k.kiani@gmail.com>2019-10-17 16:26:20 -0700
commit94197db4be1c82ddfb67dafa576e9bc7e77e657e (patch)
treeda2b7b04285585e204a8858c3d0a48fe9181db13
parentInitial commit. (diff)
Add readme, docs, rgb(), #RGB, and options
- Add support for `rgb(...)` functions behind an option gate. - Highlight #RGB codes. - Add options, like `rgb_fn` and `no_names` - Add luadoc.
-rw-r--r--README.md81
-rw-r--r--doc/index.html65
-rw-r--r--doc/ldoc.css303
-rw-r--r--doc/modules/colorizer.html237
-rw-r--r--doc/modules/trie.html66
-rw-r--r--lua/colorizer.lua79
-rw-r--r--lua/trie.lua2
7 files changed, 823 insertions, 10 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..29e274e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,81 @@
+# colorizer.lua
+
+[![luadoc](https://img.shields.io/badge/luadoc-0.1-blue)](https://norcalli.github.io/luadoc/nvim-colorizer.lua/doc/modules/colorizer.html)
+
+A high-performance color highlighter for Neovim which has **no external dependencies**! Written in performant Luajit.
+
+## Installation and Usage
+
+Use your plugin manager or clone directly into your `runtimepath`.
+
+```vim
+Plug 'norcalli/nvim-colorizer.lua'
+```
+
+As long as you have `malloc()` and `free()` on your system, this will work. Which includes Linux, OSX, and Windows.
+
+One line setup. This will create an `autocmd` for `FileType *` to highlight every filetype.
+
+```vim
+lua require'colorizer'.setup()
+```
+
+### Why another highlighter?
+
+This has no external dependencies, which means you install it and it works. Other colorizers typically were synchronous and slow, as well. Being written with performance in mind and leveraging the excellent LuaJIT and a handwritten parser, updates can be done in real time. There are plugins such as [hexokinase](https://github.com/RRethy/vim-hexokinase) which have good performance, but it has some difficulty with becoming out of sync. The downside is that *this only works for Neovim*, and that will never change.
+
+Additionally, having a Lua API that's available means users can use this as a library to do custom highlighting themselves.
+
+### Customization
+
+The available highlight modes are `foreground`, `background`. The default is
+`background`.
+
+Full options list:
+- `no_names`: Disable parsing names like "Blue"
+- `rgb_fn`: Enable parsing `rgb(...)` functions.
+- `mode`: Highlight mode. Valid options: `foreground`,`background`
+
+For basic setup, you can use a command like the following.
+
+```lua
+-- Attaches to every FileType mode
+require 'colorizer'.setup()
+
+-- Attach to certain Filetypes, add special configuration for `html`
+-- Use `background` for everything else.
+require 'colorizer'.setup {
+ 'css';
+ 'javascript';
+ html = {
+ mode = 'foreground';
+ }
+}
+
+-- Use the `default_options` as the second parameter, which uses
+-- `foreground` for every mode. This is the inverse of the previous
+-- setup configuration.
+require 'colorizer'.setup({
+ 'css';
+ 'javascript';
+ html = { mode = 'background' };
+}, { mode = 'foreground' })
+
+-- Use the `default_options` as the second parameter, which uses
+-- `foreground` for every mode. This is the inverse of the previous
+-- setup configuration.
+require 'colorizer'.setup {
+ '*'; -- Highlight all files, but customize some others.
+ css = { rgb_fn = true; }; -- Enable parsing rgb(...) functions in css.
+ html = { no_names = true; } -- Disable parsing "names" like Blue or Gray
+}
+```
+
+
+For lower level interface, see the [LuaDocs for API details](https://norcalli.github.io/luadoc/nvim-colorizer.lua/doc/modules/colorizer.html) or use `:h colorizer.lua` once installed.
+
+## TODO
+
+- [ ] Add more display modes?
+- [ ] Use a more space efficient trie implementation.
+- [ ] Create a COMMON_SETUP which does obvious things like enable `rgb_fn` for css
diff --git a/doc/index.html b/doc/index.html
new file mode 100644
index 0000000..371e5da
--- /dev/null
+++ b/doc/index.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="ldoc.css" type="text/css" />
+</head>
+<body>
+
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+
+<div id="main">
+
+
+<!-- Menu -->
+
+<div id="navigation">
+<br/>
+<h1>ldoc</h1>
+
+
+
+
+<h2>Modules</h2>
+<ul class="nowrap">
+ <li><a href="modules/colorizer.html">colorizer</a></li>
+ <li><a href="modules/trie.html">trie</a></li>
+</ul>
+
+</div>
+
+<div id="content">
+
+
+
+<h2>Modules</h2>
+<table class="module_list">
+ <tr>
+ <td class="name" nowrap><a href="modules/colorizer.html">colorizer</a></td>
+ <td class="summary">Highlights terminal CSI ANSI color codes.</td>
+ </tr>
+ <tr>
+ <td class="name" nowrap><a href="modules/trie.html">trie</a></td>
+ <td class="summary">Trie implementation in luajit
+ Copyright © 2019 Ashkan Kiani</td>
+ </tr>
+</table>
+
+</div> <!-- id="content" -->
+</div> <!-- id="main" -->
+<div id="about">
+<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
+<i style="float:right;">Last updated 2019-10-17 16:25:49 </i>
+</div> <!-- id="about" -->
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/doc/ldoc.css b/doc/ldoc.css
new file mode 100644
index 0000000..52c4ad2
--- /dev/null
+++ b/doc/ldoc.css
@@ -0,0 +1,303 @@
+/* BEGIN RESET
+
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 2.8.2r1
+*/
+html {
+ color: #000;
+ background: #FFF;
+}
+body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td {
+ margin: 0;
+ padding: 0;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+fieldset,img {
+ border: 0;
+}
+address,caption,cite,code,dfn,em,strong,th,var,optgroup {
+ font-style: inherit;
+ font-weight: inherit;
+}
+del,ins {
+ text-decoration: none;
+}
+li {
+ margin-left: 20px;
+}
+caption,th {
+ text-align: left;
+}
+h1,h2,h3,h4,h5,h6 {
+ font-size: 100%;
+ font-weight: bold;
+}
+q:before,q:after {
+ content: '';
+}
+abbr,acronym {
+ border: 0;
+ font-variant: normal;
+}
+sup {
+ vertical-align: baseline;
+}
+sub {
+ vertical-align: baseline;
+}
+legend {
+ color: #000;
+}
+input,button,textarea,select,optgroup,option {
+ font-family: inherit;
+ font-size: inherit;
+ font-style: inherit;
+ font-weight: inherit;
+}
+input,button,textarea,select {*font-size:100%;
+}
+/* END RESET */
+
+body {
+ margin-left: 1em;
+ margin-right: 1em;
+ font-family: arial, helvetica, geneva, sans-serif;
+ background-color: #ffffff; margin: 0px;
+}
+
+code, tt { font-family: monospace; font-size: 1.1em; }
+span.parameter { font-family:monospace; }
+span.parameter:after { content:":"; }
+span.types:before { content:"("; }
+span.types:after { content:")"; }
+.type { font-weight: bold; font-style:italic }
+
+body, p, td, th { font-size: .95em; line-height: 1.2em;}
+
+p, ul { margin: 10px 0 0 0px;}
+
+strong { font-weight: bold;}
+
+em { font-style: italic;}
+
+h1 {
+ font-size: 1.5em;
+ margin: 20px 0 20px 0;
+}
+h2, h3, h4 { margin: 15px 0 10px 0; }
+h2 { font-size: 1.25em; }
+h3 { font-size: 1.15em; }
+h4 { font-size: 1.06em; }
+
+a:link { font-weight: bold; color: #004080; text-decoration: none; }
+a:visited { font-weight: bold; color: #006699; text-decoration: none; }
+a:link:hover { text-decoration: underline; }
+
+hr {
+ color:#cccccc;
+ background: #00007f;
+ height: 1px;
+}
+
+blockquote { margin-left: 3em; }
+
+ul { list-style-type: disc; }
+
+p.name {
+ font-family: "Andale Mono", monospace;
+ padding-top: 1em;
+}
+
+pre {
+ background-color: rgb(245, 245, 245);
+ border: 1px solid #C0C0C0; /* silver */
+ padding: 10px;
+ margin: 10px 0 10px 0;
+ overflow: auto;
+ font-family: "Andale Mono", monospace;
+}
+
+pre.example {
+ font-size: .85em;
+}
+
+table.index { border: 1px #00007f; }
+table.index td { text-align: left; vertical-align: top; }
+
+#container {
+ margin-left: 1em;
+ margin-right: 1em;
+ background-color: #f0f0f0;
+}
+
+#product {
+ text-align: center;
+ border-bottom: 1px solid #cccccc;
+ background-color: #ffffff;
+}
+
+#product big {
+ font-size: 2em;
+}
+
+#main {
+ background-color: #f0f0f0;
+ border-left: 2px solid #cccccc;
+}
+
+#navigation {
+ float: left;
+ width: 14em;
+ vertical-align: top;
+ background-color: #f0f0f0;
+ overflow: visible;
+}
+
+#navigation h2 {
+ background-color:#e7e7e7;
+ font-size:1.1em;
+ color:#000000;
+ text-align: left;
+ padding:0.2em;
+ border-top:1px solid #dddddd;
+ border-bottom:1px solid #dddddd;
+}
+
+#navigation ul
+{
+ font-size:1em;
+ list-style-type: none;
+ margin: 1px 1px 10px 1px;
+}
+
+#navigation li {
+ text-indent: -1em;
+ display: block;
+ margin: 3px 0px 0px 22px;
+}
+
+#navigation li li a {
+ margin: 0px 3px 0px -1em;
+}
+
+#content {
+ margin-left: 14em;
+ padding: 1em;
+ width: 700px;
+ border-left: 2px solid #cccccc;
+ border-right: 2px solid #cccccc;
+ background-color: #ffffff;
+}
+
+#about {
+ clear: both;
+ padding: 5px;
+ border-top: 2px solid #cccccc;
+ background-color: #ffffff;
+}
+
+@media print {
+ body {
+ font: 12pt "Times New Roman", "TimeNR", Times, serif;
+ }
+ a { font-weight: bold; color: #004080; text-decoration: underline; }
+
+ #main {
+ background-color: #ffffff;
+ border-left: 0px;
+ }
+
+ #container {
+ margin-left: 2%;
+ margin-right: 2%;
+ background-color: #ffffff;
+ }
+
+ #content {
+ padding: 1em;
+ background-color: #ffffff;
+ }
+
+ #navigation {
+ display: none;
+ }
+ pre.example {
+ font-family: "Andale Mono", monospace;
+ font-size: 10pt;
+ page-break-inside: avoid;
+ }
+}
+
+table.module_list {
+ border-width: 1px;
+ border-style: solid;
+ border-color: #cccccc;
+ border-collapse: collapse;
+}
+table.module_list td {
+ border-width: 1px;
+ padding: 3px;
+ border-style: solid;
+ border-color: #cccccc;
+}
+table.module_list td.name { background-color: #f0f0f0; min-width: 200px; }
+table.module_list td.summary { width: 100%; }
+
+
+table.function_list {
+ border-width: 1px;
+ border-style: solid;
+ border-color: #cccccc;
+ border-collapse: collapse;
+}
+table.function_list td {
+ border-width: 1px;
+ padding: 3px;
+ border-style: solid;
+ border-color: #cccccc;
+}
+table.function_list td.name { background-color: #f0f0f0; min-width: 200px; }
+table.function_list td.summary { width: 100%; }
+
+ul.nowrap {
+ overflow:auto;
+ white-space:nowrap;
+}
+
+dl.table dt, dl.function dt {border-top: 1px solid #ccc; padding-top: 1em;}
+dl.table dd, dl.function dd {padding-bottom: 1em; margin: 10px 0 0 20px;}
+dl.table h3, dl.function h3 {font-size: .95em;}
+
+/* stop sublists from having initial vertical space */
+ul ul { margin-top: 0px; }
+ol ul { margin-top: 0px; }
+ol ol { margin-top: 0px; }
+ul ol { margin-top: 0px; }
+
+/* make the target distinct; helps when we're navigating to a function */
+a:target + * {
+ background-color: #FF9;
+}
+
+
+/* styles for prettification of source */
+pre .comment { color: #558817; }
+pre .constant { color: #a8660d; }
+pre .escape { color: #844631; }
+pre .keyword { color: #aa5050; font-weight: bold; }
+pre .library { color: #0e7c6b; }
+pre .marker { color: #512b1e; background: #fedc56; font-weight: bold; }
+pre .string { color: #8080ff; }
+pre .number { color: #f8660d; }
+pre .operator { color: #2239a8; font-weight: bold; }
+pre .preprocessor, pre .prepro { color: #a33243; }
+pre .global { color: #800080; }
+pre .user-keyword { color: #800080; }
+pre .prompt { color: #558817; }
+pre .url { color: #272fc2; text-decoration: underline; }
+
diff --git a/doc/modules/colorizer.html b/doc/modules/colorizer.html
new file mode 100644
index 0000000..adce131
--- /dev/null
+++ b/doc/modules/colorizer.html
@@ -0,0 +1,237 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../ldoc.css" type="text/css" />
+</head>
+<body>
+
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+
+<div id="main">
+
+
+<!-- Menu -->
+
+<div id="navigation">
+<br/>
+<h1>ldoc</h1>
+
+<ul>
+ <li><a href="../index.html">Index</a></li>
+</ul>
+
+<h2>Contents</h2>
+<ul>
+<li><a href="#Functions">Functions</a></li>
+<li><a href="#Fields">Fields</a></li>
+</ul>
+
+
+<h2>Modules</h2>
+<ul class="nowrap">
+ <li><strong>colorizer</strong></li>
+ <li><a href="../modules/trie.html">trie</a></li>
+</ul>
+
+</div>
+
+<div id="content">
+
+<h1>Module <code>colorizer</code></h1>
+<p>Highlights terminal CSI ANSI color codes.</p>
+<p></p>
+
+
+<h2><a href="#Functions">Functions</a></h2>
+<table class="function_list">
+ <tr>
+ <td class="name" nowrap><a href="#highlight_buffer">highlight_buffer (buf[, ns=DEFAULT_NAMESPACE], lines, line_start[, options])</a></td>
+ <td class="summary">Highlight the buffer region.</td>
+ </tr>
+ <tr>
+ <td class="name" nowrap><a href="#attach_to_buffer">attach_to_buffer ([buf=0[, options]])</a></td>
+ <td class="summary">Attach to a buffer and continuously highlight changes.</td>
+ </tr>
+ <tr>
+ <td class="name" nowrap><a href="#setup">setup ([filetypes={'*'}[, default_options]])</a></td>
+ <td class="summary">Easy to use function if you want the full setup without fine grained control.</td>
+ </tr>
+</table>
+<h2><a href="#Fields">Fields</a></h2>
+<table class="function_list">
+ <tr>
+ <td class="name" nowrap><a href="#DEFAULT_NAMESPACE">DEFAULT_NAMESPACE</a></td>
+ <td class="summary">Default namespace used in `highlight_buffer` and `attach_to_buffer`.</td>
+ </tr>
+</table>
+
+<br/>
+<br/>
+
+
+ <h2 class="section-header "><a name="Functions"></a>Functions</h2>
+
+ <dl class="function">
+ <dt>
+ <a name = "highlight_buffer"></a>
+ <strong>highlight_buffer (buf[, ns=DEFAULT_NAMESPACE], lines, line_start[, options])</strong>
+ </dt>
+ <dd>
+ Highlight the buffer region.
+Highlight starting from `line_start` (0-indexed) for each line described by `lines` in the
+buffer `buf` and attach it to the namespace `ns`.
+
+
+
+ <h3>Parameters:</h3>
+ <ul>
+ <li><span class="parameter">buf</span>
+ <span class="types"><span class="type">integer</span></span>
+ buffer id.
+ </li>
+ <li><span class="parameter">ns</span>
+ <span class="types"><span class="type">integer</span></span>
+ the namespace id. Create it with `vim.api.create_namespace`
+ (<em>default</em> DEFAULT_NAMESPACE)
+ </li>
+ <li><span class="parameter">lines</span>
+ <span class="types"><a class="type" href="https://www.lua.org/manual/5.3/manual.html#6.4">{string,...}</a></span>
+ the lines to highlight from the buffer.
+ </li>
+ <li><span class="parameter">line_start</span>
+ <span class="types"><span class="type">integer</span></span>
+ should be 0-indexed
+ </li>
+ <li><span class="parameter">options</span>
+ Configuration options as described in `setup`
+ (<em>optional</em>)
+ </li>
+ </ul>
+
+
+
+ <h3>See also:</h3>
+ <ul>
+ <a href="../modules/colorizer.html#setup">setup</a>
+ </ul>
+
+
+</dd>
+ <dt>
+ <a name = "attach_to_buffer"></a>
+ <strong>attach_to_buffer ([buf=0[, options]])</strong>
+ </dt>
+ <dd>
+ Attach to a buffer and continuously highlight changes.
+
+
+ <h3>Parameters:</h3>
+ <ul>
+ <li><span class="parameter">buf</span>
+ <span class="types"><span class="type">integer</span></span>
+ A value of 0 implies the current buffer.
+ (<em>default</em> 0)
+ </li>
+ <li><span class="parameter">options</span>
+ Configuration options as described in `setup`
+ (<em>optional</em>)
+ </li>
+ </ul>
+
+
+
+ <h3>See also:</h3>
+ <ul>
+ <a href="../modules/colorizer.html#setup">setup</a>
+ </ul>
+
+
+</dd>
+ <dt>
+ <a name = "setup"></a>
+ <strong>setup ([filetypes={'*'}[, default_options]])</strong>
+ </dt>
+ <dd>
+ Easy to use function if you want the full setup without fine grained control.
+ Setup an autocmd which enables colorizing for the filetypes and options specified.
+<p> By default highlights all FileTypes.
+<p> Example config:
+ ```
+ { 'scss', 'html', css = { rgb_fn = true; }, javascript = { no_names = true } }
+ ```
+<p> You can combine an array and more specific options.
+ Possible options:
+ - `no_names`: Don't highlight names like Blue
+ - `rgb_fn`: Highlight `rgb(...)` functions.
+ - `mode`: Highlight mode. Valid options: `foreground`,`background`
+
+
+
+ <h3>Parameters:</h3>
+ <ul>
+ <li><span class="parameter">filetypes</span>
+ A table/array of filetypes to selectively enable and/or customize. By default, enables all filetypes.
+ (<em>default</em> {'*'})
+ </li>
+ <li><span class="parameter">default_options</span>
+ <span class="types"><a class="type" href="https://www.lua.org/manual/5.3/manual.html#6.4">{[string]=string}</a></span>
+ Default options to apply for the filetypes enable.
+ (<em>optional</em>)
+ </li>
+ </ul>
+
+
+
+
+ <h3>Usage:</h3>
+ <ul>
+ <pre class="example"><span class="global">require</span><span class="string">'colorizer'</span>.setup()</pre>
+ </ul>
+
+</dd>
+</dl>
+ <h2 class="section-header "><a name="Fields"></a>Fields</h2>
+
+ <dl class="function">
+ <dt>
+ <a name = "DEFAULT_NAMESPACE"></a>
+ <strong>DEFAULT_NAMESPACE</strong>
+ </dt>
+ <dd>
+ Default namespace used in `highlight_buffer` and `attach_to_buffer`.
+ The name is "terminal_highlight"
+
+
+
+
+
+ <h3>See also:</h3>
+ <ul>
+ <li><a href="../modules/colorizer.html#highlight_buffer">highlight_buffer</a></li>
+ <li><a href="../modules/colorizer.html#attach_to_buffer">attach_to_buffer</a></li>
+ </ul>
+
+
+</dd>
+</dl>
+
+
+</div> <!-- id="content" -->
+</div> <!-- id="main" -->
+<div id="about">
+<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
+<i style="float:right;">Last updated 2019-10-17 16:25:49 </i>
+</div> <!-- id="about" -->
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/doc/modules/trie.html b/doc/modules/trie.html
new file mode 100644
index 0000000..898b18e
--- /dev/null
+++ b/doc/modules/trie.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../ldoc.css" type="text/css" />
+</head>
+<body>
+
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+
+<div id="main">
+
+
+<!-- Menu -->
+
+<div id="navigation">
+<br/>
+<h1>ldoc</h1>
+
+<ul>
+ <li><a href="../index.html">Index</a></li>
+</ul>
+
+
+
+<h2>Modules</h2>
+<ul class="nowrap">
+ <li><a href="../modules/colorizer.html">colorizer</a></li>
+ <li><strong>trie</strong></li>
+</ul>
+
+</div>
+
+<div id="content">
+
+<h1>Module <code>trie</code></h1>
+<p>Trie implementation in luajit
+ Copyright © 2019 Ashkan Kiani</p>
+<p></p>
+
+
+
+<br/>
+<br/>
+
+
+
+
+</div> <!-- id="content" -->
+</div> <!-- id="main" -->
+<div id="about">
+<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
+<i style="float:right;">Last updated 2019-10-17 16:25:49 </i>
+</div> <!-- id="about" -->
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/lua/colorizer.lua b/lua/colorizer.lua
index 03d2bbc..c53057d 100644
--- a/lua/colorizer.lua
+++ b/lua/colorizer.lua
@@ -1,5 +1,5 @@
--- Highlights terminal CSI ANSI color codes.
--- @module terminal
+-- @module colorizer
local nvim = require 'nvim'
local Trie = require 'trie'
@@ -12,6 +12,7 @@ local DEFAULT_NAMESPACE = nvim.create_namespace 'colorizer'
local COLOR_MAP
local COLOR_TRIE
+--- Setup the COLOR_MAP and COLOR_TRIE
local function initialize_trie()
if not COLOR_TRIE then
COLOR_MAP = nvim.get_color_map()
@@ -69,9 +70,17 @@ end
local function create_highlight(rgb_hex, options)
-- TODO validate rgb format?
+ rgb_hex = rgb_hex:lower()
local highlight_name = highlight_cache[rgb_hex]
-- Look up in our cache.
if not highlight_name then
+ if #rgb_hex == 3 then
+ rgb_hex = table.concat {
+ rgb_hex:sub(1,1):rep(2);
+ rgb_hex:sub(2,2):rep(2);
+ rgb_hex:sub(3,3):rep(2);
+ }
+ end
-- Create the highlight
highlight_name = make_highlight_name(rgb_hex)
if options.mode == 'foreground' then
@@ -116,6 +125,8 @@ buffer `buf` and attach it to the namespace `ns`.
@tparam[opt=DEFAULT_NAMESPACE] integer ns the namespace id. Create it with `vim.api.create_namespace`
@tparam {string,...} lines the lines to highlight from the buffer.
@tparam integer line_start should be 0-indexed
+@param[opt] options Configuration options as described in `setup`
+@see setup
]]
local function highlight_buffer(buf, ns, lines, line_start, options)
options = options or {}
@@ -127,7 +138,23 @@ local function highlight_buffer(buf, ns, lines, line_start, options)
current_linenum = current_linenum - 1 + line_start
local i = 1
while i < #line do
+ if options.rgb_fn then
+ -- TODO this can have improved performance by either reusing my trie or
+ -- doing a byte comp.
+ line:gsub("()rgb%(%s*(%d+%%?)%s*,%s*(%d+%%?)%s*,%s*(%d+%%?)%s*%)()", function(match_start, r,g,b, match_end)
+ if r:sub(-1,-1) == "%" then r = math.floor(r:sub(1,-2)/100*255) end
+ if g:sub(-1,-1) == "%" then g = math.floor(g:sub(1,-2)/100*255) end
+ if b:sub(-1,-1) == "%" then b = math.floor(b:sub(1,-2)/100*255) end
+ local rgb_hex = ("%02x%02x%02x"):format(r,g,b)
+ if #rgb_hex ~= 6 then
+ return
+ end
+ local highlight_name = create_highlight(rgb_hex, options)
+ nvim.buf_add_highlight(buf, ns, highlight_name, current_linenum, match_start-1, match_end-1)
+ end)
+ end
local byte = line:byte(i)
+ -- # indicates an #RGB or #RRGGBB code
if byte == b_hash then
i = i + 1
if #line >= i + 5 then
@@ -141,14 +168,29 @@ local function highlight_buffer(buf, ns, lines, line_start, options)
end
if not invalid then
local rgb_hex = line:sub(i, i+5)
- -- TODO figure out proper background/foreground
local highlight_name = create_highlight(rgb_hex, options)
-- Subtract one because 0-indexed, subtract another 1 for the '#'
nvim.buf_add_highlight(buf, ns, highlight_name, current_linenum, i-1-1, i+6-1)
i = i + 5
end
+ elseif #line >= i + 2 then
+ local invalid = false
+ for n = i, i+2 do
+ byte = line:byte(n)
+ if not byte_is_hex(byte) then
+ invalid = true
+ break
+ end
+ end
+ if not invalid then
+ local rgb_hex = line:sub(i, i+2)
+ local highlight_name = create_highlight(rgb_hex, options)
+ -- Subtract one because 0-indexed, subtract another 1 for the '#'
+ nvim.buf_add_highlight(buf, ns, highlight_name, current_linenum, i-1-1, i+3-1)
+ i = i + 2
+ end
end
- else
+ elseif not options.no_names then
-- TODO skip if the remaining length is less than the shortest length
-- of an entry in our trie.
local prefix = COLOR_TRIE:longest_prefix(line:sub(i))
@@ -162,6 +204,8 @@ local function highlight_buffer(buf, ns, lines, line_start, options)
else
i = i + 1
end
+ else
+ i = i + 1
end
end
end
@@ -169,7 +213,8 @@ end
--- Attach to a buffer and continuously highlight changes.
-- @tparam[opt=0] integer buf A value of 0 implies the current buffer.
--- @see highlight_buffer
+-- @param[opt] options Configuration options as described in `setup`
+-- @see setup
local function attach_to_buffer(buf, options)
local ns = DEFAULT_NAMESPACE
if buf == 0 or buf == nil then
@@ -196,9 +241,25 @@ local function attach_to_buffer(buf, options)
end
--- Easy to use function if you want the full setup without fine grained control.
--- Establishes an autocmd for `FileType terminal`
+-- Setup an autocmd which enables colorizing for the filetypes and options specified.
+--
+-- By default highlights all FileTypes.
+--
+-- Example config:
+-- ```
+-- { 'scss', 'html', css = { rgb_fn = true; }, javascript = { no_names = true } }
+-- ```
+--
+-- You can combine an array and more specific options.
+-- Possible options:
+-- - `no_names`: Don't highlight names like Blue
+-- - `rgb_fn`: Highlight `rgb(...)` functions.
+-- - `mode`: Highlight mode. Valid options: `foreground`,`background`
+--
+-- @param[opt={'*'}] filetypes A table/array of filetypes to selectively enable and/or customize. By default, enables all filetypes.
+-- @tparam[opt] {[string]=string} default_options Default options to apply for the filetypes enable.
-- @usage require'colorizer'.setup()
-local function auto_setup(filetypes, default_options)
+local function setup(filetypes, default_options)
if not nvim.o.termguicolors then
nvim.err_writeln("&termguicolors must be set")
return
@@ -230,7 +291,7 @@ local function auto_setup(filetypes, default_options)
end
filetype_options[filetype] = options
-- TODO What's the right mode for this? BufEnter?
- nvim.ex.autocmd("FileType", filetype, "lua COLORIZER_SETUP_HOOK(%s)")
+ nvim.ex.autocmd("FileType", filetype, "lua COLORIZER_SETUP_HOOK()")
end
end
nvim.ex.augroup("END")
@@ -239,9 +300,9 @@ end
--- @export
return {
DEFAULT_NAMESPACE = DEFAULT_NAMESPACE;
- setup = auto_setup;
+ setup = setup;
attach_to_buffer = attach_to_buffer;
highlight_buffer = highlight_buffer;
- initialize = initialize_trie;
+ -- initialize = initialize_trie;
}
diff --git a/lua/trie.lua b/lua/trie.lua
index 60750f9..b0751aa 100644
--- a/lua/trie.lua
+++ b/lua/trie.lua
@@ -1,4 +1,4 @@
--- Trie implementation in luajit
+--- Trie implementation in luajit
-- Copyright © 2019 Ashkan Kiani
-- This program is free software: you can redistribute it and/or modify