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

135 строки
6.5 KiB

  1. "use strict";
  2. var _contextHandlersMap;
  3. function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
  4. var dataContext = require('./tokenizer-context-handlers/data');
  5. var openTagStartContext = require('./tokenizer-context-handlers/open-tag-start');
  6. var closeTagContext = require('./tokenizer-context-handlers/close-tag');
  7. var openTagEndContext = require('./tokenizer-context-handlers/open-tag-end');
  8. var attributesContext = require('./tokenizer-context-handlers/attributes');
  9. var attributeKeyContext = require('./tokenizer-context-handlers/attribute-key');
  10. var attributeValueContext = require('./tokenizer-context-handlers/attribute-value');
  11. var attributeValueBareContext = require('./tokenizer-context-handlers/attribute-value-bare');
  12. var attributeValueWrappedContext = require('./tokenizer-context-handlers/attribute-value-wrapped');
  13. var scriptContentContext = require('./tokenizer-context-handlers/script-tag-content');
  14. var styleContentContext = require('./tokenizer-context-handlers/style-tag-content');
  15. var doctypeStartContext = require('./tokenizer-context-handlers/doctype-start');
  16. var doctypeEndContextFactory = require('./tokenizer-context-handlers/doctype-end');
  17. var doctypeAttributesContext = require('./tokenizer-context-handlers/doctype-attributes');
  18. var doctypeAttributeWrappedContext = require('./tokenizer-context-handlers/doctype-attribute-wrapped');
  19. var doctypeAttributeBareEndContext = require('./tokenizer-context-handlers/doctype-attribute-bare');
  20. var commentContentContext = require('./tokenizer-context-handlers/comment-content');
  21. var _require = require('./helpers'),
  22. isWhitespace = _require.isWhitespace;
  23. var _require2 = require('./constants/tokenizer-contexts'),
  24. DATA_CONTEXT = _require2.DATA_CONTEXT,
  25. OPEN_TAG_START_CONTEXT = _require2.OPEN_TAG_START_CONTEXT,
  26. CLOSE_TAG_CONTEXT = _require2.CLOSE_TAG_CONTEXT,
  27. ATTRIBUTES_CONTEXT = _require2.ATTRIBUTES_CONTEXT,
  28. OPEN_TAG_END_CONTEXT = _require2.OPEN_TAG_END_CONTEXT,
  29. ATTRIBUTE_KEY_CONTEXT = _require2.ATTRIBUTE_KEY_CONTEXT,
  30. ATTRIBUTE_VALUE_CONTEXT = _require2.ATTRIBUTE_VALUE_CONTEXT,
  31. ATTRIBUTE_VALUE_BARE_CONTEXT = _require2.ATTRIBUTE_VALUE_BARE_CONTEXT,
  32. ATTRIBUTE_VALUE_WRAPPED_CONTEXT = _require2.ATTRIBUTE_VALUE_WRAPPED_CONTEXT,
  33. SCRIPT_CONTENT_CONTEXT = _require2.SCRIPT_CONTENT_CONTEXT,
  34. STYLE_CONTENT_CONTEXT = _require2.STYLE_CONTENT_CONTEXT,
  35. DOCTYPE_START_CONTEXT = _require2.DOCTYPE_START_CONTEXT,
  36. DOCTYPE_END_CONTEXT = _require2.DOCTYPE_END_CONTEXT,
  37. DOCTYPE_ATTRIBUTES_CONTEXT = _require2.DOCTYPE_ATTRIBUTES_CONTEXT,
  38. DOCTYPE_ATTRIBUTE_WRAPPED_CONTEXT = _require2.DOCTYPE_ATTRIBUTE_WRAPPED_CONTEXT,
  39. DOCTYPE_ATTRIBUTE_BARE_CONTEXT = _require2.DOCTYPE_ATTRIBUTE_BARE_CONTEXT,
  40. COMMENT_CONTENT_CONTEXT = _require2.COMMENT_CONTENT_CONTEXT;
  41. var contextHandlersMap = (_contextHandlersMap = {}, _defineProperty(_contextHandlersMap, DATA_CONTEXT, dataContext), _defineProperty(_contextHandlersMap, OPEN_TAG_START_CONTEXT, openTagStartContext), _defineProperty(_contextHandlersMap, CLOSE_TAG_CONTEXT, closeTagContext), _defineProperty(_contextHandlersMap, ATTRIBUTES_CONTEXT, attributesContext), _defineProperty(_contextHandlersMap, OPEN_TAG_END_CONTEXT, openTagEndContext), _defineProperty(_contextHandlersMap, ATTRIBUTE_KEY_CONTEXT, attributeKeyContext), _defineProperty(_contextHandlersMap, ATTRIBUTE_VALUE_CONTEXT, attributeValueContext), _defineProperty(_contextHandlersMap, ATTRIBUTE_VALUE_BARE_CONTEXT, attributeValueBareContext), _defineProperty(_contextHandlersMap, ATTRIBUTE_VALUE_WRAPPED_CONTEXT, attributeValueWrappedContext), _defineProperty(_contextHandlersMap, SCRIPT_CONTENT_CONTEXT, scriptContentContext), _defineProperty(_contextHandlersMap, STYLE_CONTENT_CONTEXT, styleContentContext), _defineProperty(_contextHandlersMap, DOCTYPE_START_CONTEXT, doctypeStartContext), _defineProperty(_contextHandlersMap, DOCTYPE_END_CONTEXT, doctypeEndContextFactory), _defineProperty(_contextHandlersMap, DOCTYPE_ATTRIBUTES_CONTEXT, doctypeAttributesContext), _defineProperty(_contextHandlersMap, DOCTYPE_ATTRIBUTE_WRAPPED_CONTEXT, doctypeAttributeWrappedContext), _defineProperty(_contextHandlersMap, DOCTYPE_ATTRIBUTE_BARE_CONTEXT, doctypeAttributeBareEndContext), _defineProperty(_contextHandlersMap, COMMENT_CONTENT_CONTEXT, commentContentContext), _contextHandlersMap);
  42. function tokenizeChars(chars, state, tokens, _ref) {
  43. var isFinalChunk = _ref.isFinalChunk,
  44. positionOffset = _ref.positionOffset;
  45. var charIndex = state.caretPosition - positionOffset;
  46. while (charIndex < chars.length) {
  47. var context = contextHandlersMap[state.currentContext];
  48. state.decisionBuffer += chars[charIndex];
  49. var nextChar = chars[charIndex + 1];
  50. var nextNoWhiteChar = nextChar;
  51. var nextNoWhiteIndex = charIndex + 1;
  52. while (isWhitespace(nextNoWhiteChar)) {
  53. nextNoWhiteIndex += 1;
  54. nextNoWhiteChar = chars[nextNoWhiteIndex];
  55. }
  56. context.parseSyntax(state.decisionBuffer, state, tokens, nextChar, nextNoWhiteChar, chars, charIndex);
  57. charIndex = state.caretPosition - positionOffset;
  58. }
  59. if (isFinalChunk) {
  60. var _context = contextHandlersMap[state.currentContext]; // Move the caret back, as at this point
  61. // it in the position outside of chars array,
  62. // and it should not be taken into account
  63. // when calculating characters range
  64. state.caretPosition--;
  65. if (_context.handleContentEnd !== undefined) {
  66. _context.handleContentEnd(state, tokens);
  67. }
  68. }
  69. }
  70. function tokenize() {
  71. var content = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  72. var existingState = arguments.length > 1 ? arguments[1] : undefined;
  73. var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  74. isFinalChunk = _ref2.isFinalChunk;
  75. isFinalChunk = isFinalChunk === undefined ? true : isFinalChunk;
  76. var state;
  77. if (existingState !== undefined) {
  78. state = Object.assign({}, existingState);
  79. } else {
  80. state = {
  81. currentContext: DATA_CONTEXT,
  82. contextParams: {},
  83. decisionBuffer: '',
  84. accumulatedContent: '',
  85. caretPosition: 0
  86. };
  87. }
  88. var chars = state.decisionBuffer + content;
  89. var tokens = [];
  90. var positionOffset = state.caretPosition - state.decisionBuffer.length;
  91. tokenizeChars(chars, state, tokens, {
  92. isFinalChunk: isFinalChunk,
  93. positionOffset: positionOffset
  94. });
  95. return {
  96. state: state,
  97. tokens: tokens
  98. };
  99. }
  100. module.exports = tokenize;