#! /usr/bin/env lua
--
-- debug_filter.lua
-- Copyright (C) 2022 Shewer Lu
--
-- Distributed under terms of the MIT license.
--
--[[
lua_filter@debug_filter candidate tags
name_space/output_format: #
- dtype # candidate type
- type # candidate.type
- start # candidate.start
- _end #
- text
- comment
- quality
- input # context.input
- ainput # active_input context.input:sub(_start +1 , _end)
- error lua component error
name_space/tags: filter
option: _debug
property: :
.custom.yaml
# module_name: debug_filter name_space: debug_filter
engine/filters/@next: lua_filter@debug_filter
# item_name dtype type start _end preedit, quality input ainput comment
debug_filter/output_format: [dtype,type,start,_end,preedit,quality]
enable switch:
option_name: _debug disable / enable
candidate.comment output :
property: _debug
cand data_name: type start _end comment quality preedit , dtype
input_str: input ainput
ex:
context:set_option("_debug", true)
context:set_property("_debug", "dtype,comment,_end,start,quality")
--
--]]
local Env=require'tools/env_api'
local output_fmt="dtype,type,start,_end,preedit,quality"
local name = "_debug"
local List=require 'tools/list'
local function item_to_list(item)
if item and item.type == "kList" then
local cl = item:get_list()
local l = List()
for i=0,cl.size-1 do
l:push( cl:get_value_at(i).value or "" )
end
return l
end
end
local function get_output_fmt(config,path)
local item=config:get_item(path)
if not item then return end
if item.type == "kList" then
local l = item_to_list(item)
return l and l:concat(",")
elseif item.type == "kScalar" then
return item:get_value().value:gsub("%s","")
end
end
local function get_tags(config,path)
return Set(
item_to_list( config:get_item(path) ))
end
local M={}
function M.init(env)
Env(env)
local context= env:Context()
local config= env:Config()
env.tags = get_tags( config,env.name_space .. "/tags")
--init option property
env.option= "_debug"
context:set_option( env.option , context:get_option(env.option) or false)
local output_fmt= get_output_fmt(config, env.name_space .. "/output_format") or output_fmt
context:set_property(env.option, output_fmt )
end
function M.fini(env)
end
-- M.tags_match
local function tags_str(seg)
local tab={}
for k, _ in next, seg.tags do table.insert(tab,k) end
return string.format(" [tags: %s]", table.concat(tab," ") )
end
function M.tags_match(seg,env)
-- tags all : env.tags == nil or faile
local context = env:Context()
local enable = context:get_option(env.option)
if enable then
seg.prompt = seg.prompt .. tags_str(seg)
end
-- all: not env.tags match tags: not (seg.tags * env.tags):empty()
-- if enable then
-- if not env.tags then return true end
-- if not (seg.tags * env.tags):empty() then return true end
-- end
return enable and ( not env.tags or not (seg.tags * env.tags):empty())
end
-- M.func
local function debug_comment(items,cand,tab)
tab = tab or { }
tab.ainput= tab.input and tab.input:sub(cand.start +1,cand._end) or ""
tab.dtype= cand:get_dynamic_type()
tab.quality = string.format("%6.4f",cand.quality)
local function fn(elm) return tab[elm] or cand[elm] or "" end
return "--" .. items:gsub(" ",""):split(","):map(fn):concat("|")
end
function M.func(input, env)
local context = env:Context()
local items = context:get_property(env.option)
local ext_data= {
input = context.input,
error = context:get_property("_error")
}
for cand in input:iter() do
if T04 and GD then GD() end
local comment = cand.type == "command"
and cand.comment
or cand.comment .. debug_comment(items,cand,ext_data )
local ccand = cand:get_dynamic_type() == "Shadow" and cand:get_genuine() or cand
ccand.comment = ccand.comment .. comment
yield(cand)
--yield( ShadowCandidate( cand, cand.type,cand.text, comment) )
end
end
return M