gnosygnu / xowa

xowa offline wiki application
Other
374 stars 41 forks source link

what value to return nil or string #615

Closed desb42 closed 4 years ago

desb42 commented 4 years ago

On a fresh start of xowa-gui accessing it.wikisource.org/wiki/Indice:De_Flugi_-_Alchünas_Rimas_Romaunschas.djvu I get a number of errors of the form:

invoke failed: Indice:De_Flugi_-_Alchünas_Rimas_Romaunschas.djvu {{#invoke:Testo|testo}}
 [err 0] <gplx> =Module:Testo:29 bad argument: string expected, got nil
  stack traceback:
  Module:Testo:9: in function <Module:Testo:8>
  mw.lua:535: in function <mw.lua:534>
  [Java]: in function '__index'
  g:/xowa_dev/bin/any/xowa/xtns/Scribunto/engines/Luaj/MWServer.lua:75:
   in function <g:/xowa_dev/bin/any/xowa/xtns/Scribunto/engines/Luaj/MWServer.lua:74>

  [Java]: in ?: ttl=De_Flugi_-_Alchünas_Rimas_Romaunschas.djvu excerpt={{#invoke:Testo|testo}}
  [trace]:
    gplx.xowa.xtns.scribunto.Scrib_core.Handle_error(Unknown Source)
    gplx.xowa.xtns.scribunto.engines.luaj.Luaj_engine.Dispatch_as_kv_ary(Unknown Source)
    gplx.xowa.xtns.scribunto.engines.luaj.Luaj_engine.CallFunction(Unknown Source)
    gplx.xowa.xtns.scribunto.Scrib_core.Invoke(Unknown Source)
    gplx.xowa.xtns.scribunto.Scrib_invoke_func.Func_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn_.Eval_func(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Tmpl_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_defn_tmpl.Tmpl_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Tmpl_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_defn_tmpl.Tmpl_evaluate(Unknown Source)
    gplx.xowa.xtns.lst.Lst_pfunc_itm.New_sect_or_null(Unknown Source)
    gplx.xowa.xtns.lst.Lst_pfunc_lst.Func_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn_.Eval_func(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Tmpl_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Arg_itm_tkn_base.Tmpl_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Arg_nde_tkn.Tmpl_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Tmpl_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Arg_itm_tkn_base.Tmpl_evaluate(Unknown Source)
    gplx.xowa.xtns.pfuncs.ifs.Pfunc_switch.Get_or_eval(Unknown Source)
    gplx.xowa.xtns.pfuncs.ifs.Pfunc_switch.Func_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn_.Eval_func(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Tmpl_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_defn_tmpl.Tmpl_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Tmpl_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_defn_tmpl.Tmpl_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Eval_sub(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Transclude(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Tmpl_evaluate(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_tmpl_wtr.Write_tkn(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_tmpl_wtr.Write_tkn(Unknown Source)
    gplx.xowa.parsers.tmpls.Xot_tmpl_wtr.Write_all(Unknown Source)
    gplx.xowa.parsers.Xop_parser.Expand_tmpl(Unknown Source)
    gplx.xowa.parsers.Xop_parser.Expand_tmpl(Unknown Source)
    gplx.xowa.parsers.Xop_parser.Parse_text_to_wdom(Unknown Source)
    gplx.xowa.parsers.Xow_parser_mgr.Parse(Unknown Source)
    gplx.xowa.wikis.pages.Xowe_page_mgr.Load_page(Unknown Source)
    gplx.xowa.guis.views.Load_page_wkr.Thread__exec(Unknown Source)
    gplx.core.threads.Gfo_thread_pool.Run_wkr(Unknown Source)
    gplx.core.threads.Gfo_thread_pool.Invk(Unknown Source)
    gplx.Gfo_invk_.Invk_by_msg(Unknown Source)
    gplx.core.threads.Thread_adp.run(Unknown Source)
    java.lang.Thread.run(Thread.java:748)

As I have been putting dbg statements in the line number may not be the same the lua code around that line is:

dataNs0.title=mw.title.new(args[1])
dataNs0.text=dataNs0.title:getContent()
dataNs0.index=string.match(dataNs0.text,'index="(.-)"')
dataNs0.SAL=string.match(dataNs0.text,"avz=(%d+)")
dataNs0.codeSAL="&nbsp;[[File:xxx%.svg|9px]]"
dataNs0.codeSAL=string.gsub(dataNs0.codeSAL,"xxx",dataNs0.SAL)

I believe the culprit is the line

dataNs0.text=dataNs0.title:getContent()

and the error is triggered by the line

dataNs0.index=string.match(dataNs0.text,'index="(.-)"')

This issue is that getContent in Scrib_lib_title.java returns 'nil' if no content is found Whereas the above Lua code seems to be expecting an empty string (for the subsequent string match)

If I change line 189

return rv == null ? rslt.Init_obj(null) : rslt.Init_obj(String_.new_u8(rv));

to

return rv == null ? rslt.Init_obj("") : rslt.Init_obj(String_.new_u8(rv));

The problem moves on a few lines

This (I think) is due to the fact that - with the fix dataNs0.text has an empty string The string.match in the line

dataNs0.SAL=string.match(dataNs0.text,"avz=(%d+)")

is returning a nil not an empty string And the line

dataNs0.codeSAL=string.gsub(dataNs0.codeSAL,"xxx",dataNs0.SAL)

goes pop

desb42 commented 4 years ago

I suspect that this is a case were the getContent is expected to return something

My code had a bug that did not return anything

My bad, therefore a nonexistent issues - closing