Update main.py
Browse files
main.py
CHANGED
@@ -113,22 +113,18 @@ def proxy(path):
|
|
113 |
link.decompose()
|
114 |
|
115 |
# Redirect part number links to Google search
|
116 |
-
# Look for links that contain part numbers in
|
117 |
-
part_number_links = soup.select('td a')
|
118 |
for link in part_number_links:
|
119 |
# Get the part number from the link text
|
120 |
part_number = link.text.strip()
|
121 |
-
# Check if it matches a part number pattern (alphanumeric with possible spaces
|
122 |
-
if re.match(r'^[A-Z0-9
|
123 |
# Create a Google search URL for this part number with avto.pro
|
124 |
google_search_url = f"https://www.google.com/search?q={part_number} avto.pro"
|
125 |
# Update the link's href attribute and add target="_blank" to open in new tab
|
126 |
link['href'] = google_search_url
|
127 |
link['target'] = '_blank'
|
128 |
-
# Add styles to make part numbers more visible
|
129 |
-
link['style'] = 'color: #4a90e2; font-weight: bold; text-decoration: none; padding: 2px 6px; background-color: rgba(74, 144, 226, 0.1); border-radius: 3px; transition: all 0.2s ease; display: inline-block;'
|
130 |
-
link['onmouseover'] = 'this.style.backgroundColor="rgba(74, 144, 226, 0.2)"'
|
131 |
-
link['onmouseout'] = 'this.style.backgroundColor="rgba(74, 144, 226, 0.1)"'
|
132 |
|
133 |
# Update image sources to use our proxy
|
134 |
for img in soup.find_all('img'):
|
@@ -319,40 +315,11 @@ def proxy(path):
|
|
319 |
style_tag = soup.new_tag('style')
|
320 |
style_tag.string = '''
|
321 |
:root {
|
322 |
-
/* Light mode variables */
|
323 |
--primary-gradient: linear-gradient(135deg, #3498db 0%, #2980b9 100%);
|
324 |
--hover-gradient: linear-gradient(135deg, #2980b9 0%, #2471a3 100%);
|
325 |
--bg-gradient: linear-gradient(135deg, #f5f7fa 0%, #e4e9f2 100%);
|
326 |
--card-shadow: 0 8px 20px rgba(0,0,0,0.08);
|
327 |
--transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
328 |
-
--text-color: #2c3e50;
|
329 |
-
--bg-color: var(--bg-gradient);
|
330 |
-
--card-bg: rgba(255, 255, 255, 0.98);
|
331 |
-
--card-border: rgba(255, 255, 255, 0.8);
|
332 |
-
--table-border: rgba(236, 240, 241, 0.8);
|
333 |
-
--table-even-row: rgba(245, 247, 250, 0.5);
|
334 |
-
--hr-color: rgba(44, 62, 80, 0.2);
|
335 |
-
--link-color: #2563eb;
|
336 |
-
--link-hover-color: #1d4ed8;
|
337 |
-
--link-visited-color: #4338ca;
|
338 |
-
}
|
339 |
-
|
340 |
-
/* Dark mode variables */
|
341 |
-
[data-theme="dark"] {
|
342 |
-
--primary-gradient: linear-gradient(135deg, #2563eb 0%, #1e40af 100%);
|
343 |
-
--hover-gradient: linear-gradient(135deg, #1e40af 0%, #1e3a8a 100%);
|
344 |
-
--bg-gradient: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
|
345 |
-
--card-shadow: 0 8px 20px rgba(0,0,0,0.2);
|
346 |
-
--text-color: #e2e8f0;
|
347 |
-
--bg-color: var(--bg-gradient);
|
348 |
-
--card-bg: rgba(30, 41, 59, 0.98);
|
349 |
-
--card-border: rgba(30, 41, 59, 0.8);
|
350 |
-
--table-border: rgba(51, 65, 85, 0.8);
|
351 |
-
--table-even-row: rgba(30, 41, 59, 0.5);
|
352 |
-
--hr-color: rgba(226, 232, 240, 0.2);
|
353 |
-
--link-color: #93c5fd;
|
354 |
-
--link-hover-color: #bfdbfe;
|
355 |
-
--link-visited-color: #c4b5fd;
|
356 |
}
|
357 |
body {
|
358 |
font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
|
@@ -360,10 +327,9 @@ def proxy(path):
|
|
360 |
padding: 30px;
|
361 |
max-width: 1400px;
|
362 |
margin: 0 auto;
|
363 |
-
background: var(--bg-
|
364 |
-
color:
|
365 |
min-height: 100vh;
|
366 |
-
transition: background 0.3s ease, color 0.3s ease;
|
367 |
}
|
368 |
.breadcrumb {
|
369 |
display: flex;
|
@@ -371,26 +337,21 @@ def proxy(path):
|
|
371 |
gap: 15px;
|
372 |
align-items: center;
|
373 |
padding: 20px;
|
374 |
-
background:
|
375 |
border-radius: 16px;
|
376 |
box-shadow: var(--card-shadow);
|
377 |
margin-bottom: 30px;
|
378 |
backdrop-filter: blur(10px);
|
379 |
-
border: 1px solid
|
380 |
}
|
381 |
.breadcrumb a {
|
382 |
text-decoration: none;
|
383 |
-
color:
|
384 |
padding: 8px 16px;
|
385 |
border-radius: 8px;
|
386 |
transition: var(--transition);
|
387 |
font-weight: 500;
|
388 |
background: rgba(52, 152, 219, 0.1);
|
389 |
-
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
|
390 |
-
}
|
391 |
-
|
392 |
-
[data-theme="dark"] a:hover {
|
393 |
-
text-decoration: underline;
|
394 |
}
|
395 |
.breadcrumb a:hover {
|
396 |
background: var(--primary-gradient);
|
@@ -413,12 +374,12 @@ def proxy(path):
|
|
413 |
margin: 30px 0;
|
414 |
}
|
415 |
li {
|
416 |
-
background:
|
417 |
border-radius: 16px;
|
418 |
overflow: hidden;
|
419 |
transition: var(--transition);
|
420 |
box-shadow: var(--card-shadow);
|
421 |
-
border: 1px solid
|
422 |
}
|
423 |
li:hover {
|
424 |
transform: translateY(-5px);
|
@@ -428,14 +389,10 @@ def proxy(path):
|
|
428 |
display: block;
|
429 |
padding: 20px;
|
430 |
text-decoration: none;
|
431 |
-
color:
|
432 |
font-weight: 500;
|
433 |
transition: var(--transition);
|
434 |
-
background:
|
435 |
-
}
|
436 |
-
|
437 |
-
[data-theme="dark"] a {
|
438 |
-
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8);
|
439 |
}
|
440 |
li a:hover {
|
441 |
background: var(--primary-gradient);
|
@@ -445,21 +402,21 @@ def proxy(path):
|
|
445 |
width: 100%;
|
446 |
border-collapse: separate;
|
447 |
border-spacing: 0;
|
448 |
-
background:
|
449 |
border-radius: 16px;
|
450 |
overflow: hidden;
|
451 |
box-shadow: var(--card-shadow);
|
452 |
margin: 30px 0;
|
453 |
backdrop-filter: blur(10px);
|
454 |
-
border: 1px solid
|
455 |
}
|
456 |
td {
|
457 |
padding: 20px;
|
458 |
-
border: 1px solid
|
459 |
transition: var(--transition);
|
460 |
}
|
461 |
tr:nth-child(even) {
|
462 |
-
background:
|
463 |
}
|
464 |
tr:hover {
|
465 |
background: var(--bg-gradient);
|
@@ -499,7 +456,7 @@ def proxy(path):
|
|
499 |
hr {
|
500 |
border: none;
|
501 |
height: 1px;
|
502 |
-
background: linear-gradient(to right, transparent,
|
503 |
margin: 30px 0;
|
504 |
}
|
505 |
.modal {
|
@@ -517,10 +474,6 @@ def proxy(path):
|
|
517 |
transition: opacity 0.3s ease;
|
518 |
}
|
519 |
|
520 |
-
[data-theme="dark"] .modal {
|
521 |
-
background: rgba(0, 0, 0, 0.95);
|
522 |
-
}
|
523 |
-
|
524 |
.modal.show {
|
525 |
opacity: 1;
|
526 |
}
|
@@ -624,67 +577,6 @@ def proxy(path):
|
|
624 |
soup.append(html_tag)
|
625 |
soup.head.append(style_tag)
|
626 |
|
627 |
-
# Add dark mode toggle button
|
628 |
-
dark_mode_toggle = soup.new_tag('div')
|
629 |
-
dark_mode_toggle['id'] = 'dark-mode-toggle'
|
630 |
-
dark_mode_toggle['class'] = 'theme-toggle'
|
631 |
-
dark_mode_toggle['style'] = 'position: fixed; top: 20px; right: 20px; z-index: 999; display: flex; align-items: center; gap: 10px; background: var(--card-bg); padding: 10px 15px; border-radius: 30px; box-shadow: var(--card-shadow); cursor: pointer; transition: var(--transition);'
|
632 |
-
|
633 |
-
toggle_icon = soup.new_tag('span')
|
634 |
-
toggle_icon['class'] = 'toggle-icon'
|
635 |
-
toggle_icon['style'] = 'font-size: 18px;'
|
636 |
-
toggle_icon.string = '🌙'
|
637 |
-
|
638 |
-
toggle_text = soup.new_tag('span')
|
639 |
-
toggle_text['class'] = 'toggle-text'
|
640 |
-
toggle_text.string = 'Тёмный режим'
|
641 |
-
|
642 |
-
dark_mode_toggle.append(toggle_icon)
|
643 |
-
dark_mode_toggle.append(toggle_text)
|
644 |
-
|
645 |
-
if soup.body:
|
646 |
-
soup.body.insert(0, dark_mode_toggle)
|
647 |
-
|
648 |
-
# Add dark mode toggle script
|
649 |
-
dark_mode_script = soup.new_tag('script')
|
650 |
-
dark_mode_script.string = '''
|
651 |
-
document.addEventListener('DOMContentLoaded', function() {
|
652 |
-
const toggle = document.getElementById('dark-mode-toggle');
|
653 |
-
const toggleIcon = toggle.querySelector('.toggle-icon');
|
654 |
-
const toggleText = toggle.querySelector('.toggle-text');
|
655 |
-
const htmlElement = document.documentElement;
|
656 |
-
|
657 |
-
// Check for saved theme preference or use user's system preference
|
658 |
-
const savedTheme = localStorage.getItem('theme');
|
659 |
-
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
660 |
-
|
661 |
-
// Apply theme based on saved preference or system preference
|
662 |
-
if (savedTheme === 'dark' || (!savedTheme && prefersDark)) {
|
663 |
-
htmlElement.setAttribute('data-theme', 'dark');
|
664 |
-
toggleIcon.textContent = '☀️';
|
665 |
-
toggleText.textContent = 'Светлый режим';
|
666 |
-
}
|
667 |
-
|
668 |
-
// Toggle theme when button is clicked
|
669 |
-
toggle.addEventListener('click', function() {
|
670 |
-
if (htmlElement.getAttribute('data-theme') === 'dark') {
|
671 |
-
htmlElement.removeAttribute('data-theme');
|
672 |
-
toggleIcon.textContent = '🌙';
|
673 |
-
toggleText.textContent = 'Тёмный режим';
|
674 |
-
localStorage.setItem('theme', 'light');
|
675 |
-
} else {
|
676 |
-
htmlElement.setAttribute('data-theme', 'dark');
|
677 |
-
toggleIcon.textContent = '☀️';
|
678 |
-
toggleText.textContent = 'Светлый режим';
|
679 |
-
localStorage.setItem('theme', 'dark');
|
680 |
-
}
|
681 |
-
});
|
682 |
-
});
|
683 |
-
'''
|
684 |
-
|
685 |
-
if soup.body:
|
686 |
-
soup.body.append(dark_mode_script)
|
687 |
-
|
688 |
# Convert navigation links to breadcrumb
|
689 |
nav_links = soup.find_all('a', href=True)
|
690 |
breadcrumb_div = soup.new_tag('div')
|
|
|
113 |
link.decompose()
|
114 |
|
115 |
# Redirect part number links to Google search
|
116 |
+
# Look for links that contain part numbers (typically in the second column of the table)
|
117 |
+
part_number_links = soup.select('td:nth-child(2) a')
|
118 |
for link in part_number_links:
|
119 |
# Get the part number from the link text
|
120 |
part_number = link.text.strip()
|
121 |
+
# Check if it matches a part number pattern (alphanumeric with possible spaces)
|
122 |
+
if re.match(r'^[A-Z0-9 ]+$', part_number):
|
123 |
# Create a Google search URL for this part number with avto.pro
|
124 |
google_search_url = f"https://www.google.com/search?q={part_number} avto.pro"
|
125 |
# Update the link's href attribute and add target="_blank" to open in new tab
|
126 |
link['href'] = google_search_url
|
127 |
link['target'] = '_blank'
|
|
|
|
|
|
|
|
|
128 |
|
129 |
# Update image sources to use our proxy
|
130 |
for img in soup.find_all('img'):
|
|
|
315 |
style_tag = soup.new_tag('style')
|
316 |
style_tag.string = '''
|
317 |
:root {
|
|
|
318 |
--primary-gradient: linear-gradient(135deg, #3498db 0%, #2980b9 100%);
|
319 |
--hover-gradient: linear-gradient(135deg, #2980b9 0%, #2471a3 100%);
|
320 |
--bg-gradient: linear-gradient(135deg, #f5f7fa 0%, #e4e9f2 100%);
|
321 |
--card-shadow: 0 8px 20px rgba(0,0,0,0.08);
|
322 |
--transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
323 |
}
|
324 |
body {
|
325 |
font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
|
|
|
327 |
padding: 30px;
|
328 |
max-width: 1400px;
|
329 |
margin: 0 auto;
|
330 |
+
background: var(--bg-gradient);
|
331 |
+
color: #2c3e50;
|
332 |
min-height: 100vh;
|
|
|
333 |
}
|
334 |
.breadcrumb {
|
335 |
display: flex;
|
|
|
337 |
gap: 15px;
|
338 |
align-items: center;
|
339 |
padding: 20px;
|
340 |
+
background: rgba(255, 255, 255, 0.98);
|
341 |
border-radius: 16px;
|
342 |
box-shadow: var(--card-shadow);
|
343 |
margin-bottom: 30px;
|
344 |
backdrop-filter: blur(10px);
|
345 |
+
border: 1px solid rgba(255, 255, 255, 0.8);
|
346 |
}
|
347 |
.breadcrumb a {
|
348 |
text-decoration: none;
|
349 |
+
color: #3498db;
|
350 |
padding: 8px 16px;
|
351 |
border-radius: 8px;
|
352 |
transition: var(--transition);
|
353 |
font-weight: 500;
|
354 |
background: rgba(52, 152, 219, 0.1);
|
|
|
|
|
|
|
|
|
|
|
355 |
}
|
356 |
.breadcrumb a:hover {
|
357 |
background: var(--primary-gradient);
|
|
|
374 |
margin: 30px 0;
|
375 |
}
|
376 |
li {
|
377 |
+
background: rgba(255, 255, 255, 0.98);
|
378 |
border-radius: 16px;
|
379 |
overflow: hidden;
|
380 |
transition: var(--transition);
|
381 |
box-shadow: var(--card-shadow);
|
382 |
+
border: 1px solid rgba(255, 255, 255, 0.8);
|
383 |
}
|
384 |
li:hover {
|
385 |
transform: translateY(-5px);
|
|
|
389 |
display: block;
|
390 |
padding: 20px;
|
391 |
text-decoration: none;
|
392 |
+
color: #2c3e50;
|
393 |
font-weight: 500;
|
394 |
transition: var(--transition);
|
395 |
+
background: rgba(255, 255, 255, 0.98);
|
|
|
|
|
|
|
|
|
396 |
}
|
397 |
li a:hover {
|
398 |
background: var(--primary-gradient);
|
|
|
402 |
width: 100%;
|
403 |
border-collapse: separate;
|
404 |
border-spacing: 0;
|
405 |
+
background: rgba(255, 255, 255, 0.98);
|
406 |
border-radius: 16px;
|
407 |
overflow: hidden;
|
408 |
box-shadow: var(--card-shadow);
|
409 |
margin: 30px 0;
|
410 |
backdrop-filter: blur(10px);
|
411 |
+
border: 1px solid rgba(255, 255, 255, 0.8);
|
412 |
}
|
413 |
td {
|
414 |
padding: 20px;
|
415 |
+
border: 1px solid rgba(236, 240, 241, 0.8);
|
416 |
transition: var(--transition);
|
417 |
}
|
418 |
tr:nth-child(even) {
|
419 |
+
background: rgba(245, 247, 250, 0.5);
|
420 |
}
|
421 |
tr:hover {
|
422 |
background: var(--bg-gradient);
|
|
|
456 |
hr {
|
457 |
border: none;
|
458 |
height: 1px;
|
459 |
+
background: linear-gradient(to right, transparent, rgba(44, 62, 80, 0.2), transparent);
|
460 |
margin: 30px 0;
|
461 |
}
|
462 |
.modal {
|
|
|
474 |
transition: opacity 0.3s ease;
|
475 |
}
|
476 |
|
|
|
|
|
|
|
|
|
477 |
.modal.show {
|
478 |
opacity: 1;
|
479 |
}
|
|
|
577 |
soup.append(html_tag)
|
578 |
soup.head.append(style_tag)
|
579 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
580 |
# Convert navigation links to breadcrumb
|
581 |
nav_links = soup.find_all('a', href=True)
|
582 |
breadcrumb_div = soup.new_tag('div')
|