marhup 0.1.8 → 0.1.9
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.
- package/README.md +419 -2
- package/dist/cli.js +659 -78
- package/dist/cli.js.map +1 -1
- package/dist/errors.d.ts +29 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +62 -0
- package/dist/errors.js.map +1 -0
- package/dist/generator/code.d.ts +4 -3
- package/dist/generator/code.d.ts.map +1 -1
- package/dist/generator/code.js +7 -7
- package/dist/generator/code.js.map +1 -1
- package/dist/generator/gen-animations.d.ts +13 -0
- package/dist/generator/gen-animations.d.ts.map +1 -0
- package/dist/generator/gen-animations.js +77 -0
- package/dist/generator/gen-animations.js.map +1 -0
- package/dist/generator/image.d.ts +4 -3
- package/dist/generator/image.d.ts.map +1 -1
- package/dist/generator/image.js +67 -80
- package/dist/generator/image.js.map +1 -1
- package/dist/generator/index.d.ts +2 -0
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +9 -18
- package/dist/generator/index.js.map +1 -1
- package/dist/generator/list.d.ts +4 -3
- package/dist/generator/list.d.ts.map +1 -1
- package/dist/generator/list.js +15 -17
- package/dist/generator/list.js.map +1 -1
- package/dist/generator/mermaid.d.ts +9 -4
- package/dist/generator/mermaid.d.ts.map +1 -1
- package/dist/generator/mermaid.js +120 -85
- package/dist/generator/mermaid.js.map +1 -1
- package/dist/generator/pptx.d.ts +1 -1
- package/dist/generator/pptx.d.ts.map +1 -1
- package/dist/generator/pptx.js +232 -60
- package/dist/generator/pptx.js.map +1 -1
- package/dist/generator/presentation.d.ts +149 -0
- package/dist/generator/presentation.d.ts.map +1 -0
- package/dist/generator/presentation.js +163 -0
- package/dist/generator/presentation.js.map +1 -0
- package/dist/generator/table.d.ts +4 -3
- package/dist/generator/table.d.ts.map +1 -1
- package/dist/generator/table.js +12 -33
- package/dist/generator/table.js.map +1 -1
- package/dist/generator/text.d.ts +5 -4
- package/dist/generator/text.d.ts.map +1 -1
- package/dist/generator/text.js +34 -20
- package/dist/generator/text.js.map +1 -1
- package/dist/generator/video.d.ts +18 -0
- package/dist/generator/video.d.ts.map +1 -0
- package/dist/generator/video.js +83 -0
- package/dist/generator/video.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +144 -55
- package/dist/index.js.map +1 -1
- package/dist/layout/auto.d.ts +14 -2
- package/dist/layout/auto.d.ts.map +1 -1
- package/dist/layout/auto.js +129 -37
- package/dist/layout/auto.js.map +1 -1
- package/dist/layout/engine.d.ts +1 -1
- package/dist/layout/engine.d.ts.map +1 -1
- package/dist/layout/engine.js +10 -12
- package/dist/layout/engine.js.map +1 -1
- package/dist/layout/index.d.ts +1 -1
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +2 -10
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/types.d.ts +1 -0
- package/dist/layout/types.d.ts.map +1 -1
- package/dist/layout/types.js +1 -2
- package/dist/layout/types.js.map +1 -1
- package/dist/mcp-handlers.d.ts.map +1 -1
- package/dist/mcp-handlers.js +15 -51
- package/dist/mcp-handlers.js.map +1 -1
- package/dist/mcp.js +10 -12
- package/dist/mcp.js.map +1 -1
- package/dist/parser/frontmatter.d.ts.map +1 -1
- package/dist/parser/frontmatter.js +95 -16
- package/dist/parser/frontmatter.js.map +1 -1
- package/dist/parser/grid.d.ts +5 -7
- package/dist/parser/grid.d.ts.map +1 -1
- package/dist/parser/grid.js +190 -19
- package/dist/parser/grid.js.map +1 -1
- package/dist/parser/index.js +3 -13
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/markdown.d.ts +1 -1
- package/dist/parser/markdown.d.ts.map +1 -1
- package/dist/parser/markdown.js +247 -137
- package/dist/parser/markdown.js.map +1 -1
- package/dist/theme/default.d.ts.map +1 -1
- package/dist/theme/default.js +13 -8
- package/dist/theme/default.js.map +1 -1
- package/dist/theme/index.d.ts +11 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +70 -7
- package/dist/theme/index.js.map +1 -1
- package/dist/types/index.d.ts +54 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -6
- package/dist/types/index.js.map +1 -1
- package/dist/types/plugin.d.ts +50 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +5 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/utils/file-lock.d.ts +27 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +118 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/i18n.d.ts +5 -0
- package/dist/utils/i18n.d.ts.map +1 -0
- package/dist/utils/i18n.js +41 -0
- package/dist/utils/i18n.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path-validation.d.ts +20 -0
- package/dist/utils/path-validation.d.ts.map +1 -0
- package/dist/utils/path-validation.js +39 -0
- package/dist/utils/path-validation.js.map +1 -0
- package/dist/utils/plugin-manager.d.ts +18 -0
- package/dist/utils/plugin-manager.d.ts.map +1 -0
- package/dist/utils/plugin-manager.js +108 -0
- package/dist/utils/plugin-manager.js.map +1 -0
- package/dist/utils/sanitizer.d.ts +14 -0
- package/dist/utils/sanitizer.d.ts.map +1 -0
- package/dist/utils/sanitizer.js +73 -0
- package/dist/utils/sanitizer.js.map +1 -0
- package/package.json +23 -8
package/dist/index.js
CHANGED
|
@@ -1,73 +1,162 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* marhup - Markdown to PowerPoint converter
|
|
4
3
|
* メインエクスポート
|
|
5
4
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (k2 === undefined) k2 = k;
|
|
15
|
-
o[k2] = m[k];
|
|
16
|
-
}));
|
|
17
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
-
}) : function(o, v) {
|
|
20
|
-
o["default"] = v;
|
|
21
|
-
});
|
|
22
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
-
var ownKeys = function(o) {
|
|
24
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
-
var ar = [];
|
|
26
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
-
return ar;
|
|
28
|
-
};
|
|
29
|
-
return ownKeys(o);
|
|
30
|
-
};
|
|
31
|
-
return function (mod) {
|
|
32
|
-
if (mod && mod.__esModule) return mod;
|
|
33
|
-
var result = {};
|
|
34
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
-
__setModuleDefault(result, mod);
|
|
36
|
-
return result;
|
|
37
|
-
};
|
|
38
|
-
})();
|
|
39
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.marhup = marhup;
|
|
41
|
-
exports.marhupFile = marhupFile;
|
|
42
|
-
exports.parse = parse;
|
|
43
|
-
const fs = __importStar(require("fs"));
|
|
44
|
-
const path = __importStar(require("path"));
|
|
45
|
-
const index_1 = require("./parser/index");
|
|
46
|
-
const index_2 = require("./generator/index");
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { parseMarkdown } from './parser/index.js';
|
|
8
|
+
import { generatePptx } from './generator/index.js';
|
|
9
|
+
import { layoutSlide } from './layout/engine.js';
|
|
10
|
+
import { parseGridString } from './parser/frontmatter.js';
|
|
11
|
+
import { pluginManager } from './utils/plugin-manager.js';
|
|
12
|
+
import logger from './utils/logger.js';
|
|
47
13
|
/**
|
|
48
14
|
* MarkdownからPPTXを生成
|
|
49
15
|
*/
|
|
50
|
-
async function marhup(markdown, options) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
16
|
+
export async function marhup(markdown, options) {
|
|
17
|
+
logger.info('Starting PPTX generation', { output: options.output, basePath: options.basePath });
|
|
18
|
+
try {
|
|
19
|
+
// Load plugins
|
|
20
|
+
if (options.pluginDir) {
|
|
21
|
+
await pluginManager.loadPlugins(options.pluginDir);
|
|
22
|
+
await pluginManager.init({ logger, options });
|
|
23
|
+
}
|
|
24
|
+
// パース
|
|
25
|
+
logger.debug('Parsing markdown content');
|
|
26
|
+
const document = parseMarkdown(markdown);
|
|
27
|
+
logger.info(`Parsed document with ${document.slides.length} slides`);
|
|
28
|
+
// Execute onParse hooks
|
|
29
|
+
await pluginManager.executeHook('onParse', document);
|
|
30
|
+
// CLIオプションでデフォルトグリッドを設定
|
|
31
|
+
if (options.grid && !document.globalFrontmatter.grid) {
|
|
32
|
+
document.globalFrontmatter.grid = options.grid;
|
|
33
|
+
logger.debug(`Set default grid to ${options.grid}`);
|
|
34
|
+
}
|
|
35
|
+
// CLIオプションでデフォルトテーマを設定
|
|
36
|
+
if (options.theme && !document.globalFrontmatter.theme) {
|
|
37
|
+
document.globalFrontmatter.theme = options.theme;
|
|
38
|
+
logger.debug(`Set default theme to ${options.theme}`);
|
|
39
|
+
}
|
|
40
|
+
// PPTX生成
|
|
41
|
+
logger.debug('Generating PPTX file');
|
|
42
|
+
await generatePptx(document, options.output, options.basePath);
|
|
43
|
+
logger.info('PPTX generation completed successfully');
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
logger.error('PPTX generation failed', { error: error instanceof Error ? error.message : String(error) });
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
55
49
|
}
|
|
56
50
|
/**
|
|
57
51
|
* MarkdownファイルからPPTXを生成
|
|
58
52
|
*/
|
|
59
|
-
async function marhupFile(inputPath, options) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
53
|
+
export async function marhupFile(inputPath, options) {
|
|
54
|
+
logger.info('Processing markdown file', { inputPath, output: options.output });
|
|
55
|
+
try {
|
|
56
|
+
const markdown = fs.readFileSync(inputPath, 'utf-8');
|
|
57
|
+
logger.debug(`Read ${markdown.length} characters from input file`);
|
|
58
|
+
// メモリ解放のため、処理後にnull化
|
|
59
|
+
const basePath = options.basePath || path.dirname(inputPath);
|
|
60
|
+
logger.debug(`Using base path: ${basePath}`);
|
|
61
|
+
await marhup(markdown, { ...options, basePath });
|
|
62
|
+
// markdownをnull化してGCを助ける
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
logger.error('File processing failed', { inputPath, error: error instanceof Error ? error.message : String(error) });
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
64
68
|
}
|
|
65
69
|
/**
|
|
66
70
|
* Markdownをパースして構造を返す(デバッグ用)
|
|
67
71
|
*/
|
|
68
|
-
function parse(markdown) {
|
|
69
|
-
return
|
|
72
|
+
export function parse(markdown) {
|
|
73
|
+
return parseMarkdown(markdown);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* グリッドマップをテキストで表示
|
|
77
|
+
*/
|
|
78
|
+
function printGridMap(gridMap, elements) {
|
|
79
|
+
const rows = gridMap.length;
|
|
80
|
+
const cols = gridMap[0]?.length || 0;
|
|
81
|
+
console.log(` Layout (${cols}x${rows}):`);
|
|
82
|
+
// 上辺
|
|
83
|
+
console.log(' +' + '-'.repeat(cols * 2 + 1) + '+');
|
|
84
|
+
for (let row = 0; row < rows; row++) {
|
|
85
|
+
let line = ' |';
|
|
86
|
+
for (let col = 0; col < cols; col++) {
|
|
87
|
+
const cell = gridMap[row][col];
|
|
88
|
+
if (cell.occupied && cell.elementIndex !== undefined) {
|
|
89
|
+
const element = elements[cell.elementIndex];
|
|
90
|
+
const typeChar = getElementTypeChar(element.type);
|
|
91
|
+
line += ` ${typeChar}`;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
line += ' ';
|
|
95
|
+
}
|
|
96
|
+
line += '|';
|
|
97
|
+
}
|
|
98
|
+
console.log(line);
|
|
99
|
+
// 行区切り(最後の行以外)
|
|
100
|
+
if (row < rows - 1) {
|
|
101
|
+
console.log(' +' + '-'.repeat(cols * 2 + 1) + '+');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// 下辺
|
|
105
|
+
console.log(' +' + '-'.repeat(cols * 2 + 1) + '+');
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 要素タイプを1文字で表現
|
|
109
|
+
*/
|
|
110
|
+
function getElementTypeChar(type) {
|
|
111
|
+
switch (type) {
|
|
112
|
+
case 'heading': return 'H';
|
|
113
|
+
case 'paragraph': return 'P';
|
|
114
|
+
case 'list': return 'L';
|
|
115
|
+
case 'image': return 'I';
|
|
116
|
+
case 'video': return 'V';
|
|
117
|
+
case 'table': return 'T';
|
|
118
|
+
case 'code': return 'C';
|
|
119
|
+
case 'blockquote': return 'Q';
|
|
120
|
+
case 'mermaid': return 'M';
|
|
121
|
+
default: return '?';
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Markdownのレイアウトをプレビュー表示
|
|
126
|
+
*/
|
|
127
|
+
export function previewLayout(markdown, options = {}) {
|
|
128
|
+
const document = parseMarkdown(markdown);
|
|
129
|
+
const globalFrontmatter = document.globalFrontmatter;
|
|
130
|
+
const defaultGrid = options.grid || globalFrontmatter.grid || '12x9';
|
|
131
|
+
console.log('📋 Layout Preview\n');
|
|
132
|
+
document.slides.forEach((slide, slideIndex) => {
|
|
133
|
+
console.log(`Slide ${slideIndex + 1}:`);
|
|
134
|
+
// グリッド設定を決定
|
|
135
|
+
const gridStr = slide.frontmatter.grid || defaultGrid;
|
|
136
|
+
const grid = parseGridString(gridStr);
|
|
137
|
+
console.log(` Grid: ${grid.cols}x${grid.rows}`);
|
|
138
|
+
// レイアウト計算
|
|
139
|
+
const layoutResult = layoutSlide(slide, globalFrontmatter);
|
|
140
|
+
// グリッドマップを表示
|
|
141
|
+
printGridMap(layoutResult.gridMap, slide.elements);
|
|
142
|
+
// 要素リストを表示
|
|
143
|
+
console.log(' Elements:');
|
|
144
|
+
layoutResult.elements.forEach((element, index) => {
|
|
145
|
+
const pos = element.position;
|
|
146
|
+
const type = element.type.toUpperCase();
|
|
147
|
+
const content = typeof element.content === 'string'
|
|
148
|
+
? element.content.substring(0, 50) + (element.content.length > 50 ? '...' : '')
|
|
149
|
+
: `[${element.type}]`;
|
|
150
|
+
console.log(` ${index + 1}. ${type} [${pos.colStart}-${pos.colEnd}, ${pos.rowStart}-${pos.rowEnd}]: ${content}`);
|
|
151
|
+
});
|
|
152
|
+
console.log('');
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
export async function marhupFromJson(jsonPath, options) {
|
|
156
|
+
const jsonContent = fs.readFileSync(jsonPath, 'utf-8');
|
|
157
|
+
const document = JSON.parse(jsonContent);
|
|
158
|
+
await generatePptx(document, options.output, options.basePath);
|
|
70
159
|
}
|
|
71
160
|
// デフォルトエクスポート
|
|
72
|
-
|
|
161
|
+
export default marhup;
|
|
73
162
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/layout/auto.d.ts
CHANGED
|
@@ -7,6 +7,10 @@ import type { GridMap, PlacedElement } from './types.js';
|
|
|
7
7
|
* 空のグリッドマップを作成
|
|
8
8
|
*/
|
|
9
9
|
export declare function createEmptyGridMap(cols: number, rows: number): GridMap;
|
|
10
|
+
/**
|
|
11
|
+
* グリッド位置が有効か検証
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateGridPosition(position: GridPosition, grid: GridConfig): void;
|
|
10
14
|
/**
|
|
11
15
|
* グリッドマップに要素を配置
|
|
12
16
|
*/
|
|
@@ -20,11 +24,19 @@ export declare function isAreaAvailable(gridMap: GridMap, position: GridPosition
|
|
|
20
24
|
*/
|
|
21
25
|
export declare function estimateElementHeight(element: SlideElement): number;
|
|
22
26
|
/**
|
|
23
|
-
*
|
|
27
|
+
* 要素の幅を推定
|
|
28
|
+
*/
|
|
29
|
+
export declare function estimateElementWidth(element: SlideElement, gridCols: number): number;
|
|
30
|
+
/**
|
|
31
|
+
* 利用可能な位置を検索(古いバージョン、フル幅のみ)
|
|
24
32
|
*/
|
|
25
33
|
export declare function findAvailablePosition(gridMap: GridMap, startRow: number, height: number, grid: GridConfig): GridPosition | null;
|
|
34
|
+
/**
|
|
35
|
+
* 最適な利用可能な位置を検索(幅と高さを指定)
|
|
36
|
+
*/
|
|
37
|
+
export declare function findBestAvailablePosition(gridMap: GridMap, width: number, height: number, grid: GridConfig): GridPosition | null;
|
|
26
38
|
/**
|
|
27
39
|
* 要素を自動配置
|
|
28
40
|
*/
|
|
29
|
-
export declare function autoPlaceElements(elements: SlideElement[], grid: GridConfig): PlacedElement[];
|
|
41
|
+
export declare function autoPlaceElements(elements: SlideElement[], grid: GridConfig, slideIndex?: number): PlacedElement[];
|
|
30
42
|
//# sourceMappingURL=auto.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto.d.ts","sourceRoot":"","sources":["../../src/layout/auto.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"auto.d.ts","sourceRoot":"","sources":["../../src/layout/auto.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0BzD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAItE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CA2CnF;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,YAAY,EACtB,YAAY,EAAE,MAAM,GACnB,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAYT;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAgBnE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,GACf,YAAY,GAAG,IAAI,CAkBrB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,GACf,YAAY,GAAG,IAAI,CAoBrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EAAE,EACxB,IAAI,EAAE,UAAU,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,aAAa,EAAE,CA0GjB"}
|
package/dist/layout/auto.js
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* 自動配置ロジック
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
exports.placeOnGrid = placeOnGrid;
|
|
8
|
-
exports.isAreaAvailable = isAreaAvailable;
|
|
9
|
-
exports.estimateElementHeight = estimateElementHeight;
|
|
10
|
-
exports.findAvailablePosition = findAvailablePosition;
|
|
11
|
-
exports.autoPlaceElements = autoPlaceElements;
|
|
4
|
+
import { GridError } from '../errors.js';
|
|
5
|
+
import { t } from '../utils/i18n.js';
|
|
12
6
|
// 要素タイプごとのデフォルト高さ
|
|
13
7
|
const ELEMENT_HEIGHT = {
|
|
14
8
|
heading: 1,
|
|
@@ -19,16 +13,49 @@ const ELEMENT_HEIGHT = {
|
|
|
19
13
|
code: 3,
|
|
20
14
|
blockquote: 2,
|
|
21
15
|
};
|
|
16
|
+
// 要素タイプごとのデフォルト幅(グリッド列数に対する割合)
|
|
17
|
+
const ELEMENT_WIDTH_RATIO = {
|
|
18
|
+
heading: 1.0, // フル幅
|
|
19
|
+
paragraph: 1.0,
|
|
20
|
+
list: 0.75, // 3/4幅
|
|
21
|
+
image: 0.5, // 半幅
|
|
22
|
+
table: 1.0,
|
|
23
|
+
code: 0.8, // 4/5幅
|
|
24
|
+
blockquote: 0.6, // 3/5幅
|
|
25
|
+
};
|
|
22
26
|
/**
|
|
23
27
|
* 空のグリッドマップを作成
|
|
24
28
|
*/
|
|
25
|
-
function createEmptyGridMap(cols, rows) {
|
|
29
|
+
export function createEmptyGridMap(cols, rows) {
|
|
26
30
|
return Array.from({ length: rows }, () => Array.from({ length: cols }, () => ({ occupied: false })));
|
|
27
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* グリッド位置が有効か検証
|
|
34
|
+
*/
|
|
35
|
+
export function validateGridPosition(position, grid) {
|
|
36
|
+
if (position.colStart < 1 || position.colStart > grid.cols) {
|
|
37
|
+
throw new GridError(t('errors.grid.columnStartOutOfRange', { colStart: position.colStart, cols: grid.cols }), position, t('errors.grid.useColumnNumbers', { cols: grid.cols }));
|
|
38
|
+
}
|
|
39
|
+
if (position.colEnd < 1 || position.colEnd > grid.cols) {
|
|
40
|
+
throw new GridError(t('errors.grid.columnEndOutOfRange', { colEnd: position.colEnd, cols: grid.cols }), position, t('errors.grid.useColumnNumbers', { cols: grid.cols }));
|
|
41
|
+
}
|
|
42
|
+
if (position.rowStart < 1 || position.rowStart > grid.rows) {
|
|
43
|
+
throw new GridError(t('errors.grid.rowStartOutOfRange', { rowStart: position.rowStart, rows: grid.rows }), position, t('errors.grid.useRowNumbers', { rows: grid.rows }));
|
|
44
|
+
}
|
|
45
|
+
if (position.rowEnd < 1 || position.rowEnd > grid.rows) {
|
|
46
|
+
throw new GridError(t('errors.grid.rowEndOutOfRange', { rowEnd: position.rowEnd, rows: grid.rows }), position, t('errors.grid.useRowNumbers', { rows: grid.rows }));
|
|
47
|
+
}
|
|
48
|
+
if (position.colStart > position.colEnd) {
|
|
49
|
+
throw new GridError(t('errors.grid.columnStartGreaterThanEnd', { colStart: position.colStart, colEnd: position.colEnd }), position, t('errors.grid.columnStartShouldBeLessThanEnd'));
|
|
50
|
+
}
|
|
51
|
+
if (position.rowStart > position.rowEnd) {
|
|
52
|
+
throw new GridError(t('errors.grid.rowStartGreaterThanEnd', { rowStart: position.rowStart, rowEnd: position.rowEnd }), position, t('errors.grid.rowStartShouldBeLessThanEnd'));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
28
55
|
/**
|
|
29
56
|
* グリッドマップに要素を配置
|
|
30
57
|
*/
|
|
31
|
-
function placeOnGrid(gridMap, position, elementIndex) {
|
|
58
|
+
export function placeOnGrid(gridMap, position, elementIndex) {
|
|
32
59
|
for (let row = position.rowStart - 1; row < position.rowEnd; row++) {
|
|
33
60
|
for (let col = position.colStart - 1; col < position.colEnd; col++) {
|
|
34
61
|
if (row >= 0 && row < gridMap.length && col >= 0 && col < gridMap[0].length) {
|
|
@@ -40,7 +67,7 @@ function placeOnGrid(gridMap, position, elementIndex) {
|
|
|
40
67
|
/**
|
|
41
68
|
* 指定位置が空いているかチェック
|
|
42
69
|
*/
|
|
43
|
-
function isAreaAvailable(gridMap, position) {
|
|
70
|
+
export function isAreaAvailable(gridMap, position) {
|
|
44
71
|
for (let row = position.rowStart - 1; row < position.rowEnd; row++) {
|
|
45
72
|
for (let col = position.colStart - 1; col < position.colEnd; col++) {
|
|
46
73
|
if (row < 0 || row >= gridMap.length || col < 0 || col >= gridMap[0].length) {
|
|
@@ -56,7 +83,7 @@ function isAreaAvailable(gridMap, position) {
|
|
|
56
83
|
/**
|
|
57
84
|
* 要素の高さを推定
|
|
58
85
|
*/
|
|
59
|
-
function estimateElementHeight(element) {
|
|
86
|
+
export function estimateElementHeight(element) {
|
|
60
87
|
const baseHeight = ELEMENT_HEIGHT[element.type] || 2;
|
|
61
88
|
// リストの場合、アイテム数に応じて調整
|
|
62
89
|
if (element.type === 'list' && Array.isArray(element.content)) {
|
|
@@ -71,9 +98,16 @@ function estimateElementHeight(element) {
|
|
|
71
98
|
return baseHeight;
|
|
72
99
|
}
|
|
73
100
|
/**
|
|
74
|
-
*
|
|
101
|
+
* 要素の幅を推定
|
|
102
|
+
*/
|
|
103
|
+
export function estimateElementWidth(element, gridCols) {
|
|
104
|
+
const ratio = ELEMENT_WIDTH_RATIO[element.type] || 1.0;
|
|
105
|
+
return Math.max(1, Math.floor(gridCols * ratio));
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 利用可能な位置を検索(古いバージョン、フル幅のみ)
|
|
75
109
|
*/
|
|
76
|
-
function findAvailablePosition(gridMap, startRow, height, grid) {
|
|
110
|
+
export function findAvailablePosition(gridMap, startRow, height, grid) {
|
|
77
111
|
const { cols, rows } = grid;
|
|
78
112
|
// 指定行から下に向かって探索
|
|
79
113
|
for (let row = startRow; row <= rows - height + 1; row++) {
|
|
@@ -87,24 +121,54 @@ function findAvailablePosition(gridMap, startRow, height, grid) {
|
|
|
87
121
|
return position;
|
|
88
122
|
}
|
|
89
123
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 最適な利用可能な位置を検索(幅と高さを指定)
|
|
128
|
+
*/
|
|
129
|
+
export function findBestAvailablePosition(gridMap, width, height, grid) {
|
|
130
|
+
const { cols, rows } = grid;
|
|
131
|
+
// グリッド全体を左上からスキャン
|
|
132
|
+
for (let row = 1; row <= rows - height + 1; row++) {
|
|
133
|
+
for (let col = 1; col <= cols - width + 1; col++) {
|
|
134
|
+
const position = {
|
|
135
|
+
colStart: col,
|
|
136
|
+
colEnd: col + width - 1,
|
|
137
|
+
rowStart: row,
|
|
138
|
+
rowEnd: row + height - 1,
|
|
139
|
+
};
|
|
140
|
+
if (isAreaAvailable(gridMap, position)) {
|
|
141
|
+
return position;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
93
144
|
}
|
|
94
145
|
return null;
|
|
95
146
|
}
|
|
96
147
|
/**
|
|
97
148
|
* 要素を自動配置
|
|
98
149
|
*/
|
|
99
|
-
function autoPlaceElements(elements, grid) {
|
|
150
|
+
export function autoPlaceElements(elements, grid, slideIndex) {
|
|
100
151
|
const gridMap = createEmptyGridMap(grid.cols, grid.rows);
|
|
101
152
|
const placed = [];
|
|
102
|
-
let currentRow = 1;
|
|
103
153
|
// まず、明示的に位置指定された要素を配置
|
|
104
154
|
const explicitElements = elements.filter((e) => e.position);
|
|
105
155
|
const implicitElements = elements.filter((e) => !e.position);
|
|
156
|
+
// 明示的要素を面積の昇順でソート(小さい要素を先に配置)
|
|
157
|
+
explicitElements.sort((a, b) => {
|
|
158
|
+
const areaA = (a.position.rowEnd - a.position.rowStart + 1) * (a.position.colEnd - a.position.colStart + 1);
|
|
159
|
+
const areaB = (b.position.rowEnd - b.position.rowStart + 1) * (b.position.colEnd - b.position.colStart + 1);
|
|
160
|
+
return areaA - areaB;
|
|
161
|
+
});
|
|
162
|
+
// 位置未指定要素を面積の降順でソート(大きい要素を先に配置)
|
|
163
|
+
implicitElements.sort((a, b) => {
|
|
164
|
+
const areaA = estimateElementHeight(a) * estimateElementWidth(a, grid.cols);
|
|
165
|
+
const areaB = estimateElementHeight(b) * estimateElementWidth(b, grid.cols);
|
|
166
|
+
return areaB - areaA;
|
|
167
|
+
});
|
|
106
168
|
for (let i = 0; i < explicitElements.length; i++) {
|
|
107
169
|
const element = explicitElements[i];
|
|
170
|
+
validateGridPosition(element.position, grid);
|
|
171
|
+
// 重複を許容するため、利用可能チェックを削除
|
|
108
172
|
placeOnGrid(gridMap, element.position, placed.length);
|
|
109
173
|
placed.push({
|
|
110
174
|
type: element.type,
|
|
@@ -112,13 +176,15 @@ function autoPlaceElements(elements, grid) {
|
|
|
112
176
|
level: element.level,
|
|
113
177
|
position: element.position,
|
|
114
178
|
style: element.style,
|
|
179
|
+
altText: element.altText,
|
|
115
180
|
raw: element.raw,
|
|
116
181
|
});
|
|
117
182
|
}
|
|
118
183
|
// 次に、位置未指定の要素を自動配置
|
|
119
184
|
for (const element of implicitElements) {
|
|
120
185
|
const height = estimateElementHeight(element);
|
|
121
|
-
const
|
|
186
|
+
const width = estimateElementWidth(element, grid.cols);
|
|
187
|
+
let position = findBestAvailablePosition(gridMap, width, height, grid);
|
|
122
188
|
if (position) {
|
|
123
189
|
placeOnGrid(gridMap, position, placed.length);
|
|
124
190
|
placed.push({
|
|
@@ -129,27 +195,53 @@ function autoPlaceElements(elements, grid) {
|
|
|
129
195
|
style: element.style,
|
|
130
196
|
raw: element.raw,
|
|
131
197
|
});
|
|
132
|
-
currentRow = position.rowEnd + 1;
|
|
133
198
|
}
|
|
134
199
|
else {
|
|
135
|
-
//
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
200
|
+
// 配置できない場合は幅と高さを縮めて再試行
|
|
201
|
+
let placedPosition = null;
|
|
202
|
+
for (let w = width; w >= 1; w--) {
|
|
203
|
+
for (let h = height; h >= 1; h--) {
|
|
204
|
+
const pos = findBestAvailablePosition(gridMap, w, h, grid);
|
|
205
|
+
if (pos) {
|
|
206
|
+
placedPosition = pos;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (placedPosition)
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
if (placedPosition) {
|
|
214
|
+
placeOnGrid(gridMap, placedPosition, placed.length);
|
|
215
|
+
placed.push({
|
|
216
|
+
type: element.type,
|
|
217
|
+
content: element.content,
|
|
218
|
+
level: element.level,
|
|
219
|
+
position: placedPosition,
|
|
220
|
+
style: element.style,
|
|
221
|
+
raw: element.raw,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// それでもダメならエラーを投げる(または警告)
|
|
226
|
+
throw new GridError(`Cannot place element of type ${element.type} on the grid${slideIndex ? ` (slide ${slideIndex})` : ''}`, undefined, 'Try reducing the number of elements or increasing grid size');
|
|
227
|
+
}
|
|
151
228
|
}
|
|
152
229
|
}
|
|
230
|
+
// 配置順序を決定論的にする(重複時の描画順序を安定化)
|
|
231
|
+
placed.sort((a, b) => {
|
|
232
|
+
// 行でソート
|
|
233
|
+
if (a.position.rowStart !== b.position.rowStart) {
|
|
234
|
+
return a.position.rowStart - b.position.rowStart;
|
|
235
|
+
}
|
|
236
|
+
// 列でソート
|
|
237
|
+
if (a.position.colStart !== b.position.colStart) {
|
|
238
|
+
return a.position.colStart - b.position.colStart;
|
|
239
|
+
}
|
|
240
|
+
// 面積でソート(小さい要素を先に描画)
|
|
241
|
+
const areaA = (a.position.rowEnd - a.position.rowStart + 1) * (a.position.colEnd - a.position.colStart + 1);
|
|
242
|
+
const areaB = (b.position.rowEnd - b.position.rowStart + 1) * (b.position.colEnd - b.position.colStart + 1);
|
|
243
|
+
return areaA - areaB;
|
|
244
|
+
});
|
|
153
245
|
return placed;
|
|
154
246
|
}
|
|
155
247
|
//# sourceMappingURL=auto.js.map
|
package/dist/layout/auto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto.js","sourceRoot":"","sources":["../../src/layout/auto.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auto.js","sourceRoot":"","sources":["../../src/layout/auto.ts"],"names":[],"mappings":"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"}
|
package/dist/layout/engine.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import type { LayoutResult } from './types.js';
|
|
|
6
6
|
/**
|
|
7
7
|
* スライドのレイアウトを計算
|
|
8
8
|
*/
|
|
9
|
-
export declare function layoutSlide(slide: Slide, globalFrontmatter: SlideFrontmatter): LayoutResult;
|
|
9
|
+
export declare function layoutSlide(slide: Slide, globalFrontmatter: SlideFrontmatter, slideIndex?: number): LayoutResult;
|
|
10
10
|
/**
|
|
11
11
|
* グリッド位置をスライド上の座標に変換(インチ単位)
|
|
12
12
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/layout/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG7E,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/layout/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG7E,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAC;AAG9D;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,iBAAiB,EAAE,gBAAgB,EACnC,UAAU,CAAC,EAAE,MAAM,GAClB,YAAY,CAoBd;AA2BD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAChF,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC5C,MAAM,GAAE,MAAY,GACnB;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAahD"}
|
package/dist/layout/engine.js
CHANGED
|
@@ -1,23 +1,21 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* レイアウトエンジン
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const frontmatter_js_1 = require("../parser/frontmatter.js");
|
|
9
|
-
const auto_js_1 = require("./auto.js");
|
|
10
|
-
// デフォルトグリッド
|
|
11
|
-
const _DEFAULT_GRID = { cols: 12, rows: 9 };
|
|
4
|
+
import { parseGridString } from '../parser/frontmatter.js';
|
|
5
|
+
import { autoPlaceElements } from './auto.js';
|
|
6
|
+
import logger from '../utils/logger.js';
|
|
12
7
|
/**
|
|
13
8
|
* スライドのレイアウトを計算
|
|
14
9
|
*/
|
|
15
|
-
function layoutSlide(slide, globalFrontmatter) {
|
|
10
|
+
export function layoutSlide(slide, globalFrontmatter, slideIndex) {
|
|
11
|
+
logger.debug('Calculating slide layout', { slideIndex, elementCount: slide.elements.length });
|
|
16
12
|
// グリッド設定を決定(スライド個別 > グローバル > デフォルト)
|
|
17
13
|
const gridStr = slide.frontmatter.grid || globalFrontmatter.grid || '12x9';
|
|
18
|
-
const grid =
|
|
14
|
+
const grid = parseGridString(gridStr);
|
|
15
|
+
logger.debug('Using grid configuration', { gridStr, grid });
|
|
19
16
|
// 要素を配置
|
|
20
|
-
const elements =
|
|
17
|
+
const elements = autoPlaceElements(slide.elements, grid, slideIndex);
|
|
18
|
+
logger.debug(`Auto-placed ${elements.length} elements`);
|
|
21
19
|
// グリッドマップを作成(デバッグ用)
|
|
22
20
|
const gridMap = createGridMapFromElements(elements, grid);
|
|
23
21
|
return {
|
|
@@ -45,7 +43,7 @@ function createGridMapFromElements(elements, grid) {
|
|
|
45
43
|
/**
|
|
46
44
|
* グリッド位置をスライド上の座標に変換(インチ単位)
|
|
47
45
|
*/
|
|
48
|
-
function gridToCoordinates(position, grid, slideSize, margin = 0.5) {
|
|
46
|
+
export function gridToCoordinates(position, grid, slideSize, margin = 0.5) {
|
|
49
47
|
const contentWidth = slideSize.width - margin * 2;
|
|
50
48
|
const contentHeight = slideSize.height - margin * 2;
|
|
51
49
|
const cellWidth = contentWidth / grid.cols;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/layout/engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/layout/engine.ts"],"names":[],"mappings":"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"}
|