mirror of https://github.com/markedjs/marked
167 lines
3.4 KiB
JavaScript
167 lines
3.4 KiB
JavaScript
import { defaults } from './defaults.js';
|
|
import {
|
|
cleanUrl,
|
|
escape
|
|
} from './helpers.js';
|
|
|
|
/**
|
|
* Renderer
|
|
*/
|
|
export class Renderer {
|
|
constructor(options) {
|
|
this.options = options || defaults;
|
|
}
|
|
|
|
code(code, infostring, escaped) {
|
|
const lang = (infostring || '').match(/\S*/)[0];
|
|
if (this.options.highlight) {
|
|
const out = this.options.highlight(code, lang);
|
|
if (out != null && out !== code) {
|
|
escaped = true;
|
|
code = out;
|
|
}
|
|
}
|
|
|
|
code = code.replace(/\n$/, '') + '\n';
|
|
|
|
if (!lang) {
|
|
return '<pre><code>'
|
|
+ (escaped ? code : escape(code, true))
|
|
+ '</code></pre>\n';
|
|
}
|
|
|
|
return '<pre><code class="'
|
|
+ this.options.langPrefix
|
|
+ escape(lang, true)
|
|
+ '">'
|
|
+ (escaped ? code : escape(code, true))
|
|
+ '</code></pre>\n';
|
|
}
|
|
|
|
blockquote(quote) {
|
|
return '<blockquote>\n' + quote + '</blockquote>\n';
|
|
}
|
|
|
|
html(html) {
|
|
return html;
|
|
}
|
|
|
|
heading(text, level, raw, slugger) {
|
|
if (this.options.headerIds) {
|
|
return '<h'
|
|
+ level
|
|
+ ' id="'
|
|
+ this.options.headerPrefix
|
|
+ slugger.slug(raw)
|
|
+ '">'
|
|
+ text
|
|
+ '</h'
|
|
+ level
|
|
+ '>\n';
|
|
}
|
|
// ignore IDs
|
|
return '<h' + level + '>' + text + '</h' + level + '>\n';
|
|
}
|
|
|
|
hr() {
|
|
return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
|
|
}
|
|
|
|
list(body, ordered, start) {
|
|
const type = ordered ? 'ol' : 'ul',
|
|
startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
|
|
return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
|
|
}
|
|
|
|
listitem(text) {
|
|
return '<li>' + text + '</li>\n';
|
|
}
|
|
|
|
checkbox(checked) {
|
|
return '<input '
|
|
+ (checked ? 'checked="" ' : '')
|
|
+ 'disabled="" type="checkbox"'
|
|
+ (this.options.xhtml ? ' /' : '')
|
|
+ '> ';
|
|
}
|
|
|
|
paragraph(text) {
|
|
return '<p>' + text + '</p>\n';
|
|
}
|
|
|
|
table(header, body) {
|
|
if (body) body = '<tbody>' + body + '</tbody>';
|
|
|
|
return '<table>\n'
|
|
+ '<thead>\n'
|
|
+ header
|
|
+ '</thead>\n'
|
|
+ body
|
|
+ '</table>\n';
|
|
}
|
|
|
|
tablerow(content) {
|
|
return '<tr>\n' + content + '</tr>\n';
|
|
}
|
|
|
|
tablecell(content, flags) {
|
|
const type = flags.header ? 'th' : 'td';
|
|
const tag = flags.align
|
|
? '<' + type + ' align="' + flags.align + '">'
|
|
: '<' + type + '>';
|
|
return tag + content + '</' + type + '>\n';
|
|
}
|
|
|
|
// span level renderer
|
|
strong(text) {
|
|
return '<strong>' + text + '</strong>';
|
|
}
|
|
|
|
em(text) {
|
|
return '<em>' + text + '</em>';
|
|
}
|
|
|
|
codespan(text) {
|
|
return '<code>' + text + '</code>';
|
|
}
|
|
|
|
br() {
|
|
return this.options.xhtml ? '<br/>' : '<br>';
|
|
}
|
|
|
|
del(text) {
|
|
return '<del>' + text + '</del>';
|
|
}
|
|
|
|
link(href, title, text) {
|
|
href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
|
|
if (href === null) {
|
|
return text;
|
|
}
|
|
let out = '<a href="' + escape(href) + '"';
|
|
if (title) {
|
|
out += ' title="' + title + '"';
|
|
}
|
|
out += '>' + text + '</a>';
|
|
return out;
|
|
}
|
|
|
|
image(href, title, text) {
|
|
href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
|
|
if (href === null) {
|
|
return text;
|
|
}
|
|
|
|
let out = '<img src="' + href + '" alt="' + text + '"';
|
|
if (title) {
|
|
out += ' title="' + title + '"';
|
|
}
|
|
out += this.options.xhtml ? '/>' : '>';
|
|
return out;
|
|
}
|
|
|
|
text(text) {
|
|
return text;
|
|
}
|
|
}
|