Module:ja-link

Definition from Wiktionary, the free dictionary
Jump to: navigation, search

This does the work of {{ja-r}}.


local export = {}
local m_ja = require("Module:ja")
local lang = require("Module:languages").getByCode("ja")
local sc = require("Module:scripts").getByCode("Jpan")
local m_links = require("Module:links")

local function if_not_empty(var)
	if var == "" then
		return nil
	else
		return var
	end
end

-- Similar to test_script function in [[Module:ja-usex]] and [[Module:headword]].
local function is_script(text, script_codes)
	if type(script_codes) == "string" then
		script_codes = { script_codes }
	end
	
	if type(text) == "string" and type(script_codes) == "table" then
		local characters = {}
		
		for i, script_code in pairs(script_codes) do
			local sc = require("Module:scripts").getByCode(script_code)
			if sc and sc:getCharacters() then
				table.insert(characters, sc:getCharacters())
			else
				error("The script code " .. script_code .. " is invalid, or has no characters listed.")
			end
		end
		
		local out
		if #characters > 0 then
			text = mw.ustring.gsub(text, "%W", "")
			out = mw.ustring.find(text, "^[" .. table.concat(characters) .. "]+$")
		else
			return nil
		end
		
		if out then
			return true
		else
			return false
		end
	else
		mw.log("Parameters to test_script were incorrect.")
		return nil
	end
end

local function track(code)
	require("Module:debug").track("ja-link/" .. code)
end

function export.link(data, options)
	if not options then
		options = {}
	end
	
	if not data.transliteration then
		data.transliteration = m_ja.kana_to_romaji(data.kana, { hist = options.hist })
	elseif options.hist then
		error('If the transliteration has already been provided, the "' .. hist .. '" option does nothing.')
	end
	
	if not data.kana then
		data.kana = data.lemma
	end

	if require("Module:scripts").getByCode('Hani'):countCharacters(data.transliteration) > 0 then
		error('The transliteration "' .. data.transliteration .. '" seems to have kanji in it. Was the kana reading properly provided?')
	end
	if options.caps then
		--[[Special:WhatLinksHere/Template:tracking/ja-link/caps]]
		track("caps")
		
		data.transliteration = mw.ustring.gsub(data.transliteration, "^%l", mw.ustring.upper)
		data.transliteration = mw.ustring.gsub(data.transliteration, " %l", mw.ustring.upper)
	end
	if data.transliteration ~= '-' then
		data.transliteration = m_links.remove_links(data.transliteration) -- needed if $lemma has manual wikilinks
		data.transliteration = require("Module:script utilities").tag_translit(data.transliteration, "ja", "term")
	end
	
	if data.lemma and data.kana and data.lemma ~= data.kana then
		data.ruby = m_ja.add_ruby_backend(data.lemma, data.kana)
	else
		--[[Special:WhatLinksHere/Template:tracking/ja-link/no ruby]]
		track("no ruby")
	end
	data.lemma = m_ja.remove_ruby_markup(data.lemma)
	
	data.gloss = if_not_empty(data.gloss)
	
	data.pos = if_not_empty(data.pos)
	
	if data.linkto == "" or data.linkto == "-" then
		-- if $data.linkto is explicitly empty, make both $data.linkto and $data.lemma nil
		-- $data.linkto can be "" because of "allow_empty=true"; without it, "|linkto=<nothing>" would be ignored
		-- $data.lemma is the fallback if $data.linkto is falsy, so blank $data.lemma too
		if if_not_empty(data.linkto) then
			--[[Special:WhatLinksHere/Template:tracking/ja-link/ignored link page]]
			track("ignored link page")
		end
		if if_not_empty(data.lemma) then
			--[[Special:WhatLinksHere/Template:tracking/ja-link/ignored lemma]]
			track("ignored lemma")
		end
		data.linkto = nil
		data.lemma = nil
		options.noLink = true
		
		--[[Special:WhatLinksHere/Template:tracking/ja-link/disabled link]]
		track("disabled link")
	end

	if data.ruby and mw.ustring.match(data.ruby, '%[%[') then -- for if $lemma has manual wikilinks
		--[[Special:WhatLinksHere/Template:tracking/ja-link/manual wikilink]]
		track("manual wikilink")
		
		return m_links.full_link{
			lang = lang,
			sc = sc,
			term = nil,
			alt = data.ruby,
			tr = data.transliteration,
			gloss = data.gloss,
			pos = data.pos
		}
	else
		return m_links.full_link{
			lang = lang,
			sc = sc,
			term = data.linkto or data.lemma,
			alt = data.ruby or options.noLink and data.kana,
			tr = data.transliteration,
			gloss = data.gloss,
			pos = data.pos
		}
	end
	
end

function export.show(frame)
	local params = {
		[1] = { required = true },
		[2] = {},
		[3] = {},
		['gloss'] = { alias_of = 3 },
		['pos'] = {},
		['linkto'] = { allow_empty = true },
		['caps'] = { type = "boolean" },
		['rom'] = {},
		['hist'] = { type = "boolean" },
	}
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local kana = args[2]
	if not kana then
		if args[1] and is_script(args[1], { "Hira", "Kana" }) then
			kana = args[1]
		else
			error("Either the first parameter or the second parameter should be Japanese text written in kana only.")
		end
	end

	local data = {
		lemma = args[1],
		kana = kana,
		gloss = args[3],
		pos = args["pos"],
		linkto = args["linkto"],
		transliteration = args["rom"],
	}
	
	local options = {
		caps = args["caps"],
		hist = args["hist"],
	}
	
	return export.link(data, options)
end

return export