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

54 строки
1.3 KiB

  1. const { calculateTokenCharactersRange } = require('../helpers')
  2. const {
  3. TOKEN_ATTRIBUTE_VALUE,
  4. TOKEN_ATTRIBUTE_VALUE_WRAPPER_END
  5. } = require('../constants/token-types')
  6. const {
  7. ATTRIBUTES_CONTEXT,
  8. ATTRIBUTE_VALUE_WRAPPED_CONTEXT
  9. } = require('../constants/tokenizer-contexts')
  10. function wrapper (state, tokens) {
  11. const range = calculateTokenCharactersRange(state, { keepBuffer: false })
  12. const endWrapperPosition = range.endPosition + 1
  13. tokens.push(
  14. {
  15. type: TOKEN_ATTRIBUTE_VALUE,
  16. content: state.accumulatedContent,
  17. startPosition: range.startPosition,
  18. endPosition: range.endPosition
  19. },
  20. {
  21. type: TOKEN_ATTRIBUTE_VALUE_WRAPPER_END,
  22. content: state.decisionBuffer,
  23. startPosition: endWrapperPosition,
  24. endPosition: endWrapperPosition
  25. }
  26. )
  27. state.accumulatedContent = ''
  28. state.decisionBuffer = ''
  29. state.currentContext = ATTRIBUTES_CONTEXT
  30. state.caretPosition++
  31. state.contextParams[ATTRIBUTE_VALUE_WRAPPED_CONTEXT] = undefined
  32. }
  33. function parseSyntax (chars, state, tokens) {
  34. const wrapperChar = state.contextParams[ATTRIBUTE_VALUE_WRAPPED_CONTEXT].wrapper
  35. if (chars === wrapperChar) {
  36. return wrapper(state, tokens)
  37. }
  38. state.accumulatedContent += state.decisionBuffer
  39. state.decisionBuffer = ''
  40. state.caretPosition++
  41. }
  42. module.exports = {
  43. parseSyntax
  44. }