使用Astro和Tailwind CSS创建现代网站?这款 JavaScript 实用程序提供了一个优雅的解决方案,可将 HTML 内容转换为纯净的 Markdown 格式。无论您是在开发 Astro 博客、为 ChatGPT 和 Claude 等 AI 工具准备内容,还是跨平台传输内容,本指南都演示了如何将网页内容提取为格式优美的 Markdown 格式。
最初发布于: www.ysdslt.com/blog/posts/copy-page-content-as-markdown/
测试此部分上方的按钮并将剪贴板内容粘贴到 Markdown 编辑器中以见证转换。
Astro 和 Tailwind 开发中 HTML 到 Markdown 转换的案例 使用Tailwind CSS开发Astro 网站时,您经常会遇到需要以下内容的内容:
为人工智能交互做准备(ChatGPT、Claude、Gemini) 内容管理平台之间的转移 为了文档目的从 HTML 转换为 Markdown 与无头 CMS 解决方案集成 以可访问的格式分发给客户 标准 HTML 会变得笨重,充斥着 CSS 类,尤其是在使用 Tailwind 实用优先的方法时。Markdown 提供了一种精简、易读的格式,非常适合现代 Web 开发流程。
Astro 开发的 JavaScript 方法 这款紧凑的 JavaScript 转换器可与Astro 组件和Tailwind CSS样式完美集成。无需任何外部库 - 纯 JavaScript 代码即可与您的 Astro 开发工作流程完美契合。
在 Astro 组件中配置 HTML 框架 首先将转换按钮合并到您的 Astro 组件中:
Copy page Markdown for LLMs 此按钮利用 Tailwind CSS 类来实现外观并将启动 HTML 到 Markdown 的转换。完整的 JavaScript 解决方案 以下是可与Astro 的客户端脚本完美配合的生产就绪 JavaScript 代码:
// HTML to Markdown converter - Perfect for Astro projects function htmlToMarkdown(html) { const temp = document.createElement("div"); temp.innerHTML = html;
function processNode(node) { let result = "";
if (node.nodeType === Node.TEXT_NODE) {
return node.textContent || "";
}
if (node.nodeType === Node.ELEMENT_NODE) {
const element = node;
const tagName = element.tagName.toLowerCase();
const children = Array.from(element.childNodes);
const childContent = children.map((child) => processNode(child)).join("");
switch (tagName) {
case "h1":
result = `# ${childContent}\n\n`;
break;
case "h2":
result = `## ${childContent}\n\n`;
break;
case "h3":
result = `### ${childContent}\n\n`;
break;
case "h4":
result = `#### ${childContent}\n\n`;
break;
case "h5":
result = `##### ${childContent}\n\n`;
break;
case "h6":
result = `###### ${childContent}\n\n`;
break;
case "p":
result = `${childContent}\n\n`;
break;
case "strong":
case "b":
result = `**${childContent}**`;
break;
case "em":
case "i":
result = `*${childContent}*`;
break;
case "code":
if (element.parentElement?.tagName.toLowerCase() === "pre") {
result = childContent;
} else {
result = `\`${childContent}\``;
}
break;
case "pre":
result = `\`\`\`\n${childContent}\n\`\`\`\n\n`;
break;
case "a":
const href = element.getAttribute("href") || "";
result = `[${childContent}](${href})`;
break;
case "ul":
result = `${childContent}\n`;
break;
case "ol":
result = `${childContent}\n`;
break;
case "li":
const parent = element.parentElement;
if (parent?.tagName.toLowerCase() === "ul") {
result = `- ${childContent}\n`;
} else if (parent?.tagName.toLowerCase() === "ol") {
const index = Array.from(parent.children).indexOf(element) + 1;
result = `${index}. ${childContent}\n`;
}
break;
case "blockquote":
result = `> ${childContent}\n\n`;
break;
case "br":
result = "\n";
break;
case "hr":
result = "---\n\n";
break;
default:
result = childContent;
}
}
return result;
}
let markdown = ""; Array.from(temp.childNodes).forEach((node) => { markdown += processNode(node); });
return markdown.replace(/\n{3,}/g, "\n\n").trim(); }
// Astro-compatible event listener document.addEventListener("DOMContentLoaded", () => { const button = document.getElementById("copy-markdown"); const contentDiv = document.getElementById("markdown-content");
if (!button || !contentDiv) { console.error("Missing button or content div."); return; }
button.addEventListener("click", async () => { try { // Works with Astro's component structure const proseWrapper = contentDiv.querySelector('[class*="prose"]'); const htmlContent = proseWrapper ? proseWrapper.innerHTML : contentDiv.innerHTML;
// Convert HTML to clean Markdown
const markdownContent = htmlToMarkdown(htmlContent);
await navigator.clipboard.writeText(markdownContent);
// Tailwind CSS classes for visual feedback
button.textContent = "Copied!";
button.className = "px-4 py-2 bg-green-500 text-white rounded";
setTimeout(() => {
button.textContent = "Copy page as Markdown";
button.className = "px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600";
}, 2000);
} catch (err) {
console.error("Failed to copy:", err);
button.textContent = "Error copying";
button.className = "px-4 py-2 bg-red-500 text-white rounded";
}
}); }); 理解 Astro 集成机制 天文组件和谐 该转换器经过精心设计,可以与Astro 的组件框架顺利配合:
客户端处理:采用document.addEventListener适当的水合 组件识别:定位 Astro 组件容器内的内容 散文识别:自动识别 Tailwind 的散文类别 错误管理:妥善处理缺失的 Astro 组件 Tailwind CSS 增强功能 该脚本融合了Tailwind CSS改进:
实用程序类消除:从输出中排除 Tailwind 实用程序类 散文包装识别:关注prose类别内的内容 视觉确认:使用 Tailwind 类来更新按钮状态 响应兼容性:与 Tailwind 的响应实用程序配合使用 Astro 开发的 HTML 元素覆盖范围 非常适合Astro 博客内容和Tailwind CSS样式元素:
标题(h1-h6)→ 清理 Markdown 标题 段落→ 适当间隔的文本部分 粗体/斜体→ Markdown 文本格式 代码部分→语法高亮维护 超链接→ 可用的 Markdown 链接 列表→ 项目符号和编号序列 区块引用→ 引用样式 图像→ Alt 文本保留 增强 Astro 开发人员的功能 内容岛兼容性 Astro 岛屿架构的功能:
处理服务器渲染的内容 管理客户端组件 跨岛保留格式 Tailwind CSS 增强功能 消除不必要的样式以获得更清晰的输出:
删除实用程序类 维护语义内容 保留内容中的响应断点 非常适合当代 Web 开发流程 人工智能增强开发 对于使用 Astro 的AI 工具的开发人员来说至关重要的是:
ChatGPT 集成:清理内容以供 AI 处理 克劳德互动:结构正确的文本 GitHub Copilot:增强的代码推荐 内容创作:AI兼容的输入格式 内容管理解决方案 优化Astro CMS流程:
无头 CMS 传输:简化内容迁移 静态站点创建:清理构建的 Markdown 博客开发:方便作者使用的格式 文档:面向开发人员的文档 与常见 Astro 配置集成 Astro + Tailwind CSS
// Perfect for Astro components import Layout from '../layouts/Layout.astro';
My Astro Blog Post
Clean content extraction
将 MDX 输出转换为干净的 Markdown 维护组件结构 保留前言兼容性 Astro + 内容集锦 非常适合Astro 的内容收藏:
提取内容以进行收集处理 创建干净的 Markdown 文件 确保格式一致 Astro 的性能增强 捆绑效率 无依赖:零外部库 可摇树:仅包含必要的代码 Astro 优化:与 Astro 的构建系统兼容 运行时效率 精简的 DOM 解析:最小内存消耗 快速转换:针对实质性内容进行优化 非侵入式:不会干扰 Astro 的水合作用 Astro项目开发指南 组件组织:将内容包含在id="markdown-content"div中 散文实现:利用 Tailwind 的散文实用程序进行样式设置 错误预防:始终验证必需元素是否存在 用户体验:通过 Tailwind 类提供清晰的视觉反馈 移动兼容性:确保触摸设备上的按钮功能 概括 这款 HTML 转 Markdown 转换器是Astro和Tailwind CSS开发者不可或缺的工具。它将样式化的 HTML 内容与简洁的 Markdown 输出连接起来,这对于 AI 流程、内容迁移和文档项目来说弥足珍贵。
这种轻量级、无依赖的方法可以轻松与 Astro 框架集成,同时利用 Tailwind 的实用类来提升用户体验。无论您是使用 Astro 构建博客、文档网站还是内容平台,这款转换器都能优化您的工作流程并提高您的工作效率。
准备好改进你的 Astro 项目了吗?执行上面的代码,立即开始将你的 HTML 内容转换为简洁的 Markdown 格式!