hchunhui / librime-lua

Extending RIME with Lua scripts
BSD 3-Clause "New" or "Revised" License
359 stars 43 forks source link

`env.mem:dict_lookup(inp, false, 1)` 用于判断词典有无完全匹配失效 #304

Closed mirtlecn closed 10 months ago

mirtlecn commented 10 months ago

在 lua_translator 中之前用 env.mem:dict_lookup(inp, false, 1) 判断词典有没有完全匹配的词。

librime 1.9,一直到 librime 上个月的 nightly 版 都是正常工作的。

从 action 从 https://github.com/hchunhui/librime-lua/commit/474b9d95e94e59af3e6d7f7c1b306bce6dae1b62 这里版本开始,这行代码在无词时仍然返回了一个 class rime::DictEntryIterator>

mirtlecn commented 10 months ago

@shewer 因为 librime 上个月到现在并无更改,最新一次提交这行判断仍然正常会返回空。所以猜测是上周 librime lua 这边的更改 https://github.com/hchunhui/librime-lua/commit/474b9d95e94e59af3e6d7f7c1b306bce6dae1b62

不知道是否是是预期变化。

mirtlecn commented 10 months ago

image

目前不会 return false

shewer commented 10 months ago

@shewer 因为 librime 上个月到现在并无更改,最新一次提交这行判断仍然正常会返回空。所以猜测是上周 librime lua 这边的更改 474b9d9

不知道是否是是预期变化。

是的 , 以前的 memory只能得到唯一一個LuaMemory.iter(luaMemory.iter 仍然保留,等同最後一個lookupwords 的iter) 現在可以lookupwords 多次 ,得到多個 DictEntryIterator 你 可以參考 librime 的MergeTranslation(合併+排序 quality) , 把多個 DictEntryIterator 轉成 Transaltion 再合併

不需要 檢查 返回值, 直接調用 :iter() 即可

    locla tab = {}
    for i=1,26 do
           local iter = env.mem:lookupwords(.....)  --  input .. string.chra(0x40+i) 
           tabel.insert(tab, iter)
    end
    for i,v in next, tab do 
         for entry in  v:iter() do 
                   .....
          end 
    end
   local  entry_iter1 = env.mem:lookup_words(....)
    local entry_iter2 = env.mem:lookup_words(...)
    for entry in  entry_iter1:iter() do   .... end
    for entry in entry_iter2:iter()  do ... end
   for entry in env.mem:lookup_words(....):iter() do
        ...
    end

舊方法需要檢查 返回值


if  env.mem:lookup_words(....) then
    for entry in env.mem:iter() do --
            ...
     end
end
mirtlecn commented 10 months ago

ok

hchunhui commented 10 months ago

https://github.com/hchunhui/librime-lua/commit/474b9d95e94e59af3e6d7f7c1b306bce6dae1b62 这个改动有问题,我合并时也没仔细看。 一般情况下新功能不应该破坏现有的接口。 @shewer 我打算先撤回了。如果对 Memory 改动过大没法兼容的话,我觉得可以另起一个 Memory2 之类的。

mirtlecn commented 10 months ago

我检查了代码,似乎可以稍微改改

lookup_words method 是 method,附在 Dictionary 和 UserDictionary class 上。后两者又是新引入的,从 Memory class 的 dict 和 user_dict 获得。

换句话说,要获取几个 DictEntryIterator,之前没有简便的办法,现在要从 Memory 建立 Dictionary 或者 UserDictionary,然后 lookup_words 接着 iter()

这个逻辑似乎和之前从 Memory dict_lookup(获取一个新的 DictEntryIterator)然后借助 memory:iter_dict 获取 entry 并不冲突。

有办法保留之前 return false 的做法,不然几个脚本的逻辑都要重改,根据 librime 的这个变动得做两套逻辑

    env.dict = env.mem.dict

    local i = 0
    -- in newer librime-lua, env.mem:dict_lookup(inp, false, 1) always return an object
    if env.dict then
        for e in env.dict:lookup_words(inp, false, 1):iter() do
            i = 1
        end
    else
        if env.mem:dict_lookup(inp, false, 1) then
            i = 1
        end
hchunhui commented 10 months ago

我先revert了。各位请帮忙看一下如何改比较合适吧,然后重新pr。

shewer commented 10 months ago

474b9d9 这个改动有问题,我合并时也没仔细看。 一般情况下新功能不应该破坏现有的接口。 @shewer 我打算先撤回了。如果对 Memory 改动过大没法兼容的话,我觉得可以另起一个 Memory2 之类的。

恢復 dict_lookup user_lookup 接口 return 值 再加上 兩個 return dictentry_iter 的接口 ; 如何?

  bool LuaMemory::dictLookup(const string& input, const bool isExpand, size_t limit) {
    iter = New<DictEntryIterator>();// t= New<DictEntryIterator>();
    limit = limit == 0 ? 0xffffffffffffffff : limit;
    if (dict_ && dict_->loaded()) {
      return dict_->LookupWords(iter.get(), input, isExpand, limit) > 0;
    }
    return false;
  }

  bool  LuaMemory::userLookup(const string& input, const bool isExpand) {
    uter = New<UserDictEntryIterator>();
    if (user_dict_ && user_dict_->loaded()) {
      return user_dict_->LookupWords(uter.get(), input, isExpand) > 0;
    }
    return false;
  }

  an<DictEntryIterator> LuaMemory::dictiterLookup(const string& input, const bool isExpand, size_t limit) {
    dictLookup(input, isExpand, limit);
    return iter;
  }

  an<UserDictEntryIterator> LuaMemory::useriterLookup(const string& input, const bool isExpand) {
    userLookup(input, isExpand);
    return uter;
  }
shewer commented 10 months ago

Author 我已經重新PR 恢復user_lookup dict_lookup return bool , 井增加 useriter_lookup dictiter_lookup return dictentryIterator

你的script 有點問題 , dict 是 memory 的成員 如果 dict == nil env.mem:dict_lookup() 也是取不到 dictentry , 畢竟 mem:dict_lookup() 也是 調用dict 取得 dcitentry

if env.dict then
     ...
else ---  無效的block   
   ...
end

可用下面方式

local i =false
for entry in env.mem:dict_lookup(str, true , 1):iter() do 
     i = true
     ...
end
mirtlecn commented 10 months ago

Author 我已經重新PR 恢復user_lookup dict_lookup return bool , 井增加 useriter_lookup dictiter_lookup return dictentryIterator

你的script 有點問題 , dict 是 memory 的成員 如果 dict == nil env.mem:dict_lookup() 也是取不到 dictentry , 畢竟 mem:dict_lookup() 也是 調用dict 取得 dcitentry

if env.dict then
     ...
else ---  無效的block   
   ...
end

可用下面方式

local i =false
for entry in env.mem:dict_lookup(str, true , 1):iter() do 
     i = true
     ...
end

我检查了代码并测试过,dict 成员这次 commit 新引入的,之前并不显式的可以获取,如果 dict 成员为 nil 说明 librime 的版本在引起故障的提交前,此时可用 dict lookup 判断是否返回 false,

Screenshot_2024-01-31-13-41-39-06_320a9a695de7cdce83ed5281148d6f19.jpg

shewer commented 10 months ago

commit 前 沒有註冊 get_vars , 所以 必定是nil commit 後 如果 Memory() 初始化時 字典調用失敗 ,也會返回 nil dict_lookup() 會先檢查 dict && dict.loaded()

  if (dict && dict->loaded()) {
      return dict->LookupWords(...) >0;
  }
  return false;
mirtlecn commented 10 months ago

问题在 revert 后已经不存在,新 PR 与此无关,故关闭