@vuux/editor
Version:
Vue Nuxt 富文本编辑器
142 lines (141 loc) • 4 kB
JavaScript
import { _defaults as h } from "./defaults.mjs";
import { escape as a, cleanUrl as c } from "./helpers.mjs";
import { other as i } from "./rules.mjs";
class b {
options;
parser;
constructor(e) {
this.options = e || h;
}
space(e) {
return "";
}
code({ text: e, lang: r, escaped: t }) {
const n = (r || "").match(i.notSpaceStart)?.[0], s = e.replace(i.endingNewline, "") + `
`;
return n ? '<pre><code class="language-' + a(n) + '">' + (t ? s : a(s, !0)) + `</code></pre>
` : "<pre><code>" + (t ? s : a(s, !0)) + `</code></pre>
`;
}
blockquote({ tokens: e }) {
return `<blockquote>
${this.parser.parse(e)}</blockquote>
`;
}
html({ text: e }) {
return e;
}
def(e) {
return "";
}
heading({ tokens: e, depth: r }) {
return `<h${r}>${this.parser.parseInline(e)}</h${r}>
`;
}
hr(e) {
return `<hr>
`;
}
list(e) {
const r = e.ordered, t = e.start;
let n = "";
for (let l = 0; l < e.items.length; l++) {
const p = e.items[l];
n += this.listitem(p);
}
const s = r ? "ol" : "ul", o = r && t !== 1 ? ' start="' + t + '"' : "";
return "<" + s + o + `>
` + n + "</" + s + `>
`;
}
listitem(e) {
let r = "";
if (e.task) {
const t = this.checkbox({ checked: !!e.checked });
e.loose ? e.tokens[0]?.type === "paragraph" ? (e.tokens[0].text = t + " " + e.tokens[0].text, e.tokens[0].tokens && e.tokens[0].tokens.length > 0 && e.tokens[0].tokens[0].type === "text" && (e.tokens[0].tokens[0].text = t + " " + a(e.tokens[0].tokens[0].text), e.tokens[0].tokens[0].escaped = !0)) : e.tokens.unshift({
type: "text",
raw: t + " ",
text: t + " ",
escaped: !0
}) : r += t + " ";
}
return r += this.parser.parse(e.tokens, !!e.loose), `<li>${r}</li>
`;
}
checkbox({ checked: e }) {
return `<span class="${"li-checked" + (e ? " is-checked" : "")}">${e ? `<svg fill="none" viewBox="0 0 24 24">
<path stroke-linejoin="round" stroke-linecap="round" stroke-width="3" stroke="currentColor" d="M4 12L10 18L20 6" />
</svg>` : ""}</span>`;
}
paragraph({ tokens: e }) {
return `<p>${this.parser.parseInline(e)}</p>
`;
}
table(e) {
let r = "", t = "";
for (let s = 0; s < e.header.length; s++)
t += this.tablecell(e.header[s]);
r += this.tablerow({ text: t });
let n = "";
for (let s = 0; s < e.rows.length; s++) {
const o = e.rows[s];
t = "";
for (let l = 0; l < o.length; l++)
t += this.tablecell(o[l]);
n += this.tablerow({ text: t });
}
return n && (n = `<tbody>${n}</tbody>`), `<table>
<thead>
` + r + `</thead>
` + n + `</table>
`;
}
tablerow({ text: e }) {
return `<tr>
${e}</tr>
`;
}
tablecell(e) {
const r = this.parser.parseInline(e.tokens), t = e.header ? "th" : "td";
return (e.align ? `<${t} align="${e.align}">` : `<${t}>`) + r + `</${t}>
`;
}
strong({ tokens: e }) {
return `<strong>${this.parser.parseInline(e)}</strong>`;
}
em({ tokens: e }) {
return `<em>${this.parser.parseInline(e)}</em>`;
}
codespan({ text: e }) {
return `<code>${a(e, !0)}</code>`;
}
br(e) {
return "<br>";
}
del({ tokens: e }) {
return `<del>${this.parser.parseInline(e)}</del>`;
}
link({ href: e, title: r, tokens: t }) {
const n = this.parser.parseInline(t), s = c(e);
if (s === null)
return n;
e = s;
let o = '<a href="' + e + '"';
return r && (o += ' title="' + a(r) + '"'), o += ">" + n + "</a>", o;
}
image({ href: e, title: r, text: t, tokens: n }) {
n && (t = this.parser.parseInline(n, this.parser.textRenderer));
const s = c(e);
if (s === null)
return a(t);
e = s;
let o = `<img src="${e}" alt="${t}"`;
return r && (o += ` title="${a(r)}"`), o += ">", o;
}
text(e) {
return "tokens" in e && e.tokens ? this.parser.parseInline(e.tokens) : "escaped" in e && e.escaped ? e.text : a(e.text);
}
}
export {
b as _Renderer
};