@@ -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 ,
0 commit comments