版博士V2.0程序
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

attributes.js 1.9 KiB

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