@difizen/libro-markdown 0.2.25 → 0.2.26
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/es/config-contribution.d.ts +5 -0
- package/es/config-contribution.d.ts.map +1 -0
- package/es/config-contribution.js +24 -0
- package/es/config.d.ts +6 -0
- package/es/config.d.ts.map +1 -0
- package/es/config.js +14 -0
- package/es/markdown-render.d.ts +2 -0
- package/es/markdown-render.d.ts.map +1 -1
- package/es/markdown-render.js +44 -4
- package/es/module.d.ts.map +1 -1
- package/es/module.js +2 -1
- package/package.json +2 -1
- package/src/config-contribution.ts +11 -0
- package/src/config.ts +17 -0
- package/src/markdown-render.ts +51 -1
- package/src/module.ts +2 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ConfigurationContribution } from '@difizen/mana-app';
|
|
2
|
+
export declare class LibroMarkdownSettingContribution implements ConfigurationContribution {
|
|
3
|
+
registerConfigurations(): import("@difizen/mana-app").ConfigurationNode<boolean>[];
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=config-contribution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-contribution.d.ts","sourceRoot":"","sources":["../src/config-contribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAK9D,qBACa,gCAAiC,YAAW,yBAAyB;IAChF,sBAAsB;CAGvB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
var _dec, _class;
|
|
3
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
4
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
5
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
6
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
7
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
8
|
+
import { ConfigurationContribution } from '@difizen/mana-app';
|
|
9
|
+
import { singleton } from '@difizen/mana-app';
|
|
10
|
+
import { LibroMarkdownConfiguration } from "./config.js";
|
|
11
|
+
export var LibroMarkdownSettingContribution = (_dec = singleton({
|
|
12
|
+
contrib: ConfigurationContribution
|
|
13
|
+
}), _dec(_class = /*#__PURE__*/function () {
|
|
14
|
+
function LibroMarkdownSettingContribution() {
|
|
15
|
+
_classCallCheck(this, LibroMarkdownSettingContribution);
|
|
16
|
+
}
|
|
17
|
+
_createClass(LibroMarkdownSettingContribution, [{
|
|
18
|
+
key: "registerConfigurations",
|
|
19
|
+
value: function registerConfigurations() {
|
|
20
|
+
return [LibroMarkdownConfiguration.TargetToBlank];
|
|
21
|
+
}
|
|
22
|
+
}]);
|
|
23
|
+
return LibroMarkdownSettingContribution;
|
|
24
|
+
}()) || _class);
|
package/es/config.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ConfigurationNode } from '@difizen/mana-app';
|
|
2
|
+
export declare const LibroConfigLinkTargetToBlank: ConfigurationNode<boolean>;
|
|
3
|
+
export declare const LibroMarkdownConfiguration: {
|
|
4
|
+
TargetToBlank: ConfigurationNode<boolean>;
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,eAAO,MAAM,4BAA4B,EAAE,iBAAiB,CAAC,OAAO,CASnE,CAAC;AAEF,eAAO,MAAM,0BAA0B;;CAEtC,CAAC"}
|
package/es/config.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { l10n } from '@difizen/mana-l10n';
|
|
2
|
+
export var LibroConfigLinkTargetToBlank = {
|
|
3
|
+
id: 'libro.markdown.link.target.to.blank',
|
|
4
|
+
description: l10n.t('markdown的a标签是否另起一页'),
|
|
5
|
+
title: 'a标签另起一页',
|
|
6
|
+
type: 'checkbox',
|
|
7
|
+
defaultValue: true,
|
|
8
|
+
schema: {
|
|
9
|
+
type: 'boolean'
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
export var LibroMarkdownConfiguration = {
|
|
13
|
+
TargetToBlank: LibroConfigLinkTargetToBlank
|
|
14
|
+
};
|
package/es/markdown-render.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ConfigurationService } from '@difizen/mana-app';
|
|
1
2
|
import MarkdownIt from 'markdown-it';
|
|
2
3
|
import type { MarkdownRenderOption } from './markdown-protocol.js';
|
|
3
4
|
import { MarkdownParser } from './markdown-protocol.js';
|
|
@@ -6,6 +7,7 @@ export declare class MarkdownRender implements MarkdownParser {
|
|
|
6
7
|
protected mkt: MarkdownIt;
|
|
7
8
|
slugify: (s: string) => string;
|
|
8
9
|
enablePermalink: boolean;
|
|
10
|
+
protected configurationService: ConfigurationService;
|
|
9
11
|
init(): void;
|
|
10
12
|
render(markdownText: string, options?: MarkdownRenderOption): string;
|
|
11
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-render.d.ts","sourceRoot":"","sources":["../src/markdown-render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"markdown-render.d.ts","sourceRoot":"","sources":["../src/markdown-render.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EAIrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,UAAU,MAAM,aAAa,CAAC;AAIrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,0BAA0B,CAAC;AAElC,qBACa,cAAe,YAAW,cAAc;IACnD,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC;IAC1B,OAAO,wBAAW;IAClB,eAAe,UAAS;IACM,SAAS,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;IAGnF,IAAI;IAyDJ,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM;CAIrE"}
|
package/es/markdown-render.js
CHANGED
|
@@ -1,28 +1,33 @@
|
|
|
1
1
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
-
var _dec, _dec2, _class, _class2;
|
|
2
|
+
var _dec, _dec2, _dec3, _class, _class2, _descriptor;
|
|
3
|
+
function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
|
|
3
4
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
4
5
|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
5
6
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
6
7
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
7
8
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
8
9
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
9
|
-
|
|
10
|
+
function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'transform-class-properties is enabled and runs after the decorators transform.'); }
|
|
11
|
+
import { ConfigurationService, inject, postConstruct, singleton } from '@difizen/mana-app';
|
|
10
12
|
import latexPlugin from '@traptitech/markdown-it-katex';
|
|
11
13
|
import MarkdownIt from 'markdown-it';
|
|
12
14
|
import { libroAnchor, linkInsideHeader, slugify } from "./anchor.js";
|
|
15
|
+
import { LibroMarkdownConfiguration } from "./config.js";
|
|
13
16
|
import { MarkdownParser } from "./markdown-protocol.js";
|
|
14
17
|
import 'katex/dist/katex.min.css';
|
|
15
18
|
export var MarkdownRender = (_dec = singleton({
|
|
16
19
|
token: MarkdownParser
|
|
17
|
-
}), _dec2 = postConstruct(), _dec(_class = (_class2 = /*#__PURE__*/function () {
|
|
20
|
+
}), _dec2 = inject(ConfigurationService), _dec3 = postConstruct(), _dec(_class = (_class2 = /*#__PURE__*/function () {
|
|
18
21
|
function MarkdownRender() {
|
|
19
22
|
_classCallCheck(this, MarkdownRender);
|
|
20
23
|
this.slugify = slugify;
|
|
21
24
|
this.enablePermalink = false;
|
|
25
|
+
_initializerDefineProperty(this, "configurationService", _descriptor, this);
|
|
22
26
|
}
|
|
23
27
|
_createClass(MarkdownRender, [{
|
|
24
28
|
key: "init",
|
|
25
29
|
value: function init() {
|
|
30
|
+
var _this = this;
|
|
26
31
|
this.mkt = new MarkdownIt({
|
|
27
32
|
html: true,
|
|
28
33
|
linkify: true
|
|
@@ -39,6 +44,36 @@ export var MarkdownRender = (_dec = singleton({
|
|
|
39
44
|
slugify: this.slugify
|
|
40
45
|
});
|
|
41
46
|
this.mkt.use(latexPlugin);
|
|
47
|
+
this.configurationService.get(LibroMarkdownConfiguration.TargetToBlank).then(function (value) {
|
|
48
|
+
if (value) {
|
|
49
|
+
_this.mkt.use(function (md) {
|
|
50
|
+
var defaultRender = md.renderer.rules['link_open'] || function (tokens, idx, options, env, self) {
|
|
51
|
+
return self.renderToken(tokens, idx, options);
|
|
52
|
+
};
|
|
53
|
+
md.renderer.rules['link_open'] = function (tokens, idx, options, env, self) {
|
|
54
|
+
// 获取当前的token
|
|
55
|
+
var token = tokens[idx];
|
|
56
|
+
// 检查是否已有target属性
|
|
57
|
+
var targetIndex = token.attrIndex('target');
|
|
58
|
+
if (targetIndex < 0) {
|
|
59
|
+
// 如果没有target属性,添加target="_blank"
|
|
60
|
+
token.attrPush(['target', '_blank']);
|
|
61
|
+
} else {
|
|
62
|
+
// 如果已有target属性,修改为target="_blank"
|
|
63
|
+
if (token.attrs !== null) {
|
|
64
|
+
token.attrs[targetIndex][1] = '_blank';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 调用默认的渲染函数
|
|
69
|
+
return defaultRender(tokens, idx, options, env, self);
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return;
|
|
74
|
+
}).catch(function () {
|
|
75
|
+
//
|
|
76
|
+
});
|
|
42
77
|
}
|
|
43
78
|
}, {
|
|
44
79
|
key: "render",
|
|
@@ -48,4 +83,9 @@ export var MarkdownRender = (_dec = singleton({
|
|
|
48
83
|
}
|
|
49
84
|
}]);
|
|
50
85
|
return MarkdownRender;
|
|
51
|
-
}(), (_applyDecoratedDescriptor(_class2.prototype, "
|
|
86
|
+
}(), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "configurationService", [_dec2], {
|
|
87
|
+
configurable: true,
|
|
88
|
+
enumerable: true,
|
|
89
|
+
writable: true,
|
|
90
|
+
initializer: null
|
|
91
|
+
}), _applyDecoratedDescriptor(_class2.prototype, "init", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "init"), _class2.prototype)), _class2)) || _class);
|
package/es/module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAM/C,eAAO,MAAM,cAAc,YAI1B,CAAC"}
|
package/es/module.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ManaModule } from '@difizen/mana-app';
|
|
2
|
+
import { LibroMarkdownSettingContribution } from "./config-contribution.js";
|
|
2
3
|
import { MarkdownParser } from "./markdown-protocol.js";
|
|
3
4
|
import { MarkdownRender } from "./markdown-render.js";
|
|
4
|
-
export var MarkdownModule = ManaModule.create().register(MarkdownParser, MarkdownRender);
|
|
5
|
+
export var MarkdownModule = ManaModule.create().register(MarkdownParser, MarkdownRender, LibroMarkdownSettingContribution);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@difizen/libro-markdown",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.26",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"libro",
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
],
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@difizen/mana-app": "latest",
|
|
37
|
+
"@difizen/mana-l10n": "^0.1.24",
|
|
37
38
|
"@traptitech/markdown-it-katex": "^3.6.0",
|
|
38
39
|
"@types/markdown-it": "^12.2.3",
|
|
39
40
|
"katex": "^0.16.10",
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ConfigurationContribution } from '@difizen/mana-app';
|
|
2
|
+
import { singleton } from '@difizen/mana-app';
|
|
3
|
+
|
|
4
|
+
import { LibroMarkdownConfiguration } from './config.js';
|
|
5
|
+
|
|
6
|
+
@singleton({ contrib: ConfigurationContribution })
|
|
7
|
+
export class LibroMarkdownSettingContribution implements ConfigurationContribution {
|
|
8
|
+
registerConfigurations() {
|
|
9
|
+
return [LibroMarkdownConfiguration.TargetToBlank];
|
|
10
|
+
}
|
|
11
|
+
}
|
package/src/config.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ConfigurationNode } from '@difizen/mana-app';
|
|
2
|
+
import { l10n } from '@difizen/mana-l10n';
|
|
3
|
+
|
|
4
|
+
export const LibroConfigLinkTargetToBlank: ConfigurationNode<boolean> = {
|
|
5
|
+
id: 'libro.markdown.link.target.to.blank',
|
|
6
|
+
description: l10n.t('markdown的a标签是否另起一页'),
|
|
7
|
+
title: 'a标签另起一页',
|
|
8
|
+
type: 'checkbox',
|
|
9
|
+
defaultValue: true,
|
|
10
|
+
schema: {
|
|
11
|
+
type: 'boolean',
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const LibroMarkdownConfiguration = {
|
|
16
|
+
TargetToBlank: LibroConfigLinkTargetToBlank,
|
|
17
|
+
};
|
package/src/markdown-render.ts
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ConfigurationService,
|
|
3
|
+
inject,
|
|
4
|
+
postConstruct,
|
|
5
|
+
singleton,
|
|
6
|
+
} from '@difizen/mana-app';
|
|
2
7
|
import latexPlugin from '@traptitech/markdown-it-katex';
|
|
3
8
|
import MarkdownIt from 'markdown-it';
|
|
4
9
|
|
|
5
10
|
import { libroAnchor, linkInsideHeader, slugify } from './anchor.js';
|
|
11
|
+
import { LibroMarkdownConfiguration } from './config.js';
|
|
6
12
|
import type { MarkdownRenderOption } from './markdown-protocol.js';
|
|
7
13
|
import { MarkdownParser } from './markdown-protocol.js';
|
|
8
14
|
import 'katex/dist/katex.min.css';
|
|
@@ -12,6 +18,7 @@ export class MarkdownRender implements MarkdownParser {
|
|
|
12
18
|
protected mkt: MarkdownIt;
|
|
13
19
|
slugify = slugify;
|
|
14
20
|
enablePermalink = false;
|
|
21
|
+
@inject(ConfigurationService) protected configurationService: ConfigurationService;
|
|
15
22
|
|
|
16
23
|
@postConstruct()
|
|
17
24
|
init() {
|
|
@@ -26,6 +33,49 @@ export class MarkdownRender implements MarkdownParser {
|
|
|
26
33
|
slugify: this.slugify,
|
|
27
34
|
});
|
|
28
35
|
this.mkt.use(latexPlugin);
|
|
36
|
+
this.configurationService
|
|
37
|
+
.get(LibroMarkdownConfiguration.TargetToBlank)
|
|
38
|
+
.then((value) => {
|
|
39
|
+
if (value) {
|
|
40
|
+
this.mkt.use((md) => {
|
|
41
|
+
const defaultRender =
|
|
42
|
+
md.renderer.rules['link_open'] ||
|
|
43
|
+
function (tokens, idx, options, env, self) {
|
|
44
|
+
return self.renderToken(tokens, idx, options);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
md.renderer.rules['link_open'] = function (
|
|
48
|
+
tokens,
|
|
49
|
+
idx,
|
|
50
|
+
options,
|
|
51
|
+
env,
|
|
52
|
+
self,
|
|
53
|
+
) {
|
|
54
|
+
// 获取当前的token
|
|
55
|
+
const token = tokens[idx];
|
|
56
|
+
// 检查是否已有target属性
|
|
57
|
+
const targetIndex = token.attrIndex('target');
|
|
58
|
+
|
|
59
|
+
if (targetIndex < 0) {
|
|
60
|
+
// 如果没有target属性,添加target="_blank"
|
|
61
|
+
token.attrPush(['target', '_blank']);
|
|
62
|
+
} else {
|
|
63
|
+
// 如果已有target属性,修改为target="_blank"
|
|
64
|
+
if (token.attrs !== null) {
|
|
65
|
+
token.attrs[targetIndex][1] = '_blank';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// 调用默认的渲染函数
|
|
70
|
+
return defaultRender(tokens, idx, options, env, self);
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return;
|
|
75
|
+
})
|
|
76
|
+
.catch(() => {
|
|
77
|
+
//
|
|
78
|
+
});
|
|
29
79
|
}
|
|
30
80
|
|
|
31
81
|
render(markdownText: string, options?: MarkdownRenderOption): string {
|
package/src/module.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { ManaModule } from '@difizen/mana-app';
|
|
2
2
|
|
|
3
|
+
import { LibroMarkdownSettingContribution } from './config-contribution.js';
|
|
3
4
|
import { MarkdownParser } from './markdown-protocol.js';
|
|
4
5
|
import { MarkdownRender } from './markdown-render.js';
|
|
5
6
|
|
|
6
7
|
export const MarkdownModule = ManaModule.create().register(
|
|
7
8
|
MarkdownParser,
|
|
8
9
|
MarkdownRender,
|
|
10
|
+
LibroMarkdownSettingContribution,
|
|
9
11
|
);
|