docutils-ts
Version:
Port of the Python Docutils library to TypeScript
101 lines (100 loc) • 3.18 kB
JavaScript
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;