版博士V2.0程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

1 год назад
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. const tag = require('./tree-constructor-context-handlers/tag')
  2. const tagContent = require('./tree-constructor-context-handlers/tag-content')
  3. const tagName = require('./tree-constructor-context-handlers/tag-name')
  4. const attributes = require('./tree-constructor-context-handlers/attributes')
  5. const attribute = require('./tree-constructor-context-handlers/attribute')
  6. const attributeValue = require('./tree-constructor-context-handlers/attribute-value')
  7. const comment = require('./tree-constructor-context-handlers/comment')
  8. const doctype = require('./tree-constructor-context-handlers/doctype')
  9. const doctypeAttributes = require('./tree-constructor-context-handlers/doctype-attributes')
  10. const doctypeAttribute = require('./tree-constructor-context-handlers/doctype-attribute')
  11. const scriptTag = require('./tree-constructor-context-handlers/script-tag')
  12. const styleTag = require('./tree-constructor-context-handlers/style-tag')
  13. const {
  14. TAG_CONTENT_CONTEXT,
  15. TAG_CONTEXT,
  16. TAG_NAME_CONTEXT,
  17. ATTRIBUTES_CONTEXT,
  18. ATTRIBUTE_CONTEXT,
  19. ATTRIBUTE_VALUE_CONTEXT,
  20. COMMENT_CONTEXT,
  21. DOCTYPE_CONTEXT,
  22. DOCTYPE_ATTRIBUTES_CONTEXT,
  23. DOCTYPE_ATTRIBUTE_CONTEXT,
  24. SCRIPT_TAG_CONTEXT,
  25. STYLE_TAG_CONTEXT
  26. } = require('./constants/tree-constructor-contexts')
  27. const { NODE_DOCUMENT } = require('./constants/ast-nodes')
  28. const contextsMap = {
  29. [TAG_CONTENT_CONTEXT]: tagContent,
  30. [TAG_CONTEXT]: tag,
  31. [TAG_NAME_CONTEXT]: tagName,
  32. [ATTRIBUTES_CONTEXT]: attributes,
  33. [ATTRIBUTE_CONTEXT]: attribute,
  34. [ATTRIBUTE_VALUE_CONTEXT]: attributeValue,
  35. [COMMENT_CONTEXT]: comment,
  36. [DOCTYPE_CONTEXT]: doctype,
  37. [DOCTYPE_ATTRIBUTES_CONTEXT]: doctypeAttributes,
  38. [DOCTYPE_ATTRIBUTE_CONTEXT]: doctypeAttribute,
  39. [SCRIPT_TAG_CONTEXT]: scriptTag,
  40. [STYLE_TAG_CONTEXT]: styleTag
  41. }
  42. function processTokens (tokens, state, positionOffset) {
  43. let tokenIndex = state.caretPosition - positionOffset
  44. while (tokenIndex < tokens.length) {
  45. const token = tokens[tokenIndex]
  46. const contextHandler = contextsMap[state.currentContext.type]
  47. state = contextHandler(token, state)
  48. tokenIndex = state.caretPosition - positionOffset
  49. }
  50. return state
  51. }
  52. module.exports = function constructTree (
  53. tokens = [],
  54. existingState,
  55. parseOptions = {}
  56. ) {
  57. let state = existingState
  58. if (existingState === undefined) {
  59. const rootContext = {
  60. type: TAG_CONTENT_CONTEXT,
  61. parentRef: undefined,
  62. content: []
  63. }
  64. const rootNode = {
  65. nodeType: NODE_DOCUMENT,
  66. parentRef: undefined,
  67. content: {}
  68. }
  69. state = {
  70. caretPosition: 0,
  71. currentContext: rootContext,
  72. currentNode: rootNode,
  73. rootNode,
  74. parseOptions
  75. }
  76. }
  77. const positionOffset = state.caretPosition
  78. processTokens(tokens, state, positionOffset)
  79. return { state, ast: state.rootNode }
  80. }