PageSourceSearch

https://hapifhir.io/hapi-fhir/resources/prismjs/plugins/line-numbers/prism-line-numbers.js

js hapifhir.io collected 2026-09-25 08:51:06 UTC 6,625 bytes, 252 lines download raw bytes

vendor: 6,625 bytes, lines 1-252
1(function () {
2
3	if (typeof Prism === 'undefined' || typeof document === 'undefined') {
4		return;
5	}
6
7	/**
8	 * Plugin name which is used as a class name for <pre> which is activating the plugin
9	 *
10	 * @type {string}
11	 */
12	var PLUGIN_NAME = 'line-numbers';
13
14	/**
15	 * Regular expression used for determining line breaks
16	 *
17	 * @type {RegExp}
18	 */
19	var NEW_LINE_EXP = /\n(?!$)/g;
20
21
22	/**
23	 * Global exports
24	 */
25	var config = Prism.plugins.lineNumbers = {
26		/**
27		 * Get node for provided line number
28		 *
29		 * @param {Element} element pre element
30		 * @param {number} number line number
31		 * @returns {Element|undefined}
32		 */
33		getLine: function (element, number) {
34			if (element.tagName !== 'PRE' || !element.classList.contains(PLUGIN_NAME)) {
35				return;
36			}
37
38			var lineNumberRows = element.querySelector('.line-numbers-rows');
39			if (!lineNumberRows) {
40				return;
41			}
42			var lineNumberStart = parseInt(element.getAttribute('data-start'), 10) || 1;
43			var lineNumberEnd = lineNumberStart + (lineNumberRows.children.length - 1);
44
45			if (number < lineNumberStart) {
46				number = lineNumberStart;
47			}
48			if (number > lineNumberEnd) {
49				number = lineNumberEnd;
50			}
51
52			var lineIndex = number - lineNumberStart;
53
54			return lineNumberRows.children[lineIndex];
55		},
56
57		/**
58		 * Resizes the line numbers of the given element.
59		 *
60		 * This function will not add line numbers. It will only resize existing ones.
61		 *
62		 * @param {HTMLElement} element A `<pre>` element with line numbers.
63		 * @returns {void}
64		 */
65		resize: function (element) {
66			resizeElements([element]);
67		},
68
69		/**
70		 * Whether the plugin can assume that the units font sizes and margins are not depended on the size of
71		 * the current viewport.
72		 *
73		 * Setting this to `true` will allow the plugin to do certain optimizations for better performance.
74		 *
75		 * Set this to `false` if you use any of the following CSS units: `vh`, `vw`, `vmin`, `vmax`.
76		 *
77		 * @type {boolean}
78		 */
79		assumeViewportIndependence: true
80	};
81
82	/**
83	 * Resizes the given elements.
84	 *
85	 * @param {HTMLElement[]} elements
86	 */
87	function resizeElements(elements) {
88		elements = elements.filter(function (e) {
89			var codeStyles = getStyles(e);
90			var whiteSpace = codeStyles['white-space'];
91			return whiteSpace === 'pre-wrap' || whiteSpace === 'pre-line';
92		});
93
94		if (elements.length == 0) {
95			return;
96		}
97
98		var infos = elements.map(function (element) {
99			var codeElement = element.querySelector('code');
100			var lineNumbersWrapper = element.querySelector('.line-numbers-rows');
101			if (!codeElement || !lineNumbersWrapper) {
102				return undefined;
103			}
104
105			/** @type {HTMLElement} */
106			var lineNumberSizer = element.querySelector('.line-numbers-sizer');
107			var codeLines = codeElement.textContent.split(NEW_LINE_EXP);
108
109			if (!lineNumberSizer) {
110				lineNumberSizer = document.createElement('span');
111				lineNumberSizer.className = 'line-numbers-sizer';
112
113				codeElement.appendChild(lineNumberSizer);
114			}
115
116			lineNumberSizer.innerHTML = '0';
117			lineNumberSizer.style.display = 'block';
118
119			var oneLinerHeight = lineNumberSizer.getBoundingClientRect().height;
120			lineNumberSizer.innerHTML = '';
121
122			return {
123				element: element,
124				lines: codeLines,
125				lineHeights: [],
126				oneLinerHeight: oneLinerHeight,
127				sizer: lineNumberSizer,
128			};
129		}).filter(Boolean);
130
131		infos.forEach(function (info) {
132			var lineNumberSizer = info.sizer;
133			var lines = info.lines;
134			var lineHeights = info.lineHeights;
135			var oneLinerHeight = info.oneLinerHeight;
136
137			lineHeights[lines.length - 1] = undefined;
138			lines.forEach(function (line, index) {
139				if (line && line.length > 1) {
140					var e = lineNumberSizer.appendChild(document.createElement('span'));
141					e.style.display = 'block';
142					e.textContent = line;
143				} else {
144					lineHeights[index] = oneLinerHeight;
145				}
146			});
147		});
148
149		infos.forEach(function (info) {
150			var lineNumberSizer = info.sizer;
151			var lineHeights = info.lineHeights;
152
153			var childIndex = 0;
154			for (var i = 0; i < lineHeights.length; i++) {
155				if (lineHeights[i] === undefined) {
156					lineHeights[i] = lineNumberSizer.children[childIndex++].getBoundingClientRect().height;
157				}
158			}
159		});
160
161		infos.forEach(function (info) {
162			var lineNumberSizer = info.sizer;
163			var wrapper = info.element.querySelector('.line-numbers-rows');
164
165			lineNumberSizer.style.display = 'none';
166			lineNumberSizer.innerHTML = '';
167
168			info.lineHeights.forEach(function (height, lineNumber) {
169				wrapper.children[lineNumber].style.height = height + 'px';
170			});
171		});
172	}
173
174	/**
175	 * Returns style declarations for the element
176	 *
177	 * @param {Element} element
178	 */
179	function getStyles(element) {
180		if (!element) {
181			return null;
182		}
183
184		return window.getComputedStyle ? getComputedStyle(element) : (element.currentStyle || null);
185	}
186
187	var lastWidth = undefined;
188	window.addEventListener('resize', function () {
189		if (config.assumeViewportIndependence && lastWidth === window.innerWidth) {
190			return;
191		}
192		lastWidth = window.innerWidth;
193
194		resizeElements(Array.prototype.slice.call(document.querySelectorAll('pre.' + PLUGIN_NAME)));
195	});
196
197	Prism.hooks.add('complete', function (env) {
198		if (!env.code) {
199			return;
200		}
201
202		var code = /** @type {Element} */ (env.element);
203		var pre = /** @type {HTMLElement} */ (code.parentNode);
204
205		// works only for <code> wrapped inside <pre> (not inline)
206		if (!pre || !/pre/i.test(pre.nodeName)) {
207			return;
208		}
209
210		// Abort if line numbers already exists
211		if (code.querySelector('.line-numbers-rows')) {
212			return;
213		}
214
215		// only add line numbers if <code> or one of its ancestors has the `line-numbers` class
216		if (!Prism.util.isActive(code, PLUGIN_NAME)) {
217			return;
218		}
219
220		// Remove the class 'line-numbers' from the <code>
221		code.classList.remove(PLUGIN_NAME);
222		// Add the class 'line-numbers' to the <pre>
223		pre.classList.add(PLUGIN_NAME);
224
225		var match = env.code.match(NEW_LINE_EXP);
226		var linesNum = match ? match.length + 1 : 1;
227		var lineNumbersWrapper;
228
229		var lines = new Array(linesNum + 1).join('<span></span>');
230
231		lineNumbersWrapper = document.createElement('span');
232		lineNumbersWrapper.setAttribute('aria-hidden', 'true');
233		lineNumbersWrapper.className = 'line-numbers-rows';
234		lineNumbersWrapper.innerHTML = lines;
235
236		if (pre.hasAttribute('data-start')) {
237			pre.style.counterReset = 'linenumber ' + (parseInt(pre.getAttribute('data-start'), 10) - 1);
238		}
239
240		env.element.appendChild(lineNumbersWrapper);
241
242		resizeElements([pre]);
243
244		Prism.hooks.run('line-numbers', env);
245	});
246
247	Prism.hooks.add('line-numbers', function (env) {
248		env.plugins = env.plugins || {};
249		env.plugins.lineNumbers = true;
250	});
251
252}());

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.