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(' | var crimeIdSpans = document.querySelectorAll('span[id]'); | ||
crimeIdSpans.forEach(function (span) { | crimeIdSpans.forEach(function (span) { | ||
var | var rawId = (span.id || '').trim(); | ||
if (! | 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); | ||
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(); | ||
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: | ||
} | } | ||
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: | ||
}, | }, | ||
extractCodeFromHref: function (href) { | |||
// | var match = (href || '').match(/^#(.+)$/); | ||
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 | var rawCode = LawTooltipsModule.extractCodeFromHref(href); | ||
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; | |||
tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData); | |||
if (tooltipContent) { | |||
matchedKey = key; | |||
break; | |||
} | |||
} | |||
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 = | window.location.hash = rawCode; | ||
}); | }); | ||