parse.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /**
  2. * @import {
  3. * Create,
  4. * FullNormalizedExtension,
  5. * InitialConstruct,
  6. * ParseContext,
  7. * ParseOptions
  8. * } from 'micromark-util-types'
  9. */
  10. import { combineExtensions } from 'micromark-util-combine-extensions';
  11. import { content } from './initialize/content.js';
  12. import { document } from './initialize/document.js';
  13. import { flow } from './initialize/flow.js';
  14. import { string, text } from './initialize/text.js';
  15. import * as defaultConstructs from './constructs.js';
  16. import { createTokenizer } from './create-tokenizer.js';
  17. /**
  18. * @param {ParseOptions | null | undefined} [options]
  19. * Configuration (optional).
  20. * @returns {ParseContext}
  21. * Parser.
  22. */
  23. export function parse(options) {
  24. const settings = options || {};
  25. const constructs = /** @type {FullNormalizedExtension} */
  26. combineExtensions([defaultConstructs, ...(settings.extensions || [])]);
  27. /** @type {ParseContext} */
  28. const parser = {
  29. constructs,
  30. content: create(content),
  31. defined: [],
  32. document: create(document),
  33. flow: create(flow),
  34. lazy: {},
  35. string: create(string),
  36. text: create(text)
  37. };
  38. return parser;
  39. /**
  40. * @param {InitialConstruct} initial
  41. * Construct to start with.
  42. * @returns {Create}
  43. * Create a tokenizer.
  44. */
  45. function create(initial) {
  46. return creator;
  47. /** @type {Create} */
  48. function creator(from) {
  49. return createTokenizer(parser, initial, from);
  50. }
  51. }
  52. }