//'); } function countNewLines(str) { var n = 0; var lastIndex = 0; var matchIndex = str.indexOf('\n', lastIndex); while (matchIndex != -1) { n += 1; lastIndex = matchIndex + 1; matchIndex = str.indexOf('\n', lastIndex); } return n; } function findPointers() { var oldPointerInfo = pointerInfo; pointerInfo = {}; var usedColors = {}; displayedHtml = ''; var numPointers = 0; var pointerRegexText = $('#pointerRegex').val(); if (pointerRegexText == '') { return; } var isCaseInsensitive = $('#pointerRegexCaseInsensitive').attr('checked'); var pointerRE = new RegExp(pointerRegexText, isCaseInsensitive ? "i" : ""); var lastIndex = 0; var match = pointerRE.exec(origText); var lineNumber = 1; while (match) { var matchIndex = match.index + lastIndex; // Copy up until the match. displayedHtml += processSource(origText.substring(lastIndex, matchIndex)); var pointerVal = match[0]; if (isCaseInsensitive) { pointerVal = pointerVal.toLowerCase(); } lineNumber += countNewLines(origText.substring(lastIndex, matchIndex + pointerVal.length)); lastIndex = matchIndex + pointerVal.length; //alert(pointerVal + ': ' + matchIndex); // See if we have it already. if (!(pointerVal in pointerInfo)) { pointerInfo[pointerVal] = {pointer: pointerVal, label: pointerVal, color: '', c: 'pointer' + numPointers, count: 0, firstLine: lineNumber, lastLine: lineNumber}; // Keep old data if we had this value before. if (pointerVal in oldPointerInfo) { pointerInfo[pointerVal].label = oldPointerInfo[pointerVal].label; pointerInfo[pointerVal].color = oldPointerInfo[pointerVal].color; usedColors[pointerInfo[pointerVal].color] = 1; } ++numPointers; } else { pointerInfo[pointerVal].lastLine = lineNumber; } pointerInfo[pointerVal].count++; var info = pointerInfo[pointerVal]; displayedHtml += '' + info.label + ''; // Keep trucking along //alert('about to match: ' + origText.substr(lastIndex)); match = pointerRE.exec(origText.substr(lastIndex)); } displayedHtml += processSource(origText.substr(lastIndex)); // Fix up the colors. var panicColorIndex = 1; for (var i in pointerInfo) { if (pointerInfo[i].color == '') { // Pick an unused color. var foundColor = false; for (var j in colors) { if (!(colors[j] in usedColors)) { pointerInfo[i].color = colors[j]; usedColors[colors[j]] = 1; foundColor = true; break; } } if (!foundColor) { // Just pick something, sheesh. pointerInfo[i].color = 'rgb(' + panicColorIndex + ', ' + panicColorIndex + ', ' + panicColorIndex + ')'; ++panicColorIndex; } } } } function updateDisplayedPointers() { for (var i in pointerInfo) { var info = pointerInfo[i]; if (typeof(info.label) != 'string') { alert(typeof(info.label)); } $('.' + info.c).text(info.label); $('.' + info.c).css('color', info.color); $('.' + info.c + 'color').css('color', info.color); } } function showPointerInfo() { //$('#pointerKey').html(); var newHtml = ['Key:OriginalLabelColorCountFirst lineLast line']; var labelSize = longPointers ? 18 : 10; for (var i in pointerInfo) { var info = pointerInfo[i]; var html = '' + i + '' + info.count + '' + info.firstLine + '' + info.lastLine + ''; newHtml.push(html); } $('#pointerKey').html(newHtml.join('')); for (var i in pointerInfo) { $('#' + i + 'xLabel').change(function() { var pointerId = $(this).attr('id'); pointerId = pointerId.substring(0, pointerId.length - 6); pointerInfo[pointerId].label = $(this).val(); updateDisplayedPointers(); }); $('#' + i + 'xColor').change(function() { var pointerId = $(this).attr('id'); pointerId = pointerId.substring(0, pointerId.length - 6); pointerInfo[pointerId].color = $(this).val(); showPointerInfo(); updateDisplayedPointers(); }); } } $(document).ready(function() { $('#colorizeLog').click(function() { origText = $('#logText').val(); findPointers(); $('#outputText').html(displayedHtml); showPointerInfo(); updateDisplayedPointers(); }); $('#longPointers').change(function() { if ($('#longPointers').attr('checked')) { //if ($('#pointerRegex').val() == shortPointerRE) { $('#pointerRegex').val(longPointerRE); //} } else { //if ($('#pointerRegex').val() == longPointerRE) { $('#pointerRegex').val(shortPointerRE); //} } $('#pointerRegexCaseInsensitive').attr('checked', 'checked'); }); }); //]]>