Модул:category tree/poscatboiler/data/lang-specific/jpx
Изглед
Документацију овог модула можете да направите на страници Модул:category tree/poscatboiler/data/lang-specific/jpx/док
local export = {}
local m_str_utils = require("Модул:string utilities")
local concat = table.concat
local full_link = require("Модул:links").full_link
local insert = table.insert
local Hani_sort = require("Модул:Hani-sortkey").makeSortKey
local match = m_str_utils.match
local sort = table.sort
local tag_text = require("Модул:script_utilities").tag_text
local Hira = require("Модул:scripts").getByCode("Hira")
local Jpan = require("Модул:scripts").getByCode("Jpan")
local kana_to_romaji = require("Модул:Hrkt-translit").tr
local m_numeric = require("Модул:ConvertNumeric")
local kana_capture = "([-" .. require("Модул:ja/data/range").kana .. "・]+)"
local yomi_data = require("Модул:kanjitab/data")
function export.add_labels(labels, lang)
labels["adnominals"] = {
description = "{{{langname}}} adnominals, or {{ja-r|連%体%詞|れん%たい%し}}, which modify nouns, and do not conjugate or [[predicate#Verb|predicate]].",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["хирагана"] = {
description = "{{{langname}}} terms with hiragana {{mdash}} {{ja-r|平%仮%名|ひら%が%な}} {{mdash}} forms, sorted by conventional hiragana sequence. The hiragana form is a [[phonetic]] representation of that word. " ..
"Wiktionary represents {{{langname}}}-language segments in three ways: in normal form (with [[kanji]], if appropriate), in [[hiragana]] " ..
"form (this differs from kanji form only when the segment contains kanji), and in [[romaji]] form.",
additional = (lang:getCode() == "ja" and "For more information, see [[Wiktionary:Japanese language]].\n\n" or "") .. "''See also'' [[:Category:{{{langname}}} katakana]]",
toc_template = "categoryTOC-hiragana",
parents = {
{name = "{{{langcat}}}", raw = true},
"Категорија:Хирагана текст карактери",
}
}
labels["historical hiragana"] = {
description = "{{{langname}}} historical [[hiragana]].",
additional = "''See also'' [[:Категорија:{{{langname}}} historical katakana]].",
toc_template = "categoryTOC-hiragana",
parents = {
"хирагана",
{name = "{{{langcat}}}", raw = true},
"Категорија:Хирагана текст карактери",
}
}
labels["катакана"] = {
description = "{{{langname}}} terms with katakana {{mdash}} {{ja-r|片%仮%名|かた%か%な}} {{mdash}} forms, sorted by conventional katakana sequence. Katakana is used primarily for transliterations of foreign words, including old Chinese Hanzi not used in [[shinjitai]].",
additional = (lang:getCode() == "ja" and "For more information, see [[Wiktionary:Japanese language]].\n\n" or "") .. "''See also'' [[:Category:{{{langname}}} hiragana]]",
toc_template = "categoryTOC-katakana",
parents = {
{name = "{{{langcat}}}", raw = true},
"Категорија:Катакана текст карактери",
}
}
labels["historical katakana"] = {
description = "{{{langname}}} historical [[katakana]].",
additional = "''See also'' [[:Категорија:{{{langname}}} historical hiragana]].",
toc_template = "categoryTOC-katakana",
parents = {
"катакана",
{name = "{{{langcat}}}", raw = true},
"Категорија:Катакана текст карактери",
}
}
labels["terms spelled with mixed kana"] = {
description = "{{{langname}}} terms which combine [[hiragana]] and [[katakana]] characters, potentially with [[kanji]] too.",
parents = {
{name = "{{{langcat}}}", raw = true},
"хирагана",
"катакана",
},
}
labels["honorifics"] = {
topright = "{{wikipedia|Honorific speech in Japanese}}",
description = "{{{langname}}} [[honorific]]s.",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["humble language"] = {
description = "{{{langname}}} humble terms, or {{ja-r|謙%譲%語|けん%じょう%ご}}, which is a type of honorific speech that lowers the speaker in relation to the listener.",
parents = "honorifics",
}
labels["respectful language"] = {
description = "{{{langname}}} respectful terms, or {{ja-r|尊%敬%語|そん%けい%ご}}, which is a type of honorific speech that elevates the listener in relation to the speaker.",
parents = "honorifics",
}
labels["kanji by reading"] = {
description = "{{{langname}}} kanji categorized by reading.",
parents = {{name = "Хан карактери", sort = "reading"}},
}
labels["makurakotoba"] = {
topright = "{{wikipedia|Makurakotoba}}",
description = "{{{langname}}} idioms used in poetry to introduce specific words.",
parents = {"idioms"},
}
labels["terms by kanji readings"] = {
description = "{{{langname}}} categories grouped with regard to the readings of the kanji with which they are spelled.",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["terms by reading pattern"] = {
description = "{{{langname}}} categories with terms grouped by their reading patterns.",
parents = {{name = "{{{langcat}}}", raw = true}},
}
local function handle_onyomi_list(category, category_type, cat_yomi_type)
local onyomi, seen = {}, {}
for _, yomi in pairs(yomi_data) do
if not seen[yomi] and yomi.onyomi then
local yomi_catname = yomi[category_type]
if yomi_catname ~= false then
local yomi_type = yomi.type
if yomi_type ~= "on'yomi" and yomi_type ~= cat_yomi_type then
insert(onyomi, "[[:Категорија:{{{langname}}} " .. category:gsub("{{{yomi_catname}}}", yomi_catname) .. "]]")
end
end
end
seen[yomi] = true
end
sort(onyomi)
return onyomi
end
local function add_yomi_category(category, category_type, parent, description)
for _, yomi in pairs(yomi_data) do
local yomi_catname = yomi[category_type]
if yomi_catname ~= false then
local yomi_type = yomi.type
local yomi_desc = yomi.link or yomi_catname
if yomi.description then
yomi_desc = yomi_desc .. "; " .. yomi.description
end
local label = {
description = description .. " " .. yomi_desc .. ".",
breadcrumb = yomi_type,
parents = {{name = parent, sort = yomi_catname}},
}
if yomi.onyomi then
local onyomi = handle_onyomi_list(category, category_type, yomi_type)
label.additional = "Categories of terms with " ..
(yomi_type == "on'yomi" and "more" or "other") ..
" specific types of on'yomi readings can be found in the following categories:\n* " .. concat(onyomi, "\n* ")
if yomi_type ~= "on'yomi" then
insert(label.parents, 1, {
name = (category:gsub("{{{yomi_catname}}}", yomi_data.on[category_type])),
sort = yomi_catname
})
end
end
labels[category:gsub("{{{yomi_catname}}}", yomi_catname)] = label
end
end
end
add_yomi_category(
"terms read with {{{yomi_catname}}}",
"reading_category",
"terms by reading pattern",
"{{{langname}}} terms exhibiting"
)
add_yomi_category(
"terms spelled with kanji with {{{yomi_catname}}} readings",
"kanji_category",
"термини по канџи читању",
"{{{langname}}} categories with terms that are spelled with one or more kanji exhibiting"
)
labels["terms with missing yomi"] = {
description = "{{{langname}}} terms where at least one [[Додатак:Јапански речник#yomi|yomi]] is missing from {{tl|{{{langcode}}}-kanjitab}}.",
hidden = true,
can_be_empty = true,
parents = {"приступ сервисирању"},
}
labels["термини по канџи читању"] = {
description = "{{{langname}}} categories with terms grouped with regard to the types of readings of the kanji with which " ..
"they are spelled; broadly, those of Chinese origin, {{ja-r|音|おん}} readings, and those of non-Chinese origin, {{ja-r|訓|くん}} readings.",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["terms spelled with ateji"] = {
topright = "{{wikipedia|Ateji}}",
description = "{{{langname}}} terms containing one or more [[Додатак:Јапански речник#ateji|ateji]] {{mdash}} {{ja-r|当て字|あてじ}} {{mdash}} which are [[kanji]] used to represent sounds rather than meanings (though meaning may have some influence on which kanji are chosen).",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["terms spelled with daiyōji"] = {
description = "Japanese terms spelled using [[Додатак:Јапански речник#daiyouji|daiyōji]], categorized using {{temp|ja-daiyouji}}.",
parents = {"термини по етимологији"},
}
labels["terms spelled with jukujikun"] = {
description = "{{{langname}}} terms containing one or more [[Додатак:Јапански речник#jukujikun|jukujikun]] {{mdash}} {{ja-r|熟%字%訓|じゅく%じ%くん}} {{mdash}} which are [[kanji]] used to represent meanings rather than sounds.",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["terms spelled with jōyō kanji"] = {
topright = "{{wikipedia|Jōyō kanji}}",
description = "{{{langname}}} terms spelled with at least one kanji, where all kanji in the terms are included on the official list of {{ja-r|常%用 漢%字|じょう%よう かん%じ}}.",
additional = "See also [[:Категорија:{{{langname}}} terms spelled with non-jōyō kanji]].",
parents = {{name = "термини по правописној својини", sort = "jōyō"}},
}
labels["terms spelled with non-jōyō kanji"] = {
topright = "{{wikipedia|Jōyō kanji}}",
description = "{{{langname}}} terms spelled with at least one kanji not included in the official list of {{ja-r|常%用 漢%字|じょう%よう かん%じ}}.",
additional = "See also [[:Категорија:{{{langname}}} terms spelled with jōyō kanji]].",
parents = {{name = "термини по правописној својини", sort = "non-jōyō"}},
}
for _, non_joyo_type in ipairs {"hyōgaiji", "jinmeiyō"} do
labels["terms spelled with " .. non_joyo_type .. " kanji"] = {
description = "{{{langname}}} terms spelled with " .. non_joyo_type .. " kanji.",
parents = {{name = "terms spelled with non-jōyō kanji", sort = non_joyo_type}},
}
end
for i = 1, 6 do
local ord = m_numeric.ones_position_ord[i]
labels["термини који се пишу са " .. ord .. " степеном канџи"] = {
description = "{{{langname}}} terms spelled with " .. ord .. " степеном канџи.",
parents = {{name = "terms spelled with jōyō kanji", sort = i}},
}
end
labels["terms spelled with secondary school kanji"] = {
description = "{{{langname}}} terms spelled with secondary school kanji.",
parents = {{name = "terms spelled with jōyō kanji", sort = "secondary school"}},
}
labels["terms with multiple readings"] = {
description = "{{{langname}}} terms with multiple pronunciations (hence multiple [[kana]] spellings).",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["kanji readings by number of morae"] = {
description = "{{{langname}}} categories grouped with regard to the number of morae in their kanji readings.",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["single-kanji terms"] = {
description = "{{{langname}}} terms written as a single kanji.",
parents = {"термини по правописној својини", {name = "character counts", sort = " "}},
}
labels["verbs without transitivity"] = {
description = "{{{langname}}} verbs missing the <code>tr=</code> parameter in the headword template.",
hidden = true,
can_be_empty = true,
parents = {"приступ сервисирању"},
}
labels["yojijukugo"] = {
topright = "{{wikipedia|Yojijukugo}}",
description = "{{{langname}}} four-[[kanji]] compound terms, {{ja-r|四%字 熟%語|よ%じ じゅく%ご}}, with idiomatic meanings; typically derived from Classical Chinese, Buddhist scripture or traditional Japanese proverbs.",
additional = "Compare [[w:Chengyu|chengyu]] in Sinitic languages.",
parents = {"идиоми"},
}
end
function export.add_handlers(handlers, lang, m_lang)
-- FIXME: Only works for 0 through 19.
local word_to_number = {}
for k, v in pairs(m_numeric.ones_position) do
word_to_number[v] = k
end
local periods = {
historical = true,
ancient = true,
}
local function get_period_text_and_reading_type_link(period, reading_type)
if period and not periods[period] then
return nil
end
local period_text = period and period .. " " or nil
-- Allow periods (historical or ancient) by themselves; they will parse as reading types.
if not period and periods[reading_type] then
return nil, reading_type
end
local reading_type_link = "[[Додатак:Јапански речник#" .. reading_type .. "|" .. reading_type .. "]]"
return period_text, reading_type_link
end
local function get_sc(str)
return match(str:gsub("[%s%p]+", ""), "[^" .. Hira:getCharacters() .. "]") and Jpan or Hira
end
local function get_tagged_reading(reading)
return tag_text(reading, lang, get_sc(reading))
end
local function get_reading_link(reading, period, link)
local hist = periods[period]
reading = reading:gsub("[%.%-%s]+", "")
return full_link({
lang = lang,
sc = get_sc(reading),
term = link or reading:gsub("・", ""),
-- If we have okurigana, demarcate furigana.
alt = reading:gsub("^(.-)・", "<span style=\"border-top:1px solid;position:relative;padding:1px;\">%1<span style=\"position:absolute;top:0;bottom:67%%;right:0%%;border-right:1px solid;\"></span></span>"),
tr = kana_to_romaji((reading:gsub("・", ".")), lang:getCode(), nil, {keep_dot = true, hist = hist})
:gsub("^(.-)%.", "<u>%1</u>"),
pos = reading:find("・", 1, true) and get_tagged_reading((reading:gsub("^.-・", "~"))) or nil
}, "term")
end
local function is_on_subtype(reading_type)
return reading_type:find(".on$")
end
insert(handlers, function(data)
local count, plural = data.label:match("^terms written with (.+) Han script character(s?)$")
if count then
-- Make sure 'one' goes with singular and other numbers with plural.
if (count == "one") ~= (plural == "") then
return nil
end
local num = word_to_number[count]
if not num then
return nil
end
return {
description = "{{{langname}}} terms written with " .. count .. " Han script character" .. plural .. " (also known as [[kanji]]).",
breadcrumb = num,
parents = {{name = "character counts", sort = num}},
}
end
end)
insert(handlers, function(data)
local count, plural = data.label:match("^kanji readings with (.+) mora(e?)$")
if count then
-- Make sure 'one' goes with singular and other numbers with plural.
if (count == "one") ~= (plural == "") then
return nil
end
local num = word_to_number[count]
if not num then
return nil
end
return {
description = "{{{langname}}} kanji readings containing " .. count .. " mora" .. plural .. ".",
breadcrumb = num,
parents = {{name = "kanji readings by number of morae", sort = num}},
}
end
end)
insert(handlers, function(data)
local label_pref, period, reading_type, reading = match(data.label, "^(kanji with ([a-z]-) ?([%a']+) reading )" .. kana_capture .. "$")
if not period then
return
end
period = period ~= "" and period or nil
local period_text, reading_type_link = get_period_text_and_reading_type_link(period, reading_type)
if not reading_type_link then
return
end
-- Compute parents.
local parents, breadcrumb = {}
if reading:find("・", 1, true) then
local okurigana = reading:match("・(.*)")
insert(parents, {
name = "kanji with " .. (period_text or "") .. reading_type .. " reading " .. reading:match("(.-)・"),
-- Sort by okurigana, since all coordinate categories will have the same furigana.
sort = (data.lang:makeSortKey(okurigana))
})
breadcrumb = "~" .. okurigana
else
insert(parents, {
name = "kanji by " .. (period_text or "") .. reading_type .. " reading",
sort = (data.lang:makeSortKey(reading))
})
breadcrumb = reading
end
if is_on_subtype(reading_type) then
insert(parents, {name = "kanji with " .. (period_text or "") .. "on reading " .. reading, sort = reading_type})
elseif period_text then
insert(parents, {name = "kanji with " .. period_text .. "reading " .. reading, sort = reading_type})
end
if not period_text then
insert(parents, {name = "kanji read as " .. reading, sort = reading_type})
end
return {
description = "{{{langname}}} [[kanji]] with the " .. (period_text or "") .. reading_type_link .. " reading " ..
get_reading_link(reading, period or reading_type) .. ".",
displaytitle = "{{{langname}}} " .. label_pref .. get_tagged_reading(reading),
breadcrumb = get_tagged_reading(breadcrumb),
parents = parents,
}
end)
insert(handlers, function(data)
local period, reading_type = match(data.label, "^kanji by ([a-z]-) ?([%a']+) reading$")
if not period then
return
end
period = period ~= "" and period or nil
local period_text, reading_type_link = get_period_text_and_reading_type_link(period, reading_type)
if not reading_type_link then
return nil
end
-- Compute parents.
local parents = {
is_on_subtype(reading_type) and {name = "kanji by " .. (period_text or "") .. "on reading", sort = reading_type} or
period_text and {name = "kanji by " .. reading_type .. " reading", sort = period} or
{name = "kanji by reading", sort = reading_type}
}
if period_text then
insert(parents, {name = "kanji by " .. period_text .. "reading", sort = reading_type})
end
-- Compute description.
local description = "{{{langname}}} [[kanji]] categorized by " .. (period_text or "") .. reading_type_link .. " reading."
return {
description = description,
breadcrumb = (period_text or "") .. reading_type,
parents = parents,
}
end)
insert(handlers, function(data)
local label_pref, reading = match(data.label, "^(kanji read as )" .. kana_capture .. "$")
if not reading then
return
end
local params = {
["histconsol"] = {},
}
local args = require("Модул:parameters").process(data.args, params)
local parents, breadcrumb = {}
if reading:find("・", 1, true) then
local okurigana = reading:match("・(.*)")
insert(parents, {
name = "kanji read as " .. reading:match("(.-)・"),
-- Sort by okurigana, since all coordinate categories will have the same furigana.
sort = (data.lang:makeSortKey(okurigana))
})
breadcrumb = "~" .. okurigana
else
insert(parents, {
name = "kanji by reading",
sort = (data.lang:makeSortKey(reading))
})
breadcrumb = reading
end
local addl
local period_text
if args.histconsol then
period_text = "historical"
addl = ("This is a [[Wikipedia:Historical kana orthography|historical]] [[Wikipedia:Kanazukai|reading]], now " ..
"consolidated with the [[Wikipedia:Modern kana usage|modern reading]] of " ..
get_reading_link(args.histconsol, nil, ("Категорија:Japanese kanji read as %s"):format(args.histconsol)) .. ".")
end
return {
description = "{{{langname}}} [[kanji]] read as " .. get_reading_link(reading, period_text) .. ".",
additional = addl,
displaytitle = "{{{langname}}} " .. label_pref .. get_tagged_reading(reading),
breadcrumb = get_tagged_reading(breadcrumb),
parents = parents,
}, true
end)
insert(handlers, function(data)
local label_pref, reading = match(data.label, "^(terms spelled with kanji read as )" .. kana_capture .. "$")
if reading then
-- Compute parents.
local sort_key = (data.lang:makeSortKey(reading))
local mora_count = m_lang.count_morae(reading)
local mora_count_words = m_numeric.spell_number(tostring(mora_count))
local parents = {
{name = "terms by kanji readings", sort = sort_key},
{name = "kanji readings with " .. mora_count_words .. " mora" .. (mora_count > 1 and "e" or ""), sort = sort_key},
{name = "kanji read as " .. reading, sort = " "},
}
local tagged_reading = get_tagged_reading(reading)
return {
description = "{{{langname}}} terms that contain kanji that exhibit a reading of " .. get_reading_link(reading) ..
" in those terms prior to any sound changes.",
displaytitle = "{{{langname}}} " .. label_pref .. tagged_reading,
breadcrumb = tagged_reading,
parents = parents,
}
end
end)
insert(handlers, function(data)
local kanji, reading = match(data.label, "^terms spelled with (.) read as " .. kana_capture .. "$")
if not kanji then
return nil
end
local params = {
[1] = {list = true},
}
local args = require("Модул:parameters").process(data.args, params)
if #args[1] == 0 then
error("For categories of the form \"" .. data.lang:getCanonicalName() ..
" terms spelled with KANJI read as READING\", at least one reading type (e.g. {{code|kun}} or {{code|on}}) must be specified using 1=, 2=, 3=, etc.")
end
local yomi_types, parents = {}, {}
for _, yomi, category in ipairs(args[1]) do
local yomi_data = yomi_data[yomi]
if not yomi_data then
error("The yomi type \"" .. yomi .. "\" is not recognized.")
end
category = yomi_data.kanji_category
if not category then
error("The yomi type \"" .. yomi .. "\" is not valid for this type of category.")
end
insert(yomi_types, yomi_data.link)
insert(parents, {
name = "terms spelled with kanji with " .. category .. " readings",
sort = (data.lang:makeSortKey(reading))
})
end
insert(parents, 1, {name = "terms spelled with " .. kanji, sort = (data.lang:makeSortKey(reading))})
insert(parents, 2, {name = "terms spelled with kanji read as " .. reading, sort = Hani_sort(kanji)})
yomi_types = (#yomi_types > 1 and "one of " or "") .. "its " ..
require("Модул:table").serialCommaJoin(yomi_types, {conj = "or"}) ..
" reading" .. (#yomi_types > 1 and "s" or "")
local tagged_kanji = get_tagged_reading(kanji)
local tagged_reading = get_tagged_reading(reading)
return {
description = "{{{langname}}} terms spelled with {{l|{{{langcode}}}|" .. kanji .. "}} with " ..
yomi_types .. " of " .. get_reading_link(reading) .. ".",
displaytitle = "{{{langname}}} термини који се пишу са " .. tagged_kanji .. " читани као " .. tagged_reading,
breadcrumb = "читан као " .. tagged_reading,
parents = parents,
}, true
end)
insert(handlers, function(data)
local kanji, daiyoji = match(data.label, "^terms with (.) replaced by daiyōji (.)$")
if not kanji then
return nil
end
local params = {
["sort"] = {},
}
local args = require("Модул:parameters").process(data.args, params)
if not args.sort then
error("For categories of the form \"" .. data.lang:getCanonicalName() ..
" terms with KANJI replaced by daiyōji DAIYOJI\", the sort key must be specified using sort=")
end
local tagged_kanji = get_tagged_reading(kanji)
local tagged_daiyoji = get_tagged_reading(daiyoji)
return {
description = "{{{langname}}} terms with {{l|{{{langcode}}}|" .. kanji .. "}} replaced by [[Додатак:Јапански речник#daiyouji|daiyōji]] {{l|{{{langcode}}}|" .. daiyoji .. "}}.",
displaytitle = "{{{langname}}} terms with " .. tagged_kanji .. " replaced by daiyōji " .. tagged_daiyoji,
breadcrumb = tagged_kanji .. " replaced by daiyōji " .. tagged_daiyoji,
parents = {{name = "terms spelled with daiyōji", sort = args.sort}},
}, true
end)
end
return export