Module:User:Erutuon/script utilities

local export = {}

local m_data = mw.loadData("Module:script utilities/data") --[=[ Other modules used: Module:scripts Module:languages Module:parameters Module:utilities Module:debug ]=]

function export.is_Latin_script(sc) return (sc:getCode:find("Latn")) or sc:getCode == "Latinx" end

-- Used by Template:lang function export.lang_t(frame) params = { [1] = {},		[2] = { allow_empty = true, default = "" }, ["sc"] = {}, ["face"] = {}, ["class"] = {}, }	local args = require("Module:parameters").process(frame:getParent.args, params) local NAMESPACE = mw.title.getCurrentTitle.nsText local lang = args[1] or (NAMESPACE == "Template" and "und") or error("Language code has not been specified. Please pass parameter 1 to the template.") lang = require("Module:languages").getByCode(lang) or require("Module:languages").err(lang, 1) local text = args[2] local sc = args["sc"] sc = (sc and (require("Module:scripts").getByCode(sc) or error("The script code \"" .. sc .. "\" is not valid.")) or nil) local face = args["face"] return export.tag_text(text, lang, sc, face, class) end

-- Wrap text in the appropriate HTML tags with language and script class. function export.tag_text(text, lang, sc, face, class, id) if not sc then sc = lang:findBestScript(text) end require("Module:script utilities/tracking").track(text, lang, sc) -- Replace space characters with newlines in Mongolian-script text, which is written top-to-bottom. if sc and sc:getDirection == "down" then --	First, escape targets of wikilinks and HTML tags,				which should not have their spaces				replaced with line breaks. local escaped = {} local i = 1 for link_target in mw.ustring.gmatch(text, "%[%[([^|]+|)") do			escaped[i] = link_target text = mw.ustring.gsub(text, link_target, "$" .. i)			i = i + 1 end for HTML_tag in mw.ustring.gmatch(text, "<[^>]+>") do			escaped[i] = HTML_tag text = mw.ustring.gsub(text, HTML_tag, "$" .. i)			i = i + 1 end text = mw.ustring.gsub(			text,			" +",			" "		) -- Unescape whatever was escaped. text = mw.ustring.gsub(			text,			"$(%d)",			function(a)				a = tonumber(a)				return escaped[a]			end		) end

if sc:getCode == "Imag" then face = nil end

local function class_attr(classes) table.insert(classes, 1, sc:getCode) if class and class ~= '' then table.insert(classes, class) end return 'class="' .. table.concat(classes, ' ') .. '"' end local function tag_attr(...) local output = {} if id then table.insert(output, 'id="' .. require("Module:utilities").make_id(lang, id) .. '"') end table.insert(output, class_attr({...}) ) if lang then table.insert(output, 'lang="' .. lang:getCode .. '"') end return table.concat(output, " ") end if face == "hypothetical" then -- Special:WhatLinksHere/Wiktionary:Tracking/script-utilities/face/hypothetical require("Module:debug").track("script-utilities/face/hypothetical") end local data = m_data.faces[face or "nil"] if sc:getDirection == "rtl" then text = mw.ustring.gsub(text, "%p$", "%0&rlm;") end local post = "" if face == "translation" and sc:getDirection == "rtl" then post = "&lrm;" end -- Add a script wrapper if data then return ( data.prefix or "" ) .. '<' .. data.tag .. ' ' .. tag_attr(data.class) .. '>' .. text .. '' .. post else error('Invalid script face "' .. face .. '".') end end

function export.tag_translit(translit, lang, kind, attributes) if type(lang) == "table" then lang = lang.getCode and lang:getCode or error("Third argument to tag_translit should be a language code or language object.") end local data = m_data.translit[kind or "default"] local opening_tag = {} table.insert(opening_tag, data.tag) if lang == "ja" then table.insert(opening_tag, 'class="' .. (data.classes and data.classes .. " " or "") .. 'tr"') else table.insert(opening_tag, 'lang="' .. lang .. '-Latn"') table.insert(opening_tag, 'class="' .. (data.classes and data.classes .. " " or "") .. 'tr Latn"') end if data.dir then table.insert(opening_tag, 'dir="' .. data.dir .. '"') end table.insert(opening_tag, attributes) return "<" .. table.concat(opening_tag, " ") .. ">" .. translit .. "" end

-- Add a notice to request the native script of a word function export.request_script(lang, sc) local scripts = lang.getScripts and lang:getScripts or error('The language "' .. lang:getCode .. '" does not have the method getScripts. It may be unwritten.') -- By default, request for "native" script local cat_script = "native" local disp_script = "script" -- If the script was not specified, and the language has only one script, use that. if not sc and #scripts == 1 then sc = scripts[1] end -- Is the script known? if sc then -- If the script is Latin, return nothing. if export.is_Latin_script(sc) then return "" end if sc:getCode ~= scripts[1]:getCode then disp_script = sc:getCanonicalName end -- The category needs to be specific to script only if there is chance -- of ambiguity. This occurs when lang=und, or when the language has -- multiple scripts. if lang:getCode == "und" or scripts[2] then cat_script = sc:getCanonicalName end else -- The script is not known. -- Does the language have at least one non-Latin script in its list? local has_nonlatin = false for i, val in ipairs(scripts) do			if not export.is_Latin_script(val) then has_nonlatin = true break end end -- If there are non-Latin scripts, return nothing. if not has_nonlatin then return "" end end local category = "" if mw.title.getCurrentTitle.nsText ~= "Template" then category = "" end return " [" .. disp_script .. " needed] " .. category end

function export.template_rfscript(frame) local args = frame.args local lang = args[1] or error("The first parameter (language code) has not been given") local sc = args["sc"]; if sc == "" then sc = nil end lang = require("Module:languages").getByCode(lang) or error("The language code \"" .. lang .. "\" is not valid.") sc = (sc and (require("Module:scripts").getByCode(sc) or error("The script code \"" .. sc .. "\" is not valid.")) or nil) local ret = export.request_script(lang, sc) if ret == "" then error("This language is written in the Latin alphabet. It does not need a native script.") else return ret end end

function export.checkScript(text, scriptCode, result) local scriptObject = require("Module:scripts").getByCode(scriptCode) if not scriptObject then error('The script code "' .. scriptCode .. '" is not recognized.') end local originalText = text -- Remove non-letter characters. text = mw.ustring.gsub(text, "[%A]", "") -- Remove all characters of the script in question. text = mw.ustring.gsub(text, "[" .. scriptObject:getCharacters .. "]", "") if text ~= "" then if type(result) == "string" then error(result) else error('The text "' .. originalText .. '" contains the letters "' .. text .. '" that do not belong to the ' .. scriptObject:getCategoryName .. '.', 2) end end end

return export