123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581 |
- 'use strict';
- var utils = require('./common/utils');
- var helpers = require('./helpers');
- var Renderer = require('./renderer');
- var ParserCore = require('./parser_core');
- var ParserBlock = require('./parser_block');
- var ParserInline = require('./parser_inline');
- var LinkifyIt = require('linkify-it');
- var mdurl = require('mdurl');
- var punycode = require('punycode');
- var config = {
- 'default': require('./presets/default'),
- zero: require('./presets/zero'),
- commonmark: require('./presets/commonmark')
- };
- var BAD_PROTO_RE = /^(vbscript|javascript|file|data):/;
- var GOOD_DATA_RE = /^data:image\/(gif|png|jpeg|webp);/;
- function validateLink(url) {
-
- var str = url.trim().toLowerCase();
- return BAD_PROTO_RE.test(str) ? (GOOD_DATA_RE.test(str) ? true : false) : true;
- }
- var RECODE_HOSTNAME_FOR = [ 'http:', 'https:', 'mailto:' ];
- function normalizeLink(url) {
- var parsed = mdurl.parse(url, true);
- if (parsed.hostname) {
-
-
-
-
-
-
- if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {
- try {
- parsed.hostname = punycode.toASCII(parsed.hostname);
- } catch (er) {
- }
- }
- }
- return mdurl.decode(mdurl.format(parsed));
- }
- function MarkdownIt(presetName, options) {
- if (!(this instanceof MarkdownIt)) {
- return new MarkdownIt(presetName, options);
- }
- if (!options) {
- if (!utils.isString(presetName)) {
- options = presetName || {};
- presetName = 'default';
- }
- }
-
- this.inline = new ParserInline();
-
- this.block = new ParserBlock();
-
- this.core = new ParserCore();
-
- this.renderer = new Renderer();
-
- this.linkify = new LinkifyIt();
-
- this.validateLink = validateLink;
-
- this.normalizeLink = normalizeLink;
-
- this.normalizeLinkText = normalizeLinkText;
-
-
- this.utils = utils;
-
- this.helpers = utils.assign({}, helpers);
- this.options = {};
- this.configure(presetName);
- if (options) { this.set(options); }
- }
- MarkdownIt.prototype.set = function (options) {
- utils.assign(this.options, options);
- return this;
- };
- MarkdownIt.prototype.configure = function (presets) {
- var self = this, presetName;
- if (utils.isString(presets)) {
- presetName = presets;
- presets = config[presetName];
- if (!presets) { throw new Error('Wrong `markdown-it` preset "' + presetName + '", check name'); }
- }
- if (!presets) { throw new Error('Wrong `markdown-it` preset, can\'t be empty'); }
- if (presets.options) { self.set(presets.options); }
- if (presets.components) {
- Object.keys(presets.components).forEach(function (name) {
- if (presets.components[name].rules) {
- self[name].ruler.enableOnly(presets.components[name].rules);
- }
- if (presets.components[name].rules2) {
- self[name].ruler2.enableOnly(presets.components[name].rules2);
- }
- });
- }
- return this;
- };
- MarkdownIt.prototype.enable = function (list, ignoreInvalid) {
- var result = [];
- if (!Array.isArray(list)) { list = [ list ]; }
- [ 'core', 'block', 'inline' ].forEach(function (chain) {
- result = result.concat(this[chain].ruler.enable(list, true));
- }, this);
- result = result.concat(this.inline.ruler2.enable(list, true));
- var missed = list.filter(function (name) { return result.indexOf(name) < 0; });
- if (missed.length && !ignoreInvalid) {
- throw new Error('MarkdownIt. Failed to enable unknown rule(s): ' + missed);
- }
- return this;
- };
- MarkdownIt.prototype.disable = function (list, ignoreInvalid) {
- var result = [];
- if (!Array.isArray(list)) { list = [ list ]; }
- [ 'core', 'block', 'inline' ].forEach(function (chain) {
- result = result.concat(this[chain].ruler.disable(list, true));
- }, this);
- result = result.concat(this.inline.ruler2.disable(list, true));
- var missed = list.filter(function (name) { return result.indexOf(name) < 0; });
- if (missed.length && !ignoreInvalid) {
- throw new Error('MarkdownIt. Failed to disable unknown rule(s): ' + missed);
- }
- return this;
- };
- MarkdownIt.prototype.use = function (plugin /*, params, ... */) {
- var args = [ this ].concat(Array.prototype.slice.call(arguments, 1));
- plugin.apply(plugin, args);
- return this;
- };
- MarkdownIt.prototype.parse = function (src, env) {
- if (typeof src !== 'string') {
- throw new Error('Input data should be a String');
- }
- var state = new this.core.State(src, this, env);
- this.core.process(state);
- return state.tokens;
- };
- MarkdownIt.prototype.render = function (src, env) {
- env = env || {};
- return this.renderer.render(this.parse(src, env), this.options, env);
- };
- MarkdownIt.prototype.parseInline = function (src, env) {
- var state = new this.core.State(src, this, env);
- state.inlineMode = true;
- this.core.process(state);
- return state.tokens;
- };
- MarkdownIt.prototype.renderInline = function (src, env) {
- env = env || {};
- return this.renderer.render(this.parseInline(src, env), this.options, env);
- };
- module.exports = MarkdownIt;
|