md-tech-pdf 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/LICENSE +176 -0
  2. package/README.ja.md +330 -0
  3. package/README.md +315 -0
  4. package/dist/cli/index.d.ts +10 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +96 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/config/config-resolver.d.ts +19 -0
  9. package/dist/config/config-resolver.d.ts.map +1 -0
  10. package/dist/config/config-resolver.js +41 -0
  11. package/dist/config/config-resolver.js.map +1 -0
  12. package/dist/config/document-options.d.ts +52 -0
  13. package/dist/config/document-options.d.ts.map +1 -0
  14. package/dist/config/document-options.js +8 -0
  15. package/dist/config/document-options.js.map +1 -0
  16. package/dist/config/error.d.ts +12 -0
  17. package/dist/config/error.d.ts.map +1 -0
  18. package/dist/config/error.js +12 -0
  19. package/dist/config/error.js.map +1 -0
  20. package/dist/config/frontmatter-parser.d.ts +16 -0
  21. package/dist/config/frontmatter-parser.d.ts.map +1 -0
  22. package/dist/config/frontmatter-parser.js +271 -0
  23. package/dist/config/frontmatter-parser.js.map +1 -0
  24. package/dist/core/converter.d.ts +34 -0
  25. package/dist/core/converter.d.ts.map +1 -0
  26. package/dist/core/converter.js +109 -0
  27. package/dist/core/converter.js.map +1 -0
  28. package/dist/html/default-style.d.ts +6 -0
  29. package/dist/html/default-style.d.ts.map +1 -0
  30. package/dist/html/default-style.js +237 -0
  31. package/dist/html/default-style.js.map +1 -0
  32. package/dist/html/google-fonts.d.ts +20 -0
  33. package/dist/html/google-fonts.d.ts.map +1 -0
  34. package/dist/html/google-fonts.js +50 -0
  35. package/dist/html/google-fonts.js.map +1 -0
  36. package/dist/html/html-builder.d.ts +20 -0
  37. package/dist/html/html-builder.d.ts.map +1 -0
  38. package/dist/html/html-builder.js +88 -0
  39. package/dist/html/html-builder.js.map +1 -0
  40. package/dist/html/html-renderer.d.ts +25 -0
  41. package/dist/html/html-renderer.d.ts.map +1 -0
  42. package/dist/html/html-renderer.js +148 -0
  43. package/dist/html/html-renderer.js.map +1 -0
  44. package/dist/index.d.ts +41 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +38 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/parser/attributes-parser.d.ts +13 -0
  49. package/dist/parser/attributes-parser.d.ts.map +1 -0
  50. package/dist/parser/attributes-parser.js +110 -0
  51. package/dist/parser/attributes-parser.js.map +1 -0
  52. package/dist/parser/error.d.ts +15 -0
  53. package/dist/parser/error.d.ts.map +1 -0
  54. package/dist/parser/error.js +15 -0
  55. package/dist/parser/error.js.map +1 -0
  56. package/dist/parser/markdown-parser.d.ts +17 -0
  57. package/dist/parser/markdown-parser.d.ts.map +1 -0
  58. package/dist/parser/markdown-parser.js +86 -0
  59. package/dist/parser/markdown-parser.js.map +1 -0
  60. package/dist/pdf/default-options.d.ts +6 -0
  61. package/dist/pdf/default-options.d.ts.map +1 -0
  62. package/dist/pdf/default-options.js +12 -0
  63. package/dist/pdf/default-options.js.map +1 -0
  64. package/dist/pdf/error.d.ts +9 -0
  65. package/dist/pdf/error.d.ts.map +1 -0
  66. package/dist/pdf/error.js +10 -0
  67. package/dist/pdf/error.js.map +1 -0
  68. package/dist/pdf/pdf-generator.d.ts +16 -0
  69. package/dist/pdf/pdf-generator.d.ts.map +1 -0
  70. package/dist/pdf/pdf-generator.js +95 -0
  71. package/dist/pdf/pdf-generator.js.map +1 -0
  72. package/dist/pdf/types.d.ts +16 -0
  73. package/dist/pdf/types.d.ts.map +1 -0
  74. package/dist/pdf/types.js +2 -0
  75. package/dist/pdf/types.js.map +1 -0
  76. package/dist/renderer/diagram-renderer.d.ts +11 -0
  77. package/dist/renderer/diagram-renderer.d.ts.map +1 -0
  78. package/dist/renderer/diagram-renderer.js +2 -0
  79. package/dist/renderer/diagram-renderer.js.map +1 -0
  80. package/dist/renderer/error.d.ts +10 -0
  81. package/dist/renderer/error.d.ts.map +1 -0
  82. package/dist/renderer/error.js +10 -0
  83. package/dist/renderer/error.js.map +1 -0
  84. package/dist/renderer/mermaid-executor.d.ts +16 -0
  85. package/dist/renderer/mermaid-executor.d.ts.map +1 -0
  86. package/dist/renderer/mermaid-executor.js +99 -0
  87. package/dist/renderer/mermaid-executor.js.map +1 -0
  88. package/dist/renderer/mermaid-renderer.d.ts +25 -0
  89. package/dist/renderer/mermaid-renderer.d.ts.map +1 -0
  90. package/dist/renderer/mermaid-renderer.js +35 -0
  91. package/dist/renderer/mermaid-renderer.js.map +1 -0
  92. package/dist/renderer/plantuml-executor.d.ts +11 -0
  93. package/dist/renderer/plantuml-executor.d.ts.map +1 -0
  94. package/dist/renderer/plantuml-executor.js +100 -0
  95. package/dist/renderer/plantuml-executor.js.map +1 -0
  96. package/dist/renderer/plantuml-renderer.d.ts +26 -0
  97. package/dist/renderer/plantuml-renderer.d.ts.map +1 -0
  98. package/dist/renderer/plantuml-renderer.js +95 -0
  99. package/dist/renderer/plantuml-renderer.js.map +1 -0
  100. package/dist/types/diagram.d.ts +34 -0
  101. package/dist/types/diagram.d.ts.map +1 -0
  102. package/dist/types/diagram.js +2 -0
  103. package/dist/types/diagram.js.map +1 -0
  104. package/package.json +70 -0
@@ -0,0 +1,99 @@
1
+ import { spawn } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import path from 'node:path';
5
+ import { DiagramRenderError } from './error.js';
6
+ /**
7
+ * Resolves the path to the mmdc script or binary.
8
+ */
9
+ export function resolveMmdcPath() {
10
+ const require = createRequire(import.meta.url);
11
+ try {
12
+ const entryPath = require.resolve('@mermaid-js/mermaid-cli');
13
+ const pkgDir = path.dirname(entryPath);
14
+ const cliScriptPath = path.join(pkgDir, 'cli.js');
15
+ if (fs.existsSync(cliScriptPath)) {
16
+ return {
17
+ command: process.execPath,
18
+ argsPrefix: [cliScriptPath],
19
+ };
20
+ }
21
+ }
22
+ catch {
23
+ // Continue to fallback
24
+ }
25
+ // Check local node_modules/.bin/mmdc
26
+ const localBin = path.resolve(process.cwd(), 'node_modules/.bin/mmdc');
27
+ if (fs.existsSync(localBin)) {
28
+ return {
29
+ command: localBin,
30
+ argsPrefix: [],
31
+ };
32
+ }
33
+ // Fallback to globally/locally installed binary name in PATH
34
+ return {
35
+ command: 'mmdc',
36
+ argsPrefix: [],
37
+ };
38
+ }
39
+ /**
40
+ * Executes Mermaid CLI via stdin/stdout streams entirely in memory.
41
+ */
42
+ export async function executeMermaidCli(source, options) {
43
+ const { command, argsPrefix } = resolveMmdcPath();
44
+ const args = [...argsPrefix, '-i', '-', '-o', '-', '-e', 'svg', '-q'];
45
+ if (options?.theme) {
46
+ args.push('-t', options.theme);
47
+ }
48
+ if (options?.backgroundColor) {
49
+ args.push('-b', options.backgroundColor);
50
+ }
51
+ return new Promise((resolve, reject) => {
52
+ let stdoutBuffer = '';
53
+ let stderrBuffer = '';
54
+ const child = spawn(command, args, {
55
+ stdio: ['pipe', 'pipe', 'pipe'],
56
+ env: {
57
+ ...process.env,
58
+ },
59
+ });
60
+ child.stdout.setEncoding('utf-8');
61
+ child.stderr.setEncoding('utf-8');
62
+ child.stdout.on('data', (chunk) => {
63
+ stdoutBuffer += chunk;
64
+ });
65
+ child.stderr.on('data', (chunk) => {
66
+ stderrBuffer += chunk;
67
+ });
68
+ child.on('error', (err) => {
69
+ reject(new DiagramRenderError(`Failed to launch Mermaid CLI process: ${err.message}`, {
70
+ cause: err,
71
+ }));
72
+ });
73
+ child.on('close', (code) => {
74
+ if (code === 0) {
75
+ const trimmed = stdoutBuffer.trim();
76
+ if (trimmed.includes('<svg')) {
77
+ resolve(trimmed);
78
+ }
79
+ else {
80
+ reject(new DiagramRenderError(`Mermaid CLI succeeded but output did not contain valid SVG: "${trimmed}"`));
81
+ }
82
+ }
83
+ else {
84
+ const errorMsg = stderrBuffer.trim() || `Process exited with code ${code}`;
85
+ reject(new DiagramRenderError(`Failed to render Mermaid diagram: ${errorMsg}`, {
86
+ cause: new Error(errorMsg),
87
+ }));
88
+ }
89
+ });
90
+ try {
91
+ child.stdin.write(source);
92
+ child.stdin.end();
93
+ }
94
+ catch (writeErr) {
95
+ reject(new DiagramRenderError(`Failed to write to Mermaid CLI stdin: ${writeErr instanceof Error ? writeErr.message : String(writeErr)}`, { cause: writeErr }));
96
+ }
97
+ });
98
+ }
99
+ //# sourceMappingURL=mermaid-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid-executor.js","sourceRoot":"","sources":["../../src/renderer/mermaid-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { DiagramRenderer, DiagramRenderOptions } from './diagram-renderer.js';
2
+ export interface MermaidRendererOptions {
3
+ defaultTheme?: string;
4
+ defaultBackgroundColor?: string;
5
+ }
6
+ /**
7
+ * Renders Mermaid diagram source code into SVG vector markup.
8
+ * Note: PDF layout options (width, height, fit, align) are decoupled
9
+ * and must be handled downstream by the HTML/CSS layout renderer.
10
+ */
11
+ export declare class MermaidRenderer implements DiagramRenderer {
12
+ private readonly defaultTheme?;
13
+ private readonly defaultBackgroundColor?;
14
+ constructor(options?: MermaidRendererOptions);
15
+ /**
16
+ * Converts Mermaid diagram definition source code into an SVG string.
17
+ *
18
+ * @param source Mermaid diagram definition text
19
+ * @param options Optional diagram render options (e.g. theme, background)
20
+ * @returns Pure vector SVG string
21
+ * @throws DiagramRenderError on empty input or syntax/rendering errors
22
+ */
23
+ render(source: string, options?: DiagramRenderOptions): Promise<string>;
24
+ }
25
+ //# sourceMappingURL=mermaid-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid-renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/mermaid-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAInF,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAS;gBAErC,OAAO,CAAC,EAAE,sBAAsB;IAK5C;;;;;;;OAOG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;CAe9E"}
@@ -0,0 +1,35 @@
1
+ import { DiagramRenderError } from './error.js';
2
+ import { executeMermaidCli } from './mermaid-executor.js';
3
+ /**
4
+ * Renders Mermaid diagram source code into SVG vector markup.
5
+ * Note: PDF layout options (width, height, fit, align) are decoupled
6
+ * and must be handled downstream by the HTML/CSS layout renderer.
7
+ */
8
+ export class MermaidRenderer {
9
+ defaultTheme;
10
+ defaultBackgroundColor;
11
+ constructor(options) {
12
+ this.defaultTheme = options?.defaultTheme;
13
+ this.defaultBackgroundColor = options?.defaultBackgroundColor;
14
+ }
15
+ /**
16
+ * Converts Mermaid diagram definition source code into an SVG string.
17
+ *
18
+ * @param source Mermaid diagram definition text
19
+ * @param options Optional diagram render options (e.g. theme, background)
20
+ * @returns Pure vector SVG string
21
+ * @throws DiagramRenderError on empty input or syntax/rendering errors
22
+ */
23
+ async render(source, options) {
24
+ if (!source || source.trim() === '') {
25
+ throw new DiagramRenderError('Failed to render Mermaid diagram: Source is empty or whitespace only.');
26
+ }
27
+ const theme = options?.theme ?? this.defaultTheme;
28
+ const backgroundColor = options?.backgroundColor ?? this.defaultBackgroundColor;
29
+ return executeMermaidCli(source, {
30
+ theme,
31
+ backgroundColor,
32
+ });
33
+ }
34
+ }
35
+ //# sourceMappingURL=mermaid-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid-renderer.js","sourceRoot":"","sources":["../../src/renderer/mermaid-renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAO1D;;;;GAIG;AACH,MAAM,OAAO,eAAe;IACT,YAAY,CAAU;IACtB,sBAAsB,CAAU;IAEjD,YAAY,OAAgC;QAC1C,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;QAC1C,IAAI,CAAC,sBAAsB,GAAG,OAAO,EAAE,sBAAsB,CAAC;IAChE,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,OAA8B;QACzD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACpC,MAAM,IAAI,kBAAkB,CAC1B,uEAAuE,CACxE,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;QAClD,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC,sBAAsB,CAAC;QAEhF,OAAO,iBAAiB,CAAC,MAAM,EAAE;YAC/B,KAAK;YACL,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export interface ExecutePlantUmlOptions {
2
+ jarPath: string;
3
+ javaPath?: string;
4
+ timeoutMs?: number;
5
+ }
6
+ /**
7
+ * Executes the PlantUML CLI in pipe mode to render a PlantUML definition into SVG.
8
+ * Does not use temporary files; uses stdin and stdout streams.
9
+ */
10
+ export declare function executePlantUml(source: string, options: ExecutePlantUmlOptions): Promise<string>;
11
+ //# sourceMappingURL=plantuml-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plantuml-executor.d.ts","sourceRoot":"","sources":["../../src/renderer/plantuml-executor.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,CA0HjB"}
@@ -0,0 +1,100 @@
1
+ import { spawn } from 'node:child_process';
2
+ import fs from 'node:fs/promises';
3
+ import { DiagramRenderError } from './error.js';
4
+ const DEFAULT_TIMEOUT_MS = 30000;
5
+ /**
6
+ * Executes the PlantUML CLI in pipe mode to render a PlantUML definition into SVG.
7
+ * Does not use temporary files; uses stdin and stdout streams.
8
+ */
9
+ export async function executePlantUml(source, options) {
10
+ const { jarPath, javaPath = 'java', timeoutMs = DEFAULT_TIMEOUT_MS } = options;
11
+ // 1. Verify jarPath exists
12
+ try {
13
+ const jarStat = await fs.stat(jarPath);
14
+ if (!jarStat.isFile()) {
15
+ throw new DiagramRenderError(`PlantUML jar was not found: ${jarPath}`);
16
+ }
17
+ }
18
+ catch (err) {
19
+ if (err instanceof DiagramRenderError) {
20
+ throw err;
21
+ }
22
+ throw new DiagramRenderError(`PlantUML jar was not found: ${jarPath}`, { cause: err });
23
+ }
24
+ // 2. Launch Java process with pipe mode
25
+ return new Promise((resolve, reject) => {
26
+ let childProcess;
27
+ try {
28
+ childProcess = spawn(javaPath, ['-Dfile.encoding=UTF-8', '-jar', jarPath, '-charset', 'UTF-8', '-tsvg', '-pipe'], {
29
+ stdio: ['pipe', 'pipe', 'pipe'],
30
+ });
31
+ }
32
+ catch (err) {
33
+ return reject(new DiagramRenderError(`Failed to start PlantUML. Java executable was not found: ${javaPath}`, { cause: err }));
34
+ }
35
+ let stdoutData = '';
36
+ let stderrData = '';
37
+ let isTimedOut = false;
38
+ const timer = setTimeout(() => {
39
+ isTimedOut = true;
40
+ childProcess.kill('SIGTERM');
41
+ reject(new DiagramRenderError(`PlantUML rendering timed out after ${timeoutMs}ms.`));
42
+ }, timeoutMs);
43
+ childProcess.stdout.setEncoding('utf-8');
44
+ childProcess.stdout.on('data', (chunk) => {
45
+ stdoutData += chunk;
46
+ });
47
+ childProcess.stderr.setEncoding('utf-8');
48
+ childProcess.stderr.on('data', (chunk) => {
49
+ stderrData += chunk;
50
+ });
51
+ childProcess.on('error', (err) => {
52
+ clearTimeout(timer);
53
+ if (err.code === 'ENOENT') {
54
+ reject(new DiagramRenderError(`Failed to start PlantUML. Java executable was not found: ${javaPath}`, { cause: err }));
55
+ }
56
+ else {
57
+ reject(new DiagramRenderError(`PlantUML process encountered an error: ${err.message}`, {
58
+ cause: err,
59
+ }));
60
+ }
61
+ });
62
+ childProcess.on('close', (code) => {
63
+ clearTimeout(timer);
64
+ if (isTimedOut) {
65
+ return;
66
+ }
67
+ if (code !== 0) {
68
+ const errorDetails = stderrData.trim() || `Process exited with code ${code}`;
69
+ return reject(new DiagramRenderError(`PlantUML rendering failed: ${errorDetails}`, {
70
+ cause: {
71
+ exitCode: code,
72
+ stderr: stderrData,
73
+ stdout: stdoutData,
74
+ },
75
+ }));
76
+ }
77
+ // Validate SVG output
78
+ if (!stdoutData.includes('<svg')) {
79
+ return reject(new DiagramRenderError('PlantUML output did not contain valid SVG markup.', {
80
+ cause: {
81
+ stdout: stdoutData,
82
+ stderr: stderrData,
83
+ },
84
+ }));
85
+ }
86
+ resolve(stdoutData.trim());
87
+ });
88
+ // Write source to stdin and close the stream
89
+ childProcess.stdin.on('error', (err) => {
90
+ // Avoid unhandled stream error if child process dies early
91
+ clearTimeout(timer);
92
+ reject(new DiagramRenderError(`Failed to write to PlantUML stdin: ${err}`, {
93
+ cause: err,
94
+ }));
95
+ });
96
+ childProcess.stdin.write(source, 'utf-8');
97
+ childProcess.stdin.end();
98
+ });
99
+ }
100
+ //# sourceMappingURL=plantuml-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plantuml-executor.js","sourceRoot":"","sources":["../../src/renderer/plantuml-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { DiagramRenderer, DiagramRenderOptions } from './diagram-renderer.js';
2
+ export interface PlantUmlRendererOptions {
3
+ jarPath?: string;
4
+ javaPath?: string;
5
+ timeoutMs?: number;
6
+ }
7
+ /**
8
+ * Renders PlantUML diagram source code into SVG vector markup
9
+ * using a local Java process and plantuml.jar.
10
+ */
11
+ export declare class PlantUmlRenderer implements DiagramRenderer {
12
+ private readonly jarPath?;
13
+ private readonly javaPath;
14
+ private readonly timeoutMs?;
15
+ constructor(options?: PlantUmlRendererOptions);
16
+ /**
17
+ * Converts PlantUML diagram definition source code into an SVG string.
18
+ *
19
+ * @param source PlantUML diagram definition text (typically includes @startuml ... @enduml)
20
+ * @param _options Optional diagram render options
21
+ * @returns Pure vector SVG string
22
+ * @throws DiagramRenderError on empty input, missing jar/java, or syntax/rendering errors
23
+ */
24
+ render(source: string, _options?: DiagramRenderOptions): Promise<string>;
25
+ }
26
+ //# sourceMappingURL=plantuml-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plantuml-renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/plantuml-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAInF,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,eAAe;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;gBAExB,OAAO,CAAC,EAAE,uBAAuB;IAM7C;;;;;;;OAOG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;CAmB/E"}
@@ -0,0 +1,95 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { DiagramRenderError } from './error.js';
4
+ import { executePlantUml } from './plantuml-executor.js';
5
+ /**
6
+ * Common default paths where PlantUML jar might reside.
7
+ */
8
+ const KNOWN_JAR_CANDIDATES = [
9
+ '/usr/local/opt/plantuml/libexec/plantuml.jar',
10
+ '/usr/share/plantuml/plantuml.jar',
11
+ '/opt/homebrew/opt/plantuml/libexec/plantuml.jar',
12
+ ];
13
+ /**
14
+ * Common default paths where Java executable might reside on macOS / Unix.
15
+ */
16
+ const KNOWN_JAVA_CANDIDATES = [
17
+ '/usr/local/opt/openjdk/bin/java',
18
+ '/opt/homebrew/opt/openjdk/bin/java',
19
+ ];
20
+ function resolveDefaultJavaPath() {
21
+ if (process.env.PLANTUML_JAVA_PATH) {
22
+ return process.env.PLANTUML_JAVA_PATH;
23
+ }
24
+ if (process.env.JAVA_HOME) {
25
+ const javaBin = path.join(process.env.JAVA_HOME, 'bin', 'java');
26
+ if (fs.existsSync(javaBin)) {
27
+ return javaBin;
28
+ }
29
+ }
30
+ for (const candidate of KNOWN_JAVA_CANDIDATES) {
31
+ if (fs.existsSync(candidate)) {
32
+ return candidate;
33
+ }
34
+ }
35
+ return 'java';
36
+ }
37
+ function resolveDefaultJarPath() {
38
+ if (process.env.PLANTUML_JAR_PATH) {
39
+ return process.env.PLANTUML_JAR_PATH;
40
+ }
41
+ // Check Cursor extension path if present
42
+ const homeDir = process.env.HOME;
43
+ if (homeDir) {
44
+ const cursorCandidate = path.join(homeDir, '.cursor/extensions/jebbs.plantuml-2.18.1/plantuml.jar');
45
+ if (fs.existsSync(cursorCandidate)) {
46
+ return cursorCandidate;
47
+ }
48
+ const vscodeCandidate = path.join(homeDir, '.vscode/extensions/jebbs.plantuml-2.18.1/plantuml.jar');
49
+ if (fs.existsSync(vscodeCandidate)) {
50
+ return vscodeCandidate;
51
+ }
52
+ }
53
+ for (const candidate of KNOWN_JAR_CANDIDATES) {
54
+ if (fs.existsSync(candidate)) {
55
+ return candidate;
56
+ }
57
+ }
58
+ return undefined;
59
+ }
60
+ /**
61
+ * Renders PlantUML diagram source code into SVG vector markup
62
+ * using a local Java process and plantuml.jar.
63
+ */
64
+ export class PlantUmlRenderer {
65
+ jarPath;
66
+ javaPath;
67
+ timeoutMs;
68
+ constructor(options) {
69
+ this.jarPath = options?.jarPath ?? resolveDefaultJarPath();
70
+ this.javaPath = options?.javaPath ?? resolveDefaultJavaPath();
71
+ this.timeoutMs = options?.timeoutMs;
72
+ }
73
+ /**
74
+ * Converts PlantUML diagram definition source code into an SVG string.
75
+ *
76
+ * @param source PlantUML diagram definition text (typically includes @startuml ... @enduml)
77
+ * @param _options Optional diagram render options
78
+ * @returns Pure vector SVG string
79
+ * @throws DiagramRenderError on empty input, missing jar/java, or syntax/rendering errors
80
+ */
81
+ async render(source, _options) {
82
+ if (!source || source.trim() === '') {
83
+ throw new DiagramRenderError('Failed to render PlantUML diagram: Source is empty or whitespace only.');
84
+ }
85
+ if (!this.jarPath) {
86
+ throw new DiagramRenderError('PlantUML jar path is not configured. Please specify jarPath in PlantUmlRendererOptions or set PLANTUML_JAR_PATH.');
87
+ }
88
+ return executePlantUml(source, {
89
+ jarPath: this.jarPath,
90
+ javaPath: this.javaPath,
91
+ timeoutMs: this.timeoutMs,
92
+ });
93
+ }
94
+ }
95
+ //# sourceMappingURL=plantuml-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plantuml-renderer.js","sourceRoot":"","sources":["../../src/renderer/plantuml-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export type DiagramType = 'mermaid' | 'plantuml';
2
+ export type DiagramFit = 'contain' | 'fill';
3
+ export type DiagramAlign = 'left' | 'center' | 'right';
4
+ /**
5
+ * Raw diagram options parsed directly from block fence attributes.
6
+ * Properties are undefined if not explicitly specified.
7
+ */
8
+ export interface RawDiagramOptions {
9
+ width?: string;
10
+ height?: string;
11
+ fit?: DiagramFit;
12
+ align?: DiagramAlign;
13
+ }
14
+ /**
15
+ * Resolved diagram options after merging defaults and document-level options.
16
+ */
17
+ export interface ResolvedDiagramOptions {
18
+ width?: string;
19
+ height?: string;
20
+ fit: DiagramFit;
21
+ align: DiagramAlign;
22
+ }
23
+ /**
24
+ * Backward compatibility alias for ResolvedDiagramOptions.
25
+ */
26
+ export type DiagramOptions = ResolvedDiagramOptions;
27
+ export interface DiagramBlock {
28
+ type: DiagramType;
29
+ source: string;
30
+ options: ResolvedDiagramOptions;
31
+ rawOptions?: RawDiagramOptions;
32
+ line?: number;
33
+ }
34
+ //# sourceMappingURL=diagram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagram.d.ts","sourceRoot":"","sources":["../../src/types/diagram.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAE5C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,YAAY,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,sBAAsB,CAAC;IAChC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=diagram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagram.js","sourceRoot":"","sources":["../../src/types/diagram.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "md-tech-pdf",
3
+ "version": "0.1.0",
4
+ "description": "Technical document PDF generator from Markdown with flexible diagram layout",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "md-tech-pdf": "dist/cli/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "README.ja.md",
15
+ "LICENSE"
16
+ ],
17
+ "engines": {
18
+ "node": ">=20.0.0"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/ikaruga-tech/md-tech-pdf.git"
23
+ },
24
+ "homepage": "https://github.com/ikaruga-tech/md-tech-pdf#readme",
25
+ "bugs": {
26
+ "url": "https://github.com/ikaruga-tech/md-tech-pdf/issues"
27
+ },
28
+ "scripts": {
29
+ "build": "tsc && chmod +x dist/cli/index.js",
30
+ "lint": "eslint .",
31
+ "format": "prettier --write .",
32
+ "format:check": "prettier --check .",
33
+ "test": "vitest run",
34
+ "dev:cli": "tsx src/cli/index.ts",
35
+ "dev:mermaid": "tsx tools/test-mermaid.ts",
36
+ "dev:html": "tsx tools/test-html.ts",
37
+ "dev:pdf": "tsx tools/test-pdf.ts",
38
+ "dev:plantuml": "tsx tools/test-plantuml.ts"
39
+ },
40
+ "keywords": [
41
+ "markdown",
42
+ "pdf",
43
+ "technical-writing",
44
+ "diagrams",
45
+ "mermaid",
46
+ "plantuml",
47
+ "cli"
48
+ ],
49
+ "author": "",
50
+ "license": "Apache-2.0",
51
+ "devDependencies": {
52
+ "@eslint/js": "^10.0.1",
53
+ "@types/markdown-it": "^14.2.0",
54
+ "@types/node": "^26.5.0",
55
+ "eslint": "^10.10.0",
56
+ "eslint-config-prettier": "^10.1.8",
57
+ "prettier": "^3.9.6",
58
+ "tsx": "^4.23.13",
59
+ "typescript": "^5.9.3",
60
+ "typescript-eslint": "^8.70.0",
61
+ "vitest": "^5.0.0"
62
+ },
63
+ "dependencies": {
64
+ "@mermaid-js/mermaid-cli": "^11.17.0",
65
+ "commander": "^15.0.0",
66
+ "markdown-it": "^15.0.1",
67
+ "playwright": "^1.63.0",
68
+ "yaml": "^2.9.0"
69
+ }
70
+ }