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

67 строки
1.6 KiB

  1. const {
  2. isWhitespace,
  3. calculateTokenCharactersRange
  4. } = require('../helpers')
  5. const {
  6. ATTRIBUTES_CONTEXT,
  7. OPEN_TAG_END_CONTEXT,
  8. ATTRIBUTE_VALUE_CONTEXT,
  9. ATTRIBUTE_KEY_CONTEXT
  10. } = require('../constants/tokenizer-contexts')
  11. const { TOKEN_ATTRIBUTE_ASSIGNMENT } = require('../constants/token-types')
  12. function tagEnd (state) {
  13. const tagName = state.contextParams[ATTRIBUTES_CONTEXT].tagName
  14. state.accumulatedContent = ''
  15. state.decisionBuffer = ''
  16. state.currentContext = OPEN_TAG_END_CONTEXT
  17. state.contextParams[OPEN_TAG_END_CONTEXT] = { tagName }
  18. state.contextParams[ATTRIBUTES_CONTEXT] = undefined
  19. }
  20. function noneWhitespace (state) {
  21. state.accumulatedContent = state.decisionBuffer
  22. state.decisionBuffer = ''
  23. state.currentContext = ATTRIBUTE_KEY_CONTEXT
  24. state.caretPosition++
  25. }
  26. function equal (state, tokens) {
  27. const range = calculateTokenCharactersRange(state, { keepBuffer: true })
  28. tokens.push({
  29. type: TOKEN_ATTRIBUTE_ASSIGNMENT,
  30. content: state.decisionBuffer,
  31. startPosition: range.startPosition,
  32. endPosition: range.endPosition
  33. })
  34. state.accumulatedContent = ''
  35. state.decisionBuffer = ''
  36. state.currentContext = ATTRIBUTE_VALUE_CONTEXT
  37. state.caretPosition++
  38. }
  39. function parseSyntax (chars, state, tokens, next, nextNoWhiteChar) {
  40. if (chars === '>' || (chars === '/' && nextNoWhiteChar === '>')) {
  41. return tagEnd(state, tokens)
  42. }
  43. if (chars === '=') {
  44. return equal(state, tokens)
  45. }
  46. if (!isWhitespace(chars)) {
  47. return noneWhitespace(state, tokens)
  48. }
  49. state.decisionBuffer = ''
  50. state.caretPosition++
  51. }
  52. module.exports = {
  53. parseSyntax
  54. }