mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-12-23 20:56:55 +01:00
Compare commits
5 Commits
fix-7214-h
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d5bc07dc0c | ||
|
|
80a686be03 | ||
|
|
d26f2c6043 | ||
|
|
8ca7a28bf3 | ||
|
|
6b77c9c4c7 |
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
'mermaid': patch
|
|
||||||
---
|
|
||||||
|
|
||||||
fix: Ensure block diagram hexagon blocks respect column spanning syntax
|
|
||||||
@@ -404,18 +404,6 @@ describe('Block diagram', () => {
|
|||||||
a
|
a
|
||||||
b
|
b
|
||||||
a --- b
|
a --- b
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL32: hexagon shape block should span correctly', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 3
|
|
||||||
A1{{"Opening tag"}} space A3{{"Closing tag"}}
|
|
||||||
B1["<tagname>"] B2["content"] B3["</tagname>"]
|
|
||||||
C{{"Element"}}:3
|
|
||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -96,9 +96,9 @@ const hexagon = async (parent, node) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const f = 4;
|
const f = 4;
|
||||||
const h = node.positioned ? node.height : bbox.height + node.padding;
|
const h = bbox.height + node.padding;
|
||||||
const m = h / f;
|
const m = h / f;
|
||||||
const w = node.positioned ? node.width : bbox.width + 2 * m + node.padding;
|
const w = bbox.width + 2 * m + node.padding;
|
||||||
const points = [
|
const points = [
|
||||||
{ x: m, y: 0 },
|
{ x: m, y: 0 },
|
||||||
{ x: w - m, y: 0 },
|
{ x: w - m, y: 0 },
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import type { CanonicalUrlConfig } from './canonical-urls.js';
|
|||||||
*/
|
*/
|
||||||
export const canonicalConfig: CanonicalUrlConfig = {
|
export const canonicalConfig: CanonicalUrlConfig = {
|
||||||
// Base URL for the Mermaid documentation site
|
// Base URL for the Mermaid documentation site
|
||||||
baseUrl: 'https://docs.mermaidchart.com',
|
baseUrl: 'https://mermaid.ai/open-source',
|
||||||
|
|
||||||
// Disable automatic generation - only use specificCanonicalUrls
|
// Disable automatic generation - only use specificCanonicalUrls
|
||||||
autoGenerate: false,
|
autoGenerate: false,
|
||||||
@@ -57,93 +57,6 @@ export const canonicalConfig: CanonicalUrlConfig = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Pages that should have specific canonical URLs
|
|
||||||
*
|
|
||||||
* Since autoGenerate is set to false, ONLY pages listed here will get canonical URLs.
|
|
||||||
*
|
|
||||||
* Usage: Add entries to this object where the key is the relative path
|
|
||||||
* of the markdown file and the value is the desired canonical URL.
|
|
||||||
*
|
|
||||||
* Examples:
|
|
||||||
* - 'intro/index.md': 'https://docs.mermaidchart.com/intro/index.html'
|
|
||||||
* - 'syntax/flowchart.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/flowchart.html'
|
|
||||||
* - 'config/configuration.md': 'https://docs.mermaidchart.com/mermaid-oss/config/configuration.html'
|
|
||||||
*/
|
|
||||||
export const specificCanonicalUrls: Record<string, string> = {
|
|
||||||
// Add your specific canonical URLs here
|
|
||||||
// Example:
|
|
||||||
// 'syntax/flowchart.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/flowchart.html',
|
|
||||||
|
|
||||||
// Intro section
|
|
||||||
'intro/index.md': 'https://docs.mermaidchart.com/intro/index.html',
|
|
||||||
'intro/getting-started.md':
|
|
||||||
'https://docs.mermaidchart.com/mermaid-oss/intro/getting-started.html',
|
|
||||||
'intro/syntax-reference.md':
|
|
||||||
'https://docs.mermaidchart.com/mermaid-oss/intro/syntax-reference.html',
|
|
||||||
|
|
||||||
// Syntax section
|
|
||||||
'syntax/flowchart.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/flowchart.html',
|
|
||||||
'syntax/sequenceDiagram.md':
|
|
||||||
'https://docs.mermaidchart.com/mermaid-oss/syntax/sequenceDiagram.html',
|
|
||||||
'syntax/classDiagram.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/classDiagram.html',
|
|
||||||
'syntax/stateDiagram.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/stateDiagram.html',
|
|
||||||
'syntax/entityRelationshipDiagram.md':
|
|
||||||
'https://docs.mermaidchart.com/mermaid-oss/syntax/entityRelationshipDiagram.html',
|
|
||||||
'syntax/userJourney.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/userJourney.html',
|
|
||||||
'syntax/gantt.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/gantt.html',
|
|
||||||
'syntax/pie.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/pie.html',
|
|
||||||
'syntax/quadrantChart.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/quadrantChart.html',
|
|
||||||
'syntax/requirementDiagram.md':
|
|
||||||
'https://docs.mermaidchart.com/mermaid-oss/syntax/requirementDiagram.html',
|
|
||||||
'syntax/mindmap.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/mindmap.html',
|
|
||||||
'syntax/timeline.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/timeline.html',
|
|
||||||
'syntax/gitgraph.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/gitgraph.html',
|
|
||||||
'syntax/c4.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/c4.html',
|
|
||||||
'syntax/sankey.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/sankey.html',
|
|
||||||
'syntax/xyChart.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/xyChart.html',
|
|
||||||
'syntax/block.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/block.html',
|
|
||||||
'syntax/packet.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/packet.html',
|
|
||||||
'syntax/kanban.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/kanban.html',
|
|
||||||
'syntax/architecture.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/architecture.html',
|
|
||||||
'syntax/radar.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/radar.html',
|
|
||||||
'syntax/examples.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/examples.html',
|
|
||||||
|
|
||||||
// Config section
|
|
||||||
'config/configuration.md': 'https://docs.mermaidchart.com/mermaid-oss/config/configuration.html',
|
|
||||||
'config/usage.md': 'https://docs.mermaidchart.com/mermaid-oss/config/usage.html',
|
|
||||||
'config/icons.md': 'https://docs.mermaidchart.com/mermaid-oss/config/icons.html',
|
|
||||||
'config/directives.md': 'https://docs.mermaidchart.com/mermaid-oss/config/directives.html',
|
|
||||||
'config/theming.md': 'https://docs.mermaidchart.com/mermaid-oss/config/theming.html',
|
|
||||||
'config/math.md': 'https://docs.mermaidchart.com/mermaid-oss/config/math.html',
|
|
||||||
'config/accessibility.md': 'https://docs.mermaidchart.com/mermaid-oss/config/accessibility.html',
|
|
||||||
'config/mermaidCLI.md': 'https://docs.mermaidchart.com/mermaid-oss/config/mermaidCLI.html',
|
|
||||||
'config/faq.md': 'https://docs.mermaidchart.com/mermaid-oss/config/faq.html',
|
|
||||||
|
|
||||||
// Ecosystem section
|
|
||||||
'ecosystem/mermaid-chart.md':
|
|
||||||
'https://docs.mermaidchart.com/mermaid-oss/ecosystem/mermaid-chart.html',
|
|
||||||
'ecosystem/tutorials.md': 'https://docs.mermaidchart.com/mermaid-oss/ecosystem/tutorials.html',
|
|
||||||
'ecosystem/integrations-community.md':
|
|
||||||
'https://docs.mermaidchart.com/mermaid-oss/ecosystem/integrations-community.html',
|
|
||||||
'ecosystem/integrations-create.md':
|
|
||||||
'https://docs.mermaidchart.com/mermaid-oss/ecosystem/integrations-create.html',
|
|
||||||
|
|
||||||
// Community section
|
|
||||||
'community/intro.md': 'https://docs.mermaidchart.com/mermaid-oss/community/intro.html',
|
|
||||||
'community/contributing.md':
|
|
||||||
'https://docs.mermaidchart.com/mermaid-oss/community/contributing.html',
|
|
||||||
'community/new-diagram.md':
|
|
||||||
'https://docs.mermaidchart.com/mermaid-oss/community/new-diagram.html',
|
|
||||||
'community/questions-and-suggestions.md':
|
|
||||||
'https://docs.mermaidchart.com/mermaid-oss/community/questions-and-suggestions.html',
|
|
||||||
'community/security.md': 'https://docs.mermaidchart.com/mermaid-oss/community/security.html',
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper function to get canonical URL for a specific page
|
|
||||||
* This can be used in frontmatter or for manual overrides
|
|
||||||
*/
|
|
||||||
export function getCanonicalUrl(relativePath: string): string | undefined {
|
export function getCanonicalUrl(relativePath: string): string | undefined {
|
||||||
return specificCanonicalUrls[relativePath];
|
return `https://mermaid.ai/open-source/${relativePath}`;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import type { PageData } from 'vitepress';
|
import type { PageData } from 'vitepress';
|
||||||
import { canonicalConfig, specificCanonicalUrls } from './canonical-config.js';
|
import { canonicalConfig } from './canonical-config.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration for canonical URL generation
|
* Configuration for canonical URL generation
|
||||||
@@ -48,31 +48,15 @@ const defaultConfig: CanonicalUrlConfig = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a path matches any of the exclude patterns
|
|
||||||
*/
|
|
||||||
function shouldExcludePath(relativePath: string, excludePatterns: string[] = []): boolean {
|
|
||||||
return excludePatterns.some((pattern) => {
|
|
||||||
// Convert glob pattern to regex
|
|
||||||
const regexPattern = pattern
|
|
||||||
.replace(/\*\*/g, '.*')
|
|
||||||
.replace(/\*/g, '[^/]*')
|
|
||||||
.replace(/\?/g, '.')
|
|
||||||
.replace(/\./g, '\\.');
|
|
||||||
const regex = new RegExp(`^${regexPattern}$`);
|
|
||||||
return regex.test(relativePath);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Transform a relative path to a canonical URL path
|
* Transform a relative path to a canonical URL path
|
||||||
*/
|
*/
|
||||||
function transformPath(relativePath: string, config: CanonicalUrlConfig): string {
|
export function transformPath(relativePath: string, config: CanonicalUrlConfig): string {
|
||||||
let transformedPath = relativePath;
|
let transformedPath = relativePath;
|
||||||
|
|
||||||
// Apply built-in transformations
|
// Apply built-in transformations
|
||||||
if (config.transformations?.removeMarkdownExtension) {
|
if (config.transformations?.removeMarkdownExtension) {
|
||||||
transformedPath = transformedPath.replace(/\.md$/, '');
|
transformedPath = transformedPath.replace(/\.md$/, '.html');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.transformations?.removeIndex) {
|
if (config.transformations?.removeIndex) {
|
||||||
@@ -116,45 +100,9 @@ function generateCanonicalUrl(relativePath: string, config: CanonicalUrlConfig):
|
|||||||
export function addCanonicalUrls(pageData: PageData): void {
|
export function addCanonicalUrls(pageData: PageData): void {
|
||||||
const config = canonicalConfig;
|
const config = canonicalConfig;
|
||||||
|
|
||||||
// Check for specific canonical URLs first
|
|
||||||
const specificUrl = specificCanonicalUrls[pageData.relativePath];
|
|
||||||
if (specificUrl) {
|
|
||||||
addCanonicalToHead(pageData, specificUrl);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip if canonical URL is already explicitly set in frontmatter
|
|
||||||
if (pageData.frontmatter.canonical) {
|
|
||||||
// If it's already a full URL, use as-is
|
|
||||||
if (pageData.frontmatter.canonical.startsWith('http')) {
|
|
||||||
addCanonicalToHead(pageData, pageData.frontmatter.canonical);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// If it's a relative path, convert to absolute URL
|
|
||||||
const canonicalUrl = config.baseUrl + pageData.frontmatter.canonical;
|
|
||||||
addCanonicalToHead(pageData, canonicalUrl);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip if canonicalPath is set in frontmatter
|
|
||||||
if (pageData.frontmatter.canonicalPath) {
|
|
||||||
const canonicalUrl = config.baseUrl + pageData.frontmatter.canonicalPath;
|
|
||||||
addCanonicalToHead(pageData, canonicalUrl);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip if auto-generation is disabled
|
|
||||||
if (!config.autoGenerate) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip if path should be excluded
|
|
||||||
if (shouldExcludePath(pageData.relativePath, config.excludePatterns)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate canonical URL
|
// Generate canonical URL
|
||||||
const canonicalUrl = generateCanonicalUrl(pageData.relativePath, config);
|
const canonicalUrl = generateCanonicalUrl(pageData.relativePath, config);
|
||||||
|
transformPath(pageData.relativePath, config);
|
||||||
addCanonicalToHead(pageData, canonicalUrl);
|
addCanonicalToHead(pageData, canonicalUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user