Mediawiki:common.js

Вернуться

Строка 112: Строка 112:


         MediaWikiTooltips.load(function () {
         MediaWikiTooltips.load(function () {
             var lawData = LawTooltipsModule.extractLawData();
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);
             var lawData = LawTooltipsModule.extractLawData(linkCodes);
             LawTooltipsModule.initCellTooltips(tableCells, lawData);
             LawTooltipsModule.initCellTooltips(tableCells, lawData);
         });
         });
     },
     },


     extractLawData: function () {
    collectLinkCodes: function (tableCells) {
        var codes = new Set();
 
        tableCells.forEach(function (cell) {
            var link = cell.querySelector('a[href^="#"]');
            if (!link) return;
 
            var href = link.getAttribute('href') || '';
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);
            if (!rawCode) return;
 
            codes.add(rawCode);
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));
            codes.add(LawTooltipsModule.toSectionCode(rawCode));
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));
        });
 
        return codes;
    },
 
     extractLawData: function (expectedCodes) {
         var lawData = {};
         var lawData = {};
         var crimeIdSpans = document.querySelectorAll('table.wikitable span[id^="§_"]');
         var crimeIdSpans = document.querySelectorAll('span[id]');


         crimeIdSpans.forEach(function (span) {
         crimeIdSpans.forEach(function (span) {
             var lawCode = span.id;
             var rawId = (span.id || '').trim();
             if (!lawCode) return;
             if (!rawId) return;
 
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);
 
            if (expectedCodes && expectedCodes.size > 0) {
                var isExpected =
                    expectedCodes.has(rawId) ||
                    expectedCodes.has(normalizedId) ||
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));
 
                if (!isExpected) return;
            }


             var tr = span.closest('tr');
             var tr = span.closest('tr');
Строка 135: Строка 168:
             var exampleCell = cells[2];
             var exampleCell = cells[2];


             var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell);
             var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);
             if (!title) return;
             if (!title) return;


Строка 141: Строка 174:
             var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);
             var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);


             lawData[lawCode] = {
             var payload = {
                 title: title,
                 title: title,
                 description: description,
                 description: description,
                 examples: examples
                 examples: examples,
                sourceCode: rawId
             };
             };
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);
         });
         });


Строка 151: Строка 187:
     },
     },


     extractTitleFromCrimeCell: function (crimeCell) {
    addLawDataAliases: function (lawData, rawCode, payload) {
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);
 
        var keys = [rawCode, normalized, sectionCode, legacyCode];
 
        keys.forEach(function (key) {
            if (!key) return;
            lawData[key] = payload;
        });
    },
 
     extractTitleFromCrimeCell: function (crimeCell, rawCode) {
         var b = crimeCell.querySelector('b');
         var b = crimeCell.querySelector('b');
         var text = (b ? b.textContent : crimeCell.textContent) || '';
         var text = (b ? b.textContent : crimeCell.textContent) || '';
         text = text.replace(/\s+/g, ' ').trim();
         text = text.replace(/\s+/g, ' ').trim();


        // Пример текста: "§ 1.1 Оскорбительное поведение"
         text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, '').trim();
         text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/,'').trim();
 
        if (!text) {
            var normalized = LawTooltipsModule.normalizeLawCode(rawCode);
            var escaped = normalized.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
            text = ((b ? b.textContent : crimeCell.textContent) || '')
                .replace(/\s+/g, ' ')
                .replace(new RegExp('^' + escaped + '\\s*', 'u'), '')
                .trim();
        }
 
         return text;
         return text;
     },
     },
Строка 175: Строка 233:
         }
         }


        // На случай, если вместо <li> будет иной формат
         var fallback = (exampleCell.innerHTML || '').trim();
         var fallback = (exampleCell.innerHTML || '').trim();
         fallback = fallback.replace(/<br\s*\/?>/gi, '').trim();
         fallback = fallback.replace(/<br\s*\/?>/gi, '').trim();
Строка 183: Строка 240:
     },
     },


     formatLawCode: function (lawCode) {
     extractCodeFromHref: function (href) {
         // §_1.1 -> § 1.1
         var match = (href || '').match(/^#(.+)$/);
         return (lawCode || '').replace(/^§_/, '§ ');
        if (!match) return '';
        return (match[1] || '').trim();
    },
 
    normalizeLawCode: function (lawCode) {
         var code = (lawCode || '').trim();
        code = code.replace(/^#/, '');
        code = code.replace(/^§\s*_?\s*/u, '');
        code = code.replace(/\s+/g, '');
        return code;
    },
 
    toSectionCode: function (lawCode) {
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);
        if (!normalized) return '';
        return '§_' + normalized;
    },
 
    toLegacyCode: function (lawCode) {
        return LawTooltipsModule.normalizeLawCode(lawCode);
    },
 
    formatLawCode: function (lawCode, data) {
        var raw = (data && data.sourceCode ? data.sourceCode : lawCode) || '';
        var normalized = LawTooltipsModule.normalizeLawCode(raw);
 
        if (/^§\s*_?/u.test(raw) || raw.indexOf('§_') === 0 || normalized.indexOf('.') !== -1) {
            return '§ ' + normalized;
        }
 
        return normalized || raw;
     },
     },


Строка 192: Строка 279:
         if (!data) return null;
         if (!data) return null;


         var displayCode = LawTooltipsModule.formatLawCode(lawCode);
         var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);


         var html = '<div class="law-tooltip">';
         var html = '<div class="law-tooltip">';
Строка 219: Строка 306:


             var href = link.getAttribute('href') || '';
             var href = link.getAttribute('href') || '';
             var match = href.match(/^#(.+)$/);
             var rawCode = LawTooltipsModule.extractCodeFromHref(href);
            if (!match) return;
            if (!rawCode) return;
 
            var candidateKeys = [
                rawCode,
                LawTooltipsModule.normalizeLawCode(rawCode),
                LawTooltipsModule.toSectionCode(rawCode),
                LawTooltipsModule.toLegacyCode(rawCode)
            ];
 
            var tooltipContent = null;
            var matchedKey = null;
 
            for (var i = 0; i < candidateKeys.length; i++) {
                var key = candidateKeys[i];
                if (!key) continue;


            var lawCode = match[1];
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);
            if (!lawCode) return;
                if (tooltipContent) {
                    matchedKey = key;
                    break;
                }
            }


            var tooltipContent = LawTooltipsModule.createTooltipContent(lawCode, lawData);
             if (!tooltipContent) return;
             if (!tooltipContent) return;


Строка 233: Строка 337:
             cell.addEventListener('click', function (e) {
             cell.addEventListener('click', function (e) {
                 e.preventDefault();
                 e.preventDefault();
                 window.location.hash = lawCode;
                 window.location.hash = rawCode;
             });
             });