11// @ts -check
22import { createLogger } from './logger/logger.js' ;
33import { StateValidators } from './validators/state/index.js' ;
4+ import { XmlValidators } from './validators/xml/index.js' ;
45
56/**
67 * @typedef {import('./types.js').ElementInfo } ElementInfo
@@ -25,6 +26,9 @@ export class SuperValidator {
2526 /** @type {any } */
2627 #stateValidators;
2728
29+ /** @type {any } */
30+ #xmlValidators;
31+
2832 /** @type {Set<string> } */
2933 #requiredNodeTypes;
3034
@@ -42,35 +46,42 @@ export class SuperValidator {
4246 this . logger = createLogger ( this . debug ) ;
4347
4448 // Initialize validators and collect their requirements
45- const { validators, nodeTypes, markTypes } = this . #initializeValidators( ) ;
46- this . #stateValidators = validators ;
49+ const { stateValidators, xmlValidators, nodeTypes, markTypes } = this . #initializeValidators( ) ;
50+ this . #stateValidators = stateValidators ;
51+ this . #xmlValidators = xmlValidators ;
4752 this . #requiredNodeTypes = nodeTypes ;
4853 this . #requiredMarkTypes = markTypes ;
4954 }
5055
5156 /**
5257 * Initialize all validators and collect their element requirements
53- * @returns {{ validators : Record<string, ValidatorFunction>, nodeTypes: Set<string>, markTypes: Set<string> } }
58+ * @returns {{ stateValidators: Record<string, ValidatorFunction>, xmlValidators : Record<string, ValidatorFunction>, nodeTypes: Set<string>, markTypes: Set<string> } }
5459 */
5560 #initializeValidators( ) {
5661 const requiredNodes = new Set ( ) ;
5762 const requiredMarks = new Set ( ) ;
5863
59- const validators = Object . fromEntries (
60- Object . entries ( StateValidators ) . map ( ( [ key , factory ] ) => {
61- const validatorLogger = this . logger . withPrefix ( key ) ;
62- /** @type {ValidatorFunction } */
63- const validator = factory ( { editor : this . #editor, logger : validatorLogger } ) ;
64+ const initializeValidatorSet = ( validatorFactories ) => {
65+ return Object . fromEntries (
66+ Object . entries ( validatorFactories ) . map ( ( [ key , factory ] ) => {
67+ const validatorLogger = this . logger . withPrefix ( key ) ;
68+ /** @type {ValidatorFunction } */
69+ const validator = factory ( { editor : this . #editor, logger : validatorLogger } ) ;
70+
71+ // Collect requirements from this validator
72+ this . #collectValidatorRequirements( validator , requiredNodes , requiredMarks ) ;
6473
65- // Collect requirements from this validator
66- this . #collectValidatorRequirements( validator , requiredNodes , requiredMarks ) ;
74+ return [ key , validator ] ;
75+ } ) ,
76+ ) ;
77+ } ;
6778
68- return [ key , validator ] ;
69- } ) ,
70- ) ;
79+ const stateValidators = initializeValidatorSet ( StateValidators ) ;
80+ const xmlValidators = initializeValidatorSet ( XmlValidators ) ;
7181
7282 return {
73- validators,
83+ stateValidators : stateValidators ,
84+ xmlValidators : xmlValidators ,
7485 nodeTypes : requiredNodes ,
7586 markTypes : requiredMarks ,
7687 } ;
@@ -174,4 +185,32 @@ export class SuperValidator {
174185 this . logger . debug ( 'Results:' , validationResults ) ;
175186 return { modified : hasModifiedDocument , results : validationResults } ;
176187 }
188+
189+ /**
190+ * Validate the exported document in the editor. Triggered automatically on editor export.
191+ * @returns {{ modified: boolean, results: Array<{ key: string, results: string[] }> } }
192+ */
193+ validateDocumentExport ( ) {
194+ const { tr } = this . #editor. state ;
195+ const { dispatch } = this . #editor. view ;
196+
197+ let hasModifiedDocument = false ;
198+ const validationResults = [ ] ;
199+
200+ // Run XML validators
201+ Object . entries ( this . #xmlValidators) . forEach ( ( [ key , validator ] ) => {
202+ this . logger . debug ( `🕵 Validating export with ${ key } ...` ) ;
203+
204+ const { results, modified } = validator ( ) ;
205+ validationResults . push ( { key, results } ) ;
206+
207+ hasModifiedDocument = hasModifiedDocument || modified ;
208+ } ) ;
209+
210+ if ( ! this . dryRun && hasModifiedDocument ) dispatch ( tr ) ;
211+ else this . logger . debug ( 'DRY RUN: No export changes applied to the document.' ) ;
212+
213+ this . logger . debug ( 'Export validation results:' , validationResults ) ;
214+ return { modified : hasModifiedDocument , results : validationResults } ;
215+ }
177216}
0 commit comments