User:Taokailam/Sandbox

Hello, you have come here looking for the meaning of the word User:Taokailam/Sandbox. In DICTIOUS you will not only get to know all the dictionary meanings for the word User:Taokailam/Sandbox, but we will also tell you about its etymology, its characteristics and you will know how to say User:Taokailam/Sandbox in singular and plural. Everything you need to know about the word User:Taokailam/Sandbox you have here. The definition of the word User:Taokailam/Sandbox will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofUser:Taokailam/Sandbox, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.

--[=[

TODO:

   - Implement support for hollow roots in nif`al.
   - Implement support for geminate roots in pa`al and nif`al.
   - Implement smarter ktiv male spellings.
   - Implement support for mixed binyanim (such as for ניגש and יכול).
   - Implement support for alternative forms.

Reference:

   Input parameters:
       1: binyan abbreviation
       p: first root letter
       a: second root letter
       l: third root letter
   Root letters may be prefixed with ':' to include them literally, in which case they will not be
   parsed as hollow or weak and no dageshes will be added to or removed from them. Any of the
   final form codes or intermediate data below can also be given explicitly in the input.
   Binyan abbreviations:
       pa: pa`al
       pi: pi`el
       po: po`el/polel
       pu: pu`al
       poal: po`al/polal
       hif: hif`il
       huf: huf`al
       nif: nif`al
       hit: hitpa`el
       hitpo: hitpo`el/hitpolel
       hitpu: hitpu`al *rare modern coinage
   Tense abbreviations:
       inf: to-infinitive
       imp: imperative
       fut: future (a.k.a. imperfect or prefix conjugation)
       pres: present (a.k.a. active participle)
       past: past (a.k.a. perfect or suffix conjugation)
       noun: action noun
       pp: passive participle
   Gender abbreviations:
       s: singular *first person only
       p: plural *first person only
       ms: masculine singular
       fs: feminine singular
       mp: masculine plural
       fp: feminine plural
   Person abbreviations:
       1: first person
       2: second person
       3: third person
   Exhaustive list of final form codes:
       inf
       noun *optional
       pp *optional
       imp_ms
       imp_fs
       imp_mp
       imp_fp *obsolete
       fut_1s
       fut_2ms *always equal to fut_3fs
       fut_2fs
       fut_3ms
       fut_3fs *always equal to fut_2ms
       fut_1p
       fut_2mp
       fut_2fp *obsolete and always equal to fut_3fp
       fut_3mp
       fut_3fp *obsolete and always equal to fut_2fp
       past_1s
       past_2ms
       past_2fs
       past_3ms
       past_3fs
       past_1p
       past_2mp
       past_2fp
       past_3mp
       past_3fp *obsolete before Biblical Hebrew, therefore equal to past_3mp
       pres_ms
       pres_fs
       pres_mp
       pres_fp
   Intermediate data:
       root_p
       root_a
       root_l
       gem *whether to treat as geminate
       imp_pre_stem
       imp_prs_stem
       imp_mid_stem
       imp_fin_stem
       imp_suf_stem
       imp_ffp_stem
       fut_gem
       fut_char *characteristic vowel , pa`al only (default: u)
       fut_pre_stem
       fut_prs_stem
       fut_1sp_stem
       fut_mid_stem
       fut_fin_stem
       fut_suf_stem
       fut_ffp_stem
       pres_gem
       pres_short *if not empty, use the pa`el-present, pa`al only
       pres_stem
       past_gem
       past_char *characteristic vowel , pa`al only (default: a)
       past_pre_stem
       past_2p_pre_stem
       past_stem
       past_3_stem
       past_3ms_stem
       past_3fs_stem
       past_2p_stem

]=]

local m_utilities = require("Module:utilities") local m_links = require("Module:links") local m_strutils = require("Module:string utilities")

local export = {} local get_stems_for = {}

local lang = require("Module:languages").getByCode("he")

local convert_root_char = {

    = "א",
    = "ב",
    = "בּ", -- always hard
    = "בֿ", -- always soft
    = "ג",
    = "גּ", -- always hard
    = "גֿ", -- always soft
    = "ד",
    = "דּ", -- always hard
    = "דֿ", -- always soft
    = "ה",
    = "ו",
    = "ז",
    = "ח",
    = "ט",
    = "י",
    = "כ",
    = "כּ", -- always hard
    = "כֿ", -- always soft
    = "ל",
    = "מ",
    = "נ",
    = "ס",
    = "ע",
    = "פ",
    = "פּ", -- always hard
    = "פֿ", -- always soft
    = "צ",
    = "ק",
    = "ר",
    = "שׁ", -- assume shin
    = "שׁ", -- shin
    = "שׂ", -- sin
    = "ת",
    = "תּ", -- always hard
    = "תֿ", -- always soft

}

local convert_final_root_char = {

    = "י", -- make defective
    = "ה", -- remove mappiq
    = "י", -- make defective
    = "כ", -- normalize final
    = "כּ", -- always hard, normalize final
    = "כֿ", -- always soft, normalize final
    = "מ", -- normalize final
    = "נ", -- normalize final
    = "פ", -- normalize final
    = "פּ", -- always hard, normalize final
    = "פֿ", -- always soft, normalize final
    = "צ", -- normalize final

}

local forms_itp = {

    = "שְׁתּ",
    = "שְׂתּ",
    = "סְתּ",
    = "זְדּ",
    = "צְט",
    = {"ית", "תּ"},
    = {"יד", "דּ"},
    = {"יט", "טּ"},

}

local forms_etp = {

    = "תּ",
    = "דּ",
    = "טּ",

}

local forms = {

    = "ב",
    = "ג",
    = "ד",
    = "כ",
    = "פ",
    = "ת",

}

local forms_initial = {

    = "בּ",
    = "גּ",
    = "דּ",
    = "כּ",
    = "פּ",
    = "תּ",

}

local non_doubling_letters = {

    = 1,
    = 2,
    = 3,
    = 2,
    = 1,

}

local forms_final_furtive = {

    = "הַּ",
    = "חַ",
    = "עַ",

}

local forms_final = {

    = "הּ",
    = "ךְ",
    = "ךְּ",
    = "ךְ",
    = "ם",
    = "ן",
    = "ף",
    = "ף",
    = "ץ",

}

local short_gem_vowel = {

    = "ַ",
    = {"י", "ִ"},
    = {"ו", "ֻ"},
    = "ֶ",
    = {"ו", "ָ"},

}

local lengthened_gem_vowel = {

    = "ָ",
    = {"י", "ֵ"},
    = {"ו", "ֹ"},
    = {"י", "ֵ"},
    = {"ו", "ֹ"},

}

local mixed_gem_vowel = {

    = "ַ",
    = {"י", "ִ"},
    = {"ו", "ֹ"},
    = "ֶ",
    = {"ו", "ֹ"},

}

local stressed_gem_vowel = {

    = "ַ",
    = "ֵ",
    = {"ו", "ֹ"},
    = "ֵ",
    = {"ו", "ֹ"},

}

local doubling_type = {

    = lengthened_gem_vowel,
    = mixed_gem_vowel,
    = short_gem_vowel,

}

local gutturals = {

    = true,
    = true,
    = true,
    = true,

}

local char_vowel = {

    = "ַ",
    = "ֵ",
    = {"ו", "ֹ"},
    = "ָ",
    = "ִי",
    = "וּ",
    = "ֵ",
    = "וֹ",

}

local char_vowel_open = {

    = "ָ",
    = "ֵ",
    = {"ו", "ֹ"},
    = "ָ",
    = "ִי",
    = "וּ",
    = "ֵ",
    = "וֹ",

}

local char_vowel_short = {

    = "ַ",
    = "ֵ",
    = {"ו", "ֹ"},
    = "ַ",
    = "ֵ",
    = {"ו", "ֹ"},
    = "ֵ",
    = {"ו", "ֹ"},

}

local char_vowel_open_short = {

    = "ָ",
    = "ֵ",
    = {"ו", "ֹ"},
    = "ָ",
    = "ֵ",
    = {"ו", "ֹ"},
    = "ֵ",
    = {"ו", "ֹ"},

}

local char_vowel_closed = {

    = "ַ",
    = "ַ",
    = {"ו", "ֹ"},
    = "ַ",
    = "ַ",
    = {"ו", "ֹ"},
    = "ַ",
    = {"ו", "ֹ"},

}

local char_vowel_unstressed = {

    = "ַ",
    = "ַ",
    = {"ו", "ָ"},
    = "ַ",
    = "ַ",
    = {"ו", "ָ"},
    = "ַ",
    = {"ו", "ָ"},

}

local char_vowel_open_fp = {

    = "ֶ",
    = "ֶ",
    = {"ו", "ֹ"},
    = "ֶ",
    = "ֶ",
    = {"ו", "ֹ"},
    = "ֶ",
    = {"ו", "ֹ"},

}

local char_vowel_reduce = {

    = nil,
    = nil,
    = nil,
    = "ָ",
    = "ִי",
    = "וּ",
    = "ֵ",
    = "וֹ",

}

local chataf_vowel = {

    = "ֲ",
    = "ֱ",
    = {"ו", "ֳ"},

}

local monophthongize = {

    = "ֵי",
    = "וֹ",

}

local function gen_link(x)

   if type(x) == "table" then
       local pg = (lang:makeEntryName(x))
       if pg == (lang:makeEntryName(x)) then
           return m_links.full_link({lang = lang, term = pg, alt = x})
       else
           return m_links.full_link({lang = lang, term = pg, alt = pg .. " / " .. x})
       end
   else
       if x == "-" then
           return "—" -- m-dash
       else
           return m_links.full_link({lang = lang, term = x})
       end
   end

end

local function process_args(args)

   for key, value in pairs(args) do
       local i = mw.ustring.find(value, "")
       if i then
           args = {mw.ustring.sub(value, 1, i - 1), mw.ustring.sub(value, i + 1)}
       end
   end

end

local function append_parts_2(a, b)

   if type(a) == "table" then
       if type(b) == "table" then
           return {a .. b, a .. b}
       else
           return {a .. (lang:makeEntryName(b)), a .. b}
       end
   else
       if type(b) == "table" then
           return {(lang:makeEntryName(a)) .. b, a .. b}
       else
           return a .. b
       end
   end

end

local function append_parts(a, ...)

   for _, b in ipairs({...}) do
       a = append_parts_2(a, b)
   end
   return a

end

local function equal(a, b)

   if type(a) == "table" then
       return type(b) == "table" and a == b and a == b
   else
       return a == b
   end

end

local function attach_t(x, novowel, assim_t)

   local is_table = (type(x) == "table")
   local wv = is_table and x or x
   if mw.ustring.sub(wv, -2) == "תְ" then
       if is_table then
           return {x .. "ת", mw.ustring.sub(wv, 1, -2) .. (novowel and "ְּ" or "ּ")}
       else
           return append_parts(mw.ustring.sub(wv, 1, -2), {"ת", (novowel and "ְּ" or "ּ")})
       end
   elseif assim_t and mw.ustring.sub(wv, -2) == "נְ" and (not is_table or mw.ustring.sub(x, -1) == "נ") then
       if is_table then
           return {mw.ustring.sub(x, 1, -2) .. "ת", mw.ustring.sub(wv, 1, -3) .. (novowel and "תְּ" or "תּ")}
       else
           return mw.ustring.sub(wv, 1, -3) .. (novowel and "תְּ" or "תּ")
       end
   else
       local dagesh = (mw.ustring.sub(wv, -1) == "ְ")
       return append_parts(x, dagesh and (novowel and "תְּ" or "תּ") or "ת")
   end

end

local function attach_n(x)

   local is_table = (type(x) == "table")
   local wv = is_table and x or x
   if mw.ustring.sub(wv, -2) == "נְ" then
       if is_table then
           return {x, mw.ustring.sub(wv, 1, -2) .. "ּ"}
       else
           return mw.ustring.sub(wv, 1, -2) .. "ּ"
       end
   else
       return append_parts(x, "נ")
   end

end

local function get_form_initial(letter)

   if type(letter) == "table" then
       return letter
   elseif mw.ustring.sub(letter, 1, 1) == ":" then
       return mw.ustring.sub(letter, 2)
   else
       return forms_initial or forms or letter
   end

end

local function get_form_itp(letter)

   return forms_itp or append_parts("תְ", get_form_initial(letter))

end

local function get_form_etp(letter)

   return forms_etp or forms_itp or append_parts("תְ", get_form_initial(letter))

end

local function get_form_medial(letter)

   if type(letter) == "table" then
       return letter
   elseif mw.ustring.sub(letter, 1, 1) == ":" then
       return mw.ustring.sub(letter, 2)
   else
       return forms or letter
   end

end

local dagesh_or_rafe = { = true, = true} local function add_dagesh(letter)

   if type(letter) == "table" then
       return letter
   elseif mw.ustring.sub(letter, 1, 1) == ":" then
       return get_form_medial(letter)
   elseif non_doubling_letters or dagesh_or_rafe then
       return get_form_medial(letter)
   else -- TODO: Handle geresh
       return get_form_medial(letter) .. "ּ"
   end

end

local function get_form_double(letter, vowel, force_lengthening, stressed)

   local lengthen = non_doubling_letters
   if force_lengthening then lengthen = lengthen and 1 end
   if stressed then
       vowel = vowel and (lengthen and vowel == "a" and "ָ" or stressed_gem_vowel) or ""
   else
       vowel = vowel and (lengthen and doubling_type or short_gem_vowel) or ""
   end
   return append_parts(vowel, add_dagesh(letter))

end

local function get_form_final(letter, char)

   if type(letter) == "table" then
       return letter
   elseif mw.ustring.sub(letter, 1, 1) == ":" then
       return mw.ustring.sub(letter, 2)
   else
       return (char ~= "a" and char ~= "A" and forms_final_furtive) or forms_final or forms or letter
   end

end

local function get_elet_ending(letter)

   if letter == "א" then
       return "ֵאת"
   else
       local vowel = gutturals and "ַ" or "ֶ"
       return append_parts(vowel, get_form_medial(letter), vowel, "ת")
   end

end

local function ends_in_guttural(letter)

   if type(letter) == "table" then
       letter = letter
   end
   return gutturals

end

local function shva_na(letter, vowel)

   return ends_in_guttural(letter) and chataf_vowel or "ְ"

end

local function reduce(char, chataf)

   return char_vowel_reduce or chataf and "ֲ" or "ְ"

end

local letters = "" local not_letters = "" local modifiers = "?" local separators = "?" local root_regex = "(" .. letters .. modifiers .. ")" .. separators

local function parse_root_part(part, last)

   if mw.ustring.sub(part, 1, 1) == ":" then
       return part
   end
   local letters = {}
   local len = 0
   local subber = function(letter)
       table.insert(letters, letter)
       len = len + 1
       return ""
   end
   local scraps = mw.ustring.gsub(part, root_regex, subber)
   if scraps ~= "" then
       return ":" .. part
   end
   if len < 1 then
       return nil
   elseif len == 1 then
       return part
   else
       local ret = ""
       for i, letter in ipairs(letters) do
           local letterx = last and i == len and convert_final_root_char or convert_root_char
           if not letterx then
               error("Unrecognized root letter '" .. letter .. "'.")
           end
           ret = append_parts(ret, get_form_medial(letterx), i == len and "" or "ְ")
       end
       if type(ret) == "table" then
           return ret
       else
           return ":" .. ret
       end
   end

end

local function parse_root(args)

   if args == "" then args = nil end
   if args == "" then args = nil end
   if args == "" then args = nil end
   if args then
       args = args or parse_root_part(args)
       args = args or parse_root_part(args)
       args = args or parse_root_part(args, true)
   elseif args then
       local radicals = {}
       local len = 0
       local subber = function(radical)
           table.insert(radicals, radical)
           len = len + 1
           return ""
       end
       local scraps = mw.ustring.gsub(args, root_regex, subber)
       if scraps ~= "" then
           error("Unrecognized characters in root.")
       end
       if len < 3 then
           error("Root must have at least three letters.")
       elseif len == 3 then
           args = args or radicals
           args = args or radicals
           args = args or radicals
       elseif len == 4 then
           args = args or radicals
           args = args or radicals
           args = args or radicals
           args = args or radicals
       elseif len > 4 then
           error("Roots with more than four letters must be explicitly delimited.")
       end
   end

end

local function convert_root(args)

   for _, x in ipairs({"p", "a", "a2", "l"}) do
       if args then
           local root_x = "root_" .. x
           if not args then
               if mw.ustring.sub(args, 1, 1) == ":" then
                   args = args
               else
                   args = x == "l" and convert_final_root_char] or convert_root_char]
                   if not args then
                       error("Unrecognized root letter '" .. args .. "'.")
                   end
               end
           end
       end
   end
   if args then
       local a = append_parts(get_form_medial(args), "ְ", get_form_initial(args))
       if type(a) ~= "table" then
           a = ":" .. a
       end
       args = a
       args = nil
   end

end

local function conjugate(args)

   args = args or args
   args = args or args
   args = args or args
   args = args or args
   args = args or args
   args = args or args
   local fp_long = args and args ~= "-"
   if fp_long then
       args = append_parts(args or args, "ֶי")
       args = append_parts(args or args, "ֶי")
   end
   if args ~= "-" then
       if not args then
           args = append_parts(args, args, args)
       end
       if not args then
           args = append_parts(args or args, args, args, "ִי")
       end
       if not args then
           args = append_parts(args or args, args, args, "וּ")
       end
       if not args then
           args = append_parts(fp_long and (args or args) or args, args, attach_n(fp_long and args or args), "ָה")
       end
   end
   if args ~= "-" then
       if not args then
           args = append_parts("א", args or args, args, args)
       end
       if not args then
           args = append_parts("תּ", args, args, args)
       end
       if not args then
           args = append_parts("תּ", args or args, args, args, "ִי")
       end
       if not args then
           args = append_parts("י", args, args, args)
       end
       if not args then
           args = args
       end
       if not args then
           args = append_parts("נ", args, args, args)
       end
       if not args then
           args = append_parts("תּ", args or args, args, args, "וּ")
       end
       if not args then
           args = append_parts("תּ", fp_long and (args or args) or args, args, attach_n(fp_long and args or args), "ָה")
       end
       if not args then
           args = append_parts("י", args or args, args, args, "וּ")
       end
       if not args then
           args = append_parts("תּ", fp_long and (args or args) or args, args, attach_n(fp_long and args or args), "ָה")
       end
   end
   if args ~= "-" then
       args = args or ""
       args = args or args
       if not args then
           args = append_parts(args, args)
       end
       if not args then
           args = args or append_parts(args, "ָה")
           args = append_parts(args, args)
       end
       if not args then
           args = append_parts(args, args, "ִים")
       end
       if not args then
           args = append_parts(args, args, "וֹת")
       end
   end
   if args ~= "-" then
       args = args or ""
       args = args or args
       local past_long = args and args ~= "-"
       if past_long then
           args = append_parts(args or args or args, "וֹ")
           args = args
           args = args or args == "י" and args or args
       else
           args = args or args
       end
       local assim_t = args and args ~= "-"
       if not args then
           args = append_parts(past_long and args or args, attach_t(args, false, assim_t), "ִי")
       end
       if not args then
           args = append_parts(past_long and args or args, attach_t(args, false, assim_t), "ָ")
       end
       if not args then
           args = append_parts(past_long and args or args, attach_t(args, true, assim_t))
       end
       if not args then
           args = append_parts(args, args)
       end
       if not args then
           args = append_parts(args or args or args, args or args, "ָה")
       end
       if not args then
           args = append_parts(past_long and args or args, attach_n(args), "וּ")
       end
       if not args then
           args = append_parts(past_long and args or args, attach_t(args, false, assim_t), "ֶם")
       end
       if not args then
           args = append_parts(past_long and args or args, attach_t(args, false, assim_t), "ֶן")
       end
       if not args then
           args = append_parts(past_long and args or args, attach_t(args, false, assim_t), "ֶם")
       end
       if not args then
           args = append_parts(past_long and args or args, attach_t(args, false, assim_t), "ֶן")
       end
       if not args then
           args = append_parts(args or args, args, "וּ")
       end
       if not args then
           args = args
       end
   end
   args = args or "-"
   args = "Conjugation of " .. gen_link(args) .. " (see also Appendix:Hebrew verbs)"

end

local function get_imp_stem_endings(args, root_l, char, chataf, keep_long_vowel, guttural_force_patach)

   if root_l == "א" then
       args = args or append_parts(keep_long_vowel and char_vowel_open or char_vowel_open_short, "א")
       args = args or append_parts(reduce(char, chataf), "א")
       args = args or append_parts(char_vowel_open_fp, "א")
       args = args or append_parts(char == "a" and char_vowel_open or reduce(char, chataf), "א")
   elseif root_l == "י" then
       args = args or "ֵה"
       args = args or ""
       args = args or "ֶי"
   else
       args = args or append_parts(keep_long_vowel and char_vowel or guttural_force_patach and gutturals and "ַ" or char_vowel_short, get_form_final(root_l, guttural_force_patach and (not keep_long_vowel) and gutturals and "a" or char))
       args = args or append_parts(reduce(char, chataf), get_form_medial(root_l))
       args = args or append_parts(gutturals and "ַ" or char_vowel_short, get_form_medial(root_l), "ְ")
       args = args or append_parts(char == "a" and char_vowel_open or reduce(char, chataf), get_form_medial(root_l))
   end

end

local function get_fut_stem_endings(args, root_l, char, chataf)

   if root_l == "א" then
       args = args or append_parts(char_vowel_open, "א")
       args = args or append_parts(reduce(char, chataf), "א")
       args = args or append_parts(char_vowel_open_fp, "א")
       args = args or append_parts(char == "a" and char_vowel_open or reduce(char, chataf), "א")
   elseif root_l == "י" then
       args = args or "ֶה"
       args = args or ""
       args = args or "ֶי"
   else
       args = args or append_parts(char_vowel, get_form_final(root_l, char))
       args = args or append_parts(reduce(char, chataf), get_form_medial(root_l))
       args = args or append_parts(gutturals and "ַ" or char_vowel_short, get_form_medial(root_l), "ְ")
       args = args or append_parts(char == "a" and char_vowel_open or reduce(char, chataf), get_form_medial(root_l))
   end

end

local function get_pres_stem_endings(args, root_l, char, chataf, use_elet, use_et)

   if root_l == "י" then
       args = args or "ֶה"
       args = args or ""
       if use_et then
           args = args or "ֵית"
       end
   else
       args = args or append_parts(char_vowel_open, get_form_final(root_l, char))
       args = args or append_parts(char == "a" and char_vowel_open or reduce(char, chataf), get_form_medial(root_l))
       if use_elet then
           args = args or get_elet_ending(root_l)
       end
   end

end

local function get_past_stem_endings(args, root_l, char, chataf, kca, use_e)

   if root_l == "א" then
       args = args or append_parts(kca and char_vowel_open or "ֵ", "א")
       args = args or append_parts(char_vowel_open, "א")
       args = args or append_parts(reduce(char, chataf), "א")
       args = args or append_parts(char == "a" and char_vowel_open or reduce(char, chataf), "א")
   elseif root_l == "י" then
       args = args or use_e and "ֵי" or "ִי"
       args = args or "ָה"
       args = args or append_parts(reduce("a", chataf), "ת")
       args = args or ""
   else
       args = args or append_parts(char_vowel_closed, get_form_medial(root_l), "ְ")
       args = args or append_parts(char_vowel_unstressed, get_form_medial(root_l), "ְ")
       args = args or append_parts(char_vowel, get_form_final(root_l, char))
       args = args or append_parts(reduce(char, chataf), get_form_medial(root_l))
       args = args or append_parts(char == "a" and char_vowel_open or reduce(char, chataf), get_form_medial(root_l))
   end

end

local function get_imp_stem_endings_gem(args, root_l, char)

   if root_l == "א" then
       args = args or append_parts(char == "a" and "ָ" or stressed_gem_vowel, "א")
       args = args or append_parts(char == "a" and "ָ" or stressed_gem_vowel, "א")
       args = args or append_parts(char ~= "u" and char ~= "o" and "ֶ" or stressed_gem_vowel, "א")
   else
       args = args or append_parts(stressed_gem_vowel, get_form_final(root_l, char))
       args = args or get_form_double(root_l, char, true, true)
       args = args or append_parts(gutturals and "ַ" or stressed_gem_vowel, get_form_medial(root_l), "ְ")
       args = args or get_form_double(root_l, char, true)
   end

end

local function get_fut_stem_endings_gem(args, root_l, char)

   if root_l == "א" then
       args = args or append_parts(char == "a" and "ָ" or stressed_gem_vowel, "א")
       args = args or get_form_double("א", char)
       args = args or append_parts(char ~= "u" and char ~= "o" and "ֶ" or stressed_gem_vowel, "א")
   else
       args = args or append_parts(stressed_gem_vowel, get_form_final(root_l, char))
       args = args or get_form_double(root_l, char, true, true)
       args = args or append_parts(gutturals and "ַ" or stressed_gem_vowel, get_form_medial(root_l), "ְ")
       args = args or get_form_double(root_l, char, true)
   end

end

local function get_pres_stem_endings_gem(args, root_l, char, short_a)

   if root_l == "א" then
       args = args or append_parts(char == "a" and "ָ" or stressed_gem_vowel, "א")
       args = args or get_form_double("א", char)
   else
       args = args or append_parts(char == "a" and (not short_a) and "ָ" or stressed_gem_vowel, get_form_final(root_l, char))
       args = args or get_form_double(root_l, char, true)
   end

end

local function get_past_stem_endings_gem(args, root_l, char)

   if root_l == "א" then
       args = args or append_parts(char == "a" and "ָ" or stressed_gem_vowel, "א")
       args = args or append_parts(char == "a" and "ָ" or stressed_gem_vowel, "א")
       args = args or get_form_double("א", char)
   else
       args = args or append_parts((char == "u" or char == "o") and {"ו", "ֹ"} or "ַ", get_form_medial(root_l), "ְ")
       args = args or append_parts((char == "u" or char == "o") and {"ו", "ָ"} or "ַ", get_form_medial(root_l), "ְ")
       args = args or append_parts(stressed_gem_vowel, get_form_final(root_l, char))
       args = args or get_form_double(root_l, char, true, true)
       args = args or get_form_double(root_l, char, true)
   end

end

get_stems_for = function(args, categories)

   local root_p = args
   local root_a = args
   local root_l = args
   if args ~= "-" then
       local past_char = args or "A"
       local fut_char = args or (root_a == "י" and "I") or "U"
       local imp_char = args or fut_char
       local inf_char = args or fut_char
       local pres_char = args or past_char
       local prefix_vowel = (fut_char == "O" and past_char == "O" and args ~= "-") and "ֵ" or "ָ"
       args = args or append_parts("ל", prefix_vowel, get_form_medial(root_p), char_vowel, get_form_final(root_l, inf_char))
       args = args or append_parts(get_form_initial(root_p), "ִי", get_form_medial(root_l), "ָה")
       args = args or get_form_initial(root_p)
       args = args or append_parts(prefix_vowel, get_form_medial(root_p))
       args = args or append_parts("ְ", get_form_medial(root_p))
       args = args or ""
       get_imp_stem_endings(args, root_l, imp_char, gutturals, true)
       get_fut_stem_endings(args, root_l, fut_char, gutturals)
       args = args or get_form_initial(root_p)
       get_pres_stem_endings(args, root_l, pres_char, gutturals, false, false)
       args = args or get_form_initial(root_p)
       get_past_stem_endings(args, root_l, past_char, gutturals, true, false)
   elseif false then
       -- reserved for special cases
   else
       local past_char = args or "a"
       local fut_char = args
       local imp_char = args
       local inf_char = args
       local pres_char = args
       local if_ = nil
       local ef_ = nil
       local suf_if_ = nil
       if args ~= "-" then
           fut_char = fut_char or ((args ~= "-" or gutturals) and "a") or "u"
           if_ = get_form_double(root_a, "i", true)
           ef_ = get_form_double(root_a, "e", true)
       elseif args ~= "-" then
           if root_p == "א" then
               fut_char = fut_char or "a"
               if_ = append_parts("ֹא", get_form_medial(root_a))
               ef_ = append_parts({"ו", "ֹ"}, get_form_medial(root_a))
           else
               fut_char = fut_char or (gutturals and root_l ~= "א" and "a") or "i"
               if_ = append_parts("ֵ", get_form_medial(root_a))
           end
       elseif monophthongize then
           fut_char = fut_char or "a"
           if_ = append_parts("ִי", get_form_medial(root_a))
       elseif gutturals then
           fut_char = fut_char or ((gutturals or gutturals) and "a") or "u"
           local v1 = (root_p == "א" or (root_l == "י" and root_p ~= "ע") or (root_l ~= "י" and fut_char == "a")) and "ֶ" or "ַ"
           if args then
               if root_a == "י" then v1 = "ִ" end
               if_ = append_parts(v1, get_form_medial(root_p), "ְ", get_form_initial(root_a))
               ef_ = append_parts("ֶ", get_form_medial(root_p), "ְ", get_form_initial(root_a))
           else
               local v2 = v1 == "ֶ" and "ֱ" or "ֲ"
               if_ = append_parts(v1, get_form_medial(root_p), v2, get_form_medial(root_a))
               ef_ = append_parts("ֶ", get_form_medial(root_p), "ֱ", get_form_medial(root_a))
               suf_if_ = append_parts(v1, get_form_medial(root_p), v1, get_form_medial(root_a))
           end
       else
           fut_char = fut_char or ((gutturals or gutturals) and "a") or "u"
           if_ = append_parts("ִ", get_form_medial(root_p), "ְ", get_form_initial(root_a))
           ef_ = append_parts("ֶ", get_form_medial(root_p), "ְ", get_form_initial(root_a))
       end
       local inf_if_ = nil
       local p_ = nil
       if args ~= "-" and root_p ~= "א" then
           inf_char = inf_char or "i"
           imp_char = imp_char or fut_char
           args = args or append_parts("לָ", get_form_medial(root_a), get_elet_ending(root_l))
           p_ = get_form_initial(root_a)
       elseif gutturals then
           inf_char = inf_char or "u"
           imp_char = imp_char or (root_p == "א" and args ~= "-" and (((gutturals or gutturals) and "a") or "u")) or fut_char
           local v1 = (root_p == "א" or (root_l ~= "י" and inf_char == "a")) and "ֶ" or "ַ"
           if args then
               if root_a == "י" then v1 = "ִ" end
               inf_if_ = append_parts(v1, get_form_medial(root_p), "ְ", get_form_initial(root_a))
           else
               local v2 = v1 == "ֶ" and "ֱ" or "ֲ"
               inf_if_ = append_parts(v1, get_form_medial(root_p), v2, get_form_medial(root_a))
           end
           p_ = append_parts(get_form_initial(root_p), root_p == "א" and "ֱ" or "ֲ", get_form_medial(root_a))
           if root_l ~= "י" and root_p == "א" and gutturals then
               args = args or append_parts(get_form_initial(root_p), "ֶ", get_form_medial(root_a))
               args = args or append_parts("ֱ", get_form_medial(root_l))
           end
       else
           inf_char = inf_char or "u"
           imp_char = imp_char or fut_char
           inf_if_ = if_
           p_ = append_parts(get_form_initial(root_p), shva_na(root_p), get_form_medial(root_a))
       end
       args = args or append_parts("ל", inf_if_, root_l == "י" and "וֹת" or append_parts(char_vowel, get_form_final(root_l, inf_char)))
       args = args or append_parts(get_form_initial(root_p), shva_na(root_p), get_form_medial(root_a), "ִי", root_l == "י" and "ּ" or get_form_medial(root_l), "ָה")
       args = args or append_parts(get_form_initial(root_p), "ָ", get_form_medial(root_a), "וּ", get_form_final(root_l, "U"))
       args = args or p_
       if root_l ~= "י" and (args == "-" or root_p == "א") then
           if gutturals then
               args = args or append_parts(get_form_initial(root_p), "ַ", get_form_medial(root_a))
               if imp_char ~= "u" and imp_char ~= "i" then
                   args = args or args
               end
               args = args or append_parts("ֲ", get_form_medial(root_l))
           else
               args = args or append_parts(get_form_initial(root_p), "ִ", get_form_medial(root_a))
           end
       end
       args = args or if_
       args = args or ef_
       if root_l ~= "י" then
           args = args or suf_if_
       end
       args = args or ""
       get_imp_stem_endings(args, root_l, imp_char, ends_in_guttural(root_a))
       get_fut_stem_endings(args, root_l, fut_char, ends_in_guttural(root_a))
       if args and args ~= "" then
           -- pa`el
           args = args or append_parts(get_form_initial(root_p), "ָ", get_form_medial(root_a))
           if root_l ~= "י" then
               args = args or append_parts(get_form_initial(root_p), shva_na(root_p), get_form_medial(root_a))
           end
           get_pres_stem_endings(args, root_l, pres_char or "E", ends_in_guttural(root_a), false, false)
       else
           -- po`el
           args = args or append_parts(get_form_initial(root_p), "וֹ", get_form_medial(root_a))
           get_pres_stem_endings(args, root_l, pres_char or "i", ends_in_guttural(root_a), true, false)
       end
       args = args or append_parts(get_form_initial(root_p), "ָ", get_form_medial(root_a))
       args = args or append_parts(get_form_initial(root_p), shva_na(root_p), get_form_medial(root_a))
       if past_char == "i" or past_char == "u" then
           args = args or append_parts(get_form_initial(root_p), gutturals and "ַ" or "ִ", get_form_medial(root_a))
       end
       get_past_stem_endings(args, root_l, past_char, ends_in_guttural(root_a), true, false)
   end

end

get_stems_for = function(args, categories)

   local root_p = args
   local root_a = args
   local root_l = args
   local past_char = args or "i"
   local fut_char = args or "i"
   local imp_char = args or fut_char
   local inf_char = args or fut_char
   local pres_char = args or "i"
   if false then
       -- reserved for special cases
   elseif false then
       -- reserved for special cases
   else
       args = args or append_parts("לְ", get_form_medial(root_p), get_form_double(root_a, "a"), root_l == "י" and "וֹת" or append_parts(char_vowel, get_form_final(root_l, inf_char)))
       args = args or append_parts(get_form_initial(root_p), get_form_double(root_a, "i"), "וּ", get_form_final(root_l, "U"))
       args = args or append_parts(get_form_initial(root_p), get_form_double(root_a, "a"))
       args = args or append_parts("ְ", get_form_medial(root_p), get_form_double(root_a, "a"))
       args = args or append_parts("ֲ", get_form_medial(root_p), get_form_double(root_a, "a"))
       args = args or ""
       get_imp_stem_endings(args, root_l, imp_char, ends_in_guttural(root_a))
       get_fut_stem_endings(args, root_l, fut_char, ends_in_guttural(root_a))
       args = args or append_parts("מְ", get_form_medial(root_p), get_form_double(root_a, "a"))
       get_pres_stem_endings(args, root_l, pres_char, ends_in_guttural(root_a), true, false)
       args = args or append_parts(get_form_initial(root_p), get_form_double(root_a, "i"))
       get_past_stem_endings(args, root_l, past_char, ends_in_guttural(root_a), false, false)
   end

end

get_stems_for = function(args, categories)

   local root_p = args
   local root_a = args == "-" and args or args
   local root_l = args
   local past_char = args or "i"
   local fut_char = args or "i"
   local imp_char = args or fut_char
   local inf_char = args or fut_char
   local pres_char = args or "i"
   if false then
       -- reserved for special cases
   elseif false then
       -- reserved for special cases
   else
       args = args or append_parts("לְ", get_form_medial(root_p), "וֹ", get_form_medial(root_a), root_l == "י" and "וֹת" or append_parts(char_vowel, get_form_final(root_l, inf_char)))
       -- args = args or append_parts(get_form_initial(root_p), "וֹ", get_form_medial(root_a), shva_na(root_a), get_form_medial(root_l), "וּת")
       args = args or append_parts(get_form_initial(root_p), "ִי", get_form_medial(root_a), "וּ", get_form_final(root_l, "U"))
       args = args or append_parts(get_form_initial(root_p), "וֹ", get_form_medial(root_a))
       args = args or append_parts("ְ", get_form_medial(root_p), "וֹ", get_form_medial(root_a))
       args = args or append_parts("ֲ", get_form_medial(root_p), "וֹ", get_form_medial(root_a))
       args = args or ""
       get_imp_stem_endings(args, root_l, imp_char, ends_in_guttural(root_a))
       get_fut_stem_endings(args, root_l, fut_char, ends_in_guttural(root_a))
       args = args or append_parts("מְ", get_form_medial(root_p), "וֹ", get_form_medial(root_a))
       get_pres_stem_endings(args, root_l, pres_char, ends_in_guttural(root_a), true, false)
       args = args or append_parts(get_form_initial(root_p), "וֹ", get_form_medial(root_a))
       get_past_stem_endings(args, root_l, past_char, ends_in_guttural(root_a), false, false)
   end

end

get_stems_for = function(args, categories)

   local root_p = args
   local root_a = args
   local root_l = args
   local past_char = args or "a"
   local fut_char = args or "a"
   local pres_char = args or "a"
   if false then
       -- reserved for special cases
   elseif false then
       -- reserved for special cases
   else
       args = args or "-"
       args = args or append_parts("ְ", get_form_medial(root_p), get_form_double(root_a, "u"))
       args = args or append_parts("ֲ", get_form_medial(root_p), get_form_double(root_a, "u"))
       args = args or ""
       get_fut_stem_endings(args, root_l, fut_char, ends_in_guttural(root_a))
       args = args or append_parts("מְ", get_form_medial(root_p), get_form_double(root_a, "u"))
       get_pres_stem_endings(args, root_l, pres_char, ends_in_guttural(root_a), true, false)
       args = args or append_parts(get_form_initial(root_p), get_form_double(root_a, "u"))
       get_past_stem_endings(args, root_l, past_char, ends_in_guttural(root_a), false, true)
   end

end

get_stems_for = function(args, categories)

   local root_p = args
   local root_a = args == "-" and args or args
   local root_l = args
   local past_char = args or "a"
   local fut_char = args or "a"
   local pres_char = args or "a"
   if false then
       -- reserved for special cases
   elseif false then
       -- reserved for special cases
   else
       args = args or "-"
       args = args or append_parts("ְ", get_form_medial(root_p), "וֹ", get_form_medial(root_a))
       args = args or append_parts("ֲ", get_form_medial(root_p), "וֹ", get_form_medial(root_a))
       args = args or ""
       get_fut_stem_endings(args, root_l, fut_char, ends_in_guttural(root_a))
       args = args or append_parts("מְ", get_form_medial(root_p), "וֹ", get_form_medial(root_a))
       get_pres_stem_endings(args, root_l, pres_char, ends_in_guttural(root_a), true, false)
       args = args or append_parts(get_form_initial(root_p), "וֹ", get_form_medial(root_a))
       get_past_stem_endings(args, root_l, past_char, ends_in_guttural(root_a), false, true)
   end

end

get_stems_for = function(args, categories)

   local root_p = args
   local root_a = args
   local root_l = args
   local past_char = args or args ~= "-" and "i" or "I"
   local fut_char = args or args ~= "-" and "i" or "I"
   local imp_char = args or fut_char
   local inf_char = args or fut_char
   local pres_char = args or args ~= "-" and "i" or "I"
   if args ~= "-" then
       args = args or append_parts("לְהָ", get_form_medial(root_p), char_vowel, get_form_final(root_l, inf_char))
       args = args or append_parts(gutturals and "הֶ" or "הֲ", get_form_medial(root_p), "ָ", get_form_medial(root_l), "ָה")
       args = args or append_parts("הָ", get_form_medial(root_p))
       args = args or append_parts("ָ", get_form_medial(root_p))
       args = args or append_parts(gutturals and "הַ" or "הֲ", get_form_medial(root_p))
       args = args or append_parts("ְ", get_form_medial(root_p))
       args = args or ""
       get_imp_stem_endings(args, root_l, imp_char, gutturals, false, true)
       get_fut_stem_endings(args, root_l, fut_char, gutturals)
       args = args or append_parts("מֵ", get_form_medial(root_p))
       args = args or append_parts("מְ", get_form_medial(root_p))
       get_pres_stem_endings(args, root_l, pres_char, gutturals, false, false)
       args = args or append_parts("הֵ", get_form_medial(root_p))
       args = args or append_parts(gutturals and "הַ" or "הֲ", get_form_medial(root_p))
       get_past_stem_endings(args, root_l, past_char, gutturals, false, true)
   elseif args ~= "-" then
       args = args or append_parts("לְהָ", get_form_medial(root_p), char_vowel, get_form_final(root_l, inf_char))
       --- args = args or append_parts(gutturals and (non_doubling_letters and "הֶ" or "הַ") or "הֲ", get_form_medial(root_p), get_form_double(root_l, "a", true), "ָה")
       args = args or append_parts(gutturals and "הֶ" or "הֲ", get_form_medial(root_p), "ָ", get_form_medial(root_l), "ָה")
       args = args or append_parts("הָ", get_form_medial(root_p))
       args = args or append_parts("ָ", get_form_medial(root_p))
       args = args or append_parts(gutturals and "הַ" or "הֲ", get_form_medial(root_p))
       args = args or append_parts("ְ", get_form_medial(root_p))
       args = args or ""
       get_imp_stem_endings_gem(args, root_l, imp_char)
       get_fut_stem_endings_gem(args, root_l, fut_char)
       args = args or append_parts("מֵ", get_form_medial(root_p))
       args = args or append_parts("מְ", get_form_medial(root_p))
       get_pres_stem_endings_gem(args, root_l, pres_char)
       args = args or append_parts("הֵ", get_form_medial(root_p))
       args = args or append_parts(gutturals and "הַ" or "הֲ", get_form_medial(root_p))
       get_past_stem_endings_gem(args, root_l, past_char)
   elseif false then
       -- reserved for special cases
   else
       local af_ = nil
       local if_ = nil
       if args ~= "-" then
           af_ = append_parts(gutturals and "ָ" or "ַ", add_dagesh(root_a))
           if_ = append_parts(gutturals and "ֵ" or "ִ", add_dagesh(root_a))
       elseif monophthongize then
           af_ = append_parts(monophthongize, get_form_medial(root_a))
           if_ = af_
       elseif gutturals then
           if args then
               af_ = append_parts("ַ", get_form_medial(root_p), "ְ", get_form_initial(root_a))
               if_ = append_parts("ֶ", get_form_medial(root_p), "ְ", get_form_initial(root_a))
           else
               af_ = append_parts("ַ", get_form_medial(root_p), "ֲ", get_form_medial(root_a))
               if_ = append_parts("ֶ", get_form_medial(root_p), "ֱ", get_form_medial(root_a))
           end
       else
           af_ = append_parts("ַ", get_form_medial(root_p), "ְ", get_form_initial(root_a))
           if_ = append_parts(root_a == "א" and root_l == "י" and "ֶ" or "ִ", get_form_medial(root_p), "ְ", get_form_initial(root_a))
       end
       args = args or append_parts("לְה", af_, root_l == "י" and "וֹת" or append_parts(char_vowel, get_form_final(root_l, inf_char)))
       args = args or append_parts("ה", af_, "ָ", get_form_medial(root_l), "ָה")
       args = args or append_parts("ה", af_)
       args = args or af_
       args = args or ""
       get_imp_stem_endings(args, root_l, imp_char, ends_in_guttural(root_a), false, args ~= "-")
       get_fut_stem_endings(args, root_l, fut_char, ends_in_guttural(root_a))
       args = args or append_parts("מ", af_)
       get_pres_stem_endings(args, root_l, pres_char, ends_in_guttural(root_a), false, false)
       args = args or append_parts("ה", if_)
       get_past_stem_endings(args, root_l, past_char, ends_in_guttural(root_a), false, true)
   end

end

get_stems_for = function(args, categories)

   local root_p = args
   local root_a = args
   local root_l = args
   local past_char = args or "a"
   local fut_char = args or "a"
   local pres_char = args or "a"
   if args ~= "-" then
       args = args or "-"
       args = args or append_parts("וּ", get_form_medial(root_p))
       args = args or ""
       get_fut_stem_endings(args, root_l, fut_char, gutturals)
       args = args or append_parts("מוּ", get_form_medial(root_p))
       get_pres_stem_endings(args, root_l, pres_char, gutturals, true, true)
       args = args or append_parts("הוּ", get_form_medial(root_p))
       get_past_stem_endings(args, root_l, past_char, gutturals, false, true)
   elseif args ~= "-" then
       args = args or "-"
       args = args or append_parts("וּ", get_form_medial(root_p))
       args = args or ""
       get_fut_stem_endings_gem(args, root_l, fut_char)
       args = args or append_parts("מוּ", get_form_medial(root_p))
       get_pres_stem_endings_gem(args, root_l, pres_char)
       args = args or append_parts("הוּ", get_form_medial(root_p))
       get_past_stem_endings_gem(args, root_l, past_char)
   elseif false then
       -- reserved for special cases
   else
       local uf_ = nil
       if args ~= "-" then
           uf_ = append_parts({"ו", "ֻ"}, add_dagesh(root_a))
       elseif monophthongize then
           uf_ = append_parts("וּ", get_form_medial(root_a))
       elseif gutturals then
           if args then
               uf_ = append_parts({"ו", "ֻ"}, get_form_medial(root_p), "ְ", get_form_initial(root_a))
           else
               uf_ = append_parts({"ו", "ָ"}, get_form_medial(root_p), "ֳ", get_form_medial(root_a))
           end
       else
           uf_ = append_parts({"ו", "ֻ"}, get_form_medial(root_p), "ְ", get_form_initial(root_a))
       end
       args = args or "-"
       args = args or uf_
       args = args or ""
       get_fut_stem_endings(args, root_l, fut_char, ends_in_guttural(root_a))
       args = args or append_parts("מ", uf_)
       get_pres_stem_endings(args, root_l, pres_char, ends_in_guttural(root_a), true, true)
       args = args or append_parts("ה", uf_)
       get_past_stem_endings(args, root_l, past_char, ends_in_guttural(root_a), false, true)
   end

end

get_stems_for = function(args, categories)

   local root_p = args
   local root_a = args
   local root_l = args
   local past_char = args or "a"
   local fut_char = args or gutturals and root_l ~= "א" and "a" or "i"
   local imp_char = args or fut_char
   local inf_char = args or fut_char
   local pres_char = args or "a"
   if false then
       -- reserved for special cases
   elseif false then
       -- reserved for special cases
   else
       local if_ = nil
       local suf_if_ = nil
       if args ~= "-" then
           if_ = get_form_double(root_a, "i")
       elseif monophthongize then
           if_ = append_parts(monophthongize, get_form_medial(root_a))
       elseif gutturals then
           local v1 = root_p == "ע" and root_l == "י" and "ַ" or "ֶ"
           if args then
               if_ = append_parts(v1, get_form_medial(root_p), "ְ", get_form_initial(root_a))
           else
               local v2 = v1 == "ַ" and "ֲ" or "ֱ"
               if_ = append_parts(v1, get_form_medial(root_p), v2, get_form_medial(root_a))
               suf_if_ = append_parts(v1, get_form_medial(root_p), v1, get_form_medial(root_a))
           end
       else
           if_ = append_parts("ִ", get_form_medial(root_p), "ְ", get_form_initial(root_a))
       end
       args = args or append_parts("לְה", get_form_double(root_p, "i", true), "ָ", get_form_medial(root_a), root_l == "י" and "וֹת" or append_parts(char_vowel, get_form_final(root_l, inf_char)))
       if root_l == "י" then
           args = args or append_parts("ה", get_form_double(root_p, "i", true), "ָ", get_form_medial(root_a), "וּת")
       else
           args = args or append_parts("ה", get_form_double(root_p, "i", true), "ָ", get_form_medial(root_a), shva_na(root_a), get_form_medial(root_l), "וּת")
       end
       args = args or append_parts("ה", get_form_double(root_p, "i", true), "ָ", get_form_medial(root_a))
       args = args or append_parts(get_form_double(root_p, "i", true), "ָ", get_form_medial(root_a))
       args = args or append_parts(get_form_double(root_p, "e", true), "ָ", get_form_medial(root_a))
       args = args or ""
       get_imp_stem_endings(args, root_l, imp_char, ends_in_guttural(root_a))
       get_fut_stem_endings(args, root_l, fut_char, ends_in_guttural(root_a))
       args = args or append_parts("נ", if_)
       get_pres_stem_endings(args, root_l, pres_char, ends_in_guttural(root_a), true, true)
       args = args or append_parts("נ", if_)
       if suf_if_ then
           local pres_stem_name = root_l == "י" and "past_3fs_pre_stem" or "past_3_pre_stem"
           args = args or append_parts("נ", suf_if_)
       end
       get_past_stem_endings(args, root_l, past_char, ends_in_guttural(root_a), false, true)
   end

end

get_stems_for = function(args, categories)

   local itp = get_form_itp(args)
   local etp = get_form_etp(args)
   local root_a = args
   local root_l = args
   local past_char = args or "i"
   local fut_char = args or "i"
   local imp_char = args or fut_char
   local inf_char = args or fut_char
   local pres_char = args or "i"
   if false then
       -- reserved for special cases
   elseif false then
       -- reserved for special cases
   else
       args = args or append_parts("לְהִ", itp, get_form_double(root_a, "a"), root_l == "י" and "וֹת" or append_parts(char_vowel, get_form_final(root_l, inf_char)))
       if root_l == "י" then
           args = args or append_parts("הִ", itp, get_form_double(root_a, "a"), "וּת")
       else
           args = args or append_parts("הִ", itp, get_form_double(root_a, "a"), shva_na(root_a), get_form_medial(root_l), "וּת")
       end
       args = args or append_parts("הִ", itp, get_form_double(root_a, "a"))
       args = args or append_parts("ִ", itp, get_form_double(root_a, "a"))
       args = args or append_parts("ֶ", etp, get_form_double(root_a, "a"))
       args = args or ""
       get_imp_stem_endings(args, root_l, imp_char, ends_in_guttural(root_a))
       get_fut_stem_endings(args, root_l, fut_char, ends_in_guttural(root_a))
       args = args or append_parts("מִ", itp, get_form_double(root_a, "a"))
       get_pres_stem_endings(args, root_l, pres_char, ends_in_guttural(root_a), true, false)
       args = args or append_parts("הִ", itp, get_form_double(root_a, "a"))
       get_past_stem_endings(args, root_l, past_char, ends_in_guttural(root_a), false, true)
   end

end

get_stems_for = function(args, categories)

   local itp = get_form_itp(args)
   local etp = get_form_etp(args)
   local root_a = args == "-" and args or args
   local root_l = args
   local past_char = args or "i"
   local fut_char = args or "i"
   local imp_char = args or fut_char
   local inf_char = args or fut_char
   local pres_char = args or "i"
   if false then
       -- reserved for special cases
   elseif false then
       -- reserved for special cases
   else
       args = args or append_parts("לְהִ", itp, "וֹ", get_form_medial(root_a), root_l == "י" and "וֹת" or append_parts(char_vowel, get_form_final(root_l, inf_char)))
       if root_l == "י" then
           args = args or append_parts("הִ", itp, "וֹ", get_form_medial(root_a), "וּת")
       else
           args = args or append_parts("הִ", itp, "וֹ", get_form_medial(root_a), shva_na(root_a), get_form_medial(root_l), "וּת")
       end
       args = args or append_parts("הִ", itp, "וֹ", get_form_medial(root_a))
       args = args or append_parts("ִ", itp, "וֹ", get_form_medial(root_a))
       args = args or append_parts("ֶ", etp, "וֹ", get_form_medial(root_a))
       args = args or ""
       get_imp_stem_endings(args, root_l, imp_char, ends_in_guttural(root_a))
       get_fut_stem_endings(args, root_l, fut_char, ends_in_guttural(root_a))
       args = args or append_parts("מִ", itp, "וֹ", get_form_medial(root_a))
       get_pres_stem_endings(args, root_l, pres_char, ends_in_guttural(root_a), true, false)
       args = args or append_parts("הִ", itp, "וֹ", get_form_medial(root_a))
       get_past_stem_endings(args, root_l, past_char, ends_in_guttural(root_a), false, true)
   end

end

get_stems_for = function(args, categories)

   error("Binyan hitpu`al is not yet implemented.")

end

local form_names = {

        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,
        = true,

}

local optional_forms = {

        = true,
        = true,
        = true,

}

local table_template = [===[

]===]

local non_finite = {

    = "* to-infinitive: {inf}\n",
    = "* action noun: {noun}\n",
    = "* passive participle: {pp}\n",

}

local function make_table(args)

   for key, _ in pairs(form_names) do
       args = args and gen_link(args) or (not optional_forms) and "—"
   end
   args = m_strutils.format(non_finite, args)
   if args then
       args = args .. m_strutils.format(non_finite, args)
   end
   if args then
       args = args .. m_strutils.format(non_finite, args)
   end
   return m_strutils.format(table_template, args)

end

local function track(binyan, args)

   local sub = nil
   local hollow = args ~= "-"
   local assim = args ~= "-"
   local elide = args ~= "-" and binyan == "pa" -- elide is only relevant to pa`al I think
   local geminate = args ~= "-"
   if binyan == "pa" or binyan == "nif" or binyan == "hif" or binyan == "huf" then
       if hollow then
           if assim or elide or geminate then
               sub = "?"
           else
               sub = "hollow"
           end
       elseif elide then
           if geminate then
               sub = "?"
           elseif assim then
               sub = "assim+elide"
           else
               sub = "elide"
           end
       elseif geminate then
           if assim then
               sub = "geminate+assim"
           else
               sub = "geminate"
           end
       elseif assim then
           sub = "assim"
       end
   end
   local m_debug = require('Module:debug')
   m_debug.track("he-conj/" .. binyan .. (sub and ("/" .. sub) or ""))
   if sub == "?" then
       m_debug.track("he-conj/incompatible-combination")
   end
   if args and args ~= "-" then
       m_debug.track("he-conj/past_long")
   end
   if args and args ~= "-" then
       m_debug.track("he-conj/fp_long")
   end

end

local function track_page(lemma)

   local namespace = mw.title.getCurrentTitle().nsText
   if namespace == "" then
       local pagename = mw.title.getCurrentTitle().text
       local is_table = (type(lemma) == "table")
       local male = (lang:makeEntryName(is_table and lemma or lemma))
       if pagename ~= male then
           local haser = (lang:makeEntryName(is_table and lemma or lemma))
           local m_debug = require('Module:debug')
           if pagename ~= haser then
               m_debug.track("he-conj/not_at_lemma")
           else
               m_debug.track("he-conj/at_haser_spelling")
           end
       end
   end

end

-- The main entry point. -- This is the only function that can be invoked from a template. function export.show(frame)

   local args = frame:getParent().args
   local binyan = args or frame.args or error("Binyan has not been specified. Please pass parameter 1 to the module invocation or parent template.")
   -- PAGENAME = mw.title.getCurrentTitle().text
   -- NAMESPACE = mw.title.getCurrentTitle().nsText
   local categories = {}
   parse_root(args)
   convert_root(args)
   local root_p = args
   local root_a = args
   local root_l = args
   if not (root_p and root_a and root_l) then
       error("Missing root letters.")
   end
   args = args or ((root_a == "י" or root_a == "ו") and root_l ~= "י" and "+") or "-"
   args = args or ((root_a == root_l) and root_l ~= "י" and "+") or "-"
   args = args or (args == "-" and args == "-" and root_p == "נ" and not gutturals and "+") or "-"
   args = args or (args and (args ~= "-" == "-" or root_p == "י" or root_p == "ו") and root_l ~= "י" and "+") or "-"
   track(binyan, args)
   if binyan == "-" then
       -- do nothing, stems are given explicitly
   elseif get_stems_for then
       get_stems_for(args, categories)
   else
       error("Unknown binyan code '" .. binyan .. "'")
   end
   conjugate(args) -- finishes conjugation based on stems from get_stems_for
   local pre_notes = ""
   if args and not equal(args, args) then
       args = "1"
       args = "2"
       pre_notes = pre_notes .. "# Pronounced " .. gen_link(args) .. " and " .. gen_link(args) .. " in informal Modern Hebrew.\n# Rare in Modern Hebrew.\n"
   else
       args = ""
       args = "1"
       pre_notes = pre_notes .. "# Rare in Modern Hebrew.\n"
   end
   args = pre_notes .. (args or "")
   if args or "" ~= "" then
       return make_bot_list(forms, sep ~= "")
   else
       track_page(args)
       return make_table(args, title) .. m_utilities.format_categories(categories, lang)
   end

end

return export