source: node_modules/react-syntax-highlighter/dist/cjs/highlight.js@ d24f17c

main
Last change on this file since d24f17c was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago

Initial commit

  • Property mode set to 100644
File size: 16.0 KB
Line 
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports["default"] = _default;
9
10var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
12var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
14var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
16var _react = _interopRequireDefault(require("react"));
17
18var _createElement = _interopRequireDefault(require("./create-element"));
19
20var _checkForListedLanguage = _interopRequireDefault(require("./checkForListedLanguage"));
21
22var _excluded = ["language", "children", "style", "customStyle", "codeTagProps", "useInlineStyles", "showLineNumbers", "showInlineLineNumbers", "startingLineNumber", "lineNumberContainerStyle", "lineNumberStyle", "wrapLines", "wrapLongLines", "lineProps", "renderer", "PreTag", "CodeTag", "code", "astGenerator"];
23
24function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
25
26function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
27
28var newLineRegex = /\n/g;
29
30function getNewLines(str) {
31 return str.match(newLineRegex);
32}
33
34function getAllLineNumbers(_ref) {
35 var lines = _ref.lines,
36 startingLineNumber = _ref.startingLineNumber,
37 style = _ref.style;
38 return lines.map(function (_, i) {
39 var number = i + startingLineNumber;
40 return /*#__PURE__*/_react["default"].createElement("span", {
41 key: "line-".concat(i),
42 className: "react-syntax-highlighter-line-number",
43 style: typeof style === 'function' ? style(number) : style
44 }, "".concat(number, "\n"));
45 });
46}
47
48function AllLineNumbers(_ref2) {
49 var codeString = _ref2.codeString,
50 codeStyle = _ref2.codeStyle,
51 _ref2$containerStyle = _ref2.containerStyle,
52 containerStyle = _ref2$containerStyle === void 0 ? {
53 "float": 'left',
54 paddingRight: '10px'
55 } : _ref2$containerStyle,
56 _ref2$numberStyle = _ref2.numberStyle,
57 numberStyle = _ref2$numberStyle === void 0 ? {} : _ref2$numberStyle,
58 startingLineNumber = _ref2.startingLineNumber;
59 return /*#__PURE__*/_react["default"].createElement("code", {
60 style: Object.assign({}, codeStyle, containerStyle)
61 }, getAllLineNumbers({
62 lines: codeString.replace(/\n$/, '').split('\n'),
63 style: numberStyle,
64 startingLineNumber: startingLineNumber
65 }));
66}
67
68function getEmWidthOfNumber(num) {
69 return "".concat(num.toString().length, ".25em");
70}
71
72function getInlineLineNumber(lineNumber, inlineLineNumberStyle) {
73 return {
74 type: 'element',
75 tagName: 'span',
76 properties: {
77 key: "line-number--".concat(lineNumber),
78 className: ['comment', 'linenumber', 'react-syntax-highlighter-line-number'],
79 style: inlineLineNumberStyle
80 },
81 children: [{
82 type: 'text',
83 value: lineNumber
84 }]
85 };
86}
87
88function assembleLineNumberStyles(lineNumberStyle, lineNumber, largestLineNumber) {
89 // minimally necessary styling for line numbers
90 var defaultLineNumberStyle = {
91 display: 'inline-block',
92 minWidth: getEmWidthOfNumber(largestLineNumber),
93 paddingRight: '1em',
94 textAlign: 'right',
95 userSelect: 'none'
96 }; // prep custom styling
97
98 var customLineNumberStyle = typeof lineNumberStyle === 'function' ? lineNumberStyle(lineNumber) : lineNumberStyle; // combine
99
100 var assembledStyle = _objectSpread(_objectSpread({}, defaultLineNumberStyle), customLineNumberStyle);
101
102 return assembledStyle;
103}
104
105function createLineElement(_ref3) {
106 var children = _ref3.children,
107 lineNumber = _ref3.lineNumber,
108 lineNumberStyle = _ref3.lineNumberStyle,
109 largestLineNumber = _ref3.largestLineNumber,
110 showInlineLineNumbers = _ref3.showInlineLineNumbers,
111 _ref3$lineProps = _ref3.lineProps,
112 lineProps = _ref3$lineProps === void 0 ? {} : _ref3$lineProps,
113 _ref3$className = _ref3.className,
114 className = _ref3$className === void 0 ? [] : _ref3$className,
115 showLineNumbers = _ref3.showLineNumbers,
116 wrapLongLines = _ref3.wrapLongLines;
117 var properties = typeof lineProps === 'function' ? lineProps(lineNumber) : lineProps;
118 properties['className'] = className;
119
120 if (lineNumber && showInlineLineNumbers) {
121 var inlineLineNumberStyle = assembleLineNumberStyles(lineNumberStyle, lineNumber, largestLineNumber);
122 children.unshift(getInlineLineNumber(lineNumber, inlineLineNumberStyle));
123 }
124
125 if (wrapLongLines & showLineNumbers) {
126 properties.style = _objectSpread(_objectSpread({}, properties.style), {}, {
127 display: 'flex'
128 });
129 }
130
131 return {
132 type: 'element',
133 tagName: 'span',
134 properties: properties,
135 children: children
136 };
137}
138
139function flattenCodeTree(tree) {
140 var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
141 var newTree = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
142
143 for (var i = 0; i < tree.length; i++) {
144 var node = tree[i];
145
146 if (node.type === 'text') {
147 newTree.push(createLineElement({
148 children: [node],
149 className: (0, _toConsumableArray2["default"])(new Set(className))
150 }));
151 } else if (node.children) {
152 var classNames = className.concat(node.properties.className);
153 flattenCodeTree(node.children, classNames).forEach(function (i) {
154 return newTree.push(i);
155 });
156 }
157 }
158
159 return newTree;
160}
161
162function processLines(codeTree, wrapLines, lineProps, showLineNumbers, showInlineLineNumbers, startingLineNumber, largestLineNumber, lineNumberStyle, wrapLongLines) {
163 var _ref4;
164
165 var tree = flattenCodeTree(codeTree.value);
166 var newTree = [];
167 var lastLineBreakIndex = -1;
168 var index = 0;
169
170 function createWrappedLine(children, lineNumber) {
171 var className = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
172 return createLineElement({
173 children: children,
174 lineNumber: lineNumber,
175 lineNumberStyle: lineNumberStyle,
176 largestLineNumber: largestLineNumber,
177 showInlineLineNumbers: showInlineLineNumbers,
178 lineProps: lineProps,
179 className: className,
180 showLineNumbers: showLineNumbers,
181 wrapLongLines: wrapLongLines
182 });
183 }
184
185 function createUnwrappedLine(children, lineNumber) {
186 if (showLineNumbers && lineNumber && showInlineLineNumbers) {
187 var inlineLineNumberStyle = assembleLineNumberStyles(lineNumberStyle, lineNumber, largestLineNumber);
188 children.unshift(getInlineLineNumber(lineNumber, inlineLineNumberStyle));
189 }
190
191 return children;
192 }
193
194 function createLine(children, lineNumber) {
195 var className = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
196 return wrapLines || className.length > 0 ? createWrappedLine(children, lineNumber, className) : createUnwrappedLine(children, lineNumber);
197 }
198
199 var _loop = function _loop() {
200 var node = tree[index];
201 var value = node.children[0].value;
202 var newLines = getNewLines(value);
203
204 if (newLines) {
205 var splitValue = value.split('\n');
206 splitValue.forEach(function (text, i) {
207 var lineNumber = showLineNumbers && newTree.length + startingLineNumber;
208 var newChild = {
209 type: 'text',
210 value: "".concat(text, "\n")
211 }; // if it's the first line
212
213 if (i === 0) {
214 var _children = tree.slice(lastLineBreakIndex + 1, index).concat(createLineElement({
215 children: [newChild],
216 className: node.properties.className
217 }));
218
219 var _line = createLine(_children, lineNumber);
220
221 newTree.push(_line); // if it's the last line
222 } else if (i === splitValue.length - 1) {
223 var stringChild = tree[index + 1] && tree[index + 1].children && tree[index + 1].children[0];
224 var lastLineInPreviousSpan = {
225 type: 'text',
226 value: "".concat(text)
227 };
228
229 if (stringChild) {
230 var newElem = createLineElement({
231 children: [lastLineInPreviousSpan],
232 className: node.properties.className
233 });
234 tree.splice(index + 1, 0, newElem);
235 } else {
236 var _children2 = [lastLineInPreviousSpan];
237
238 var _line2 = createLine(_children2, lineNumber, node.properties.className);
239
240 newTree.push(_line2);
241 } // if it's neither the first nor the last line
242
243 } else {
244 var _children3 = [newChild];
245
246 var _line3 = createLine(_children3, lineNumber, node.properties.className);
247
248 newTree.push(_line3);
249 }
250 });
251 lastLineBreakIndex = index;
252 }
253
254 index++;
255 };
256
257 while (index < tree.length) {
258 _loop();
259 }
260
261 if (lastLineBreakIndex !== tree.length - 1) {
262 var children = tree.slice(lastLineBreakIndex + 1, tree.length);
263
264 if (children && children.length) {
265 var lineNumber = showLineNumbers && newTree.length + startingLineNumber;
266 var line = createLine(children, lineNumber);
267 newTree.push(line);
268 }
269 }
270
271 return wrapLines ? newTree : (_ref4 = []).concat.apply(_ref4, newTree);
272}
273
274function defaultRenderer(_ref5) {
275 var rows = _ref5.rows,
276 stylesheet = _ref5.stylesheet,
277 useInlineStyles = _ref5.useInlineStyles;
278 return rows.map(function (node, i) {
279 return (0, _createElement["default"])({
280 node: node,
281 stylesheet: stylesheet,
282 useInlineStyles: useInlineStyles,
283 key: "code-segement".concat(i)
284 });
285 });
286} // only highlight.js has the highlightAuto method
287
288
289function isHighlightJs(astGenerator) {
290 return astGenerator && typeof astGenerator.highlightAuto !== 'undefined';
291}
292
293function getCodeTree(_ref6) {
294 var astGenerator = _ref6.astGenerator,
295 language = _ref6.language,
296 code = _ref6.code,
297 defaultCodeValue = _ref6.defaultCodeValue;
298
299 // figure out whether we're using lowlight/highlight or refractor/prism
300 // then attempt highlighting accordingly
301 // lowlight/highlight?
302 if (isHighlightJs(astGenerator)) {
303 var hasLanguage = (0, _checkForListedLanguage["default"])(astGenerator, language);
304
305 if (language === 'text') {
306 return {
307 value: defaultCodeValue,
308 language: 'text'
309 };
310 } else if (hasLanguage) {
311 return astGenerator.highlight(language, code);
312 } else {
313 return astGenerator.highlightAuto(code);
314 }
315 } // must be refractor/prism, then
316
317
318 try {
319 return language && language !== 'text' ? {
320 value: astGenerator.highlight(code, language)
321 } : {
322 value: defaultCodeValue
323 };
324 } catch (e) {
325 return {
326 value: defaultCodeValue
327 };
328 }
329}
330
331function _default(defaultAstGenerator, defaultStyle) {
332 return function SyntaxHighlighter(_ref7) {
333 var language = _ref7.language,
334 children = _ref7.children,
335 _ref7$style = _ref7.style,
336 style = _ref7$style === void 0 ? defaultStyle : _ref7$style,
337 _ref7$customStyle = _ref7.customStyle,
338 customStyle = _ref7$customStyle === void 0 ? {} : _ref7$customStyle,
339 _ref7$codeTagProps = _ref7.codeTagProps,
340 codeTagProps = _ref7$codeTagProps === void 0 ? {
341 className: language ? "language-".concat(language) : undefined,
342 style: _objectSpread(_objectSpread({}, style['code[class*="language-"]']), style["code[class*=\"language-".concat(language, "\"]")])
343 } : _ref7$codeTagProps,
344 _ref7$useInlineStyles = _ref7.useInlineStyles,
345 useInlineStyles = _ref7$useInlineStyles === void 0 ? true : _ref7$useInlineStyles,
346 _ref7$showLineNumbers = _ref7.showLineNumbers,
347 showLineNumbers = _ref7$showLineNumbers === void 0 ? false : _ref7$showLineNumbers,
348 _ref7$showInlineLineN = _ref7.showInlineLineNumbers,
349 showInlineLineNumbers = _ref7$showInlineLineN === void 0 ? true : _ref7$showInlineLineN,
350 _ref7$startingLineNum = _ref7.startingLineNumber,
351 startingLineNumber = _ref7$startingLineNum === void 0 ? 1 : _ref7$startingLineNum,
352 lineNumberContainerStyle = _ref7.lineNumberContainerStyle,
353 _ref7$lineNumberStyle = _ref7.lineNumberStyle,
354 lineNumberStyle = _ref7$lineNumberStyle === void 0 ? {} : _ref7$lineNumberStyle,
355 wrapLines = _ref7.wrapLines,
356 _ref7$wrapLongLines = _ref7.wrapLongLines,
357 wrapLongLines = _ref7$wrapLongLines === void 0 ? false : _ref7$wrapLongLines,
358 _ref7$lineProps = _ref7.lineProps,
359 lineProps = _ref7$lineProps === void 0 ? {} : _ref7$lineProps,
360 renderer = _ref7.renderer,
361 _ref7$PreTag = _ref7.PreTag,
362 PreTag = _ref7$PreTag === void 0 ? 'pre' : _ref7$PreTag,
363 _ref7$CodeTag = _ref7.CodeTag,
364 CodeTag = _ref7$CodeTag === void 0 ? 'code' : _ref7$CodeTag,
365 _ref7$code = _ref7.code,
366 code = _ref7$code === void 0 ? (Array.isArray(children) ? children[0] : children) || '' : _ref7$code,
367 astGenerator = _ref7.astGenerator,
368 rest = (0, _objectWithoutProperties2["default"])(_ref7, _excluded);
369 astGenerator = astGenerator || defaultAstGenerator;
370 var allLineNumbers = showLineNumbers ? /*#__PURE__*/_react["default"].createElement(AllLineNumbers, {
371 containerStyle: lineNumberContainerStyle,
372 codeStyle: codeTagProps.style || {},
373 numberStyle: lineNumberStyle,
374 startingLineNumber: startingLineNumber,
375 codeString: code
376 }) : null;
377 var defaultPreStyle = style.hljs || style['pre[class*="language-"]'] || {
378 backgroundColor: '#fff'
379 };
380 var generatorClassName = isHighlightJs(astGenerator) ? 'hljs' : 'prismjs';
381 var preProps = useInlineStyles ? Object.assign({}, rest, {
382 style: Object.assign({}, defaultPreStyle, customStyle)
383 }) : Object.assign({}, rest, {
384 className: rest.className ? "".concat(generatorClassName, " ").concat(rest.className) : generatorClassName,
385 style: Object.assign({}, customStyle)
386 });
387
388 if (wrapLongLines) {
389 codeTagProps.style = _objectSpread(_objectSpread({}, codeTagProps.style), {}, {
390 whiteSpace: 'pre-wrap'
391 });
392 } else {
393 codeTagProps.style = _objectSpread(_objectSpread({}, codeTagProps.style), {}, {
394 whiteSpace: 'pre'
395 });
396 }
397
398 if (!astGenerator) {
399 return /*#__PURE__*/_react["default"].createElement(PreTag, preProps, allLineNumbers, /*#__PURE__*/_react["default"].createElement(CodeTag, codeTagProps, code));
400 }
401 /*
402 * Some custom renderers rely on individual row elements so we need to turn wrapLines on
403 * if renderer is provided and wrapLines is undefined.
404 */
405
406
407 if (wrapLines === undefined && renderer || wrapLongLines) wrapLines = true;
408 renderer = renderer || defaultRenderer;
409 var defaultCodeValue = [{
410 type: 'text',
411 value: code
412 }];
413 var codeTree = getCodeTree({
414 astGenerator: astGenerator,
415 language: language,
416 code: code,
417 defaultCodeValue: defaultCodeValue
418 });
419
420 if (codeTree.language === null) {
421 codeTree.value = defaultCodeValue;
422 } // determine largest line number so that we can force minWidth on all linenumber elements
423
424
425 var largestLineNumber = codeTree.value.length + startingLineNumber;
426 var rows = processLines(codeTree, wrapLines, lineProps, showLineNumbers, showInlineLineNumbers, startingLineNumber, largestLineNumber, lineNumberStyle, wrapLongLines);
427 return /*#__PURE__*/_react["default"].createElement(PreTag, preProps, /*#__PURE__*/_react["default"].createElement(CodeTag, codeTagProps, !showInlineLineNumbers && allLineNumbers, renderer({
428 rows: rows,
429 stylesheet: style,
430 useInlineStyles: useInlineStyles
431 })));
432 };
433}
Note: See TracBrowser for help on using the repository browser.