@diplodoc/transform 4.77.8 → 4.77.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -171,17 +171,40 @@ const imageWithSize = (md, opts) => {
171
171
  [const_1.ImsizeAttr.Src, href],
172
172
  [const_1.ImsizeAttr.Alt, ''],
173
173
  ];
174
- // Handle inline attribute from curly braces
175
- if (state.src.slice(Math.max(0, pos), max).includes('{')) {
176
- const result = parseInlineAttributes(state.src.slice(Math.max(0, pos) + 1, max - 1).replace(/\{?(.*?)\}.*/, '$1'));
177
- if (result.width !== '') {
178
- width = result.width;
179
- }
180
- if (result.height !== '') {
181
- height = result.height;
174
+ // 0x7b = "{"
175
+ if (pos < max && state.src.codePointAt(pos) === 0x7b /* { */) {
176
+ let bracePos = pos + 1;
177
+ let depth = 1;
178
+ while (bracePos < max && depth > 0) {
179
+ const braceCode = state.src.codePointAt(bracePos);
180
+ if (braceCode === 0x7b) {
181
+ depth++;
182
+ }
183
+ else if (braceCode === 0x7d) {
184
+ depth--;
185
+ }
186
+ if (depth > 0) {
187
+ bracePos++;
188
+ }
182
189
  }
183
- if (result.inline !== '') {
184
- token.attrs.push([const_1.ImsizeAttr.Inline, result.inline]);
190
+ if (depth === 0) {
191
+ const attrsBody = state.src.slice(pos + 1, bracePos);
192
+ const result = parseInlineAttributes(attrsBody);
193
+ if (result.width !== '') {
194
+ width = result.width;
195
+ }
196
+ if (result.height !== '') {
197
+ height = result.height;
198
+ }
199
+ if (result.inline !== '') {
200
+ token.attrs.push([const_1.ImsizeAttr.Inline, result.inline]);
201
+ }
202
+ if (result.dataAttrs) {
203
+ for (const [key, value] of Object.entries(result.dataAttrs)) {
204
+ token.attrs.push([key, value]);
205
+ }
206
+ }
207
+ pos = bracePos + 1;
185
208
  }
186
209
  }
187
210
  if (title) {
@@ -223,24 +246,35 @@ const imageWithSize = (md, opts) => {
223
246
  };
224
247
  };
225
248
  exports.imageWithSize = imageWithSize;
249
+ function resolveDataAttr(key, value) {
250
+ const isGalleryValid = value === 'true' || value === 'false';
251
+ if (key === 'gallery')
252
+ return isGalleryValid ? ['data-gallery', value] : null;
253
+ if (key === 'data-gallery')
254
+ return isGalleryValid ? [key, value] : null;
255
+ if (key.startsWith('data-'))
256
+ return [key, value];
257
+ return null;
258
+ }
226
259
  function parseInlineAttributes(attrsStr) {
227
260
  // Parse key=value pairs
228
- const attrRegex = /(\w+)=(?:'([^']*)'|"([^"]*)"|(\S+))/g;
229
- const result = {
230
- width: '',
231
- height: '',
232
- inline: '',
233
- };
261
+ const attrRegex = /([\w-]+)=(?:'([^']*)'|"([^"]*)"|(\S+))/g;
262
+ const result = { width: '', height: '', inline: '', dataAttrs: {} };
234
263
  let match;
235
264
  while ((match = attrRegex.exec(attrsStr)) !== null) {
236
265
  const key = match[1];
237
- const value = match[2] || match[3] || match[4];
238
- switch (key) {
239
- case 'width':
240
- case 'height':
241
- case 'inline':
242
- result[key] = value;
243
- break;
266
+ let value = match[2] || match[3] || match[4];
267
+ if (value === null || value === void 0 ? void 0 : value.endsWith('}')) {
268
+ value = value.slice(0, -1);
269
+ }
270
+ if (key === 'width' || key === 'height' || key === 'inline') {
271
+ result[key] = value;
272
+ continue;
273
+ }
274
+ const resolved = resolveDataAttr(key, value);
275
+ if (resolved) {
276
+ result.dataAttrs = result.dataAttrs || {};
277
+ result.dataAttrs[resolved[0]] = resolved[1];
244
278
  }
245
279
  }
246
280
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/transform/plugins/imsize/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/transform/plugins/imsize/plugin.ts"],"names":[],"mappings":"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"}
package/lib/typings.d.ts CHANGED
@@ -150,4 +150,5 @@ export type ImageOptions = {
150
150
  width: string | undefined | null;
151
151
  height: string | undefined | null;
152
152
  title: string | undefined | null;
153
+ dataAttrs?: Record<string, string>;
153
154
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diplodoc/transform",
3
- "version": "4.77.8",
3
+ "version": "4.77.9",
4
4
  "description": "A simple transformer of text in YFM (Yandex Flavored Markdown) to HTML",
5
5
  "keywords": [
6
6
  "markdown",
@@ -13,6 +13,14 @@ import {filterTokens, getSrcTokenAttr, isExternalHref} from '../../utils';
13
13
  import {generateID as globalGenerateID} from '../utils';
14
14
 
15
15
  const sanitizeAttribute = (value: string): string => value.replace(/(\d*[%a-z]{0,5}).*/gi, '$1');
16
+ const sanitizeHTMLAttr = (value: string): string => {
17
+ return value
18
+ .replace(/&/g, '&amp;')
19
+ .replace(/"/g, '&quot;')
20
+ .replace(/'/g, '&#39;')
21
+ .replace(/</g, '&lt;')
22
+ .replace(/>/g, '&gt;');
23
+ };
16
24
 
17
25
  interface ImageOpts extends MarkdownItPluginOpts {
18
26
  assetsPublicPath: string;
@@ -103,6 +111,27 @@ function shouldBeInlined(token: Token, opts: InlineOptions) {
103
111
  return shouldInlineSvg;
104
112
  }
105
113
 
114
+ function isGalleryValid(value: string): boolean {
115
+ return value === 'true' || value === 'false';
116
+ }
117
+
118
+ function collectDataAttrs(image: Token): Record<string, string> {
119
+ const result: Record<string, string> = {};
120
+ if (!image.attrs) return result;
121
+
122
+ for (const [key, value] of image.attrs) {
123
+ if (key === 'gallery' && isGalleryValid(value)) {
124
+ result['data-gallery'] = value;
125
+ } else if (key.startsWith('data-') && (key !== 'data-gallery' || isGalleryValid(value))) {
126
+ result[key] = value;
127
+ }
128
+ }
129
+ image.attrs = image.attrs.filter(
130
+ ([key, value]) => key !== 'gallery' && (key !== 'data-gallery' || isGalleryValid(value)),
131
+ );
132
+ return result;
133
+ }
134
+
106
135
  const getRawFile = (path: string) => {
107
136
  return readFileSync(path, 'utf8').toString();
108
137
  };
@@ -122,65 +151,63 @@ const index: MarkdownItPluginCb<Opts> = (md, opts) => {
122
151
  }
123
152
  md.assets = [];
124
153
 
125
- const plugin = (state: StateCore) => {
126
- const tokens = state.tokens;
154
+ function processImageToken(
155
+ image: Token,
156
+ tokenIndex: number,
157
+ childrenTokens: Token[],
158
+ state: StateCore,
159
+ ): void {
160
+ if (image.attrGet('yfm_patched')) return;
161
+
162
+ const imgSrc = getSrcTokenAttr(image);
163
+ if (isExternalHref(imgSrc)) return;
164
+
165
+ const dataAttrs = collectDataAttrs(image);
166
+ const forceInlineSvg = image.attrGet('inline') === 'true';
167
+ const imageOpts = {
168
+ width: image.attrGet('width'),
169
+ height: image.attrGet('height'),
170
+ title: image.attrGet('title'),
171
+ dataAttrs,
172
+ };
127
173
 
128
- filterTokens(tokens, 'inline', (inline, {commented}) => {
129
- if (commented || !inline.children) {
130
- return;
174
+ const from = state.env.path || opts.path;
175
+ const file = calcPath(from, imgSrc);
176
+
177
+ if (shouldBeInlined(image, opts.svgInline)) {
178
+ const svgContent = getSvgContent(file, from, {...opts, rawContent});
179
+ if (svgContent) {
180
+ if (svgContent.length > opts.svgInline.maxFileSize && !forceInlineSvg) {
181
+ image.attrSet(
182
+ 'YFM011',
183
+ `Svg size: ${svgContent.length}; Config size: ${opts.svgInline.maxFileSize}; Src: ${bold(file)}`,
184
+ );
185
+ } else {
186
+ const svgToken = new state.Token('image_svg', '', 0);
187
+ svgToken.attrSet(
188
+ 'content',
189
+ replaceSvgContent(svgContent, imageOpts, opts.generateID),
190
+ );
191
+ childrenTokens[tokenIndex] = svgToken;
192
+ }
131
193
  }
194
+ }
132
195
 
133
- const childrenTokens = inline.children || [];
196
+ if (childrenTokens[tokenIndex].type === 'image') {
197
+ image.attrSet('src', replaceImage(state, from, file, imgSrc, opts));
198
+ image.attrSet('yfm_patched', '1');
199
+ for (const [key, value] of Object.entries(dataAttrs)) {
200
+ image.attrSet(key, value);
201
+ }
202
+ }
203
+ }
134
204
 
205
+ const plugin = (state: StateCore) => {
206
+ filterTokens(state.tokens, 'inline', (inline, {commented}) => {
207
+ if (commented || !inline.children) return;
208
+ const childrenTokens = inline.children;
135
209
  filterTokens(childrenTokens, 'image', (image, {commented, index}) => {
136
- const didPatch = image.attrGet('yfm_patched') || false;
137
-
138
- if (didPatch || commented) {
139
- return;
140
- }
141
-
142
- const imgSrc = getSrcTokenAttr(image);
143
- if (isExternalHref(imgSrc)) {
144
- return;
145
- }
146
-
147
- const forceInlineSvg = image.attrGet('inline') === 'true';
148
- const shouldInlineSvg = shouldBeInlined(image, opts.svgInline);
149
- const imageOpts = {
150
- width: image.attrGet('width'),
151
- height: image.attrGet('height'),
152
- title: image.attrGet('title'),
153
- };
154
-
155
- const from = state.env.path || opts.path;
156
- const file = calcPath(from, imgSrc);
157
-
158
- if (shouldInlineSvg) {
159
- const svgContent = getSvgContent(file, from, {
160
- ...opts,
161
- rawContent,
162
- });
163
- if (svgContent) {
164
- if (svgContent.length > opts.svgInline.maxFileSize && !forceInlineSvg) {
165
- image.attrSet(
166
- 'YFM011',
167
- `Svg size: ${svgContent.length}; Config size: ${opts.svgInline.maxFileSize}; Src: ${bold(file)}`,
168
- );
169
- } else {
170
- const svgToken = new state.Token('image_svg', '', 0);
171
- svgToken.attrSet(
172
- 'content',
173
- replaceSvgContent(svgContent, imageOpts, opts.generateID),
174
- );
175
- childrenTokens[index] = svgToken;
176
- }
177
- }
178
- }
179
-
180
- if (childrenTokens[index].type === 'image') {
181
- image.attrSet('src', replaceImage(state, from, file, imgSrc, opts));
182
- image.attrSet('yfm_patched', '1');
183
- }
210
+ if (!commented) processImageToken(image, index, childrenTokens, state);
184
211
  });
185
212
  });
186
213
  };
@@ -232,7 +259,14 @@ function replaceSvgContent(
232
259
  svgRoot = `${svgRoot} height="${sanitizedHeight}"`;
233
260
  }
234
261
  if ((!width && options.width) || (!height && options.height)) {
235
- content = content.replace(/.*?<svg([^>]*)>/, `<svg${svgRoot}>`);
262
+ content = content.replace(/<svg([^>]*)>/, `<svg${svgRoot}>`);
263
+ }
264
+
265
+ if (options.dataAttrs) {
266
+ for (const [key, value] of Object.entries(options.dataAttrs)) {
267
+ svgRoot = `${svgRoot} ${key}="${sanitizeHTMLAttr(value)}"`;
268
+ }
269
+ content = content.replace(/<svg([^>]*)>/, `<svg${svgRoot}>`);
236
270
  }
237
271
 
238
272
  // title
@@ -268,11 +302,10 @@ function escapeMarkdownCharsInSvgTextNodes(content: string): string {
268
302
  }
269
303
 
270
304
  // Create an object that is the index function with an additional replaceSvgContent property
271
- const imagesPlugin: typeof index & {replaceSvgContent: typeof replaceSvgContent} = Object.assign(
272
- index,
273
- {
274
- replaceSvgContent,
275
- },
276
- );
305
+ const imagesPlugin: typeof index & {
306
+ replaceSvgContent: typeof replaceSvgContent;
307
+ } = Object.assign(index, {
308
+ replaceSvgContent,
309
+ });
277
310
 
278
311
  export = imagesPlugin;
@@ -199,20 +199,43 @@ export const imageWithSize = (md: MarkdownIt, opts?: ImsizeOptions): ParserInlin
199
199
  [ImsizeAttr.Alt, ''],
200
200
  ];
201
201
 
202
- // Handle inline attribute from curly braces
203
- if (state.src.slice(Math.max(0, pos), max).includes('{')) {
204
- const result = parseInlineAttributes(
205
- state.src.slice(Math.max(0, pos) + 1, max - 1).replace(/\{?(.*?)\}.*/, '$1'),
206
- );
207
-
208
- if (result.width !== '') {
209
- width = result.width;
210
- }
211
- if (result.height !== '') {
212
- height = result.height;
202
+ // 0x7b = "{"
203
+ if (pos < max && state.src.codePointAt(pos) === 0x7b /* { */) {
204
+ let bracePos = pos + 1;
205
+ let depth = 1;
206
+
207
+ while (bracePos < max && depth > 0) {
208
+ const braceCode = state.src.codePointAt(bracePos);
209
+ if (braceCode === 0x7b) {
210
+ depth++;
211
+ } else if (braceCode === 0x7d) {
212
+ depth--;
213
+ }
214
+ if (depth > 0) {
215
+ bracePos++;
216
+ }
213
217
  }
214
- if (result.inline !== '') {
215
- token.attrs.push([ImsizeAttr.Inline, result.inline]);
218
+
219
+ if (depth === 0) {
220
+ const attrsBody = state.src.slice(pos + 1, bracePos);
221
+ const result = parseInlineAttributes(attrsBody);
222
+
223
+ if (result.width !== '') {
224
+ width = result.width;
225
+ }
226
+ if (result.height !== '') {
227
+ height = result.height;
228
+ }
229
+ if (result.inline !== '') {
230
+ token.attrs.push([ImsizeAttr.Inline, result.inline]);
231
+ }
232
+ if (result.dataAttrs) {
233
+ for (const [key, value] of Object.entries(result.dataAttrs)) {
234
+ token.attrs.push([key, value]);
235
+ }
236
+ }
237
+
238
+ pos = bracePos + 1;
216
239
  }
217
240
  }
218
241
 
@@ -262,26 +285,44 @@ export const imageWithSize = (md: MarkdownIt, opts?: ImsizeOptions): ParserInlin
262
285
  };
263
286
  };
264
287
 
265
- function parseInlineAttributes(attrsStr: string): {width: string; height: string; inline: string} {
288
+ type ParsedAttrs = {
289
+ width: string;
290
+ height: string;
291
+ inline: string;
292
+ dataAttrs?: Record<string, string>;
293
+ };
294
+
295
+ function resolveDataAttr(key: string, value: string): [string, string] | null {
296
+ const isGalleryValid = value === 'true' || value === 'false';
297
+ if (key === 'gallery') return isGalleryValid ? ['data-gallery', value] : null;
298
+ if (key === 'data-gallery') return isGalleryValid ? [key, value] : null;
299
+ if (key.startsWith('data-')) return [key, value];
300
+ return null;
301
+ }
302
+
303
+ function parseInlineAttributes(attrsStr: string): ParsedAttrs {
266
304
  // Parse key=value pairs
267
- const attrRegex = /(\w+)=(?:'([^']*)'|"([^"]*)"|(\S+))/g;
268
- const result: {width: string; height: string; inline: string} = {
269
- width: '',
270
- height: '',
271
- inline: '',
272
- };
305
+ const attrRegex = /([\w-]+)=(?:'([^']*)'|"([^"]*)"|(\S+))/g;
306
+ const result: ParsedAttrs = {width: '', height: '', inline: '', dataAttrs: {}};
273
307
  let match;
274
308
 
275
309
  while ((match = attrRegex.exec(attrsStr)) !== null) {
276
310
  const key = match[1];
277
- const value = match[2] || match[3] || match[4];
278
-
279
- switch (key) {
280
- case 'width':
281
- case 'height':
282
- case 'inline':
283
- result[key] = value;
284
- break;
311
+ let value = match[2] || match[3] || match[4];
312
+
313
+ if (value?.endsWith('}')) {
314
+ value = value.slice(0, -1);
315
+ }
316
+
317
+ if (key === 'width' || key === 'height' || key === 'inline') {
318
+ result[key] = value;
319
+ continue;
320
+ }
321
+
322
+ const resolved = resolveDataAttr(key, value);
323
+ if (resolved) {
324
+ result.dataAttrs = result.dataAttrs || {};
325
+ result.dataAttrs[resolved[0]] = resolved[1];
285
326
  }
286
327
  }
287
328
  return result;
@@ -195,4 +195,5 @@ export type ImageOptions = {
195
195
  width: string | undefined | null;
196
196
  height: string | undefined | null;
197
197
  title: string | undefined | null;
198
+ dataAttrs?: Record<string, string>;
198
199
  };