作者hmml (hmml)
看板mud_sanc
标题Re: [心得] MUSHclient - Plugins:让抓取聊天讯息视窗正确换行
时间Sun Dec 8 00:55:02 2013
将换行判断由 MUSHclient 自行判断,改成用自订的规则判断,
之所以改成自定义,乃因 MUSHclient 无法判断换行的字元是双位元
的字还是单位元的字,导致换行常常换行换在字的中间,造成乱码。
而 Lua 本身有提供检查指定字元 ANSI 值的函数-string.byte,如
此便可以根据 ANSI 字位集亚洲规则(0 - 127 为单字元字集,128
以上为双字元字集的前缀字元)更弹性地判断换行正确位置应该是哪
里。在那个位置,先行插入"\n"即可。
这个修改,重要讯息检视视窗必须做好下列两项设定变更:
1.
Wrap output at column number 不得为空白,要填上期望换行的数值。
2.
Auto-Wrap to window size 取消勾选,否则它依然会造成乱码。
上列两项,滑鼠在输出视窗中点开
右键功能表,选取:
World Configuration...打开该输出视窗的组态设定页面,在左侧树状
目录中选取
Output,上述第一项在页面最下方两个按钮的上方;第二项
在右侧勾选项列表中倒数第五项。
-==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==-
<script>
<![CDATA[
local conversion= {
['black'] = ANSI (30,22),
['maroon'] = ANSI (31,22),
['green'] = ANSI (32,22),
['olive'] = ANSI (33,22),
['navy'] = ANSI (34,22),
['purple'] = ANSI (35,22),
['teal'] = ANSI (36,22),
['silver'] = ANSI (37,22),
--以下高亮
['gray'] = ANSI (30,1),
['red'] = ANSI (31,1),
['lime'] = ANSI (32,1),
['yellow'] = ANSI (33,1),
['blue'] = ANSI (34,1),
['magenta'] = ANSI (35,1),
['cyan'] = ANSI (36,1),
['white'] = ANSI (37,1),
}
-- 前景
local BACKconversion= {
['black'] = ANSI (40),
['maroon'] = ANSI (41),
['green'] = ANSI (42),
['olive'] = ANSI (43),
['navy'] = ANSI (44),
['purple'] = ANSI (45),
['teal'] = ANSI (46),
['silver'] = ANSI (47),
}
--背景
chat_world = "sanc_chat_list"
Listen_Player = 'hmml5'
local first_time = true
function color_chats (name, line, wildcards, styles)
-- 试着找到 "chat_ world"
local w = GetWorld (chat_world)
-- get "chat" world
-- 如果找不到,试着去打开它
if first_time and not w then
local filename = GetInfo (67) .. chat_world .. ".mcl"
Open (filename)
w = GetWorld (chat_world)
-- 再试一次
if not w then
ColourNote ("white", "red", "无法打开指定的档案:" .. filename)
first_time = false
-- don't repeatedly show failure message
end -- 找不到
end -- can't find world first time around
if w then -- 如果存在,w就是存着'chat_world' ID值的变数。
message_wrap = w:GetOption('wrap_column') - 14 --换行长度,14是时间字段长度
if GetAlphaOption("player") == Listen_Player then --负责抓讯息的角色视窗
--时间,上方蓝色部份即是先减掉这段的长度
w:Simulate(ANSI (33, 40,1)..os.date (" %d ")..
ANSI (32, 40,1)..os.date ("%H")..
ANSI (36, 40,1)..os.date (":%M")..
ANSI (32, 40,1).." >")
for _, v in ipairs (styles) do
Colour_Code = conversion[RGBColourToName (v.textcolour)]..
BACKconversion[RGBColourToName (v.backcolour)]
--如果字串长度小於设定的换行长度,就逐串减去。
if message_wrap >= string.len(v.text) then
message_wrap = message_wrap - string.len(v.text)
--减到换行长度小於字串长的时候
else
--先检测换行所在的字元是双位元宽的字,还是单位元宽。
--是双位元的话,将换行字元插入前一个位置。
if string.byte (v.text,message_wrap) > 127 then
v.text = string.sub(v.text,1,message_wrap-1)..'\n'..
string.sub(v.text,message_wrap)
--再检测换行所在的前一字元是否为双位元宽的字。
--是双位元的话,将换行字元插入前一个位置。
elseif string.byte (v.text,message_wrap-1) > 127 then
v.text = string.sub(v.text,1,message_wrap-2)..'\n'..
string.sub(v.text,message_wrap-1)
end
end
w:Simulate(Colour_Code..v.text) --内容
end -- for each style run
w:Simulate('\n')
end -- ID
end -- world found
end -- function redirect
]]>
</script>
-==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==-
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.196.45
※ 编辑: hmml 来自: 220.132.196.45 (12/08 01:30)
1F:→ hmml :待修理,还是有问题。 12/08 01:56