Mediawiki:scmcchemistry.js

Вернуться

Строка 38: Строка 38:
         Toxin: 'токсического урона'
         Toxin: 'токсического урона'
     };
     };
    /*
    * Смысловые фрагменты в описаниях эффектов. Цвет не заменяет текст:
    * он лишь помогает быстро отличить лечение, вред и конкретный тип урона.
    */
    var EFFECT_TOKEN_RE = /(урона от кислородного голодания|урона от кровопотери|полностью лечит|дополнительно наносит|восстанавливает жизнеспособность|создаёт иммунитет|восстанавливает|возвращает|омолаживает|сокращает|удаляет|лечит|наносит|вызывает|заражает|поджигает|уничтожает|расходует|замедляет|снижает|повышает|механического(?: урона)?|тупого(?: урона)?|колотого(?: урона)?|режущего(?: урона)?|термического(?: урона)?|ожогового(?: урона)?|холодового(?: урона)?|токсического(?: урона)?|кислотного(?: урона)?|генетического(?: урона)?|клеточного(?: урона)?|радиационного(?: урона)?)/gi;
    var EFFECT_ACTION_CLASSES = {
        'полностью лечит': 'beneficial',
        'лечит': 'beneficial',
        'восстанавливает': 'beneficial',
        'восстанавливает жизнеспособность': 'beneficial',
        'возвращает': 'beneficial',
        'омолаживает': 'beneficial',
        'сокращает': 'beneficial',
        'удаляет': 'beneficial',
        'создаёт иммунитет': 'beneficial',
        'наносит': 'harmful',
        'дополнительно наносит': 'harmful',
        'вызывает': 'harmful',
        'заражает': 'harmful',
        'поджигает': 'harmful',
        'уничтожает': 'harmful',
        'расходует': 'warning',
        'замедляет': 'warning',
        'снижает': 'utility',
        'повышает': 'utility'
    };
    var DAMAGE_TOKEN_CLASSES = [
        { pattern: /кислородного голодания|кровопотери/, className: 'oxygen' },
        { pattern: /механического|тупого|колотого|режущего/, className: 'physical' },
        { pattern: /термического|ожогового/, className: 'burn' },
        { pattern: /холодового/, className: 'cold' },
        { pattern: /токсического/, className: 'toxin' },
        { pattern: /кислотного/, className: 'acid' },
        { pattern: /генетического/, className: 'genetic' },
        { pattern: /клеточного/, className: 'cellular' },
        { pattern: /радиационного/, className: 'radiation' }
    ];


     var STATUS_LABELS = {
     var STATUS_LABELS = {
Строка 605: Строка 645:


         return [doseDescription(tier, withChance(text, probability))];
         return [doseDescription(tier, withChance(text, probability))];
    }
    function semanticTokenClass(token) {
        var normalized = String(token || '').toLocaleLowerCase('ru-RU');
        var actionClass = EFFECT_ACTION_CLASSES[normalized];
        if (actionClass) {
            return 'scmc-chem__effect-action scmc-chem__effect-action--' + actionClass;
        }
        for (var index = 0; index < DAMAGE_TOKEN_CLASSES.length; index += 1) {
            if (DAMAGE_TOKEN_CLASSES[index].pattern.test(normalized)) {
                return 'scmc-chem__damage-type scmc-chem__damage-type--' + DAMAGE_TOKEN_CLASSES[index].className;
            }
        }
        return '';
    }
    function effectTone(text) {
        var value = String(text || '').toLocaleLowerCase('ru-RU');
        var beneficial = value.search(/полностью лечит|лечит|восстанавливает|возвращает|омолаживает|сокращает|удаляет|создаёт иммунитет/);
        var harmful = value.search(/наносит|вызывает|заражает|поджигает|уничтожает/);
        var warning = value.search(/расходует|замедляет/);
        var candidates = [];
        if (beneficial !== -1) {
            candidates.push({ index: beneficial, tone: 'beneficial' });
        }
        if (harmful !== -1) {
            candidates.push({ index: harmful, tone: 'harmful' });
        }
        if (warning !== -1) {
            candidates.push({ index: warning, tone: 'warning' });
        }
        candidates.sort(function (left, right) {
            return left.index - right.index;
        });
        return candidates.length ? candidates[0].tone : 'utility';
    }
    function appendSemanticEffectText(parent, text) {
        var value = finishSentence(text);
        var lastIndex = 0;
        var match;
        EFFECT_TOKEN_RE.lastIndex = 0;
        while ((match = EFFECT_TOKEN_RE.exec(value)) !== null) {
            if (match.index > lastIndex) {
                parent.appendChild(document.createTextNode(value.slice(lastIndex, match.index)));
            }
            var className = semanticTokenClass(match[0]);
            parent.appendChild(className
                ? element('span', className, match[0])
                : document.createTextNode(match[0]));
            lastIndex = EFFECT_TOKEN_RE.lastIndex;
        }
        if (lastIndex < value.length) {
            parent.appendChild(document.createTextNode(value.slice(lastIndex)));
        }
     }
     }


     function renderEffectText(text) {
     function renderEffectText(text) {
         var item = element('li', 'scmc-chem__effect');
        var tone = effectTone(text);
         item.appendChild(element('span', 'scmc-chem__effect-name', finishSentence(text)));
         var item = element('li', 'scmc-chem__effect scmc-chem__effect--' + tone);
         var content = element('span', 'scmc-chem__effect-name');
        appendSemanticEffectText(content, text);
        item.appendChild(content);
         return item;
         return item;
     }
     }