Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Погрузись в «Свидания с отличиями» — увлекательную романтическую игру в жанре «найди отличия», где ты знакомишься с обаятельными девушками, узнаешь их истории и организуешь незабываемые свидания. Тебя ждут десятки уровней, полных эмоций, и множество очаровательных спутниц!

Свидания с отличиями

Казуальные, Головоломки, Новеллы

Играть

Топ прошлой недели

  • Oskanov Oskanov 9 постов
  • Animalrescueed Animalrescueed 44 поста
  • Antropogenez Antropogenez 18 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая «Подписаться», я даю согласие на обработку данных и условия почтовых рассылок.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
0 просмотренных постов скрыто
Jelizaveta

Преобразование Markdown в HTML и обратно с помощью Python⁠⁠

1 месяц назад

Markdown — это лёгкий и простой для написания язык разметки, тогда как HTML обеспечивает структуру и богатое форматирование для веба. Разработчикам часто требуется конвертация между этими форматами: Markdown удобен для редактирования, а HTML — для публикации. Вместо ручного преобразования вы можете автоматизировать этот процесс с помощью Python.

В этом руководстве вы узнаете, как конвертировать Markdown в HTML и обратно, используя библиотеку Spire.Doc for Python — мощный инструмент, который делает преобразование форматов документов простым и надёжным.

Содержание:

  • Почему стоит конвертировать между Markdown и HTML

  • Установка необходимой библиотеки

  • Конвертация Markdown в HTML на Python

  • Конвертация HTML в Markdown на Python

  • Рекомендации

  • Заключение

Почему стоит конвертировать между Markdown и HTML

Преобразование между Markdown и HTML востребовано у разработчиков, авторов и веб-издателей. Вот несколько ситуаций, где это особенно полезно:

  • Публикация в интернете: преобразуйте документацию в формате Markdown в стилизованные HTML-страницы для вашего сайта.

  • Управление контентом: конвертируйте HTML-записи из CMS в Markdown для редактирования с контролем версий.

  • Автоматизация процессов: автоматически создавайте веб-страницы или редактируемые Markdown-документы из одного формата в другой.

Markdown идеально подходит для создания контента, а HTML — для структурирования и отображения. Возможность переключаться между ними обеспечивает гибкость при работе в обоих направлениях.

Установка необходимой библиотеки

Прежде чем начать, убедитесь, что библиотека Spire.Doc for Python установлена в вашей среде. Она позволяет загружать, конвертировать и сохранять документы в различных форматах, включая Markdown и HTML.

Установите библиотеку через pip:

pip install spire.doc

После установки вы можете приступать к конвертации файлов с помощью нескольких строк кода на Python.

Конвертация Markdown в HTML на Python

Преобразование Markdown в HTML с помощью Spire.Doc — это просто. Библиотека автоматически анализирует синтаксис Markdown и генерирует полностью отформатированный HTML.

from spire.doc import *

# Создать объект Document

doc = Document()

# Загрузить файл Markdown

doc.LoadFromFile("example.md", FileFormat.Markdown)

# Сохранить документ в формате HTML

doc.SaveToFile("example.html", FileFormat.Html)

# Закрыть документ

doc.Close()

Как это работает:

  1. Создание объекта Document: контейнер для содержимого Markdown.

  2. Загрузка Markdown-файла: метод LoadFromFile() считывает файл .md, используя параметр FileFormat.Markdown.

  3. Сохранение в HTML: метод SaveToFile() автоматически преобразует синтаксис Markdown в HTML-теги, такие как <h1>, <p>, <ul> и т. д.

После выполнения кода вы получите полностью работоспособный HTML-файл (example.html), сохраняющий форматирование, заголовки и списки из исходного Markdown-документа.

Конвертация HTML в Markdown на Python

Spire.Doc также поддерживает обратное преобразование — из HTML в Markdown. Это удобно, если нужно упростить существующую HTML-страницу до лёгкой Markdown-версии для документации или редактирования.

from spire.doc import *

# Создать экземпляр Document

doc = Document()

# Загрузить HTML-файл

doc.LoadFromFile("input.html", FileFormat.Html)

# Сохранить в формате Markdown

doc.SaveToFile("output.md", FileFormat.Markdown)

# Закрыть документ

doc.Close()

Пояснение:

  1. Файл HTML (input.html) загружается в объект документа.

  2. Spire.Doc анализирует HTML-элементы, такие как <h1>, <p>, <strong>, <a>, и преобразует их в эквиваленты Markdown: #, обычный текст, **жирный текст**, [ссылка](url).

  3. Результирующий файл Markdown (output.md) получается чистым, структурированным и готовым к использованию в документации или Git-репозиториях.

Двусторонняя конвертация позволяет создавать замкнутые рабочие процессы: писать в Markdown, публиковать в HTML и при необходимости возвращаться обратно.

Рекомендации по конвертации Markdown ↔ HTML

Чтобы обеспечить корректное и точное преобразование, следуйте этим советам:

  • Используйте кодировку UTF-8: чтобы избежать проблем с символами и языками.

  • Проверяйте исходные файлы: убедитесь, что Markdown или HTML корректно оформлены без ошибок разметки.

  • Сохраняйте стили и ссылки: убедитесь, что гиперссылки, списки и изображения корректно преобразуются.

  • Пакетная конвертация: для больших объёмов данных используйте циклы Python для автоматической обработки нескольких файлов.

  • Создавайте резервные копии: сохраняйте исходные версии для сравнения форматирования и структуры.

Заключение

Преобразование между Markdown и HTML помогает оптимизировать процесс создания и публикации контента. С помощью нескольких строк кода на Python вы можете автоматизировать эти преобразования, сохранить единый стиль форматирования и легко переключаться между редактируемыми документами Markdown и готовыми HTML-страницами.

Показать полностью
Python Markdown HTML Текст Длиннопост
0
29
artemoneto
Лига Ролевиков

Ответ на пост «До чего доводит любовь к DnD или как проводят досуг взрослые люди»⁠⁠2

1 месяц назад

Меня тут девушка мастер подземелий в какой-то момент озадачила, мол тыж фронтенд программист, сделай мне так, чтобы карты предметов можно было создать и распечатать. Ну и я как совсем еще неопытный фронтенд программист стал во всю прыть ваять сей продукт.

Короче говоря, вот ссылка.
Все абсолютно бесплатно, ни рекламы, ни какого-либо мне известного налюбилова здесь нет. Старался в первую очередь для девушки, но может кому еще понравится/пригодится.

Одна из возможных рубашек для карт

Одна из возможных рубашек для карт

Удивительным образом, UI/UX дизайнер - это прям отдельная профессия, а в Figma я не заглядывал.

В панамку активно принимаю, поскольку хочу набраться опыта/лайфхаков/лучших практик. Сделать определенно можно лучше, но вроде работает сносно. Если у вас дойдут руки дойти до панамки в виде репозитория и напихать туда, то я только за.

Показать полностью 1
[моё] Dungeons & Dragons Настольные игры Настольные ролевые игры DnD 5 Мат HTML CSS Javascript Frontend Web-программирование Dungeon Master Ответ на пост
4
5
Вопрос из ленты «Эксперты»
Roman.Urich1980
Roman.Urich1980
Информационные Технологии

Сингапурский бот⁠⁠

1 месяц назад

Ситуация: имеется сайт, узкоспециализированный, некоммерческого характера, рассчитанный на небольшую, целевую аудиторию. Соответственно посещаемость небольшая, в среднем 20-25 уникальных в сутки.

Все началось приблизительно недели две назад, когда посещаемость резко увеличилась, но при этом, доля отказов с 5% выросла до 50%. Полез в метрику разбираться, так и есть половина от всех посетителей, один и тот же повторяющийся робот из Сингапура, делает 20-30 заходов в день, все с отказом, соответственно обваливает качество, сайт уже понизился в поисковой выдаче.

Сильно сомневаюсь, что это чьи то умышленные действия, как я уже говорил сайт некоммерческий, узкой тематики, конкурентов у него нет.

Для примера, только за сегодняшнее утро уже 12 заходов:

Вопрос простой - Что это за гадость и как с ней бороться?

Показать полностью 2
[моё] IT SEO Компьютер HTML Сайт Яндекс Метрика Бот Спам Проблема Странная проблема Вопрос Спроси Пикабу
14
2
renamed3958723
renamed3958723
Вёрстка и программирование

Project #8⁠⁠

1 месяц назад
Project #8

Написан новый сайт по макету figma. Использованы html, scss, js.

Адаптивная верстка.

Тематика сайта - приложение для управления бюджетом cloudbudget.

Сайт: div-inity.github.io/Project-8/

Репозиторий: https://github.com/div-inity/Project-8

Показать полностью 1
[моё] IT CSS HTML Веб-разработка Веб-приложение Figma Javascript Длиннопост
7
5
renamed3958723
renamed3958723

Новый проект веб-вёрстки (#7)⁠⁠

1 месяц назад

Всем привет!

Я начинающий веб-разработчик, пишу понемножку. Опыта коммерческой разработки ноль, работала вообще по другой стезе, несмотря на то, что по образованию программист. Сейчас я вообще сижу в декрете, учусь на вышке и стараюсь вобрать в себя побольше знаний.

Ранее главным образом меня интересовал функционал сайта.

Но в последнее время я решила поднатаскать навыки именно внешнего оформления сайтов. Поэтому взялась усиленно изучать различные фичи css, которые раньше мне были не знакомы (о чём сожалею - проекты выглядели бы куда презентабельнее).

Верстаю пока странички по шаблонам из figma. Здесь буду показывать свой прогресс. Будет интересно потом это вспомнить. А сейчас мне интересно услышать мнения, а возможно, и советы от опытных разработчиков - что не так, что следует исправлять и т.п.

Начну, пожалуй, с проекта № 7. На мой взгляд, он выглядит неплохо.

Новый проект веб-вёрстки (#7)

Ссылка на сайт: https://div-inity.github.io/Project-7/

Ссылка на репозиторий: https://github.com/div-inity/Project-7

Почему я начинаю с седьмого проекта? На гитхабе эти проекты начинаются с 3-го - потому что первые два были посвящены гридам и флексам. А еще потому что предыдущие мне кажутся плохими и я их не исправляла. Хорошие решения я перенимаю из них в новые проекты, плохие же оставляю в прошлом и новый проект начинаю с новым опытом. Хотя, в любом случае - эти проекты на github открыты и можно мне перемыть косточки :)

Показать полностью 1
[моё] Скриншот Программист Блог Удаленная работа Веб-разработка Верстка Веб-приложение IT Карьера Фриланс Figma HTML CSS Длиннопост
6
tablepedia
Лига Политики
Серия Вклады учёных в мировую науку

Продолжение поста «Вклад Маркса, Энгельса, Ленина, Сталина и Бухарина в мировую науку»⁠⁠1

1 месяц назад

Вклад Троцкого в мировую науку

Источник: https://tablepedia.com/Trotsky.html

Страница создана нейросетью DeepSeek

Лев Троцкий, известный primarily как революционный деятель, также сделал значительный вклад в политическую теорию, военную науку и анализ общественных процессов. Его идеи продолжают влиять на левую мысль во всём мире.

Теория перманентной революции

Одна из ключевых теоретических концепций, разработанных Троцким. Согласно этой теории, в странах со слаборазвитой буржуазией демократическая революция может перерасти в социалистическую, а затем и в мировую.

"Перманентная революция, в том смысле, который Маркс вкладывал в это понятие, означает революцию, которая не примиряется ни с одной формой классового господства."

Анализ сталинизма

Троцкий создал комплексный анализ природы советского государства под руководством Сталина, определив его как "переродившееся рабочее государство" и разработав теорию о становлении бюрократической касты.

Военные инновации

В качестве создателя и руководителя Красной Армии Троцкий разработал новые принципы военной организации, сочетающие революционный энтузиазм с профессиональной военной экспертизой.

Область вклада

Сущность концепции

Влияние

Политическая теория

Теория перманентной революции

Влияние на антиколониальные движения и теории мирового социализма

Анализ общества

Критика сталинизма и бюрократизма

Формирование традиции левой оппозиции тоталитаризму

Военная наука

Организация революционной армии

Инновации в военном строительстве и политическом руководстве армией

Литературная критика

Применение исторического материализма к искусствуВлияние на марксистскую литературную критику XX века

Ключевые работы

  • "Итоги и перспективы" (1906) - разработка теории перманентной революции

  • "История русской революции" (1931-1933) - фундаментальный анализ революционных событий

  • "Преданная революция" (1936) - анализ природы Советского Союза

  • "Литература и революция" (1923) - взгляд на роль искусства в революционном обществе

  • "Моя жизнь" (1930) - автобиография, важный исторический документ

Показать полностью
[моё] Контент нейросетей Социализм Капитализм Политика DeepSeek Демократия Коммунизм Равенство СССР Развал СССР Пропаганда Репрессии Патриотизм Карл Маркс Фридрих Энгельс Ленин Сталин Николай Бухарин Критическое мышление HTML Ответ на пост Текст
2
tablepedia
Лига Политики
Серия Вклады учёных в мировую науку

Вклад Маркса, Энгельса, Ленина, Сталина и Бухарина в мировую науку⁠⁠1

1 месяц назад

Я сгенерировал через Deepseek HTML файлы с информацией о вкладе в мировую науку основоположников марксизма-ленинизма и их последователей:

Сделать html файл о вкладе Бухарина в мировую науку в таком же стиле как tablepedia.com/Socrat/
tablepedia.com/Bukharin.html

Сделать html файл о вкладе Сталина в мировую науку в таком же стиле как tablepedia.com/Socrat/
tablepedia.com/Stalin.html

Сделать html файл о вкладе Ленина в мировую науку в таком же стиле как tablepedia.com/Socrat/
tablepedia.com/Lenin.html

Сделать html файл о вкладе Фридриха Энгельса в мировую науку в таком же стиле как tablepedia.com/Socrat/
tablepedia.com/Engels.html

Сделать html файл о вкладе Карла Маркса в мировую науку в таком же стиле как tablepedia.com/Socrat/
tablepedia.com/Marx.html

[моё] Контент нейросетей Социализм Капитализм Политика DeepSeek Демократия Коммунизм Равенство СССР Развал СССР Пропаганда Репрессии Патриотизм Карл Маркс Фридрих Энгельс Ленин Сталин Николай Бухарин Критическое мышление HTML Текст
2
Chik69Chik
Chik69Chik

Калькулятор тонировки схрон⁠⁠

2 месяца назад

<!DOCTYPE html>

<html lang="ru">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Калькулятор стоимости тонировки автомобиля</title>

<style>

* {

box-sizing: border-box;

margin: 0;

padding: 0;

font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;

}

body {

background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);

color: #2c3e50;

line-height: 1.6;

padding: 20px;

min-height: 100vh;

}

.container {

max-width: 1200px;

margin: 0 auto;

background: white;

border-radius: 15px;

box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);

overflow: hidden;

}

header {

background: linear-gradient(135deg, #2c3e50 0%, #4a6491 100%);

color: white;

padding: 25px;

text-align: center;

}

h1 {

margin-bottom: 10px;

font-size: 32px;

}

.description {

font-size: 18px;

opacity: 0.9;

max-width: 800px;

margin: 0 auto;

}

.calculator-container {

display: flex;

flex-wrap: wrap;

padding: 25px;

}

.car-selection {

flex: 1;

min-width: 350px;

padding: 25px;

background: #f8f9fa;

border-radius: 10px;

margin-right: 25px;

}

.car-visualization {

flex: 1;

min-width: 350px;

padding: 25px;

text-align: center;

}

.form-group {

margin-bottom: 25px;

padding: 15px;

background: white;

border-radius: 8px;

box-shadow: 0 3px 10px rgba(0, 0, 0, 0.08);

}

.form-group h3 {

margin-bottom: 15px;

color: #2c3e50;

border-bottom: 2px solid #3498db;

padding-bottom: 8px;

}

label {

display: block;

margin-bottom: 10px;

font-weight: bold;

color: #2c3e50;

}

select, input {

width: 100%;

padding: 14px;

border: 1px solid #ddd;

border-radius: 6px;

font-size: 16px;

margin-bottom: 10px;

transition: border-color 0.3s;

}

select:focus, input:focus {

border-color: #3498db;

outline: none;

box-shadow: 0 0 0 2px rgba(52, 152, 219, 0.2);

}

.glass-options {

display: grid;

grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));

gap: 12px;

margin-top: 15px;

}

.glass-option {

display: flex;

align-items: center;

padding: 12px;

background: white;

border: 1px solid #e0e0e0;

border-radius: 6px;

cursor: pointer;

transition: all 0.3s ease;

}

.glass-option:hover {

background: #e8f4fc;

border-color: #3498db;

transform: translateY(-2px);

}

.glass-option input {

margin-right: 12px;

width: auto;

}

.car-image {

max-width: 100%;

height: auto;

margin-bottom: 25px;

border-radius: 10px;

box-shadow: 0 8px 20px rgba(0, 0, 0, 0.12);

transition: transform 0.3s ease;

}

.car-image:hover {

transform: scale(1.02);

}

.summary {

background: linear-gradient(135deg, #2c3e50 0%, #4a6491 100%);

color: white;

padding: 25px;

border-radius: 10px;

margin-top: 25px;

}

.summary h3 {

margin-bottom: 20px;

text-align: center;

font-size: 22px;

}

.summary-item {

display: flex;

justify-content: space-between;

margin-bottom: 12px;

padding-bottom: 12px;

border-bottom: 1px solid rgba(255, 255, 255, 0.15);

}

.total {

font-size: 26px;

font-weight: bold;

margin-top: 20px;

padding-top: 20px;

border-top: 2px solid rgba(255, 255, 255, 0.3);

}

.contact-form {

margin-top: 25px;

padding: 25px;

background: #f8f9fa;

border-radius: 10px;

}

.contact-form h3 {

margin-bottom: 20px;

color: #2c3e50;

text-align: center;

}

button {

width: 100%;

padding: 16px;

background: linear-gradient(135deg, #3498db 0%, #2c3e50 100%);

color: white;

border: none;

border-radius: 6px;

font-size: 18px;

cursor: pointer;

transition: all 0.3s ease;

margin-top: 20px;

}

button:hover {

background: linear-gradient(135deg, #2980b9 0%, #1e2a38 100%);

transform: translateY(-2px);

box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);

}

.counter {

display: flex;

align-items: center;

margin-top: 10px;

}

.counter button {

width: 40px;

height: 40px;

border-radius: 50%;

display: flex;

align-items: center;

justify-content: center;

font-size: 20px;

margin: 0 10px;

}

.counter span {

font-size: 18px;

font-weight: bold;

min-width: 30px;

text-align: center;

}

.van-options {

background: #e8f4fc;

padding: 15px;

border-radius: 8px;

margin-top: 15px;

border-left: 4px solid #3498db;

}

@Media (max-width: 900px) {

.calculator-container {

flex-direction: column;

}

.car-selection {

margin-right: 0;

margin-bottom: 25px;

}

.glass-options {

grid-template-columns: 1fr;

}

}

</style>

</head>

<body>

<div class="container">

<header>

<h1>Калькулятор стоимости тонировки автомобиля</h1>

<p class="description">Рассчитайте точную стоимость тонировки с учетом всех особенностей вашего автомобиля: форточек, люков и множества боковых стекол</p>

</header>

<div class="calculator-container">

<div class="car-selection">

<div class="form-group">

<h3>Тип автомобиля</h3>

<label for="car-type">Тип кузова:</label>

<select id="car-type">

<option value="">Выберите тип кузова</option>

<option value="sedan">Седан (4-дверный)</option>

<option value="hatchback3">Хэтчбек (3-дверный)</option>

<option value="hatchback5">Хэтчбек (5-дверный)</option>

<option value="universal">Универсал</option>

<option value="crossover">Кроссовер</option>

<option value="suv">Внедорожник</option>

<option value="minivan">Минивэн</option>

<option value="coupe">Купе</option>

<option value="van">Фургон</option>

</select>

</div>

<div class="form-group">

<h3>Стекла для тонировки</h3>

<label>Выберите стекла для тонировки:</label>

<div class="glass-options" id="glass-options">

<p style="grid-column: 1 / -1; text-align: center; padding: 20px;">Сначала выберите тип кузова</p>

</div>

</div>

<div class="form-group">

<h3>Пленка для тонировки</h3>

<label for="film-type">Тип пленки:</label>

<select id="film-type">

<option value="">Выберите тип пленки</option>

<option value="1.3">Llumar ATR (50%) - 1.3x</option>

<option value="1.3">Llumar ATR (35%) - 1.3x</option>

<option value="1.3">Llumar ATR (20%) - 1.3x</option>

<option value="1.0">3M Classic (35%) - 1.0x</option>

<option value="2.0">3M Crystalline (70%) - 2.0x</option>

<option value="1.5">SunTek Carbon (40%) - 1.5x</option>

<option value="1.8">Johnson IR (30%) - 1.8x</option>

</select>

</div>

<div class="form-group">

<h3>Дополнительные услуги</h3>

<div class="glass-options">

<label class="glass-option">

<input type="checkbox" id="remove-old" value="1500">

<span>Снятие старой пленки (+1 500 руб.)</span>

</label>

<label class="glass-option">

<input type="checkbox" id="master-call" value="3000">

<span>Вызов мастера (+3 000 руб.)</span>

</label>

<label class="glass-option">

<input type="checkbox" id="antirain" value="2000">

<span>Нанесение "Антидождь" (+2 000 руб.)</span>

</label>

<label class="glass-option">

<input type="checkbox" id="headlights" value="2500">

<span>Оклейка фар (+2 500 руб.)</span>

</label>

</div>

</div>

</div>

<div class="car-visualization">

<img src="https://via.placeholder.com/500x250/e0e0e0/666666?text=%D0%9..." alt="Изображение автомобиля" id="car-image" class="car-image">

<div class="summary">

<h3>Стоимость тонировки</h3>

<div class="summary-item">

<span>Стоимость стекол:</span>

<span id="glass-price">0 руб.</span>

</div>

<div class="summary-item">

<span>Коэффициент пленки:</span>

<span id="film-coeff">1.0x</span>

</div>

<div class="summary-item">

<span>Дополнительные услуги:</span>

<span id="services-price">0 руб.</span>

</div>

<div class="total">

<span>ИТОГО:</span>

<span id="total-price">0 руб.</span>

</div>

</div>

<div class="contact-form">

<h3>Оставьте заявку</h3>

<div class="form-group">

<input type="text" placeholder="Ваше имя" id="client-name">

</div>

<div class="form-group">

<input type="tel" placeholder="Ваш телефон" id="client-phone">

</div>

<div class="form-group">

<input type="email" placeholder="Ваш email (необязательно)" id="client-email">

</div>

<button id="calculate-btn">Рассчитать стоимость</button>

</div>

</div>

</div>

</div>

<script>

document.addEventListener('DOMContentLoaded', function() {

// Данные по типам кузовов и стеклам

const carData = {

sedan: {

name: "Седан",

image: "https://via.placeholder.com/500x250/3498db/ffffff?text=%D0%A1%D0%B5%D0%B4%D0%B0%D0%BD",

glasses: [

{ id: "windscreen", name: "Лобовое стекло", price: 3000, default: true },

{ id: "front-side", name: "Передние боковые", price: 2000, default: true },

{ id: "rear-side", name: "Задние боковые", price: 2500, default: true },

{ id: "rear", name: "Заднее стекло", price: 2800, default: true },

{ id: "front-vent", name: "Передние форточки", price: 800, default: false },

{ id: "sunroof", name: "Люк", price: 1500, default: false }

]

},

hatchback3: {

name: "Хэтчбек 3дв",

image: "https://via.placeholder.com/500x250/2ecc71/ffffff?text=%D0%A...",

glasses: [

{ id: "windscreen", name: "Лобовое стекло", price: 3000, default: true },

{ id: "front-side", name: "Передние боковые", price: 2000, default: true },

{ id: "rear-side", name: "Задние боковые", price: 2500, default: true },

{ id: "rear", name: "Заднее стекло", price: 2800, default: true },

{ id: "front-vent", name: "Передние форточки", price: 800, default: false },

{ id: "sunroof", name: "Люк", price: 1500, default: false }

]

},

hatchback5: {

name: "Хэтчбек 5дв",

image: "https://via.placeholder.com/500x250/e74c3c/ffffff?text=%D0%A...",

glasses: [

{ id: "windscreen", name: "Лобовое стекло", price: 3000, default: true },

{ id: "front-side", name: "Передние боковые", price: 2000, default: true },

{ id: "rear-side", name: "Задние боковые", price: 2500, default: true },

{ id: "rear", name: "Заднее стекло", price: 2800, default: true },

{ id: "front-vent", name: "Передние форточки", price: 800, default: false },

{ id: "rear-vent", name: "Задние форточки", price: 800, default: false },

{ id: "sunroof", name: "Люк", price: 1500, default: false }

]

},

universal: {

name: "Универсал",

image: "https://via.placeholder.com/500x250/9b59b6/ffffff?text=%D0%A...",

glasses: [

{ id: "windscreen", name: "Лобовое стекло", price: 3200, default: true },

{ id: "front-side", name: "Передние боковые", price: 2200, default: true },

{ id: "rear-side", name: "Задние боковые", price: 2700, default: true },

{ id: "rear", name: "Заднее стекло", price: 3000, default: true },

{ id: "front-vent", name: "Передние форточки", price: 900, default: false },

{ id: "rear-vent", name: "Задние форточки", price: 900, default: false },

{ id: "sunroof", name: "Люк", price: 1700, default: false }

]

},

crossover: {

name: "Кроссовер",

image: "https://via.placeholder.com/500x250/f39c12/ffffff?text=%D0%9...",

glasses: [

{ id: "windscreen", name: "Лобовое стекло", price: 3500, default: true },

{ id: "front-side", name: "Передние боковые", price: 2500, default: true },

{ id: "rear-side", name: "Задние боковые", price: 2800, default: true },

{ id: "rear", name: "Заднее стекло", price: 3200, default: true },

{ id: "front-vent", name: "Передние форточки", price: 1000, default: false },

{ id: "rear-vent", name: "Задние форточки", price: 1000, default: false },

{ id: "sunroof", name: "Люк", price: 1800, default: false }

]

},

suv: {

name: "Внедорожник",

image: "https://via.placeholder.com/500x250/34495e/ffffff?text=%D0%9...",

glasses: [

{ id: "windscreen", name: "Лобовое стекло", price: 4000, default: true },

{ id: "front-side", name: "Передние боковые", price: 2800, default: true },

{ id: "rear-side", name: "Задние боковые", price: 3000, default: true },

{ id: "rear", name: "Заднее стекло", price: 3500, default: true },

{ id: "front-vent", name: "Передние форточки", price: 1200, default: false },

{ id: "rear-vent", name: "Задние форточки", price: 1200, default: false },

{ id: "sunroof", name: "Люк", price: 2000, default: false }

]

},

minivan: {

name: "Минивэн",

image: "https://via.placeholder.com/500x250/16a085/ffffff?text=%D0%9...",

glasses: [

{ id: "windscreen", name: "Лобовое стекло", price: 3800, default: true },

{ id: "front-side", name: "Передние боковые", price: 2600, default: true },

{ id: "rear-side", name: "Задние боковые", price: 2900, default: true },

{ id: "rear", name: "Заднее стекло", price: 3300, default: true },

{ id: "front-vent", name: "Передние форточки", price: 1100, default: false },

{ id: "rear-vent", name: "Задние форточки", price: 1100, default: false },

{ id: "sunroof", name: "Люк", price: 1900, default: false }

]

},

coupe: {

name: "Купе",

image: "https://via.placeholder.com/500x250/e67e22/ffffff?text=%D0%9A%D1%83%D0%BF%D0%B5",

glasses: [

{ id: "windscreen", name: "Лобовое стекло", price: 3200, default: true },

{ id: "front-side", name: "Передние боковые", price: 2200, default: true },

{ id: "rear-side", name: "Задние боковые", price: 2600, default: true },

{ id: "rear", name: "Заднее стекло", price: 3000, default: true },

{ id: "sunroof", name: "Люк", price: 1700, default: false }

]

},

van: {

name: "Фургон",

image: "https://via.placeholder.com/500x250/7f8c8d/ffffff?text=%D0%A...",

glasses: [

{ id: "windscreen", name: "Лобовое стекло", price: 4500, default: true },

{ id: "front-side", name: "Передние боковые", price: 3000, default: true },

{ id: "front-vent", name: "Передние форточки", price: 1500, default: false },

{ id: "rear", name: "Заднее стекло", price: 4000, default: true },

{ id: "side-windows", name: "Боковые стекла (каждое)", price: 1800, default: 0, count: true },

{ id: "rear-vent", name: "Задние форточки", price: 1500, default: false }

]

}

};

// Элементы DOM

const carTypeSelect = document.getElementById('car-type');

const glassOptionsDiv = document.getElementById('glass-options');

const carImage = document.getElementById('car-image');

const filmTypeSelect = document.getElementById('film-type');

const glassPriceSpan = document.getElementById('glass-price');

const filmCoeffSpan = document.getElementById('film-coeff');

const servicesPriceSpan = document.getElementById('services-price');

const totalPriceSpan = document.getElementById('total-price');

const calculateBtn = document.getElementById('calculate-btn');

// Обработчик изменения типа кузова

carTypeSelect.addEventListener('change', function() {

const selectedCar = carData[this.value];

if (selectedCar) {

// Обновляем изображение автомобиля

carImage.src = selectedCar.image;

carImage.alt = selectedCar.name;

// Генерируем options для стекол

let glassHTML = '';

selectedCar.glasses.forEach(glass => {

if (glass.count) {

// Для фургона - счетчик боковых стекол

glassHTML += `

<div class="van-options">

<label>${glass.name}:</label>

<div class="counter">

<button type="button" class="decrease" data-id="${glass.id}">-</button>

<span id="count-${glass.id}">0</span>

<button type="button" class="increase" data-id="${glass.id}">+</button>

</div>

<div>Цена за единицу: ${glass.price} руб.</div>

</div>

`;

} else {

// Обычный чекбокс

glassHTML += `

<label class="glass-option">

<input type="checkbox" id="${glass.id}" value="${glass.price}" ${glass.default ? 'checked' : ''}>

<span>${glass.name} (${glass.price} руб.)</span>

</label>

`;

}

});

glassOptionsDiv.innerHTML = glassHTML;

// Добавляем обработчики для кнопок счетчика

document.querySelectorAll('.increase').forEach(btn => {

btn.addEventListener('click', function() {

const id = this.getAttribute('data-id');

const countElement = document.getElementById(`count-${id}`);

let count = parseInt(countElement.textContent);

countElement.textContent = count + 1;

calculatePrice();

});

});

document.querySelectorAll('.decrease').forEach(btn => {

btn.addEventListener('click', function() {

const id = this.getAttribute('data-id');

const countElement = document.getElementById(`count-${id}`);

let count = parseInt(countElement.textContent);

if (count > 0) {

countElement.textContent = count - 1;

calculatePrice();

}

});

});

// Пересчитываем стоимость

calculatePrice();

} else {

glassOptionsDiv.innerHTML = '<p style="grid-column: 1 / -1; text-align: center; padding: 20px;">Сначала выберите тип кузова</p>';

carImage.src = 'https://via.placeholder.com/500x250/e0e0e0/666666?text=%D0%9...';

}

});

// Обработчики изменений для пересчета стоимости

filmTypeSelect.addEventListener('change', calculatePrice);

// Динамическое добавление обработчиков для чекбоксов

document.addEventListener('change', function(e) {

if (e.target.type === 'checkbox') {

calculatePrice();

}

});

// Функция расчета стоимости

function calculatePrice() {

let glassTotal = 0;

let servicesTotal = 0;

// Суммируем стоимость выбранных стекол

document.querySelectorAll('#glass-options input[type="checkbox"]:checked').forEach(checkbox => {

glassTotal += parseInt(checkbox.value);

});

// Суммируем стоимость боковых стекол фургона

document.querySelectorAll('[id^="count-"]').forEach(element => {

const count = parseInt(element.textContent);

const id = element.id.replace('count-', '');

const glass = carData[carTypeSelect.value]?.glasses.find(g => g.id === id);

if (glass) {

glassTotal += count * glass.price;

}

});

// Суммируем стоимость дополнительных услуг

document.querySelectorAll('.glass-options:not(#glass-options) input[type="checkbox"]:checked').forEach(checkbox => {

servicesTotal += parseInt(checkbox.value);

});

// Получаем коэффициент пленки

const filmCoeff = filmTypeSelect.value ? parseFloat(filmTypeSelect.value) : 1.0;

// Рассчитываем итоговую стоимость

const total = glassTotal * filmCoeff + servicesTotal;

// Обновляем отображение

glassPriceSpan.textContent = `${glassTotal.toLocaleString('ru-RU')} руб.`;

filmCoeffSpan.textContent = `${filmCoeff}x`;

servicesPriceSpan.textContent = `${servicesTotal.toLocaleString('ru-RU')} руб.`;

totalPriceSpan.textContent = `${total.toLocaleString('ru-RU')} руб.`;

}

// Обработчик кнопки расчета

calculateBtn.addEventListener('click', function() {

const name = document.getElementById('client-name').value;

const phone = document.getElementById('client-phone').value;

if (!name || !phone) {

alert('Пожалуйста, заполните ваше имя и телефон!');

return;

}

if (carTypeSelect.value === "") {

alert('Пожалуйста, выберите тип кузова!');

return;

}

calculatePrice();

// Собираем информацию о выбранных опциях

const selectedOptions = [];

document.querySelectorAll('#glass-options input[type="checkbox"]:checked').forEach(checkbox => {

selectedOptions.push(checkbox.parentElement.querySelector('span').textContent.split(' (')[0]);

});

document.querySelectorAll('[id^="count-"]').forEach(element => {

const count = parseInt(element.textContent);

if (count > 0) {

const id = element.id.replace('count-', '');

const glass = carData[carTypeSelect.value]?.glasses.find(g => g.id === id);

if (glass) {

selectedOptions.push(`${count} × ${glass.name}`);

}

}

});

alert(`Спасибо, ${name}! Ваша заявка принята.\n\nТип автомобиля: ${carData[carTypeSelect.value].name}\nВыбранные опции: ${selectedOptions.join(', ')}\nИтоговая стоимость: ${totalPriceSpan.textContent}\n\nМы свяжемся с вами по телефону ${phone} в течение 15 минут для уточнения деталей.`);

});

// Инициализация

calculatePrice();

});

</script>

</body>

</html>

Показать полностью
[моё] HTML Программирование Текст Длиннопост
4
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии