aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/core/command.lua33
-rw-r--r--data/core/commands/doc.lua6
-rw-r--r--data/core/contextmenu.lua9
-rw-r--r--data/core/doc/init.lua12
-rw-r--r--data/core/keymap.lua142
-rw-r--r--data/core/object.lua5
-rw-r--r--data/core/statusview.lua17
-rw-r--r--data/core/tokenizer.lua22
-rw-r--r--data/core/utf8string.lua2
-rw-r--r--data/plugins/contextmenu.lua3
-rw-r--r--docs/api/renderer.lua57
-rw-r--r--docs/api/utf8extra.lua (renamed from docs/api/utf8.lua)46
-rw-r--r--meson.build1
-rw-r--r--src/api/api.c4
-rw-r--r--src/api/utf8.c2
15 files changed, 222 insertions, 139 deletions
diff --git a/data/core/command.lua b/data/core/command.lua
index bdc1ed34..f54854a4 100644
--- a/data/core/command.lua
+++ b/data/core/command.lua
@@ -6,15 +6,44 @@ command.map = {}
local always_true = function() return true end
-function command.add(predicate, map)
+---Used iternally by command.add, statusview, and contextmenu to generate a
+---function with a condition to evaluate returning the boolean result of this
+---evaluation.
+---
+---If a string predicate is given it is treated as a require import that should
+---return a valid object which is checked against the current active view,
+---eg: "core.docview" will match any view that inherits from DocView. Appending
+---a `!` at the end of the string means we want to match the given object
+---from the import strcitly eg: "core.docview!" only DocView is matched.
+---A function that returns a boolean can be used instead to perform a custom
+---evaluation, setting to nil means always evaluates to true.
+---
+---@param predicate string | table | function
+---@return function
+function command.generate_predicate(predicate)
predicate = predicate or always_true
+ local strict = false
if type(predicate) == "string" then
+ if predicate:match("!$") then
+ strict = true
+ predicate = predicate:gsub("!$", "")
+ end
predicate = require(predicate)
end
if type(predicate) == "table" then
local class = predicate
- predicate = function() return core.active_view:is(class) end
+ if not strict then
+ predicate = function() return core.active_view:extends(class) end
+ else
+ predicate = function() return core.active_view:is(class) end
+ end
end
+ return predicate
+end
+
+
+function command.add(predicate, map)
+ predicate = command.generate_predicate(predicate)
for name, fn in pairs(map) do
assert(not command.map[name], "command already exists: " .. name)
command.map[name] = { predicate = predicate, perform = fn }
diff --git a/data/core/commands/doc.lua b/data/core/commands/doc.lua
index cbecad23..5d953805 100644
--- a/data/core/commands/doc.lua
+++ b/data/core/commands/doc.lua
@@ -180,7 +180,7 @@ local commands = {
local line, col = doc():get_selection()
doc():set_selection(line, col)
end,
-
+
["doc:cut"] = function()
cut_or_copy(true)
end,
@@ -402,11 +402,11 @@ local commands = {
end,
["doc:upper-case"] = function()
- doc():replace(string.upper)
+ doc():replace(string.uupper)
end,
["doc:lower-case"] = function()
- doc():replace(string.lower)
+ doc():replace(string.ulower)
end,
["doc:go-to-line"] = function()
diff --git a/data/core/contextmenu.lua b/data/core/contextmenu.lua
index b1a69d6d..94ef61f8 100644
--- a/data/core/contextmenu.lua
+++ b/data/core/contextmenu.lua
@@ -39,14 +39,7 @@ local function get_item_size(item)
end
function ContextMenu:register(predicate, items)
- if type(predicate) == "string" then
- predicate = require(predicate)
- end
- if type(predicate) == "table" then
- local class = predicate
- predicate = function() return core.active_view:is(class) end
- end
-
+ predicate = command.generate_predicate(predicate)
local width, height = 0, 0 --precalculate the size of context menu
for i, item in ipairs(items) do
if item ~= DIVIDER then
diff --git a/data/core/doc/init.lua b/data/core/doc/init.lua
index 0683b8b0..a2546246 100644
--- a/data/core/doc/init.lua
+++ b/data/core/doc/init.lua
@@ -458,7 +458,7 @@ end
function Doc:replace_cursor(idx, line1, col1, line2, col2, fn)
local old_text = self:get_text(line1, col1, line2, col2)
- local new_text, n = fn(old_text)
+ local new_text, res = fn(old_text)
if old_text ~= new_text then
self:insert(line2, col2, new_text)
self:remove(line1, col1, line2, col2)
@@ -467,22 +467,22 @@ function Doc:replace_cursor(idx, line1, col1, line2, col2, fn)
self:set_selections(idx, line1, col1, line2, col2)
end
end
- return n
+ return res
end
function Doc:replace(fn)
- local has_selection, n = false, 0
+ local has_selection, results = false, { }
for idx, line1, col1, line2, col2 in self:get_selections(true) do
if line1 ~= line2 or col1 ~= col2 then
- n = n + self:replace_cursor(idx, line1, col1, line2, col2, fn)
+ results[idx] = self:replace_cursor(idx, line1, col1, line2, col2, fn)
has_selection = true
end
end
if not has_selection then
self:set_selection(table.unpack(self.selections))
- n = n + self:replace_cursor(1, 1, 1, #self.lines, #self.lines[#self.lines], fn)
+ results[1] = self:replace_cursor(1, 1, 1, #self.lines, #self.lines[#self.lines], fn)
end
- return n
+ return results
end
diff --git a/data/core/keymap.lua b/data/core/keymap.lua
index d24eb85a..139aeb79 100644
--- a/data/core/keymap.lua
+++ b/data/core/keymap.lua
@@ -3,33 +3,111 @@ local command = require "core.command"
local config = require "core.config"
local keymap = {}
+---@alias keymap.shortcut string
+---@alias keymap.command string
+---@alias keymap.modkey string
+---@alias keymap.pressed boolean
+---@alias keymap.map table<keymap.shortcut,keymap.command|keymap.command[]>
+---@alias keymap.rmap table<keymap.command, keymap.shortcut|keymap.shortcut[]>
+
+---Pressed status of mod keys.
+---@type table<keymap.modkey, keymap.pressed>
keymap.modkeys = {}
+
+---List of commands assigned to a shortcut been the key of the map the shortcut.
+---@type keymap.map
keymap.map = {}
+
+---List of shortcuts assigned to a command been the key of the map the command.
+---@type keymap.rmap
keymap.reverse_map = {}
local macos = PLATFORM == "Mac OS X"
-- Thanks to mathewmariani, taken from his lite-macos github repository.
local modkeys_os = require("core.modkeys-" .. (macos and "macos" or "generic"))
+
+---@type table<keymap.modkey, keymap.modkey>
local modkey_map = modkeys_os.map
+
+---@type keymap.modkey[]
local modkeys = modkeys_os.keys
-local function key_to_stroke(k)
+
+---Generates a stroke sequence including currently pressed mod keys.
+---@param key string
+---@return string
+local function key_to_stroke(key)
local stroke = ""
for _, mk in ipairs(modkeys) do
if keymap.modkeys[mk] then
stroke = stroke .. mk .. "+"
end
end
- return stroke .. k
+ return stroke .. key
+end
+
+
+---Remove the given value from an array associated to a key in a table.
+---@param tbl table<string, string> The table containing the key
+---@param k string The key containing the array
+---@param v? string The value to remove from the array
+local function remove_only(tbl, k, v)
+ if tbl[k] then
+ if v then
+ local j = 0
+ for i=1, #tbl[k] do
+ while tbl[k][i + j] == v do
+ j = j + 1
+ end
+ tbl[k][i] = tbl[k][i + j]
+ end
+ else
+ tbl[k] = nil
+ end
+ end
+end
+
+
+---Removes from a keymap.map the bindings that are already registered.
+---@param map keymap.map
+local function remove_duplicates(map)
+ for stroke, commands in pairs(map) do
+ if type(commands) == "string" or type(commands) == "function" then
+ commands = { commands }
+ end
+ if keymap.map[stroke] then
+ for _, registered_cmd in ipairs(keymap.map[stroke]) do
+ local j = 0
+ for i=1, #commands do
+ while commands[i + j] == registered_cmd do
+ j = j + 1
+ end
+ commands[i] = commands[i + j]
+ end
+ end
+ end
+ if #commands < 1 then
+ map[stroke] = nil
+ else
+ map[stroke] = commands
+ end
+ end
end
+---Add bindings by replacing commands that were previously assigned to a shortcut.
+---@param map keymap.map
function keymap.add_direct(map)
for stroke, commands in pairs(map) do
- if type(commands) == "string" then
+ if type(commands) == "string" or type(commands) == "function" then
commands = { commands }
end
+ if keymap.map[stroke] then
+ for _, cmd in ipairs(keymap.map[stroke]) do
+ remove_only(keymap.reverse_map, cmd, stroke)
+ end
+ end
keymap.map[stroke] = commands
for _, cmd in ipairs(commands) do
keymap.reverse_map[cmd] = keymap.reverse_map[cmd] or {}
@@ -38,15 +116,23 @@ function keymap.add_direct(map)
end
end
+
+---Adds bindings by appending commands to already registered shortcut or by
+---replacing currently assigned commands if overwrite is specified.
+---@param map keymap.map
+---@param overwrite? boolean
function keymap.add(map, overwrite)
+ remove_duplicates(map)
for stroke, commands in pairs(map) do
if macos then
stroke = stroke:gsub("%f[%a]ctrl%f[%A]", "cmd")
end
- if type(commands) == "string" or type(commands) == "function" then
- commands = { commands }
- end
if overwrite then
+ if keymap.map[stroke] then
+ for _, cmd in ipairs(keymap.map[stroke]) do
+ remove_only(keymap.reverse_map, cmd, stroke)
+ end
+ end
keymap.map[stroke] = commands
else
keymap.map[stroke] = keymap.map[stroke] or {}
@@ -62,35 +148,34 @@ function keymap.add(map, overwrite)
end
-local function remove_only(tbl, k, v)
- for key, values in pairs(tbl) do
- if key == k then
- if v then
- for i, value in ipairs(values) do
- if value == v then
- table.remove(values, i)
- end
- end
- else
- tbl[key] = nil
- end
- break
- end
- end
+---Unregisters the given shortcut and associated command.
+---@param shortcut string
+---@param cmd string
+function keymap.unbind(shortcut, cmd)
+ remove_only(keymap.map, shortcut, cmd)
+ remove_only(keymap.reverse_map, cmd, shortcut)
end
-function keymap.unbind(key, cmd)
- remove_only(keymap.map, key, cmd)
- remove_only(keymap.reverse_map, cmd, key)
+---Returns all the shortcuts associated to a command unpacked for easy assignment.
+---@param cmd string
+---@return ...
+function keymap.get_binding(cmd)
+ return table.unpack(keymap.reverse_map[cmd] or {})
end
-function keymap.get_binding(cmd)
- return table.unpack(keymap.reverse_map[cmd] or {})
+---Returns all the shortcuts associated to a command packed in a table.
+---@param cmd string
+---@return table<integer, string> | nil shortcuts
+function keymap.get_bindings(cmd)
+ return keymap.reverse_map[cmd]
end
+--------------------------------------------------------------------------------
+-- Events listening
+--------------------------------------------------------------------------------
function keymap.on_key_pressed(k, ...)
local mk = modkey_map[k]
if mk then
@@ -101,7 +186,7 @@ function keymap.on_key_pressed(k, ...)
end
else
local stroke = key_to_stroke(k)
- local commands, performed = keymap.map[stroke]
+ local commands, performed = keymap.map[stroke], false
if commands then
for _, cmd in ipairs(commands) do
if type(cmd) == "function" then
@@ -143,6 +228,9 @@ function keymap.on_key_released(k)
end
+--------------------------------------------------------------------------------
+-- Register default bindings
+--------------------------------------------------------------------------------
if macos then
local keymap_macos = require("core.keymap-macos")
keymap_macos(keymap)
diff --git a/data/core/object.lua b/data/core/object.lua
index 0941ce5d..6a6ea490 100644
--- a/data/core/object.lua
+++ b/data/core/object.lua
@@ -21,6 +21,11 @@ end
function Object:is(T)
+ return getmetatable(self) == T
+end
+
+
+function Object:extends(T)
local mt = getmetatable(self)
while mt do
if mt == T then
diff --git a/data/core/statusview.lua b/data/core/statusview.lua
index b1a45385..542522c7 100644
--- a/data/core/statusview.lua
+++ b/data/core/statusview.lua
@@ -113,9 +113,6 @@ function StatusView.Item:hide() self.visible = false end
---Show the item on the status bar.
function StatusView.Item:show() self.visible = true end
----Function assiged by default when user provides a nil predicate.
-local function predicate_always_true() return true end
-
---A condition to evaluate if the item should be displayed. If a string
---is given it is treated as a require import that should return a valid object
---which is checked against the current active view, the sames applies if a
@@ -123,15 +120,7 @@ local function predicate_always_true() return true end
---perform a custom evaluation, setting to nil means always evaluates to true.
---@param predicate string | table | StatusView.Item.predicate
function StatusView.Item:set_predicate(predicate)
- predicate = predicate or predicate_always_true
- if type(predicate) == "string" then
- predicate = require(predicate)
- end
- if type(predicate) == "table" then
- local class = predicate
- predicate = function() return core.active_view:is(class) end
- end
- self.predicate = predicate
+ self.predicate = command.generate_predicate(predicate)
end
@@ -655,14 +644,14 @@ local function merge_deprecated_items(destination, items, alignment)
local position = alignment == StatusView.Item.LEFT and "left" or "right"
local item_start = StatusView.Item(
- predicate_always_true,
+ nil,
"deprecated:"..position.."-start",
alignment
)
item_start.get_item = items_start
local item_end = StatusView.Item(
- predicate_always_true,
+ nil,
"deprecated:"..position.."-end",
alignment
)
diff --git a/data/core/tokenizer.lua b/data/core/tokenizer.lua
index e0c630a4..ebe550ff 100644
--- a/data/core/tokenizer.lua
+++ b/data/core/tokenizer.lua
@@ -169,12 +169,12 @@ function tokenizer.tokenize(incoming_syntax, text, state)
if p.whole_line[p_idx] and next > 1 then
return
end
- -- go to the start of the next utf-8 character
- while text:byte(next) and common.is_utf8_cont(text, next) do
- next = next + 1
- end
res = p.pattern and { text:ufind((at_start or p.whole_line[p_idx]) and "^" .. code or code, next) }
- or { regex.match(code, text, next, (at_start or p.whole_line[p_idx]) and regex.ANCHORED or 0) }
+ or { regex.match(code, text, text:ucharpos(next), (at_start or p.whole_line[p_idx]) and regex.ANCHORED or 0) }
+ if p.regex and #res > 0 then -- set correct utf8 len for regex result
+ res[2] = res[1] + string.ulen(text:sub(res[1], res[2])) - 1
+ res[1] = next
+ end
if res[1] and close and target[3] then
local count = 0
for i = res[1] - 1, 1, -1 do
@@ -189,7 +189,8 @@ function tokenizer.tokenize(incoming_syntax, text, state)
return table.unpack(res)
end
- while i <= #text do
+ local text_len = text:ulen()
+ while i <= text_len do
-- continue trying to match the end pattern of a pair if we have a state set
if current_pattern_idx > 0 then
local p = current_syntax.patterns[current_pattern_idx]
@@ -262,13 +263,8 @@ function tokenizer.tokenize(incoming_syntax, text, state)
-- consume character if we didn't match
if not matched then
- local n = 0
- -- reach the next character
- while text:byte(i + n + 1) and common.is_utf8_cont(text, i + n + 1) do
- n = n + 1
- end
- push_token(res, "normal", text:usub(i, i + n))
- i = i + n + 1
+ push_token(res, "normal", text:usub(i, i))
+ i = i + 1
end
end
diff --git a/data/core/utf8string.lua b/data/core/utf8string.lua
index 1a2da19b..a22a0ef6 100644
--- a/data/core/utf8string.lua
+++ b/data/core/utf8string.lua
@@ -2,6 +2,8 @@
-- inject utf8 functions to strings
--------------------------------------------------------------------------------
+local utf8 = require "utf8extra"
+
string.ubyte = utf8.byte
string.uchar = utf8.char
string.ufind = utf8.find
diff --git a/data/plugins/contextmenu.lua b/data/plugins/contextmenu.lua
index 29e7c648..a5450056 100644
--- a/data/plugins/contextmenu.lua
+++ b/data/plugins/contextmenu.lua
@@ -3,7 +3,6 @@ local core = require "core"
local command = require "core.command"
local keymap = require "core.keymap"
local ContextMenu = require "core.contextmenu"
-local DocView = require "core.docview"
local RootView = require "core.rootview"
local menu = ContextMenu()
@@ -33,7 +32,7 @@ function RootView:draw(...)
menu:draw()
end
-command.add(function() return getmetatable(core.active_view) == DocView end, {
+command.add("core.docview!", {
["context:show"] = function()
menu:show(core.active_view.position.x, core.active_view.position.y)
end
diff --git a/docs/api/renderer.lua b/docs/api/renderer.lua
index 7a9b636d..8738a7c1 100644
--- a/docs/api/renderer.lua
+++ b/docs/api/renderer.lua
@@ -6,7 +6,9 @@
renderer = {}
---
----Represents a color used by the rendering functions.
+---Array of bytes that represents a color used by the rendering functions.
+---Note: indexes for rgba are numerical 1 = r, 2 = g, 3 = b, 4 = a but for
+---documentation purposes the letters r, g, b, a were used.
---@class renderer.color
---@field public r number Red
---@field public g number Green
@@ -17,7 +19,7 @@ renderer.color = {}
---
---Represent options that affect a font's rendering.
---@class renderer.fontoptions
----@field public antialiasing "'grayscale'" | "'subpixel'"
+---@field public antialiasing "'none'" | "'grayscale'" | "'subpixel'"
---@field public hinting "'slight'" | "'none'" | '"full"'
-- @field public bold boolean
-- @field public italic boolean
@@ -39,6 +41,16 @@ renderer.font = {}
function renderer.font.load(path, size, options) end
---
+---Combines an array of fonts into a single one for broader charset support,
+---the order of the list determines the fonts precedence when retrieving
+---a symbol from it.
+---
+---@param fonts renderer.font[]
+---
+---@return renderer.font
+function renderer.font.group(fonts) end
+
+---
---Clones a font object into a new one.
---
---@param size? number Optional new size for cloned font.
@@ -81,25 +93,6 @@ function renderer.font:get_size() end
function renderer.font:set_size(size) end
---
----Assistive functionality to replace characters in a
----rendered text with other characters.
----@class renderer.replacements
-renderer.replacements = {}
-
----
----Create a new character replacements object.
----
----@return renderer.replacements
-function renderer.replacements.new() end
-
----
----Add to internal map a character to character replacement.
----
----@param original_char string Should be a single character like '\t'
----@param replacement_char string Should be a single character like 'ยป'
-function renderer.replacements:add(original_char, replacement_char) end
-
----
---Toggles drawing debugging rectangles on the currently rendered sections
---of the window to help troubleshoot the renderer.
---
@@ -141,29 +134,13 @@ function renderer.set_clip_rect(x, y, width, height) end
function renderer.draw_rect(x, y, width, height, color) end
---
----Draw text.
----
----@param font renderer.font
----@param text string
----@param x number
----@param y number
----@param color renderer.color
----@param replace renderer.replacements
----@param color_replace renderer.color
----
----@return number x_subpixel
-function renderer.draw_text(font, text, x, y, color, replace, color_replace) end
-
----
----Draw text at subpixel level.
+---Draw text and return the x coordinate where the text finished drawing.
---
---@param font renderer.font
---@param text string
---@param x number
---@param y number
---@param color renderer.color
----@param replace renderer.replacements
----@param color_replace renderer.color
---
----@return number x_subpixel
-function renderer.draw_text_subpixel(font, text, x, y, color, replace, color_replace) end
+---@return number x
+function renderer.draw_text(font, text, x, y, color) end
diff --git a/docs/api/utf8.lua b/docs/api/utf8extra.lua
index d4dff5a9..1ff4dcb6 100644
--- a/docs/api/utf8.lua
+++ b/docs/api/utf8extra.lua
@@ -1,19 +1,23 @@
---@meta
+---Additional utf8 support not provided by lua.
+---@class utf8extra
+utf8extra = {}
+
---UTF-8 equivalent of string.byte
---@param s string
---@param i? integer
---@param j? integer
---@return integer
---@return ...
-function utf8.byte(s, i, j) end
+function utf8extra.byte(s, i, j) end
---UTF-8 equivalent of string.char
---@param byte integer
---@param ... integer
---@return string
---@return ...
-function utf8.char(byte, ...) end
+function utf8extra.char(byte, ...) end
---UTF-8 equivalent of string.find
---@param s string
@@ -23,14 +27,14 @@ function utf8.char(byte, ...) end
---@return integer start
---@return integer end
---@return ... captured
-function utf8.find(s, pattern, init, plain) end
+function utf8extra.find(s, pattern, init, plain) end
---UTF-8 equivalent of string.gmatch
---@param s string
---@param pattern string
---@param init? integer
---@return fun():string, ...
-function utf8.gmatch(s, pattern, init) end
+function utf8extra.gmatch(s, pattern, init) end
---UTF-8 equivalent of string.gsub
---@param s string
@@ -39,41 +43,41 @@ function utf8.gmatch(s, pattern, init) end
---@param n integer
---@return string
---@return integer count
-function utf8.gsub(s, pattern, repl, n) end
+function utf8extra.gsub(s, pattern, repl, n) end
---UTF-8 equivalent of string.len
---@param s string
---@return integer
-function utf8.len(s) end
+function utf8extra.len(s) end
---UTF-8 equivalent of string.lower
---@param s string
---@return string
-function utf8.lower(s) end
+function utf8extra.lower(s) end
---UTF-8 equivalent of string.match
---@param s string
---@param pattern string
---@param init? integer
---@return string | number captured
-function utf8.match(s, pattern, init) end
+function utf8extra.match(s, pattern, init) end
---UTF-8 equivalent of string.reverse
---@param s string
---@return string
-function utf8.reverse(s) end
+function utf8extra.reverse(s) end
---UTF-8 equivalent of string.sub
---@param s string
---@param i integer
---@param j? integer
---@return string
-function utf8.sub(s, i, j) end
+function utf8extra.sub(s, i, j) end
---UTF-8 equivalent of string.upper
---@param s string
---@return string
-function utf8.upper(s) end
+function utf8extra.upper(s) end
---Escape a str to UTF-8 format string. It support several escape format:
---* %ddd - which ddd is a decimal number at any length: change Unicode code point to UTF-8 format.
@@ -91,7 +95,7 @@ function utf8.upper(s) end
---```
---@param s string
---@return string utf8_string
-function utf8.escape(s) end
+function utf8extra.escape(s) end
---Convert UTF-8 position to byte offset. if only index is given, return byte
---offset of this UTF-8 char index. if both charpos and index is given, a new
@@ -103,7 +107,7 @@ function utf8.escape(s) end
---@param index? integer
---@return integer charpos
---@return integer codepoint
-function utf8.charpos(s, charpos, index) end
+function utf8extra.charpos(s, charpos, index) end
---Iterate though the UTF-8 string s. If only s is given, it can used as a iterator:
---```lua
@@ -120,7 +124,7 @@ function utf8.charpos(s, charpos, index) end
---@param index? integer
---@return integer charpos
---@return integer codepoint
-function utf8.next(s, charpos, index) end
+function utf8extra.next(s, charpos, index) end
---Insert a substring to s. If idx is given, insert substring before char at
---this index, otherwise substring will concat to s. idx can be negative.
@@ -128,7 +132,7 @@ function utf8.next(s, charpos, index) end
---@param idx? integer
---@param substring string
---return string new_string
-function utf8.insert(s, idx, substring) end
+function utf8extra.insert(s, idx, substring) end
---Delete a substring in s. If neither start nor stop is given, delete the last
---UTF-8 char in s, otherwise delete char from start to end of s. if stop is
@@ -138,7 +142,7 @@ function utf8.insert(s, idx, substring) end
---@param start? integer
---@param stop? integer
---return string new_string
-function utf8.remove(s, start, stop) end
+function utf8extra.remove(s, start, stop) end
---Calculate the width of UTF-8 string s. if ambi_is_double is given, the
---ambiguous width character's width is 2, otherwise it's 1. fullwidth/doublewidth
@@ -150,7 +154,7 @@ function utf8.remove(s, start, stop) end
---@param ambi_is_double? boolean
---@param default_width? integer
---@return integer width
-function utf8.width(s, ambi_is_double, default_width) end
+function utf8extra.width(s, ambi_is_double, default_width) end
---Return the character index at given location in string s. this is a reverse
---operation of utf8.width(). this function returns a index of location, and a
@@ -164,24 +168,24 @@ function utf8.width(s, ambi_is_double, default_width) end
---@return integer idx
---@return integer offset
---@return integer width
-function utf8.widthindex(s, location, ambi_is_double, default_width) end
+function utf8extra.widthindex(s, location, ambi_is_double, default_width) end
---Convert UTF-8 string s to title-case, used to compare by ignore case. if s
---is a number, it's treat as a code point and return a convert code point
---(number). utf8.lower/utf8.pper has the same extension.
---@param s string
---return string new_string
-function utf8.title(s) end
+function utf8extra.title(s) end
---Convert UTF-8 string s to folded case, used to compare by ignore case. if s
---is a number, it's treat as a code point and return a convert code point
---(number). utf8.lower/utf8.pper has the same extension.
---@param s string
---return string new_string
-function utf8.fold(s) end
+function utf8extra.fold(s) end
---Compare a and b without case, -1 means a < b, 0 means a == b and 1 means a > b.
---@param a string
---@param b string
---@return integer result
-function utf8.ncasecmp(a, b) end
+function utf8extra.ncasecmp(a, b) end
diff --git a/meson.build b/meson.build
index 781931bd..1cc54cbc 100644
--- a/meson.build
+++ b/meson.build
@@ -174,6 +174,7 @@ endif
install_data('licenses/licenses.md', install_dir : lite_docdir)
+install_subdir('docs/api' , install_dir : lite_datadir, strip_directory: true)
install_subdir('data/core' , install_dir : lite_datadir, exclude_files : 'start.lua')
foreach data_module : ['fonts', 'plugins', 'colors']
install_subdir(join_paths('data', data_module), install_dir : lite_datadir)
diff --git a/src/api/api.c b/src/api/api.c
index 67a05f19..acf6eec2 100644
--- a/src/api/api.c
+++ b/src/api/api.c
@@ -5,7 +5,7 @@ int luaopen_renderer(lua_State *L);
int luaopen_regex(lua_State *L);
int luaopen_process(lua_State *L);
int luaopen_dirmonitor(lua_State* L);
-int luaopen_utf8(lua_State* L);
+int luaopen_utf8extra(lua_State* L);
static const luaL_Reg libs[] = {
{ "system", luaopen_system },
@@ -13,7 +13,7 @@ static const luaL_Reg libs[] = {
{ "regex", luaopen_regex },
{ "process", luaopen_process },
{ "dirmonitor", luaopen_dirmonitor },
- { "utf8", luaopen_utf8 },
+ { "utf8extra", luaopen_utf8extra },
{ NULL, NULL }
};
diff --git a/src/api/utf8.c b/src/api/utf8.c
index e1a4ebfe..6f0d6c17 100644
--- a/src/api/utf8.c
+++ b/src/api/utf8.c
@@ -1264,7 +1264,7 @@ static const char UTF8PATT[] = "[\0-\x7F\xC2-\xF4][\x80-\xBF]*";
static const char UTF8PATT[] = "[%z\1-\x7F\xC2-\xF4][\x80-\xBF]*";
#endif
-int luaopen_utf8 (lua_State *L) {
+int luaopen_utf8extra (lua_State *L) {
luaL_Reg libs[] = {
#define ENTRY(name) { #name, Lutf8_##name }
ENTRY(offset),