Skip to content

Commit 1c5cb62

Browse files
committed
Simplify code and move download and extract to pandas_web
1 parent de291cd commit 1c5cb62

File tree

5 files changed

+119
-99
lines changed

5 files changed

+119
-99
lines changed

web/pandas/_templates/layout.html

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,82 @@
1515
href="{{ base_url }}{{ stylesheet }}">
1616
{% endfor %}
1717
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.min.css">
18-
<meta id="languages" data-lang="{{ languages }}">
19-
<script src="{{ base_url }}static/js/language_switcher.js"></script>
18+
<script type="text/javascript">
19+
window.addEventListener("DOMContentLoaded", function() {
20+
var absBaseUrl = document.baseURI;
21+
var baseUrl = location.protocol + "//" + location.hostname
22+
if (location.port) {
23+
baseUrl = baseUrl + ":" + location.port
24+
}
25+
var currentLanguage = document.documentElement.lang;
26+
var languages = [
27+
{% for lang, name in translations["languages"].items() -%}
28+
"{{ lang }}",
29+
{% endfor -%}
30+
]
31+
var languageNames = {
32+
{% for lang, name in translations["languages"].items() -%}
33+
{{ lang }}: '{{ name }}',
34+
{% endfor -%}
35+
}
36+
37+
// Handle preview URLs on github
38+
// If preview URL changes, this regex will need to be updated
39+
var re = /preview\/pandas-dev\/pandas\/(?<pr>[0-9]*)\//g;
40+
var previewUrl = '';
41+
for (const match of absBaseUrl.matchAll(re)) {
42+
previewUrl = `/preview/pandas-dev/pandas/${match.groups.pr}`;
43+
}
44+
var pathName = location.pathname.replace(previewUrl, '')
45+
46+
// Create dropdown menu
47+
function makeDropdown(options) {
48+
var dropdown = document.createElement("li");
49+
dropdown.classList.add("nav-item");
50+
dropdown.classList.add("dropdown");
51+
52+
var link = document.createElement("a");
53+
link.classList.add("nav-link");
54+
link.classList.add("dropdown-toggle");
55+
link.setAttribute("data-bs-toggle", "dropdown");
56+
link.setAttribute("href", "#");
57+
link.setAttribute("role", "button");
58+
link.setAttribute("aria-haspopup", "true");
59+
link.setAttribute("aria-expanded", "false");
60+
link.textContent = languageNames[currentLanguage];
61+
62+
var dropdownMenu = document.createElement("div");
63+
dropdownMenu.classList.add("dropdown-menu");
64+
65+
options.forEach(function(i) {
66+
var dropdownItem = document.createElement("a");
67+
dropdownItem.classList.add("dropdown-item");
68+
dropdownItem.textContent = languageNames[i] || i.toUpperCase();
69+
dropdownItem.setAttribute("href", "#");
70+
dropdownItem.addEventListener("click", function() {
71+
var urlLanguage = '';
72+
if (i !== 'en') {
73+
urlLanguage = '/' + i;
74+
}
75+
pathName = pathName.replace('/' + currentLanguage + '/', '/')
76+
var newUrl = baseUrl + previewUrl + urlLanguage + pathName
77+
window.location.href = newUrl;
78+
});
79+
dropdownMenu.appendChild(dropdownItem);
80+
});
81+
82+
dropdown.appendChild(link);
83+
dropdown.appendChild(dropdownMenu);
84+
return dropdown;
85+
}
86+
87+
var container = document.getElementById("language-switcher-container");
88+
if (container) {
89+
var dropdown = makeDropdown(languages);
90+
container.appendChild(dropdown);
91+
}
92+
});
93+
</script>
2094
</head>
2195
<body>
2296
<header>

web/pandas/config.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,5 +177,8 @@ translations:
177177
source_path: pandas-translations-main/web/pandas/
178178
default_language: 'en'
179179
default_prefix: ''
180-
ignore:
181-
- docs/
180+
languages:
181+
en: English
182+
es: Español
183+
pt: Português
184+
# fr: Français

web/pandas/navbar.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ navbar:
1717
target: getting_started.html
1818
- name: "Documentation"
1919
target: docs/
20+
translated: false
2021
- name: "Community"
2122
target:
2223
- name: "Blog"

web/pandas/static/js/language_switcher.js

Lines changed: 0 additions & 71 deletions
This file was deleted.

web/pandas_web.py

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import collections
2929
import datetime
3030
import importlib
31+
import io
3132
import itertools
3233
import json
3334
import operator
@@ -36,6 +37,7 @@
3637
import re
3738
import shutil
3839
import sys
40+
import tarfile
3941
import time
4042
import typing
4143

@@ -74,17 +76,16 @@ def current_year(context: dict) -> dict:
7476
return context
7577

7678
@staticmethod
77-
def navbar_add_info(context: dict, skip: bool = True) -> dict:
79+
def navbar_add_info(context: dict) -> dict:
7880
"""
7981
Items in the main navigation bar can be direct links, or dropdowns with
8082
subitems. This context preprocessor adds a boolean field
8183
``has_subitems`` that tells which one of them every element is. It
8284
also adds a ``slug`` field to be used as a CSS id.
8385
"""
84-
ignore = context["translations"]["ignore"]
85-
for language in context["languages"]:
86+
for language in context["translations"]["languages"]:
8687
for i, item in enumerate(context["navbar"][language]):
87-
if item["target"] in ignore:
88+
if not item.get("translated", True):
8889
item["target"] = f"../{item['target']}"
8990

9091
context["navbar"][language][i] = dict(
@@ -391,9 +392,7 @@ def get_callable(obj_as_str: str) -> object:
391392
return obj
392393

393394

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:
397396
"""
398397
Load the config yaml as the base context, and enrich it with the
399398
information added by the context preprocessors defined in the file.
@@ -403,19 +402,19 @@ def get_context(
403402

404403
context["source_path"] = os.path.dirname(config_fname)
405404

406-
navbar = {}
407-
context["languages"] = languages
408405
default_language = context["translations"]["default_language"]
409406
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"]:
411413
prefix = default_prefix if language == default_language else language
412414
navbar_path = os.path.join(context["source_path"], prefix, navbar_fname)
413-
414415
with open(navbar_path, encoding="utf-8") as f:
415416
navbar_lang = yaml.safe_load(f)
416-
417417
navbar[language] = navbar_lang["navbar"]
418-
419418
context["navbar"] = navbar
420419

421420
context.update(kwargs)
@@ -453,6 +452,28 @@ def extend_base_template(content: str, base_template: str) -> str:
453452
return result
454453

455454

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+
456477
def main(
457478
source_path: str,
458479
target_path: str,
@@ -463,24 +484,14 @@ def main(
463484
For ``.md`` and ``.html`` files, render them with the context
464485
before copying them. ``.md`` files are transformed to HTML.
465486
"""
466-
base_folder = os.path.dirname(__file__)
467-
468487
shutil.rmtree(target_path, ignore_errors=True)
469488
os.makedirs(target_path, exist_ok=True)
470489

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-
478490
sys.stderr.write("Generating context...\n")
479491
context = get_context(
480492
os.path.join(source_path, "config.yml"),
481493
navbar_fname="navbar.yml",
482494
target_path=target_path,
483-
languages=languages,
484495
)
485496
sys.stderr.write("Context generated\n")
486497

@@ -490,7 +501,9 @@ def main(
490501
default_language = context["translations"]["default_language"]
491502
for fname in get_source_files(source_path):
492503
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"]:
494507
if fname.startswith(language + "/"):
495508
selected_language = language
496509
break

0 commit comments

Comments
 (0)