@lydt/geogebra-studio 0.0.0-stage → 0.4.0-rc.2
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/.agents/plugins/marketplace.json +21 -0
- package/.codex-plugin/plugin.json +21 -0
- package/.mcp.json +18 -0
- package/LICENSE +339 -0
- package/LICENSE-MIT +21 -0
- package/README.md +108 -2
- package/README.zh-CN.md +89 -0
- package/THIRD_PARTY_NOTICES.md +35 -0
- package/dist/cli.d.ts +27 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +234 -0
- package/dist/cli.js.map +1 -0
- package/dist/export/files.d.ts +4 -0
- package/dist/export/files.d.ts.map +1 -0
- package/dist/export/files.js +44 -0
- package/dist/export/files.js.map +1 -0
- package/dist/export/gikz.d.ts +11 -0
- package/dist/export/gikz.d.ts.map +1 -0
- package/dist/export/gikz.js +28 -0
- package/dist/export/gikz.js.map +1 -0
- package/dist/export/html.d.ts +14 -0
- package/dist/export/html.d.ts.map +1 -0
- package/dist/export/html.js +97 -0
- package/dist/export/html.js.map +1 -0
- package/dist/export/semantic.d.ts +43 -0
- package/dist/export/semantic.d.ts.map +1 -0
- package/dist/export/semantic.js +212 -0
- package/dist/export/semantic.js.map +1 -0
- package/dist/export/viewer-themes.d.ts +76 -0
- package/dist/export/viewer-themes.d.ts.map +1 -0
- package/dist/export/viewer-themes.js +169 -0
- package/dist/export/viewer-themes.js.map +1 -0
- package/dist/export/workspace.d.ts +4 -0
- package/dist/export/workspace.d.ts.map +1 -0
- package/dist/export/workspace.js +25 -0
- package/dist/export/workspace.js.map +1 -0
- package/dist/gikz-browser.js +770 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +35 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +187 -0
- package/dist/server.js.map +1 -0
- package/dist/studio/artifact.d.ts +37 -0
- package/dist/studio/artifact.d.ts.map +1 -0
- package/dist/studio/artifact.js +61 -0
- package/dist/studio/artifact.js.map +1 -0
- package/dist/studio/browser.d.ts +7 -0
- package/dist/studio/browser.d.ts.map +1 -0
- package/dist/studio/browser.js +67 -0
- package/dist/studio/browser.js.map +1 -0
- package/dist/studio/install.d.ts +4 -0
- package/dist/studio/install.d.ts.map +1 -0
- package/dist/studio/install.js +60 -0
- package/dist/studio/install.js.map +1 -0
- package/dist/tools/apps-api-tools.d.ts +4 -0
- package/dist/tools/apps-api-tools.d.ts.map +1 -0
- package/dist/tools/apps-api-tools.js +96 -0
- package/dist/tools/apps-api-tools.js.map +1 -0
- package/dist/tools/educational-templates.d.ts +33 -0
- package/dist/tools/educational-templates.d.ts.map +1 -0
- package/dist/tools/educational-templates.js +261 -0
- package/dist/tools/educational-templates.js.map +1 -0
- package/dist/tools/export-tools.d.ts +3 -0
- package/dist/tools/export-tools.d.ts.map +1 -0
- package/dist/tools/export-tools.js +118 -0
- package/dist/tools/export-tools.js.map +1 -0
- package/dist/tools/geogebra-tools.d.ts +15 -0
- package/dist/tools/geogebra-tools.d.ts.map +1 -0
- package/dist/tools/geogebra-tools.js +3442 -0
- package/dist/tools/geogebra-tools.js.map +1 -0
- package/dist/tools/index.d.ts +43 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +183 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/performance-tools.d.ts +7 -0
- package/dist/tools/performance-tools.d.ts.map +1 -0
- package/dist/tools/performance-tools.js +312 -0
- package/dist/tools/performance-tools.js.map +1 -0
- package/dist/tools/templates/algebra-templates.d.ts +7 -0
- package/dist/tools/templates/algebra-templates.d.ts.map +1 -0
- package/dist/tools/templates/algebra-templates.js +568 -0
- package/dist/tools/templates/algebra-templates.js.map +1 -0
- package/dist/tools/templates/geometry-templates.d.ts +7 -0
- package/dist/tools/templates/geometry-templates.d.ts.map +1 -0
- package/dist/tools/templates/geometry-templates.js +492 -0
- package/dist/tools/templates/geometry-templates.js.map +1 -0
- package/dist/types/geogebra.d.ts +103 -0
- package/dist/types/geogebra.d.ts.map +1 -0
- package/dist/types/geogebra.js +34 -0
- package/dist/types/geogebra.js.map +1 -0
- package/dist/types/mcp.d.ts +125 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +19 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/utils/app-info.d.ts +12 -0
- package/dist/utils/app-info.d.ts.map +1 -0
- package/dist/utils/app-info.js +30 -0
- package/dist/utils/app-info.js.map +1 -0
- package/dist/utils/errors.d.ts +37 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +72 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/gemini-compatibility.d.ts +39 -0
- package/dist/utils/gemini-compatibility.d.ts.map +1 -0
- package/dist/utils/gemini-compatibility.js +154 -0
- package/dist/utils/gemini-compatibility.js.map +1 -0
- package/dist/utils/geogebra-instance.d.ts +252 -0
- package/dist/utils/geogebra-instance.d.ts.map +1 -0
- package/dist/utils/geogebra-instance.js +1560 -0
- package/dist/utils/geogebra-instance.js.map +1 -0
- package/dist/utils/geogebra-mock.d.ts +172 -0
- package/dist/utils/geogebra-mock.d.ts.map +1 -0
- package/dist/utils/geogebra-mock.js +732 -0
- package/dist/utils/geogebra-mock.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +46 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/performance/index.d.ts +76 -0
- package/dist/utils/performance/index.d.ts.map +1 -0
- package/dist/utils/performance/index.js +163 -0
- package/dist/utils/performance/index.js.map +1 -0
- package/dist/utils/performance/instance-pool.d.ts +78 -0
- package/dist/utils/performance/instance-pool.d.ts.map +1 -0
- package/dist/utils/performance/instance-pool.js +268 -0
- package/dist/utils/performance/instance-pool.js.map +1 -0
- package/dist/utils/validation.d.ts +92 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +557 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/widget.html +110 -0
- package/docs/APPS-API-BRIDGE.md +28 -0
- package/docs/MODERNIZATION.md +15 -0
- package/docs/TANGENT-REGRESSION.md +34 -0
- package/docs/VALIDATION.md +26 -0
- package/docs/VISUAL-STANDARD.md +26 -0
- package/docs/images/native-construction.png +0 -0
- package/examples/tangent-construction.json +26 -0
- package/gikz/LICENSE +339 -0
- package/gikz/PROVENANCE.md +8 -0
- package/gikz/browser.cjs +2 -0
- package/gikz/cli.cjs +195 -0
- package/gikz/core.cjs +806 -0
- package/mcp.json +20 -0
- package/package.json +107 -4
- package/plugin.json +35 -0
- package/runtime/package.json +4 -0
- package/scripts/build-plugin.cjs +15 -0
- package/scripts/build-widget.cjs +7 -0
- package/skills/geogebra-construct/SKILL.md +40 -0
- package/skills/geogebra-setup/SKILL.md +37 -0
- package/skills/geometry-export/SKILL.md +31 -0
- package/src/cli.ts +212 -0
- package/src/export/files.ts +26 -0
- package/src/export/gikz.ts +22 -0
- package/src/export/html.ts +108 -0
- package/src/export/semantic.ts +180 -0
- package/src/export/viewer-themes.ts +165 -0
- package/src/export/workspace.ts +15 -0
- package/src/index.ts +71 -0
- package/src/server.ts +168 -0
- package/src/studio/artifact.ts +50 -0
- package/src/studio/browser.ts +38 -0
- package/src/studio/install.ts +43 -0
- package/src/tools/apps-api-tools.ts +96 -0
- package/src/tools/educational-templates.ts +299 -0
- package/src/tools/export-tools.ts +110 -0
- package/src/tools/geogebra-tools.ts +3836 -0
- package/src/tools/index.ts +192 -0
- package/src/tools/performance-tools.ts +322 -0
- package/src/tools/templates/algebra-templates.ts +619 -0
- package/src/tools/templates/geometry-templates.ts +550 -0
- package/src/types/geogebra.ts +140 -0
- package/src/types/global.d.ts +31 -0
- package/src/types/mcp.ts +141 -0
- package/src/utils/app-info.ts +35 -0
- package/src/utils/errors.ts +97 -0
- package/src/utils/gemini-compatibility.ts +193 -0
- package/src/utils/geogebra-instance.ts +1712 -0
- package/src/utils/geogebra-mock.ts +867 -0
- package/src/utils/logger.ts +60 -0
- package/src/utils/performance/index.ts +211 -0
- package/src/utils/performance/instance-pool.ts +323 -0
- package/src/utils/validation.ts +647 -0
- package/tsconfig.json +35 -0
- package/widget/main.ts +12 -0
package/gikz/cli.cjs
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Gikz — Clean GeoGebra TikZ exports into concise, readable LaTeX code
|
|
3
|
+
//
|
|
4
|
+
// Derived from GGB-Tikz-Code-Filter by By990920
|
|
5
|
+
// Original: https://github.com/By990920/GGB-Tikz-Code-Filter
|
|
6
|
+
//
|
|
7
|
+
// Copyright (C) 2026
|
|
8
|
+
// This program is free software; you can redistribute it and/or modify
|
|
9
|
+
// it under the terms of the GNU General Public License as published by
|
|
10
|
+
// the Free Software Foundation; either version 2 of the License, or
|
|
11
|
+
// (at your option) any later version.
|
|
12
|
+
//
|
|
13
|
+
// 用法:
|
|
14
|
+
// node gikz.js [选项] <文件...>
|
|
15
|
+
// cat export.txt | node gikz.js [选项]
|
|
16
|
+
//
|
|
17
|
+
// 选项:
|
|
18
|
+
// --standalone, -s 输出完整 standalone LaTeX 文档
|
|
19
|
+
// --tikzonly, -t 仅输出 tikzpicture 片段(默认)
|
|
20
|
+
// --no-points 不输出点标记
|
|
21
|
+
// --no-labels 不输出点标签
|
|
22
|
+
// --no-round 不四舍五入坐标
|
|
23
|
+
// --output, -o <file> 输出到文件(批量时为目录)
|
|
24
|
+
// --help, -h 显示帮助
|
|
25
|
+
|
|
26
|
+
'use strict';
|
|
27
|
+
const fs=require('node:fs');
|
|
28
|
+
const path=require('node:path');
|
|
29
|
+
const zlib=require('node:zlib');
|
|
30
|
+
const {cleanTikZCode,wrapStandalone,convertGeoGebraXML}=require('./core.cjs');
|
|
31
|
+
function readGGB(buf) {
|
|
32
|
+
let eocdPos = -1;
|
|
33
|
+
for (let i = buf.length - 22; i >= Math.max(0, buf.length - 65557); i--) {
|
|
34
|
+
if (buf.readUInt32LE(i) === 0x06054b50) { eocdPos = i; break; }
|
|
35
|
+
}
|
|
36
|
+
if (eocdPos === -1) throw new Error('无效的 GGB 文件(非 ZIP 格式)');
|
|
37
|
+
|
|
38
|
+
const cdEntries = buf.readUInt16LE(eocdPos + 10);
|
|
39
|
+
const cdOffset = buf.readUInt32LE(eocdPos + 16);
|
|
40
|
+
let pos = cdOffset;
|
|
41
|
+
for (let i = 0; i < cdEntries; i++) {
|
|
42
|
+
if (pos + 46 > buf.length || buf.readUInt32LE(pos) !== 0x02014b50) break;
|
|
43
|
+
const method = buf.readUInt16LE(pos + 10);
|
|
44
|
+
const cSize = buf.readUInt32LE(pos + 20);
|
|
45
|
+
const nameLen = buf.readUInt16LE(pos + 28);
|
|
46
|
+
const extraLen = buf.readUInt16LE(pos + 30);
|
|
47
|
+
const cmtLen = buf.readUInt16LE(pos + 32);
|
|
48
|
+
const locOff = buf.readUInt32LE(pos + 42);
|
|
49
|
+
const name = buf.toString('utf8', pos + 46, pos + 46 + nameLen);
|
|
50
|
+
if (name === 'geogebra.xml') {
|
|
51
|
+
const lnLen = buf.readUInt16LE(locOff + 26);
|
|
52
|
+
const leLen = buf.readUInt16LE(locOff + 28);
|
|
53
|
+
const data = buf.slice(locOff + 30 + lnLen + leLen, locOff + 30 + lnLen + leLen + cSize);
|
|
54
|
+
if (method === 0) return data.toString('utf8');
|
|
55
|
+
if (method === 8) return zlib.inflateRawSync(data).toString('utf8');
|
|
56
|
+
throw new Error(`GGB: 不支持的压缩方法 ${method}`);
|
|
57
|
+
}
|
|
58
|
+
pos += 46 + nameLen + extraLen + cmtLen;
|
|
59
|
+
}
|
|
60
|
+
throw new Error('GGB 文件中未找到 geogebra.xml');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function printHelp() {
|
|
64
|
+
console.log(`
|
|
65
|
+
Gikz — GeoGebra TikZ 代码清洗工具
|
|
66
|
+
|
|
67
|
+
用法:
|
|
68
|
+
node gikz.js [选项] <文件...>
|
|
69
|
+
cat export.txt | node gikz.js [选项]
|
|
70
|
+
|
|
71
|
+
支持的输入格式:
|
|
72
|
+
.txt/.tex GeoGebra TikZ 导出文件(清洗模式)
|
|
73
|
+
.ggb GeoGebra 工程文件(直接转换)
|
|
74
|
+
.xml GeoGebra XML 文件(直接转换)
|
|
75
|
+
|
|
76
|
+
选项:
|
|
77
|
+
--standalone, -s 输出完整 standalone LaTeX 文档
|
|
78
|
+
--tikzonly, -t 仅输出 tikzpicture 片段(默认)
|
|
79
|
+
--no-points 不输出点标记
|
|
80
|
+
--no-labels 不输出点标签
|
|
81
|
+
--no-round 不四舍五入坐标(保留原始精度)
|
|
82
|
+
--output, -o <path> 输出到文件(多文件时为目录)
|
|
83
|
+
--help, -h 显示此帮助
|
|
84
|
+
|
|
85
|
+
示例:
|
|
86
|
+
node gikz.js export.txt
|
|
87
|
+
node gikz.js figure.ggb
|
|
88
|
+
node gikz.js -s -o clean.tex export.txt
|
|
89
|
+
node gikz.js *.txt -o output/
|
|
90
|
+
cat export.txt | node gikz.js -s
|
|
91
|
+
`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function parseArgs(argv) {
|
|
95
|
+
const args = argv.slice(2);
|
|
96
|
+
const opts = { standalone: false, points: true, labels: true, round: true, output: null, files: [] };
|
|
97
|
+
|
|
98
|
+
for (let i = 0; i < args.length; i++) {
|
|
99
|
+
switch (args[i]) {
|
|
100
|
+
case '--standalone': case '-s': opts.standalone = true; break;
|
|
101
|
+
case '--tikzonly': case '-t': opts.standalone = false; break;
|
|
102
|
+
case '--no-points': opts.points = false; break;
|
|
103
|
+
case '--no-labels': opts.labels = false; break;
|
|
104
|
+
case '--no-round': opts.round = false; break;
|
|
105
|
+
case '--output': case '-o':
|
|
106
|
+
opts.output = args[++i]; break;
|
|
107
|
+
case '--help': case '-h':
|
|
108
|
+
printHelp(); process.exit(0);
|
|
109
|
+
default:
|
|
110
|
+
if (args[i].startsWith('-')) { console.error(`未知选项: ${args[i]}`); process.exit(1); }
|
|
111
|
+
opts.files.push(args[i]);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return opts;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function processContent(content, opts) {
|
|
118
|
+
let tikz;
|
|
119
|
+
if (Buffer.isBuffer(content)) {
|
|
120
|
+
const xml = readGGB(content);
|
|
121
|
+
tikz = convertGeoGebraXML(xml, opts);
|
|
122
|
+
} else if (content.includes('<geogebra') && content.includes('<construction')) {
|
|
123
|
+
tikz = convertGeoGebraXML(content, opts);
|
|
124
|
+
} else {
|
|
125
|
+
tikz = cleanTikZCode(content, opts);
|
|
126
|
+
}
|
|
127
|
+
if (opts.standalone) tikz = wrapStandalone(tikz);
|
|
128
|
+
return tikz;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function main() {
|
|
132
|
+
const opts = parseArgs(process.argv);
|
|
133
|
+
const isTTY = process.stdin.isTTY;
|
|
134
|
+
|
|
135
|
+
if (opts.files.length === 0 && isTTY) {
|
|
136
|
+
printHelp();
|
|
137
|
+
process.exit(0);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// stdin 模式
|
|
141
|
+
if (opts.files.length === 0) {
|
|
142
|
+
let data = '';
|
|
143
|
+
process.stdin.setEncoding('utf8');
|
|
144
|
+
process.stdin.on('data', chunk => data += chunk);
|
|
145
|
+
process.stdin.on('end', () => {
|
|
146
|
+
try {
|
|
147
|
+
const result = processContent(data, opts);
|
|
148
|
+
if (opts.output) {
|
|
149
|
+
fs.writeFileSync(opts.output, result, 'utf8');
|
|
150
|
+
console.error(`✔ 已写入 ${opts.output}`);
|
|
151
|
+
} else {
|
|
152
|
+
process.stdout.write(result + '\n');
|
|
153
|
+
}
|
|
154
|
+
} catch (e) {
|
|
155
|
+
console.error(`✘ 错误: ${e.message}`);
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// 文件模式
|
|
163
|
+
const isDir = opts.output && opts.files.length > 1;
|
|
164
|
+
if (isDir && !fs.existsSync(opts.output)) fs.mkdirSync(opts.output, { recursive: true });
|
|
165
|
+
|
|
166
|
+
let ok = 0, fail = 0;
|
|
167
|
+
for (const file of opts.files) {
|
|
168
|
+
try {
|
|
169
|
+
const ext = path.extname(file).toLowerCase();
|
|
170
|
+
const content = ext === '.ggb' ? fs.readFileSync(file) : fs.readFileSync(file, 'utf8');
|
|
171
|
+
const result = processContent(content, opts);
|
|
172
|
+
|
|
173
|
+
if (opts.output) {
|
|
174
|
+
const outPath = isDir
|
|
175
|
+
? path.join(opts.output, path.basename(file, path.extname(file)) + '.tex')
|
|
176
|
+
: opts.output;
|
|
177
|
+
fs.writeFileSync(outPath, result, 'utf8');
|
|
178
|
+
console.error(`✔ ${file} → ${outPath}`);
|
|
179
|
+
} else {
|
|
180
|
+
if (opts.files.length > 1) console.log(`% === ${file} ===`);
|
|
181
|
+
process.stdout.write(result + '\n');
|
|
182
|
+
}
|
|
183
|
+
ok++;
|
|
184
|
+
} catch (e) {
|
|
185
|
+
console.error(`✘ ${file}: ${e.message}`);
|
|
186
|
+
fail++;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (opts.files.length > 1) console.error(`\n完成: ${ok} 成功, ${fail} 失败`);
|
|
191
|
+
if (fail > 0) process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
module.exports = {processContent, readGGB};
|
|
195
|
+
if(require.main===module)main();
|