% Modify pre_linebreak_filter callback so the spaces can be inserted
\directlua{%         
luavlna = require "luavlna" 
langno  = require "luavlna-langno"

require "ltluatex"
luatexbase.add_to_callback("pre_linebreak_filter", luavlna.preventsingle,"LuaVlna")
luatexbase.add_to_callback("hyphenate", luavlna.split_hyphens, "allow hyphen breaks")
% -- define the attribute number
luavlna.preventsingleid = math.random(2^16)

local languages = langno.load_languages()
local get_lang_id = function(lang)
  local langid = tonumber(lang)
  if not tonumber(lang) then
    langid = languages:get_number(lang)
  end
  return langid
end

% Process string and make table of enabled single letters
% By default, spaces for all single letters are inserted
% This can be modified with \singlechars macro
set_singlechars = function(lang,chars)
  % local langnumbers = languages.names
  local langid = get_lang_id(lang) 
  if not langid then return nil, "Cannot find language number for: "..lang end
  local chars = chars  or ""
  local singlechars = {}
  local percent = string.char(37)
  local alpha = percent .. "a"
  for pos, char in utf8.codes(chars) do
    singlechars[utf8.char(char)] = true
  end
  luavlna.singlechars(langid,singlechars)
end

% set compound characters for initials handling
% useful for Czech "Ch" etc.
% comma separated list of compounds
set_compounds = function(lang, compounds)
  local langid = get_lang_id(lang)
  if not langid then return nil, "Cannot find language number for: "..lang end
  local c = compounds:explode(",+") % match multiple colons as one
  local  compoundstable = {}
  for _, compound in pairs(c) do
    compoundstable[compound] = true
  end
  luavlna.initials(langid, compoundstable)
end

set_main_language = function(lang)
  local langid = get_lang_id(lang)
  if not langid then return nil, "Cannot find language number for: "..lang end
  luavlna.set_main_language(langid)
end	

enable_split_hyphens = function(lang)
  local langid = get_lang_id(lang)
  if not langid then return nil, "Cannot find language number for: "..lang end
  luavlna.split_hyphen_langs[langid] = true
end

disable_split_hyphens = function(lang)
  local langid = get_lang_id(lang)
  if not langid then return nil, "Cannot find language number for: "..lang end
  luavlna.split_hyphen_langs[langid] = nil
end
}     

% the langno library supports both numeric and literal names
% we can try to find the language ID from macros first, if it fails
% we pass the language name to Lua. it will try to find ID in luanguage.dat and other sources
\def\singlecharsgetlang#1{%
  \ifcsname l@#1\endcsname% 
    \the\csname l@#1\endcsname%
  \else%
    \ifcsname lang@#1\endcsname% 
      \the\csname lang@#1\endcsname%
    \else%
      % unknown language macro, let langno library to find it 
      #1%
    \fi%
  \fi%
}

% Set letters which are prevented from breaking
\def\singlechars#1#2{%
  \directlua{set_singlechars("\singlecharsgetlang{#1}","#2")}%
}

% Define compound initials
\def\compoundinitials#1#2{%
  \directlua{set_compounds("\singlecharsgetlang{#1}","#2")}%
}
% Enable inserting of visual marks for debugging
\def\preventsingledebugon{%
\directlua{luavlna.debug(true)}%
}

\def\preventsinglelang#1{%
  \directlua{set_main_language("\singlecharsgetlang{#1}")}%
} 

%\newluatexattribute\preventsinglestatus
\attributedef\preventsinglestatus=\directlua{tex.print(luavlna.preventsingleid)} % just a random number

\def\preventsingleon{%
	\preventsinglestatus=2
}

\def\preventsingleoff{%
	\preventsinglestatus=1
}
% Disable inserting of visual marks for dewbugging
\def\preventsingledebugoff{%
\directlua{luavlna.debug(false)}%
}

% enable/disable split hyphens for a language

\def\enablesplithyphens#1{\directlua{enable_split_hyphens("\singlecharsgetlang{#1}")}}
\def\disablesplithyphens#1{\directlua{disable_split_hyphens("\singlecharsgetlang{#1}")}}

% disable processing of units or degrees

\def\nopredegrees{\directlua{luavlna.no_predegrees = true}}
\def\nosufdegrees{\directlua{luavlna.no_sufdegrees = true}}
\def\nounits{\directlua{luavlna.no_unit = true}}
\def\noinitials{\directlua{luavlna.no_initials = true}}

\ifdefined\nosingledefaults\else
  \singlechars{czech}{AaIiVvOoUuSsZzKk}
  \singlechars{slovak}{AaIiVvOoUuSsZzKk}
  \compoundinitials{czech}{Ch,CH}
  \enablesplithyphens{czech}
  \enablesplithyphens{slovak}
\fi