Skip to content

Commit

Permalink
Update configuration for GitHub Pages deployment
Browse files Browse the repository at this point in the history
  • Loading branch information
danila committed Sep 24, 2024
1 parent e41076e commit 0d93467
Show file tree
Hide file tree
Showing 5 changed files with 146 additions and 27 deletions.
67 changes: 67 additions & 0 deletions download_flags.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import os
import time
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

flags = [
{"letter": "~", "name": "Code Pennant", "url": "https://upload.wikimedia.org/wikipedia/commons/5/5c/ICS_Answer.svg"},
{"letter": "A", "name": "Alpha", "url": "https://upload.wikimedia.org/wikipedia/commons/c/c8/Alfa_flag.svg"},
{"letter": "B", "name": "Bravo", "url": "https://upload.wikimedia.org/wikipedia/commons/a/aa/Bravo_flag.svg"},
{"letter": "C", "name": "Charlie", "url": "https://upload.wikimedia.org/wikipedia/commons/b/b9/Charlie_flag.svg"},
{"letter": "D", "name": "Delta", "url": "https://upload.wikimedia.org/wikipedia/commons/8/8a/Delta_flag.svg"},
{"letter": "E", "name": "Echo", "url": "https://upload.wikimedia.org/wikipedia/commons/f/f2/Echo_flag.svg"},
{"letter": "F", "name": "Foxtrot", "url": "https://upload.wikimedia.org/wikipedia/commons/3/3f/Foxtrot_flag.svg"},
{"letter": "G", "name": "Golf", "url": "https://upload.wikimedia.org/wikipedia/commons/2/27/Golf-flag.svg"},
{"letter": "H", "name": "Hotel", "url": "https://upload.wikimedia.org/wikipedia/commons/d/da/Hotel_flag.svg"},
{"letter": "I", "name": "India", "url": "https://upload.wikimedia.org/wikipedia/commons/3/36/India_flag.svg"},
{"letter": "J", "name": "Juliet", "url": "https://upload.wikimedia.org/wikipedia/commons/7/7b/Juliett_flag.svg"},
{"letter": "K", "name": "Kilo", "url": "https://upload.wikimedia.org/wikipedia/commons/c/c1/Kilo_flag.svg"},
{"letter": "L", "name": "Lima", "url": "https://upload.wikimedia.org/wikipedia/commons/0/08/Lima_flag.svg"},
{"letter": "M", "name": "Mike", "url": "https://upload.wikimedia.org/wikipedia/commons/d/dc/Mike_flag.svg"},
{"letter": "N", "name": "November", "url": "https://upload.wikimedia.org/wikipedia/commons/6/68/November_flag.svg"},
{"letter": "O", "name": "Oscar", "url": "https://upload.wikimedia.org/wikipedia/commons/a/ac/Oscar_flag.svg"},
{"letter": "P", "name": "Papa", "url": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Papa_flag.svg"},
{"letter": "Q", "name": "Quebec", "url": "https://upload.wikimedia.org/wikipedia/commons/6/68/Quebec_flag.svg"},
{"letter": "R", "name": "Romeo", "url": "https://upload.wikimedia.org/wikipedia/commons/0/09/Romeo-flag.svg"},
{"letter": "S", "name": "Sierra", "url": "https://upload.wikimedia.org/wikipedia/commons/2/2c/Sierra_flag.svg"},
{"letter": "T", "name": "Tango", "url": "https://upload.wikimedia.org/wikipedia/commons/3/37/Tango_flag.svg"},
{"letter": "U", "name": "Uniform", "url": "https://upload.wikimedia.org/wikipedia/commons/5/5e/Uniform_flag.svg"},
{"letter": "V", "name": "Victor", "url": "https://upload.wikimedia.org/wikipedia/commons/4/41/Victor-flag.svg"},
{"letter": "W", "name": "Whiskey", "url": "https://upload.wikimedia.org/wikipedia/commons/9/91/Whiskey_flag.svg"},
{"letter": "X", "name": "X-Ray", "url": "https://upload.wikimedia.org/wikipedia/commons/1/14/Xray_flag.svg"},
{"letter": "Y", "name": "Yankee", "url": "https://upload.wikimedia.org/wikipedia/commons/1/1d/Yankee-flag.svg"},
{"letter": "Z", "name": "Zulu", "url": "https://upload.wikimedia.org/wikipedia/commons/3/30/Zulu_flag.svg"},
]

def download_image(url, file_name, max_retries=5):
session = requests.Session()
retry = Retry(total=max_retries, backoff_factor=0.1, status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

try:
response = session.get(url, headers=headers, timeout=10)
response.raise_for_status()
with open(file_name, 'wb') as file:
file.write(response.content)
print(f"Downloaded: {file_name}")
except requests.exceptions.RequestException as e:
print(f"Failed to download {url}: {str(e)}")

# Create a directory to store the images
if not os.path.exists('public/flags'):
os.makedirs('public/flags')

# Download each flag
for flag in flags:
file_name = f"public/flags/{flag['letter']}_{flag['name'].replace(' ', '_')}.svg"
download_image(flag['url'], file_name)
time.sleep(1) # Add a small delay between requests to be polite to the server

print("All flags processed!")
3 changes: 3 additions & 0 deletions next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ const nextConfig = {
images: {
unoptimized: true,
},
assetPrefix: process.env.NODE_ENV === 'production' ? '/maritime-flag-quiz' : '',
basePath: process.env.NODE_ENV === 'production' ? '/maritime-flag-quiz' : '',
trailingSlash: true,
}

module.exports = nextConfig
22 changes: 22 additions & 0 deletions src/app/_app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { useEffect } from 'react'
import { useRouter } from 'next/router'

function MyApp({ Component, pageProps }) {
const router = useRouter()

useEffect(() => {
const handleRouteChange = (url) => {
window.gtag('config', '[YOUR_GA_TRACKING_ID]', {
page_path: url,
})
}
router.events.on('routeChangeComplete', handleRouteChange)
return () => {
router.events.off('routeChangeComplete', handleRouteChange)
}
}, [router.events])

return <Component {...pageProps} />
}

export default MyApp
27 changes: 27 additions & 0 deletions src/app/_document.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { Html, Head, Main, NextScript } from 'next/document'

export default function Document() {
return (
<Html lang="en">
<Head>
<script dangerouslySetInnerHTML={{
__html: `
(function() {
var pathPrefix = "/maritime-flag-quiz";
if (typeof window !== "undefined" && window.location.pathname.indexOf(pathPrefix) === 0) {
var headEl = document.getElementsByTagName("head")[0];
var baseEl = document.createElement("base");
baseEl.href = pathPrefix + "/";
headEl.insertBefore(baseEl, headEl.firstChild);
}
})();
`
}} />
</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
54 changes: 27 additions & 27 deletions src/components/MaritimeFlagQuiz.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,33 +8,33 @@ import { CheckCircle2, XCircle, ArrowRight } from 'lucide-react'


const flags = [
{ letter: '~', name: 'Code Pennant', russianName: 'Вымпел', url: '/flags/~_Code_Pennant.svg', meaning: 'Вымпел свода и ответный вымпел' },
{ letter: 'A', name: 'Alpha', russianName: 'Алфа', url: '/flags/A_Alpha.svg', meaning: '«У меня спущен водолаз: держитесь в стороне от меня и следуйте малым ходом»' },
{ letter: 'B', name: 'Bravo', russianName: 'Браво', url: '/flags/B_Bravo.svg', meaning: '«Я загружаюсь или разгружаюсь, или имею на борту опасный груз»' },
{ letter: 'C', name: 'Charlie', russianName: 'Чарли', url: '/flags/C_Charlie.svg', meaning: '«Положительный ответ. Значение предыдущей группы должно читаться в утвердительной форме» (утвердительный).' },
{ letter: 'D', name: 'Delta', russianName: 'Дэлта', url: '/flags/D_Delta.svg', meaning: '«Держитесь в стороне от меня: я управляюсь с трудом»' },
{ letter: 'E', name: 'Echo', russianName: 'Эхо', url: '/flags/E_Echo.svg', meaning: '«Я изменяю свой курс вправо»' },
{ letter: 'F', name: 'Foxtrot', russianName: 'Фокстрот', url: '/flags/F_Foxtrot.svg', meaning: '«Я не управляюсь; держите связь со мной»' },
{ letter: 'G', name: 'Golf', russianName: 'Голф', url: '/flags/G_Golf.svg', meaning: '«Мне нужен лоцман». Для рыболовных судов, работающих в непосредственной близости друг от друга: «Я выбираю сети»' },
{ letter: 'H', name: 'Hotel', russianName: 'Отель', url: '/flags/H_Hotel.svg', meaning: '«У меня на борту лоцман»' },
{ letter: 'I', name: 'India', russianName: 'Индия', url: '/flags/I_India.svg', meaning: '«Я изменяю свой курс влево»' },
{ letter: 'J', name: 'Juliet', russianName: 'Джулет', url: '/flags/J_Juliet.svg', meaning: '«У меня пожар и я имею на борту опасный груз: держитесь в стороне от меня»' },
{ letter: 'K', name: 'Kilo', russianName: 'Кило', url: '/flags/K_Kilo.svg', meaning: '«Я хочу связаться с вами».' },
{ letter: 'L', name: 'Lima', russianName: 'Лима', url: '/flags/L_Lima.svg', meaning: 'В море: «Немедленно остановитесь» или «застопорить ход». В порту: «Карантин»' },
{ letter: 'M', name: 'Mike', russianName: 'Майк', url: '/flags/M_Mike.svg', meaning: '«Моё судно остановлено и не имеет хода относительно воды»' },
{ letter: 'N', name: 'November', russianName: 'Новембр', url: '/flags/N_November.svg', meaning: '«Отрицательный ответ. Значение предыдущей группы должно читаться в отрицательной форме» (отрицательный)' },
{ letter: 'O', name: 'Oscar', russianName: 'Оскар', url: '/flags/O_Oscar.svg', meaning: '«Человек за бортом!»' },
{ letter: 'P', name: 'Papa', russianName: 'Папа', url: '/flags/P_Papa.svg', meaning: 'В гавани: «Судно собирается в море: всем доложить о прибытии». Для рыболовных судов: «Мои сети зацепились за препятствие»' },
{ letter: 'Q', name: 'Quebec', russianName: 'Квебек', url: '/flags/Q_Quebec.svg', meaning: '«Моё судно незараженное, прошу предоставить мне свободную практику»' },
{ letter: 'R', name: 'Romeo', russianName: 'Ромео', url: '/flags/R_Romeo.svg', meaning: 'Флаг не имеет определённого значения.' },
{ letter: 'S', name: 'Sierra', russianName: 'Сьера', url: '/flags/S_Sierra.svg', meaning: '«Мои двигатели работают на задний ход»' },
{ letter: 'T', name: 'Tango', russianName: 'Танго', url: '/flags/T_Tango.svg', meaning: '«Держитесь в стороне от меня; я произвожу парное траление».' },
{ letter: 'U', name: 'Uniform', russianName: 'Юниформ', url: '/flags/U_Uniform.svg', meaning: '«Вы идёте к опасности»' },
{ letter: 'V', name: 'Victor', russianName: 'Виктор', url: '/flags/V_Victor.svg', meaning: '«Мне необходима помощь»' },
{ letter: 'W', name: 'Whiskey', russianName: 'Виски', url: '/flags/W_Whiskey.svg', meaning: '«Мне необходима медицинская помощь»' },
{ letter: 'X', name: 'X-Ray', russianName: 'Эксрэй', url: '/flags/X_X-Ray.svg', meaning: '«Приостановите выполнение ваших намерений и наблюдайте за моими сигналами»' },
{ letter: 'Y', name: 'Yankee', russianName: 'Янкии', url: '/flags/Y_Yankee.svg', meaning: '«Меня дрейфует на якоре» / «Я выбираю якорь»' },
{ letter: 'Z', name: 'Zulu', russianName: 'Зулу', url: '/flags/Z_Zulu.svg', meaning: '«Мне нужен буксир». Для рыболовных судов: «Вымётываю сети»' },
{ letter: '~', name: 'Code Pennant', russianName: 'Вымпел', url: 'flags/~_Code_Pennant.svg', meaning: 'Вымпел свода и ответный вымпел' },
{ letter: 'A', name: 'Alpha', russianName: 'Алфа', url: 'flags/A_Alpha.svg', meaning: '«У меня спущен водолаз: держитесь в стороне от меня и следуйте малым ходом»' },
{ letter: 'B', name: 'Bravo', russianName: 'Браво', url: 'flags/B_Bravo.svg', meaning: '«Я загружаюсь или разгружаюсь, или имею на борту опасный груз»' },
{ letter: 'C', name: 'Charlie', russianName: 'Чарли', url: 'flags/C_Charlie.svg', meaning: '«Положительный ответ. Значение предыдущей группы должно читаться в утвердительной форме» (утвердительный).' },
{ letter: 'D', name: 'Delta', russianName: 'Дэлта', url: 'flags/D_Delta.svg', meaning: '«Держитесь в стороне от меня: я управляюсь с трудом»' },
{ letter: 'E', name: 'Echo', russianName: 'Эхо', url: 'flags/E_Echo.svg', meaning: '«Я изменяю свой курс вправо»' },
{ letter: 'F', name: 'Foxtrot', russianName: 'Фокстрот', url: 'flags/F_Foxtrot.svg', meaning: '«Я не управляюсь; держите связь со мной»' },
{ letter: 'G', name: 'Golf', russianName: 'Голф', url: 'flags/G_Golf.svg', meaning: '«Мне нужен лоцман». Для рыболовных судов, работающих в непосредственной близости друг от друга: «Я выбираю сети»' },
{ letter: 'H', name: 'Hotel', russianName: 'Отель', url: 'flags/H_Hotel.svg', meaning: '«У меня на борту лоцман»' },
{ letter: 'I', name: 'India', russianName: 'Индия', url: 'flags/I_India.svg', meaning: '«Я изменяю свой курс влево»' },
{ letter: 'J', name: 'Juliet', russianName: 'Джулет', url: 'flags/J_Juliet.svg', meaning: '«У меня пожар и я имею на борту опасный груз: держитесь в стороне от меня»' },
{ letter: 'K', name: 'Kilo', russianName: 'Кило', url: 'flags/K_Kilo.svg', meaning: '«Я хочу связаться с вами».' },
{ letter: 'L', name: 'Lima', russianName: 'Лима', url: 'flags/L_Lima.svg', meaning: 'В море: «Немедленно остановитесь» или «застопорить ход». В порту: «Карантин»' },
{ letter: 'M', name: 'Mike', russianName: 'Майк', url: 'flags/M_Mike.svg', meaning: '«Моё судно остановлено и не имеет хода относительно воды»' },
{ letter: 'N', name: 'November', russianName: 'Новембр', url: 'flags/N_November.svg', meaning: '«Отрицательный ответ. Значение предыдущей группы должно читаться в отрицательной форме» (отрицательный)' },
{ letter: 'O', name: 'Oscar', russianName: 'Оскар', url: 'flags/O_Oscar.svg', meaning: '«Человек за бортом!»' },
{ letter: 'P', name: 'Papa', russianName: 'Папа', url: 'flags/P_Papa.svg', meaning: 'В гавани: «Судно собирается в море: всем доложить о прибытии». Для рыболовных судов: «Мои сети зацепились за препятствие»' },
{ letter: 'Q', name: 'Quebec', russianName: 'Квебек', url: 'flags/Q_Quebec.svg', meaning: '«Моё судно незараженное, прошу предоставить мне свободную практику»' },
{ letter: 'R', name: 'Romeo', russianName: 'Ромео', url: 'flags/R_Romeo.svg', meaning: 'Флаг не имеет определённого значения.' },
{ letter: 'S', name: 'Sierra', russianName: 'Сьера', url: 'flags/S_Sierra.svg', meaning: '«Мои двигатели работают на задний ход»' },
{ letter: 'T', name: 'Tango', russianName: 'Танго', url: 'flags/T_Tango.svg', meaning: '«Держитесь в стороне от меня; я произвожу парное траление».' },
{ letter: 'U', name: 'Uniform', russianName: 'Юниформ', url: 'flags/U_Uniform.svg', meaning: '«Вы идёте к опасности»' },
{ letter: 'V', name: 'Victor', russianName: 'Виктор', url: 'flags/V_Victor.svg', meaning: '«Мне необходима помощь»' },
{ letter: 'W', name: 'Whiskey', russianName: 'Виски', url: 'flags/W_Whiskey.svg', meaning: '«Мне необходима медицинская помощь»' },
{ letter: 'X', name: 'X-Ray', russianName: 'Эксрэй', url: 'flags/X_X-Ray.svg', meaning: '«Приостановите выполнение ваших намерений и наблюдайте за моими сигналами»' },
{ letter: 'Y', name: 'Yankee', russianName: 'Янкии', url: 'flags/Y_Yankee.svg', meaning: '«Меня дрейфует на якоре» / «Я выбираю якорь»' },
{ letter: 'Z', name: 'Zulu', russianName: 'Зулу', url: 'flags/Z_Zulu.svg', meaning: '«Мне нужен буксир». Для рыболовных судов: «Вымётываю сети»' },
];

const MaritimeFlagQuiz = () => {
Expand Down

0 comments on commit 0d93467

Please sign in to comment.