import { isHtmlHeadingLine, stripHtmlTags } from "./html";
const markdownHeadingPattern = /^#{1,6}\s+/;
export function readmeFirstParagraph(lines: string[]): string {
const paragraphs: string[] = [];
let buffer: string[] = [];
for (const line of lines) {
const trimmed = line.trim();
if (isHeadingLine(trimmed)) {
flush(buffer, paragraphs);
if (paragraphs.length > 0) {
break;
}
continue;
}
const cleaned = normalizeLine(trimmed);
if (isSkippableLine(trimmed, cleaned)) {
continue;
}
if (!cleaned) {
flush(buffer, paragraphs);
if (paragraphs.length > 0) {
break;
}
continue;
}
buffer.push(cleaned);
}
flush(buffer, paragraphs);
return paragraphs[0] ?? "";
}
function normalizeLine(line: string): string {
return stripHtmlTags(line).replace(/\s+/g, " ").trim();
}
function isHeadingLine(line: string): boolean {
return markdownHeadingPattern.test(line) || isHtmlHeadingLine(line);
}
function isSkippableLine(original: string, cleaned: string): boolean {
if (/^<img\b/i.test(original)) {
return true;
}
if (/^<div\b/i.test(original) || /^<\/div\b/i.test(original)) {
return true;
}
if (/^<a\b/i.test(original) && cleaned.length === 0) {
return true;
}
if (/^!\[.*\]\(.+\)$/.test(original)) {
return true;
}
if (/^\[!\[.*\]\(.+\)\]\(.+\)$/.test(original)) {
return true;
}
if (!cleaned && /<[^>]+>/.test(original)) {
return true;
}
return false;
}
function flush(buffer: string[], paragraphs: string[]) {
if (buffer.length > 0) {
paragraphs.push(buffer.join(" ").trim());
buffer.length = 0;
}
}