@diplodoc/transform 4.64.2 → 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.
- package/dist/css/_yfm-only.css.map +1 -1
- package/dist/css/_yfm-only.min.css.map +1 -1
- package/dist/css/base.css.map +1 -1
- package/dist/css/base.min.css.map +1 -1
- package/dist/css/print.css.map +1 -1
- package/dist/css/yfm.css.map +1 -1
- package/dist/css/yfm.min.css.map +1 -1
- package/lib/md.js +6 -2
- package/lib/md.js.map +1 -1
- package/lib/plugins/images/index.d.ts +13 -3
- package/lib/plugins/images/index.js +68 -49
- package/lib/plugins/images/index.js.map +1 -1
- package/lib/typings.d.ts +11 -1
- package/lib/utils.d.ts +8 -0
- package/lib/utils.js +28 -2
- package/lib/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/transform/md.ts +5 -0
- package/src/transform/plugins/images/index.ts +111 -65
- package/src/transform/typings.ts +17 -1
- package/src/transform/utils.ts +38 -1
|
@@ -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(
|
|
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(
|
|
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)(
|
|
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
|
-
|
|
19
|
+
return publicSrc;
|
|
26
20
|
}
|
|
27
|
-
function
|
|
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
|
-
|
|
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
|
-
|
|
26
|
+
const path = file.replace(root, '');
|
|
27
|
+
log.error(`SVG ${path} from ${from} not found`);
|
|
39
28
|
if (notFoundCb) {
|
|
40
|
-
notFoundCb(path
|
|
29
|
+
notFoundCb(path);
|
|
41
30
|
}
|
|
42
|
-
return
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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 =
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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":";AAIA,+BAA+B;AAC/B,iCAA2B;AAC3B,+BAA8B;AAC9B,2BAAgC;AAEhC,2CAAgE;AAChE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transform/plugins/images/index.ts"],"names":[],"mappings":"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"}
|
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
|
|
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":";;;;;;AAEA,8CAAsB;AAEtB,SAAgB,UAAU,CAAC,GAAW;IAClC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAFD,gCAEC;AAED,SAAgB,eAAe,CAAC,MAAe,EAAE,EAAU;IACvD,IAAI,WAAW,GAAY,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,EACL,UAAU,EACV,KAAK,EACL,GAAG,CAAC;IACR,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,EAAE;YACzC,IAAI,UAAU,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE;gBAC1E,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;gBACZ,MAAM;aACT;iBAAM,IAAI,UAAU,CAAC,IAAI,KAAK,cAAc,EAAE;gBAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,GAAG,KAAK,UAAU,CAAC,GAAG,EAAE;oBAC/D,GAAG,GAAG,CAAC,CAAC;oBACR,MAAM;iBACT;qBAAM,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;oBAChC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;iBACvB;aACJ;SACJ;QAED,IACI,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC;YAClE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE;YAC1B,OAAO,KAAK,KAAK,WAAW,EAC9B;YACE,UAAU,GAAG,KAAK,CAAC;YACnB,KAAK,GAAG,CAAC,CAAC;SACb;QAED,CAAC,EAAE,CAAC;KACP;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QACtD,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;KAC1C;IAED,OAAO,WAAW,CAAC;AACvB,CAAC;AAxCD,0CAwCC;AAED,SAAgB,WAAW,CAAC,MAAe,EAAE,GAAW;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAEpC,IAAI,KAAK,GAAG,EAAE,EACV,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,WAAW,CAAC,QAAQ,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEtC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;YACvB,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;SAC1B;QAED,CAAC,EAAE,CAAC;KACP;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1D,KAAK,KAAL,KAAK,GAAK,WAAW,CAAC,OAAO,EAAC;IAE9B,OAAO;QACH,KAAK;QACL,KAAK;KACR,CAAC;AACN,CAAC;AAvBD,kCAuBC;AAED,SAAgB,cAAc,CAAC,IAAY;IACvC,OAAO,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/transform/utils.ts"],"names":[],"mappings":";;;;;;AAEA,8CAAsB;AAEtB,SAAgB,UAAU,CAAC,GAAW;IAClC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAFD,gCAEC;AAED,SAAgB,eAAe,CAAC,MAAe,EAAE,EAAU;IACvD,IAAI,WAAW,GAAY,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,EACL,UAAU,EACV,KAAK,EACL,GAAG,CAAC;IACR,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,EAAE;YACzC,IAAI,UAAU,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE;gBAC1E,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;gBACZ,MAAM;aACT;iBAAM,IAAI,UAAU,CAAC,IAAI,KAAK,cAAc,EAAE;gBAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,GAAG,KAAK,UAAU,CAAC,GAAG,EAAE;oBAC/D,GAAG,GAAG,CAAC,CAAC;oBACR,MAAM;iBACT;qBAAM,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;oBAChC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;iBACvB;aACJ;SACJ;QAED,IACI,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC;YAClE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE;YAC1B,OAAO,KAAK,KAAK,WAAW,EAC9B;YACE,UAAU,GAAG,KAAK,CAAC;YACnB,KAAK,GAAG,CAAC,CAAC;SACb;QAED,CAAC,EAAE,CAAC;KACP;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QACtD,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;KAC1C;IAED,OAAO,WAAW,CAAC;AACvB,CAAC;AAxCD,0CAwCC;AAED,SAAgB,WAAW,CAAC,MAAe,EAAE,GAAW;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAEpC,IAAI,KAAK,GAAG,EAAE,EACV,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,WAAW,CAAC,QAAQ,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEtC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;YACvB,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;SAC1B;QAED,CAAC,EAAE,CAAC;KACP;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1D,KAAK,KAAL,KAAK,GAAK,WAAW,CAAC,OAAO,EAAC;IAE9B,OAAO;QACH,KAAK;QACL,KAAK;KACR,CAAC;AACN,CAAC;AAvBD,kCAuBC;AAED,SAAgB,cAAc,CAAC,IAAY;IACvC,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1E,CAAC;AAFD,wCAEC;AAED,SAAgB,8BAA8B,CAAC,IAAyC;IACpF,MAAM,EAAC,IAAI,EAAE,WAAW,EAAC,GAAG,IAAI,CAAC;IAEjC,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;AAC5E,CAAC;AAJD,wEAIC;AAED,SAAgB,gBAAgB,CAAC,KAAY;IACzC,IAAI,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI;QACA,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;KAC1B;IAAC,OAAO,CAAC,EAAE,GAAE;IAEd,OAAO,IAAI,CAAC;AAChB,CAAC;AAPD,4CAOC;AAED,SAAgB,eAAe,CAAC,KAAY;IACxC,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI;QACA,yHAAyH;QACzH,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;KACxB;IAAC,OAAO,CAAC,EAAE,GAAE;IAEd,OAAO,GAAG,CAAC;AACf,CAAC;AARD,0CAQC;AAEY,QAAA,gBAAgB,GAAG,gBAAgB,CAAC;AAEjD,SAAgB,oBAAoB,CAAC,IAAY;;IAC7C,MAAM,MAAM,GAAG,aAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,aAAG,CAAC,MAAM,iCACV,MAAM,KACT,QAAQ,EAAE,MAAA,MAAM,CAAC,QAAQ,0CAAE,OAAO,CAAC,wBAAgB,EAAE,OAAO,CAAC,IAC/D,CAAC;IAEH,OAAO,IAAI,CAAC;AAChB,CAAC;AARD,oDAQC;AAOD,SAAgB,YAAY,CAAC,MAAe,EAAE,IAAY,EAAE,OAAoB;IAC5E,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;QAC3B,OAAO;KACV;IAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAChD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;YAC7B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAE9C,IAAI,YAAY,IAAI,CAAC,UAAU,EAAE;gBAC7B,SAAS,GAAG,IAAI,CAAC;aACpB;YAED,IAAI,CAAC,YAAY,IAAI,UAAU,EAAE;gBAC7B,SAAS,GAAG,KAAK,CAAC;aACrB;SACJ;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE;YACrB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,EAAC,SAAS,EAAE,KAAK,EAAC,CAAC,CAAC;YAClD,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,EAAE;gBACd,KAAK,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,IAAG,CAAC,CAAC;aAC7B;SACJ;KACJ;AACL,CAAC;AA9BD,oCA8BC"}
|
package/package.json
CHANGED
package/src/transform/md.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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(
|
|
28
|
+
state.md.assets?.push(imgSrc);
|
|
36
29
|
} else {
|
|
37
|
-
log.error(`Asset not found: ${bold(
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
54
|
+
const path = file.replace(root, '');
|
|
55
|
+
log.error(`SVG ${path} from ${from} not found`);
|
|
68
56
|
|
|
69
57
|
if (notFoundCb) {
|
|
70
|
-
notFoundCb(path
|
|
58
|
+
notFoundCb(path);
|
|
71
59
|
}
|
|
72
60
|
|
|
73
|
-
return
|
|
61
|
+
return null;
|
|
74
62
|
}
|
|
75
63
|
}
|
|
76
64
|
|
|
77
|
-
type Opts = SVGOpts &
|
|
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
|
-
|
|
87
|
-
if (
|
|
88
|
-
|
|
89
|
-
continue;
|
|
113
|
+
filterTokens(tokens, 'inline', (inline, {commented}) => {
|
|
114
|
+
if (commented || !inline.children) {
|
|
115
|
+
return;
|
|
90
116
|
}
|
|
91
117
|
|
|
92
|
-
const childrenTokens =
|
|
93
|
-
let j = 0;
|
|
118
|
+
const childrenTokens = inline.children || [];
|
|
94
119
|
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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
|
-
|
|
127
|
+
const imgSrc = getSrcTokenAttr(image);
|
|
128
|
+
if (isExternalHref(imgSrc)) {
|
|
129
|
+
return;
|
|
117
130
|
}
|
|
118
131
|
|
|
119
|
-
|
|
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
|
-
|
|
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
|
|
package/src/transform/typings.ts
CHANGED
|
@@ -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
|
};
|
package/src/transform/utils.ts
CHANGED
|
@@ -74,7 +74,7 @@ export function headingInfo(tokens: Token[], idx: number) {
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
export function isExternalHref(href: string) {
|
|
77
|
-
return
|
|
77
|
+
return /^(\w{1,10}:)?\/\//.test(href) || /^([+\w]{1,10}:)/.test(href);
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
export function transformLinkToOriginalArticle(opts: {root: string; currentPath: string}) {
|
|
@@ -113,3 +113,40 @@ export function defaultTransformLink(href: string) {
|
|
|
113
113
|
|
|
114
114
|
return href;
|
|
115
115
|
}
|
|
116
|
+
|
|
117
|
+
type TokenWalker = (
|
|
118
|
+
token: Token,
|
|
119
|
+
state: {commented: boolean; index: number},
|
|
120
|
+
) => void | undefined | {skip: number};
|
|
121
|
+
|
|
122
|
+
export function filterTokens(tokens: Token[], type: string, handler: TokenWalker) {
|
|
123
|
+
let commented = false;
|
|
124
|
+
|
|
125
|
+
if (!tokens || !tokens.length) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
for (let index = 0; index < tokens.length; index++) {
|
|
130
|
+
const token = tokens[index];
|
|
131
|
+
|
|
132
|
+
if (token.type === 'html_block') {
|
|
133
|
+
const commentStart = token.content.match('<!--');
|
|
134
|
+
const commentEnd = token.content.match('-->');
|
|
135
|
+
|
|
136
|
+
if (commentStart && !commentEnd) {
|
|
137
|
+
commented = true;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (!commentStart && commentEnd) {
|
|
141
|
+
commented = false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (token.type === type) {
|
|
146
|
+
const result = handler(token, {commented, index});
|
|
147
|
+
if (result?.skip) {
|
|
148
|
+
index += result?.skip - 1;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|