jarlyyn
发表于 2024-4-20 07:27:08
感谢各位的回复,我的思路要变一下了
jarlyyn
发表于 2024-4-20 07:34:57
holygb 发表于 2024-4-20 01:01 AM
我也有类似需求,写了个函数获取一行或几行间字符的属性,代码如下:
function get_color_string(from_line ...
这个代码就牵涉到另一个问题了
lua的string本质应该就是ansi的string,一个字符一位
但utf8是变长的,而gettextformat应该是根据utf8字符来的,所以每次获取的数据长度不一致对吧?
纯做mudlet的库的话这倒问题不大,如果想和ansi的跑gbk的mush共享代码,就要好好整整了
holygb
发表于 2024-4-20 08:42:25
jarlyyn 发表于 2024-4-20 07:34 AM
这个代码就牵涉到另一个问题了
lua的string本质应该就是ansi的string,一个字符一位
不管mud是什么编码的,mudlet内部变量都是unicode,所有用utf8的接口都可以兼容。
jarlyyn
发表于 2024-4-29 21:39:20
holygb 发表于 2024-4-20 01:01 AM
我也有类似需求,写了个函数获取一行或几行间字符的属性,代码如下:
function get_color_string(from_line ...
爬了下mudlet的代码,这个基本是个bug,具体的bug点在
https://github.com/Mudlet/Mudlet/blob/f56291b6c2edb33aa7ab00d6c75018dad183454f/src/TConsole.cpp#L1312
里的
if (y < 0 || x < 0 || y >= static_cast<int>(buffer.buffer.size()) || x >= (static_cast<int>(buffer.buffer.at(y).size()) - 1)) {
越界检测里,Y轴不减1,X轴减1了
也就是说当x等于Y轴对应缓冲的值-1也报错
yct17
jarlyyn
发表于 2024-4-29 21:50:43
21年就有人提了这个bug
https://github.com/Mudlet/Mudlet/issues/5744
jarlyyn
发表于 2024-4-29 22:34:41
直接insert太脏了
我查了下Mudlet的Wiki
创建了一个不显示的buffer,把要处理的Line copy&paste进去再append一个空格,直接在buffer里跑一样逻辑的代码,绕过去了。
jarlyyn
发表于 2024-4-29 22:38:44
本帖最后由 jarlyyn 于 2024-4-29 10:54 PM 编辑
大概处理的代码,给需要的人,我是响应所有的行,自己按自己格式存一份了。createBuffer('hclua_line')
local function online()
local all = getCurrentLine()
selectCurrentLine()
copy()
clearWindow('hclua_line')
paste('hclua_line')
moveCursor('hclua_line',utf8.len(all), 0)
insertText('hclua_line',' ')
local newline = line.Line:new()
if all == '' then
return
end
local last = ''
local text = ''
local lastresult
for i = 0, utf8.len(all)-1, 1 do
moveCursor('hclua_line',i, 0)
selectSection('hclua_line',i, 1)
local result = getTextFormat('hclua_line')
local format = hashformat(result)
if format ~= last then
if text ~= '' then
local word = newword(lastresult)
word.Text = text
newline:appendWord(word)
end
text=''
last = format
lastresult=result
end
text = text .. getSelection('hclua_line')
end
if text ~= '' then
local word = newword(lastresult)
word.Text = text
newline:appendWord(word)
end
print(newline:toShort())
end
jarlyyn
发表于 2024-4-29 22:56:33
本帖最后由 jarlyyn 于 2024-4-29 10:58 PM 编辑
摘要输出大概是这样的
北大侠客行已经执行了一天十二小时二十二分四十六秒。
#0AA0北大侠客行已经执行了#0AA0一天十二小时二十二分四十六秒#0AA0。
目前共有 698 位玩家在线上。
#0AA0目前共有 698 位玩家在线上。
Input 1 for GBK, 2 for UTF8, 3 for BIG5
#0MA0Input 1 for GBK, 2 for UTF8, 3 for BIG5
由于MushClient对Unicode输出支持有限,使用MushClient时请连接8080端口,并且不要选择编码!
#0KA4由于MushClient对Unicode输出支持有限,使用MushClient时请连接8080端口,并且不要选择编码!
如已登录,并且再次登录8080端口时出现档案问题,请联系巫师处理。
#0KA4如已登录,并且再次登录8080端口时出现档案问题,请联系巫师处理。
您的英文名字(要注册新人物请输入new。):
#0AA0您的英文名字(要注册新人物请输入new。):
jarlyyn
发表于 2024-5-2 23:08:20
本帖最后由 jarlyyn 于 2024-5-3 01:50 AM 编辑
更新下,不行,isFgColor和isBgColor强制使用main窗口。
还是要用insert,最多再replace掉。
无力吐槽
local function online()
local all = getCurrentLine()
local lineno=getLastLineNumber()
local length=utf8.len(all)
selectCurrentLine()
moveCursor(length, lineno)
insertText(' ')
local newline = line.Line:new()
local last = ''
local lastword
for i = 0, length-1, 1 do
moveCursor(i, lineno)
selectSection(i, 1)
local result = getTextFormat()
local format = hashformat(result)
if format ~= last then
word=newword(result)
if lastword ~= nil then
newline:appendWord(lastword)
end
lastword=word
last = format
end
lastword.Text = lastword.Text .. getSelection()
end
if lastword~=nil and lastword.Text ~= '' then
newline:appendWord(lastword)
end
selectSection(length,1)
replace('')
Hclua.world:onLine(newline)
local callbacks=Hclua.world.params['_lineReady']
Hclua.world.params['_lineReady']={}
for index, value in ipairs(callbacks) do
value()
end
jarlyyn
发表于 2024-5-3 19:15:55
目前用的mudlet 4.17.2,还发现一个bug
中文的粗体无效,不管显示还是GetTextFormat。
只有登陆页的字符的粗体有效。
mush,hellclient和北侠的网页版都没这个问题。
除非北侠会给mudlet返回不一样的格式,不然估计这又是一个bug
猫猫叹气.jpg