intelligent-system-design-language 0.3.13
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/.claude/agents/langium-language-designer.md +38 -0
- package/.claude/agents/typescript-vscode-expert.md +29 -0
- package/.claude/agents/ui-ux-designer.md +36 -0
- package/.claude/settings.local.json +33 -0
- package/.idea/inspectionProfiles/Project_Default.xml +7 -0
- package/.idea/isdl.iml +14 -0
- package/.idea/modules.xml +9 -0
- package/.idea/vcs.xml +7 -0
- package/.idea/watcherTasks.xml +4 -0
- package/.vscodeignore +18 -0
- package/LICENSE +674 -0
- package/README.md +86 -0
- package/bin/cli.js +4 -0
- package/bin/lsp.js +8 -0
- package/isdl.png +0 -0
- package/out/_backgrounds.scss +91 -0
- package/out/_handlebars.scss +505 -0
- package/out/_isdlStyles.scss +1357 -0
- package/out/_vuetifyOverrides.scss +425 -0
- package/out/_vuetifyStyles.scss +31957 -0
- package/out/cli/cli-util.js +39 -0
- package/out/cli/cli-util.js.map +1 -0
- package/out/cli/components/_backgrounds.scss +91 -0
- package/out/cli/components/_handlebars.scss +505 -0
- package/out/cli/components/_isdlStyles.scss +1357 -0
- package/out/cli/components/_vuetifyOverrides.scss +425 -0
- package/out/cli/components/_vuetifyStyles.scss +31957 -0
- package/out/cli/components/active-effect-sheet-generator.js +643 -0
- package/out/cli/components/active-effect-sheet-generator.js.map +1 -0
- package/out/cli/components/base-actor-sheet-generator.js +125 -0
- package/out/cli/components/base-actor-sheet-generator.js.map +1 -0
- package/out/cli/components/base-sheet-generator.js +525 -0
- package/out/cli/components/base-sheet-generator.js.map +1 -0
- package/out/cli/components/chat-card-generator.js +683 -0
- package/out/cli/components/chat-card-generator.js.map +1 -0
- package/out/cli/components/css-generator.js +58 -0
- package/out/cli/components/css-generator.js.map +1 -0
- package/out/cli/components/damage-roll-generator.js +173 -0
- package/out/cli/components/damage-roll-generator.js.map +1 -0
- package/out/cli/components/datamodel-generator.js +672 -0
- package/out/cli/components/datamodel-generator.js.map +1 -0
- package/out/cli/components/derived-data-generator.js +1340 -0
- package/out/cli/components/derived-data-generator.js.map +1 -0
- package/out/cli/components/hotbar-drop-hook-generator.js +95 -0
- package/out/cli/components/hotbar-drop-hook-generator.js.map +1 -0
- package/out/cli/components/init-hook-generator.js +597 -0
- package/out/cli/components/init-hook-generator.js.map +1 -0
- package/out/cli/components/keywords-generator.js +220 -0
- package/out/cli/components/keywords-generator.js.map +1 -0
- package/out/cli/components/language-generator.js +110 -0
- package/out/cli/components/language-generator.js.map +1 -0
- package/out/cli/components/measured-template-preview.js +234 -0
- package/out/cli/components/measured-template-preview.js.map +1 -0
- package/out/cli/components/method-generator.js +1812 -0
- package/out/cli/components/method-generator.js.map +1 -0
- package/out/cli/components/ready-hook-generator.js +448 -0
- package/out/cli/components/ready-hook-generator.js.map +1 -0
- package/out/cli/components/token-generator.js +138 -0
- package/out/cli/components/token-generator.js.map +1 -0
- package/out/cli/components/utils.js +176 -0
- package/out/cli/components/utils.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-attribute.js +148 -0
- package/out/cli/components/vue/base-components/vue-attribute.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-boolean.js +77 -0
- package/out/cli/components/vue/base-components/vue-boolean.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-calculator.js +106 -0
- package/out/cli/components/vue/base-components/vue-calculator.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-damage-application.js +369 -0
- package/out/cli/components/vue/base-components/vue-damage-application.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-damage-bonuses.js +225 -0
- package/out/cli/components/vue/base-components/vue-damage-bonuses.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-damage-resistances.js +256 -0
- package/out/cli/components/vue/base-components/vue-damage-resistances.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-damage-track.js +134 -0
- package/out/cli/components/vue/base-components/vue-damage-track.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-date-time.js +55 -0
- package/out/cli/components/vue/base-components/vue-date-time.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-dice.js +111 -0
- package/out/cli/components/vue/base-components/vue-dice.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-die.js +86 -0
- package/out/cli/components/vue/base-components/vue-die.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-document-choice.js +172 -0
- package/out/cli/components/vue/base-components/vue-document-choice.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-document-choices.js +203 -0
- package/out/cli/components/vue/base-components/vue-document-choices.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-document-link.js +73 -0
- package/out/cli/components/vue/base-components/vue-document-link.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-extended-choice.js +101 -0
- package/out/cli/components/vue/base-components/vue-extended-choice.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-inventory.js +532 -0
- package/out/cli/components/vue/base-components/vue-inventory.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-macro-choice.js +150 -0
- package/out/cli/components/vue/base-components/vue-macro-choice.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-measured-template.js +543 -0
- package/out/cli/components/vue/base-components/vue-measured-template.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-money.js +496 -0
- package/out/cli/components/vue/base-components/vue-money.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-number.js +184 -0
- package/out/cli/components/vue/base-components/vue-number.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-paperdoll.js +56 -0
- package/out/cli/components/vue/base-components/vue-paperdoll.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-parent-property-reference.js +89 -0
- package/out/cli/components/vue/base-components/vue-parent-property-reference.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-prosemirror.js +31 -0
- package/out/cli/components/vue/base-components/vue-prosemirror.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-resource.js +149 -0
- package/out/cli/components/vue/base-components/vue-resource.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-roll-visualizer.js +121 -0
- package/out/cli/components/vue/base-components/vue-roll-visualizer.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-self-property-reference.js +75 -0
- package/out/cli/components/vue/base-components/vue-self-property-reference.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-string-choice.js +111 -0
- package/out/cli/components/vue/base-components/vue-string-choice.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-string-choices.js +216 -0
- package/out/cli/components/vue/base-components/vue-string-choices.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-string.js +73 -0
- package/out/cli/components/vue/base-components/vue-string.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-text-field.js +66 -0
- package/out/cli/components/vue/base-components/vue-text-field.js.map +1 -0
- package/out/cli/components/vue/base-components/vue-tracker.js +444 -0
- package/out/cli/components/vue/base-components/vue-tracker.js.map +1 -0
- package/out/cli/components/vue/vue-action-component-generator.js +88 -0
- package/out/cli/components/vue/vue-action-component-generator.js.map +1 -0
- package/out/cli/components/vue/vue-active-effect-sheet-generator.js +1016 -0
- package/out/cli/components/vue/vue-active-effect-sheet-generator.js.map +1 -0
- package/out/cli/components/vue/vue-base-components-generator.js +59 -0
- package/out/cli/components/vue/vue-base-components-generator.js.map +1 -0
- package/out/cli/components/vue/vue-datatable-component-generator.js +307 -0
- package/out/cli/components/vue/vue-datatable-component-generator.js.map +1 -0
- package/out/cli/components/vue/vue-datatable-sheet-class-generator.js +342 -0
- package/out/cli/components/vue/vue-datatable-sheet-class-generator.js.map +1 -0
- package/out/cli/components/vue/vue-datatable2-component-generator.js +939 -0
- package/out/cli/components/vue/vue-datatable2-component-generator.js.map +1 -0
- package/out/cli/components/vue/vue-document-creation-app.js +140 -0
- package/out/cli/components/vue/vue-document-creation-app.js.map +1 -0
- package/out/cli/components/vue/vue-document-creation-sheet.js +105 -0
- package/out/cli/components/vue/vue-document-creation-sheet.js.map +1 -0
- package/out/cli/components/vue/vue-generator.js +240 -0
- package/out/cli/components/vue/vue-generator.js.map +1 -0
- package/out/cli/components/vue/vue-mixin.js +338 -0
- package/out/cli/components/vue/vue-mixin.js.map +1 -0
- package/out/cli/components/vue/vue-pinned-datatable-component-generator.js +306 -0
- package/out/cli/components/vue/vue-pinned-datatable-component-generator.js.map +1 -0
- package/out/cli/components/vue/vue-prompt-generator.js +201 -0
- package/out/cli/components/vue/vue-prompt-generator.js.map +1 -0
- package/out/cli/components/vue/vue-prompt-sheet-class-generator.js +252 -0
- package/out/cli/components/vue/vue-prompt-sheet-class-generator.js.map +1 -0
- package/out/cli/components/vue/vue-sheet-application-generator.js +2008 -0
- package/out/cli/components/vue/vue-sheet-application-generator.js.map +1 -0
- package/out/cli/components/vue/vue-sheet-class-generator.js +484 -0
- package/out/cli/components/vue/vue-sheet-class-generator.js.map +1 -0
- package/out/cli/generator.js +659 -0
- package/out/cli/generator.js.map +1 -0
- package/out/cli/main.js +43 -0
- package/out/cli/main.js.map +1 -0
- package/out/datatables.min.css +54 -0
- package/out/datatables.min.js +178 -0
- package/out/extension/github/githubAuthProvider.js +345 -0
- package/out/extension/github/githubAuthProvider.js.map +1 -0
- package/out/extension/github/githubConfig.js +132 -0
- package/out/extension/github/githubConfig.js.map +1 -0
- package/out/extension/github/githubGistActions.js +251 -0
- package/out/extension/github/githubGistActions.js.map +1 -0
- package/out/extension/github/githubGistManager.js +255 -0
- package/out/extension/github/githubGistManager.js.map +1 -0
- package/out/extension/github/githubManager.js +1735 -0
- package/out/extension/github/githubManager.js.map +1 -0
- package/out/extension/github/githubQuickActions.js +659 -0
- package/out/extension/github/githubQuickActions.js.map +1 -0
- package/out/extension/github/githubTreeProvider.js +181 -0
- package/out/extension/github/githubTreeProvider.js.map +1 -0
- package/out/extension/github/system-workflow.yml +48 -0
- package/out/extension/main.cjs +70315 -0
- package/out/extension/main.cjs.map +7 -0
- package/out/extension/main.js +237 -0
- package/out/extension/main.js.map +1 -0
- package/out/extension/package.json +426 -0
- package/out/isdl.png +0 -0
- package/out/language/generated/ast.js +2992 -0
- package/out/language/generated/ast.js.map +1 -0
- package/out/language/generated/grammar.js +13970 -0
- package/out/language/generated/grammar.js.map +1 -0
- package/out/language/generated/module.js +20 -0
- package/out/language/generated/module.js.map +1 -0
- package/out/language/intelligent-system-design-language-formatter.js +85 -0
- package/out/language/intelligent-system-design-language-formatter.js.map +1 -0
- package/out/language/intelligent-system-design-language-module.js +69 -0
- package/out/language/intelligent-system-design-language-module.js.map +1 -0
- package/out/language/intelligent-system-design-language-quickfixes.js +37 -0
- package/out/language/intelligent-system-design-language-quickfixes.js.map +1 -0
- package/out/language/intelligent-system-design-language-validator.js +515 -0
- package/out/language/intelligent-system-design-language-validator.js.map +1 -0
- package/out/language/isdl-hover-provider.js +77 -0
- package/out/language/isdl-hover-provider.js.map +1 -0
- package/out/language/isdl-scope-provider.js +149 -0
- package/out/language/isdl-scope-provider.js.map +1 -0
- package/out/language/main.cjs +47655 -0
- package/out/language/main.cjs.map +7 -0
- package/out/language/main.js +11 -0
- package/out/language/main.js.map +1 -0
- package/out/missing-character.png +0 -0
- package/out/package.json +426 -0
- package/out/paperdoll_default.png +0 -0
- package/out/progressbar.min.js +7 -0
- package/out/styles.scss +722 -0
- package/out/test/formatting/formatter.test.js +46 -0
- package/out/test/formatting/formatter.test.js.map +1 -0
- package/out/vuetify.esm.js +30279 -0
- package/package.json +426 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { isDamageTypeChoiceField, isKeywords, isSummaryParam, isLabelParam, isStringParamChoices, isColorParam, isIconParam, isStatusProperty, isDocumentSvgParam, isStatusParamWhen } from "../../language/generated/ast.js";
|
|
2
|
+
import { getAllOfType } from './utils.js';
|
|
3
|
+
// Collect all keywords from config and damage types
|
|
4
|
+
export function collectAllKeywords(entry) {
|
|
5
|
+
var _a;
|
|
6
|
+
const keywords = new Map();
|
|
7
|
+
// First collect damage types as keywords
|
|
8
|
+
for (const document of entry.documents) {
|
|
9
|
+
const damageTypeFields = getAllOfType(document.body, isDamageTypeChoiceField);
|
|
10
|
+
for (const field of damageTypeFields) {
|
|
11
|
+
const damageField = field;
|
|
12
|
+
const choicesParam = (_a = damageField.params) === null || _a === void 0 ? void 0 : _a.find((p) => isStringParamChoices(p));
|
|
13
|
+
if (choicesParam && choicesParam.choices) {
|
|
14
|
+
for (const choice of choicesParam.choices) {
|
|
15
|
+
if (typeof choice.value === 'string') {
|
|
16
|
+
keywords.set(choice.value.toLowerCase(), {
|
|
17
|
+
name: choice.value,
|
|
18
|
+
description: ``,
|
|
19
|
+
color: '#666666',
|
|
20
|
+
icon: 'fa-solid fa-burst',
|
|
21
|
+
type: 'damage-type'
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
else if (choice.value && typeof choice.value === 'object') {
|
|
25
|
+
const extendedChoice = choice.value;
|
|
26
|
+
let keywordName = '';
|
|
27
|
+
let keywordData = {
|
|
28
|
+
name: '',
|
|
29
|
+
description: ``,
|
|
30
|
+
color: '#666666',
|
|
31
|
+
icon: 'fa-solid fa-burst',
|
|
32
|
+
type: 'damage-type'
|
|
33
|
+
};
|
|
34
|
+
// The StringExtendedChoice has properties array where the actual value is stored
|
|
35
|
+
if (extendedChoice.properties && Array.isArray(extendedChoice.properties)) {
|
|
36
|
+
for (const prop of extendedChoice.properties) {
|
|
37
|
+
// Handle ChoiceStringValue (has "value:" prefix in grammar)
|
|
38
|
+
if (prop.$type === 'ChoiceStringValue' && prop.value) {
|
|
39
|
+
keywordName = prop.value;
|
|
40
|
+
}
|
|
41
|
+
// Handle ColorParam
|
|
42
|
+
else if (prop.$type === 'ColorParam' && prop.value) {
|
|
43
|
+
keywordData.color = prop.value;
|
|
44
|
+
}
|
|
45
|
+
// Handle IconParam
|
|
46
|
+
else if (prop.$type === 'IconParam' && prop.value) {
|
|
47
|
+
keywordData.icon = prop.value;
|
|
48
|
+
}
|
|
49
|
+
// Handle LabelParam
|
|
50
|
+
else if (prop.$type === 'LabelParam' && prop.value) {
|
|
51
|
+
keywordData.label = prop.value;
|
|
52
|
+
}
|
|
53
|
+
// Handle SummaryParam
|
|
54
|
+
else if (prop.$type === 'SummaryParam' && prop.value) {
|
|
55
|
+
keywordData.description = prop.value.replace(/['"]/g, '');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (keywordName) {
|
|
60
|
+
keywordData.name = keywordName;
|
|
61
|
+
keywords.set(keywordName.toLowerCase(), keywordData);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Then collect manual keywords from config
|
|
69
|
+
if (entry.config && entry.config.body) {
|
|
70
|
+
const keywordSections = entry.config.body.filter(isKeywords);
|
|
71
|
+
for (const keywordSection of keywordSections) {
|
|
72
|
+
for (const keyword of keywordSection.body) {
|
|
73
|
+
const keywordData = {
|
|
74
|
+
name: keyword.name,
|
|
75
|
+
description: '',
|
|
76
|
+
color: '#666666',
|
|
77
|
+
icon: 'fa-solid fa-tag',
|
|
78
|
+
type: 'custom'
|
|
79
|
+
};
|
|
80
|
+
// Extract parameters
|
|
81
|
+
if (keyword.params) {
|
|
82
|
+
for (const param of keyword.params) {
|
|
83
|
+
if (isSummaryParam(param)) {
|
|
84
|
+
keywordData.description = param.value.replace(/['"]/g, '');
|
|
85
|
+
}
|
|
86
|
+
else if (isLabelParam(param)) {
|
|
87
|
+
keywordData.label = param.value.replace(/['"]/g, '');
|
|
88
|
+
}
|
|
89
|
+
else if (isColorParam(param)) {
|
|
90
|
+
keywordData.color = param.value;
|
|
91
|
+
}
|
|
92
|
+
else if (isIconParam(param)) {
|
|
93
|
+
keywordData.icon = param.value.replace(/['"]/g, '');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
keywords.set(keyword.name.toLowerCase(), keywordData);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return keywords;
|
|
102
|
+
}
|
|
103
|
+
// Collect all status effects from documents
|
|
104
|
+
export function collectAllStatusEffects(entry) {
|
|
105
|
+
const statusEffects = new Map();
|
|
106
|
+
// Collect status effects from all documents
|
|
107
|
+
for (const document of entry.documents) {
|
|
108
|
+
const statusProperties = getAllOfType(document.body, isStatusProperty);
|
|
109
|
+
for (const status of statusProperties) {
|
|
110
|
+
const statusData = {
|
|
111
|
+
id: status.name.toLowerCase().replace(/\s+/g, '-'),
|
|
112
|
+
name: status.name,
|
|
113
|
+
img: 'icons/svg/aura.svg',
|
|
114
|
+
isDeath: status.tag === 'death'
|
|
115
|
+
};
|
|
116
|
+
// Extract parameters if present
|
|
117
|
+
if (status.params) {
|
|
118
|
+
for (const param of status.params) {
|
|
119
|
+
if (isDocumentSvgParam(param) && param.value) {
|
|
120
|
+
statusData.img = param.value.replace(/['"]/g, '');
|
|
121
|
+
}
|
|
122
|
+
else if (isStatusParamWhen(param) && param.when) {
|
|
123
|
+
// Convert the condition AST to a human readable string
|
|
124
|
+
statusData.condition = convertConditionToString(param.when);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
statusEffects.set(statusData.id, statusData);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return statusEffects;
|
|
132
|
+
}
|
|
133
|
+
const OPERATOR_MAP = {
|
|
134
|
+
'<=': 'JOURNAL.OperatorLabels.LessThanOrEqual',
|
|
135
|
+
'>=': 'JOURNAL.OperatorLabels.GreaterThanOrEqual',
|
|
136
|
+
'<': 'JOURNAL.OperatorLabels.LessThan',
|
|
137
|
+
'>': 'JOURNAL.OperatorLabels.GreaterThan',
|
|
138
|
+
'==': 'JOURNAL.OperatorLabels.Equals',
|
|
139
|
+
'!=': 'JOURNAL.OperatorLabels.NotEqual',
|
|
140
|
+
'equals': 'JOURNAL.OperatorLabels.Equals',
|
|
141
|
+
'!equals': 'JOURNAL.OperatorLabels.NotEqual',
|
|
142
|
+
};
|
|
143
|
+
// Helper function to convert AST condition to human readable string
|
|
144
|
+
function convertConditionToString(condition) {
|
|
145
|
+
if (!condition)
|
|
146
|
+
return '';
|
|
147
|
+
if (condition.$type === 'ComparisonExpression') {
|
|
148
|
+
const left = convertExpressionToString(condition.e1);
|
|
149
|
+
const right = convertExpressionToString(condition.e2);
|
|
150
|
+
const humanOperator = OPERATOR_MAP[condition.term] || condition.term;
|
|
151
|
+
return `${left} {{${humanOperator}}} ${right}`;
|
|
152
|
+
}
|
|
153
|
+
if (condition.$type === 'ShorthandComparisonExpression') {
|
|
154
|
+
// Due to grammar operator precedence, comparison+arithmetic expressions like
|
|
155
|
+
// "self.HP <= self.HP.Max / 2" parse as BinaryExpression(BinaryExpression(HP <= HP.Max), /, 2).
|
|
156
|
+
// Walk into nested BinaryExpressions until we find a comparison operator.
|
|
157
|
+
if (condition.e1 && condition.e1.$type === 'BinaryExpression') {
|
|
158
|
+
const binExpr = findComparisonBinaryExpression(condition.e1);
|
|
159
|
+
if (binExpr) {
|
|
160
|
+
const left = convertExpressionToString(binExpr.e1);
|
|
161
|
+
const right = convertExpressionToString(binExpr.e2);
|
|
162
|
+
const humanOperator = OPERATOR_MAP[binExpr.op] || binExpr.op;
|
|
163
|
+
return `${left} {{${humanOperator}}} ${right}`;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (condition.term) {
|
|
167
|
+
const expr = convertExpressionToString(condition.e1);
|
|
168
|
+
return condition.term === 'exists' ? `${expr} {{JOURNAL.OperatorLabels.Exists}}` : `${expr} {{JOURNAL.OperatorLabels.NotExists}}`;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return convertExpressionToString(condition);
|
|
172
|
+
}
|
|
173
|
+
// Walk a BinaryExpression tree to find the node whose op is a comparison operator.
|
|
174
|
+
// Needed because arithmetic operators wrap comparison BinaryExpressions due to grammar precedence.
|
|
175
|
+
function findComparisonBinaryExpression(expr) {
|
|
176
|
+
if (!expr || expr.$type !== 'BinaryExpression')
|
|
177
|
+
return null;
|
|
178
|
+
if (OPERATOR_MAP[expr.op])
|
|
179
|
+
return expr;
|
|
180
|
+
return findComparisonBinaryExpression(expr.e1);
|
|
181
|
+
}
|
|
182
|
+
// Helper function to convert expressions to human readable strings
|
|
183
|
+
function convertExpressionToString(expr) {
|
|
184
|
+
if (!expr)
|
|
185
|
+
return '';
|
|
186
|
+
switch (expr.$type) {
|
|
187
|
+
case 'SelfPropertyRefExp':
|
|
188
|
+
return `${expr.ref}`;
|
|
189
|
+
case 'Access':
|
|
190
|
+
// Handle simple property access like self.HP or HP directly
|
|
191
|
+
if (expr.member) {
|
|
192
|
+
return expr.member;
|
|
193
|
+
}
|
|
194
|
+
const base = convertExpressionToString(expr.receiver);
|
|
195
|
+
const member = expr.member;
|
|
196
|
+
// Convert self.property to just the property name for readability
|
|
197
|
+
if (base === 'self') {
|
|
198
|
+
return member;
|
|
199
|
+
}
|
|
200
|
+
return base ? `${base}.${member}` : member;
|
|
201
|
+
case 'VariableExpression':
|
|
202
|
+
return expr.name || '';
|
|
203
|
+
case 'Literal':
|
|
204
|
+
return String(expr.value);
|
|
205
|
+
case 'NumberRange':
|
|
206
|
+
return `${expr.min}-${expr.max}`;
|
|
207
|
+
default:
|
|
208
|
+
// For any unhandled types, try to return a reasonable string representation
|
|
209
|
+
if (expr.member)
|
|
210
|
+
return String(expr.member);
|
|
211
|
+
if (expr.name)
|
|
212
|
+
return String(expr.name);
|
|
213
|
+
if (expr.ref)
|
|
214
|
+
return String(expr.ref);
|
|
215
|
+
if (expr.value !== undefined)
|
|
216
|
+
return String(expr.value);
|
|
217
|
+
return '';
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=keywords-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keywords-generator.js","sourceRoot":"","sources":["../../../src/cli/components/keywords-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { isStatusProperty, } from '../../language/generated/ast.js';
|
|
2
|
+
import { isSection, isAction, isProperty, isPage, isStringParamChoices, isActor, isItem, isHookHandler, isLabelParam, isLayout, isChoiceStringValue, isStringExtendedChoice, isStringChoiceField, isDamageTypeChoiceField, isStringChoicesField, } from "../../language/generated/ast.js";
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { toMachineIdentifier } from "./utils.js";
|
|
6
|
+
export function generateLanguageJson(entry, id, destination) {
|
|
7
|
+
const generatedFileDir = path.join(destination, `lang`);
|
|
8
|
+
const generatedFilePath = path.join(generatedFileDir, `en.json`);
|
|
9
|
+
if (!fs.existsSync(generatedFileDir)) {
|
|
10
|
+
fs.mkdirSync(generatedFileDir, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
function humanize(string) {
|
|
13
|
+
return string
|
|
14
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
15
|
+
.replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
|
|
16
|
+
.replace(/([a-zA-Z])(\d)/g, '$1 $2');
|
|
17
|
+
}
|
|
18
|
+
function choiceLocalize(choice) {
|
|
19
|
+
if (!isStringExtendedChoice(choice.value))
|
|
20
|
+
return humanize(choice.value);
|
|
21
|
+
const label = choice.value.properties.find(isLabelParam);
|
|
22
|
+
if (label)
|
|
23
|
+
return label.value;
|
|
24
|
+
const value = choice.value.properties.find(isChoiceStringValue);
|
|
25
|
+
return value ? humanize(value.value) : 'Unknown Choice';
|
|
26
|
+
}
|
|
27
|
+
function choiceValue(choice) {
|
|
28
|
+
if (!isStringExtendedChoice(choice.value))
|
|
29
|
+
return toMachineIdentifier(choice.value);
|
|
30
|
+
const value = choice.value.properties.find(isChoiceStringValue);
|
|
31
|
+
if (value)
|
|
32
|
+
return toMachineIdentifier(value.value);
|
|
33
|
+
const label = choice.value.properties.find(isLabelParam);
|
|
34
|
+
return label ? toMachineIdentifier(label.value) : 'unknown';
|
|
35
|
+
}
|
|
36
|
+
function propertyEntries(property) {
|
|
37
|
+
if (isSection(property) && property.body.length > 0) {
|
|
38
|
+
return Object.assign({ [property.name]: humanize(property.name) }, Object.assign({}, ...property.body.map(p => propertyEntries(p))));
|
|
39
|
+
}
|
|
40
|
+
if (isPage(property)) {
|
|
41
|
+
return Object.assign({ [property.name]: humanize(property.name) }, Object.assign({}, ...property.body.map(p => propertyEntries(p))));
|
|
42
|
+
}
|
|
43
|
+
if (isLayout(property)) {
|
|
44
|
+
return Object.assign({}, ...property.body.map(p => propertyEntries(p)));
|
|
45
|
+
}
|
|
46
|
+
if (isStatusProperty(property)) {
|
|
47
|
+
const labelParam = property.params.find(x => isLabelParam(x));
|
|
48
|
+
return { [`Status.${property.name}`]: labelParam ? labelParam.value : humanize(property.name) };
|
|
49
|
+
}
|
|
50
|
+
if (isProperty(property)) {
|
|
51
|
+
const standardParams = property.params;
|
|
52
|
+
const labelParam = standardParams.find(x => isLabelParam(x));
|
|
53
|
+
const label = labelParam ? labelParam.value : humanize(property.name);
|
|
54
|
+
if (isStringChoiceField(property) || isStringChoicesField(property) || isDamageTypeChoiceField(property)) {
|
|
55
|
+
const lp = property.params.find((x) => isLabelParam(x));
|
|
56
|
+
const l = lp ? lp.value : humanize(property.name);
|
|
57
|
+
const choiceParam = property.params.find((p) => isStringParamChoices(p) || p.$type === 'StringChoicesParamChoices');
|
|
58
|
+
const choiceEntries = choiceParam
|
|
59
|
+
? Object.fromEntries(choiceParam.choices.map((c) => [choiceValue(c), choiceLocalize(c)]))
|
|
60
|
+
: {};
|
|
61
|
+
return { [property.name]: Object.assign({ label: l }, choiceEntries) };
|
|
62
|
+
}
|
|
63
|
+
return { [property.name]: label };
|
|
64
|
+
}
|
|
65
|
+
if (isAction(property)) {
|
|
66
|
+
const labelParam = property.params.find(x => isLabelParam(x));
|
|
67
|
+
return { [property.name]: labelParam ? labelParam.value : humanize(property.name) };
|
|
68
|
+
}
|
|
69
|
+
if (isHookHandler(property)) {
|
|
70
|
+
return { [property.name]: humanize(property.name) };
|
|
71
|
+
}
|
|
72
|
+
return {};
|
|
73
|
+
}
|
|
74
|
+
function documentEntries(document) {
|
|
75
|
+
const bodyEntries = Object.assign({}, ...document.body.map(p => propertyEntries(p)));
|
|
76
|
+
return {
|
|
77
|
+
[document.name.toLowerCase()]: humanize(document.name),
|
|
78
|
+
[document.name]: Object.assign({ [document.name]: humanize(document.name) }, bodyEntries)
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const actors = entry.documents.filter(d => isActor(d));
|
|
82
|
+
const items = entry.documents.filter(d => isItem(d));
|
|
83
|
+
const localization = Object.assign({ NoSingleDocument: 'No Linked Document', EditModeWarning: 'Active Effects are not applied while in Edit mode. Base values are displayed and used for all rolls, calculations and actions.', SendToChat: 'Send to Chat', SETTINGS: {
|
|
84
|
+
CreateSystemJournalName: 'Create System Journal',
|
|
85
|
+
CreateSystemJournalHint: 'If disabled, the System Journal will not be automatically created on load.',
|
|
86
|
+
RoundUpDamageApplicationName: 'Round Up Damage',
|
|
87
|
+
RoundUpDamageApplicationHint: 'When enabled, damage is rounded up to the nearest whole number. When disabled, damage is rounded down.',
|
|
88
|
+
AllowTargetDamageApplicationName: 'Allow Target Damage Application',
|
|
89
|
+
AllowTargetDamageApplicationHint: 'Whether or not to allow damage and healing on chat messages to be applied to targeted tokens in addition to selected tokens. Targeting does not require permissions, so this can allow players and GMs to apply damage to ANY token they can see.',
|
|
90
|
+
DamageApplicationChatCardName: 'Damage Application Summary',
|
|
91
|
+
DamageApplicationChatCardHint: 'Controls when to send chat cards summarizing damage/healing applications with revert functionality.',
|
|
92
|
+
DamageApplicationChatCard: { None: "Don't send", Public: 'Send to All (public message)', GM: 'Send to GM (GM-only message)' }
|
|
93
|
+
}, CONTEXT: { ApplyChanges: 'Apply', ApplyDamage: 'As Damage', ApplyHealing: 'As Healing', ApplyTemp: 'As Temporary' }, NOTIFICATIONS: { NoTokenSelected: 'No Token is currently selected', NoTokenTargeted: 'No Token is currently targeted' }, TYPES: {
|
|
94
|
+
Actor: Object.assign({ actor: 'Actor' }, Object.fromEntries(actors.map(a => [a.name.toLowerCase(), humanize(a.name)]))),
|
|
95
|
+
Item: Object.assign({ item: 'Item' }, Object.fromEntries(items.map(i => [i.name.toLowerCase(), humanize(i.name)])))
|
|
96
|
+
}, EFFECTS: { AddOnce: 'Add Once', TabEffects: 'Effects' }, JOURNAL: {
|
|
97
|
+
System: 'System', Keywords: 'Keywords', DamageTypes: 'Damage Types', StatusEffects: 'Status Effects',
|
|
98
|
+
KeywordsUsageTitle: 'Keyword Usage:',
|
|
99
|
+
KeywordsUsageList: { GameMechanics: 'Defines special rules and mechanics for your game', References: 'Can be referenced in text and chat cards via @keyword', Documentation: 'Provide clear explanations for players and GMs' },
|
|
100
|
+
DamageTypeEffectsTitle: 'Damage Type Effects:',
|
|
101
|
+
DamageTypeEffectsList: { Usage: 'Can be used in damage rolls and calculations', Resistances: 'May have associated resistances and bonuses', ChoiceFields: 'Appears in damage type choice fields' },
|
|
102
|
+
StatusEffectUsageTitle: 'Status Effect Usage:',
|
|
103
|
+
StatusEffectUsageList: { TokenApplication: 'Can be applied to tokens on the canvas', MenuAppearance: 'Appear in the token status effects menu', VisualIndicators: 'Provide visual indicators of character state' },
|
|
104
|
+
KeywordBadge: 'Keyword', DamageTypeBadge: 'Damage Type', StatusEffectBadge: 'Status Effect', DeathEffectBadge: 'Death Effect',
|
|
105
|
+
AppliedWhen: 'Applied when:',
|
|
106
|
+
OperatorLabels: { LessThanOrEqual: 'is less than or equal to', GreaterThanOrEqual: 'is greater than or equal to', LessThan: 'is less than', GreaterThan: 'is greater than', Equals: 'equals', NotEqual: 'does not equal', Exists: 'exists', NotExists: 'does not exist' }
|
|
107
|
+
} }, Object.assign({}, ...entry.documents.map(d => documentEntries(d))));
|
|
108
|
+
fs.writeFileSync(generatedFilePath, JSON.stringify(localization, null, 4));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=language-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-generator.js","sourceRoot":"","sources":["../../../src/cli/components/language-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import { expandToNode, toString } from 'langium/generate';
|
|
4
|
+
export function generateMeasuredTemplatePreview(destination) {
|
|
5
|
+
const generatedFileDir = path.join(destination, "system", "placeables");
|
|
6
|
+
const generatedFilePath = path.join(generatedFileDir, `measured-template-preview.mjs`);
|
|
7
|
+
if (!fs.existsSync(generatedFileDir)) {
|
|
8
|
+
fs.mkdirSync(generatedFileDir, { recursive: true });
|
|
9
|
+
}
|
|
10
|
+
const fileNode = expandToNode `
|
|
11
|
+
// Based on https://github.com/foundryvtt/dnd5e/blob/559cecf26ddbe6fa3e464c4ae0e04c7466c00163/module/canvas/ability-template.mjs
|
|
12
|
+
// MeasuredTemplate is deprecated in Foundry v14 in favor of Scene Regions.
|
|
13
|
+
// This implementation works on v12-v14 by extending MeasuredTemplate where it
|
|
14
|
+
// exists (and the v14 deprecation shim where it does not).
|
|
15
|
+
// A Region-based rewrite will be needed when the shim is fully removed.
|
|
16
|
+
export default class MeasuredTemplatePreview extends (foundry.canvas?.placeables?.MeasuredTemplate ?? MeasuredTemplate) {
|
|
17
|
+
/**
|
|
18
|
+
* Track the timestamp when the last mouse move event was captured.
|
|
19
|
+
* @type {number}
|
|
20
|
+
*/
|
|
21
|
+
#moveTime = 0;
|
|
22
|
+
|
|
23
|
+
/* -------------------------------------------- */
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Current token that is highlighted when using adjusted size template.
|
|
27
|
+
* @type {Token5e}
|
|
28
|
+
*/
|
|
29
|
+
#hoveredToken;
|
|
30
|
+
|
|
31
|
+
/* -------------------------------------------- */
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The initially active CanvasLayer to re-activate after the workflow is complete.
|
|
35
|
+
* @type {CanvasLayer}
|
|
36
|
+
*/
|
|
37
|
+
#initialLayer;
|
|
38
|
+
|
|
39
|
+
/* -------------------------------------------- */
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Track the bound event handlers so they can be properly canceled later.
|
|
43
|
+
* @type {object}
|
|
44
|
+
*/
|
|
45
|
+
#events;
|
|
46
|
+
|
|
47
|
+
/* -------------------------------------------- */
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Whether the actor sheet was minimized when template placement began.
|
|
51
|
+
* @type {boolean}
|
|
52
|
+
*/
|
|
53
|
+
#sheetMinimized = false;
|
|
54
|
+
|
|
55
|
+
/* -------------------------------------------- */
|
|
56
|
+
|
|
57
|
+
static async place(context, sheet) {
|
|
58
|
+
const templateData = {
|
|
59
|
+
t: context.type,
|
|
60
|
+
user: game.user.id,
|
|
61
|
+
distance: context.distance,
|
|
62
|
+
direction: context.direction,
|
|
63
|
+
angle: context.angle,
|
|
64
|
+
width: context.width,
|
|
65
|
+
x: 0,
|
|
66
|
+
y: 0,
|
|
67
|
+
fillColor: game.user.color
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// Construct the templates from activity data
|
|
71
|
+
const cls = CONFIG.MeasuredTemplate.documentClass;
|
|
72
|
+
const template = new cls(foundry.utils.deepClone(templateData), { parent: canvas.scene });
|
|
73
|
+
const object = new this(template);
|
|
74
|
+
object.actorSheet = sheet;
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
// Draw the preview
|
|
78
|
+
await object.drawPreview();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* -------------------------------------------- */
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Creates a preview of the spell template.
|
|
85
|
+
* @returns {Promise} A promise that resolves with the final measured template if created.
|
|
86
|
+
*/
|
|
87
|
+
drawPreview() {
|
|
88
|
+
const initialLayer = canvas.activeLayer;
|
|
89
|
+
|
|
90
|
+
// Draw the template and switch to the template layer
|
|
91
|
+
this.draw();
|
|
92
|
+
this.layer.activate();
|
|
93
|
+
this.layer.preview.addChild(this);
|
|
94
|
+
|
|
95
|
+
// Hide the sheet that originated the preview.
|
|
96
|
+
// ApplicationV2 sheets in v14 expose a different window structure; only
|
|
97
|
+
// minimize when there's a windowId (or we're pre-v14) and not already minimized.
|
|
98
|
+
const sheet = this.actorSheet;
|
|
99
|
+
const { windowId } = (sheet?.parent ?? sheet)?.window ?? {};
|
|
100
|
+
this.#sheetMinimized = (game.release.generation < 14 || !windowId) && !sheet?._minimized;
|
|
101
|
+
if ( this.#sheetMinimized ) sheet?.minimize();
|
|
102
|
+
|
|
103
|
+
// Activate interactivity
|
|
104
|
+
return this.activatePreviewListeners(initialLayer);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* -------------------------------------------- */
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Activate listeners for the template preview
|
|
111
|
+
* @param {CanvasLayer} initialLayer The initially active CanvasLayer to re-activate after the workflow is complete
|
|
112
|
+
* @returns {Promise} A promise that resolves with the final measured template if created.
|
|
113
|
+
*/
|
|
114
|
+
activatePreviewListeners(initialLayer) {
|
|
115
|
+
return new Promise((resolve, reject) => {
|
|
116
|
+
this.#initialLayer = initialLayer;
|
|
117
|
+
this.#events = {
|
|
118
|
+
cancel: this._onCancelPlacement.bind(this),
|
|
119
|
+
confirm: this._onConfirmPlacement.bind(this),
|
|
120
|
+
move: this._onMovePlacement.bind(this),
|
|
121
|
+
resolve,
|
|
122
|
+
reject,
|
|
123
|
+
rotate: this._onRotatePlacement.bind(this)
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
// Activate listeners
|
|
127
|
+
canvas.stage.on("mousemove", this.#events.move);
|
|
128
|
+
canvas.stage.on("mouseup", this.#events.confirm);
|
|
129
|
+
canvas.app.view.oncontextmenu = this.#events.cancel;
|
|
130
|
+
canvas.app.view.onwheel = this.#events.rotate;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* -------------------------------------------- */
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Shared code for when template placement ends by being confirmed or canceled.
|
|
138
|
+
* @param {Event} event Triggering event that ended the placement.
|
|
139
|
+
*/
|
|
140
|
+
async _finishPlacement(event) {
|
|
141
|
+
if ( game.release.generation < 14 ) this.layer._onDragLeftCancel(event);
|
|
142
|
+
else this.layer.clearPreviewContainer();
|
|
143
|
+
canvas.stage.off("mousemove", this.#events.move);
|
|
144
|
+
canvas.stage.off("mouseup", this.#events.confirm);
|
|
145
|
+
canvas.app.view.oncontextmenu = null;
|
|
146
|
+
canvas.app.view.onwheel = null;
|
|
147
|
+
if ( this.#hoveredToken ) {
|
|
148
|
+
this.#hoveredToken._onHoverOut(event);
|
|
149
|
+
this.#hoveredToken = null;
|
|
150
|
+
}
|
|
151
|
+
this.#initialLayer.activate();
|
|
152
|
+
if ( this.#sheetMinimized ) await this.actorSheet?.maximize();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* -------------------------------------------- */
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Move the template preview when the mouse moves.
|
|
159
|
+
* @param {Event} event Triggering mouse event.
|
|
160
|
+
*/
|
|
161
|
+
_onMovePlacement(event) {
|
|
162
|
+
event.stopPropagation();
|
|
163
|
+
const now = Date.now(); // Apply a 20ms throttle
|
|
164
|
+
if ( now - this.#moveTime <= 20 ) return;
|
|
165
|
+
const center = event.data.getLocalPosition(this.layer);
|
|
166
|
+
const updates = this.getSnappedPosition(center);
|
|
167
|
+
|
|
168
|
+
// Adjust template size to take hovered token into account if \`adjustedSize\` is set
|
|
169
|
+
const baseDistance = this.document.flags.dnd5e?.dimensions?.size;
|
|
170
|
+
if ( this.document.flags.dnd5e?.dimensions?.adjustedSize && baseDistance ) {
|
|
171
|
+
const rectangle = new PIXI.Rectangle(center.x, center.y, 1, 1);
|
|
172
|
+
const hoveredToken = canvas.tokens.quadtree.getObjects(rectangle, {
|
|
173
|
+
collisionTest: ({ t }) => t.visible && !t.document.isSecret }).first();
|
|
174
|
+
if ( hoveredToken && (hoveredToken !== this.#hoveredToken) ) {
|
|
175
|
+
this.#hoveredToken = hoveredToken;
|
|
176
|
+
this.#hoveredToken._onHoverIn(event);
|
|
177
|
+
const size = Math.max(hoveredToken.document.width, hoveredToken.document.height);
|
|
178
|
+
updates.distance = baseDistance + (size * canvas.grid.distance / 2);
|
|
179
|
+
} else if ( !hoveredToken && this.#hoveredToken ) {
|
|
180
|
+
this.#hoveredToken._onHoverOut(event);
|
|
181
|
+
this.#hoveredToken = null;
|
|
182
|
+
updates.distance = baseDistance;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
this.document.updateSource(updates);
|
|
187
|
+
this.refresh();
|
|
188
|
+
this.#moveTime = now;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* -------------------------------------------- */
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Rotate the template preview by 3˚ increments when the mouse wheel is rotated.
|
|
195
|
+
* @param {Event} event Triggering mouse event.
|
|
196
|
+
*/
|
|
197
|
+
_onRotatePlacement(event) {
|
|
198
|
+
if ( event.ctrlKey ) event.preventDefault(); // Avoid zooming the browser window
|
|
199
|
+
event.stopPropagation();
|
|
200
|
+
const delta = canvas.grid.type > CONST.GRID_TYPES.SQUARE ? 30 : 15;
|
|
201
|
+
const snap = event.shiftKey ? delta : 5;
|
|
202
|
+
const update = {direction: this.document.direction + (snap * Math.sign(event.deltaY))};
|
|
203
|
+
this.document.updateSource(update);
|
|
204
|
+
this.refresh();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* -------------------------------------------- */
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Confirm placement when the left mouse button is clicked.
|
|
211
|
+
* @param {Event} event Triggering mouse event.
|
|
212
|
+
*/
|
|
213
|
+
async _onConfirmPlacement(event) {
|
|
214
|
+
await this._finishPlacement(event);
|
|
215
|
+
const destination = canvas.templates.getSnappedPoint({ x: this.document.x, y: this.document.y });
|
|
216
|
+
this.document.updateSource(destination);
|
|
217
|
+
this.#events.resolve(canvas.scene.createEmbeddedDocuments("MeasuredTemplate", [this.document.toObject()]));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/* -------------------------------------------- */
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Cancel placement when the right mouse button is clicked.
|
|
224
|
+
* @param {Event} event Triggering mouse event.
|
|
225
|
+
*/
|
|
226
|
+
async _onCancelPlacement(event) {
|
|
227
|
+
await this._finishPlacement(event);
|
|
228
|
+
this.#events.reject();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
`;
|
|
232
|
+
fs.writeFileSync(generatedFilePath, toString(fileNode));
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=measured-template-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measured-template-preview.js","sourceRoot":"","sources":["../../../src/cli/components/measured-template-preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,UAAU,+BAA+B,CAAC,WAAmB;IAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxE,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;IAEvF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;QAClC,EAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;KACvD;IAED,MAAM,QAAQ,GAAG,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6N5B,CAAC;IAEF,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|