regen.mde 0.7.0 → 0.8.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 (41) hide show
  1. package/LICENSE +16 -16
  2. package/bin/build-corpus-editor.js +83 -83
  3. package/bin/build-corpus.js +41 -41
  4. package/bin/regen-mdeditor-install.js +27 -27
  5. package/bin/regen-mdeditor-uninstall.js +19 -19
  6. package/bin/validate-katex.js +93 -93
  7. package/desktop/BuildCorpusEditor/BuildCorpusEditor.csproj +22 -22
  8. package/desktop/BuildCorpusEditor/app.manifest +16 -16
  9. package/dist/release/{regen-mde-0.7.0-win-x64.zip → regen-mde-0.8.0-win-x64.zip} +0 -0
  10. package/dist/windows-editor/BuildCorpusEditor.dll +0 -0
  11. package/dist/windows-editor/BuildCorpusEditor.exe +0 -0
  12. package/dist/windows-editor/BuildCorpusEditor.pdb +0 -0
  13. package/dist/windows-editor/BuildCorpusEditor.runtimeconfig.json +1 -1
  14. package/dist/windows-editor/wwwroot/index.html +20 -20
  15. package/editor-web/index.html +21 -21
  16. package/editor-web/vite.config.js +13 -13
  17. package/examples/build-corpus.config.example.json +21 -21
  18. package/installer/install-regen-mde.ps1 +214 -214
  19. package/installer/regen-mde.nsi +81 -81
  20. package/package.json +90 -90
  21. package/pyproject.toml +34 -35
  22. package/requirements.txt +0 -1
  23. package/scripts/build-windows-editor.ps1 +47 -47
  24. package/scripts/package-windows-editor.ps1 +90 -90
  25. package/scripts/run-corpus.ps1 +28 -28
  26. package/scripts/run-editor-implementation-plane.ps1 +226 -226
  27. package/scripts/run-required-tests.ps1 +98 -98
  28. package/scripts/run-smoke.ps1 +28 -28
  29. package/src/build_corpus/__init__.py +1 -1
  30. package/src/build_corpus/equations.py +1345 -80
  31. package/src/build_corpus/templates/__init__.py +1 -1
  32. package/src/build_corpus/validate_assets.py +46 -46
  33. package/tools/audit_corpus.py +203 -203
  34. package/tools/collect_microsoft_word_templates.py +228 -228
  35. package/tools/collect_online_docx_corpus.py +272 -272
  36. package/tools/collect_online_pptx_corpus.py +252 -252
  37. package/tools/compare_pptx_inputs_outputs.py +87 -87
  38. package/tools/roundtrip_docx_corpus.py +171 -171
  39. package/dist/release/regen-mde-0.3.0-win-x64-setup.exe +0 -0
  40. package/dist/release/regen-mde-0.3.0-win-x64.zip +0 -0
  41. package/dist/release/regen-mde-0.7.0-win-x64-setup.exe +0 -0
package/LICENSE CHANGED
@@ -1,16 +1,16 @@
1
- Apache License
2
- Version 2.0, January 2004
3
-
4
- Copyright 2026 LIFE AI
5
-
6
- Licensed under the Apache License, Version 2.0 (the "License");
7
- you may not use this file except in compliance with the License.
8
- You may obtain a copy of the License at
9
-
10
- https://www.apache.org/licenses/LICENSE-2.0
11
-
12
- Unless required by applicable law or agreed to in writing, software
13
- distributed under the License is distributed on an "AS IS" BASIS,
14
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- See the License for the specific language governing permissions and
16
- limitations under the License.
1
+ Apache License
2
+ Version 2.0, January 2004
3
+
4
+ Copyright 2026 LIFE AI
5
+
6
+ Licensed under the Apache License, Version 2.0 (the "License");
7
+ you may not use this file except in compliance with the License.
8
+ You may obtain a copy of the License at
9
+
10
+ https://www.apache.org/licenses/LICENSE-2.0
11
+
12
+ Unless required by applicable law or agreed to in writing, software
13
+ distributed under the License is distributed on an "AS IS" BASIS,
14
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ See the License for the specific language governing permissions and
16
+ limitations under the License.
@@ -1,83 +1,83 @@
1
- #!/usr/bin/env node
2
- const path = require("node:path");
3
- const { spawn } = require("node:child_process");
4
- const fs = require("node:fs");
5
-
6
- const root = path.resolve(__dirname, "..");
7
- const callerCwd = process.cwd();
8
- const candidates = [
9
- path.join(root, "BuildCorpusEditor.exe"),
10
- path.join(root, "dist", "windows-editor", "BuildCorpusEditor.exe"),
11
- path.join(root, "desktop", "BuildCorpusEditor", "bin", "Release", "net8.0-windows", "win-x64", "BuildCorpusEditor.exe"),
12
- ];
13
- const exe = candidates.find((candidate) => fs.existsSync(candidate)) || candidates[0];
14
- const args = process.argv.slice(2);
15
-
16
- if (args.includes("--help") || args.includes("-h")) {
17
- console.log(`regen-mde
18
-
19
- Usage:
20
- regen-mde [document.md|document.docx] [options]
21
- mdeditor [document.md|document.docx] [options]
22
- regen-mdeditor [document.md|document.docx] [options]
23
- regen-mdeditor [document.md|document.docx] [options]
24
- build-corpus-editor [document.md|document.docx] [options]
25
-
26
- Options:
27
- --foreground, --visible Show the editor as an attached foreground process.
28
- --background Launch hidden/offscreen for smoke checks.
29
- --self-test Verify the editor bridge can open the document.
30
- --document-self-test Open, edit, save Markdown, export Word, and reconvert.
31
- --smoke-ui Run the hidden UI smoke test.
32
- --out <dir> Output directory for document self-test.
33
- --help, -h Show this help.
34
- `);
35
- process.exit(0);
36
- }
37
-
38
- const visible = args.includes("--foreground") || args.includes("--visible");
39
- const background = args.includes("--background") || args.includes("--smoke-ui");
40
- const launchArgs = normalizeLaunchArgs(args.filter((arg) => arg !== "--foreground" && arg !== "--visible"));
41
-
42
- const child = spawn(exe, launchArgs, {
43
- cwd: root,
44
- stdio: "inherit",
45
- windowsHide: background,
46
- detached: background && !visible,
47
- env: {
48
- ...process.env,
49
- BUILD_CORPUS_ROOT: root,
50
- },
51
- });
52
-
53
- child.on("error", (error) => {
54
- console.error(`Build Corpus Editor executable not found: ${exe}`);
55
- console.error("Build it with: npm run editor:windows");
56
- console.error(error.message);
57
- process.exit(1);
58
- });
59
-
60
- child.on("exit", (code) => process.exit(code ?? 0));
61
-
62
- function normalizeLaunchArgs(rawArgs) {
63
- const normalized = [];
64
- for (let index = 0; index < rawArgs.length; index += 1) {
65
- const arg = rawArgs[index];
66
- if (arg === "--out" && index < rawArgs.length - 1) {
67
- normalized.push(arg, resolveFromCaller(rawArgs[index + 1]));
68
- index += 1;
69
- continue;
70
- }
71
- if (index === 0 && !arg.startsWith("--")) {
72
- normalized.push(resolveFromCaller(arg));
73
- continue;
74
- }
75
- normalized.push(arg);
76
- }
77
- return normalized;
78
- }
79
-
80
- function resolveFromCaller(value) {
81
- if (!value || path.isAbsolute(value)) return value;
82
- return path.resolve(callerCwd, value);
83
- }
1
+ #!/usr/bin/env node
2
+ const path = require("node:path");
3
+ const { spawn } = require("node:child_process");
4
+ const fs = require("node:fs");
5
+
6
+ const root = path.resolve(__dirname, "..");
7
+ const callerCwd = process.cwd();
8
+ const candidates = [
9
+ path.join(root, "BuildCorpusEditor.exe"),
10
+ path.join(root, "dist", "windows-editor", "BuildCorpusEditor.exe"),
11
+ path.join(root, "desktop", "BuildCorpusEditor", "bin", "Release", "net8.0-windows", "win-x64", "BuildCorpusEditor.exe"),
12
+ ];
13
+ const exe = candidates.find((candidate) => fs.existsSync(candidate)) || candidates[0];
14
+ const args = process.argv.slice(2);
15
+
16
+ if (args.includes("--help") || args.includes("-h")) {
17
+ console.log(`regen-mde
18
+
19
+ Usage:
20
+ regen-mde [document.md|document.docx] [options]
21
+ mdeditor [document.md|document.docx] [options]
22
+ regen-mdeditor [document.md|document.docx] [options]
23
+ regen-mdeditor [document.md|document.docx] [options]
24
+ build-corpus-editor [document.md|document.docx] [options]
25
+
26
+ Options:
27
+ --foreground, --visible Show the editor as an attached foreground process.
28
+ --background Launch hidden/offscreen for smoke checks.
29
+ --self-test Verify the editor bridge can open the document.
30
+ --document-self-test Open, edit, save Markdown, export Word, and reconvert.
31
+ --smoke-ui Run the hidden UI smoke test.
32
+ --out <dir> Output directory for document self-test.
33
+ --help, -h Show this help.
34
+ `);
35
+ process.exit(0);
36
+ }
37
+
38
+ const visible = args.includes("--foreground") || args.includes("--visible");
39
+ const background = args.includes("--background") || args.includes("--smoke-ui");
40
+ const launchArgs = normalizeLaunchArgs(args.filter((arg) => arg !== "--foreground" && arg !== "--visible"));
41
+
42
+ const child = spawn(exe, launchArgs, {
43
+ cwd: root,
44
+ stdio: "inherit",
45
+ windowsHide: background,
46
+ detached: background && !visible,
47
+ env: {
48
+ ...process.env,
49
+ BUILD_CORPUS_ROOT: root,
50
+ },
51
+ });
52
+
53
+ child.on("error", (error) => {
54
+ console.error(`Build Corpus Editor executable not found: ${exe}`);
55
+ console.error("Build it with: npm run editor:windows");
56
+ console.error(error.message);
57
+ process.exit(1);
58
+ });
59
+
60
+ child.on("exit", (code) => process.exit(code ?? 0));
61
+
62
+ function normalizeLaunchArgs(rawArgs) {
63
+ const normalized = [];
64
+ for (let index = 0; index < rawArgs.length; index += 1) {
65
+ const arg = rawArgs[index];
66
+ if (arg === "--out" && index < rawArgs.length - 1) {
67
+ normalized.push(arg, resolveFromCaller(rawArgs[index + 1]));
68
+ index += 1;
69
+ continue;
70
+ }
71
+ if (index === 0 && !arg.startsWith("--")) {
72
+ normalized.push(resolveFromCaller(arg));
73
+ continue;
74
+ }
75
+ normalized.push(arg);
76
+ }
77
+ return normalized;
78
+ }
79
+
80
+ function resolveFromCaller(value) {
81
+ if (!value || path.isAbsolute(value)) return value;
82
+ return path.resolve(callerCwd, value);
83
+ }
@@ -1,41 +1,41 @@
1
- #!/usr/bin/env node
2
- const { spawnSync } = require("node:child_process");
3
- const path = require("node:path");
4
-
5
- const root = path.resolve(__dirname, "..");
6
- const candidates = process.platform === "win32" ? ["py", "python"] : ["python3", "python"];
7
- const env = { ...process.env };
8
- env.PYTHONPATH = env.PYTHONPATH ? `${path.join(root, "src")}${path.delimiter}${env.PYTHONPATH}` : path.join(root, "src");
9
- const args = process.argv.slice(2);
10
-
11
- if (args[0] === "editor") {
12
- const editor = path.join(root, "bin", "build-corpus-editor.js");
13
- const result = spawnSync(process.execPath, [editor, ...args.slice(1)], {
14
- stdio: "inherit",
15
- cwd: root,
16
- env: { ...env, BUILD_CORPUS_ROOT: root },
17
- });
18
- process.exit(result.status ?? 1);
19
- }
20
-
21
- if (process.platform === "win32" && args.includes("--uninstall-windows")) {
22
- const result = spawnSync(process.execPath, [path.join(root, "bin", "postinstall.js"), "--uninstall"], {
23
- stdio: "inherit",
24
- cwd: root,
25
- env,
26
- });
27
- process.exit(result.status ?? 1);
28
- }
29
-
30
- let result = null;
31
- for (const candidate of candidates) {
32
- const args = candidate === "py"
33
- ? ["-3", "-m", "build_corpus.exporter", ...process.argv.slice(2)]
34
- : ["-m", "build_corpus.exporter", ...process.argv.slice(2)];
35
- result = spawnSync(candidate, args, { stdio: "inherit", cwd: root, env });
36
- if (result.error && result.error.code === "ENOENT") continue;
37
- process.exit(result.status ?? 1);
38
- }
39
-
40
- console.error("Build Corpus requires Python 3.10+ on PATH.");
41
- process.exit(1);
1
+ #!/usr/bin/env node
2
+ const { spawnSync } = require("node:child_process");
3
+ const path = require("node:path");
4
+
5
+ const root = path.resolve(__dirname, "..");
6
+ const candidates = process.platform === "win32" ? ["py", "python"] : ["python3", "python"];
7
+ const env = { ...process.env };
8
+ env.PYTHONPATH = env.PYTHONPATH ? `${path.join(root, "src")}${path.delimiter}${env.PYTHONPATH}` : path.join(root, "src");
9
+ const args = process.argv.slice(2);
10
+
11
+ if (args[0] === "editor") {
12
+ const editor = path.join(root, "bin", "build-corpus-editor.js");
13
+ const result = spawnSync(process.execPath, [editor, ...args.slice(1)], {
14
+ stdio: "inherit",
15
+ cwd: root,
16
+ env: { ...env, BUILD_CORPUS_ROOT: root },
17
+ });
18
+ process.exit(result.status ?? 1);
19
+ }
20
+
21
+ if (process.platform === "win32" && args.includes("--uninstall-windows")) {
22
+ const result = spawnSync(process.execPath, [path.join(root, "bin", "postinstall.js"), "--uninstall"], {
23
+ stdio: "inherit",
24
+ cwd: root,
25
+ env,
26
+ });
27
+ process.exit(result.status ?? 1);
28
+ }
29
+
30
+ let result = null;
31
+ for (const candidate of candidates) {
32
+ const args = candidate === "py"
33
+ ? ["-3", "-m", "build_corpus.exporter", ...process.argv.slice(2)]
34
+ : ["-m", "build_corpus.exporter", ...process.argv.slice(2)];
35
+ result = spawnSync(candidate, args, { stdio: "inherit", cwd: root, env });
36
+ if (result.error && result.error.code === "ENOENT") continue;
37
+ process.exit(result.status ?? 1);
38
+ }
39
+
40
+ console.error("Build Corpus requires Python 3.10+ on PATH.");
41
+ process.exit(1);
@@ -1,27 +1,27 @@
1
- #!/usr/bin/env node
2
- const { spawnSync } = require("node:child_process");
3
- const path = require("node:path");
4
-
5
- if (process.platform !== "win32") {
6
- console.error("regen-mde installer is only available on Windows.");
7
- process.exit(1);
8
- }
9
-
10
- const root = path.resolve(__dirname, "..");
11
- const script = path.join(root, "installer", "install-regen-mde.ps1");
12
- const result = spawnSync("powershell.exe", [
13
- "-NoProfile",
14
- "-ExecutionPolicy",
15
- "Bypass",
16
- "-File",
17
- script,
18
- "-PackageRoot",
19
- root,
20
- ...process.argv.slice(2),
21
- ], {
22
- stdio: "inherit",
23
- cwd: root,
24
- windowsHide: true,
25
- });
26
-
27
- process.exit(result.status ?? 1);
1
+ #!/usr/bin/env node
2
+ const { spawnSync } = require("node:child_process");
3
+ const path = require("node:path");
4
+
5
+ if (process.platform !== "win32") {
6
+ console.error("regen-mde installer is only available on Windows.");
7
+ process.exit(1);
8
+ }
9
+
10
+ const root = path.resolve(__dirname, "..");
11
+ const script = path.join(root, "installer", "install-regen-mde.ps1");
12
+ const result = spawnSync("powershell.exe", [
13
+ "-NoProfile",
14
+ "-ExecutionPolicy",
15
+ "Bypass",
16
+ "-File",
17
+ script,
18
+ "-PackageRoot",
19
+ root,
20
+ ...process.argv.slice(2),
21
+ ], {
22
+ stdio: "inherit",
23
+ cwd: root,
24
+ windowsHide: true,
25
+ });
26
+
27
+ process.exit(result.status ?? 1);
@@ -1,19 +1,19 @@
1
- #!/usr/bin/env node
2
- const { spawnSync } = require("node:child_process");
3
- const path = require("node:path");
4
-
5
- if (process.platform !== "win32") {
6
- console.error("regen-mde uninstaller is only available on Windows.");
7
- process.exit(1);
8
- }
9
-
10
- const root = path.resolve(__dirname, "..");
11
- const result = spawnSync(process.execPath, [
12
- path.join(root, "bin", "postinstall.js"),
13
- "--uninstall",
14
- ], {
15
- stdio: "inherit",
16
- cwd: root,
17
- });
18
-
19
- process.exit(result.status ?? 1);
1
+ #!/usr/bin/env node
2
+ const { spawnSync } = require("node:child_process");
3
+ const path = require("node:path");
4
+
5
+ if (process.platform !== "win32") {
6
+ console.error("regen-mde uninstaller is only available on Windows.");
7
+ process.exit(1);
8
+ }
9
+
10
+ const root = path.resolve(__dirname, "..");
11
+ const result = spawnSync(process.execPath, [
12
+ path.join(root, "bin", "postinstall.js"),
13
+ "--uninstall",
14
+ ], {
15
+ stdio: "inherit",
16
+ cwd: root,
17
+ });
18
+
19
+ process.exit(result.status ?? 1);
@@ -1,93 +1,93 @@
1
- const fs = require("fs");
2
- const path = require("path");
3
- const katex = require("katex");
4
-
5
- function extractMath(markdown) {
6
- const spans = [];
7
- const blockRe = /\$\$([\s\S]*?)\$\$/g;
8
- let masked = markdown;
9
- let match;
10
- while ((match = blockRe.exec(markdown)) !== null) {
11
- spans.push({ displayMode: true, tex: match[1].trim(), index: match.index });
12
- }
13
- masked = masked.replace(blockRe, "");
14
-
15
- for (let i = 0; i < masked.length; i++) {
16
- if (masked[i] !== "$" || isEscaped(masked, i)) continue;
17
- let end = -1;
18
- for (let j = i + 1; j < masked.length; j++) {
19
- if (masked[j] === "\n") break;
20
- if (masked[j] === "$" && !isEscaped(masked, j)) {
21
- end = j;
22
- break;
23
- }
24
- }
25
- if (end > i + 1) {
26
- spans.push({ displayMode: false, tex: masked.slice(i + 1, end).trim(), index: i });
27
- i = end;
28
- }
29
- }
30
- return spans;
31
- }
32
-
33
- function isEscaped(text, index) {
34
- let slashCount = 0;
35
- for (let i = index - 1; i >= 0 && text[i] === "\\"; i--) {
36
- slashCount++;
37
- }
38
- return slashCount % 2 === 1;
39
- }
40
-
41
- function validateFile(filePath) {
42
- const markdown = fs.readFileSync(filePath, "utf8");
43
- const spans = extractMath(markdown);
44
- const failures = [];
45
- for (const span of spans) {
46
- try {
47
- katex.renderToString(span.tex, {
48
- displayMode: span.displayMode,
49
- throwOnError: true,
50
- strict: "ignore",
51
- trust: false,
52
- });
53
- } catch (error) {
54
- failures.push({
55
- index: span.index,
56
- displayMode: span.displayMode,
57
- tex: span.tex.slice(0, 500),
58
- error: error.message,
59
- });
60
- }
61
- }
62
- return {
63
- file: filePath,
64
- math_spans: spans.length,
65
- failures: failures.length,
66
- failure_samples: failures.slice(0, 50),
67
- };
68
- }
69
-
70
- function main() {
71
- const target = process.argv[2];
72
- if (!target) {
73
- console.error("Usage: node validate_katex.js <markdown-file-or-directory>");
74
- process.exit(2);
75
- }
76
- const stat = fs.statSync(target);
77
- const files = [];
78
- if (stat.isDirectory()) {
79
- for (const entry of fs.readdirSync(target, { recursive: true })) {
80
- const full = path.join(target, entry);
81
- if (fs.existsSync(full) && fs.statSync(full).isFile() && full.endsWith(".md")) {
82
- files.push(full);
83
- }
84
- }
85
- } else {
86
- files.push(target);
87
- }
88
- const results = files.map(validateFile);
89
- console.log(JSON.stringify({ files: results.length, results }, null, 2));
90
- process.exit(results.some((result) => result.failures > 0) ? 1 : 0);
91
- }
92
-
93
- main();
1
+ const fs = require("fs");
2
+ const path = require("path");
3
+ const katex = require("katex");
4
+
5
+ function extractMath(markdown) {
6
+ const spans = [];
7
+ const blockRe = /\$\$([\s\S]*?)\$\$/g;
8
+ let masked = markdown;
9
+ let match;
10
+ while ((match = blockRe.exec(markdown)) !== null) {
11
+ spans.push({ displayMode: true, tex: match[1].trim(), index: match.index });
12
+ }
13
+ masked = masked.replace(blockRe, "");
14
+
15
+ for (let i = 0; i < masked.length; i++) {
16
+ if (masked[i] !== "$" || isEscaped(masked, i)) continue;
17
+ let end = -1;
18
+ for (let j = i + 1; j < masked.length; j++) {
19
+ if (masked[j] === "\n") break;
20
+ if (masked[j] === "$" && !isEscaped(masked, j)) {
21
+ end = j;
22
+ break;
23
+ }
24
+ }
25
+ if (end > i + 1) {
26
+ spans.push({ displayMode: false, tex: masked.slice(i + 1, end).trim(), index: i });
27
+ i = end;
28
+ }
29
+ }
30
+ return spans;
31
+ }
32
+
33
+ function isEscaped(text, index) {
34
+ let slashCount = 0;
35
+ for (let i = index - 1; i >= 0 && text[i] === "\\"; i--) {
36
+ slashCount++;
37
+ }
38
+ return slashCount % 2 === 1;
39
+ }
40
+
41
+ function validateFile(filePath) {
42
+ const markdown = fs.readFileSync(filePath, "utf8");
43
+ const spans = extractMath(markdown);
44
+ const failures = [];
45
+ for (const span of spans) {
46
+ try {
47
+ katex.renderToString(span.tex, {
48
+ displayMode: span.displayMode,
49
+ throwOnError: true,
50
+ strict: "ignore",
51
+ trust: false,
52
+ });
53
+ } catch (error) {
54
+ failures.push({
55
+ index: span.index,
56
+ displayMode: span.displayMode,
57
+ tex: span.tex.slice(0, 500),
58
+ error: error.message,
59
+ });
60
+ }
61
+ }
62
+ return {
63
+ file: filePath,
64
+ math_spans: spans.length,
65
+ failures: failures.length,
66
+ failure_samples: failures.slice(0, 50),
67
+ };
68
+ }
69
+
70
+ function main() {
71
+ const target = process.argv[2];
72
+ if (!target) {
73
+ console.error("Usage: node validate_katex.js <markdown-file-or-directory>");
74
+ process.exit(2);
75
+ }
76
+ const stat = fs.statSync(target);
77
+ const files = [];
78
+ if (stat.isDirectory()) {
79
+ for (const entry of fs.readdirSync(target, { recursive: true })) {
80
+ const full = path.join(target, entry);
81
+ if (fs.existsSync(full) && fs.statSync(full).isFile() && full.endsWith(".md")) {
82
+ files.push(full);
83
+ }
84
+ }
85
+ } else {
86
+ files.push(target);
87
+ }
88
+ const results = files.map(validateFile);
89
+ console.log(JSON.stringify({ files: results.length, results }, null, 2));
90
+ process.exit(results.some((result) => result.failures > 0) ? 1 : 0);
91
+ }
92
+
93
+ main();
@@ -1,22 +1,22 @@
1
- <Project Sdk="Microsoft.NET.Sdk">
2
- <PropertyGroup>
3
- <OutputType>WinExe</OutputType>
4
- <TargetFramework>net8.0-windows</TargetFramework>
5
- <UseWindowsForms>true</UseWindowsForms>
6
- <Nullable>enable</Nullable>
7
- <ImplicitUsings>enable</ImplicitUsings>
8
- <ApplicationManifest>app.manifest</ApplicationManifest>
9
- <AssemblyName>BuildCorpusEditor</AssemblyName>
10
- <RootNamespace>BuildCorpusEditor</RootNamespace>
11
- </PropertyGroup>
12
-
13
- <ItemGroup>
14
- <PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3537.50" />
15
- </ItemGroup>
16
-
17
- <ItemGroup>
18
- <Content Include="wwwroot\**\*">
19
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
20
- </Content>
21
- </ItemGroup>
22
- </Project>
1
+ <Project Sdk="Microsoft.NET.Sdk">
2
+ <PropertyGroup>
3
+ <OutputType>WinExe</OutputType>
4
+ <TargetFramework>net8.0-windows</TargetFramework>
5
+ <UseWindowsForms>true</UseWindowsForms>
6
+ <Nullable>enable</Nullable>
7
+ <ImplicitUsings>enable</ImplicitUsings>
8
+ <ApplicationManifest>app.manifest</ApplicationManifest>
9
+ <AssemblyName>BuildCorpusEditor</AssemblyName>
10
+ <RootNamespace>BuildCorpusEditor</RootNamespace>
11
+ </PropertyGroup>
12
+
13
+ <ItemGroup>
14
+ <PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3537.50" />
15
+ </ItemGroup>
16
+
17
+ <ItemGroup>
18
+ <Content Include="wwwroot\**\*">
19
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
20
+ </Content>
21
+ </ItemGroup>
22
+ </Project>
@@ -1,16 +1,16 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
3
- <assemblyIdentity version="1.0.0.0" name="LifeAI.BuildCorpusEditor.app"/>
4
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
5
- <security>
6
- <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
7
- <requestedExecutionLevel level="asInvoker" uiAccess="false" />
8
- </requestedPrivileges>
9
- </security>
10
- </trustInfo>
11
- <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
12
- <application>
13
- <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
14
- </application>
15
- </compatibility>
16
- </assembly>
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
3
+ <assemblyIdentity version="1.0.0.0" name="LifeAI.BuildCorpusEditor.app"/>
4
+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
5
+ <security>
6
+ <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
7
+ <requestedExecutionLevel level="asInvoker" uiAccess="false" />
8
+ </requestedPrivileges>
9
+ </security>
10
+ </trustInfo>
11
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
12
+ <application>
13
+ <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
14
+ </application>
15
+ </compatibility>
16
+ </assembly>