Skip to content

Commit 7244ced

Browse files
committed
feat: add support for interwiki links in translatable wikitext conversion
1 parent 601003c commit 7244ced

2 files changed

Lines changed: 45 additions & 0 deletions

File tree

app.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,20 @@ def process_double_brackets(text, tvar_id=0):
463463
file_aliases = ['File:', 'file:', 'Image:', 'image:']
464464
skip_namespaces = category_aliases + file_aliases + ['Special:', 'User:', 'User talk:']
465465

466+
# Known internal MediaWiki namespace prefixes — anything else with a colon is an interwiki link
467+
internal_namespaces = {
468+
'Talk:', 'talk:', 'User:', 'user:', 'User talk:', 'user talk:',
469+
'Project:', 'project:', 'Project talk:', 'project talk:',
470+
'File:', 'file:', 'File talk:', 'file talk:',
471+
'MediaWiki:', 'mediawiki:', 'MediaWiki talk:', 'mediawiki talk:',
472+
'Template:', 'template:', 'Template talk:', 'template talk:',
473+
'Help:', 'help:', 'Help talk:', 'help talk:',
474+
'Category:', 'category:', 'Category talk:', 'category talk:',
475+
'Special:', 'special:', 'Media:', 'media:',
476+
'Image:', 'image:', 'Image talk:', 'image talk:',
477+
'Cat:', 'cat:',
478+
}
479+
466480
ns = None
467481
if ':' in parts[0]:
468482
ns = parts[0].split(':', 1)[0] + ':'
@@ -474,6 +488,11 @@ def process_double_brackets(text, tvar_id=0):
474488
return _process_file(text)
475489
if ns in skip_namespaces:
476490
return text, double_brackets_types.special if ns == 'Special:' else double_brackets_types.wikilink
491+
# Interwiki links: colon-prefixed but not a known internal MediaWiki namespace
492+
if ns is not None and ns not in internal_namespaces:
493+
link_target = capitalise_first_letter(parts[0])
494+
display_text = parts[0] if len(parts) == 1 else parts[1]
495+
return f'[[<tvar name={tvar_id}>{link_target}</tvar>|{display_text}]]', double_brackets_types.wikilink
477496
if len(parts) == 1:
478497
return f'[[<tvar name={tvar_id}>Special:MyLanguage</tvar>/{capitalise_first_letter(parts[0])}|{parts[0]}]]', double_brackets_types.wikilink
479498
if len(parts) == 2:

tests.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,5 +208,31 @@ def test_existing_translate_tags(self):
208208
"<translate>This is already translated.</translate>"
209209
)
210210

211+
def test_interwiki_phab_link(self):
212+
self.assertEqual(
213+
convert_to_translatable_wikitext("[[phab:T2001]]"),
214+
"<translate>[[<tvar name=0>Phab:T2001</tvar>|phab:T2001]]</translate>"
215+
)
216+
217+
def test_interwiki_meta_link(self):
218+
self.assertEqual(
219+
convert_to_translatable_wikitext("[[m:Main Page]]"),
220+
"<translate>[[<tvar name=0>M:Main Page</tvar>|m:Main Page]]</translate>"
221+
)
222+
223+
def test_interwiki_link_with_label(self):
224+
self.assertEqual(
225+
convert_to_translatable_wikitext("[[phab:T2001|T2001 ticket]]"),
226+
"<translate>[[<tvar name=0>Phab:T2001</tvar>|T2001 ticket]]</translate>"
227+
)
228+
229+
def test_interwiki_links_inline(self):
230+
self.assertEqual(
231+
convert_to_translatable_wikitext(
232+
"Example phab: [[phab:T2001]]\n\nExample meta: [[m:Main Page]]"
233+
),
234+
"<translate>Example phab: [[<tvar name=0>Phab:T2001</tvar>|phab:T2001]]\n\nExample meta: [[<tvar name=1>M:Main Page</tvar>|m:Main Page]]</translate>"
235+
)
236+
211237
if __name__ == '__main__':
212238
unittest.main(exit=False, failfast=True)

0 commit comments

Comments
 (0)