@diplodoc/transform 4.53.0 → 4.56.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 +12 -0
- package/dist/css/base.css.map +3 -3
- package/dist/css/base.min.css +1 -1
- package/dist/css/base.min.css.map +3 -3
- package/dist/css/print.css.map +1 -1
- package/dist/css/yfm.css +12 -0
- package/dist/css/yfm.css.map +3 -3
- package/dist/css/yfm.min.css +1 -1
- package/dist/css/yfm.min.css.map +3 -3
- package/dist/js/base.js +7 -1
- package/dist/js/base.js.map +2 -2
- package/dist/js/base.min.js +1 -1
- package/dist/js/base.min.js.map +3 -3
- package/dist/js/yfm.js +7 -1
- package/dist/js/yfm.js.map +2 -2
- package/dist/js/yfm.min.js +1 -1
- package/dist/js/yfm.min.js.map +3 -3
- package/lib/md.js +35 -4
- package/lib/md.js.map +1 -1
- package/lib/plugins/code.js +26 -1
- package/lib/plugins/code.js.map +1 -1
- package/lib/sanitize.d.ts +1 -0
- package/lib/sanitize.js +32 -2
- package/lib/sanitize.js.map +1 -1
- package/package.json +1 -1
- package/src/js/code.ts +13 -1
- package/src/scss/_common.scss +11 -0
- package/src/transform/md.ts +22 -4
- package/src/transform/plugins/code.ts +34 -1
- package/src/transform/sanitize.ts +34 -2
package/lib/plugins/code.js
CHANGED
|
@@ -52,10 +52,35 @@ function termReplace(str, env, escape) {
|
|
|
52
52
|
const termCode = str.replace(reg, (_match, p1, _p2, p3) => `<i class="yfm yfm-term_title" term-key=":${p3}" id="${(0, utils_1.generateID)()}">${p1}</i>`);
|
|
53
53
|
return termCode || str;
|
|
54
54
|
}
|
|
55
|
+
function addLineNumbers(code) {
|
|
56
|
+
const lines = code.split('\n');
|
|
57
|
+
const lineCount = lines.length;
|
|
58
|
+
const maxDigits = String(lineCount).length;
|
|
59
|
+
// Remove trailing empty line if it exists
|
|
60
|
+
const hasTrailingNewline = code.endsWith('\n');
|
|
61
|
+
const linesToProcess = hasTrailingNewline ? lines.slice(0, -1) : lines;
|
|
62
|
+
return (linesToProcess
|
|
63
|
+
.map((line, index) => {
|
|
64
|
+
const lineNumber = String(index + 1).padStart(maxDigits, ' ');
|
|
65
|
+
return `<span class="yfm-line-number">${lineNumber}</span>${line}`;
|
|
66
|
+
})
|
|
67
|
+
.join('\n') + (hasTrailingNewline ? '\n' : ''));
|
|
68
|
+
}
|
|
55
69
|
const code = (md) => {
|
|
56
70
|
const superCodeRenderer = md.renderer.rules.fence;
|
|
57
71
|
md.renderer.rules.fence = function (tokens, idx, options, env, self) {
|
|
58
|
-
const
|
|
72
|
+
const token = tokens[idx];
|
|
73
|
+
const showLineNumbers = token.info.includes('showLineNumbers');
|
|
74
|
+
let superCode = superCodeRenderer === null || superCodeRenderer === void 0 ? void 0 : superCodeRenderer(tokens, idx, options, env, self);
|
|
75
|
+
if (superCode && showLineNumbers) {
|
|
76
|
+
// Extract the code content from the pre/code tags
|
|
77
|
+
const codeMatch = superCode.match(/<pre[^>]*><code[^>]*>([\s\S]*?)<\/code><\/pre>/);
|
|
78
|
+
if (codeMatch) {
|
|
79
|
+
const codeContent = codeMatch[1];
|
|
80
|
+
const codeWithLineNumbers = addLineNumbers(codeContent);
|
|
81
|
+
superCode = superCode.replace(codeContent, codeWithLineNumbers);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
59
84
|
const superCodeWithTerms = superCode && (env === null || env === void 0 ? void 0 : env.terms) ? termReplace(superCode, env, md.utils.escapeRE) : superCode;
|
|
60
85
|
return wrapInClipboard(superCodeWithTerms, idx);
|
|
61
86
|
};
|
package/lib/plugins/code.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/transform/plugins/code.ts"],"names":[],"mappings":";AAAA,4BAA4B;AAG5B,mCAAmC;AAEnC,MAAM,eAAe,GAAG,CAAC,OAA2B,EAAE,EAAU,EAAE,EAAE;IAChE,OAAO;;UAED,OAAO;;yGAEwF,EAAE;;;;;;;;;;;;;gDAa3D,EAAE;;;;;;;;;4CASN,EAAE;;;;;mDAKK,EAAE;;;;;;;CAOpD,CAAC;AACF,CAAC,CAAC;AAQF,SAAS,WAAW,CAAC,GAAW,EAAE,GAAY,EAAE,MAA+B;IAC3E,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;SAClC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SACzB,GAAG,CAAC,MAAM,CAAC;SACX,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,MAAM,OAAO,GAAG,yBAAyB,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC/D,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAErC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CACxB,GAAG,EACH,CAAC,MAAc,EAAE,EAAU,EAAE,GAAW,EAAE,EAAU,EAAE,EAAE,CACpD,4CAA4C,EAAE,SAAS,IAAA,kBAAU,GAAE,KAAK,EAAE,MAAM,CACvF,CAAC;IAEF,OAAO,QAAQ,IAAI,GAAG,CAAC;AAC3B,CAAC;AAED,MAAM,IAAI,GAAuB,CAAC,EAAE,EAAE,EAAE;IACpC,MAAM,iBAAiB,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;IAClD,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI;QAC/D,MAAM,SAAS,GAAG,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAG,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/transform/plugins/code.ts"],"names":[],"mappings":"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"}
|
package/lib/sanitize.d.ts
CHANGED
|
@@ -9,5 +9,6 @@ export declare const defaultParseOptions: {
|
|
|
9
9
|
lowerCaseAttributeNames: boolean;
|
|
10
10
|
};
|
|
11
11
|
export declare const defaultOptions: SanitizeOptions;
|
|
12
|
+
export declare function sanitizeStyles(html: string, options: SanitizeOptions): string;
|
|
12
13
|
export declare function sanitize(html: string, options?: SanitizeOptions, additionalOptions?: SanitizeOptions): string;
|
|
13
14
|
export default sanitize;
|
package/lib/sanitize.js
CHANGED
|
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.sanitize = exports.defaultOptions = exports.defaultParseOptions = void 0;
|
|
29
|
+
exports.sanitize = exports.sanitizeStyles = exports.defaultOptions = exports.defaultParseOptions = void 0;
|
|
30
30
|
const sanitize_html_1 = __importDefault(require("sanitize-html"));
|
|
31
31
|
// @ts-ignore
|
|
32
32
|
const cssfilter_1 = __importDefault(require("cssfilter"));
|
|
@@ -195,6 +195,7 @@ const svgTags = [
|
|
|
195
195
|
'view',
|
|
196
196
|
'vkern',
|
|
197
197
|
'animate',
|
|
198
|
+
'use',
|
|
198
199
|
];
|
|
199
200
|
const htmlAttrs = [
|
|
200
201
|
'accept',
|
|
@@ -509,6 +510,32 @@ const defaultCssWhitelist = Object.assign(Object.assign({}, cssfilter_1.default.
|
|
|
509
510
|
const yfmHtmlAttrs = ['note-type', 'term-key'];
|
|
510
511
|
const allowedTags = Array.from(new Set([...htmlTags, ...svgTags, ...sanitize_html_1.default.defaults.allowedTags]));
|
|
511
512
|
const allowedAttributes = Array.from(new Set([...htmlAttrs, ...svgAttrs, ...yfmHtmlAttrs]));
|
|
513
|
+
// For hrefs within "use" only allow local links to ids that start with "#"
|
|
514
|
+
const useTagTransformer = (tagName, attribs) => {
|
|
515
|
+
const cleanHref = (href) => {
|
|
516
|
+
if (href.startsWith('#')) {
|
|
517
|
+
return href;
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
return null;
|
|
521
|
+
}
|
|
522
|
+
};
|
|
523
|
+
const cleanAttrs = (attrs) => {
|
|
524
|
+
const HREF_ATTRIBUTES = ['xlink:href', 'href'];
|
|
525
|
+
return Object.fromEntries(Object.entries(attrs)
|
|
526
|
+
.map(([key, value]) => {
|
|
527
|
+
if (HREF_ATTRIBUTES.includes(key)) {
|
|
528
|
+
return [key, cleanHref(value)];
|
|
529
|
+
}
|
|
530
|
+
return [key, value];
|
|
531
|
+
})
|
|
532
|
+
.filter(([_, value]) => value !== null));
|
|
533
|
+
};
|
|
534
|
+
return {
|
|
535
|
+
tagName,
|
|
536
|
+
attribs: cleanAttrs(attribs),
|
|
537
|
+
};
|
|
538
|
+
};
|
|
512
539
|
exports.defaultParseOptions = {
|
|
513
540
|
lowerCaseAttributeNames: false,
|
|
514
541
|
};
|
|
@@ -517,7 +544,9 @@ exports.defaultOptions = Object.assign(Object.assign({}, sanitize_html_1.default
|
|
|
517
544
|
'xlink:href',
|
|
518
545
|
'from',
|
|
519
546
|
'to',
|
|
520
|
-
], allowVulnerableTags: true, parser: exports.defaultParseOptions, cssWhiteList: defaultCssWhitelist
|
|
547
|
+
], allowVulnerableTags: true, parser: exports.defaultParseOptions, cssWhiteList: defaultCssWhitelist, transformTags: {
|
|
548
|
+
use: useTagTransformer,
|
|
549
|
+
} });
|
|
521
550
|
function sanitizeStyleTags(dom, cssWhiteList) {
|
|
522
551
|
const styleTags = dom('style');
|
|
523
552
|
styleTags.each((_index, element) => {
|
|
@@ -577,6 +606,7 @@ function sanitizeStyles(html, options) {
|
|
|
577
606
|
const content = $('body').html() || '';
|
|
578
607
|
return styles + content;
|
|
579
608
|
}
|
|
609
|
+
exports.sanitizeStyles = sanitizeStyles;
|
|
580
610
|
function sanitize(html, options, additionalOptions) {
|
|
581
611
|
var _a;
|
|
582
612
|
const sanitizeOptions = options || exports.defaultOptions;
|
package/lib/sanitize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/transform/sanitize.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/transform/sanitize.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kEAA4D;AAC5D,aAAa;AACb,0DAAkC;AAClC,iDAAmC;AACnC,8CAAsB;AAGtB,gDAAwB;AAQxB,MAAM,QAAQ,GAAG;IACb,GAAG;IACH,MAAM;IACN,SAAS;IACT,SAAS;IACT,MAAM;IACN,SAAS;IACT,OAAO;IACP,OAAO;IACP,GAAG;IACH,KAAK;IACL,KAAK;IACL,KAAK;IACL,OAAO;IACP,YAAY;IACZ,MAAM;IACN,IAAI;IACJ,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,MAAM;IACN,MAAM;IACN,KAAK;IACL,UAAU;IACV,SAAS;IACT,MAAM;IACN,UAAU;IACV,IAAI;IACJ,WAAW;IACX,KAAK;IACL,SAAS;IACT,KAAK;IACL,QAAQ;IACR,KAAK;IACL,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,SAAS;IACT,IAAI;IACJ,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,IAAI;IACJ,MAAM;IACN,GAAG;IACH,KAAK;IACL,OAAO;IACP,KAAK;IACL,KAAK;IACL,OAAO;IACP,QAAQ;IACR,IAAI;IACJ,MAAM;IACN,KAAK;IACL,MAAM;IACN,SAAS;IACT,MAAM;IACN,UAAU;IACV,OAAO;IACP,KAAK;IACL,MAAM;IACN,IAAI;IACJ,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,GAAG;IACH,SAAS;IACT,KAAK;IACL,UAAU;IACV,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,GAAG;IACH,MAAM;IACN,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,SAAS;IACT,KAAK;IACL,OAAO;IACP,OAAO;IACP,IAAI;IACJ,UAAU;IACV,UAAU;IACV,OAAO;IACP,IAAI;IACJ,OAAO;IACP,MAAM;IACN,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,KAAK;IACL,OAAO;IACP,KAAK;IACL,QAAQ;IACR,OAAO;CACV,CAAC;AAEF,MAAM,OAAO,GAAG;IACZ,KAAK;IACL,UAAU;IACV,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;IACf,kBAAkB;IAClB,QAAQ;IACR,UAAU;IACV,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,MAAM;IACN,GAAG;IACH,OAAO;IACP,UAAU;IACV,OAAO;IACP,OAAO;IACP,MAAM;IACN,gBAAgB;IAChB,QAAQ;IACR,MAAM;IACN,UAAU;IACV,OAAO;IACP,MAAM;IACN,SAAS;IACT,SAAS;IACT,UAAU;IACV,gBAAgB;IAChB,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,KAAK;CACR,CAAC;AAEF,MAAM,SAAS,GAAG;IACd,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,KAAK;IACL,gBAAgB;IAChB,cAAc;IACd,sBAAsB;IACtB,UAAU;IACV,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,SAAS;IACT,aAAa;IACb,aAAa;IACb,SAAS;IACT,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,SAAS;IACT,UAAU;IACV,cAAc;IACd,QAAQ;IACR,aAAa;IACb,UAAU;IACV,UAAU;IACV,SAAS;IACT,KAAK;IACL,UAAU;IACV,yBAAyB;IACzB,uBAAuB;IACvB,UAAU;IACV,WAAW;IACX,SAAS;IACT,cAAc;IACd,MAAM;IACN,KAAK;IACL,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,UAAU;IACV,IAAI;IACJ,WAAW;IACX,WAAW;IACX,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,KAAK;IACL,KAAK;IACL,WAAW;IACX,OAAO;IACP,QAAQ;IACR,KAAK;IACL,WAAW;IACX,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,MAAM;IACN,SAAS;IACT,SAAS;IACT,aAAa;IACb,aAAa;IACb,QAAQ;IACR,SAAS;IACT,SAAS;IACT,YAAY;IACZ,UAAU;IACV,KAAK;IACL,UAAU;IACV,KAAK;IACL,UAAU;IACV,MAAM;IACN,MAAM;IACN,SAAS;IACT,YAAY;IACZ,OAAO;IACP,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,SAAS;IACT,OAAO;IACP,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,SAAS;IACT,UAAU;IACV,OAAO;IACP,WAAW;IACX,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,aAAa;IACb,WAAW;IACX,OAAO;IACP,QAAQ;IACR,eAAe;IACf,aAAa;IACb,gBAAgB;IAChB,kBAAkB;IAClB,QAAQ;IACR,cAAc;CACjB,CAAC;AAEF,MAAM,QAAQ,GAAG;IACb,SAAS;IACT,eAAe;IACf,YAAY;IACZ,UAAU;IACV,oBAAoB;IACpB,QAAQ;IACR,eAAe;IACf,eAAe;IACf,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,OAAO;IACP,MAAM;IACN,IAAI;IACJ,OAAO;IACP,MAAM;IACN,eAAe;IACf,WAAW;IACX,WAAW;IACX,OAAO;IACP,qBAAqB;IACrB,6BAA6B;IAC7B,eAAe;IACf,iBAAiB;IACjB,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,iBAAiB;IACjB,WAAW;IACX,SAAS;IACT,SAAS;IACT,KAAK;IACL,UAAU;IACV,WAAW;IACX,KAAK;IACL,MAAM;IACN,cAAc;IACd,WAAW;IACX,QAAQ;IACR,aAAa;IACb,aAAa;IACb,eAAe;IACf,aAAa;IACb,WAAW;IACX,kBAAkB;IAClB,cAAc;IACd,YAAY;IACZ,cAAc;IACd,aAAa;IACb,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,YAAY;IACZ,UAAU;IACV,eAAe;IACf,mBAAmB;IACnB,QAAQ;IACR,MAAM;IACN,IAAI;IACJ,iBAAiB;IACjB,IAAI;IACJ,KAAK;IACL,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,SAAS;IACT,WAAW;IACX,YAAY;IACZ,UAAU;IACV,MAAM;IACN,cAAc;IACd,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,gBAAgB;IAChB,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,cAAc;IACd,aAAa;IACb,aAAa;IACb,kBAAkB;IAClB,WAAW;IACX,KAAK;IACL,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,KAAK;IACL,MAAM;IACN,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,SAAS;IACT,OAAO;IACP,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,UAAU;IACV,aAAa;IACb,MAAM;IACN,YAAY;IACZ,qBAAqB;IACrB,kBAAkB;IAClB,cAAc;IACd,QAAQ;IACR,eAAe;IACf,qBAAqB;IACrB,gBAAgB;IAChB,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,MAAM;IACN,aAAa;IACb,WAAW;IACX,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,cAAc;IACd,aAAa;IACb,cAAc;IACd,aAAa;IACb,YAAY;IACZ,cAAc;IACd,kBAAkB;IAClB,mBAAmB;IACnB,gBAAgB;IAChB,iBAAiB;IACjB,mBAAmB;IACnB,gBAAgB;IAChB,QAAQ;IACR,cAAc;IACd,OAAO;IACP,cAAc;IACd,gBAAgB;IAChB,UAAU;IACV,SAAS;IACT,SAAS;IACT,WAAW;IACX,aAAa;IACb,iBAAiB;IACjB,gBAAgB;IAChB,YAAY;IACZ,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,SAAS;IACT,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,SAAS;IACT,YAAY;IACZ,eAAe;IACf,eAAe;IACf,OAAO;IACP,cAAc;IACd,MAAM;IACN,cAAc;IACd,kBAAkB;IAClB,kBAAkB;IAClB,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,OAAO;IACP,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,YAAY;IACZ,MAAM;IACN,IAAI;IACJ,YAAY;IACZ,KAAK;CACR,CAAC;AAEF,MAAM,mBAAmB,mCAClB,mBAAS,CAAC,SAAS,KACtB,UAAU,EAAE,IAAI,GACnB,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAE/C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAC1B,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,GAAG,uBAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAC3E,CAAC;AACF,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,QAAQ,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;AAE5F,2EAA2E;AAC3E,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAE,OAAmB,EAAO,EAAE;IACpE,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;QAC/B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACtB,OAAO,IAAI,CAAC;SACf;aAAM;YACH,OAAO,IAAI,CAAC;SACf;IACL,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,KAAiB,EAAc,EAAE;QACjD,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,WAAW,CACrB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;aAChB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAClB,IAAI,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC/B,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;aAClC;YACD,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAC9C,CAAC;IACN,CAAC,CAAC;IACF,OAAO;QACH,OAAO;QACP,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;KAC/B,CAAC;AACN,CAAC,CAAC;AAOW,QAAA,mBAAmB,GAAG;IAC/B,uBAAuB,EAAE,KAAK;CACjC,CAAC;AAEW,QAAA,cAAc,mCACpB,uBAAY,CAAC,QAAQ,KACxB,WAAW,EACX,iBAAiB,kCACV,uBAAY,CAAC,QAAQ,CAAC,iBAAiB,KAC1C,GAAG,EAAE,iBAAiB,KAE1B,iCAAiC,EAAE;QAC/B,GAAG,uBAAY,CAAC,QAAQ,CAAC,iCAAiC;QAC1D,YAAY;QACZ,MAAM;QACN,IAAI;KACP,EACD,mBAAmB,EAAE,IAAI,EACzB,MAAM,EAAE,2BAAmB,EAC3B,YAAY,EAAE,mBAAmB,EACjC,aAAa,EAAE;QACX,GAAG,EAAE,iBAAiB;KACzB,IACH;AAEF,SAAS,iBAAiB,CAAC,GAAuB,EAAE,YAA0B;IAC1E,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAE/B,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAEtC,IAAI;YACA,MAAM,SAAS,GAAG,aAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAEvC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;gBACvB,OAAO;aACV;YAED,SAAS,CAAC,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAC1D,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAC3C,CAAC;YAEF,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAc,EAAE,EAAE;gBAClD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;oBACpB,OAAO;iBACV;gBAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,WAA4B,EAAE,EAAE;oBAC1E,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;wBAC7C,OAAO,KAAK,CAAC;qBAChB;oBAED,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAEzD,IAAI,aAAa,EAAE;wBACf,WAAW,CAAC,KAAK,GAAG,mBAAS,CAAC,aAAa,CACvC,WAAW,CAAC,QAAQ,EACpB,WAAW,CAAC,KAAK,CACpB,CAAC;qBACL;oBAED,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;wBACpB,OAAO,KAAK,CAAC;qBAChB;oBAED,OAAO,aAAa,CAAC;gBACzB,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;SAC/C;QAAC,OAAO,KAAK,EAAE;YACZ,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;YAEtB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;YACzE,aAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAC1B;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAuB,EAAE,YAA0B;IAC3E,MAAM,OAAO,GAAG;QACZ,SAAS,EAAE,YAAY;KAC1B,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,mBAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAEtD,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QAC9B,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAElD,IAAI,CAAC,cAAc,EAAE;YACjB,OAAO;SACV;QAED,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,cAAc,CAAC,IAAY,EAAE,OAAwB;IACjE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;IAEhD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7B,iBAAiB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IACnC,kBAAkB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAEpC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IAEvC,OAAO,MAAM,GAAG,OAAO,CAAC;AAC5B,CAAC;AAZD,wCAYC;AAED,SAAgB,QAAQ,CACpB,IAAY,EACZ,OAAyB,EACzB,iBAAmC;;IAEnC,MAAM,eAAe,GAAG,OAAO,IAAI,sBAAc,CAAC;IAElD,IAAI,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,YAAY,EAAE;QACjC,eAAe,CAAC,YAAY,mCACrB,eAAe,CAAC,YAAY,GAC5B,iBAAiB,CAAC,YAAY,CACpC,CAAC;KACL;IAED,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAA,eAAe,CAAC,qBAAqB,mCAAI,KAAK,CAAC,CAAC;IAE/E,MAAM,YAAY,GAAG,oBAAoB,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEzF,OAAO,IAAA,uBAAY,EAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AACvD,CAAC;AAnBD,4BAmBC;AAED,kBAAe,QAAQ,CAAC"}
|
package/package.json
CHANGED
package/src/js/code.ts
CHANGED
|
@@ -58,7 +58,19 @@ if (typeof document !== 'undefined') {
|
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
// Get all text nodes and filter out line numbers
|
|
62
|
+
const textContent = Array.from(code.childNodes)
|
|
63
|
+
.filter((node) => {
|
|
64
|
+
// Skip line number spans
|
|
65
|
+
if (node instanceof HTMLElement && node.classList.contains('yfm-line-number')) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return true;
|
|
69
|
+
})
|
|
70
|
+
.map((node) => node.textContent)
|
|
71
|
+
.join('');
|
|
72
|
+
|
|
73
|
+
copyToClipboard(textContent).then(() => {
|
|
62
74
|
notifySuccess(parent.querySelector('.yfm-clipboard-icon'));
|
|
63
75
|
});
|
|
64
76
|
});
|
package/src/scss/_common.scss
CHANGED
|
@@ -342,6 +342,10 @@
|
|
|
342
342
|
tab-size: var(--yfm-tab-size-code, inherit);
|
|
343
343
|
}
|
|
344
344
|
|
|
345
|
+
a code {
|
|
346
|
+
color: inherit;
|
|
347
|
+
}
|
|
348
|
+
|
|
345
349
|
pre {
|
|
346
350
|
word-wrap: normal;
|
|
347
351
|
}
|
|
@@ -370,6 +374,13 @@
|
|
|
370
374
|
color: var(--yfm-color-text);
|
|
371
375
|
|
|
372
376
|
white-space: pre;
|
|
377
|
+
|
|
378
|
+
.yfm-line-number {
|
|
379
|
+
display: inline-block;
|
|
380
|
+
padding-right: 1em;
|
|
381
|
+
color: var(--yfm-color-line-numbers, #666);
|
|
382
|
+
user-select: none;
|
|
383
|
+
}
|
|
373
384
|
}
|
|
374
385
|
|
|
375
386
|
sup,
|
package/src/transform/md.ts
CHANGED
|
@@ -10,7 +10,7 @@ import {log} from './log';
|
|
|
10
10
|
import makeHighlight from './highlight';
|
|
11
11
|
import extractTitle from './title';
|
|
12
12
|
import getHeadings from './headings';
|
|
13
|
-
import sanitizeHtml from './sanitize';
|
|
13
|
+
import sanitizeHtml, {defaultOptions, sanitizeStyles} from './sanitize';
|
|
14
14
|
import {olAttrConversion} from './plugins/ol-attr-conversion';
|
|
15
15
|
|
|
16
16
|
function initMarkdownIt(options: OptionsType) {
|
|
@@ -169,18 +169,36 @@ function initCompiler(md: MarkdownIt, options: OptionsType, env: EnvType) {
|
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
// Generate HTML
|
|
172
|
-
|
|
172
|
+
let html = md.renderer.render(tokens, md.options, env);
|
|
173
173
|
|
|
174
174
|
if (!needToSanitizeHtml) {
|
|
175
175
|
return html;
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
-
//
|
|
179
|
-
|
|
178
|
+
// If a custom sanitizer was used, we need to ensure styles are sanitized
|
|
179
|
+
// unless explicitly disabled via disableStyleSanitizer option
|
|
180
|
+
if (sanitize && !(sanitizeOptions?.disableStyleSanitizer ?? false)) {
|
|
181
|
+
const baseOptions = sanitizeOptions || defaultOptions;
|
|
182
|
+
|
|
183
|
+
const mergedOptions = {
|
|
184
|
+
...baseOptions,
|
|
185
|
+
cssWhiteList: {
|
|
186
|
+
...(defaultOptions.cssWhiteList || {}),
|
|
187
|
+
...(baseOptions.cssWhiteList || {}),
|
|
188
|
+
...(env.additionalOptionsCssWhiteList || {}),
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
html = sanitizeStyles(html, mergedOptions);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const sanitizedHtml = sanitize
|
|
180
196
|
? sanitize(html, sanitizeOptions)
|
|
181
197
|
: sanitizeHtml(html, sanitizeOptions, {
|
|
182
198
|
cssWhiteList: env.additionalOptionsCssWhiteList,
|
|
183
199
|
});
|
|
200
|
+
|
|
201
|
+
return sanitizedHtml;
|
|
184
202
|
};
|
|
185
203
|
}
|
|
186
204
|
|
|
@@ -68,10 +68,43 @@ function termReplace(str: string, env: EnvTerm, escape: (str: string) => string)
|
|
|
68
68
|
return termCode || str;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
function addLineNumbers(code: string): string {
|
|
72
|
+
const lines = code.split('\n');
|
|
73
|
+
const lineCount = lines.length;
|
|
74
|
+
const maxDigits = String(lineCount).length;
|
|
75
|
+
|
|
76
|
+
// Remove trailing empty line if it exists
|
|
77
|
+
const hasTrailingNewline = code.endsWith('\n');
|
|
78
|
+
const linesToProcess = hasTrailingNewline ? lines.slice(0, -1) : lines;
|
|
79
|
+
|
|
80
|
+
return (
|
|
81
|
+
linesToProcess
|
|
82
|
+
.map((line, index) => {
|
|
83
|
+
const lineNumber = String(index + 1).padStart(maxDigits, ' ');
|
|
84
|
+
return `<span class="yfm-line-number">${lineNumber}</span>${line}`;
|
|
85
|
+
})
|
|
86
|
+
.join('\n') + (hasTrailingNewline ? '\n' : '')
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
71
90
|
const code: MarkdownItPluginCb = (md) => {
|
|
72
91
|
const superCodeRenderer = md.renderer.rules.fence;
|
|
73
92
|
md.renderer.rules.fence = function (tokens, idx, options, env, self) {
|
|
74
|
-
const
|
|
93
|
+
const token = tokens[idx];
|
|
94
|
+
const showLineNumbers = token.info.includes('showLineNumbers');
|
|
95
|
+
|
|
96
|
+
let superCode = superCodeRenderer?.(tokens, idx, options, env, self);
|
|
97
|
+
|
|
98
|
+
if (superCode && showLineNumbers) {
|
|
99
|
+
// Extract the code content from the pre/code tags
|
|
100
|
+
const codeMatch = superCode.match(/<pre[^>]*><code[^>]*>([\s\S]*?)<\/code><\/pre>/);
|
|
101
|
+
if (codeMatch) {
|
|
102
|
+
const codeContent = codeMatch[1];
|
|
103
|
+
const codeWithLineNumbers = addLineNumbers(codeContent);
|
|
104
|
+
superCode = superCode.replace(codeContent, codeWithLineNumbers);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
75
108
|
const superCodeWithTerms =
|
|
76
109
|
superCode && env?.terms ? termReplace(superCode, env, md.utils.escapeRE) : superCode;
|
|
77
110
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import sanitizeHtml from 'sanitize-html';
|
|
1
|
+
import sanitizeHtml, {Attributes, Tag} from 'sanitize-html';
|
|
2
2
|
// @ts-ignore
|
|
3
3
|
import cssfilter from 'cssfilter';
|
|
4
4
|
import * as cheerio from 'cheerio';
|
|
@@ -176,6 +176,7 @@ const svgTags = [
|
|
|
176
176
|
'view',
|
|
177
177
|
'vkern',
|
|
178
178
|
'animate',
|
|
179
|
+
'use',
|
|
179
180
|
];
|
|
180
181
|
|
|
181
182
|
const htmlAttrs = [
|
|
@@ -501,6 +502,34 @@ const allowedTags = Array.from(
|
|
|
501
502
|
);
|
|
502
503
|
const allowedAttributes = Array.from(new Set([...htmlAttrs, ...svgAttrs, ...yfmHtmlAttrs]));
|
|
503
504
|
|
|
505
|
+
// For hrefs within "use" only allow local links to ids that start with "#"
|
|
506
|
+
const useTagTransformer = (tagName: string, attribs: Attributes): Tag => {
|
|
507
|
+
const cleanHref = (href: string) => {
|
|
508
|
+
if (href.startsWith('#')) {
|
|
509
|
+
return href;
|
|
510
|
+
} else {
|
|
511
|
+
return null;
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
const cleanAttrs = (attrs: Attributes): Attributes => {
|
|
515
|
+
const HREF_ATTRIBUTES = ['xlink:href', 'href'];
|
|
516
|
+
return Object.fromEntries(
|
|
517
|
+
Object.entries(attrs)
|
|
518
|
+
.map(([key, value]) => {
|
|
519
|
+
if (HREF_ATTRIBUTES.includes(key)) {
|
|
520
|
+
return [key, cleanHref(value)];
|
|
521
|
+
}
|
|
522
|
+
return [key, value];
|
|
523
|
+
})
|
|
524
|
+
.filter(([_, value]) => value !== null),
|
|
525
|
+
);
|
|
526
|
+
};
|
|
527
|
+
return {
|
|
528
|
+
tagName,
|
|
529
|
+
attribs: cleanAttrs(attribs),
|
|
530
|
+
};
|
|
531
|
+
};
|
|
532
|
+
|
|
504
533
|
export interface SanitizeOptions extends sanitizeHtml.IOptions {
|
|
505
534
|
cssWhiteList?: CssWhiteList;
|
|
506
535
|
disableStyleSanitizer?: boolean;
|
|
@@ -526,6 +555,9 @@ export const defaultOptions: SanitizeOptions = {
|
|
|
526
555
|
allowVulnerableTags: true,
|
|
527
556
|
parser: defaultParseOptions,
|
|
528
557
|
cssWhiteList: defaultCssWhitelist,
|
|
558
|
+
transformTags: {
|
|
559
|
+
use: useTagTransformer,
|
|
560
|
+
},
|
|
529
561
|
};
|
|
530
562
|
|
|
531
563
|
function sanitizeStyleTags(dom: cheerio.CheerioAPI, cssWhiteList: CssWhiteList) {
|
|
@@ -599,7 +631,7 @@ function sanitizeStyleAttrs(dom: cheerio.CheerioAPI, cssWhiteList: CssWhiteList)
|
|
|
599
631
|
});
|
|
600
632
|
}
|
|
601
633
|
|
|
602
|
-
function sanitizeStyles(html: string, options: SanitizeOptions) {
|
|
634
|
+
export function sanitizeStyles(html: string, options: SanitizeOptions) {
|
|
603
635
|
const cssWhiteList = options.cssWhiteList || {};
|
|
604
636
|
|
|
605
637
|
const $ = cheerio.load(html);
|