| interface SchemaCommandOptions { | ||
| url?: string; | ||
| siteName?: string; | ||
| siteLogo?: string; | ||
| language?: string; | ||
| output?: string; | ||
| format?: 'json' | 'html' | 'both'; | ||
| } | ||
| /** | ||
| * Schema 生成命令 | ||
| */ | ||
| export declare function schemaCommand(articlePath: string, options?: SchemaCommandOptions): Promise<void>; | ||
| export {}; | ||
| //# sourceMappingURL=schema.d.ts.map |
| {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"AAOA,UAAU,oBAAoB;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;CAClC;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,iBAsH1F"} |
| import fs from 'fs-extra'; | ||
| import path from 'path'; | ||
| import chalk from 'chalk'; | ||
| import ora from 'ora'; | ||
| import { SchemaGenerator } from '../schema/schema-generator.js'; | ||
| /** | ||
| * Schema 生成命令 | ||
| */ | ||
| export async function schemaCommand(articlePath, options = {}) { | ||
| const spinner = ora('正在加载文章...').start(); | ||
| try { | ||
| // 1. 检查文件是否存在 | ||
| if (!await fs.pathExists(articlePath)) { | ||
| spinner.fail(chalk.red(`文件不存在: ${articlePath}`)); | ||
| process.exit(1); | ||
| } | ||
| // 2. 读取文章 | ||
| const markdown = await fs.readFile(articlePath, 'utf-8'); | ||
| spinner.succeed(chalk.green('文章加载完成')); | ||
| // 3. 生成 Schema | ||
| spinner.start('生成 Schema.org 标记...'); | ||
| const generator = new SchemaGenerator(); | ||
| const schemaOptions = { | ||
| url: options.url, | ||
| siteName: options.siteName, | ||
| siteLogo: options.siteLogo, | ||
| language: options.language | ||
| }; | ||
| const { type, schema } = generator.generate(markdown, schemaOptions); | ||
| spinner.succeed(chalk.green('Schema 生成完成')); | ||
| // 4. 验证 Schema | ||
| spinner.start('验证 Schema...'); | ||
| const validation = generator.validate(schema); | ||
| if (!validation.valid) { | ||
| spinner.warn(chalk.yellow('Schema 验证发现问题')); | ||
| console.log(); | ||
| console.log(chalk.yellow('⚠️ 验证警告:')); | ||
| validation.errors.forEach(error => { | ||
| console.log(chalk.yellow(` - ${error}`)); | ||
| }); | ||
| console.log(); | ||
| } | ||
| else { | ||
| spinner.succeed(chalk.green('✓ Schema 验证通过')); | ||
| } | ||
| // 5. 显示结果 | ||
| console.log(); | ||
| console.log(chalk.cyan('='.repeat(50))); | ||
| console.log(chalk.cyan.bold(' Schema.org 生成结果')); | ||
| console.log(chalk.cyan('='.repeat(50))); | ||
| console.log(); | ||
| console.log(chalk.bold('内容类型:'), chalk.green(type.toUpperCase())); | ||
| console.log(chalk.bold('Schema 类型:'), chalk.green(schema['@type'])); | ||
| console.log(); | ||
| // 6. 保存文件 | ||
| const articleDir = path.dirname(articlePath); | ||
| const articleName = path.basename(articlePath, '.md'); | ||
| const format = options.format || 'both'; | ||
| const outputDir = options.output || articleDir; | ||
| await fs.ensureDir(outputDir); | ||
| if (format === 'json' || format === 'both') { | ||
| const jsonPath = path.join(outputDir, `${articleName}-schema.json`); | ||
| await fs.writeJSON(jsonPath, schema, { spaces: 2 }); | ||
| console.log(chalk.green('✓'), 'JSON 文件:', chalk.gray(jsonPath)); | ||
| } | ||
| if (format === 'html' || format === 'both') { | ||
| const htmlTag = generator.generateHTMLTag(markdown, schemaOptions); | ||
| const htmlPath = path.join(outputDir, `${articleName}-schema.html`); | ||
| await fs.writeFile(htmlPath, htmlTag); | ||
| console.log(chalk.green('✓'), 'HTML 标签:', chalk.gray(htmlPath)); | ||
| } | ||
| console.log(); | ||
| // 7. 显示关键信息 | ||
| console.log(chalk.cyan('📋 Schema 信息:')); | ||
| if (schema.headline) { | ||
| console.log(chalk.gray(` 标题: ${schema.headline}`)); | ||
| } | ||
| if (schema.author) { | ||
| const authorName = typeof schema.author === 'object' ? schema.author.name : schema.author; | ||
| console.log(chalk.gray(` 作者: ${authorName}`)); | ||
| } | ||
| if (schema.datePublished) { | ||
| const date = new Date(schema.datePublished).toLocaleDateString('zh-CN'); | ||
| console.log(chalk.gray(` 发布: ${date}`)); | ||
| } | ||
| if (schema.keywords) { | ||
| console.log(chalk.gray(` 关键词: ${schema.keywords.join(', ')}`)); | ||
| } | ||
| console.log(); | ||
| // 8. 使用说明 | ||
| console.log(chalk.cyan('💡 如何使用:')); | ||
| console.log(chalk.gray(' 1. 将生成的 JSON-LD 代码添加到 HTML <head> 中')); | ||
| console.log(chalk.gray(' 2. 使用 Google Rich Results Test 验证:')); | ||
| console.log(chalk.gray(' https://search.google.com/test/rich-results')); | ||
| console.log(chalk.gray(' 3. 部署后等待 Google 重新抓取')); | ||
| console.log(); | ||
| // 9. 下一步 | ||
| console.log(chalk.cyan('📋 下一步:')); | ||
| console.log(chalk.gray(' 1. 检查生成的 Schema 是否准确')); | ||
| console.log(chalk.gray(' 2. 使用 /geo-publish 准备发布')); | ||
| console.log(chalk.gray(' 3. 使用 /geo-track 开始跟踪引用')); | ||
| console.log(); | ||
| } | ||
| catch (error) { | ||
| spinner.fail(chalk.red('Schema 生成失败')); | ||
| throw error; | ||
| } | ||
| } | ||
| //# sourceMappingURL=schema.js.map |
| {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"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"} |
| import type { ContentType } from './types/base.js'; | ||
| /** | ||
| * 内容类型检测器 | ||
| * 自动识别文章属于哪种类型 | ||
| */ | ||
| export declare class ContentDetector { | ||
| /** | ||
| * 检测内容类型 | ||
| */ | ||
| detect(content: string, frontmatter?: Record<string, any>): ContentType; | ||
| /** | ||
| * Article 评分 | ||
| */ | ||
| private scoreArticle; | ||
| /** | ||
| * HowTo 评分 | ||
| */ | ||
| private scoreHowTo; | ||
| /** | ||
| * Review 评分 | ||
| */ | ||
| private scoreReview; | ||
| /** | ||
| * FAQ 评分 | ||
| */ | ||
| private scoreFAQ; | ||
| /** | ||
| * Person 评分 | ||
| */ | ||
| private scorePerson; | ||
| /** | ||
| * 检查是否是有效类型 | ||
| */ | ||
| private isValidType; | ||
| } | ||
| //# sourceMappingURL=content-detector.d.ts.map |
| {"version":3,"file":"content-detector.d.ts","sourceRoot":"","sources":["../../src/schema/content-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAElD;;;GAGG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,WAAW;IAwBvE;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,OAAO,CAAC,UAAU;IA2BlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAgCnB;;OAEG;IACH,OAAO,CAAC,QAAQ;IA8BhB;;OAEG;IACH,OAAO,CAAC,WAAW;IA0BnB;;OAEG;IACH,OAAO,CAAC,WAAW;CAGpB"} |
| /** | ||
| * 内容类型检测器 | ||
| * 自动识别文章属于哪种类型 | ||
| */ | ||
| export class ContentDetector { | ||
| /** | ||
| * 检测内容类型 | ||
| */ | ||
| detect(content, frontmatter) { | ||
| // 1. 检查 frontmatter 中的显式类型 | ||
| if (frontmatter?.type || frontmatter?.schema) { | ||
| const explicitType = (frontmatter.type || frontmatter.schema).toLowerCase(); | ||
| if (this.isValidType(explicitType)) { | ||
| return explicitType; | ||
| } | ||
| } | ||
| // 2. 基于内容特征自动检测 | ||
| const scores = { | ||
| article: this.scoreArticle(content), | ||
| howto: this.scoreHowTo(content), | ||
| review: this.scoreReview(content), | ||
| faq: this.scoreFAQ(content), | ||
| person: this.scorePerson(content, frontmatter) | ||
| }; | ||
| // 返回得分最高的类型 | ||
| return Object.entries(scores).reduce((a, b) => scores[a[0]] > scores[b[0]] ? a : b)[0]; | ||
| } | ||
| /** | ||
| * Article 评分 | ||
| */ | ||
| scoreArticle(content) { | ||
| let score = 0; | ||
| // 基础分 - 如果没有其他明显特征,默认为文章 | ||
| score += 3; | ||
| // 有标题和段落 | ||
| if (/^#{1,6}\s+.+$/m.test(content)) | ||
| score += 2; | ||
| // 有引用 | ||
| if (/\[\d+\]/.test(content)) | ||
| score += 1; | ||
| // 有代码示例 | ||
| if (/```[\s\S]*?```/.test(content)) | ||
| score += 1; | ||
| return score; | ||
| } | ||
| /** | ||
| * HowTo 评分 | ||
| */ | ||
| scoreHowTo(content) { | ||
| let score = 0; | ||
| // 关键词匹配 | ||
| const howtoKeywords = [ | ||
| /如何/g, /怎么/g, /步骤/g, /教程/g, | ||
| /\bhow to\b/gi, /\bsteps\b/gi, /\btutorial\b/gi, /\bguide\b/gi | ||
| ]; | ||
| howtoKeywords.forEach(pattern => { | ||
| const matches = content.match(pattern); | ||
| if (matches) | ||
| score += matches.length * 2; | ||
| }); | ||
| // 有编号步骤 | ||
| const numberedSteps = content.match(/^(\d+\.|\d+\))\s+/gm); | ||
| if (numberedSteps && numberedSteps.length >= 3) { | ||
| score += numberedSteps.length; | ||
| } | ||
| // 有"所需材料"、"准备工作"等 | ||
| if (/所需|材料|工具|准备|requirements?|tools?|materials?/i.test(content)) { | ||
| score += 3; | ||
| } | ||
| return score; | ||
| } | ||
| /** | ||
| * Review 评分 | ||
| */ | ||
| scoreReview(content) { | ||
| let score = 0; | ||
| // 关键词匹配 | ||
| const reviewKeywords = [ | ||
| /评测/g, /评价/g, /体验/g, /优缺点/g, | ||
| /\breview\b/gi, /\bpros?\b/gi, /\bcons?\b/gi, /\brating\b/gi | ||
| ]; | ||
| reviewKeywords.forEach(pattern => { | ||
| const matches = content.match(pattern); | ||
| if (matches) | ||
| score += matches.length * 2; | ||
| }); | ||
| // 有评分/星级 | ||
| if (/[★⭐✨]{1,5}|(\d+\/\d+|\d+分)/.test(content)) { | ||
| score += 3; | ||
| } | ||
| // 有"优点"、"缺点"章节 | ||
| if (/(优点|优势|pros?)[::]/i.test(content) && | ||
| /(缺点|劣势|cons?)[::]/i.test(content)) { | ||
| score += 5; | ||
| } | ||
| // 有对比 | ||
| if (/(vs|对比|比较|versus)/i.test(content)) { | ||
| score += 2; | ||
| } | ||
| return score; | ||
| } | ||
| /** | ||
| * FAQ 评分 | ||
| */ | ||
| scoreFAQ(content) { | ||
| let score = 0; | ||
| // 问答格式 | ||
| const questions = content.match(/^(问|Q|Question)[::]/gim); | ||
| const answers = content.match(/^(答|A|Answer)[::]/gim); | ||
| if (questions && questions.length >= 3) { | ||
| score += questions.length * 3; | ||
| } | ||
| if (answers && answers.length >= 3) { | ||
| score += answers.length * 2; | ||
| } | ||
| // 问号密度 | ||
| const questionMarks = (content.match(/\?/g) || []).length; | ||
| if (questionMarks >= 5) { | ||
| score += Math.min(questionMarks, 10); | ||
| } | ||
| // 标题是问句 | ||
| const headingQuestions = content.match(/^#{2,6}\s+.+\?$/gm); | ||
| if (headingQuestions && headingQuestions.length >= 3) { | ||
| score += headingQuestions.length * 2; | ||
| } | ||
| return score; | ||
| } | ||
| /** | ||
| * Person 评分 | ||
| */ | ||
| scorePerson(content, frontmatter) { | ||
| let score = 0; | ||
| // frontmatter 中有 bio/about | ||
| if (frontmatter?.bio || frontmatter?.about || frontmatter?.biography) { | ||
| score += 10; | ||
| } | ||
| // 内容关键词 | ||
| const personKeywords = [ | ||
| /个人简介/g, /关于我/g, /作者介绍/g, | ||
| /\babout me\b/gi, /\bbiography\b/gi, /\bprofile\b/gi | ||
| ]; | ||
| personKeywords.forEach(pattern => { | ||
| if (pattern.test(content)) | ||
| score += 3; | ||
| }); | ||
| // 有社交媒体链接 | ||
| const socialLinks = content.match(/(twitter|github|linkedin|facebook)\.com/gi); | ||
| if (socialLinks && socialLinks.length >= 2) { | ||
| score += 5; | ||
| } | ||
| return score; | ||
| } | ||
| /** | ||
| * 检查是否是有效类型 | ||
| */ | ||
| isValidType(type) { | ||
| return ['article', 'howto', 'review', 'faq', 'person'].includes(type); | ||
| } | ||
| } | ||
| //# sourceMappingURL=content-detector.js.map |
| {"version":3,"file":"content-detector.js","sourceRoot":"","sources":["../../src/schema/content-detector.ts"],"names":[],"mappings":"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"} |
| import type { ArticleSchema, SchemaOptions } from '../types/base.js'; | ||
| /** | ||
| * Article Schema 生成器 | ||
| */ | ||
| export declare class ArticleGenerator { | ||
| /** | ||
| * 生成 Article Schema | ||
| */ | ||
| generate(content: string, frontmatter: Record<string, any>, options?: SchemaOptions): ArticleSchema; | ||
| /** | ||
| * 检测文章类型 | ||
| */ | ||
| private detectArticleType; | ||
| /** | ||
| * 提取标题 | ||
| */ | ||
| private extractHeadline; | ||
| /** | ||
| * 提取描述 | ||
| */ | ||
| private extractDescription; | ||
| /** | ||
| * 生成作者信息 | ||
| */ | ||
| private generateAuthor; | ||
| /** | ||
| * 提取日期 | ||
| */ | ||
| private extractDate; | ||
| /** | ||
| * 提取图片 | ||
| */ | ||
| private extractImage; | ||
| /** | ||
| * 提取关键词 | ||
| */ | ||
| private extractKeywords; | ||
| /** | ||
| * 统计词数 | ||
| */ | ||
| private countWords; | ||
| /** | ||
| * 检测语言 | ||
| */ | ||
| private detectLanguage; | ||
| /** | ||
| * 提取引用 | ||
| */ | ||
| private extractCitations; | ||
| } | ||
| //# sourceMappingURL=article-generator.d.ts.map |
| {"version":3,"file":"article-generator.d.ts","sourceRoot":"","sources":["../../../src/schema/generators/article-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAgB,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGlF;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACH,QAAQ,CACN,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChC,OAAO,GAAE,aAAkB,GAC1B,aAAa;IAiDhB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;OAEG;IACH,OAAO,CAAC,cAAc;IA6BtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAiBzB"} |
| import { SCHEMA_CONTEXT } from '../types/base.js'; | ||
| /** | ||
| * Article Schema 生成器 | ||
| */ | ||
| export class ArticleGenerator { | ||
| /** | ||
| * 生成 Article Schema | ||
| */ | ||
| generate(content, frontmatter, options = {}) { | ||
| const schema = { | ||
| '@context': SCHEMA_CONTEXT, | ||
| '@type': this.detectArticleType(content, frontmatter), | ||
| headline: this.extractHeadline(content, frontmatter), | ||
| author: this.generateAuthor(frontmatter, options), | ||
| datePublished: this.extractDate(frontmatter, 'date', 'publishDate', 'published'), | ||
| inLanguage: options.language || this.detectLanguage(content) | ||
| }; | ||
| // 可选字段 | ||
| const description = this.extractDescription(content, frontmatter); | ||
| if (description) | ||
| schema.description = description; | ||
| const dateModified = this.extractDate(frontmatter, 'updated', 'updateDate', 'modified', 'lastModified'); | ||
| if (dateModified) | ||
| schema.dateModified = dateModified; | ||
| const image = this.extractImage(frontmatter); | ||
| if (image) | ||
| schema.image = image; | ||
| const keywords = this.extractKeywords(content, frontmatter); | ||
| if (keywords.length > 0) | ||
| schema.keywords = keywords; | ||
| const wordCount = this.countWords(content); | ||
| if (wordCount > 0) | ||
| schema.wordCount = wordCount; | ||
| if (options.url) { | ||
| schema.mainEntityOfPage = options.url; | ||
| } | ||
| // Publisher | ||
| if (options.siteName) { | ||
| schema.publisher = { | ||
| '@context': SCHEMA_CONTEXT, | ||
| '@type': 'Organization', | ||
| name: options.siteName, | ||
| ...(options.siteLogo && { logo: options.siteLogo }) | ||
| }; | ||
| } | ||
| // Citations | ||
| const citations = this.extractCitations(content); | ||
| if (citations.length > 0) { | ||
| schema.citation = citations; | ||
| } | ||
| return schema; | ||
| } | ||
| /** | ||
| * 检测文章类型 | ||
| */ | ||
| detectArticleType(content, frontmatter) { | ||
| // 显式指定 | ||
| if (frontmatter.articleType) { | ||
| return frontmatter.articleType; | ||
| } | ||
| // 基于内容检测 | ||
| if (/\b(news|新闻|快讯)\b/i.test(content)) | ||
| return 'NewsArticle'; | ||
| if (/\b(tech|技术|代码|programming)\b/i.test(content)) | ||
| return 'TechArticle'; | ||
| if (/\b(blog|博客)\b/i.test(content)) | ||
| return 'BlogPosting'; | ||
| return 'Article'; | ||
| } | ||
| /** | ||
| * 提取标题 | ||
| */ | ||
| extractHeadline(content, frontmatter) { | ||
| // 优先使用 frontmatter | ||
| if (frontmatter.title || frontmatter.headline) { | ||
| return frontmatter.title || frontmatter.headline; | ||
| } | ||
| // 从内容中提取第一个一级标题 | ||
| const h1Match = content.match(/^#\s+(.+)$/m); | ||
| if (h1Match) { | ||
| return h1Match[1].trim(); | ||
| } | ||
| return 'Untitled Article'; | ||
| } | ||
| /** | ||
| * 提取描述 | ||
| */ | ||
| extractDescription(content, frontmatter) { | ||
| if (frontmatter.description || frontmatter.summary) { | ||
| return frontmatter.description || frontmatter.summary; | ||
| } | ||
| // 提取第一段 | ||
| const firstParagraph = content | ||
| .replace(/^---[\s\S]*?---/, '') // 移除 frontmatter | ||
| .replace(/^#.+$/gm, '') // 移除标题 | ||
| .trim() | ||
| .split('\n\n')[0]; | ||
| if (firstParagraph && firstParagraph.length > 50) { | ||
| return firstParagraph.substring(0, 200) + (firstParagraph.length > 200 ? '...' : ''); | ||
| } | ||
| return undefined; | ||
| } | ||
| /** | ||
| * 生成作者信息 | ||
| */ | ||
| generateAuthor(frontmatter, options) { | ||
| const author = { | ||
| '@context': SCHEMA_CONTEXT, | ||
| '@type': 'Person', | ||
| name: frontmatter.author || options.authorOverride?.name || 'Anonymous' | ||
| }; | ||
| // 从 frontmatter 或 options 获取额外信息 | ||
| const jobTitle = frontmatter.jobTitle || frontmatter.title || options.authorOverride?.jobTitle; | ||
| if (jobTitle) | ||
| author.jobTitle = jobTitle; | ||
| const email = frontmatter.email || options.authorOverride?.email; | ||
| if (email) | ||
| author.email = email; | ||
| const url = frontmatter.authorUrl || frontmatter.website || options.authorOverride?.url; | ||
| if (url) | ||
| author.url = url; | ||
| // 社交媒体 | ||
| const sameAs = []; | ||
| if (frontmatter.twitter) | ||
| sameAs.push(`https://twitter.com/${frontmatter.twitter.replace('@', '')}`); | ||
| if (frontmatter.github) | ||
| sameAs.push(`https://github.com/${frontmatter.github}`); | ||
| if (frontmatter.linkedin) | ||
| sameAs.push(frontmatter.linkedin); | ||
| if (options.authorOverride?.sameAs) | ||
| sameAs.push(...options.authorOverride.sameAs); | ||
| if (sameAs.length > 0) | ||
| author.sameAs = sameAs; | ||
| return author; | ||
| } | ||
| /** | ||
| * 提取日期 | ||
| */ | ||
| extractDate(frontmatter, ...keys) { | ||
| for (const key of keys) { | ||
| if (frontmatter[key]) { | ||
| const date = new Date(frontmatter[key]); | ||
| if (!isNaN(date.getTime())) { | ||
| return date.toISOString(); | ||
| } | ||
| } | ||
| } | ||
| return new Date().toISOString(); | ||
| } | ||
| /** | ||
| * 提取图片 | ||
| */ | ||
| extractImage(frontmatter) { | ||
| if (frontmatter.image) | ||
| return frontmatter.image; | ||
| if (frontmatter.images) | ||
| return frontmatter.images; | ||
| if (frontmatter.thumbnail) | ||
| return frontmatter.thumbnail; | ||
| return undefined; | ||
| } | ||
| /** | ||
| * 提取关键词 | ||
| */ | ||
| extractKeywords(content, frontmatter) { | ||
| if (frontmatter.keywords) { | ||
| return Array.isArray(frontmatter.keywords) ? frontmatter.keywords : [frontmatter.keywords]; | ||
| } | ||
| if (frontmatter.tags) { | ||
| return Array.isArray(frontmatter.tags) ? frontmatter.tags : [frontmatter.tags]; | ||
| } | ||
| return []; | ||
| } | ||
| /** | ||
| * 统计词数 | ||
| */ | ||
| countWords(content) { | ||
| const withoutCode = content.replace(/```[\s\S]*?```/g, ''); | ||
| const chineseChars = (withoutCode.match(/[\u4e00-\u9fa5]/g) || []).length; | ||
| const englishWords = (withoutCode.match(/[a-zA-Z]+/g) || []).length; | ||
| return chineseChars + englishWords; | ||
| } | ||
| /** | ||
| * 检测语言 | ||
| */ | ||
| detectLanguage(content) { | ||
| const chineseChars = (content.match(/[\u4e00-\u9fa5]/g) || []).length; | ||
| const totalChars = content.length; | ||
| return chineseChars / totalChars > 0.3 ? 'zh-CN' : 'en-US'; | ||
| } | ||
| /** | ||
| * 提取引用 | ||
| */ | ||
| extractCitations(content) { | ||
| const citations = []; | ||
| // 匹配引用格式: [1] Name - URL | ||
| const citationPattern = /\[(\d+)\]\s*(.+?)\s*-\s*(https?:\/\/[^\s]+)/g; | ||
| let match; | ||
| while ((match = citationPattern.exec(content)) !== null) { | ||
| citations.push({ | ||
| '@type': 'CreativeWork', | ||
| name: match[2].trim(), | ||
| url: match[3].trim() | ||
| }); | ||
| } | ||
| return citations; | ||
| } | ||
| } | ||
| //# sourceMappingURL=article-generator.js.map |
| {"version":3,"file":"article-generator.js","sourceRoot":"","sources":["../../../src/schema/generators/article-generator.ts"],"names":[],"mappings":"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"} |
| import type { BaseSchema, SchemaOptions, ContentType } from './types/base.js'; | ||
| /** | ||
| * Schema.org 生成器 | ||
| * 根据内容类型自动生成对应的 Schema | ||
| */ | ||
| export declare class SchemaGenerator { | ||
| private detector; | ||
| private articleGenerator; | ||
| constructor(); | ||
| /** | ||
| * 生成 Schema | ||
| */ | ||
| generate(markdown: string, options?: SchemaOptions): { | ||
| type: ContentType; | ||
| schema: BaseSchema; | ||
| }; | ||
| /** | ||
| * 生成 JSON-LD 字符串 | ||
| */ | ||
| generateJSONLD(markdown: string, options?: SchemaOptions): string; | ||
| /** | ||
| * 生成 HTML script 标签 | ||
| */ | ||
| generateHTMLTag(markdown: string, options?: SchemaOptions): string; | ||
| /** | ||
| * 验证 Schema (基础验证) | ||
| */ | ||
| validate(schema: BaseSchema): { | ||
| valid: boolean; | ||
| errors: string[]; | ||
| }; | ||
| } | ||
| //# sourceMappingURL=schema-generator.d.ts.map |
| {"version":3,"file":"schema-generator.d.ts","sourceRoot":"","sources":["../../src/schema/schema-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAI7E;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,gBAAgB,CAAkB;;IAO1C;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG;QACvD,IAAI,EAAE,WAAW,CAAA;QACjB,MAAM,EAAE,UAAU,CAAA;KACnB;IA8CD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM;IAKrE;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM;IAKtE;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;CA8BnE"} |
| import matter from 'gray-matter'; | ||
| import { ContentDetector } from './content-detector.js'; | ||
| import { ArticleGenerator } from './generators/article-generator.js'; | ||
| /** | ||
| * Schema.org 生成器 | ||
| * 根据内容类型自动生成对应的 Schema | ||
| */ | ||
| export class SchemaGenerator { | ||
| detector; | ||
| articleGenerator; | ||
| constructor() { | ||
| this.detector = new ContentDetector(); | ||
| this.articleGenerator = new ArticleGenerator(); | ||
| } | ||
| /** | ||
| * 生成 Schema | ||
| */ | ||
| generate(markdown, options = {}) { | ||
| // 解析 frontmatter | ||
| const { data: frontmatter, content } = matter(markdown); | ||
| // 检测内容类型 | ||
| const type = this.detector.detect(content, frontmatter); | ||
| // 根据类型生成 Schema | ||
| let schema; | ||
| switch (type) { | ||
| case 'article': | ||
| schema = this.articleGenerator.generate(content, frontmatter, options); | ||
| break; | ||
| case 'howto': | ||
| // HowTo 暂时使用 Article | ||
| schema = this.articleGenerator.generate(content, frontmatter, options); | ||
| schema['@type'] = 'HowTo'; | ||
| break; | ||
| case 'review': | ||
| // Review 暂时使用 Article | ||
| schema = this.articleGenerator.generate(content, frontmatter, options); | ||
| schema['@type'] = 'Review'; | ||
| break; | ||
| case 'faq': | ||
| // FAQ 暂时使用 Article | ||
| schema = this.articleGenerator.generate(content, frontmatter, options); | ||
| schema['@type'] = 'FAQPage'; | ||
| break; | ||
| case 'person': | ||
| // Person 暂时使用 Article | ||
| schema = this.articleGenerator.generate(content, frontmatter, options); | ||
| schema['@type'] = 'Person'; | ||
| break; | ||
| default: | ||
| schema = this.articleGenerator.generate(content, frontmatter, options); | ||
| } | ||
| return { type, schema }; | ||
| } | ||
| /** | ||
| * 生成 JSON-LD 字符串 | ||
| */ | ||
| generateJSONLD(markdown, options = {}) { | ||
| const { schema } = this.generate(markdown, options); | ||
| return JSON.stringify(schema, null, 2); | ||
| } | ||
| /** | ||
| * 生成 HTML script 标签 | ||
| */ | ||
| generateHTMLTag(markdown, options = {}) { | ||
| const jsonld = this.generateJSONLD(markdown, options); | ||
| return `<script type="application/ld+json">\n${jsonld}\n</script>`; | ||
| } | ||
| /** | ||
| * 验证 Schema (基础验证) | ||
| */ | ||
| validate(schema) { | ||
| const errors = []; | ||
| // 检查必需字段 | ||
| if (!schema['@context']) { | ||
| errors.push('Missing required field: @context'); | ||
| } | ||
| if (!schema['@type']) { | ||
| errors.push('Missing required field: @type'); | ||
| } | ||
| // Article 特定验证 | ||
| if (schema['@type'] === 'Article' || schema['@type'].includes('Article')) { | ||
| if (!schema.headline) { | ||
| errors.push('Article missing required field: headline'); | ||
| } | ||
| if (!schema.author) { | ||
| errors.push('Article missing required field: author'); | ||
| } | ||
| if (!schema.datePublished) { | ||
| errors.push('Article missing required field: datePublished'); | ||
| } | ||
| } | ||
| return { | ||
| valid: errors.length === 0, | ||
| errors | ||
| }; | ||
| } | ||
| } | ||
| //# sourceMappingURL=schema-generator.js.map |
| {"version":3,"file":"schema-generator.js","sourceRoot":"","sources":["../../src/schema/schema-generator.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Schema.org 基础类型定义 | ||
| */ | ||
| /** Schema.org 上下文 */ | ||
| export declare const SCHEMA_CONTEXT = "https://schema.org"; | ||
| /** 基础 Schema 对象 */ | ||
| export interface BaseSchema { | ||
| '@context': string; | ||
| '@type': string; | ||
| [key: string]: any; | ||
| } | ||
| /** Person Schema */ | ||
| export interface PersonSchema extends BaseSchema { | ||
| '@type': 'Person'; | ||
| name: string; | ||
| jobTitle?: string; | ||
| description?: string; | ||
| url?: string; | ||
| email?: string; | ||
| sameAs?: string[]; | ||
| image?: string; | ||
| } | ||
| /** Organization Schema */ | ||
| export interface OrganizationSchema extends BaseSchema { | ||
| '@type': 'Organization'; | ||
| name: string; | ||
| url?: string; | ||
| logo?: string; | ||
| sameAs?: string[]; | ||
| } | ||
| /** Article Schema */ | ||
| export interface ArticleSchema extends BaseSchema { | ||
| '@type': 'Article' | 'BlogPosting' | 'NewsArticle' | 'TechArticle'; | ||
| headline: string; | ||
| description?: string; | ||
| image?: string | string[]; | ||
| author: PersonSchema | OrganizationSchema; | ||
| publisher?: OrganizationSchema; | ||
| datePublished: string; | ||
| dateModified?: string; | ||
| mainEntityOfPage?: string; | ||
| keywords?: string[]; | ||
| articleSection?: string; | ||
| wordCount?: number; | ||
| inLanguage?: string; | ||
| citation?: Array<{ | ||
| '@type': 'CreativeWork'; | ||
| name: string; | ||
| url: string; | ||
| }>; | ||
| } | ||
| /** HowTo Schema */ | ||
| export interface HowToSchema extends BaseSchema { | ||
| '@type': 'HowTo'; | ||
| name: string; | ||
| description?: string; | ||
| image?: string | string[]; | ||
| totalTime?: string; | ||
| estimatedCost?: { | ||
| '@type': 'MonetaryAmount'; | ||
| currency: string; | ||
| value: string; | ||
| }; | ||
| tool?: string[]; | ||
| supply?: string[]; | ||
| step: Array<{ | ||
| '@type': 'HowToStep'; | ||
| name: string; | ||
| text: string; | ||
| image?: string; | ||
| url?: string; | ||
| }>; | ||
| } | ||
| /** Review Schema */ | ||
| export interface ReviewSchema extends BaseSchema { | ||
| '@type': 'Review'; | ||
| reviewRating: { | ||
| '@type': 'Rating'; | ||
| ratingValue: number; | ||
| bestRating?: number; | ||
| worstRating?: number; | ||
| }; | ||
| author: PersonSchema | OrganizationSchema; | ||
| reviewBody: string; | ||
| datePublished?: string; | ||
| itemReviewed: { | ||
| '@type': string; | ||
| name: string; | ||
| description?: string; | ||
| }; | ||
| } | ||
| /** FAQPage Schema */ | ||
| export interface FAQPageSchema extends BaseSchema { | ||
| '@type': 'FAQPage'; | ||
| mainEntity: Array<{ | ||
| '@type': 'Question'; | ||
| name: string; | ||
| acceptedAnswer: { | ||
| '@type': 'Answer'; | ||
| text: string; | ||
| }; | ||
| }>; | ||
| } | ||
| /** BreadcrumbList Schema */ | ||
| export interface BreadcrumbListSchema extends BaseSchema { | ||
| '@type': 'BreadcrumbList'; | ||
| itemListElement: Array<{ | ||
| '@type': 'ListItem'; | ||
| position: number; | ||
| name: string; | ||
| item?: string; | ||
| }>; | ||
| } | ||
| /** 内容类型 */ | ||
| export type ContentType = 'article' | 'howto' | 'review' | 'faq' | 'person'; | ||
| /** Schema 生成选项 */ | ||
| export interface SchemaOptions { | ||
| /** 文章 URL */ | ||
| url?: string; | ||
| /** 网站名称 */ | ||
| siteName?: string; | ||
| /** 网站 Logo */ | ||
| siteLogo?: string; | ||
| /** 作者信息覆盖 */ | ||
| authorOverride?: Partial<PersonSchema>; | ||
| /** 语言 */ | ||
| language?: string; | ||
| } | ||
| //# sourceMappingURL=base.d.ts.map |
| {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/schema/types/base.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Schema.org 基础类型定义 | ||
| */ | ||
| /** Schema.org 上下文 */ | ||
| export const SCHEMA_CONTEXT = 'https://schema.org'; | ||
| //# sourceMappingURL=base.js.map |
| {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/schema/types/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAqB;AACrB,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAAA"} |
+28
-0
@@ -6,2 +6,3 @@ #!/usr/bin/env node | ||
| import { reviewCommand } from './commands/review.js'; | ||
| import { schemaCommand } from './commands/schema.js'; | ||
| const program = new Command(); | ||
@@ -65,2 +66,29 @@ program | ||
| }); | ||
| // Schema 命令 | ||
| program | ||
| .command('schema') | ||
| .description('生成 Schema.org 结构化数据') | ||
| .argument('<article>', '文章路径 (Markdown 文件)') | ||
| .option('--url <url>', '文章 URL') | ||
| .option('--site-name <name>', '网站名称') | ||
| .option('--site-logo <url>', '网站 Logo URL') | ||
| .option('--language <lang>', '语言代码 (如 zh-CN, en-US)', 'zh-CN') | ||
| .option('--output <dir>', '输出目录 (默认为文章所在目录)') | ||
| .option('--format <type>', '输出格式: json, html, both', 'both') | ||
| .action(async (article, options) => { | ||
| try { | ||
| await schemaCommand(article, { | ||
| url: options.url, | ||
| siteName: options.siteName, | ||
| siteLogo: options.siteLogo, | ||
| language: options.language, | ||
| output: options.output, | ||
| format: options.format | ||
| }); | ||
| } | ||
| catch (error) { | ||
| console.error(chalk.red('Schema 生成失败:'), error); | ||
| process.exit(1); | ||
| } | ||
| }); | ||
| // Analyze 命令 (未来实现) | ||
@@ -67,0 +95,0 @@ program |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} |
+1
-1
| { | ||
| "name": "geoify", | ||
| "version": "0.1.0-alpha.2", | ||
| "version": "0.1.0-alpha.3", | ||
| "type": "module", | ||
@@ -5,0 +5,0 @@ "description": "GEO (Generative Engine Optimization) - 优化内容使其成为 AI 引擎的引用来源", |
+18
-6
@@ -75,4 +75,16 @@ # Geoify - AI 引用优化工具 | ||
| ### 3. 使用工作流 | ||
| ### 3. 生成 Schema.org 标记 | ||
| ```bash | ||
| # 生成结构化数据 | ||
| geoify schema article/final.md \ | ||
| --url "https://example.com/article" \ | ||
| --site-name "My Blog" | ||
| # 仅生成 JSON | ||
| geoify schema article/final.md --format json | ||
| ``` | ||
| ### 4. 使用工作流 | ||
| 在 AI 助手(Claude/Cursor/Gemini)中使用斜杠命令: | ||
@@ -202,9 +214,9 @@ | ||
| ### v0.1.0-alpha.2 (当前开发中) | ||
| ### v0.1.0-alpha.3 (当前版本) ✨ | ||
| - [x] 项目初始化 | ||
| - [x] E-E-A-T 评分系统 ✨ 新功能 | ||
| - [x] `/geo-review` CLI 命令 ✨ 新功能 | ||
| - [ ] `/geo-schema` 命令 | ||
| - [ ] 示例项目和文档 | ||
| - [x] E-E-A-T 评分系统 | ||
| - [x] `geoify review` - E-E-A-T 审校命令 | ||
| - [x] `geoify schema` - Schema.org 生成命令 | ||
| - [ ] 示例项目和完整文档 | ||
@@ -211,0 +223,0 @@ ### v0.1.0 (MVP) |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
210803
33.71%77
35.09%2605
49.54%256
4.92%0
-100%