🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

geoify

Package Overview
Dependencies
Maintainers
1
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

geoify - npm Package Compare versions

Comparing version
0.1.0-alpha.2
to
0.1.0-alpha.3
+14
dist/commands/schema.d.ts
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":"AAEA;;;GAGG;AACH,MAAM,OAAO,eAAe;IAC1B;;OAEG;IACH,MAAM,CAAC,OAAe,EAAE,WAAiC;QACvD,2BAA2B;QAC3B,IAAI,WAAW,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,EAAE,CAAC;YAC7C,MAAM,YAAY,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;YAC3E,IAAI,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnC,OAAO,YAA2B,CAAA;YACpC,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;YACnC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YACjC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC3B,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC;SAC/C,CAAA;QAED,YAAY;QACZ,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5C,MAAM,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAClE,CAAC,CAAC,CAAgB,CAAA;IACrB,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAAe;QAClC,IAAI,KAAK,GAAG,CAAC,CAAA;QAEb,yBAAyB;QACzB,KAAK,IAAI,CAAC,CAAA;QAEV,SAAS;QACT,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,KAAK,IAAI,CAAC,CAAA;QAE9C,MAAM;QACN,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,KAAK,IAAI,CAAC,CAAA;QAEvC,QAAQ;QACR,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,KAAK,IAAI,CAAC,CAAA;QAE9C,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,OAAe;QAChC,IAAI,KAAK,GAAG,CAAC,CAAA;QAEb,QAAQ;QACR,MAAM,aAAa,GAAG;YACpB,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;YAC1B,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa;SAC/D,CAAA;QACD,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACtC,IAAI,OAAO;gBAAE,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,QAAQ;QACR,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;QAC1D,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC/C,KAAK,IAAI,aAAa,CAAC,MAAM,CAAA;QAC/B,CAAC;QAED,kBAAkB;QAClB,IAAI,8CAA8C,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjE,KAAK,IAAI,CAAC,CAAA;QACZ,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,OAAe;QACjC,IAAI,KAAK,GAAG,CAAC,CAAA;QAEb,QAAQ;QACR,MAAM,cAAc,GAAG;YACrB,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;YAC3B,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc;SAC7D,CAAA;QACD,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACtC,IAAI,OAAO;gBAAE,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,SAAS;QACT,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,KAAK,IAAI,CAAC,CAAA;QACZ,CAAC;QAED,eAAe;QACf,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,KAAK,IAAI,CAAC,CAAA;QACZ,CAAC;QAED,MAAM;QACN,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,KAAK,IAAI,CAAC,CAAA;QACZ,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,OAAe;QAC9B,IAAI,KAAK,GAAG,CAAC,CAAA;QAEb,OAAO;QACP,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;QACzD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;QAErD,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvC,KAAK,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;QAC/B,CAAC;QAED,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACnC,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;QAC7B,CAAC;QAED,OAAO;QACP,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;QACzD,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;YACvB,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;QACtC,CAAC;QAED,QAAQ;QACR,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAC3D,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACrD,KAAK,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAA;QACtC,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,OAAe,EAAE,WAAiC;QACpE,IAAI,KAAK,GAAG,CAAC,CAAA;QAEb,2BAA2B;QAC3B,IAAI,WAAW,EAAE,GAAG,IAAI,WAAW,EAAE,KAAK,IAAI,WAAW,EAAE,SAAS,EAAE,CAAC;YACrE,KAAK,IAAI,EAAE,CAAA;QACb,CAAC;QAED,QAAQ;QACR,MAAM,cAAc,GAAG;YACrB,OAAO,EAAE,MAAM,EAAE,OAAO;YACxB,gBAAgB,EAAE,iBAAiB,EAAE,eAAe;SACrD,CAAA;QACD,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC/B,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,UAAU;QACV,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAA;QAC9E,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC3C,KAAK,IAAI,CAAC,CAAA;QACZ,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,IAAY;QAC9B,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvE,CAAC;CACF"}
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":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAC3B;;OAEG;IACH,QAAQ,CACN,OAAe,EACf,WAAgC,EAChC,UAAyB,EAAE;QAE3B,MAAM,MAAM,GAAkB;YAC5B,UAAU,EAAE,cAAc;YAC1B,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC;YACrD,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC;YACpD,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC;YACjD,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC;YAChF,UAAU,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;SAC7D,CAAA;QAED,OAAO;QACP,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACjE,IAAI,WAAW;YAAE,MAAM,CAAC,WAAW,GAAG,WAAW,CAAA;QAEjD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,CAAC,CAAA;QACvG,IAAI,YAAY;YAAE,MAAM,CAAC,YAAY,GAAG,YAAY,CAAA;QAEpD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;QAC5C,IAAI,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;QAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QAC3D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAEnD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QAC1C,IAAI,SAAS,GAAG,CAAC;YAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAA;QAE/C,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,CAAC,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAA;QACvC,CAAC;QAED,YAAY;QACZ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,CAAC,SAAS,GAAG;gBACjB,UAAU,EAAE,cAAc;gBAC1B,OAAO,EAAE,cAAc;gBACvB,IAAI,EAAE,OAAO,CAAC,QAAQ;gBACtB,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;aACpD,CAAA;QACH,CAAC;QAED,YAAY;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;QAChD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAA;QAC7B,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,OAAe,EAAE,WAAgC;QACzE,OAAO;QACP,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;YAC5B,OAAO,WAAW,CAAC,WAAW,CAAA;QAChC,CAAC;QAED,SAAS;QACT,IAAI,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,aAAa,CAAA;QAC3D,IAAI,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,aAAa,CAAA;QACvE,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,aAAa,CAAA;QAExD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,OAAe,EAAE,WAAgC;QACvE,mBAAmB;QACnB,IAAI,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC9C,OAAO,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,QAAQ,CAAA;QAClD,CAAC;QAED,gBAAgB;QAChB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;QAC5C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC1B,CAAC;QAED,OAAO,kBAAkB,CAAA;IAC3B,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,OAAe,EAAE,WAAgC;QAC1E,IAAI,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACnD,OAAO,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,OAAO,CAAA;QACvD,CAAC;QAED,QAAQ;QACR,MAAM,cAAc,GAAG,OAAO;aAC3B,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,iBAAiB;aAChD,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO;aAC9B,IAAI,EAAE;aACN,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAEnB,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACjD,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACtF,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,WAAgC,EAAE,OAAsB;QAC7E,MAAM,MAAM,GAAiB;YAC3B,UAAU,EAAE,cAAc;YAC1B,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,WAAW,CAAC,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,IAAI,IAAI,WAAW;SACxE,CAAA;QAED,iCAAiC;QACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,KAAK,IAAI,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAA;QAC9F,IAAI,QAAQ;YAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAExC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,OAAO,CAAC,cAAc,EAAE,KAAK,CAAA;QAChE,IAAI,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;QAE/B,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,GAAG,CAAA;QACvF,IAAI,GAAG;YAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAA;QAEzB,OAAO;QACP,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,IAAI,WAAW,CAAC,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,uBAAuB,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;QACnG,IAAI,WAAW,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,sBAAsB,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;QAC/E,IAAI,WAAW,CAAC,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QAC3D,IAAI,OAAO,CAAC,cAAc,EAAE,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;QAEjF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;QAE7C,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,WAAgC,EAAE,GAAG,IAAc;QACrE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;gBACvC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;oBAC3B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACjC,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,WAAgC;QACnD,IAAI,WAAW,CAAC,KAAK;YAAE,OAAO,WAAW,CAAC,KAAK,CAAA;QAC/C,IAAI,WAAW,CAAC,MAAM;YAAE,OAAO,WAAW,CAAC,MAAM,CAAA;QACjD,IAAI,WAAW,CAAC,SAAS;YAAE,OAAO,WAAW,CAAC,SAAS,CAAA;QACvD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,OAAe,EAAE,WAAgC;QACvE,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QAC5F,CAAC;QACD,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QAChF,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,OAAe;QAChC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;QAC1D,MAAM,YAAY,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;QACzE,MAAM,YAAY,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;QACnE,OAAO,YAAY,GAAG,YAAY,CAAA;IACpC,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAAe;QACpC,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;QACrE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAA;QACjC,OAAO,YAAY,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;IAC5D,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,OAAe;QACtC,MAAM,SAAS,GAAkE,EAAE,CAAA;QAEnF,yBAAyB;QACzB,MAAM,eAAe,GAAG,8CAA8C,CAAA;QACtE,IAAI,KAAK,CAAA;QAET,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxD,SAAS,CAAC,IAAI,CAAC;gBACb,OAAO,EAAE,cAAc;gBACvB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBACrB,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;aACrB,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;CACF"}
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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"}
{
"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 引擎的引用来源",

@@ -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)