@diplodoc/transform 4.64.1 → 4.65.0

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.
@@ -6,77 +6,93 @@ const fs_1 = require("fs");
6
6
  const utilsFS_1 = require("../../utilsFS");
7
7
  const utils_1 = require("../../utils");
8
8
  const sanitizeAttribute = (value) => value.replace(/(\d*[%a-z]{0,5}).*/gi, '$1');
9
- function replaceImageSrc(token, state, { assetsPublicPath = path_1.sep, root = '', path: optsPath, log }) {
9
+ function replaceImageSrc(state, currentPath, path, imgSrc, { assetsPublicPath = path_1.sep, root = '', log }) {
10
10
  var _a;
11
- const src = (0, utils_1.getSrcTokenAttr)(token);
12
- const currentPath = state.env.path || optsPath;
13
- if (!(0, utils_1.isLocalUrl)(src)) {
14
- return;
15
- }
16
- const path = (0, utilsFS_1.resolveRelativePath)(currentPath, src);
17
11
  if ((0, utilsFS_1.isFileExists)(path)) {
18
- (_a = state.md.assets) === null || _a === void 0 ? void 0 : _a.push(src);
12
+ (_a = state.md.assets) === null || _a === void 0 ? void 0 : _a.push(imgSrc);
19
13
  }
20
14
  else {
21
- log.error(`Asset not found: ${(0, chalk_1.bold)(src)} in ${(0, chalk_1.bold)(currentPath)}`);
15
+ log.error(`Asset not found: ${(0, chalk_1.bold)(imgSrc)} in ${(0, chalk_1.bold)(currentPath)}`);
22
16
  }
23
17
  const relativeToRoot = path.replace(root + path_1.sep, '');
24
18
  const publicSrc = (0, path_1.join)(assetsPublicPath, relativeToRoot);
25
- token.attrSet('src', publicSrc);
19
+ return publicSrc;
26
20
  }
27
- function convertSvg(token, state, { path: optsPath, log, notFoundCb, root, imageOpts }) {
28
- const currentPath = state.env.path || optsPath;
29
- const path = (0, utilsFS_1.resolveRelativePath)(currentPath, (0, utils_1.getSrcTokenAttr)(token));
21
+ function getSvgContent(file, from, { rawContent, notFoundCb, log, root = '' }) {
30
22
  try {
31
- const raw = (0, fs_1.readFileSync)(path).toString();
32
- const content = raw === '' ? '' : replaceSvgContent(raw, imageOpts);
33
- const svgToken = new state.Token('image_svg', '', 0);
34
- svgToken.attrSet('content', content);
35
- return svgToken;
23
+ return rawContent(file);
36
24
  }
37
25
  catch (e) {
38
- log.error(`SVG ${path} from ${currentPath} not found`);
26
+ const path = file.replace(root, '');
27
+ log.error(`SVG ${path} from ${from} not found`);
39
28
  if (notFoundCb) {
40
- notFoundCb(path.replace(root, ''));
29
+ notFoundCb(path);
41
30
  }
42
- return token;
31
+ return null;
32
+ }
33
+ }
34
+ function shouldBeInlined(token, opts) {
35
+ var _a;
36
+ if (!((_a = token.attrGet('src')) === null || _a === void 0 ? void 0 : _a.endsWith('.svg'))) {
37
+ return false;
43
38
  }
39
+ const forceInlineSvg = token.attrGet('inline') === 'true';
40
+ const shouldInlineSvg = forceInlineSvg || (token.attrGet('inline') !== 'false' && opts.enabled !== false);
41
+ return shouldInlineSvg;
44
42
  }
43
+ const getRawFile = (path) => {
44
+ return (0, fs_1.readFileSync)(path, 'utf8').toString();
45
+ };
45
46
  const index = (md, opts) => {
47
+ const { rawContent = getRawFile, calcPath = utilsFS_1.resolveRelativePath, replaceImageSrc: replaceImage = replaceImageSrc, } = opts;
48
+ // TODO:goldserg need remove support opts.inlineSvg
49
+ if (opts.inlineSvg !== undefined) {
50
+ opts.svgInline = Object.assign(Object.assign({}, opts.svgInline), { enabled: opts.inlineSvg });
51
+ }
46
52
  md.assets = [];
47
53
  const plugin = (state) => {
48
54
  const tokens = state.tokens;
49
- let i = 0;
50
- while (i < tokens.length) {
51
- if (tokens[i].type !== 'inline') {
52
- i++;
53
- continue;
55
+ (0, utils_1.filterTokens)(tokens, 'inline', (inline, { commented }) => {
56
+ if (commented || !inline.children) {
57
+ return;
54
58
  }
55
- const childrenTokens = tokens[i].children || [];
56
- let j = 0;
57
- while (j < childrenTokens.length) {
58
- if (childrenTokens[j].type === 'image') {
59
- const didPatch = childrenTokens[j].attrGet('yfm_patched') || false;
60
- if (didPatch) {
61
- return;
62
- }
63
- const imgSrc = (0, utils_1.getSrcTokenAttr)(childrenTokens[j]);
64
- const shouldInlineSvg = (childrenTokens[j].attrGet('inline') === null
65
- ? opts.inlineSvg !== false
66
- : childrenTokens[j].attrGet('inline') === 'true') &&
67
- !(0, utils_1.isExternalHref)(imgSrc);
68
- if (imgSrc.endsWith('.svg') && shouldInlineSvg) {
69
- childrenTokens[j] = convertSvg(childrenTokens[j], state, opts);
70
- }
71
- else {
72
- replaceImageSrc(childrenTokens[j], state, opts);
59
+ const childrenTokens = inline.children || [];
60
+ (0, utils_1.filterTokens)(childrenTokens, 'image', (image, { commented, index }) => {
61
+ const didPatch = image.attrGet('yfm_patched') || false;
62
+ if (didPatch || commented) {
63
+ return;
64
+ }
65
+ const imgSrc = (0, utils_1.getSrcTokenAttr)(image);
66
+ if ((0, utils_1.isExternalHref)(imgSrc)) {
67
+ return;
68
+ }
69
+ const forceInlineSvg = image.attrGet('inline') === 'true';
70
+ const shouldInlineSvg = shouldBeInlined(image, opts.svgInline);
71
+ const imageOpts = {
72
+ width: image.attrGet('width'),
73
+ height: image.attrGet('height'),
74
+ };
75
+ const from = state.env.path || opts.path;
76
+ const file = calcPath(from, imgSrc);
77
+ if (shouldInlineSvg) {
78
+ const svgContent = getSvgContent(file, from, Object.assign(Object.assign({}, opts), { rawContent }));
79
+ if (svgContent) {
80
+ if (svgContent.length > opts.svgInline.maxFileSize && !forceInlineSvg) {
81
+ image.attrSet('YFM011', `Svg size: ${svgContent.length}; Config size: ${opts.svgInline.maxFileSize}; Src: ${(0, chalk_1.bold)(file)}`);
82
+ }
83
+ else {
84
+ const svgToken = new state.Token('image_svg', '', 0);
85
+ svgToken.attrSet('content', replaceSvgContent(svgContent, imageOpts));
86
+ childrenTokens[index] = svgToken;
87
+ }
73
88
  }
74
- childrenTokens[j].attrSet('yfm_patched', '1');
75
89
  }
76
- j++;
77
- }
78
- i++;
79
- }
90
+ if (childrenTokens[index].type === 'image') {
91
+ image.attrSet('src', replaceImage(state, from, file, imgSrc, opts));
92
+ image.attrSet('yfm_patched', '1');
93
+ }
94
+ });
95
+ });
80
96
  };
81
97
  try {
82
98
  md.core.ruler.before('includes', 'images', plugin);
@@ -91,6 +107,9 @@ const index = (md, opts) => {
91
107
  };
92
108
  function replaceSvgContent(content, options) {
93
109
  var _a;
110
+ if (!content) {
111
+ return '';
112
+ }
94
113
  // monoline
95
114
  content = content.replace(/>\r?\n</g, '><').replace(/\r?\n/g, ' ');
96
115
  // width, height
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transform/plugins/images/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transform/plugins/images/index.ts"],"names":[],"mappings":";AAIA,+BAA+B;AAC/B,iCAA2B;AAC3B,+BAA8B;AAC9B,2BAAgC;AAEhC,2CAAgE;AAChE,uCAA0E;AAE1E,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;AAOjG,SAAS,eAAe,CACpB,KAAgB,EAChB,WAAmB,EACnB,IAAY,EACZ,MAAc,EACd,EAAC,gBAAgB,GAAG,UAAG,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,EAAY;;IAEnD,IAAI,IAAA,sBAAY,EAAC,IAAI,CAAC,EAAE;QACpB,MAAA,KAAK,CAAC,EAAE,CAAC,MAAM,0CAAE,IAAI,CAAC,MAAM,CAAC,CAAC;KACjC;SAAM;QACH,GAAG,CAAC,KAAK,CAAC,oBAAoB,IAAA,YAAI,EAAC,MAAM,CAAC,OAAO,IAAA,YAAI,EAAC,WAAW,CAAC,EAAE,CAAC,CAAC;KACzE;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,UAAG,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;IAEzD,OAAO,SAAS,CAAC;AACrB,CAAC;AAaD,SAAS,aAAa,CAAC,IAAY,EAAE,IAAY,EAAE,EAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAO;IAC7F,IAAI;QACA,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;KAC3B;IAAC,OAAO,CAAU,EAAE;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpC,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,SAAS,IAAI,YAAY,CAAC,CAAC;QAEhD,IAAI,UAAU,EAAE;YACZ,UAAU,CAAC,IAAI,CAAC,CAAC;SACpB;QAED,OAAO,IAAI,CAAC;KACf;AACL,CAAC;AAgBD,SAAS,eAAe,CAAC,KAAY,EAAE,IAAmB;;IACtD,IAAI,CAAC,CAAA,MAAA,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,0CAAE,QAAQ,CAAC,MAAM,CAAC,CAAA,EAAE;QACzC,OAAO,KAAK,CAAC;KAChB;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC;IAC1D,MAAM,eAAe,GACjB,cAAc,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;IAEtF,OAAO,eAAe,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;IAChC,OAAO,IAAA,iBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,KAAK,GAA6B,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;IACjD,MAAM,EACF,UAAU,GAAG,UAAU,EACvB,QAAQ,GAAG,6BAAmB,EAC9B,eAAe,EAAE,YAAY,GAAG,eAAe,GAClD,GAAG,IAAI,CAAC;IACT,mDAAmD;IACnD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;QAC9B,IAAI,CAAC,SAAS,mCACP,IAAI,CAAC,SAAS,KACjB,OAAO,EAAE,IAAI,CAAC,SAAS,GAC1B,CAAC;KACL;IACD,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC;IAEf,MAAM,MAAM,GAAG,CAAC,KAAgB,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAE5B,IAAA,oBAAY,EAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAC,SAAS,EAAC,EAAE,EAAE;YACnD,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;gBAC/B,OAAO;aACV;YAED,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YAE7C,IAAA,oBAAY,EAAC,cAAc,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAC,SAAS,EAAE,KAAK,EAAC,EAAE,EAAE;gBAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC;gBAEvD,IAAI,QAAQ,IAAI,SAAS,EAAE;oBACvB,OAAO;iBACV;gBAED,MAAM,MAAM,GAAG,IAAA,uBAAe,EAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,IAAA,sBAAc,EAAC,MAAM,CAAC,EAAE;oBACxB,OAAO;iBACV;gBAED,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC;gBAC1D,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/D,MAAM,SAAS,GAAG;oBACd,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;oBAC7B,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;iBAClC,CAAC;gBAEF,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;gBACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAEpC,IAAI,eAAe,EAAE;oBACjB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,kCACpC,IAAI,KACP,UAAU,IACZ,CAAC;oBACH,IAAI,UAAU,EAAE;wBACZ,IAAI,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,CAAC,cAAc,EAAE;4BACnE,KAAK,CAAC,OAAO,CACT,QAAQ,EACR,aAAa,UAAU,CAAC,MAAM,kBAAkB,IAAI,CAAC,SAAS,CAAC,WAAW,UAAU,IAAA,YAAI,EAAC,IAAI,CAAC,EAAE,CACnG,CAAC;yBACL;6BAAM;4BACH,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;4BACrD,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;4BACtE,cAAc,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;yBACpC;qBACJ;iBACJ;gBAED,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE;oBACxC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;oBACpE,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;iBACrC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,IAAI;QACA,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;KACtD;IAAC,OAAO,CAAC,EAAE;QACR,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;KACxC;IAED,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5B,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC,CAAC;AACN,CAAC,CAAC;AAEF,SAAS,iBAAiB,CAAC,OAAsB,EAAE,OAAqB;;IACpE,IAAI,CAAC,OAAO,EAAE;QACV,OAAO,EAAE,CAAC;KACb;IACD,WAAW;IACX,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAEnE,gBAAgB;IAChB,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;IAE1D,MAAM,EAAC,KAAK,EAAE,MAAM,EAAC,GAAG,CAAA,MAAA,OAAO;SAC1B,KAAK,CAAC,uCAAuC,CAAC,0CAC7C,MAAM,CAAC,CAAC,GAA4B,EAAE,GAAG,EAAE,EAAE;QAC3C,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACjB,OAAO,GAAG,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,KAAI,EAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAC,CAAC;IAEpD,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE;QACzB,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnE,OAAO,GAAG,GAAG,OAAO,WAAW,cAAc,GAAG,CAAC;KACpD;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE;QAC3B,MAAM,eAAe,GAAG,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrE,OAAO,GAAG,GAAG,OAAO,YAAY,eAAe,GAAG,CAAC;KACtD;IACD,IAAI,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;QAC1D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,OAAO,GAAG,CAAC,CAAC;KACnE;IAED,gBAAgB;IAChB,OAAO,GAAG,IAAA,eAAQ,EAAC,OAAO,EAAE;QACxB,OAAO,EAAE;YACL;gBACI,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE;oBACJ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7D,gBAAgB,EAAE,KAAK;iBAC1B;aACJ;SACJ;KACJ,CAAC,CAAC,IAAI,CAAC;IAER,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,4FAA4F;AAC5F,MAAM,YAAY,GAAiE,MAAM,CAAC,MAAM,CAC5F,KAAK,EACL;IACI,iBAAiB;CACpB,CACJ,CAAC;AAEF,iBAAS,YAAY,CAAC"}
package/lib/typings.d.ts CHANGED
@@ -65,6 +65,13 @@ export interface OptionsType {
65
65
  useCommonAnchorButtons?: boolean;
66
66
  lang?: Lang;
67
67
  [x: string]: unknown;
68
+ svgInline?: {
69
+ enabled: boolean;
70
+ maxFileSize: number;
71
+ };
72
+ rawContent?: (path: string, assets: Record<string, string | boolean>) => string | boolean;
73
+ calcPath?: (root: string, path: string) => string;
74
+ replaceImageSrc?: (state: StateCore, currentPath: string, path: string, imgSrc: string, opts: unknown) => string;
68
75
  }
69
76
  export interface OutputType {
70
77
  result: {
@@ -93,6 +100,10 @@ export interface MarkdownItPluginOpts {
93
100
  extractTitle?: boolean;
94
101
  disableLiquid?: boolean;
95
102
  skipLinkFileCheck?: boolean;
103
+ svgInline?: {
104
+ enabled: boolean;
105
+ maxFileSize: number;
106
+ };
96
107
  }
97
108
  export declare type MarkdownItPluginCb<T extends {} = {}> = {
98
109
  (md: MarkdownIt, opts: T & MarkdownItPluginOpts): void;
@@ -112,5 +123,4 @@ export declare type CssWhiteList = {
112
123
  export declare type ImageOptions = {
113
124
  width: string | undefined | null;
114
125
  height: string | undefined | null;
115
- inline: boolean | undefined | null;
116
126
  };
package/lib/utils.d.ts CHANGED
@@ -14,3 +14,11 @@ export declare function getHrefTokenAttr(token: Token): string;
14
14
  export declare function getSrcTokenAttr(token: Token): string;
15
15
  export declare const PAGE_LINK_REGEXP: RegExp;
16
16
  export declare function defaultTransformLink(href: string): string;
17
+ declare type TokenWalker = (token: Token, state: {
18
+ commented: boolean;
19
+ index: number;
20
+ }) => void | undefined | {
21
+ skip: number;
22
+ };
23
+ export declare function filterTokens(tokens: Token[], type: string, handler: TokenWalker): void;
24
+ export {};
package/lib/utils.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.defaultTransformLink = exports.PAGE_LINK_REGEXP = exports.getSrcTokenAttr = exports.getHrefTokenAttr = exports.transformLinkToOriginalArticle = exports.isExternalHref = exports.headingInfo = exports.findBlockTokens = exports.isLocalUrl = void 0;
6
+ exports.filterTokens = exports.defaultTransformLink = exports.PAGE_LINK_REGEXP = exports.getSrcTokenAttr = exports.getHrefTokenAttr = exports.transformLinkToOriginalArticle = exports.isExternalHref = exports.headingInfo = exports.findBlockTokens = exports.isLocalUrl = void 0;
7
7
  const url_1 = __importDefault(require("url"));
8
8
  function isLocalUrl(url) {
9
9
  return !/^(?:[a-z]+:)?\/\//i.test(url);
@@ -63,7 +63,7 @@ function headingInfo(tokens, idx) {
63
63
  }
64
64
  exports.headingInfo = headingInfo;
65
65
  function isExternalHref(href) {
66
- return href.startsWith('http') || href.startsWith('//');
66
+ return /^(\w{1,10}:)?\/\//.test(href) || /^([+\w]{1,10}:)/.test(href);
67
67
  }
68
68
  exports.isExternalHref = isExternalHref;
69
69
  function transformLinkToOriginalArticle(opts) {
@@ -98,4 +98,30 @@ function defaultTransformLink(href) {
98
98
  return href;
99
99
  }
100
100
  exports.defaultTransformLink = defaultTransformLink;
101
+ function filterTokens(tokens, type, handler) {
102
+ let commented = false;
103
+ if (!tokens || !tokens.length) {
104
+ return;
105
+ }
106
+ for (let index = 0; index < tokens.length; index++) {
107
+ const token = tokens[index];
108
+ if (token.type === 'html_block') {
109
+ const commentStart = token.content.match('<!--');
110
+ const commentEnd = token.content.match('-->');
111
+ if (commentStart && !commentEnd) {
112
+ commented = true;
113
+ }
114
+ if (!commentStart && commentEnd) {
115
+ commented = false;
116
+ }
117
+ }
118
+ if (token.type === type) {
119
+ const result = handler(token, { commented, index });
120
+ if (result === null || result === void 0 ? void 0 : result.skip) {
121
+ index += (result === null || result === void 0 ? void 0 : result.skip) - 1;
122
+ }
123
+ }
124
+ }
125
+ }
126
+ exports.filterTokens = filterTokens;
101
127
  //# sourceMappingURL=utils.js.map
package/lib/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/transform/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/transform/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diplodoc/transform",
3
- "version": "4.64.1",
3
+ "version": "4.65.0",
4
4
  "description": "A simple transformer of text in YFM (Yandex Flavored Markdown) to HTML",
5
5
  "keywords": [
6
6
  "markdown",
@@ -12,6 +12,9 @@
12
12
  "tools",
13
13
  "generator"
14
14
  ],
15
+ "engines": {
16
+ "npm": ">=11.5.1"
17
+ },
15
18
  "homepage": "https://github.com/diplodoc-platform/transform#readme",
16
19
  "bugs": {
17
20
  "url": "https://github.com/diplodoc-platform/transform/issues"
@@ -20,7 +20,10 @@ export = function makeHighlight(langs: HighlightLangMap = {}) {
20
20
  classNames.push(lang);
21
21
 
22
22
  try {
23
- highlightedStr = hljs.highlight(lang, str, true).value;
23
+ highlightedStr = hljs.highlight(str, {
24
+ language: lang,
25
+ ignoreIllegals: true,
26
+ }).value;
24
27
  } catch (_) {}
25
28
  }
26
29
 
@@ -76,6 +76,10 @@ function getPluginOptions(options: OptionsType) {
76
76
  conditionsInCode = false,
77
77
  disableLiquid = false,
78
78
  lang = DEFAULT_LANG,
79
+ svgInline = {
80
+ enabled: true,
81
+ maxFileSize: 2 * 1024 * 1024,
82
+ },
79
83
  ...customOptions
80
84
  } = options;
81
85
 
@@ -88,6 +92,7 @@ function getPluginOptions(options: OptionsType) {
88
92
  disableLiquid,
89
93
  log,
90
94
  lang,
95
+ svgInline,
91
96
  } as MarkdownItPluginOpts;
92
97
  }
93
98
 
@@ -8,7 +8,7 @@ import {optimize} from 'svgo';
8
8
  import {readFileSync} from 'fs';
9
9
 
10
10
  import {isFileExists, resolveRelativePath} from '../../utilsFS';
11
- import {getSrcTokenAttr, isExternalHref, isLocalUrl} from '../../utils';
11
+ import {filterTokens, getSrcTokenAttr, isExternalHref} from '../../utils';
12
12
 
13
13
  const sanitizeAttribute = (value: string): string => value.replace(/(\d*[%a-z]{0,5}).*/gi, '$1');
14
14
 
@@ -18,109 +18,152 @@ interface ImageOpts extends MarkdownItPluginOpts {
18
18
  }
19
19
 
20
20
  function replaceImageSrc(
21
- token: Token,
22
21
  state: StateCore,
23
- {assetsPublicPath = sep, root = '', path: optsPath, log}: ImageOpts,
22
+ currentPath: string,
23
+ path: string,
24
+ imgSrc: string,
25
+ {assetsPublicPath = sep, root = '', log}: ImageOpts,
24
26
  ) {
25
- const src = getSrcTokenAttr(token);
26
- const currentPath = state.env.path || optsPath;
27
-
28
- if (!isLocalUrl(src)) {
29
- return;
30
- }
31
-
32
- const path = resolveRelativePath(currentPath, src);
33
-
34
27
  if (isFileExists(path)) {
35
- state.md.assets?.push(src);
28
+ state.md.assets?.push(imgSrc);
36
29
  } else {
37
- log.error(`Asset not found: ${bold(src)} in ${bold(currentPath)}`);
30
+ log.error(`Asset not found: ${bold(imgSrc)} in ${bold(currentPath)}`);
38
31
  }
39
32
 
40
33
  const relativeToRoot = path.replace(root + sep, '');
41
34
  const publicSrc = join(assetsPublicPath, relativeToRoot);
42
35
 
43
- token.attrSet('src', publicSrc);
36
+ return publicSrc;
37
+ }
38
+
39
+ interface InlineOptions {
40
+ enabled: boolean;
41
+ maxFileSize: number;
44
42
  }
45
43
 
46
44
  interface SVGOpts extends MarkdownItPluginOpts {
47
45
  notFoundCb: (s: string) => void;
48
46
  imageOpts: ImageOptions;
47
+ svgInline: InlineOptions;
49
48
  }
50
49
 
51
- function convertSvg(
52
- token: Token,
53
- state: StateCore,
54
- {path: optsPath, log, notFoundCb, root, imageOpts}: SVGOpts,
55
- ) {
56
- const currentPath = state.env.path || optsPath;
57
- const path = resolveRelativePath(currentPath, getSrcTokenAttr(token));
58
-
50
+ function getSvgContent(file: string, from: string, {rawContent, notFoundCb, log, root = ''}: Opts) {
59
51
  try {
60
- const raw = readFileSync(path).toString();
61
- const content = raw === '' ? '' : replaceSvgContent(raw, imageOpts);
62
- const svgToken = new state.Token('image_svg', '', 0);
63
- svgToken.attrSet('content', content);
64
-
65
- return svgToken;
52
+ return rawContent(file);
66
53
  } catch (e: unknown) {
67
- log.error(`SVG ${path} from ${currentPath} not found`);
54
+ const path = file.replace(root, '');
55
+ log.error(`SVG ${path} from ${from} not found`);
68
56
 
69
57
  if (notFoundCb) {
70
- notFoundCb(path.replace(root, ''));
58
+ notFoundCb(path);
71
59
  }
72
60
 
73
- return token;
61
+ return null;
74
62
  }
75
63
  }
76
64
 
77
- type Opts = SVGOpts & ImageOpts;
65
+ type Opts = SVGOpts &
66
+ ImageOpts & {
67
+ rawContent: (path: string) => string;
68
+ calcPath: (root: string, path: string) => string;
69
+ replaceImageSrc: (
70
+ state: StateCore,
71
+ currentPath: string,
72
+ path: string,
73
+ imgSrc: string,
74
+ opts: ImageOpts,
75
+ ) => string;
76
+ file: string;
77
+ };
78
+
79
+ function shouldBeInlined(token: Token, opts: InlineOptions) {
80
+ if (!token.attrGet('src')?.endsWith('.svg')) {
81
+ return false;
82
+ }
83
+
84
+ const forceInlineSvg = token.attrGet('inline') === 'true';
85
+ const shouldInlineSvg =
86
+ forceInlineSvg || (token.attrGet('inline') !== 'false' && opts.enabled !== false);
87
+
88
+ return shouldInlineSvg;
89
+ }
90
+
91
+ const getRawFile = (path: string) => {
92
+ return readFileSync(path, 'utf8').toString();
93
+ };
78
94
 
79
95
  const index: MarkdownItPluginCb<Opts> = (md, opts) => {
96
+ const {
97
+ rawContent = getRawFile,
98
+ calcPath = resolveRelativePath,
99
+ replaceImageSrc: replaceImage = replaceImageSrc,
100
+ } = opts;
101
+ // TODO:goldserg need remove support opts.inlineSvg
102
+ if (opts.inlineSvg !== undefined) {
103
+ opts.svgInline = {
104
+ ...opts.svgInline,
105
+ enabled: opts.inlineSvg,
106
+ };
107
+ }
80
108
  md.assets = [];
81
109
 
82
110
  const plugin = (state: StateCore) => {
83
111
  const tokens = state.tokens;
84
- let i = 0;
85
112
 
86
- while (i < tokens.length) {
87
- if (tokens[i].type !== 'inline') {
88
- i++;
89
- continue;
113
+ filterTokens(tokens, 'inline', (inline, {commented}) => {
114
+ if (commented || !inline.children) {
115
+ return;
90
116
  }
91
117
 
92
- const childrenTokens = tokens[i].children || [];
93
- let j = 0;
118
+ const childrenTokens = inline.children || [];
94
119
 
95
- while (j < childrenTokens.length) {
96
- if (childrenTokens[j].type === 'image') {
97
- const didPatch = childrenTokens[j].attrGet('yfm_patched') || false;
120
+ filterTokens(childrenTokens, 'image', (image, {commented, index}) => {
121
+ const didPatch = image.attrGet('yfm_patched') || false;
98
122
 
99
- if (didPatch) {
100
- return;
101
- }
102
-
103
- const imgSrc = getSrcTokenAttr(childrenTokens[j]);
104
- const shouldInlineSvg =
105
- (childrenTokens[j].attrGet('inline') === null
106
- ? opts.inlineSvg !== false
107
- : childrenTokens[j].attrGet('inline') === 'true') &&
108
- !isExternalHref(imgSrc);
109
-
110
- if (imgSrc.endsWith('.svg') && shouldInlineSvg) {
111
- childrenTokens[j] = convertSvg(childrenTokens[j], state, opts);
112
- } else {
113
- replaceImageSrc(childrenTokens[j], state, opts);
114
- }
123
+ if (didPatch || commented) {
124
+ return;
125
+ }
115
126
 
116
- childrenTokens[j].attrSet('yfm_patched', '1');
127
+ const imgSrc = getSrcTokenAttr(image);
128
+ if (isExternalHref(imgSrc)) {
129
+ return;
117
130
  }
118
131
 
119
- j++;
120
- }
132
+ const forceInlineSvg = image.attrGet('inline') === 'true';
133
+ const shouldInlineSvg = shouldBeInlined(image, opts.svgInline);
134
+ const imageOpts = {
135
+ width: image.attrGet('width'),
136
+ height: image.attrGet('height'),
137
+ };
138
+
139
+ const from = state.env.path || opts.path;
140
+ const file = calcPath(from, imgSrc);
141
+
142
+ if (shouldInlineSvg) {
143
+ const svgContent = getSvgContent(file, from, {
144
+ ...opts,
145
+ rawContent,
146
+ });
147
+ if (svgContent) {
148
+ if (svgContent.length > opts.svgInline.maxFileSize && !forceInlineSvg) {
149
+ image.attrSet(
150
+ 'YFM011',
151
+ `Svg size: ${svgContent.length}; Config size: ${opts.svgInline.maxFileSize}; Src: ${bold(file)}`,
152
+ );
153
+ } else {
154
+ const svgToken = new state.Token('image_svg', '', 0);
155
+ svgToken.attrSet('content', replaceSvgContent(svgContent, imageOpts));
156
+ childrenTokens[index] = svgToken;
157
+ }
158
+ }
159
+ }
121
160
 
122
- i++;
123
- }
161
+ if (childrenTokens[index].type === 'image') {
162
+ image.attrSet('src', replaceImage(state, from, file, imgSrc, opts));
163
+ image.attrSet('yfm_patched', '1');
164
+ }
165
+ });
166
+ });
124
167
  };
125
168
 
126
169
  try {
@@ -136,7 +179,10 @@ const index: MarkdownItPluginCb<Opts> = (md, opts) => {
136
179
  };
137
180
  };
138
181
 
139
- function replaceSvgContent(content: string, options: ImageOptions) {
182
+ function replaceSvgContent(content: string | null, options: ImageOptions) {
183
+ if (!content) {
184
+ return '';
185
+ }
140
186
  // monoline
141
187
  content = content.replace(/>\r?\n</g, '><').replace(/\r?\n/g, ' ');
142
188
 
@@ -90,6 +90,19 @@ export interface OptionsType {
90
90
  useCommonAnchorButtons?: boolean;
91
91
  lang?: Lang;
92
92
  [x: string]: unknown;
93
+ svgInline?: {
94
+ enabled: boolean;
95
+ maxFileSize: number;
96
+ };
97
+ rawContent?: (path: string, assets: Record<string, string | boolean>) => string | boolean;
98
+ calcPath?: (root: string, path: string) => string;
99
+ replaceImageSrc?: (
100
+ state: StateCore,
101
+ currentPath: string,
102
+ path: string,
103
+ imgSrc: string,
104
+ opts: unknown,
105
+ ) => string;
93
106
  }
94
107
 
95
108
  export interface OutputType {
@@ -121,6 +134,10 @@ export interface MarkdownItPluginOpts {
121
134
  extractTitle?: boolean;
122
135
  disableLiquid?: boolean;
123
136
  skipLinkFileCheck?: boolean;
137
+ svgInline?: {
138
+ enabled: boolean;
139
+ maxFileSize: number;
140
+ };
124
141
  }
125
142
 
126
143
  export type MarkdownItPluginCb<T extends {} = {}> = {
@@ -151,5 +168,4 @@ export type CssWhiteList = {[property: string]: boolean};
151
168
  export type ImageOptions = {
152
169
  width: string | undefined | null;
153
170
  height: string | undefined | null;
154
- inline: boolean | undefined | null;
155
171
  };