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,585 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Header Processing Module for Legal Markdown Documents
|
|
4
|
+
*
|
|
5
|
+
* This module provides comprehensive header processing functionality for Legal Markdown
|
|
6
|
+
* documents, supporting both traditional (l., ll., lll.) and alternative (lfunction extractHeaderOptions(
|
|
7
|
+
metadata: Record<string, any>,
|
|
8
|
+
processingOptions: {
|
|
9
|
+
noReset?: boolean;
|
|
10
|
+
noIndent?: boolean;
|
|
11
|
+
enableFieldTracking?: boolean;
|
|
12
|
+
}
|
|
13
|
+
): HeaderOptions {l2., l3.)
|
|
14
|
+
* header syntax. It handles complex numbering schemes, hierarchical structures, and
|
|
15
|
+
* various formatting options including Roman numerals, alphabetic labels, and custom
|
|
16
|
+
* indentation patterns.
|
|
17
|
+
*
|
|
18
|
+
* Features:
|
|
19
|
+
* - Dual header syntax support (traditional and alternative)
|
|
20
|
+
* - Complex hierarchical numbering with automatic level management
|
|
21
|
+
* - Roman numeral and alphabetic label generation
|
|
22
|
+
* - Customizable header formatting templates
|
|
23
|
+
* - Academic and legal document formatting patterns
|
|
24
|
+
* - Automatic indentation and spacing control
|
|
25
|
+
* - Continuous numbering and reset control options
|
|
26
|
+
* - Level-specific formatting with placeholder substitution
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* import { processHeaders } from './header-processor';
|
|
31
|
+
*
|
|
32
|
+
* const content = `l. Introduction
|
|
33
|
+
* ll. Terms and Conditions
|
|
34
|
+
* lll. Payment Terms
|
|
35
|
+
* l2. Liability`;
|
|
36
|
+
*
|
|
37
|
+
* const metadata = {
|
|
38
|
+
* 'level-one': 'Article %n.',
|
|
39
|
+
* 'level-two': 'Section %n.',
|
|
40
|
+
* 'level-three': '(%n)'
|
|
41
|
+
* };
|
|
42
|
+
*
|
|
43
|
+
* const processed = processHeaders(content, metadata);
|
|
44
|
+
* console.log(processed);
|
|
45
|
+
* // Output:
|
|
46
|
+
* // Article 1. Introduction
|
|
47
|
+
* // Section 1. Terms and Conditions
|
|
48
|
+
* // (1) Payment Terms
|
|
49
|
+
* // Section 2. Liability
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.processHeaders = processHeaders;
|
|
54
|
+
/**
|
|
55
|
+
* Processes structured headers in a LegalMarkdown document
|
|
56
|
+
*
|
|
57
|
+
* This is the main function that processes both traditional (l., ll., lll.) and
|
|
58
|
+
* alternative (l1., l2., l3.) header syntax. It maintains proper hierarchical
|
|
59
|
+
* numbering, applies custom formatting templates, and handles complex academic
|
|
60
|
+
* and legal document structures.
|
|
61
|
+
*
|
|
62
|
+
* @param {string} content - The document content containing headers to process
|
|
63
|
+
* @param {Record<string, any>} metadata - Document metadata with potential header formatting options
|
|
64
|
+
* @param {Object} [processingOptions={}] - Additional processing options
|
|
65
|
+
* @param {boolean} [processingOptions.noReset] - Disable header numbering reset (continuous numbering)
|
|
66
|
+
* @param {boolean} [processingOptions.noIndent] - Disable header indentation (flat formatting)
|
|
67
|
+
* @returns {string} Processed content with formatted headers
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* // Basic header processing
|
|
71
|
+
* const content = `l. First Article
|
|
72
|
+
* ll. First Section
|
|
73
|
+
* lll. Subsection A
|
|
74
|
+
* ll. Second Section
|
|
75
|
+
* l. Second Article`;
|
|
76
|
+
*
|
|
77
|
+
* const metadata = {
|
|
78
|
+
* 'level-one': 'Article %n.',
|
|
79
|
+
* 'level-two': 'Section %n.',
|
|
80
|
+
* 'level-three': '(%c)'
|
|
81
|
+
* };
|
|
82
|
+
*
|
|
83
|
+
* const result = processHeaders(content, metadata);
|
|
84
|
+
* // Output:
|
|
85
|
+
* // Article 1. First Article
|
|
86
|
+
* // Section 1. First Section
|
|
87
|
+
* // (a) Subsection A
|
|
88
|
+
* // Section 2. Second Section
|
|
89
|
+
* // Article 2. Second Article
|
|
90
|
+
*
|
|
91
|
+
* // Alternative syntax
|
|
92
|
+
* const altContent = `l1. Introduction
|
|
93
|
+
* l2. Background
|
|
94
|
+
* l3. Technical Details
|
|
95
|
+
* l2. Implementation
|
|
96
|
+
* l1. Conclusion`;
|
|
97
|
+
*
|
|
98
|
+
* const altResult = processHeaders(altContent, metadata);
|
|
99
|
+
* // Produces similar hierarchical numbering
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
function processHeaders(content, metadata, processingOptions = {}) {
|
|
103
|
+
// Extract header options from metadata
|
|
104
|
+
const options = extractHeaderOptions(metadata, processingOptions);
|
|
105
|
+
// Define regex patterns for both header styles
|
|
106
|
+
const traditionalHeaderPattern = /^(l+)\.\s+(.*?)$/gm;
|
|
107
|
+
const alternativeHeaderPattern = /^l(\d+)\.\s+(.*?)$/gm;
|
|
108
|
+
// Track header numbering state
|
|
109
|
+
const headerNumbers = [0, 0, 0, 0, 0];
|
|
110
|
+
// Process all headers in a single pass to maintain correct numbering
|
|
111
|
+
const matches = [];
|
|
112
|
+
// Collect all traditional header matches
|
|
113
|
+
let match;
|
|
114
|
+
const contentCopy = content.slice();
|
|
115
|
+
traditionalHeaderPattern.lastIndex = 0;
|
|
116
|
+
while ((match = traditionalHeaderPattern.exec(contentCopy)) !== null) {
|
|
117
|
+
matches.push({
|
|
118
|
+
match: match[0],
|
|
119
|
+
level: match[1].length,
|
|
120
|
+
text: match[2],
|
|
121
|
+
index: match.index,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// Collect all alternative header matches
|
|
125
|
+
alternativeHeaderPattern.lastIndex = 0;
|
|
126
|
+
while ((match = alternativeHeaderPattern.exec(contentCopy)) !== null) {
|
|
127
|
+
matches.push({
|
|
128
|
+
match: match[0],
|
|
129
|
+
level: parseInt(match[1], 10),
|
|
130
|
+
text: match[2],
|
|
131
|
+
index: match.index,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// Sort matches by their position in the document
|
|
135
|
+
matches.sort((a, b) => a.index - b.index);
|
|
136
|
+
// Process headers in order (document order)
|
|
137
|
+
let result = content;
|
|
138
|
+
let offset = 0;
|
|
139
|
+
let previousLevel = 0;
|
|
140
|
+
for (const m of matches) {
|
|
141
|
+
// Update header numbers based on level
|
|
142
|
+
const level = m.level;
|
|
143
|
+
// Special logic for level 5
|
|
144
|
+
if (level === 5) {
|
|
145
|
+
if (previousLevel === 5) {
|
|
146
|
+
// Consecutive level 5s: just increment level 5
|
|
147
|
+
headerNumbers[4]++;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// Level 5 after something else: reset level 5 to 1
|
|
151
|
+
headerNumbers[4] = 1;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
// Standard logic for other levels
|
|
156
|
+
// If we're skipping levels, increment all intermediate levels to 1
|
|
157
|
+
for (let i = previousLevel; i < level - 1; i++) {
|
|
158
|
+
if (headerNumbers[i] === 0) {
|
|
159
|
+
headerNumbers[i] = 1;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
headerNumbers[level - 1]++;
|
|
163
|
+
// Reset all deeper level numbers (unless noReset is enabled)
|
|
164
|
+
if (!options.noReset) {
|
|
165
|
+
for (let i = level; i < headerNumbers.length; i++) {
|
|
166
|
+
headerNumbers[i] = 0;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Format the header
|
|
171
|
+
const formattedHeader = formatHeader(level, m.text, [...headerNumbers], options, previousLevel);
|
|
172
|
+
// Calculate adjusted position based on previous replacements
|
|
173
|
+
const startPos = m.index + offset;
|
|
174
|
+
const endPos = startPos + m.match.length;
|
|
175
|
+
// Replace the header in the result string
|
|
176
|
+
result = result.substring(0, startPos) + formattedHeader + result.substring(endPos);
|
|
177
|
+
// Update offset for subsequent replacements
|
|
178
|
+
offset += formattedHeader.length - m.match.length;
|
|
179
|
+
previousLevel = level;
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Extracts header formatting options from metadata
|
|
185
|
+
*
|
|
186
|
+
* Parses document metadata to extract header formatting configuration,
|
|
187
|
+
* including level-specific formatting templates, indentation settings,
|
|
188
|
+
* and numbering behavior options. Provides default values for all options.
|
|
189
|
+
*
|
|
190
|
+
* @private
|
|
191
|
+
* @param {Record<string, any>} metadata - Document metadata containing header configuration
|
|
192
|
+
* @param {Object} [processingOptions={}] - Additional processing options that override metadata
|
|
193
|
+
* @param {boolean} [processingOptions.noReset] - Disable header numbering reset
|
|
194
|
+
* @param {boolean} [processingOptions.noIndent] - Disable header indentation
|
|
195
|
+
* @returns {HeaderOptions} Complete header options object with defaults applied
|
|
196
|
+
* @example
|
|
197
|
+
* ```typescript
|
|
198
|
+
* const metadata = {
|
|
199
|
+
* 'level-one': 'Chapter %n.',
|
|
200
|
+
* 'level-two': 'Section %n.%s',
|
|
201
|
+
* 'level-indent': 2.0,
|
|
202
|
+
* 'no-reset': true
|
|
203
|
+
* };
|
|
204
|
+
*
|
|
205
|
+
* const options = extractHeaderOptions(metadata);
|
|
206
|
+
* console.log(options);
|
|
207
|
+
* // Output:
|
|
208
|
+
* // {
|
|
209
|
+
* // levelOne: 'Chapter %n.',
|
|
210
|
+
* // levelTwo: 'Section %n.%s',
|
|
211
|
+
* // levelThree: '(%n)',
|
|
212
|
+
* // levelFour: '(%n%c)',
|
|
213
|
+
* // levelFive: '(%n%c%r)',
|
|
214
|
+
* // levelIndent: 2.0,
|
|
215
|
+
* // noReset: true,
|
|
216
|
+
* // noIndent: false
|
|
217
|
+
* // }
|
|
218
|
+
* ```
|
|
219
|
+
*/
|
|
220
|
+
function extractHeaderOptions(metadata, processingOptions = {}) {
|
|
221
|
+
return {
|
|
222
|
+
levelOne: metadata['level-one'] || 'Article %n.',
|
|
223
|
+
levelTwo: metadata['level-two'] || 'Section %n.',
|
|
224
|
+
levelThree: metadata['level-three'] || '(%n)',
|
|
225
|
+
levelFour: metadata['level-four'] || '(%n%c)',
|
|
226
|
+
levelFive: metadata['level-five'] || '(%n%c%r)',
|
|
227
|
+
levelIndent: parseFloat(metadata['level-indent'] || '1.5'),
|
|
228
|
+
noReset: processingOptions.noReset || metadata['no-reset'] || false,
|
|
229
|
+
noIndent: processingOptions.noIndent || metadata['no-indent'] || false,
|
|
230
|
+
enableFieldTracking: processingOptions.enableFieldTracking || false,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Formats a header according to level and options
|
|
235
|
+
*
|
|
236
|
+
* Applies formatting templates and numbering schemes to create properly formatted
|
|
237
|
+
* headers. Handles placeholder substitution for various numbering systems including
|
|
238
|
+
* numeric, alphabetic, and Roman numeral formats. Supports both simple and complex
|
|
239
|
+
* hierarchical numbering patterns.
|
|
240
|
+
*
|
|
241
|
+
* @private
|
|
242
|
+
* @param {number} level - Header level (1-5)
|
|
243
|
+
* @param {string} text - Header text content
|
|
244
|
+
* @param {number[]} headerNumbers - Array tracking header numbering state for all levels
|
|
245
|
+
* @param {HeaderOptions} options - Header formatting options and templates
|
|
246
|
+
* @param {number} [previousLevel=0] - Previous header level for context-aware formatting
|
|
247
|
+
* @returns {string} Formatted header string with proper numbering and indentation
|
|
248
|
+
* @example
|
|
249
|
+
* ```typescript
|
|
250
|
+
* const headerNumbers = [1, 2, 3, 0, 0];
|
|
251
|
+
* const options = {
|
|
252
|
+
* levelOne: 'Article %n.',
|
|
253
|
+
* levelTwo: 'Section %n.',
|
|
254
|
+
* levelThree: '(%c)',
|
|
255
|
+
* levelIndent: 1.5,
|
|
256
|
+
* noIndent: false
|
|
257
|
+
* };
|
|
258
|
+
*
|
|
259
|
+
* const formatted = formatHeader(3, 'Payment Terms', headerNumbers, options);
|
|
260
|
+
* // Output: ' (c) Payment Terms'
|
|
261
|
+
* ```
|
|
262
|
+
*/
|
|
263
|
+
function formatHeader(level, text, headerNumbers, options, previousLevel = 0) {
|
|
264
|
+
// Validate level
|
|
265
|
+
if (level < 1 || level > 5) {
|
|
266
|
+
return `l${level}. ${text}`;
|
|
267
|
+
}
|
|
268
|
+
// Get format template for this level
|
|
269
|
+
const formatTemplate = getFormatTemplate(level, options);
|
|
270
|
+
// Ensure formatTemplate is a string
|
|
271
|
+
if (typeof formatTemplate !== 'string') {
|
|
272
|
+
return `l${level}. ${text}`;
|
|
273
|
+
}
|
|
274
|
+
// Create formatted header with the right value based on level
|
|
275
|
+
let formattedHeader = formatTemplate;
|
|
276
|
+
// Detect hierarchical patterns BEFORE any variable replacement
|
|
277
|
+
const isHierarchicalRoman = formatTemplate.includes('%r.%n');
|
|
278
|
+
const isHierarchicalAlpha = formatTemplate.includes('%c.%n');
|
|
279
|
+
// Detect broader hierarchical alphabetic context
|
|
280
|
+
// If level 1 uses %c and level 2 uses %c.%n, then level 3+ %c should also refer to level 1
|
|
281
|
+
const isAlphabeticHierarchicalContext = options.levelOne?.includes('%c') && options.levelTwo?.includes('%c.%n');
|
|
282
|
+
// Handle special %02n format (leading zero numbers)
|
|
283
|
+
const leadingZeroPattern = /%0(\d+)n/g;
|
|
284
|
+
formattedHeader = formattedHeader.replace(leadingZeroPattern, (match, digits) => {
|
|
285
|
+
const num = headerNumbers[level - 1];
|
|
286
|
+
return num.toString().padStart(parseInt(digits), '0');
|
|
287
|
+
});
|
|
288
|
+
// Handle special %02s format (leading zero section references)
|
|
289
|
+
const leadingZeroSectionPattern = /%0(\d+)s/g;
|
|
290
|
+
formattedHeader = formattedHeader.replace(leadingZeroSectionPattern, (match, digits) => {
|
|
291
|
+
const num = headerNumbers[0];
|
|
292
|
+
return num.toString().padStart(parseInt(digits), '0');
|
|
293
|
+
});
|
|
294
|
+
// Handle other leading zero patterns for reference variables
|
|
295
|
+
const leadingZeroTitlePattern = /%0(\d+)t/g;
|
|
296
|
+
formattedHeader = formattedHeader.replace(leadingZeroTitlePattern, (match, digits) => {
|
|
297
|
+
const num = headerNumbers[1];
|
|
298
|
+
return num.toString().padStart(parseInt(digits), '0');
|
|
299
|
+
});
|
|
300
|
+
const leadingZeroFourthPattern = /%0(\d+)f/g;
|
|
301
|
+
formattedHeader = formattedHeader.replace(leadingZeroFourthPattern, (match, digits) => {
|
|
302
|
+
const num = headerNumbers[2];
|
|
303
|
+
return num.toString().padStart(parseInt(digits), '0');
|
|
304
|
+
});
|
|
305
|
+
const leadingZeroFifthPattern = /%0(\d+)i/g;
|
|
306
|
+
formattedHeader = formattedHeader.replace(leadingZeroFifthPattern, (match, digits) => {
|
|
307
|
+
const num = headerNumbers[3];
|
|
308
|
+
return num.toString().padStart(parseInt(digits), '0');
|
|
309
|
+
});
|
|
310
|
+
// Replace placeholders based on level-specific logic
|
|
311
|
+
if (level === 4) {
|
|
312
|
+
// Level 4 format: (%n%c) where %n is level 3 number, %c is level 4 letter
|
|
313
|
+
// Only apply special level 4 logic for default hierarchical formats like (%n%c)
|
|
314
|
+
if (formattedHeader.includes('%n%c') &&
|
|
315
|
+
!formattedHeader.includes('.%s') &&
|
|
316
|
+
!formattedHeader.includes('.%t') &&
|
|
317
|
+
!formattedHeader.includes('.%f')) {
|
|
318
|
+
formattedHeader = formattedHeader.replace(/%n/g, headerNumbers[2].toString());
|
|
319
|
+
formattedHeader = formattedHeader.replace(/%c/g, getAlphaLabel(headerNumbers[3]));
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
else if (level === 5) {
|
|
323
|
+
// Level 5 format: (%n%c%r) where %n is level 3 number, %c is level 4 letter, %r is level 5 roman
|
|
324
|
+
// Only apply special level 5 logic for default hierarchical formats like (%n%c%r)
|
|
325
|
+
if (formattedHeader.includes('%c%r') || formattedHeader.includes('%n%c%r')) {
|
|
326
|
+
formattedHeader = formattedHeader.replace(/%n/g, headerNumbers[2].toString());
|
|
327
|
+
formattedHeader = formattedHeader.replace(/%c/g, getAlphaLabel(headerNumbers[3]));
|
|
328
|
+
// Always use lowercase roman numerals for level 5
|
|
329
|
+
const useLowercase = true;
|
|
330
|
+
formattedHeader = formattedHeader.replace(/%r/g, getRomanNumeral(headerNumbers[4], useLowercase));
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// Handle academic/hierarchical formats first (where %n might refer to level 1 instead of current level)
|
|
334
|
+
// Check if format uses academic hierarchical pattern like %n.%s, %n.%s.%t, etc.
|
|
335
|
+
// But NOT formats like %r.%n or %c.%n where %n should be current level
|
|
336
|
+
// Academic context: if any level uses deeper hierarchical patterns, then %n.%s is also academic
|
|
337
|
+
const hasAcademicContext = (typeof options.levelThree === 'string' && options.levelThree.includes('%n.%s.%t')) ||
|
|
338
|
+
(typeof options.levelFour === 'string' && options.levelFour.includes('%n.%s.%t.%f')) ||
|
|
339
|
+
(typeof options.levelFive === 'string' && options.levelFive.includes('%n.%s.%t.%f.%i'));
|
|
340
|
+
const isAcademicHierarchical = (formattedHeader.includes('.%s.%t') ||
|
|
341
|
+
formattedHeader.includes('.%t.%f') ||
|
|
342
|
+
formattedHeader.includes('.%f.%i') ||
|
|
343
|
+
(formattedHeader.includes('.%s') && hasAcademicContext)) &&
|
|
344
|
+
!formattedHeader.includes('%r.') &&
|
|
345
|
+
!formattedHeader.includes('%c.');
|
|
346
|
+
if (isAcademicHierarchical) {
|
|
347
|
+
// In academic hierarchical formats, %n typically refers to level 1 number
|
|
348
|
+
formattedHeader = formattedHeader.replace(/%n/g, headerNumbers[0].toString());
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
// In standard formats, %n refers to current level number
|
|
352
|
+
formattedHeader = formattedHeader.replace(/%n/g, headerNumbers[level - 1].toString());
|
|
353
|
+
}
|
|
354
|
+
// Replace reference variables for all levels
|
|
355
|
+
// Reference variables represent hierarchical level numbers for academic/structured numbering
|
|
356
|
+
// For academic formats: %s = level 2 current number (for formats like %n.%s.%t where %n=level1, %s=level2)
|
|
357
|
+
// For simple formats: %s = level 1 reference (for formats like %n.%s where %n=level2, %s=level1)
|
|
358
|
+
if (isAcademicHierarchical) {
|
|
359
|
+
// In academic hierarchical formats, %s refers to level 2
|
|
360
|
+
formattedHeader = formattedHeader.replace(/%s/g, headerNumbers[1].toString());
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
// In simple formats like %n.%s, %s refers to level 1
|
|
364
|
+
formattedHeader = formattedHeader.replace(/%s/g, headerNumbers[0].toString());
|
|
365
|
+
}
|
|
366
|
+
// %t = level 3 current number (for formats like %n.%s.%t)
|
|
367
|
+
formattedHeader = formattedHeader.replace(/%t/g, headerNumbers[2].toString());
|
|
368
|
+
// %f = level 4 current number (for formats like %n.%s.%t.%f)
|
|
369
|
+
formattedHeader = formattedHeader.replace(/%f/g, headerNumbers[3].toString());
|
|
370
|
+
// %i = level 5 current number (for formats like %n.%s.%t.%f.%i)
|
|
371
|
+
formattedHeader = formattedHeader.replace(/%i/g, headerNumbers[4].toString());
|
|
372
|
+
// Replace %c (alphabetic) for levels 1-5 (when not handled by special logic above)
|
|
373
|
+
// Special handling for hierarchical formats like %c.%n where %c refers to level 1
|
|
374
|
+
if (isHierarchicalAlpha && level > 1) {
|
|
375
|
+
// In hierarchical formats with %c.%n pattern, %c before dot refers to level 1
|
|
376
|
+
formattedHeader = formattedHeader.replace(/%c/g, getAlphaLabel(headerNumbers[0]));
|
|
377
|
+
}
|
|
378
|
+
else if (isAlphabeticHierarchicalContext && level > 1) {
|
|
379
|
+
// In broader alphabetic hierarchical context, %c in levels 3+ refers to level 1
|
|
380
|
+
formattedHeader = formattedHeader.replace(/%c/g, getAlphaLabel(headerNumbers[0]));
|
|
381
|
+
}
|
|
382
|
+
else if (level <= 3 || (level >= 4 && formattedHeader.includes('%c'))) {
|
|
383
|
+
formattedHeader = formattedHeader.replace(/%c/g, getAlphaLabel(headerNumbers[level - 1]));
|
|
384
|
+
}
|
|
385
|
+
// Replace %r (roman) for levels 1-5 (when not handled by special logic above)
|
|
386
|
+
// Special handling for hierarchical formats like %r.%n where %r refers to level 1
|
|
387
|
+
if (isHierarchicalRoman && level > 1) {
|
|
388
|
+
// In hierarchical formats with %r.%n pattern, %r before dot refers to level 1
|
|
389
|
+
formattedHeader = formattedHeader.replace(/%r/g, getRomanNumeral(headerNumbers[0], true));
|
|
390
|
+
}
|
|
391
|
+
else if (level <= 3 || (level >= 4 && formattedHeader.includes('%r'))) {
|
|
392
|
+
formattedHeader = formattedHeader.replace(/%r/g, getRomanNumeral(headerNumbers[level - 1], true));
|
|
393
|
+
}
|
|
394
|
+
// Apply indentation (unless noIndent is enabled)
|
|
395
|
+
const indentation = options.noIndent
|
|
396
|
+
? ''
|
|
397
|
+
: ' '.repeat(Math.floor((level - 1) * (options.levelIndent || 1.5) * 2));
|
|
398
|
+
// Check if field tracking is enabled for header styling
|
|
399
|
+
if (options.enableFieldTracking) {
|
|
400
|
+
// Wrap header in span with CSS classes and data attributes for styling
|
|
401
|
+
const headerClasses = [
|
|
402
|
+
'legal-header',
|
|
403
|
+
`legal-header-level-${level}`,
|
|
404
|
+
getLevelCssClass(level),
|
|
405
|
+
].join(' ');
|
|
406
|
+
const spanElement = `<span class="${headerClasses}" ` +
|
|
407
|
+
`data-level="${level}" data-number="${headerNumbers[level - 1]}">` +
|
|
408
|
+
`${formattedHeader} ${text}</span>`;
|
|
409
|
+
return `${indentation}${spanElement}`;
|
|
410
|
+
}
|
|
411
|
+
return `${indentation}${formattedHeader} ${text}`;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Gets the format template for a specific header level
|
|
415
|
+
*
|
|
416
|
+
* Retrieves the appropriate formatting template for a given header level,
|
|
417
|
+
* with fallback to default templates if custom options are not provided
|
|
418
|
+
* or are invalid.
|
|
419
|
+
*
|
|
420
|
+
* @private
|
|
421
|
+
* @param {number} level - Header level (1-5)
|
|
422
|
+
* @param {HeaderOptions} options - Header formatting options containing level templates
|
|
423
|
+
* @returns {string} Format template string with placeholders
|
|
424
|
+
* @example
|
|
425
|
+
* ```typescript
|
|
426
|
+
* const options = {
|
|
427
|
+
* levelOne: 'Chapter %n.',
|
|
428
|
+
* levelTwo: 'Section %n.%s',
|
|
429
|
+
* levelThree: '(%n)'
|
|
430
|
+
* };
|
|
431
|
+
*
|
|
432
|
+
* const template = getFormatTemplate(2, options);
|
|
433
|
+
* // Output: 'Section %n.%s'
|
|
434
|
+
*
|
|
435
|
+
* const fallbackTemplate = getFormatTemplate(4, {});
|
|
436
|
+
* // Output: '(%n%c)' (default for level 4)
|
|
437
|
+
* ```
|
|
438
|
+
*/
|
|
439
|
+
function getFormatTemplate(level, options) {
|
|
440
|
+
let template;
|
|
441
|
+
switch (level) {
|
|
442
|
+
case 1:
|
|
443
|
+
template = options.levelOne;
|
|
444
|
+
break;
|
|
445
|
+
case 2:
|
|
446
|
+
template = options.levelTwo;
|
|
447
|
+
break;
|
|
448
|
+
case 3:
|
|
449
|
+
template = options.levelThree;
|
|
450
|
+
break;
|
|
451
|
+
case 4:
|
|
452
|
+
template = options.levelFour;
|
|
453
|
+
break;
|
|
454
|
+
case 5:
|
|
455
|
+
template = options.levelFive;
|
|
456
|
+
break;
|
|
457
|
+
default:
|
|
458
|
+
template = '%n.';
|
|
459
|
+
}
|
|
460
|
+
// Ensure we always return a string, even if template is null/undefined
|
|
461
|
+
if (typeof template !== 'string') {
|
|
462
|
+
switch (level) {
|
|
463
|
+
case 1:
|
|
464
|
+
return 'Article %n.';
|
|
465
|
+
case 2:
|
|
466
|
+
return 'Section %n.';
|
|
467
|
+
case 3:
|
|
468
|
+
return '(%n)';
|
|
469
|
+
case 4:
|
|
470
|
+
return '(%n%c)';
|
|
471
|
+
case 5:
|
|
472
|
+
return '(%n%c%r)';
|
|
473
|
+
default:
|
|
474
|
+
return '%n.';
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
return template;
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Converts a number to alphabetic label (a, b, c, ... z, aa, ab, ...)
|
|
481
|
+
*
|
|
482
|
+
* Generates alphabetic labels for header numbering using a base-26 system.
|
|
483
|
+
* Supports extended sequences beyond 'z' using double letters (aa, ab, etc.).
|
|
484
|
+
*
|
|
485
|
+
* @private
|
|
486
|
+
* @param {number} num - Number to convert (1-based)
|
|
487
|
+
* @returns {string} Alphabetic label in lowercase
|
|
488
|
+
* @example
|
|
489
|
+
* ```typescript
|
|
490
|
+
* console.log(getAlphaLabel(1)); // 'a'
|
|
491
|
+
* console.log(getAlphaLabel(26)); // 'z'
|
|
492
|
+
* console.log(getAlphaLabel(27)); // 'aa'
|
|
493
|
+
* console.log(getAlphaLabel(28)); // 'ab'
|
|
494
|
+
* console.log(getAlphaLabel(52)); // 'az'
|
|
495
|
+
* console.log(getAlphaLabel(53)); // 'ba'
|
|
496
|
+
* ```
|
|
497
|
+
*/
|
|
498
|
+
function getAlphaLabel(num) {
|
|
499
|
+
if (num <= 0)
|
|
500
|
+
return '';
|
|
501
|
+
let label = '';
|
|
502
|
+
let n = num;
|
|
503
|
+
while (n > 0) {
|
|
504
|
+
const remainder = (n - 1) % 26;
|
|
505
|
+
label = String.fromCharCode(97 + remainder) + label;
|
|
506
|
+
n = Math.floor((n - 1) / 26);
|
|
507
|
+
}
|
|
508
|
+
return label;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Converts a number to Roman numeral
|
|
512
|
+
*
|
|
513
|
+
* Generates Roman numerals for header numbering using standard Roman numeral
|
|
514
|
+
* conversion rules. Supports both uppercase and lowercase output formats.
|
|
515
|
+
*
|
|
516
|
+
* @private
|
|
517
|
+
* @param {number} num - Number to convert (positive integer)
|
|
518
|
+
* @param {boolean} [lowercase=false] - Whether to return lowercase roman numerals
|
|
519
|
+
* @returns {string} Roman numeral string
|
|
520
|
+
* @example
|
|
521
|
+
* ```typescript
|
|
522
|
+
* console.log(getRomanNumeral(1)); // 'I'
|
|
523
|
+
* console.log(getRomanNumeral(4)); // 'IV'
|
|
524
|
+
* console.log(getRomanNumeral(9)); // 'IX'
|
|
525
|
+
* console.log(getRomanNumeral(10)); // 'X'
|
|
526
|
+
* console.log(getRomanNumeral(49)); // 'XLIX'
|
|
527
|
+
* console.log(getRomanNumeral(1994)); // 'MCMXCIV'
|
|
528
|
+
* console.log(getRomanNumeral(5, true)); // 'v'
|
|
529
|
+
* ```
|
|
530
|
+
*/
|
|
531
|
+
function getRomanNumeral(num, lowercase = false) {
|
|
532
|
+
if (num <= 0)
|
|
533
|
+
return '';
|
|
534
|
+
const romanNumerals = [
|
|
535
|
+
{ value: 1000, numeral: 'M' },
|
|
536
|
+
{ value: 900, numeral: 'CM' },
|
|
537
|
+
{ value: 500, numeral: 'D' },
|
|
538
|
+
{ value: 400, numeral: 'CD' },
|
|
539
|
+
{ value: 100, numeral: 'C' },
|
|
540
|
+
{ value: 90, numeral: 'XC' },
|
|
541
|
+
{ value: 50, numeral: 'L' },
|
|
542
|
+
{ value: 40, numeral: 'XL' },
|
|
543
|
+
{ value: 10, numeral: 'X' },
|
|
544
|
+
{ value: 9, numeral: 'IX' },
|
|
545
|
+
{ value: 5, numeral: 'V' },
|
|
546
|
+
{ value: 4, numeral: 'IV' },
|
|
547
|
+
{ value: 1, numeral: 'I' },
|
|
548
|
+
];
|
|
549
|
+
let roman = '';
|
|
550
|
+
let n = num;
|
|
551
|
+
for (const { value, numeral } of romanNumerals) {
|
|
552
|
+
while (n >= value) {
|
|
553
|
+
roman += numeral;
|
|
554
|
+
n -= value;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
return lowercase ? roman.toLowerCase() : roman;
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Gets CSS class name for a specific header level
|
|
561
|
+
*
|
|
562
|
+
* Maps header levels to semantic CSS class names for styling purposes.
|
|
563
|
+
* Used when field tracking is enabled to provide consistent styling hooks.
|
|
564
|
+
*
|
|
565
|
+
* @private
|
|
566
|
+
* @param {number} level - Header level (1-5)
|
|
567
|
+
* @returns {string} CSS class name for the level
|
|
568
|
+
*/
|
|
569
|
+
function getLevelCssClass(level) {
|
|
570
|
+
switch (level) {
|
|
571
|
+
case 1:
|
|
572
|
+
return 'legal-article';
|
|
573
|
+
case 2:
|
|
574
|
+
return 'legal-section';
|
|
575
|
+
case 3:
|
|
576
|
+
return 'legal-subsection';
|
|
577
|
+
case 4:
|
|
578
|
+
return 'legal-sub-subsection';
|
|
579
|
+
case 5:
|
|
580
|
+
return 'legal-paragraph';
|
|
581
|
+
default:
|
|
582
|
+
return 'legal-header-unknown';
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
//# sourceMappingURL=header-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-processor.js","sourceRoot":"","sources":["../../../src/core/processors/header-processor.ts"],"names":[],"mappings":"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"}
|