27 lines
881 B
JavaScript
27 lines
881 B
JavaScript
|
|
function computeNotesPreview(notes) {
|
||
|
|
if (!notes || notes.trim() === '') {
|
||
|
|
return { has_notes: false, notes_preview: null };
|
||
|
|
}
|
||
|
|
|
||
|
|
const firstParagraph = notes.split(/\n\n/)[0];
|
||
|
|
|
||
|
|
const stripped = firstParagraph
|
||
|
|
.replace(/^#{1,6}\s+/gm, '') // headers
|
||
|
|
.replace(/\*\*(.+?)\*\*/g, '$1') // bold
|
||
|
|
.replace(/\*(.+?)\*/g, '$1') // italic with *
|
||
|
|
.replace(/_(.+?)_/g, '$1') // italic with _
|
||
|
|
.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') // links
|
||
|
|
.replace(/^[-*+]\s+/gm, '') // list markers
|
||
|
|
.replace(/\n/g, ' ') // collapse remaining newlines
|
||
|
|
.replace(/\s+/g, ' ') // collapse whitespace
|
||
|
|
.trim();
|
||
|
|
|
||
|
|
const truncated = stripped.length > 150
|
||
|
|
? stripped.slice(0, 150) + '...'
|
||
|
|
: stripped;
|
||
|
|
|
||
|
|
return { has_notes: true, notes_preview: truncated };
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = { computeNotesPreview };
|