fix
This commit is contained in:
380
book/node_modules/kramed/lib/lex/block.js
generated
vendored
Normal file
380
book/node_modules/kramed/lib/lex/block.js
generated
vendored
Normal file
@ -0,0 +1,380 @@
|
||||
var _utils = require('../utils');
|
||||
var noop = _utils.noop;
|
||||
|
||||
var block = require('../rules/block');
|
||||
var defaultOptions = require('./options');
|
||||
|
||||
/**
|
||||
* Block Lexer
|
||||
*/
|
||||
|
||||
function Lexer(options) {
|
||||
this.tokens = [];
|
||||
this.tokens.links = {};
|
||||
this.options = options || defaultOptions;
|
||||
this.rules = block.normal;
|
||||
|
||||
if (this.options.gfm) {
|
||||
if (this.options.tables) {
|
||||
this.rules = block.tables;
|
||||
} else {
|
||||
this.rules = block.gfm;
|
||||
}
|
||||
}
|
||||
|
||||
// Is mathjax disabled ?
|
||||
if (!this.options.mathjax) {
|
||||
this.rules.math = noop;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose Block Rules
|
||||
*/
|
||||
|
||||
Lexer.rules = block;
|
||||
|
||||
/**
|
||||
* Static Lex Method
|
||||
*/
|
||||
|
||||
Lexer.lex = function(src, options) {
|
||||
var lexer = new Lexer(options);
|
||||
return lexer.lex(src);
|
||||
};
|
||||
|
||||
/**
|
||||
* Preprocessing
|
||||
*/
|
||||
|
||||
Lexer.prototype.lex = function(src) {
|
||||
src = src
|
||||
.replace(/\r\n|\r/g, '\n')
|
||||
.replace(/\t/g, ' ')
|
||||
.replace(/\u00a0/g, ' ')
|
||||
.replace(/\u2424/g, '\n');
|
||||
|
||||
return this.token(src, true);
|
||||
};
|
||||
|
||||
/**
|
||||
* Lexing
|
||||
*/
|
||||
|
||||
Lexer.prototype.token = function(src, top, bq) {
|
||||
var src = src.replace(/^ +$/gm, '')
|
||||
, next
|
||||
, loose
|
||||
, cap
|
||||
, bull
|
||||
, b
|
||||
, item
|
||||
, space
|
||||
, i
|
||||
, l;
|
||||
|
||||
while (src) {
|
||||
// newline
|
||||
if (cap = this.rules.newline.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
if (cap[0].length > 1) {
|
||||
this.tokens.push({
|
||||
type: 'space'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// code
|
||||
if (cap = this.rules.code.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
cap = cap[0].replace(/^ {4}/gm, '');
|
||||
this.tokens.push({
|
||||
type: 'code',
|
||||
text: !this.options.pedantic
|
||||
? cap.replace(/\n+$/, '')
|
||||
: cap
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// fences (gfm)
|
||||
if (cap = this.rules.fences.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
this.tokens.push({
|
||||
type: 'code',
|
||||
lang: cap[2],
|
||||
text: cap[3]
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// footnote
|
||||
if (cap = this.rules.footnote.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
this.tokens.push({
|
||||
type: 'footnote',
|
||||
refname: cap[1],
|
||||
text: cap[2]
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// math
|
||||
if (cap = this.rules.math.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
this.tokens.push({
|
||||
type: 'math',
|
||||
text: cap[2]
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// heading
|
||||
if (cap = this.rules.heading.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
this.tokens.push({
|
||||
type: 'heading',
|
||||
depth: cap[1].length,
|
||||
text: cap[2]
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// table no leading pipe (gfm)
|
||||
if (top && (cap = this.rules.nptable.exec(src))) {
|
||||
src = src.substring(cap[0].length);
|
||||
|
||||
item = {
|
||||
type: 'table',
|
||||
header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
|
||||
align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
|
||||
cells: cap[3].replace(/\n$/, '').split('\n')
|
||||
};
|
||||
|
||||
for (i = 0; i < item.align.length; i++) {
|
||||
if (/^ *-+: *$/.test(item.align[i])) {
|
||||
item.align[i] = 'right';
|
||||
} else if (/^ *:-+: *$/.test(item.align[i])) {
|
||||
item.align[i] = 'center';
|
||||
} else if (/^ *:-+ *$/.test(item.align[i])) {
|
||||
item.align[i] = 'left';
|
||||
} else {
|
||||
item.align[i] = null;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < item.cells.length; i++) {
|
||||
item.cells[i] = item.cells[i].split(/ *\| */);
|
||||
}
|
||||
|
||||
this.tokens.push(item);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// lheading
|
||||
if (cap = this.rules.lheading.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
this.tokens.push({
|
||||
type: 'heading',
|
||||
depth: cap[2] === '=' ? 1 : 2,
|
||||
text: cap[1]
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// hr
|
||||
if (cap = this.rules.hr.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
this.tokens.push({
|
||||
type: 'hr'
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// blockquote
|
||||
if (cap = this.rules.blockquote.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
|
||||
this.tokens.push({
|
||||
type: 'blockquote_start'
|
||||
});
|
||||
|
||||
cap = cap[0].replace(/^ *> ?/gm, '');
|
||||
|
||||
// Pass `top` to keep the current
|
||||
// "toplevel" state. This is exactly
|
||||
// how markdown.pl works.
|
||||
this.token(cap, top, true);
|
||||
|
||||
this.tokens.push({
|
||||
type: 'blockquote_end'
|
||||
});
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// list
|
||||
if (cap = this.rules.list.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
bull = cap[2];
|
||||
|
||||
this.tokens.push({
|
||||
type: 'list_start',
|
||||
ordered: bull.length > 1
|
||||
});
|
||||
|
||||
// Get each top-level item.
|
||||
cap = cap[0].match(this.rules._item);
|
||||
|
||||
next = false;
|
||||
l = cap.length;
|
||||
i = 0;
|
||||
|
||||
for (; i < l; i++) {
|
||||
item = cap[i];
|
||||
|
||||
// Remove the list item's bullet
|
||||
// so it is seen as the next token.
|
||||
space = item.length;
|
||||
item = item.replace(/^ *([*+-]|\d+\.) +/, '');
|
||||
|
||||
// Outdent whatever the
|
||||
// list item contains. Hacky.
|
||||
if (~item.indexOf('\n ')) {
|
||||
space -= item.length;
|
||||
item = !this.options.pedantic
|
||||
? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
|
||||
: item.replace(/^ {1,4}/gm, '');
|
||||
}
|
||||
|
||||
// Determine whether the next list item belongs here.
|
||||
// Backpedal if it does not belong in this list.
|
||||
if (this.options.smartLists && i !== l - 1) {
|
||||
b = block._bullet.exec(cap[i + 1])[0];
|
||||
if (bull !== b && !(bull.length > 1 && b.length > 1)) {
|
||||
src = cap.slice(i + 1).join('\n') + src;
|
||||
i = l - 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Determine whether item is loose or not.
|
||||
// Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
|
||||
// for discount behavior.
|
||||
loose = next || /\n\n(?!\s*$)/.test(item);
|
||||
if (i !== l - 1) {
|
||||
next = item.charAt(item.length - 1) === '\n';
|
||||
if (!loose) loose = next;
|
||||
}
|
||||
|
||||
this.tokens.push({
|
||||
type: loose
|
||||
? 'loose_item_start'
|
||||
: 'list_item_start'
|
||||
});
|
||||
|
||||
// Recurse.
|
||||
this.token(item, false, bq);
|
||||
|
||||
this.tokens.push({
|
||||
type: 'list_item_end'
|
||||
});
|
||||
}
|
||||
|
||||
this.tokens.push({
|
||||
type: 'list_end'
|
||||
});
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// html
|
||||
if (cap = this.rules.html.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
this.tokens.push({
|
||||
type: this.options.sanitize
|
||||
? 'paragraph'
|
||||
: 'html',
|
||||
pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',
|
||||
text: cap[0]
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// def
|
||||
if ((!bq && top) && (cap = this.rules.def.exec(src))) {
|
||||
src = src.substring(cap[0].length);
|
||||
this.tokens.links[cap[1].toLowerCase()] = {
|
||||
href: cap[2],
|
||||
title: cap[3]
|
||||
};
|
||||
continue;
|
||||
}
|
||||
|
||||
// table (gfm)
|
||||
if (top && (cap = this.rules.table.exec(src))) {
|
||||
src = src.substring(cap[0].length);
|
||||
|
||||
item = {
|
||||
type: 'table',
|
||||
header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
|
||||
align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
|
||||
cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n').slice(0),
|
||||
};
|
||||
|
||||
for (i = 0; i < item.align.length; i++) {
|
||||
if (/^ *-+: *$/.test(item.align[i])) {
|
||||
item.align[i] = 'right';
|
||||
} else if (/^ *:-+: *$/.test(item.align[i])) {
|
||||
item.align[i] = 'center';
|
||||
} else if (/^ *:-+ *$/.test(item.align[i])) {
|
||||
item.align[i] = 'left';
|
||||
} else {
|
||||
item.align[i] = null;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < item.cells.length; i++) {
|
||||
item.cells[i] = item.cells[i]
|
||||
.replace(/^ *\| *| *\| *$/g, '')
|
||||
.split(/ *\| */);
|
||||
}
|
||||
|
||||
this.tokens.push(item);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// top-level paragraph
|
||||
if (top && (cap = this.rules.paragraph.exec(src))) {
|
||||
src = src.substring(cap[0].length);
|
||||
this.tokens.push({
|
||||
type: 'paragraph',
|
||||
text: cap[1].charAt(cap[1].length - 1) === '\n'
|
||||
? cap[1].slice(0, -1)
|
||||
: cap[1]
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// text
|
||||
if (cap = this.rules.text.exec(src)) {
|
||||
// Top-level should never reach here.
|
||||
src = src.substring(cap[0].length);
|
||||
this.tokens.push({
|
||||
type: 'text',
|
||||
text: cap[0]
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
if (src) {
|
||||
throw new
|
||||
Error('Infinite loop on byte: ' + src.charCodeAt(0));
|
||||
}
|
||||
}
|
||||
|
||||
return this.tokens;
|
||||
};
|
||||
|
||||
module.exports = Lexer;
|
84
book/node_modules/kramed/lib/lex/html_blocks.js
generated
vendored
Normal file
84
book/node_modules/kramed/lib/lex/html_blocks.js
generated
vendored
Normal file
@ -0,0 +1,84 @@
|
||||
// List of valid html blocks names, accorting to commonmark spec
|
||||
// http://jgm.github.io/CommonMark/spec.html#html-blocks
|
||||
|
||||
'use strict';
|
||||
|
||||
// Treat these blocks as RAW HTML
|
||||
var htmlBlocks = [
|
||||
'address',
|
||||
'article',
|
||||
'aside',
|
||||
'base',
|
||||
'basefont',
|
||||
'blockquote',
|
||||
'body',
|
||||
'caption',
|
||||
'center',
|
||||
'col',
|
||||
'colgroup',
|
||||
'dd',
|
||||
'details',
|
||||
'dialog',
|
||||
'dir',
|
||||
'div',
|
||||
'dl',
|
||||
'dt',
|
||||
'fieldset',
|
||||
'figcaption',
|
||||
'figure',
|
||||
'footer',
|
||||
'form',
|
||||
'frame',
|
||||
'frameset',
|
||||
'h1',
|
||||
'head',
|
||||
'header',
|
||||
'hr',
|
||||
'html',
|
||||
'iframe',
|
||||
'legend',
|
||||
'li',
|
||||
'link',
|
||||
'main',
|
||||
'menu',
|
||||
'menuitem',
|
||||
'meta',
|
||||
'nav',
|
||||
'noframes',
|
||||
'ol',
|
||||
'optgroup',
|
||||
'option',
|
||||
'p',
|
||||
'param',
|
||||
'pre',
|
||||
'script',
|
||||
'section',
|
||||
'source',
|
||||
'title',
|
||||
'summary',
|
||||
'table',
|
||||
'tbody',
|
||||
'td',
|
||||
'tfoot',
|
||||
'th',
|
||||
'thead',
|
||||
'title',
|
||||
'tr',
|
||||
'track',
|
||||
'ul'
|
||||
];
|
||||
|
||||
var blockMap = htmlBlocks.reduce(function(accu, x) {
|
||||
accu[x] = true;
|
||||
return accu;
|
||||
}, {});
|
||||
|
||||
function isBlock(tag) {
|
||||
if(!tag) {
|
||||
return false;
|
||||
}
|
||||
var key = tag.toLowerCase();
|
||||
return Boolean(blockMap[key]);
|
||||
}
|
||||
|
||||
module.exports = isBlock;
|
293
book/node_modules/kramed/lib/lex/inline.js
generated
vendored
Normal file
293
book/node_modules/kramed/lib/lex/inline.js
generated
vendored
Normal file
@ -0,0 +1,293 @@
|
||||
var _utils = require('../utils');
|
||||
var escape = _utils.escape;
|
||||
var noop = _utils.noop;
|
||||
|
||||
var inline = require('../rules/inline');
|
||||
var Renderer = require('../renderer');
|
||||
var defaultOptions = require('./options');
|
||||
var isHTMLBlock = require('./html_blocks');
|
||||
|
||||
/**
|
||||
* Inline Lexer & Compiler
|
||||
*/
|
||||
|
||||
function InlineLexer(links, options, renderer) {
|
||||
this.options = options || defaultOptions;
|
||||
this.links = links;
|
||||
this.rules = inline.normal;
|
||||
this.renderer = renderer
|
||||
|
||||
if (!this.links) {
|
||||
throw new
|
||||
Error('Tokens array requires a `links` property.');
|
||||
}
|
||||
|
||||
if (this.options.gfm) {
|
||||
if (this.options.breaks) {
|
||||
this.rules = inline.breaks;
|
||||
} else {
|
||||
this.rules = inline.gfm;
|
||||
}
|
||||
} else if (this.options.pedantic) {
|
||||
this.rules = inline.pedantic;
|
||||
}
|
||||
|
||||
// Is mathjax disabled ?
|
||||
if (!this.options.mathjax) {
|
||||
this.rules.math = noop;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose Inline Rules
|
||||
*/
|
||||
|
||||
InlineLexer.rules = inline;
|
||||
|
||||
/**
|
||||
* Static Lexing/Compiling Method
|
||||
*/
|
||||
|
||||
InlineLexer.output = function(src, links, options) {
|
||||
var inline = new InlineLexer(links, options, new Renderer());
|
||||
return inline.output(src);
|
||||
};
|
||||
|
||||
InlineLexer.prototype.escape = function(html, encode) {
|
||||
// Handle escaping being turned off
|
||||
if(this.options && this.options.escape === false) {
|
||||
return html;
|
||||
}
|
||||
return escape(html, encode);
|
||||
};
|
||||
|
||||
/**
|
||||
* Lexing/Compiling
|
||||
*/
|
||||
|
||||
InlineLexer.prototype.output = function(src) {
|
||||
var out = ''
|
||||
, link
|
||||
, text
|
||||
, href
|
||||
, cap;
|
||||
|
||||
while (src) {
|
||||
// escape
|
||||
if (cap = this.rules.escape.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
out += cap[1];
|
||||
continue;
|
||||
}
|
||||
|
||||
// autolink
|
||||
if (cap = this.rules.autolink.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
if (cap[2] === '@') {
|
||||
text = cap[1].charAt(6) === ':'
|
||||
? this.mangle(cap[1].substring(7))
|
||||
: this.mangle(cap[1]);
|
||||
href = this.mangle('mailto:') + text;
|
||||
} else {
|
||||
text = this.escape(cap[1]);
|
||||
href = text;
|
||||
}
|
||||
out += this.renderer.link(href, null, text);
|
||||
continue;
|
||||
}
|
||||
|
||||
// url (gfm)
|
||||
if (!this.inLink && (cap = this.rules.url.exec(src))) {
|
||||
src = src.substring(cap[0].length);
|
||||
text = this.escape(cap[1]);
|
||||
href = text;
|
||||
out += this.renderer.link(href, null, text);
|
||||
continue;
|
||||
}
|
||||
|
||||
// html
|
||||
if (cap = this.rules.html.exec(src)) {
|
||||
// Found a link
|
||||
if(cap[1] === 'a' && cap[2] && !this.inLink) {
|
||||
// Opening tag
|
||||
out += cap[0].substring(0, cap[0].indexOf(cap[2]));
|
||||
this.inLink = true;
|
||||
// In between the tag
|
||||
out += this.output(cap[2]);
|
||||
this.inLink = false;
|
||||
// Outer tag
|
||||
out += cap[0].substring(cap[0].indexOf(cap[2])+cap[2].length);
|
||||
// Advance parser
|
||||
src = src.substring(cap[0].length);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Found HTML that we should parse
|
||||
if(cap[1] && !isHTMLBlock(cap[1]) && cap[2]) {
|
||||
// Opening tag
|
||||
out += cap[0].substring(0, cap[0].indexOf(cap[2]));
|
||||
// In between the tag
|
||||
out += this.output(cap[2]);
|
||||
// Outer tag
|
||||
out += cap[0].substring(cap[0].indexOf(cap[2])+cap[2].length);
|
||||
// Advance parser
|
||||
src = src.substring(cap[0].length);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Any other HTML
|
||||
src = src.substring(cap[0].length);
|
||||
out += cap[0];
|
||||
continue;
|
||||
}
|
||||
|
||||
// link
|
||||
if (cap = this.rules.link.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
this.inLink = true;
|
||||
out += this.outputLink(cap, {
|
||||
href: cap[2],
|
||||
title: cap[3]
|
||||
});
|
||||
this.inLink = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
// reffn
|
||||
if ((cap = this.rules.reffn.exec(src))) {
|
||||
src = src.substring(cap[0].length);
|
||||
out += this.renderer.reffn(cap[1]);
|
||||
continue;
|
||||
}
|
||||
|
||||
// reflink, nolink
|
||||
if ((cap = this.rules.reflink.exec(src))
|
||||
|| (cap = this.rules.nolink.exec(src))) {
|
||||
src = src.substring(cap[0].length);
|
||||
link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
|
||||
link = this.links[link.toLowerCase()];
|
||||
if (!link || !link.href) {
|
||||
out += cap[0].charAt(0);
|
||||
src = cap[0].substring(1) + src;
|
||||
continue;
|
||||
}
|
||||
this.inLink = true;
|
||||
out += this.outputLink(cap, link);
|
||||
this.inLink = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
// strong
|
||||
if (cap = this.rules.strong.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
out += this.renderer.strong(this.output(cap[2] || cap[1]));
|
||||
continue;
|
||||
}
|
||||
|
||||
// em
|
||||
if (cap = this.rules.em.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
out += this.renderer.em(this.output(cap[2] || cap[1]));
|
||||
continue;
|
||||
}
|
||||
|
||||
// code
|
||||
if (cap = this.rules.code.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
out += this.renderer.codespan(this.escape(cap[2], true));
|
||||
continue;
|
||||
}
|
||||
|
||||
// math
|
||||
if (cap = this.rules.math.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
out += this.renderer.math(cap[1], 'math/tex', false); //FIXME: filter <script> & </script>
|
||||
continue;
|
||||
}
|
||||
|
||||
// br
|
||||
if (cap = this.rules.br.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
out += this.renderer.br();
|
||||
continue;
|
||||
}
|
||||
|
||||
// del (gfm)
|
||||
if (cap = this.rules.del.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
out += this.renderer.del(this.output(cap[1]));
|
||||
continue;
|
||||
}
|
||||
|
||||
// text
|
||||
if (cap = this.rules.text.exec(src)) {
|
||||
src = src.substring(cap[0].length);
|
||||
out += this.escape(this.smartypants(cap[0]));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (src) {
|
||||
throw new
|
||||
Error('Infinite loop on byte: ' + src.charCodeAt(0));
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
};
|
||||
|
||||
/**
|
||||
* Compile Link
|
||||
*/
|
||||
|
||||
InlineLexer.prototype.outputLink = function(cap, link) {
|
||||
var href = this.escape(link.href)
|
||||
, title = link.title ? this.escape(link.title) : null;
|
||||
|
||||
return cap[0].charAt(0) !== '!'
|
||||
? this.renderer.link(href, title, this.output(cap[1]))
|
||||
: this.renderer.image(href, title, this.escape(cap[1]));
|
||||
};
|
||||
|
||||
/**
|
||||
* Smartypants Transformations
|
||||
*/
|
||||
|
||||
InlineLexer.prototype.smartypants = function(text) {
|
||||
if (!this.options.smartypants) return text;
|
||||
return text
|
||||
// em-dashes
|
||||
.replace(/--/g, '\u2014')
|
||||
// opening singles
|
||||
.replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
|
||||
// closing singles & apostrophes
|
||||
.replace(/'/g, '\u2019')
|
||||
// opening doubles
|
||||
.replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
|
||||
// closing doubles
|
||||
.replace(/"/g, '\u201d')
|
||||
// ellipses
|
||||
.replace(/\.{3}/g, '\u2026');
|
||||
};
|
||||
|
||||
/**
|
||||
* Mangle Links
|
||||
*/
|
||||
|
||||
InlineLexer.prototype.mangle = function(text) {
|
||||
var out = ''
|
||||
, l = text.length
|
||||
, i = 0
|
||||
, ch;
|
||||
|
||||
for (; i < l; i++) {
|
||||
ch = text.charCodeAt(i);
|
||||
if (Math.random() > 0.5) {
|
||||
ch = 'x' + ch.toString(16);
|
||||
}
|
||||
out += '&#' + ch + ';';
|
||||
}
|
||||
|
||||
return out;
|
||||
};
|
||||
|
||||
module.exports = InlineLexer;
|
9
book/node_modules/kramed/lib/lex/options.js
generated
vendored
Normal file
9
book/node_modules/kramed/lib/lex/options.js
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
module.exports = {
|
||||
gfm: true,
|
||||
tables: true,
|
||||
breaks: false,
|
||||
pedantic: false,
|
||||
sanitize: false,
|
||||
smartLists: false,
|
||||
mathjax: true,
|
||||
};
|
Reference in New Issue
Block a user