Здесь делается вжух 🪄

ASOIAF AU. ПРАВЛЕНИЕ РЕЙГАРА. 302 ОТ З.Э.
первый пост от Роннела
Название трека

ASOIAF. A Dream of Spring

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ASOIAF. A Dream of Spring » a dance with dragons » генератор кода лз


генератор кода лз

Сообщений 1 страница 3 из 3

1

[html]<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Генератор и Парсер профиля персонажа</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<style>
    body {
        font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        background-color: #f4f5f7;
        color: #333;
        padding: 20px;
    }
    .generator-container {
        max-width: 800px;
        margin: 0 auto;
        background: #fff;
        padding: 30px;
        border-radius: 8px;
        box-shadow: 0 4px 15px rgba(0,0,0,0.05);
    }
    h1 { font-size: 24px; border-bottom: 2px solid #eee; padding-bottom: 10px; }
    h3 { font-size: 18px; margin-top: 25px; color: #444; }
   
    /* Стили для блока импорта */
    .import-section {
        background: #eaf4fc;
        padding: 20px;
        border-radius: 6px;
        border: 1px dashed #2196f3;
        margin-bottom: 30px;
    }
    .import-section p { margin-top: 0; font-size: 14px; color: #555; }
    .btn-import {
        background: #ff9800; color: white; border: none; padding: 12px 20px;
        font-size: 14px; border-radius: 4px; cursor: pointer; margin-top: 10px;
        font-weight: bold; transition: background 0.3s;
    }
    .btn-import:hover { background: #e68a00; }

    .form-group { margin-bottom: 15px; }
    label { display: block; font-weight: bold; margin-bottom: 5px; font-size: 14px; }
    input[type="text"], input[type="number"], textarea, select {
        width: 100%; padding: 10px; border: 1px solid #ccc;
        border-radius: 4px; box-sizing: border-box; font-family: inherit;
    }
    textarea { resize: vertical; min-height: 80px; }
    .row { display: flex; gap: 15px; }
    .row .form-group { flex: 1; }
   
    .link-item {
        display: flex; gap: 10px; align-items: center;
        background: #f9f9f9; padding: 10px; border: 1px solid #e0e0e0;
        border-radius: 4px; margin-bottom: 10px;
    }
    .link-item input[type="text"] { flex: 2; }
    .link-item label { margin-bottom: 0; font-weight: normal; flex: 1; display: flex; align-items: center; gap: 5px;}
    .btn-remove { background: #ff4d4d; color: white; border: none; padding: 10px 15px; border-radius: 4px; cursor: pointer; }
    .btn-add { background: #4caf50; color: white; border: none; padding: 10px 15px; border-radius: 4px; cursor: pointer; margin-bottom: 20px; }
   
    .btn-generate {
        background: #2196f3; color: white; border: none; padding: 15px 30px;
        font-size: 16px; border-radius: 4px; cursor: pointer; width: 100%; margin-top: 20px;
        font-weight: bold; transition: background 0.3s;
    }
    .btn-generate:hover { background: #1976d2; }
   
    .result-section { margin-top: 30px; }
    #result-code { min-height: 300px; background: #2d2d2d; color: #f8f8f2; font-family: monospace; }
</style>
</head>
<body>

<div class="generator-container">
    <h1>Менеджер карточки персонажа</h1>

    <!-- БЛОК ИМПОРТА -->
    <div class="import-section">
        <h3>Анализ готового кода (Импорт)</h3>
        <p>Вставьте сюда ранее сгенерированный HTML, чтобы загрузить данные обратно в форму для редактирования.</p>
        <textarea id="import-code" placeholder="Вставьте HTML-код карточки..."></textarea>
        <button class="btn-import" id="import-btn">РАЗОБРАТЬ КОД И ЗАПОЛНИТЬ ФОРМУ</button>
    </div>

    <!-- ОСНОВНЫЕ ДАННЫЕ -->
    <h3>Основные данные</h3>
    <div class="form-group">
        <label>URL изображения (аватар)</label>
        <input type="text" id="g-img" placeholder="https://...">
    </div>
   
    <div class="row">
        <div class="form-group">
            <label>Заголовок — Имя персонажа</label>
            <div style="display: flex; gap: 10px;">
                <select id="g-heading-tag" style="width: 80px; flex-shrink: 0;">
                    <option value="h1">H1</option>
                    <option value="h2" selected>H2</option>
                    <option value="h3">H3</option>
                </select>
                <input type="text" id="g-name" placeholder="РЕЙГАР ТАРГАРИЕН" style="flex-grow: 1;">
            </div>
        </div>
        <div class="form-group">
            <label>Титул / Должность (strong)</label>
            <input type="text" id="g-title" placeholder="король Семи Королевств">
        </div>
    </div>

    <!-- НАГРАДЫ -->
    <h3>Награды (числа)</h3>
    <div class="row">
        <div class="form-group">
            <label>Активист</label>
            <input type="number" id="g-aw1" value="0">
        </div>
        <div class="form-group">
            <label>Постописец</label>
            <input type="number" id="g-aw2" value="0">
        </div>
        <div class="form-group">
            <label>Лучший эпизод</label>
            <input type="number" id="g-aw3" value="0">
        </div>
        <div class="form-group">
            <label>Лучший пост</label>
            <input type="number" id="g-aw4" value="0">
        </div>
    </div>

    <!-- СВЯЗИ (char-list) -->
    <h3>Связи персонажа (char-list)</h3>
    <div id="links-container"></div>
    <button class="btn-add" id="add-link-btn">+ Добавить персонажа</button>

    <!-- ИНВЕНТАРЬ -->
    <h3>Инвентарь (Вкладки)</h3>
    <div class="form-group">
        <label>Плашки (Вкладка 1) — ссылки на картинки</label>
        <textarea id="g-sm1"></textarea>
    </div>
    <div class="form-group">
        <label>Фоны (Вкладка 2) — ссылки на картинки</label>
        <textarea id="g-sm2"></textarea>
    </div>
    <div class="form-group">
        <label>Купоны (Вкладка 3) — HTML/текст</label>
        <textarea id="g-sm3"></textarea>
    </div>
    <div class="form-group">
        <label>Коллекции (Вкладка 4) — HTML/текст</label>
        <textarea id="g-sm4"></textarea>
    </div>

    <button class="btn-generate" id="generate-btn">СГЕНЕРИРОВАТЬ КОД</button>

    <div class="result-section">
        <h3>Готовый HTML-код:</h3>
        <textarea id="result-code" readonly></textarea>
    </div>
</div>

<script>
$(document).ready(function() {
   
    // --- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ---

    function addLinkField(url = '', name = '', isNpc = false) {
        const checkedStr = isNpc ? 'checked' : '';
        const linkHtml = `
            <div class="link-item">
                <input type="text" class="l-url" placeholder="URL профиля" value="${url}">
                <input type="text" class="l-name" placeholder="Имя (напр. БАРБРИ)" value="${name}">
                <label><input type="checkbox" class="l-npc" ${checkedStr}> Это NPC?</label>
                <button class="btn-remove">X</button>
            </div>
        `;
        $('#links-container').append(linkHtml);
    }

    addLinkField();

    $('#add-link-btn').click(function() { addLinkField(); });
    $(document).on('click', '.btn-remove', function() { $(this).closest('.link-item').remove(); });

    // ОБНОВЛЕННАЯ ФУНКЦИЯ: теперь передает вызов глобальной функции showCopyToast
    function parseImageUrlsToTags(text) {
        if (!text.trim()) return '';
        const urls = text.split('\n').map(url => url.trim()).filter(url => url !== '');
        return urls.map(url => {
            const cleanTag = `<img src="${url}">`;
            const safeTag = cleanTag.replace(/"/g, '&quot;');
            // Вызываем функцию showCopyToast при клике
            return `<img src="${url}" title="Скопировать код картинки" style="cursor: pointer; transition: transform 0.1s;" onclick="showCopyToast('${safeTag}', this)">`;
        }).join('\n');
    }

    // --- ЛОГИКА АНАЛИЗА (ИМПОРТ ИЗ HTML) ---
    $('#import-btn').click(function() {
        const importHtml = $('#import-code').val();
        if (!importHtml.trim()) {
            alert("Пожалуйста, вставьте код для импорта.");
            return;
        }

        try {
            const $temp = $('<div>').html(importHtml);

            const imgSrc = $temp.find('.char-img').attr('src');
            if (imgSrc) $('#g-img').val(imgSrc);

            const $heading = $temp.find('.char-card h1, .char-card h2, .char-card h3').first();
            if ($heading.length > 0) {
                $('#g-heading-tag').val($heading.prop('tagName').toLowerCase());
                $('#g-name').val($heading.text());
            }

            const title = $temp.find('.char-card > strong').first().text();
            if (title) $('#g-title').val(title);

            const $awards = $temp.find('.char-card-awards span strong');
            if ($awards.length >= 4) {
                $('#g-aw1').val($awards.eq(0).text());
                $('#g-aw2').val($awards.eq(1).text());
                $('#g-aw3').val($awards.eq(2).text());
                $('#g-aw4').val($awards.eq(3).text());
            }

            const $links = $temp.find('.char-list a');
            if ($links.length > 0) {
                $('#links-container').empty();
                $links.each(function() {
                    const url = $(this).attr('href');
                    const name = $(this).text();
                    const isNpc = $(this).hasClass('char-npc');
                    addLinkField(url, name, isNpc);
                });
            }

            const sm1Urls = [];
            $temp.find('#sm1 .char-content-wrap img').each(function() {
                sm1Urls.push($(this).attr('src'));
            });
            $('#g-sm1').val(sm1Urls.join('\n'));

            const sm2Urls = [];
            $temp.find('#sm2 .char-content-wrap img').each(function() {
                sm2Urls.push($(this).attr('src'));
            });
            $('#g-sm2').val(sm2Urls.join('\n'));

            const sm3Html = $temp.find('#sm3').html();
            if (sm3Html) $('#g-sm3').val(sm3Html.trim());

            const sm4Html = $temp.find('#sm4').html();
            if (sm4Html) $('#g-sm4').val(sm4Html.trim());

            $('#import-code').val('');
            alert("Код успешно разобран и загружен в форму!");

        } catch (e) {
            alert("Произошла ошибка при разборе кода. Убедитесь, что вы вставили корректный HTML.");
            console.error(e);
        }
    });

    // --- ЛОГИКА СИНТЕЗА (ГЕНЕРАЦИЯ HTML) ---
    $('#generate-btn').click(function() {
        const imgSrc = $('#g-img').val().trim();
        const hTag = $('#g-heading-tag').val();
        const name = $('#g-name').val().trim();
        const title = $('#g-title').val().trim();
       
        const aw1 = $('#g-aw1').val() || '0';
        const aw2 = $('#g-aw2').val() || '0';
        const aw3 = $('#g-aw3').val() || '0';
        const aw4 = $('#g-aw4').val() || '0';

        let linksCode = '';
        $('.link-item').each(function() {
            const url = $(this).find('.l-url').val().trim();
            const charName = $(this).find('.l-name').val().trim();
            const isNpc = $(this).find('.l-npc').is(':checked');
           
            if (url && charName) {
                const npcClass = isNpc ? ' class="char-npc"' : '';
                linksCode += `<a href="${url}"${npcClass}>${charName}</a>\n`;
            }
        });

        const sm1Tags = parseImageUrlsToTags($('#g-sm1').val());
        const sm2Tags = parseImageUrlsToTags($('#g-sm2').val());
        const sm3Text = $('#g-sm3').val();
        const sm4Text = $('#g-sm4').val();

        // ОБНОВЛЕНО: добавляем системный скрипт уведомлений в самый конец кода карточки
        const finalHtml = `<div class="character">

<div class="char-card">
<img src="${imgSrc}" class="char-img">

<${hTag}>${name}</${hTag}>
<strong>${title}</strong>
<div class="char-card-awards">
<span>активист <strong>${aw1}</strong></span>
<span>постописец <strong>${aw2}</strong></span>
<span>лучший эпизод <strong>${aw3}</strong></span>
<span>лучший пост <strong>${aw4}</strong></span>
</div>

<div class="char-list">
${linksCode.trim()}
</div>
</div>

<div class="char-inv">
    <div class="menu">
        <div class="menu-links">
        <span alt="#sm1" onclick='showTab(this);'>Плашки</span>
        <span alt="#sm2" onclick='showTab(this);'>Фоны</span>
        <span alt="#sm3" onclick='showTab(this);'>Купоны</span>
        <span alt="#sm4" onclick='showTab(this);'>Коллекции</span>
        </div>
    </div>
    <div id="submenu">
        <div id="sm1" class="submenutext" style="display:block;">
<div class="char-content-wrap">
${sm1Tags}
</div>
        </div>
        <div id="sm2" class="submenutext">
<div class="char-content-wrap">
${sm2Tags}
</div>
        </div>
        <div id="sm3" class="submenutext">
            ${sm3Text}
        </div>
        <div id="sm4" class="submenutext">
            ${sm4Text}
        </div>
    </div>
</div>
</div>`;

        $('#result-code').val(finalHtml);
    });
});
</script>
</body>
</html>[/html]

Подпись автора

серра блэкфайр
вдова иллирио мопатиса, мать эйгона блэкфайра

джон сноу
бастард рейгара и лианны, воспитанник эртура дейна, рыцарь

0

2

[html]<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Генератор и Парсер профиля персонажа v3</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<style>
    body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f5f7; color: #333; padding: 20px; }
    .generator-container { max-width: 900px; margin: 0 auto; background: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.05); }
    h1 { font-size: 24px; border-bottom: 2px solid #eee; padding-bottom: 10px; }
    h3 { font-size: 18px; margin-top: 25px; color: #444; border-left: 4px solid #2196f3; padding-left: 10px; }
   
    .import-section { background: #eaf4fc; padding: 20px; border-radius: 6px; border: 1px dashed #2196f3; margin-bottom: 30px; }
    .import-section p { margin-top: 0; font-size: 14px; color: #555; }
   
    .form-group { margin-bottom: 15px; }
    label { display: block; font-weight: bold; margin-bottom: 5px; font-size: 14px; color:#555; }
    input[type="text"], input[type="number"], textarea, select { width: 100%; padding: 10px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; font-family: inherit; }
    textarea { resize: vertical; min-height: 80px; }
    .row { display: flex; gap: 15px; align-items: flex-end; }
    .row .form-group { flex: 1; }
   
    .link-item, .col-item { display: flex; gap: 10px; align-items: center; background: #f9f9f9; padding: 10px; border: 1px solid #e0e0e0; border-radius: 4px; margin-bottom: 10px; }
    .link-item input[type="text"], .col-item input[type="text"] { flex: 2; }
    .link-item label { margin-bottom: 0; font-weight: normal; flex: 1; display: flex; align-items: center; gap: 5px;}
   
    .btn-action { color: white; border: none; padding: 10px 15px; border-radius: 4px; cursor: pointer; font-weight: bold; }
    .btn-remove { background: #ff4d4d; }
    .btn-add { background: #4caf50; margin-bottom: 20px; }
    .btn-import { background: #ff9800; width: 100%; margin-top: 10px; padding: 12px;}
    .btn-generate { background: #2196f3; width: 100%; margin-top: 30px; padding: 15px; font-size: 16px; }
    .btn-action:hover { filter: brightness(0.9); }
   
    .col-builder { background: #fafafa; padding: 15px; border: 1px solid #ddd; border-radius: 6px; margin-bottom: 15px; }
    .col-badge { display: inline-block; background: #2196f3; color: #fff; padding: 3px 8px; border-radius: 12px; font-size: 12px; font-weight: bold; width: 80px; text-align: center;}
   
    .result-section { margin-top: 30px; }
    #result-code { min-height: 300px; background: #2d2d2d; color: #f8f8f2; font-family: monospace; }
</style>
</head>
<body>

<div class="generator-container">
    <h1>Менеджер карточки персонажа v3</h1>

    <div class="import-section">
        <h3>Анализ готового кода (Импорт)</h3>
        <p>Вставьте сюда ранее сгенерированный HTML, чтобы загрузить данные обратно в форму.</p>
        <textarea id="import-code" placeholder="Вставьте HTML-код карточки..."></textarea>
        <button class="btn-action btn-import" id="import-btn">РАЗОБРАТЬ КОД</button>
    </div>

    <!-- Основные данные и Награды оставлены без изменений для краткости (они идентичны v2) -->
    <h3>Основные данные</h3>
    <div class="form-group"><label>URL изображения (аватар)</label><input type="text" id="g-img"></div>
    <div class="row">
        <div class="form-group">
            <label>Заголовок — Имя</label>
            <div style="display: flex; gap: 10px;">
                <select id="g-heading-tag" style="width: 80px;"><option value="h1">H1</option><option value="h2" selected>H2</option><option value="h3">H3</option></select>
                <input type="text" id="g-name" style="flex-grow: 1;">
            </div>
        </div>
        <div class="form-group"><label>Титул / Должность (strong)</label><input type="text" id="g-title"></div>
    </div>

    <h3>Награды</h3>
    <div class="row">
        <div class="form-group"><label>Активист</label><input type="number" id="g-aw1" value="0"></div>
        <div class="form-group"><label>Постописец</label><input type="number" id="g-aw2" value="0"></div>
        <div class="form-group"><label>Лучший эпизод</label><input type="number" id="g-aw3" value="0"></div>
        <div class="form-group"><label>Лучший пост</label><input type="number" id="g-aw4" value="0"></div>
    </div>

    <h3>Связи персонажа (char-list)</h3>
    <div id="links-container"></div>
    <button class="btn-action btn-add" id="add-link-btn">+ Добавить персонажа</button>

    <h3>Плашки и Подарки (Вкладка 1)</h3>
    <div class="form-group">
        <label>Плашки (ссылки на картинки, копируются как HTML)</label>
        <textarea id="g-sm1-plash"></textarea>
    </div>
    <div class="form-group">
        <label>Подарки (ссылки на картинки, просто картинки)</label>
        <textarea id="g-sm1-gifts"></textarea>
    </div>

    <h3>Фоны (Вкладка 2)</h3>
    <div class="form-group">
        <label>Фоны (ссылки на картинки, копируются как HTML)</label>
        <textarea id="g-sm2"></textarea>
    </div>

    <h3>Купоны (Вкладка 3)</h3>
    <div class="form-group">
        <label>Купоны (ссылки на картинки, копируются как BB-код --)</label>
        <textarea id="g-sm3"></textarea>
    </div>

    <h3>Коллекции (Вкладка 4 — Спойлеры)</h3>
    <div id="col-container"></div>
    <div class="col-builder">
        <label>Добавить новую картинку в коллекцию:</label>
        <div class="row">
            <div class="form-group" style="flex: 1;">
                <select id="new-col-cat">
                    <option value="Воин">Воин</option>
                    <option value="Матерь">Матерь</option>
                    <option value="Кузнец">Кузнец</option>
                    <option value="Дева">Дева</option>
                    <option value="Старица">Старица</option>
                    <option value="Неведомый">Неведомый</option>
                    <option value="Отец">Отец</option>
                </select>
            </div>
            <div class="form-group" style="flex: 2;">
                <input type="text" id="new-col-img" placeholder="URL картинки">
            </div>
            <div class="form-group" style="flex: 2;">
                <input type="text" id="new-col-link" placeholder="URL внешней ссылки 'подробнее'">
            </div>
            <button class="btn-action btn-add" id="add-col-btn" style="margin-bottom:0;">Добавить</button>
        </div>
    </div>

    <button class="btn-action btn-generate" id="generate-btn">СГЕНЕРИРОВАТЬ КОД</button>

    <div class="result-section">
        <textarea id="result-code" readonly></textarea>
    </div>
</div>

<script>
$(document).ready(function() {
   
    // --- УПРАВЛЕНИЕ СВЯЗЯМИ ---
    function addLinkField(url = '', name = '', isNpc = false) {
        const checked = isNpc ? 'checked' : '';
        $('#links-container').append(`
            <div class="link-item">
                <input type="text" class="l-url" placeholder="URL профиля" value="${url}">
                <input type="text" class="l-name" placeholder="Имя (напр. БАРБРИ)" value="${name}">
                <label><input type="checkbox" class="l-npc" ${checked}> NPC?</label>
                <button class="btn-action btn-remove">X</button>
            </div>
        `);
    }
    $('#add-link-btn').click(function() { addLinkField(); });
    $(document).on('click', '.link-item .btn-remove', function() { $(this).closest('.link-item').remove(); });

    // --- УПРАВЛЕНИЕ КОЛЛЕКЦИЯМИ (Вкладка 4) ---
    function addColField(cat, imgUrl, extLink) {
        if(!imgUrl) return;
        $('#col-container').append(`
            <div class="col-item" data-cat="${cat}">
                <span class="col-badge">${cat}</span>
                <input type="text" class="c-img" value="${imgUrl}" placeholder="URL картинки">
                <input type="text" class="c-link" value="${extLink}" placeholder="Внешняя ссылка">
                <button class="btn-action btn-remove">X</button>
            </div>
        `);
    }
    $('#add-col-btn').click(function() {
        const cat = $('#new-col-cat').val();
        const img = $('#new-col-img').val().trim();
        const link = $('#new-col-link').val().trim();
        addColField(cat, img, link);
        $('#new-col-img').val(''); $('#new-col-link').val(''); // очищаем поля после добавления
    });
    $(document).on('click', '.col-item .btn-remove', function() { $(this).closest('.col-item').remove(); });

    // Инициализация пустых полей при старте
    addLinkField();

   // --- ПАРСЕР ИЗОБРАЖЕНИЙ (С ПОДДЕРЖКОЙ BB-КОДА) ---
    function parseImageUrlsToTags(text, copyMode = 'none') {
        if (!text.trim()) return '';
        const urls = text.split('\n').map(url => url.trim()).filter(url => url !== '');
        return urls.map(url => {
            if (copyMode === 'none') {
                return `<img src="${url}">`;
            }
           
            let jsStringArg = '';
            if (copyMode === 'html') {
                // Экранируем кавычки для HTML
                const safeTag = `<img src="${url}">`.replace(/"/g, '&quot;');
                jsStringArg = `'${safeTag}'`;
            } else if (copyMode === 'bbcode') {
                // Хитрость: разрываем BB-код на части.
                // Форум видит '+' и не трогает код, а браузер в момент клика
                // склеивает его обратно в идеальный --
                jsStringArg = `'[' + 'img]${url}[' + '/img]'`;
            }
           
            return `<img src="${url}" title="Скопировать код" style="cursor: pointer; transition: transform 0.1s;" onclick="showCopyToast(${jsStringArg}, this)">`;
        }).join('\n');
    }

    // --- ИМПОРТ ИЗ HTML ---
    $('#import-btn').click(function() {
        const html = $('#import-code').val();
        if (!html.trim()) return alert("Вставьте код.");

        try {
            const $temp = $('<div>').html(html);

            $('#g-img').val($temp.find('.char-img').attr('src') || '');
            const $heading = $temp.find('.char-card h1, .char-card h2, .char-card h3').first();
            if ($heading.length) {
                $('#g-heading-tag').val($heading.prop('tagName').toLowerCase());
                $('#g-name').val($heading.text());
            }
            $('#g-title').val($temp.find('.char-card > strong').first().text() || '');

            const $aw = $temp.find('.char-card-awards span strong');
            if ($aw.length >= 4) {
                $('#g-aw1').val($aw.eq(0).text()); $('#g-aw2').val($aw.eq(1).text());
                $('#g-aw3').val($aw.eq(2).text()); $('#g-aw4').val($aw.eq(3).text());
            }

            const $links = $temp.find('.char-list a');
            if ($links.length) {
                $('#links-container').empty();
                $links.each(function() { addLinkField($(this).attr('href'), $(this).text(), $(this).hasClass('char-npc')); });
            }

            // Чтение вкладок 1-3
            $('#g-sm1-plash').val($temp.find('#sm1 .char-content-plash img').map(function(){ return $(this).attr('src'); }).get().join('\n'));
            $('#g-sm1-gifts').val($temp.find('#sm1 .char-content-gifts img').map(function(){ return $(this).attr('src'); }).get().join('\n'));
            $('#g-sm2').val($temp.find('#sm2 .char-content-wrap img').map(function(){ return $(this).attr('src'); }).get().join('\n'));
            $('#g-sm3').val($temp.find('#sm3 .char-content-wrap img').map(function(){ return $(this).attr('src'); }).get().join('\n'));

            // Умное чтение Коллекций (вкладка 4)
            $('#col-container').empty();
            $temp.find('#sm4 details').each(function() {
                const cat = $(this).find('summary').text().trim();
                $(this).find('.char-spoiler-content > div, .char-spoiler-content > img').each(function() {
                    if ($(this).hasClass('sm4-item')) {
                        addColField(cat, $(this).find('img').attr('src'), $(this).find('a').attr('href'));
                    } else if ($(this).is('img')) {
                        // Поддержка импорта старой верстки без ссылок
                        addColField(cat, $(this).attr('src'), '');
                    }
                });
            });

            $('#import-code').val('');
            alert("Код успешно загружен!");
        } catch (e) { alert("Ошибка разбора кода."); console.error(e); }
    });

    // --- ГЕНЕРАЦИЯ HTML ---
    $('#generate-btn').click(function() {
        const imgSrc = $('#g-img').val().trim();
        const hTag = $('#g-heading-tag').val();
        const name = $('#g-name').val().trim();
        const title = $('#g-title').val().trim();
        const aw = [$('#g-aw1').val()||'0', $('#g-aw2').val()||'0', $('#g-aw3').val()||'0', $('#g-aw4').val()||'0'];

        let linksCode = '';
        $('.link-item').each(function() {
            const u = $(this).find('.l-url').val().trim(), n = $(this).find('.l-name').val().trim();
            if (u && n) linksCode += `<a href="${u}"${$(this).find('.l-npc').is(':checked') ? ' class="char-npc"' : ''}>${n}</a>\n`;
        });

        const sm1Plash = parseImageUrlsToTags($('#g-sm1-plash').val(), 'html');
        const sm1Gifts = parseImageUrlsToTags($('#g-sm1-gifts').val(), 'none'); // Подарки не копируются по клику
        const sm2Tags = parseImageUrlsToTags($('#g-sm2').val(), 'html');
        const sm3Tags = parseImageUrlsToTags($('#g-sm3').val(), 'bbcode'); // Купоны копируются как BB-код

        // Сборка коллекций #sm4
        const catNames = ["Воин", "Матерь", "Кузнец", "Дева", "Старица", "Неведомый", "Отец"];
        let sm4Html = '<div class="char-content-wrap">\n';
       
        catNames.forEach(cat => {
            sm4Html += `<details class="char-spoiler">\n  <summary class="char-spoiler-title">${cat}</summary>\n  <div class="char-spoiler-content">\n`;
           
            $('.col-item').each(function() {
                if ($(this).data('cat') === cat) {
                    const i = $(this).find('.c-img').val().trim();
                    const l = $(this).find('.c-link').val().trim();
                   
                    sm4Html += `
<div class="sm4-item" style="position:relative; display:inline-block; margin:2px;" onmouseenter="var a=this.querySelector('.sm4-more'); if(a) a.style.display='flex';" onmouseleave="var a=this.querySelector('.sm4-more'); if(a) a.style.display='none';">
    <img src="${i}" style="cursor:zoom-in;" onclick="openCharModal('${i}')">
    ${l ? `<a href="${l}" target="_blank" class="sm4-more" style="position:absolute; top:5px; left:5px; background:rgba(0,0,0,0.7); color:#fff; padding:4px 8px; font-size:12px; text-decoration:none; border-radius:3px; display:none; align-items:center; gap:5px; font-family:sans-serif; box-shadow:0 2px 5px rgba(0,0,0,0.3);">
        <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line></svg>
        подробнее
    </a>` : ''}
</div>\n`;
                }
            });
            sm4Html += `  </div>\n</details>\n`;
        });
        sm4Html += '</div>';

        const finalHtml = `<div class="character">

<div class="char-card">
<img src="${imgSrc}" class="char-img">

<${hTag}>${name}</${hTag}>
<strong>${title}</strong>
<div class="char-card-awards">
<span>активист <strong>${aw[0]}</strong></span>
<span>постописец <strong>${aw[1]}</strong></span>
<span>лучший эпизод <strong>${aw[2]}</strong></span>
<span>лучший пост <strong>${aw[3]}</strong></span>
</div>

<div class="char-list">
${linksCode.trim()}
</div>
</div>

<div class="char-inv">
    <div class="menu">
        <div class="menu-links">
        <span alt="#sm1" onclick='showTab(this);'>Плашки и подарки</span>
        <span alt="#sm2" onclick='showTab(this);'>Фоны</span>
        <span alt="#sm3" onclick='showTab(this);'>Купоны</span>
        <span alt="#sm4" onclick='showTab(this);'>Коллекции</span>
        </div>
    </div>
    <div id="submenu">
        <div id="sm1" class="submenutext" style="display:block;">
<div class="char-content-wrap">
<div class="char-content-plash">
${sm1Plash}
</div>
<div class="char-content-gifts">
${sm1Gifts}
</div>
</div>
        </div>
        <div id="sm2" class="submenutext">
<div class="char-content-wrap">
${sm2Tags}
</div>
        </div>
        <div id="sm3" class="submenutext">
<div class="char-content-wrap">
${sm3Tags}
</div>
        </div>
        <div id="sm4" class="submenutext">
${sm4Html}
        </div>
    </div>
</div>
</div>`;

        $('#result-code').val(finalHtml);
    });
});
</script>
</body>
</html>[/html]

Подпись автора

серра блэкфайр
вдова иллирио мопатиса, мать эйгона блэкфайра

джон сноу
бастард рейгара и лианны, воспитанник эртура дейна, рыцарь

0

3

[html]<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Генератор и Парсер профиля персонажа v4</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<style>
    body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f5f7; color: #333; padding: 20px; }
    .generator-container { max-width: 900px; margin: 0 auto; background: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.05); }
    h1 { font-size: 24px; border-bottom: 2px solid #eee; padding-bottom: 10px; }
    h3 { font-size: 18px; margin-top: 25px; color: #444; border-left: 4px solid #2196f3; padding-left: 10px; }
   
    .import-section { background: #eaf4fc; padding: 20px; border-radius: 6px; border: 1px dashed #2196f3; margin-bottom: 30px; }
    .import-section p { margin-top: 0; font-size: 14px; color: #555; }
   
    .form-group { margin-bottom: 15px; }
    label { display: block; font-weight: bold; margin-bottom: 5px; font-size: 14px; color:#555; }
    input[type="text"], input[type="number"], textarea, select { width: 100%; padding: 10px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; font-family: inherit; }
    textarea { resize: vertical; min-height: 80px; }
    .row { display: flex; gap: 15px; align-items: flex-end; }
    .row .form-group { flex: 1; }
   
    .link-item, .col-item, .gift-item { display: flex; gap: 10px; align-items: center; background: #f9f9f9; padding: 10px; border: 1px solid #e0e0e0; border-radius: 4px; margin-bottom: 10px; }
    .link-item input[type="text"], .col-item input[type="text"], .gift-item input[type="text"] { flex: 2; }
    .link-item label { margin-bottom: 0; font-weight: normal; flex: 1; display: flex; align-items: center; gap: 5px;}
   
    .btn-action { color: white; border: none; padding: 10px 15px; border-radius: 4px; cursor: pointer; font-weight: bold; }
    .btn-remove { background: #ff4d4d; }
    .btn-add { background: #4caf50; margin-bottom: 20px; }
    .btn-import { background: #ff9800; width: 100%; margin-top: 10px; padding: 12px;}
    .btn-generate { background: #2196f3; width: 100%; margin-top: 30px; padding: 15px; font-size: 16px; }
    .btn-action:hover { filter: brightness(0.9); }
   
    .col-builder { background: #fafafa; padding: 15px; border: 1px solid #ddd; border-radius: 6px; margin-bottom: 15px; }
    .col-badge { display: inline-block; background: #2196f3; color: #fff; padding: 3px 8px; border-radius: 12px; font-size: 12px; font-weight: bold; width: 80px; text-align: center;}
   
    .result-section { margin-top: 30px; }
    #result-code { min-height: 300px; background: #2d2d2d; color: #f8f8f2; font-family: monospace; }
</style>
</head>
<body>

<div class="generator-container">
    <h1>Менеджер карточки персонажа v4</h1>

    <div class="import-section">
        <h3>Анализ готового кода (Импорт)</h3>
        <textarea id="import-code" placeholder="Вставьте HTML-код карточки..."></textarea>
        <button class="btn-action btn-import" id="import-btn">РАЗОБРАТЬ КОД</button>
    </div>

    <h3>Основные данные</h3>
    <div class="form-group"><label>URL изображения (аватар)</label><input type="text" id="g-img"></div>
    <div class="row">
        <div class="form-group">
            <label>Заголовок — Имя</label>
            <div style="display: flex; gap: 10px;">
                <select id="g-heading-tag" style="width: 80px;"><option value="h1">H1</option><option value="h2" selected>H2</option><option value="h3">H3</option></select>
                <input type="text" id="g-name" style="flex-grow: 1;">
            </div>
        </div>
        <div class="form-group"><label>Титул / Должность (strong)</label><input type="text" id="g-title"></div>
    </div>

    <h3>Награды</h3>
    <div class="row">
        <div class="form-group"><label>Активист</label><input type="number" id="g-aw1" value="0"></div>
        <div class="form-group"><label>Постописец</label><input type="number" id="g-aw2" value="0"></div>
        <div class="form-group"><label>Лучший эпизод</label><input type="number" id="g-aw3" value="0"></div>
        <div class="form-group"><label>Лучший пост</label><input type="number" id="g-aw4" value="0"></div>
    </div>

    <h3>Связи персонажа (char-list)</h3>
    <div id="links-container"></div>
    <button class="btn-action btn-add" id="add-link-btn">+ Добавить персонажа</button>

    <h3>Плашки и Подарки (Вкладка 1)</h3>
    <div class="form-group">
        <label>Плашки (ссылки на картинки, копируются как HTML)</label>
        <textarea id="g-sm1-plash"></textarea>
    </div>
   
    <!-- НОВЫЙ БЛОК: КОНСТРУКТОР ПОДАРКОВ -->
    <div class="form-group"><label>Подарки (копируют чистый URL)</label></div>
    <div id="gifts-container"></div>
    <div class="col-builder">
        <label>Добавить новый подарок:</label>
        <div class="row">
            <div class="form-group" style="flex: 2;">
                <input type="text" id="new-gift-img" placeholder="URL картинки подарка">
            </div>
            <div class="form-group" style="flex: 2;">
                <input type="text" id="new-gift-title" placeholder="Комментарий (title)">
            </div>
            <button class="btn-action btn-add" id="add-gift-btn" style="margin-bottom:0;">Добавить</button>
        </div>
    </div>

    <h3>Фоны (Вкладка 2)</h3>
    <div class="form-group">
        <label>Фоны (ссылки на картинки, копируются как HTML)</label>
        <textarea id="g-sm2"></textarea>
    </div>

    <h3>Купоны (Вкладка 3)</h3>
    <div class="form-group">
        <label>Купоны (ссылки на картинки, копируются как BB-код --)</label>
        <textarea id="g-sm3"></textarea>
    </div>

    <h3>Коллекции (Вкладка 4 — Спойлеры)</h3>
    <div id="col-container"></div>
    <div class="col-builder">
        <label>Добавить новую картинку в коллекцию:</label>
        <div class="row">
            <div class="form-group" style="flex: 1;">
                <select id="new-col-cat">
                    <option value="Воин">Воин</option>
                    <option value="Матерь">Матерь</option>
                    <option value="Кузнец">Кузнец</option>
                    <option value="Дева">Дева</option>
                    <option value="Старица">Старица</option>
                    <option value="Неведомый">Неведомый</option>
                    <option value="Отец">Отец</option>
                </select>
            </div>
            <div class="form-group" style="flex: 2;">
                <input type="text" id="new-col-img" placeholder="URL картинки">
            </div>
            <div class="form-group" style="flex: 2;">
                <input type="text" id="new-col-link" placeholder="URL внешней ссылки 'подробнее'">
            </div>
            <button class="btn-action btn-add" id="add-col-btn" style="margin-bottom:0;">Добавить</button>
        </div>
    </div>

    <button class="btn-action btn-generate" id="generate-btn">СГЕНЕРИРОВАТЬ КОД</button>

    <div class="result-section">
        <textarea id="result-code" readonly></textarea>
    </div>
</div>

<script>
$(document).ready(function() {
   
    // --- УПРАВЛЕНИЕ СВЯЗЯМИ ---
    function addLinkField(url = '', name = '', isNpc = false) {
        const checked = isNpc ? 'checked' : '';
        $('#links-container').append(`
            <div class="link-item">
                <input type="text" class="l-url" placeholder="URL профиля" value="${url}">
                <input type="text" class="l-name" placeholder="Имя (напр. БАРБРИ)" value="${name}">
                <label><input type="checkbox" class="l-npc" ${checked}> NPC?</label>
                <button class="btn-action btn-remove">X</button>
            </div>
        `);
    }
    $('#add-link-btn').click(function() { addLinkField(); });
    $(document).on('click', '.link-item .btn-remove', function() { $(this).closest('.link-item').remove(); });
    addLinkField();

    // --- УПРАВЛЕНИЕ ПОДАРКАМИ ---
    function addGiftField(imgUrl = '', title = '') {
        if(!imgUrl) return;
        $('#gifts-container').append(`
            <div class="gift-item">
                <input type="text" class="g-img" value="${imgUrl}" placeholder="URL картинки">
                <input type="text" class="g-title" value="${title}" placeholder="Комментарий (необязательно)">
                <button class="btn-action btn-remove">X</button>
            </div>
        `);
    }
    $('#add-gift-btn').click(function() {
        const img = $('#new-gift-img').val().trim();
        const title = $('#new-gift-title').val().trim();
        addGiftField(img, title);
        $('#new-gift-img').val(''); $('#new-gift-title').val('');
    });
    $(document).on('click', '.gift-item .btn-remove', function() { $(this).closest('.gift-item').remove(); });

    // --- УПРАВЛЕНИЕ КОЛЛЕКЦИЯМИ ---
    function addColField(cat, imgUrl, extLink) {
        if(!imgUrl) return;
        $('#col-container').append(`
            <div class="col-item" data-cat="${cat}">
                <span class="col-badge">${cat}</span>
                <input type="text" class="c-img" value="${imgUrl}" placeholder="URL картинки">
                <input type="text" class="c-link" value="${extLink}" placeholder="Внешняя ссылка">
                <button class="btn-action btn-remove">X</button>
            </div>
        `);
    }
    $('#add-col-btn').click(function() {
        const cat = $('#new-col-cat').val();
        const img = $('#new-col-img').val().trim();
        const link = $('#new-col-link').val().trim();
        addColField(cat, img, link);
        $('#new-col-img').val(''); $('#new-col-link').val('');
    });
    $(document).on('click', '.col-item .btn-remove', function() { $(this).closest('.col-item').remove(); });

    // --- ПАРСЕР ИЗОБРАЖЕНИЙ ---
    function parseImageUrlsToTags(text, copyMode = 'none') {
        if (!text.trim()) return '';
        const urls = text.split('\n').map(url => url.trim()).filter(url => url !== '');
        return urls.map(url => {
            if (copyMode === 'none') return `<img src="${url}">`;
           
            let jsStringArg = '';
            if (copyMode === 'html') {
                const safeTag = `<img src="${url}">`.replace(/"/g, '&quot;');
                jsStringArg = `'${safeTag}'`;
            } else if (copyMode === 'bbcode') {
                jsStringArg = `'[' + 'img]${url}[' + '/img]'`;
            }
           
            return `<img src="${url}" title="Скопировать код" style="cursor: pointer; transition: transform 0.1s;" onclick="showCopyToast(${jsStringArg}, this)">`;
        }).join('\n');
    }

    // --- ИМПОРТ ИЗ HTML ---
    $('#import-btn').click(function() {
        const html = $('#import-code').val();
        if (!html.trim()) return alert("Вставьте код.");

        try {
            const $temp = $('<div>').html(html);

            $('#g-img').val($temp.find('.char-img').attr('src') || '');
            const $heading = $temp.find('.char-card h1, .char-card h2, .char-card h3').first();
            if ($heading.length) {
                $('#g-heading-tag').val($heading.prop('tagName').toLowerCase());
                $('#g-name').val($heading.text());
            }
            $('#g-title').val($temp.find('.char-card > strong').first().text() || '');

            const $aw = $temp.find('.char-card-awards span strong');
            if ($aw.length >= 4) {
                $('#g-aw1').val($aw.eq(0).text()); $('#g-aw2').val($aw.eq(1).text());
                $('#g-aw3').val($aw.eq(2).text()); $('#g-aw4').val($aw.eq(3).text());
            }

            const $links = $temp.find('.char-list a');
            if ($links.length) {
                $('#links-container').empty();
                $links.each(function() { addLinkField($(this).attr('href'), $(this).text(), $(this).hasClass('char-npc')); });
            }

            // Чтение вкладок 1-3
            $('#g-sm1-plash').val($temp.find('#sm1 .char-content-plash img').map(function(){ return $(this).attr('src'); }).get().join('\n'));
           
            // Чтение Подарков
            $('#gifts-container').empty();
            $temp.find('#sm1 .char-content-gifts img').each(function() {
                addGiftField($(this).attr('src'), $(this).attr('title') || '');
            });

            $('#g-sm2').val($temp.find('#sm2 .char-content-wrap img').map(function(){ return $(this).attr('src'); }).get().join('\n'));
            $('#g-sm3').val($temp.find('#sm3 .char-content-wrap img').map(function(){ return $(this).attr('src'); }).get().join('\n'));

            // Чтение Коллекций
            $('#col-container').empty();
            $temp.find('#sm4 details').each(function() {
                const cat = $(this).find('summary').text().trim();
                $(this).find('.char-spoiler-content > div, .char-spoiler-content > img').each(function() {
                    if ($(this).hasClass('sm4-item')) {
                        addColField(cat, $(this).find('img').attr('src'), $(this).find('a').attr('href'));
                    } else if ($(this).is('img')) {
                        addColField(cat, $(this).attr('src'), '');
                    }
                });
            });

            $('#import-code').val('');
            alert("Код успешно загружен!");
        } catch (e) { alert("Ошибка разбора кода."); console.error(e); }
    });

    // --- ГЕНЕРАЦИЯ HTML ---
    $('#generate-btn').click(function() {
        const imgSrc = $('#g-img').val().trim();
        const hTag = $('#g-heading-tag').val();
        const name = $('#g-name').val().trim();
        const title = $('#g-title').val().trim();
        const aw = [$('#g-aw1').val()||'0', $('#g-aw2').val()||'0', $('#g-aw3').val()||'0', $('#g-aw4').val()||'0'];

        let linksCode = '';
        $('.link-item').each(function() {
            const u = $(this).find('.l-url').val().trim(), n = $(this).find('.l-name').val().trim();
            if (u && n) linksCode += `<a href="${u}"${$(this).find('.l-npc').is(':checked') ? ' class="char-npc"' : ''}>${n}</a>\n`;
        });

        const sm1Plash = parseImageUrlsToTags($('#g-sm1-plash').val(), 'html');
       
        // Сборка Подарков
        let sm1Gifts = '';
        $('.gift-item').each(function() {
            const i = $(this).find('.g-img').val().trim();
            const t = $(this).find('.g-title').val().trim();
            if (i) {
                const titleAttr = t ? ` title="${t.replace(/"/g, '&quot;')}"` : '';
                // Передаем чистый URL (переменная i) в showCopyToast
                sm1Gifts += `<img src="${i}"${titleAttr} style="cursor: pointer; transition: transform 0.1s;" onclick="showCopyToast('${i}', this)">\n`;
            }
        });

        const sm2Tags = parseImageUrlsToTags($('#g-sm2').val(), 'html');
        const sm3Tags = parseImageUrlsToTags($('#g-sm3').val(), 'bbcode');

        // Сборка Коллекций
        const catNames = ["Воин", "Матерь", "Кузнец", "Дева", "Старица", "Неведомый", "Отец"];
        let sm4Html = '<div class="char-content-wrap">\n';
       
        catNames.forEach(cat => {
            sm4Html += `<details class="char-spoiler">\n  <summary class="char-spoiler-title">${cat}</summary>\n  <div class="char-spoiler-content">\n`;
           
            $('.col-item').each(function() {
                if ($(this).data('cat') === cat) {
                    const i = $(this).find('.c-img').val().trim();
                    const l = $(this).find('.c-link').val().trim();
                   
                    sm4Html += `
<div class="sm4-item" style="position:relative; display:inline-block; margin:2px;" onmouseenter="var a=this.querySelector('.sm4-more'); if(a) a.style.display='flex';" onmouseleave="var a=this.querySelector('.sm4-more'); if(a) a.style.display='none';">
    <img src="${i}" style="cursor:zoom-in;" onclick="openCharModal('${i}')">
    ${l ? `<a href="${l}" target="_blank" class="sm4-more" style="position:absolute; top:5px; left:5px; background:rgba(0,0,0,0.7); color:#fff; padding:4px 8px; font-size:12px; text-decoration:none; border-radius:3px; display:none; align-items:center; gap:5px; font-family:sans-serif; box-shadow:0 2px 5px rgba(0,0,0,0.3);">
        <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line></svg>
        подробнее
    </a>` : ''}
</div>\n`;
                }
            });
            sm4Html += `  </div>\n</details>\n`;
        });
        sm4Html += '</div>';

        const finalHtml = `<div class="character">

<div class="char-card">
<img src="${imgSrc}" class="char-img">

<${hTag}>${name}</${hTag}>
<strong>${title}</strong>
<div class="char-card-awards">
<span>активист <strong>${aw[0]}</strong></span>
<span>постописец <strong>${aw[1]}</strong></span>
<span>лучший эпизод <strong>${aw[2]}</strong></span>
<span>лучший пост <strong>${aw[3]}</strong></span>
</div>

<div class="char-list">
${linksCode.trim()}
</div>
</div>

<div class="char-inv">
    <div class="menu">
        <div class="menu-links">
        <span alt="#sm1" onclick='showTab(this);'>Плашки и подарки</span>
        <span alt="#sm2" onclick='showTab(this);'>Фоны</span>
        <span alt="#sm3" onclick='showTab(this);'>Купоны</span>
        <span alt="#sm4" onclick='showTab(this);'>Коллекции</span>
        </div>
    </div>
    <div id="submenu">
        <div id="sm1" class="submenutext" style="display:block;">
<div class="char-content-wrap">
<div class="char-content-plash">
${sm1Plash}
</div>
<div class="char-content-gifts">
${sm1Gifts}
</div>
</div>
        </div>
        <div id="sm2" class="submenutext">
<div class="char-content-wrap">
${sm2Tags}
</div>
        </div>
        <div id="sm3" class="submenutext">
<div class="char-content-wrap">
${sm3Tags}
</div>
        </div>
        <div id="sm4" class="submenutext">
${sm4Html}
        </div>
    </div>
</div>
</div>`;

        $('#result-code').val(finalHtml);
    });
});
</script>
</body>
</html>[/html]

Подпись автора

серра блэкфайр
вдова иллирио мопатиса, мать эйгона блэкфайра

джон сноу
бастард рейгара и лианны, воспитанник эртура дейна, рыцарь

0


Вы здесь » ASOIAF. A Dream of Spring » a dance with dragons » генератор кода лз


Рейтинг форумов | Создать форум бесплатно

≡
Полезные ссылки
⚙
Настройки
×