28
28
import collections
29
29
import datetime
30
30
import importlib
31
+ import io
31
32
import itertools
32
33
import json
33
34
import operator
36
37
import re
37
38
import shutil
38
39
import sys
40
+ import tarfile
39
41
import time
40
42
import typing
41
43
@@ -74,17 +76,16 @@ def current_year(context: dict) -> dict:
74
76
return context
75
77
76
78
@staticmethod
77
- def navbar_add_info (context : dict , skip : bool = True ) -> dict :
79
+ def navbar_add_info (context : dict ) -> dict :
78
80
"""
79
81
Items in the main navigation bar can be direct links, or dropdowns with
80
82
subitems. This context preprocessor adds a boolean field
81
83
``has_subitems`` that tells which one of them every element is. It
82
84
also adds a ``slug`` field to be used as a CSS id.
83
85
"""
84
- ignore = context ["translations" ]["ignore" ]
85
- for language in context ["languages" ]:
86
+ for language in context ["translations" ]["languages" ]:
86
87
for i , item in enumerate (context ["navbar" ][language ]):
87
- if item [ "target" ] in ignore :
88
+ if not item . get ( "translated" , True ) :
88
89
item ["target" ] = f"../{ item ['target' ]} "
89
90
90
91
context ["navbar" ][language ][i ] = dict (
@@ -391,9 +392,7 @@ def get_callable(obj_as_str: str) -> object:
391
392
return obj
392
393
393
394
394
- def get_context (
395
- config_fname : str , navbar_fname : str , languages : list [str ], ** kwargs : dict
396
- ) -> dict :
395
+ def get_context (config_fname : str , navbar_fname : str , ** kwargs : dict ) -> dict :
397
396
"""
398
397
Load the config yaml as the base context, and enrich it with the
399
398
information added by the context preprocessors defined in the file.
@@ -403,19 +402,19 @@ def get_context(
403
402
404
403
context ["source_path" ] = os .path .dirname (config_fname )
405
404
406
- navbar = {}
407
- context ["languages" ] = languages
408
405
default_language = context ["translations" ]["default_language" ]
409
406
default_prefix = context ["translations" ]["default_prefix" ]
410
- for language in languages :
407
+ translated_languages = context ["translations" ]["languages" ].copy ()
408
+ translated_languages .pop (default_language )
409
+ context ["translated_languages" ] = translated_languages
410
+ download_and_extract_translations (context )
411
+ navbar = {}
412
+ for language in context ["translations" ]["languages" ]:
411
413
prefix = default_prefix if language == default_language else language
412
414
navbar_path = os .path .join (context ["source_path" ], prefix , navbar_fname )
413
-
414
415
with open (navbar_path , encoding = "utf-8" ) as f :
415
416
navbar_lang = yaml .safe_load (f )
416
-
417
417
navbar [language ] = navbar_lang ["navbar" ]
418
-
419
418
context ["navbar" ] = navbar
420
419
421
420
context .update (kwargs )
@@ -453,6 +452,28 @@ def extend_base_template(content: str, base_template: str) -> str:
453
452
return result
454
453
455
454
455
+ def download_and_extract_translations (context : dict ) -> None :
456
+ """
457
+ Download the translations from the GitHub repository and extract them.
458
+ """
459
+ base_folder = os .path .dirname (__file__ )
460
+ extract_path = os .path .join (base_folder , context ["translations" ]["folder" ])
461
+ shutil .rmtree (extract_path , ignore_errors = True )
462
+ response = requests .get (context ["translations" ]["url" ])
463
+ if response .status_code == 200 :
464
+ doc = io .BytesIO (response .content )
465
+ with tarfile .open (None , "r:gz" , doc ) as tar :
466
+ tar .extractall (os .path .join (base_folder , context ["translations" ]["folder" ]))
467
+ else :
468
+ raise Exception (f"Failed to download translations: { response .status_code } " )
469
+ for lang in context ["translated_languages" ]:
470
+ shutil .rmtree (os .path .join (context ["source_path" ], lang ), ignore_errors = True )
471
+ shutil .move (
472
+ os .path .join (extract_path , context ["translations" ]["source_path" ], lang ),
473
+ os .path .join (base_folder , "pandas" , lang ),
474
+ )
475
+
476
+
456
477
def main (
457
478
source_path : str ,
458
479
target_path : str ,
@@ -463,24 +484,14 @@ def main(
463
484
For ``.md`` and ``.html`` files, render them with the context
464
485
before copying them. ``.md`` files are transformed to HTML.
465
486
"""
466
- base_folder = os .path .dirname (__file__ )
467
-
468
487
shutil .rmtree (target_path , ignore_errors = True )
469
488
os .makedirs (target_path , exist_ok = True )
470
489
471
- # Handle translations
472
- sys .path .append (base_folder )
473
- trans = importlib .import_module ("pandas_translations" )
474
- translated_languages , languages = trans .process_translations (
475
- "config.yml" , source_path
476
- )
477
-
478
490
sys .stderr .write ("Generating context...\n " )
479
491
context = get_context (
480
492
os .path .join (source_path , "config.yml" ),
481
493
navbar_fname = "navbar.yml" ,
482
494
target_path = target_path ,
483
- languages = languages ,
484
495
)
485
496
sys .stderr .write ("Context generated\n " )
486
497
@@ -490,7 +501,9 @@ def main(
490
501
default_language = context ["translations" ]["default_language" ]
491
502
for fname in get_source_files (source_path ):
492
503
selected_language = context ["translations" ]["default_language" ]
493
- for language in translated_languages :
504
+ translated_languages = list (context ["translations" ]["languages" ].keys ())
505
+ translated_languages .remove (default_language )
506
+ for language in context ["translated_languages" ]:
494
507
if fname .startswith (language + "/" ):
495
508
selected_language = language
496
509
break
0 commit comments