(function($) { /* $('#code-block').highlightLines([ { 'color': '#dd0000', 'lines': [10, 12] }, { 'color': '#ee0000', 'lines': [15, 18] } ]); }); */ $.fn.highlightLines = function(configurations) { return this.each(function() { const $pre = $(this); const textContent = $pre.text(); const lines = textContent.split(/\r?\n/); // Handles both \n and \r\n line endings // Build a map of line numbers to styles const lineStyles = {}; configurations.forEach(config => { const { color, lines: lineNumbers } = config; lineNumbers.forEach(lineNumber => { lineStyles[lineNumber] = color; }); }); // Function to escape HTML characters function escapeHtml(text) { return text.replace(/[&<>"'`=\/]/g, function(s) { return "" + s.charCodeAt(0) + ";"; }); } // Process each line const processedLines = lines.map((line, index) => { const lineNumber = index + 1; // Line numbers start at 1 const escapedLine = escapeHtml(line); const color = lineStyles[lineNumber]; if (color) { // Wrap the line in a span with inline style return `${escapedLine}`; } else { return escapedLine; } }); // Join the lines back together const newContent = processedLines.join('\n'); // Set the new content as HTML $pre.html(newContent); }); }; $.fn.miniTabs = function(tabsConfig, options) { const settings = { tabClass: 'minitab', tabsContainerClass: 'minitabs', activeClass: 'active', ...(options || {}) }; return this.each(function() { const $wrapper = $(this); const $contents = $wrapper.find('div[id]').hide(); const $tabsContainer = $('