作者hmml (hmml)
看板mud_sanc
标题Re: [情报] MushClient的复制含ANSI色码文字 Plugin
时间Sat Oct 5 21:01:55 2013
小小修正之前不能复制背景色的缺点。注意:如果有用一些函数去修改
输出内容的(如:ColourNote、ColourTell),请不要使用ANSI所定义以外
的颜色(如:字色用pink、底色用cyan...等),会认不出来而判错。
至於转换表内容为何和 chat cap 的不一样,因为,PcMan 的编辑器看
不懂重置码,看不懂[m,也看不懂移位码,它很阳春。
增加几个不属於ANSI定义的颜色,它们是 MUSHclient 的自定义色,你
可以在 Configuration > Apperance > Custom Colour 看见并修改它们,
这里是尽量将这些颜色换成相近的 ANSI 颜色,当然不可能尽如人意。或者
,你可以在 Configuration > Appearance > ANSI Colour 页面点选右上方
的 ANSI Colours... 按钮,将自定义色套上 ANSI 色码;想改回来,在
Configuration > Apperance > Custom Colour 页面右上同样有 Defaults
...可以调回来。
另外,还有两个颜色,都是脚本错误回报时的颜色,这些请看注释。
并修改转换判断,当颜色还是出现转换表外的色码时,这些颜色会先用
Silver 递补。
-----------------------------------------------------------
<!-- Script -->
<script>
<![CDATA[
-- Thank you, Shaun Biggs, for taking your time to write the CopyScript
-- (formerly Copy2) function below. It was slightly altered by me to suit
-- my usage (wordwrapped lines and no \r\n at start of selection).
local BLACK = 1
local RED = 2
local GREEN = 3
local YELLOW = 4
local BLUE = 5
local MAGENTA = 6
local CYAN = 7
local WHITE = 8
-- 颜色表
local conversion= {
['black'] = ANSI(0)..ANSI (30),
['maroon'] = ANSI(0)..ANSI (31),
['#804040'] = ANSI(0)..ANSI (31), --custom10
['green'] = ANSI(0)..ANSI (32), --custom15
['olive'] = ANSI(0)..ANSI (33),
['#FF8040'] = ANSI(0)..ANSI (33), --custom11
['burlywood'] = ANSI(0)..ANSI (33), --硬木色,脚本错误明细:位置。
['navy'] = ANSI(0)..ANSI (34),
['#004080'] = ANSI(0)..ANSI (34), --custom13
['purple'] = ANSI(0)..ANSI (35),
['#FF80C0'] = ANSI(0)..ANSI (35), --custom6
['teal'] = ANSI(0)..ANSI (36), --custom12
['silver'] = ANSI(0)..ANSI (37),
--以下高亮
['gray'] = ANSI (30,1),
['red'] = ANSI (31,1), --custom7
['orangered'] = ANSI (31,1), --橙红,脚本错误明细:说明。
['#FF8080'] = ANSI (31,1), --custom1
['lime'] = ANSI (32,1),
['#80FF80'] = ANSI (32,1), --custom3
['yellow'] = ANSI (33,1),
['#FFFF80'] = ANSI (33,1), --custom2
['blue'] = ANSI (34,1), --custom16
['#0080FF'] = ANSI (34,1), --custom5
['#0080C0'] = ANSI (34,1), --custom8
['magenta'] = ANSI (35,1), --custom9
['#FF0080'] = ANSI (35,1), --custom14
['cyan'] = ANSI (36,1),
['#80FFFF'] = ANSI (36,1), --custom4
['white'] = ANSI (37,1),
} -- 前景
local BACKconversion= {
['black'] = ANSI (40), --黑色。
['
gray'] = ANSI (40), --如果出现底色灰
['
maroon'] = ANSI (41), --栗色。
['
red'] = ANSI (41), --如果出现底色红,Script 档未挂上时的报错。
['
green'] = ANSI (42), --绿色。
['
lime'] = ANSI (42), --如果出现底色鲜绿。
['
olive'] = ANSI (43), --橄榄色。
['
yellow'] = ANSI (43), --如果出现底色黄。
['
navy'] = ANSI (44), --海军蓝。
['
blue'] = ANSI (44), --如果出现底色蓝。
['
purple'] = ANSI (45), --紫色。
['
magenta'] = ANSI (45), --如果出现底色洋红。
['
teal'] = ANSI (46), --鸭绿色,技能进步讯息的颜色。
['
cyan'] = ANSI (46), --如果出现底色青。
['silver'] = ANSI (47), --银色,正常字色。
['
white'] = ANSI (47), --如果出现底色白。
} --背景
--转换色码
function DoOneLine (styles, startcol, endcol)
while next (styles) and startcol > styles [1].length
do
startcol = startcol - styles [1].length
endcol = endcol - styles [1].length
table.remove (styles, 1)
end -- do
if not next (styles)
then return
end
-- discard unwanted part of first good style
if startcol > 1
then
styles [1].length = styles [1].length - startcol
endcol = endcol - startcol + 1
styles [1].text = styles [1].text:sub (startcol)
startcol = 1
end -- if
-- copy appropriate styles and codes into the output
while next (styles)
do
local len = endcol - startcol + 1
if len < 0 or endcol < 1
then
return
end -- done
-- last style?
if len < styles [1].length
then
styles [1].length = len
styles [1].text = styles [1].text:sub (1, len)
end -- if last style
-- put code in front, if we can find one
if conversion [RGBColourToName (styles[1].textcolour)] ~= nil then
code = conversion [RGBColourToName (styles[1].textcolour)]..
BACKconversion[RGBColourToName (styles[1].backcolour)]
else
code = conversion ['silver']..
BACKconversion[RGBColourToName (styles[1].backcolour)]
end
if code
then
copystring = copystring .. code
end -- if code found
-- now the text
copystring = copystring .. styles [1].text
-- less to go now
endcol = endcol - styles [1].length
-- done this style
table.remove (styles, 1)
end -- while
end -- 函数:DoOneLine 结尾
--函数:复制内容
function CopyScript(name, line, wildcs)
-- find selection in output window, if any
local first_line = GetSelectionStartLine()
local last_line = math.min (GetSelectionEndLine(), GetLinesInBufferCount ())
local first_column = GetSelectionStartColumn()
local last_column = GetSelectionEndColumn()
-- nothing selected, do normal copy
if first_line <= 0
then
DoCommand("copy")
return
end -- if nothing to copy from output window
copystring = ""
-- iterate to build up copy text
for line = first_line, last_line
do
if line < last_line
then
DoOneLine (GetStyleInfo(line), first_column, GetLineInfo(line).length)
first_column = 1
-- Is this a new line or merely the continuation of a paragraph?
if GetLineInfo (line, 3)
then
copystring = copystring .. "\r\n"
end -- new line
else
DoOneLine (GetStyleInfo(line), first_column, last_column)
end -- if
end -- for loop
-- Get rid of a spurious extra new line at the start.
if copystring:sub (1, 2) == "\r\n"
then
copystring = copystring:sub (3)
end -- if newline at start
if copystring:sub (-2) ~= ANSI (0)
then
copystring = copystring .. ANSI (0)
end -- if newline at start
-- finally can set clipboard contents
SetClipboard(copystring)
end -- function CopyScript
AcceleratorTo ("Ctrl+D",
"CallPlugin ('04d9e64f835452b045b427a7',
'CopyScript',
'')",
sendto.script)
]]>
</script>
-----------------------------------------------------------
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.196.45
※ 编辑: hmml 来自: 220.132.196.45 (10/06 08:27)