From 96799150c20fd1e2ae6e847d40ea162f5a7814f0 Mon Sep 17 00:00:00 2001 From: Tomas Seniunas Date: Sun, 27 Jun 2021 10:07:35 +0900 Subject: [PATCH] Added a color copy option for mouse selection. --- src/scripts/color-copy/color-copy.lua | 55 +++++++++++++++++++++++++++ src/scripts/color-copy/scripts.json | 6 +++ 2 files changed, 61 insertions(+) create mode 100644 src/scripts/color-copy/color-copy.lua create mode 100644 src/scripts/color-copy/scripts.json diff --git a/src/scripts/color-copy/color-copy.lua b/src/scripts/color-copy/color-copy.lua new file mode 100644 index 0000000..c19cd82 --- /dev/null +++ b/src/scripts/color-copy/color-copy.lua @@ -0,0 +1,55 @@ +-- Abort if the API isn't available. Mouse events become available on Mudlet version 4.13. +if addMouseEvent == nil then return end + +function rgbToHex(r,g,b) + local rgb = (r * 0x10000) + (g * 0x100) + b + return string.format("%x", rgb) +end + +local baseAnsiMap = {"&x","&r","&g","&O","&b","&p","&c","&w","&z","&R","&G","&Y","&B","&P","&C","&W"} +local colorCodes = {} + +-- Map basic ANSI set +for i=0,15 do + local hex = rgbToHex(unpack(color_table["ansi_" .. string.format("%03d", i)])) + colorCodes[hex] = baseAnsiMap[i + 1] +end + +-- Map the rest of 256 colors +for i=16,255 do + local numStr = string.format("%03d", i) + local hex = rgbToHex(unpack(color_table["ansi_" .. numStr])) + colorCodes[hex] = "&" .. numStr +end + +addMouseEvent("Copy with colors", "onCopyWithColors") + +function onCopyWithColors(event, menu, window, startCol, startRow, endCol, endRow) + if startCol == endCol and startRow == endRow then return end + local parsed = "" + local lastColor = nil + for l = startRow, endRow do + local cStart = l == startRow and startCol or 0 + moveCursor(window, cStart, l) + local cEnd = l == endRow and endCol or #getCurrentLine() - 1 + for c = cStart, cEnd do + selectSection(window, c, 1) + local symbol = getSelection(window) or "" + -- escape the tag symbol + if symbol == "&" then symbol = "&&" end + local color = rgbToHex(getFgColor(window)) + if color == lastColor then + parsed = parsed .. symbol + else + lastColor = color + -- Check whether the color is in the 256 set. Use gray (&w) for undefined colors. + local cc = colorCodes[color] or "&w" + parsed = parsed .. cc .. symbol + end + end + if l ~= endRow then parsed = parsed .. "\n" end + end + setClipboardText(parsed) +end + +registerAnonymousEventHandler("onCopyWithColors", "onCopyWithColors") \ No newline at end of file diff --git a/src/scripts/color-copy/scripts.json b/src/scripts/color-copy/scripts.json new file mode 100644 index 0000000..9f263fd --- /dev/null +++ b/src/scripts/color-copy/scripts.json @@ -0,0 +1,6 @@ +[ + { + "name": "color-copy" + } + ] + \ No newline at end of file