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
页: 1 [2] 3
查看完整版本: 求助,关于mudlet的使用