UNPKG

docutils-ts

Version:

Port of the Python Docutils library to TypeScript

101 lines (100 loc) 3.18 kB
import * as RSTStates from './rstStates.js'; class StateFactory { constructor(args) { this.stateClasses = []; this.logger = args.logger; this.logger.silly('constructor'); this.args = args; if (args && args.stateClasses && args.stateClasses.length) { this.stateClasses = args.stateClasses; } else { this.stateClasses = [ RSTStates.Body, RSTStates.BulletList, RSTStates.DefinitionList, RSTStates.EnumeratedList, RSTStates.FieldList, RSTStates.OptionList, RSTStates.LineBlock, RSTStates.ExtensionOptions, RSTStates.Explicit, RSTStates.Text, RSTStates.Definition, RSTStates.Line, RSTStates.SubstitutionDef ]; } } createBody() { return this.createState('Body'); } createBulletList() { return this.createState('BulletList'); } createDefinition() { return this.createState('Definition'); } createDefinitionList() { return this.createState('DefinitionList'); } createEnumeratedList() { return this.createState('EnumeratedList'); } createExplicit() { return this.createState('Explicit'); } createExtensionOptions() { return this.createState('ExtensionOptions'); } createFieldList() { return this.createState('FieldList'); } createLineBlock() { return this.createState('LineBlock'); } createLine() { return this.createState('Line'); } createOptionList() { return this.createState('OptionList'); } createQuotedLiteralBlock() { return this.createState('QuotedLiteralBlock'); } createSpecializedBody() { return this.createState('SpecializedBody'); } createSpecializedText() { return this.createState('SpecializedText'); } createText() { return this.createState('Text'); } createState(stateName, stateMachine) { //this.logger.silly('createState', { value:stateName}); if (typeof stateName === 'undefined') { throw new Error('Need argument stateName'); } if (typeof stateMachine === 'undefined') { throw new Error('Need argument stateMAchine'); } if (!Object.prototype.hasOwnProperty.call(RSTStates, stateName)) { throw new Error(`Unknown state ${stateName}`); } const StateClass = RSTStates[stateName]; let state = new StateClass(stateMachine, false); // This has to be done post-construction due to how instance property initiailization order state.addInitialTransitions(); // state is StateInterface // this.logger.silly('createState finish', { value:stateName}); return state; } getStateClasses() { return this.stateClasses; } withStateClasses(stateClasses) { // @ts-ignore return new StateFactory({ stateClasses }); } } export default StateFactory;