test-events.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. 'use strict';
  2. require('./_rollupPluginBabelHelpers-eed30217.js');
  3. var parseCst = require('./parse-3997f544.js');
  4. require('./stringifyNumber-dea1120c.js');
  5. require('./Schema-807430ba.js');
  6. var Document = require('./Document-f89a2614.js');
  7. function testEvents(src, options) {
  8. const opt = Object.assign({
  9. keepCstNodes: true,
  10. keepNodeTypes: true,
  11. version: '1.2'
  12. }, options);
  13. const docs = parseCst.parse(src).map(cstDoc => new Document.Document(null, opt).parse(cstDoc));
  14. const errDoc = docs.find(doc => doc.errors.length > 0);
  15. const error = errDoc ? errDoc.errors[0].message : null;
  16. const events = ['+STR'];
  17. try {
  18. for (let i = 0; i < docs.length; ++i) {
  19. const doc = docs[i];
  20. let root = doc.contents;
  21. if (Array.isArray(root)) root = root[0];
  22. const [rootStart, rootEnd] = doc.range || [0, 0];
  23. let e = doc.errors[0] && doc.errors[0].source;
  24. if (e && e.type === 'SEQ_ITEM') e = e.node;
  25. if (e && (e.type === 'DOCUMENT' || e.range.start < rootStart)) throw new Error();
  26. let docStart = '+DOC';
  27. const pre = src.slice(0, rootStart);
  28. const explicitDoc = /---\s*$/.test(pre);
  29. if (explicitDoc) docStart += ' ---';else if (!doc.contents) continue;
  30. events.push(docStart);
  31. addEvents(events, doc, e, root);
  32. if (doc.contents && doc.contents.length > 1) throw new Error();
  33. let docEnd = '-DOC';
  34. if (rootEnd) {
  35. const post = src.slice(rootEnd);
  36. if (/^\.\.\./.test(post)) docEnd += ' ...';
  37. }
  38. events.push(docEnd);
  39. }
  40. } catch (e) {
  41. return {
  42. events,
  43. error: error || e
  44. };
  45. }
  46. events.push('-STR');
  47. return {
  48. events,
  49. error
  50. };
  51. }
  52. function addEvents(events, doc, e, node) {
  53. if (!node) {
  54. events.push('=VAL :');
  55. return;
  56. }
  57. if (e && node.cstNode === e) throw new Error();
  58. let props = '';
  59. let anchor = doc.anchors.getName(node);
  60. if (anchor) {
  61. if (/\d$/.test(anchor)) {
  62. const alt = anchor.replace(/\d$/, '');
  63. if (doc.anchors.getNode(alt)) anchor = alt;
  64. }
  65. props = ` &${anchor}`;
  66. }
  67. if (node.cstNode && node.cstNode.tag) {
  68. const {
  69. handle,
  70. suffix
  71. } = node.cstNode.tag;
  72. props += handle === '!' && !suffix ? ' <!>' : ` <${node.tag}>`;
  73. }
  74. let scalar = null;
  75. switch (node.type) {
  76. case 'ALIAS':
  77. {
  78. let alias = doc.anchors.getName(node.source);
  79. if (/\d$/.test(alias)) {
  80. const alt = alias.replace(/\d$/, '');
  81. if (doc.anchors.getNode(alt)) alias = alt;
  82. }
  83. events.push(`=ALI${props} *${alias}`);
  84. }
  85. break;
  86. case 'BLOCK_FOLDED':
  87. scalar = '>';
  88. break;
  89. case 'BLOCK_LITERAL':
  90. scalar = '|';
  91. break;
  92. case 'PLAIN':
  93. scalar = ':';
  94. break;
  95. case 'QUOTE_DOUBLE':
  96. scalar = '"';
  97. break;
  98. case 'QUOTE_SINGLE':
  99. scalar = "'";
  100. break;
  101. case 'PAIR':
  102. events.push(`+MAP${props}`);
  103. addEvents(events, doc, e, node.key);
  104. addEvents(events, doc, e, node.value);
  105. events.push('-MAP');
  106. break;
  107. case 'FLOW_SEQ':
  108. case 'SEQ':
  109. events.push(`+SEQ${props}`);
  110. node.items.forEach(item => {
  111. addEvents(events, doc, e, item);
  112. });
  113. events.push('-SEQ');
  114. break;
  115. case 'FLOW_MAP':
  116. case 'MAP':
  117. events.push(`+MAP${props}`);
  118. node.items.forEach(({
  119. key,
  120. value
  121. }) => {
  122. addEvents(events, doc, e, key);
  123. addEvents(events, doc, e, value);
  124. });
  125. events.push('-MAP');
  126. break;
  127. default:
  128. throw new Error(`Unexpected node type ${node.type}`);
  129. }
  130. if (scalar) {
  131. const value = node.cstNode.strValue.replace(/\\/g, '\\\\').replace(/\0/g, '\\0').replace(/\x07/g, '\\a').replace(/\x08/g, '\\b').replace(/\t/g, '\\t').replace(/\n/g, '\\n').replace(/\v/g, '\\v').replace(/\f/g, '\\f').replace(/\r/g, '\\r').replace(/\x1b/g, '\\e');
  132. events.push(`=VAL${props} ${scalar}${value}`);
  133. }
  134. }
  135. exports.testEvents = testEvents;