parse.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. )
  28. /** @type {ParseContext} */
  29. const parser = {
  30. constructs,
  31. content: create(content),
  32. defined: [],
  33. document: create(document),
  34. flow: create(flow),
  35. lazy: {},
  36. string: create(string),
  37. text: create(text)
  38. }
  39. return parser
  40. /**
  41. * @param {InitialConstruct} initial
  42. * Construct to start with.
  43. * @returns {Create}
  44. * Create a tokenizer.
  45. */
  46. function create(initial) {
  47. return creator
  48. /** @type {Create} */
  49. function creator(from) {
  50. return createTokenizer(parser, initial, from)
  51. }
  52. }
  53. }