legal-markdown-js 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +168 -0
- package/dist/browser.d.ts +87 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +157 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli/index.d.ts +34 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +221 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/service.d.ts +128 -0
- package/dist/cli/service.d.ts.map +1 -0
- package/dist/cli/service.js +284 -0
- package/dist/cli/service.js.map +1 -0
- package/dist/constants/index.d.ts +229 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +232 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/core/exporters/metadata-exporter.d.ts +104 -0
- package/dist/core/exporters/metadata-exporter.d.ts.map +1 -0
- package/dist/core/exporters/metadata-exporter.js +201 -0
- package/dist/core/exporters/metadata-exporter.js.map +1 -0
- package/dist/core/index.d.ts +40 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +56 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/parsers/yaml-parser.d.ts +149 -0
- package/dist/core/parsers/yaml-parser.d.ts.map +1 -0
- package/dist/core/parsers/yaml-parser.js +321 -0
- package/dist/core/parsers/yaml-parser.js.map +1 -0
- package/dist/core/processors/clause-processor.d.ts +74 -0
- package/dist/core/processors/clause-processor.d.ts.map +1 -0
- package/dist/core/processors/clause-processor.js +213 -0
- package/dist/core/processors/clause-processor.js.map +1 -0
- package/dist/core/processors/date-processor.d.ts +90 -0
- package/dist/core/processors/date-processor.d.ts.map +1 -0
- package/dist/core/processors/date-processor.js +336 -0
- package/dist/core/processors/date-processor.js.map +1 -0
- package/dist/core/processors/header-processor.d.ts +104 -0
- package/dist/core/processors/header-processor.d.ts.map +1 -0
- package/dist/core/processors/header-processor.js +585 -0
- package/dist/core/processors/header-processor.js.map +1 -0
- package/dist/core/processors/import-processor.d.ts +116 -0
- package/dist/core/processors/import-processor.d.ts.map +1 -0
- package/dist/core/processors/import-processor.js +236 -0
- package/dist/core/processors/import-processor.js.map +1 -0
- package/dist/core/processors/mixin-processor.d.ts +93 -0
- package/dist/core/processors/mixin-processor.d.ts.map +1 -0
- package/dist/core/processors/mixin-processor.js +378 -0
- package/dist/core/processors/mixin-processor.js.map +1 -0
- package/dist/core/processors/reference-processor.d.ts +115 -0
- package/dist/core/processors/reference-processor.d.ts.map +1 -0
- package/dist/core/processors/reference-processor.js +273 -0
- package/dist/core/processors/reference-processor.js.map +1 -0
- package/dist/errors/index.d.ts +234 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +267 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/extensions/batch-processor.d.ts +197 -0
- package/dist/extensions/batch-processor.d.ts.map +1 -0
- package/dist/extensions/batch-processor.js +392 -0
- package/dist/extensions/batch-processor.js.map +1 -0
- package/dist/extensions/formatters/index.d.ts +99 -0
- package/dist/extensions/formatters/index.d.ts.map +1 -0
- package/dist/extensions/formatters/index.js +128 -0
- package/dist/extensions/formatters/index.js.map +1 -0
- package/dist/extensions/index.d.ts +53 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +71 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/latex-parser.d.ts +111 -0
- package/dist/extensions/latex-parser.d.ts.map +1 -0
- package/dist/extensions/latex-parser.js +563 -0
- package/dist/extensions/latex-parser.js.map +1 -0
- package/dist/extensions/rst-parser.d.ts +112 -0
- package/dist/extensions/rst-parser.d.ts.map +1 -0
- package/dist/extensions/rst-parser.js +268 -0
- package/dist/extensions/rst-parser.js.map +1 -0
- package/dist/extensions/template-loops.d.ts +61 -0
- package/dist/extensions/template-loops.d.ts.map +1 -0
- package/dist/extensions/template-loops.js +418 -0
- package/dist/extensions/template-loops.js.map +1 -0
- package/dist/extensions/utilities/index.d.ts +114 -0
- package/dist/extensions/utilities/index.d.ts.map +1 -0
- package/dist/extensions/utilities/index.js +137 -0
- package/dist/extensions/utilities/index.js.map +1 -0
- package/dist/extensions/validators/index.d.ts +65 -0
- package/dist/extensions/validators/index.d.ts.map +1 -0
- package/dist/extensions/validators/index.js +88 -0
- package/dist/extensions/validators/index.js.map +1 -0
- package/dist/generators/html-generator.d.ts +184 -0
- package/dist/generators/html-generator.d.ts.map +1 -0
- package/dist/generators/html-generator.js +361 -0
- package/dist/generators/html-generator.js.map +1 -0
- package/dist/generators/pdf-generator.d.ts +165 -0
- package/dist/generators/pdf-generator.d.ts.map +1 -0
- package/dist/generators/pdf-generator.js +275 -0
- package/dist/generators/pdf-generator.js.map +1 -0
- package/dist/helpers/date-helpers.d.ts +216 -0
- package/dist/helpers/date-helpers.d.ts.map +1 -0
- package/dist/helpers/date-helpers.js +402 -0
- package/dist/helpers/date-helpers.js.map +1 -0
- package/dist/helpers/index.d.ts +87 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +149 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/number-helpers.d.ts +269 -0
- package/dist/helpers/number-helpers.d.ts.map +1 -0
- package/dist/helpers/number-helpers.js +406 -0
- package/dist/helpers/number-helpers.js.map +1 -0
- package/dist/helpers/string-helpers.d.ts +391 -0
- package/dist/helpers/string-helpers.d.ts.map +1 -0
- package/dist/helpers/string-helpers.js +549 -0
- package/dist/helpers/string-helpers.js.map +1 -0
- package/dist/index.d.ts +229 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +384 -0
- package/dist/index.js.map +1 -0
- package/dist/legal-markdown.umd.min.js +2 -0
- package/dist/legal-markdown.umd.min.js.LICENSE.txt +14 -0
- package/dist/legal-markdown.umd.min.js.map +1 -0
- package/dist/lib/index.d.ts +150 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +265 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/parsers/content-detector.d.ts +131 -0
- package/dist/parsers/content-detector.d.ts.map +1 -0
- package/dist/parsers/content-detector.js +220 -0
- package/dist/parsers/content-detector.js.map +1 -0
- package/dist/parsers/fallback-parsers.d.ts +14 -0
- package/dist/parsers/fallback-parsers.d.ts.map +1 -0
- package/dist/parsers/fallback-parsers.js +188 -0
- package/dist/parsers/fallback-parsers.js.map +1 -0
- package/dist/parsers/implementations/pandoc-native.d.ts +13 -0
- package/dist/parsers/implementations/pandoc-native.d.ts.map +1 -0
- package/dist/parsers/implementations/pandoc-native.js +63 -0
- package/dist/parsers/implementations/pandoc-native.js.map +1 -0
- package/dist/parsers/implementations/pandoc-wasm.d.ts +14 -0
- package/dist/parsers/implementations/pandoc-wasm.d.ts.map +1 -0
- package/dist/parsers/implementations/pandoc-wasm.js +64 -0
- package/dist/parsers/implementations/pandoc-wasm.js.map +1 -0
- package/dist/parsers/pandoc-factory.d.ts +97 -0
- package/dist/parsers/pandoc-factory.d.ts.map +1 -0
- package/dist/parsers/pandoc-factory.js +146 -0
- package/dist/parsers/pandoc-factory.js.map +1 -0
- package/dist/parsers/pandoc-loader.d.ts +24 -0
- package/dist/parsers/pandoc-loader.d.ts.map +1 -0
- package/dist/parsers/pandoc-loader.js +124 -0
- package/dist/parsers/pandoc-loader.js.map +1 -0
- package/dist/parsers/pandoc-parser.d.ts +27 -0
- package/dist/parsers/pandoc-parser.d.ts.map +1 -0
- package/dist/parsers/pandoc-parser.js +3 -0
- package/dist/parsers/pandoc-parser.js.map +1 -0
- package/dist/styles/default.css +125 -0
- package/dist/styles/headers.css +146 -0
- package/dist/styles/highlight.css +171 -0
- package/dist/tracking/field-tracker.d.ts +206 -0
- package/dist/tracking/field-tracker.d.ts.map +1 -0
- package/dist/tracking/field-tracker.js +247 -0
- package/dist/tracking/field-tracker.js.map +1 -0
- package/dist/types.d.ts +186 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +33 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +107 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +122 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/web/bundle-standalone.js +28 -0
- package/dist/web/bundle.js +17 -0
- package/dist/web/index.html +1465 -0
- package/dist/web/legal-markdown.umd.min.js +2 -0
- package/dist/web/standalone.html +390 -0
- package/dist/web/styles.css +874 -0
- package/package.json +118 -0
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Template Loop Processing Extension for Legal Markdown
|
|
4
|
+
*
|
|
5
|
+
* This extension adds support for template loops and conditional blocks using
|
|
6
|
+
* the {{#variable}}...{{/variable}} syntax. It enables iteration over arrays
|
|
7
|
+
* and conditional rendering of template sections.
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Array iteration: {{#items}}...{{/items}}
|
|
11
|
+
* - Conditional blocks: {{#loyaltyMember}}...{{/loyaltyMember}}
|
|
12
|
+
* - Nested loops support
|
|
13
|
+
* - Context management for loop variables
|
|
14
|
+
* - Integration with field tracking
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { processTemplateLoops } from './template-loops';
|
|
19
|
+
*
|
|
20
|
+
* const content = `
|
|
21
|
+
* {{#items}}
|
|
22
|
+
* - {{name}} {{onSale ? "(ON SALE!)" : ""}} - ${{price}}
|
|
23
|
+
* {{/items}}
|
|
24
|
+
* `;
|
|
25
|
+
*
|
|
26
|
+
* const metadata = {
|
|
27
|
+
* items: [
|
|
28
|
+
* { name: "Product A", price: 10.99, onSale: true },
|
|
29
|
+
* { name: "Product B", price: 15.50, onSale: false }
|
|
30
|
+
* ]
|
|
31
|
+
* };
|
|
32
|
+
*
|
|
33
|
+
* const result = processTemplateLoops(content, metadata);
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.processTemplateLoops = processTemplateLoops;
|
|
38
|
+
const field_tracker_1 = require("../tracking/field-tracker");
|
|
39
|
+
/**
|
|
40
|
+
* Escapes HTML attribute values to prevent breaking HTML structure
|
|
41
|
+
* @param value - The value to escape
|
|
42
|
+
* @returns Escaped value safe for HTML attributes
|
|
43
|
+
*/
|
|
44
|
+
function escapeHtmlAttribute(value) {
|
|
45
|
+
return value
|
|
46
|
+
.replace(/&/g, '&')
|
|
47
|
+
.replace(/"/g, '"')
|
|
48
|
+
.replace(/'/g, ''')
|
|
49
|
+
.replace(/</g, '<')
|
|
50
|
+
.replace(/>/g, '>');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Processes template loops and conditional blocks in content
|
|
54
|
+
*
|
|
55
|
+
* @param content - The template content containing loop patterns
|
|
56
|
+
* @param metadata - The metadata object containing loop data
|
|
57
|
+
* @param context - Current loop context for nested loops
|
|
58
|
+
* @param enableFieldTracking - Whether to enable field tracking HTML spans
|
|
59
|
+
* @returns Processed content with loops expanded
|
|
60
|
+
*/
|
|
61
|
+
function processTemplateLoops(content, metadata, context, enableFieldTracking = true) {
|
|
62
|
+
// Find all loop blocks in the content
|
|
63
|
+
const loopBlocks = findLoopBlocks(content);
|
|
64
|
+
if (loopBlocks.length === 0) {
|
|
65
|
+
return content;
|
|
66
|
+
}
|
|
67
|
+
// Process loop blocks from last to first to avoid position shifting
|
|
68
|
+
let processedContent = content;
|
|
69
|
+
for (let i = loopBlocks.length - 1; i >= 0; i--) {
|
|
70
|
+
const loopBlock = loopBlocks[i];
|
|
71
|
+
const expandedContent = expandLoopBlock(loopBlock, metadata, context, enableFieldTracking);
|
|
72
|
+
// Replace the loop block with expanded content
|
|
73
|
+
processedContent =
|
|
74
|
+
processedContent.slice(0, loopBlock.start) +
|
|
75
|
+
expandedContent +
|
|
76
|
+
processedContent.slice(loopBlock.end);
|
|
77
|
+
}
|
|
78
|
+
return processedContent;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Finds all loop blocks in the content using regex pattern matching
|
|
82
|
+
*
|
|
83
|
+
* @param content - The content to search for loop blocks
|
|
84
|
+
* @returns Array of parsed loop blocks
|
|
85
|
+
*/
|
|
86
|
+
function findLoopBlocks(content) {
|
|
87
|
+
const loopBlocks = [];
|
|
88
|
+
const loopPattern = /\{\{#(\w+)\}\}([\s\S]*?)\{\{\/\1\}\}/g;
|
|
89
|
+
let match;
|
|
90
|
+
while ((match = loopPattern.exec(content)) !== null) {
|
|
91
|
+
const [fullMatch, variable, loopContent] = match;
|
|
92
|
+
loopBlocks.push({
|
|
93
|
+
variable,
|
|
94
|
+
content: loopContent,
|
|
95
|
+
start: match.index,
|
|
96
|
+
end: match.index + fullMatch.length,
|
|
97
|
+
fullMatch,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return loopBlocks;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Expands a single loop block into its final content
|
|
104
|
+
*
|
|
105
|
+
* @param loopBlock - The loop block to expand
|
|
106
|
+
* @param metadata - The metadata object containing loop data
|
|
107
|
+
* @param parentContext - Parent loop context for nested loops
|
|
108
|
+
* @param enableFieldTracking - Whether to enable field tracking HTML spans
|
|
109
|
+
* @returns Expanded content string
|
|
110
|
+
*/
|
|
111
|
+
function expandLoopBlock(loopBlock, metadata, parentContext, enableFieldTracking = true) {
|
|
112
|
+
const { variable, content } = loopBlock;
|
|
113
|
+
// Resolve the loop variable value from metadata or parent context
|
|
114
|
+
const loopValue = resolveLoopVariable(variable, metadata, parentContext);
|
|
115
|
+
// Track field usage
|
|
116
|
+
field_tracker_1.fieldTracker.trackField(variable, {
|
|
117
|
+
value: loopValue,
|
|
118
|
+
hasLogic: true,
|
|
119
|
+
mixinUsed: 'loop',
|
|
120
|
+
});
|
|
121
|
+
// Handle different types of loop values
|
|
122
|
+
if (Array.isArray(loopValue)) {
|
|
123
|
+
return expandArrayLoop(variable, content, loopValue, metadata, parentContext, enableFieldTracking);
|
|
124
|
+
}
|
|
125
|
+
else if (loopValue) {
|
|
126
|
+
// Conditional block - render if truthy
|
|
127
|
+
return expandConditionalBlock(variable, content, loopValue, metadata, parentContext, enableFieldTracking);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// Falsy value - don't render
|
|
131
|
+
return '';
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Expands an array loop, iterating over each item
|
|
136
|
+
*
|
|
137
|
+
* @param variable - The loop variable name
|
|
138
|
+
* @param content - The loop content template
|
|
139
|
+
* @param items - The array to iterate over
|
|
140
|
+
* @param metadata - The metadata object
|
|
141
|
+
* @param parentContext - Parent loop context
|
|
142
|
+
* @param enableFieldTracking - Whether to enable field tracking HTML spans
|
|
143
|
+
* @returns Expanded content for all array items
|
|
144
|
+
*/
|
|
145
|
+
function expandArrayLoop(variable, content, items, metadata, parentContext, enableFieldTracking = true) {
|
|
146
|
+
const expandedParts = [];
|
|
147
|
+
for (let i = 0; i < items.length; i++) {
|
|
148
|
+
const item = items[i];
|
|
149
|
+
// Create loop context for this iteration
|
|
150
|
+
const loopContext = {
|
|
151
|
+
variable,
|
|
152
|
+
item,
|
|
153
|
+
index: i,
|
|
154
|
+
total: items.length,
|
|
155
|
+
parent: parentContext,
|
|
156
|
+
};
|
|
157
|
+
// Create enhanced metadata with current item properties
|
|
158
|
+
const enhancedMetadata = createEnhancedMetadata(metadata, item, loopContext);
|
|
159
|
+
// Process the content with the enhanced metadata
|
|
160
|
+
let processedContent = content;
|
|
161
|
+
// First, process any nested loops
|
|
162
|
+
processedContent = processTemplateLoops(processedContent, enhancedMetadata, loopContext, enableFieldTracking);
|
|
163
|
+
// Then process regular mixins in the content
|
|
164
|
+
processedContent = processItemMixins(processedContent, enhancedMetadata, loopContext, enableFieldTracking);
|
|
165
|
+
// Convert markdown list items to HTML li elements if content starts with -
|
|
166
|
+
processedContent = convertMarkdownListToHtml(processedContent);
|
|
167
|
+
expandedParts.push(processedContent);
|
|
168
|
+
}
|
|
169
|
+
return expandedParts.join('\n');
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Expands a conditional block if the condition is truthy
|
|
173
|
+
*
|
|
174
|
+
* @param variable - The condition variable name
|
|
175
|
+
* @param content - The conditional content template
|
|
176
|
+
* @param value - The condition value
|
|
177
|
+
* @param metadata - The metadata object
|
|
178
|
+
* @param parentContext - Parent loop context
|
|
179
|
+
* @param enableFieldTracking - Whether to enable field tracking HTML spans
|
|
180
|
+
* @returns Expanded content if condition is truthy, empty string otherwise
|
|
181
|
+
*/
|
|
182
|
+
function expandConditionalBlock(variable, content, value, metadata, parentContext, enableFieldTracking = true) {
|
|
183
|
+
// Create enhanced metadata with the condition value
|
|
184
|
+
const enhancedMetadata = {
|
|
185
|
+
...metadata,
|
|
186
|
+
[variable]: value,
|
|
187
|
+
};
|
|
188
|
+
// Process any nested loops first
|
|
189
|
+
let processedContent = processTemplateLoops(content, enhancedMetadata, parentContext, enableFieldTracking);
|
|
190
|
+
// Then process regular mixins
|
|
191
|
+
processedContent = processItemMixins(processedContent, enhancedMetadata, parentContext, enableFieldTracking);
|
|
192
|
+
return processedContent;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Resolves a loop variable from metadata or parent context
|
|
196
|
+
*
|
|
197
|
+
* @param variable - The variable name to resolve
|
|
198
|
+
* @param metadata - The metadata object
|
|
199
|
+
* @param parentContext - Parent loop context
|
|
200
|
+
* @returns The resolved variable value
|
|
201
|
+
*/
|
|
202
|
+
function resolveLoopVariable(variable, metadata, parentContext) {
|
|
203
|
+
// First check if it's available in current metadata
|
|
204
|
+
if (Object.prototype.hasOwnProperty.call(metadata, variable)) {
|
|
205
|
+
return metadata[variable];
|
|
206
|
+
}
|
|
207
|
+
// Then check parent context (for nested loops)
|
|
208
|
+
if (parentContext &&
|
|
209
|
+
parentContext.item &&
|
|
210
|
+
Object.prototype.hasOwnProperty.call(parentContext.item, variable)) {
|
|
211
|
+
return parentContext.item[variable];
|
|
212
|
+
}
|
|
213
|
+
// Check parent context's parent (for deeper nesting)
|
|
214
|
+
let ctx = parentContext;
|
|
215
|
+
while (ctx && ctx.parent) {
|
|
216
|
+
ctx = ctx.parent;
|
|
217
|
+
if (ctx.item && Object.prototype.hasOwnProperty.call(ctx.item, variable)) {
|
|
218
|
+
return ctx.item[variable];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Creates enhanced metadata by merging current item properties
|
|
225
|
+
*
|
|
226
|
+
* @param metadata - Original metadata
|
|
227
|
+
* @param item - Current loop item
|
|
228
|
+
* @param context - Loop context
|
|
229
|
+
* @returns Enhanced metadata object
|
|
230
|
+
*/
|
|
231
|
+
function createEnhancedMetadata(metadata, item, context) {
|
|
232
|
+
const enhanced = { ...metadata };
|
|
233
|
+
// Add current item properties if it's an object
|
|
234
|
+
if (item && typeof item === 'object' && !Array.isArray(item)) {
|
|
235
|
+
Object.assign(enhanced, item);
|
|
236
|
+
}
|
|
237
|
+
// Add loop context variables
|
|
238
|
+
enhanced['@index'] = context.index;
|
|
239
|
+
enhanced['@total'] = context.total;
|
|
240
|
+
enhanced['@first'] = context.index === 0;
|
|
241
|
+
enhanced['@last'] = context.index === context.total - 1;
|
|
242
|
+
return enhanced;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Processes mixins within loop content with enhanced metadata
|
|
246
|
+
*
|
|
247
|
+
* @param content - The content to process
|
|
248
|
+
* @param metadata - Enhanced metadata with loop context
|
|
249
|
+
* @param context - Loop context
|
|
250
|
+
* @param enableFieldTracking - Whether to enable field tracking HTML spans
|
|
251
|
+
* @returns Processed content with mixins resolved
|
|
252
|
+
*/
|
|
253
|
+
function processItemMixins(content, metadata, context, enableFieldTracking = true) {
|
|
254
|
+
// Use a simple regex to find and replace mixins
|
|
255
|
+
const mixinPattern = /\{\{([^}]+)\}\}/g;
|
|
256
|
+
return content.replace(mixinPattern, (match, variable) => {
|
|
257
|
+
const trimmedVar = variable.trim();
|
|
258
|
+
// Handle conditional expressions (ternary operator)
|
|
259
|
+
if (trimmedVar.includes('?') && trimmedVar.includes(':')) {
|
|
260
|
+
const result = processConditionalExpression(trimmedVar, metadata, enableFieldTracking);
|
|
261
|
+
if (enableFieldTracking) {
|
|
262
|
+
return `<span class="highlight">${result}</span>`;
|
|
263
|
+
}
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
// Handle simple variable substitution
|
|
267
|
+
const value = resolveVariablePath(trimmedVar, metadata, context);
|
|
268
|
+
if (value === undefined || value === null) {
|
|
269
|
+
if (enableFieldTracking) {
|
|
270
|
+
return (`<span class="missing-value" data-field="${escapeHtmlAttribute(trimmedVar)}">` +
|
|
271
|
+
`[[${trimmedVar}]]</span>`);
|
|
272
|
+
}
|
|
273
|
+
return `{{${trimmedVar}}}`;
|
|
274
|
+
}
|
|
275
|
+
if (enableFieldTracking) {
|
|
276
|
+
return (`<span class="imported-value" data-field="${escapeHtmlAttribute(trimmedVar)}">` +
|
|
277
|
+
`${String(value)}</span>`);
|
|
278
|
+
}
|
|
279
|
+
return String(value);
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Processes conditional expressions (ternary operator)
|
|
284
|
+
*
|
|
285
|
+
* @param expression - The conditional expression
|
|
286
|
+
* @param metadata - The metadata object
|
|
287
|
+
* @param enableFieldTracking - Whether to enable field tracking HTML spans
|
|
288
|
+
* @returns Resolved conditional value
|
|
289
|
+
*/
|
|
290
|
+
function processConditionalExpression(expression, metadata, enableFieldTracking = true) {
|
|
291
|
+
// Find the question mark and colon, but be careful about quoted strings
|
|
292
|
+
const questionIndex = findOperatorIndex(expression, '?');
|
|
293
|
+
const colonIndex = findOperatorIndex(expression, ':', questionIndex);
|
|
294
|
+
if (questionIndex === -1 || colonIndex === -1) {
|
|
295
|
+
return expression; // Invalid ternary, return as-is
|
|
296
|
+
}
|
|
297
|
+
const condition = expression.substring(0, questionIndex).trim();
|
|
298
|
+
const truePart = expression.substring(questionIndex + 1, colonIndex).trim();
|
|
299
|
+
const falsePart = expression.substring(colonIndex + 1).trim();
|
|
300
|
+
// Resolve condition value
|
|
301
|
+
const conditionValue = resolveVariablePath(condition, metadata);
|
|
302
|
+
// Choose appropriate part based on condition
|
|
303
|
+
const selectedPart = conditionValue ? truePart : falsePart;
|
|
304
|
+
// Remove quotes if present
|
|
305
|
+
if ((selectedPart.startsWith('"') && selectedPart.endsWith('"')) ||
|
|
306
|
+
(selectedPart.startsWith("'") && selectedPart.endsWith("'"))) {
|
|
307
|
+
const unquotedValue = selectedPart.slice(1, -1);
|
|
308
|
+
if (enableFieldTracking) {
|
|
309
|
+
return (`<span class="imported-value" data-field="${escapeHtmlAttribute(expression)}">` +
|
|
310
|
+
`${unquotedValue}</span>`);
|
|
311
|
+
}
|
|
312
|
+
return unquotedValue;
|
|
313
|
+
}
|
|
314
|
+
// Process as expression (might contain variables or concatenation)
|
|
315
|
+
const processedValue = processExpression(selectedPart, metadata);
|
|
316
|
+
if (enableFieldTracking) {
|
|
317
|
+
return (`<span class="imported-value" data-field="${escapeHtmlAttribute(expression)}">` +
|
|
318
|
+
`${processedValue}</span>`);
|
|
319
|
+
}
|
|
320
|
+
return processedValue;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Finds the index of an operator outside of quoted strings
|
|
324
|
+
*
|
|
325
|
+
* @param expression - The expression to search
|
|
326
|
+
* @param operator - The operator to find
|
|
327
|
+
* @param startIndex - Starting index for the search
|
|
328
|
+
* @returns The index of the operator or -1 if not found
|
|
329
|
+
*/
|
|
330
|
+
function findOperatorIndex(expression, operator, startIndex = 0) {
|
|
331
|
+
let inQuotes = false;
|
|
332
|
+
let quoteChar = '';
|
|
333
|
+
for (let i = startIndex; i < expression.length; i++) {
|
|
334
|
+
const char = expression[i];
|
|
335
|
+
if (!inQuotes && (char === '"' || char === "'")) {
|
|
336
|
+
inQuotes = true;
|
|
337
|
+
quoteChar = char;
|
|
338
|
+
}
|
|
339
|
+
else if (inQuotes && char === quoteChar) {
|
|
340
|
+
inQuotes = false;
|
|
341
|
+
quoteChar = '';
|
|
342
|
+
}
|
|
343
|
+
else if (!inQuotes && char === operator) {
|
|
344
|
+
return i;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return -1;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Processes expressions that might contain variables or concatenation
|
|
351
|
+
*
|
|
352
|
+
* @param expression - The expression to process
|
|
353
|
+
* @param metadata - The metadata object
|
|
354
|
+
* @returns Processed expression result
|
|
355
|
+
*/
|
|
356
|
+
function processExpression(expression, metadata) {
|
|
357
|
+
// Handle concatenation with +
|
|
358
|
+
if (expression.includes('+')) {
|
|
359
|
+
return expression
|
|
360
|
+
.split('+')
|
|
361
|
+
.map(part => {
|
|
362
|
+
const trimmed = part.trim();
|
|
363
|
+
// Handle quoted strings
|
|
364
|
+
if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
365
|
+
(trimmed.startsWith("'") && trimmed.endsWith("'"))) {
|
|
366
|
+
return trimmed.slice(1, -1);
|
|
367
|
+
}
|
|
368
|
+
// Handle variables
|
|
369
|
+
const value = resolveVariablePath(trimmed, metadata);
|
|
370
|
+
return value !== undefined ? String(value) : trimmed;
|
|
371
|
+
})
|
|
372
|
+
.join('');
|
|
373
|
+
}
|
|
374
|
+
// Handle single variable
|
|
375
|
+
const value = resolveVariablePath(expression, metadata);
|
|
376
|
+
return value !== undefined ? String(value) : expression;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Resolves a variable path with dot notation support
|
|
380
|
+
*
|
|
381
|
+
* @param path - The variable path (e.g., 'item.name')
|
|
382
|
+
* @param metadata - The metadata object
|
|
383
|
+
* @param context - Loop context
|
|
384
|
+
* @returns Resolved variable value
|
|
385
|
+
*/
|
|
386
|
+
function resolveVariablePath(path, metadata, context) {
|
|
387
|
+
// Split path by dots
|
|
388
|
+
const parts = path.split('.');
|
|
389
|
+
let current = metadata;
|
|
390
|
+
for (const part of parts) {
|
|
391
|
+
if (current &&
|
|
392
|
+
typeof current === 'object' &&
|
|
393
|
+
Object.prototype.hasOwnProperty.call(current, part)) {
|
|
394
|
+
current = current[part];
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
return undefined;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return current;
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Converts markdown list items to HTML li elements
|
|
404
|
+
*
|
|
405
|
+
* @param content - The content to convert
|
|
406
|
+
* @returns Content with markdown list items converted to HTML li elements
|
|
407
|
+
*/
|
|
408
|
+
function convertMarkdownListToHtml(content) {
|
|
409
|
+
// Check if content starts with markdown list item syntax
|
|
410
|
+
const trimmedContent = content.trim();
|
|
411
|
+
if (trimmedContent.startsWith('- ')) {
|
|
412
|
+
// Convert "- content" to "<li>content</li>"
|
|
413
|
+
const listItemContent = trimmedContent.substring(2).trim();
|
|
414
|
+
return `<li>${listItemContent}</li>`;
|
|
415
|
+
}
|
|
416
|
+
return content;
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=template-loops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-loops.js","sourceRoot":"","sources":["../../src/extensions/template-loops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Utility Functions for Legal Document Analysis
|
|
3
|
+
*
|
|
4
|
+
* This module provides utility functions for analyzing and extracting information
|
|
5
|
+
* from Legal Markdown documents. These are extensions beyond the core functionality
|
|
6
|
+
* that provide insights into document structure, content, and usage patterns.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Document statistics and analysis
|
|
10
|
+
* - Reference extraction and analysis
|
|
11
|
+
* - Condition extraction from optional clauses
|
|
12
|
+
* - Word count and character count metrics
|
|
13
|
+
* - Header and structure analysis
|
|
14
|
+
* - Import usage tracking
|
|
15
|
+
* - Extensions not present in the original legal-markdown
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* import { analyzeDocument, extractReferences, extractConditions } from './utilities';
|
|
20
|
+
*
|
|
21
|
+
* // Analyze document statistics
|
|
22
|
+
* const stats = analyzeDocument(content);
|
|
23
|
+
* console.log(`Document contains ${stats.wordCount} words and ${stats.headerCount} headers`);
|
|
24
|
+
*
|
|
25
|
+
* // Extract references
|
|
26
|
+
* const references = extractReferences(content);
|
|
27
|
+
* console.log('References used:', references);
|
|
28
|
+
*
|
|
29
|
+
* // Extract conditions
|
|
30
|
+
* const conditions = extractConditions(content);
|
|
31
|
+
* console.log('Conditions used:', conditions);
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* Analyzes document statistics and structure
|
|
36
|
+
*
|
|
37
|
+
* Provides comprehensive analysis of Legal Markdown document content including
|
|
38
|
+
* word counts, structural elements, and usage patterns. This is an extension
|
|
39
|
+
* not present in the original legal-markdown specification.
|
|
40
|
+
*
|
|
41
|
+
* @function analyzeDocument
|
|
42
|
+
* @param {string} content - The legal document content to analyze
|
|
43
|
+
* @returns {Object} Object containing document statistics
|
|
44
|
+
* @returns {number} returns.wordCount - Total number of words in the document
|
|
45
|
+
* @returns {number} returns.characterCount - Total number of characters in the document
|
|
46
|
+
* @returns {number} returns.headerCount - Number of header structures (l., ll., etc.)
|
|
47
|
+
* @returns {number} returns.optionalClauseCount - Number of optional clauses found
|
|
48
|
+
* @returns {number} returns.crossReferenceCount - Number of cross-references found
|
|
49
|
+
* @returns {number} returns.importCount - Number of import statements found
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* import { analyzeDocument } from './utilities';
|
|
53
|
+
*
|
|
54
|
+
* const stats = analyzeDocument(documentContent);
|
|
55
|
+
* console.log(`Document Analysis:`);
|
|
56
|
+
* console.log(`- Words: ${stats.wordCount}`);
|
|
57
|
+
* console.log(`- Characters: ${stats.characterCount}`);
|
|
58
|
+
* console.log(`- Headers: ${stats.headerCount}`);
|
|
59
|
+
* console.log(`- Optional Clauses: ${stats.optionalClauseCount}`);
|
|
60
|
+
* console.log(`- Cross References: ${stats.crossReferenceCount}`);
|
|
61
|
+
* console.log(`- Imports: ${stats.importCount}`);
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare function analyzeDocument(content: string): {
|
|
65
|
+
wordCount: number;
|
|
66
|
+
characterCount: number;
|
|
67
|
+
headerCount: number;
|
|
68
|
+
optionalClauseCount: number;
|
|
69
|
+
crossReferenceCount: number;
|
|
70
|
+
importCount: number;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Extracts all references used in a document
|
|
74
|
+
*
|
|
75
|
+
* Scans the document content for cross-reference patterns and returns a unique
|
|
76
|
+
* list of all references found. Useful for understanding document dependencies
|
|
77
|
+
* and reference usage patterns.
|
|
78
|
+
*
|
|
79
|
+
* @function extractReferences
|
|
80
|
+
* @param {string} content - The legal document content to analyze
|
|
81
|
+
* @returns {string[]} Array of unique reference names found in the document
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* import { extractReferences } from './utilities';
|
|
85
|
+
*
|
|
86
|
+
* const references = extractReferences(documentContent);
|
|
87
|
+
* console.log('References used in document:', references);
|
|
88
|
+
*
|
|
89
|
+
* // Example output: ['section-1', 'definitions', 'termination-clause']
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export declare function extractReferences(content: string): string[];
|
|
93
|
+
/**
|
|
94
|
+
* Extracts all conditions used in optional clauses
|
|
95
|
+
*
|
|
96
|
+
* Scans the document content for conditional clause patterns and returns a unique
|
|
97
|
+
* list of all conditions found. Useful for understanding document logic and
|
|
98
|
+
* conditional content usage.
|
|
99
|
+
*
|
|
100
|
+
* @function extractConditions
|
|
101
|
+
* @param {string} content - The legal document content to analyze
|
|
102
|
+
* @returns {string[]} Array of unique condition names found in the document
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* import { extractConditions } from './utilities';
|
|
106
|
+
*
|
|
107
|
+
* const conditions = extractConditions(documentContent);
|
|
108
|
+
* console.log('Conditions used in document:', conditions);
|
|
109
|
+
*
|
|
110
|
+
* // Example output: ['include-warranty', 'corporate-client', 'international-law']
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export declare function extractConditions(content: string): string[];
|
|
114
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/utilities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB,CAeA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAK3D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAK3D"}
|