Skip to content

Commit 20e4da3

Browse files
committed
分出去成為 parse_interwiki_link(),有必要時才執行以增加效率。
1 parent 04bf314 commit 20e4da3

4 files changed

Lines changed: 110 additions & 47 deletions

File tree

_test suite/test.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6042,6 +6042,17 @@ function test_wiki() {
60426042
assert([true, parsed.is_link], 'zhwiki: .is_link #8-1');
60436043

60446044

6045+
wikitext = '[[w:en:title]]';
6046+
parsed = CeL.wiki.parse(wikitext, CeL.wiki.add_session_to_options(zhwiki));
6047+
assert(['w', CeL.wiki.parse.interwiki_link(parsed, CeL.wiki.add_session_to_options(zhwiki)).interwiki_prefix], 'zhwiki: parse.interwiki_link() #1-1');
6048+
assert(['en', CeL.wiki.parse.interwiki_link(parsed, CeL.wiki.add_session_to_options(zhwiki)).interlanguage_prefix], 'zhwiki: parse.interwiki_link() #1-2');
6049+
6050+
wikitext = '[[:en:w:title]]';
6051+
parsed = CeL.wiki.parse(wikitext, CeL.wiki.add_session_to_options(zhwiki));
6052+
assert(['en', CeL.wiki.parse.interwiki_link(parsed, CeL.wiki.add_session_to_options(zhwiki)).interwiki_prefix], 'zhwiki: parse.interwiki_link() #2-1');
6053+
assert(['en', CeL.wiki.parse.interwiki_link(parsed, CeL.wiki.add_session_to_options(zhwiki)).interlanguage_prefix], 'zhwiki: parse.interwiki_link() #2-2');
6054+
6055+
60456056
wikitext = "{{NoteTA|G1=Unit|zh-cn:巴颜喀拉山脉; zh-hk:巴顏喀拉山脈; zh-tw:巴顏喀喇山}}";
60466057
parsed = CeL.wiki.parser(wikitext, CeL.wiki.add_session_to_options(zhwiki)).parse();
60476058
parsed.each('tempLate:NoteTA', function (token) {

application/net/wiki/parser/misc.js

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,95 @@ function module_code(library_namespace) {
4545

4646
// --------------------------------------------------------------------------------------------
4747

48+
var PATTERN_interwiki_title = /^\s*([\w\-]+)\s*:\s*([^\s:].+)$/;
49+
50+
/**
51+
* 解析 interwiki link,獲得 interwiki prefix、interwiki name、interwiki url 等資訊。
52+
*
53+
* @param {Array|String}link_title
54+
* {Array}link token or {String}page title
55+
* @param {Object}[options]
56+
* 附加參數/設定選擇性/特殊功能與選項
57+
*
58+
* @returns { interwiki_prefix, interwiki_name, interwiki_url,
59+
* interlanguage_prefix, interlanguage_title }
60+
*/
61+
function parse_interwiki_link(link_title, options) {
62+
var interwiki_data = Object.create(null);
63+
64+
var session = wiki_API.session_of_options(options);
65+
66+
var interwikimap_mapper = session && session.latest_site_configurations
67+
&& session.latest_site_configurations.interwikimap
68+
&& session.latest_site_configurations.interwikimap.mapper;
69+
70+
var page_title
71+
// e.g., {Array}link token
72+
= link_title.page_title
73+
// e.g., {String}page title
74+
|| link_title.toString().replace(/<\!--([\s\S]*?)-->/g, '');
75+
76+
var matched = interwikimap_mapper
77+
&& page_title.match(PATTERN_interwiki_title);
78+
79+
if (matched) {
80+
var namespace = matched[1].trim();
81+
var map_data = interwikimap_mapper[namespace];
82+
if (map_data) {
83+
// https://en.wikipedia.org/wiki/Help:Interwiki_linking#Prefix_codes_for_linking_to_Wikimedia_sister_projects
84+
// https://www.mediawiki.org/wiki/Manual:$wgExtraInterlanguageLinkPrefixes
85+
interwiki_data.interwiki_prefix = namespace;
86+
interwiki_data.interwiki_name = wiki_API.normalize_title(
87+
// @see parse_wikilink() @
88+
// CeL.application.net.wiki.parser.wikitext
89+
matched[2], Object.assign({
90+
// preserve_head_colon : true,
91+
no_convert_interface_message : true
92+
}, options));
93+
interwiki_data.interwiki_url = map_data.url.replace(
94+
// TODO: should use `new URI()`
95+
/\$1/, encodeURIComponent(matched[2].replace(/ /g, '_')));
96+
}
97+
}
98+
99+
var PATTERN_language_startup = session
100+
// session === wiki_API?
101+
&& session.configurations
102+
&& session.configurations.PATTERN_language_startup;
103+
104+
if (PATTERN_language_startup) {
105+
matched = interwiki_data.interwiki_name
106+
// e.g., [[w:zh:title]]
107+
&& interwiki_data.interwiki_name.match(PATTERN_language_startup)
108+
// e.g., [[:zh:w:title]]
109+
|| matched;
110+
if (matched && matched[2]) {
111+
// https://en.wikipedia.org/wiki/Help:Interlanguage_links#Inline_links_(links_in_the_text_of_the_article)
112+
// https://www.mediawiki.org/wiki/Manual:Interwiki#Interwiki_links_to_other_languages
113+
interwiki_data.interlanguage_prefix = matched[1];
114+
interwiki_data.interlanguage_title = wiki_API.normalize_title(
115+
// @see parse_wikilink() @
116+
// CeL.application.net.wiki.parser.wikitext
117+
matched[2], Object.assign({
118+
// preserve_head_colon : true,
119+
no_convert_interface_message : true
120+
}, options));
121+
// interwiki_data.is_interlanguage_link = true;
122+
123+
} else {
124+
// e.g., [[BBC]], [[ja]]
125+
}
126+
}
127+
128+
// TODO: [[w:en:title]], [[:en:w:title]]:
129+
// interwiki_data.wiki_family_prefix
130+
// https://en.wikipedia.org/wiki/Wikipedia:Wikimedia_sister_projects#How_to_link
131+
132+
return interwiki_data;
133+
}
134+
135+
// --------------------------------------------------------------------------------------------
136+
48137
// @see Nullish coalescing operator (??)
49138
// exclude NaN, null, undefined
50139
function is_valid_parameters_value(value) {
@@ -2719,6 +2808,8 @@ function module_code(library_namespace) {
27192808
// CeL.wiki.parse.*(wikitext) 僅處理單一 token,傳回 parse 過的 data。
27202809
// TODO: 統合於 CeL.wiki.parser 之中。
27212810
Object.assign(wiki_API.parse, {
2811+
interwiki_link : parse_interwiki_link,
2812+
27222813
template : parse_template,
27232814
set_template_object_parameters : set_template_object_parameters,
27242815
template_object_to_wikitext : template_object_to_wikitext,

application/net/wiki/parser/wikitext.js

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1954,6 +1954,7 @@ function module_code(library_namespace) {
19541954

19551955
// --------------------------------------------------------------------
19561956

1957+
// @inner
19571958
function is_invalid_page_name(page_name) {
19581959
return page_name.is_link
19591960

@@ -2517,54 +2518,12 @@ function module_code(library_namespace) {
25172518
}
25182519

25192520
} else {
2520-
if (interwikimap_mapper
2521-
//
2522-
&& (matched = parameters.page_title.match(/^(\w+):(.+)$/))) {
2523-
matched[1] = matched[1].trim();
2524-
matched.map = interwikimap_mapper[matched[1]];
2525-
if (matched.map) {
2526-
// https://en.wikipedia.org/wiki/Help:Interwiki_linking#Prefix_codes_for_linking_to_Wikimedia_sister_projects
2527-
// https://www.mediawiki.org/wiki/Manual:$wgExtraInterlanguageLinkPrefixes
2528-
parameters.interwiki_prefix = matched[1];
2529-
parameters.interwiki_name = matched[2];
2530-
parameters.interwiki_url = matched.map.url.replace(
2531-
// TODO: should use `new URI()`
2532-
/\$1/, encodeURIComponent(matched[2].replace(/ /g,
2533-
'_')));
2534-
}
2535-
}
2536-
25372521
matched = page_name.toString().replace(
2538-
/<\!--([\s\S]*)-->/g, '');
2522+
/<\!--([\s\S]*?)-->/g, '');
25392523
// .is_plain_link
25402524
parameters.is_link = !PATTERN_language_startup
25412525
// || /^\s*:/.test(matched)
25422526
|| !PATTERN_language_startup.test(matched);
2543-
2544-
if (PATTERN_language_startup) {
2545-
matched = /^\w+: *[^\s:]/
2546-
.test(parameters.interwiki_name)
2547-
// e.g., [[w:zh:title]]
2548-
&& parameters.interwiki_name
2549-
.match(PATTERN_language_startup)
2550-
// e.g., [[:zh:w:title]]
2551-
|| parameters.page_title
2552-
.match(PATTERN_language_startup);
2553-
if (matched && matched[2]) {
2554-
// https://en.wikipedia.org/wiki/Help:Interlanguage_links#Inline_links_(links_in_the_text_of_the_article)
2555-
// https://www.mediawiki.org/wiki/Manual:Interwiki#Interwiki_links_to_other_languages
2556-
parameters.interlanguage_prefix = matched[1];
2557-
parameters.interlanguage_title = matched[2];
2558-
// parameters.is_interlanguage_link = true;
2559-
2560-
} else {
2561-
// e.g., [[BBC]], [[ja]]
2562-
}
2563-
}
2564-
2565-
// TODO: [[w:en:title]], [[:en:w:title]]:
2566-
// parameters.wiki_family_prefix
2567-
// https://en.wikipedia.org/wiki/Wikipedia:Wikimedia_sister_projects#How_to_link
25682527
}
25692528

25702529
if (false) {
@@ -2674,10 +2633,6 @@ function module_code(library_namespace) {
26742633
&& session.configurations && session.configurations.extensiontag_hash
26752634
|| wiki_extensiontags;
26762635

2677-
var interwikimap_mapper = session && session.latest_site_configurations
2678-
&& session.latest_site_configurations.interwikimap
2679-
&& session.latest_site_configurations.interwikimap.mapper;
2680-
26812636
var PATTERN_file_prefix;
26822637
if (session
26832638
// session === wiki_API?

extension/zh_conversion/OpenCC/additional.to_TW.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8692,6 +8692,12 @@ a:色气 ~色気
86928692
// 個別作品解析錯誤,通常是僅在此作品中出現,幾乎不會在其他地方看到的文字組合,例如角色人名。
86938693

86948694

8695+
// 《唐史并不如烟》 知道他的名字叫杨思勖, (~楊思勗<VOB>v:叫 v:知道+r:他+u:的+n:名字+v:叫+nh:杨思勖+wp:,) 單純 zh_conversion 轉換過程: 杨→楊
8696+
杨思勖 楊思勗
8697+
// 《唐史并不如烟》 >这个人叫宁嘉勖, (~甯嘉勗<VOB>v:叫 wp:>+r:这个+n:人+v:叫+nh:宁嘉勖+wp:,) 單純 zh_conversion 轉換過程: 宁→寧
8698+
宁嘉勖 甯嘉勗
8699+
8700+
86958701
// 《宋朝游历指南》 庚子科状元王岩叟。 (nz:庚子科+n:状元+nh:王岩叟+wp:。)
86968702
// 《中国历史那些事儿系列套装》 怎么能和王岩叟相比? (~王巖叟<POB>p:和 r:怎么+v:能+p:和+nh:王岩叟+v:相比+wp:?)
86978703
王岩叟 王巖叟

0 commit comments

Comments
 (0)