UNPKG

marked

Version:

A markdown parser built for speed

167 lines (140 loc) 3.44 kB
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; } }