Deduplicate research notes after splitting mashed CSV bullets
Join date-only research notes and collapse duplicates
Line 195: Line 195:
text = text.replace(/[^\w\s\-/]/g, ' ');
text = text.replace(/[^\w\s\-/]/g, ' ');
return text.replace(/\s+/g, ' ').trim();
return text.replace(/\s+/g, ' ').trim();
}
function dateOnlyFragment(text) {
var m = $.trim(text || '').match(/^(\d{1,2}\/\d{1,2}\/\d{2,4})\.?$/);
return m ? m[1] : '';
}
function joinDateFollowons(parts) {
var out = [];
$.each(parts, function (_, clause) {
clause = $.trim(clause || '');
if (!clause) {
return;
}
var date = dateOnlyFragment(clause);
if (date && out.length) {
var prev = out[out.length - 1].replace(/[ ,;]+$/, '');
if (prev.slice(-date.length) !== date) {
out[out.length - 1] = prev + ', ' + date;
}
return;
}
out.push(clause);
});
return out;
}
}


Line 228: Line 253:
});
});
});
});
return parts;
return joinDateFollowons(parts);
}
}


Line 237: Line 262:
}
}
var items = [];
var items = [];
var seen = {};
$ul.find('li').each(function () {
$ul.find('li').each(function () {
$.each(splitNotes($(this).text()), function (_, clause) {
$.each(splitNotes($(this).text()), function (_, clause) {
var key = normalizeNoteKey(clause);
if (clause) {
if (clause && key && !negative.test(clause) && !seen[key]) {
seen[key] = true;
items.push(clause);
items.push(clause);
}
}
});
});
});
});
items = joinDateFollowons(items);
var unique = [];
var seen = {};
$.each(items, function (_, clause) {
var key = normalizeNoteKey(clause);
if (clause && key && !negative.test(clause) && !seen[key]) {
seen[key] = true;
unique.push(clause);
}
});
items = unique;
$ul.empty();
$ul.empty();
$.each(items, function (_, clause) {
$.each(items, function (_, clause) {