@opentiny/fluent-editor
Version:
A rich text editor based on Quill 2.0, which extends rich modules and formats on the basis of Quill. It's powerful and out-of-the-box.
67 lines (66 loc) • 2.48 kB
JavaScript
import Quill from "quill";
import "../config/index.es.js";
import { CHANGE_LANGUAGE_EVENT } from "../config/editor.config.es.js";
class Counter {
constructor(quill, options) {
this.quill = quill;
this.renderCount = () => {
setTimeout(() => {
const { format, count: totalCount, unit, template: counterTemplate, errorTemplate } = this.options;
const count = this.getContentLength(format);
const restCount = totalCount - count;
const countUnit = unit === "char" ? this.quill.getLangText("char") : this.quill.getLangText("word");
let template = counterTemplate;
if (typeof template === "function") {
template = template(count, restCount);
}
const desc = template.replace("{{count}}", count).replace("{{totalCount}}", String(totalCount)).replace("{{restCount}}", String(restCount)).replace(/{{countUnit}}/g, countUnit);
let limitTemplate = errorTemplate || this.quill.getLangText("counter-limit-tips");
if (typeof limitTemplate === "function") {
limitTemplate = limitTemplate(count, restCount);
}
const limitTips = limitTemplate.replace("{{countUnit}}", countUnit);
if (restCount < 0) {
this.container.innerHTML = errorTemplate ? limitTips : `<span style="color:red">${limitTips}</span>`;
} else {
this.container.innerHTML = desc;
}
});
};
this.options = this.resolveOptions(options);
this.container = quill.addContainer("ql-counter");
quill.on(Quill.events.TEXT_CHANGE, this.renderCount);
this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, () => {
this.options = this.resolveOptions(options);
this.renderCount();
});
this.renderCount();
}
resolveOptions(options) {
return Object.assign({
format: "text",
unit: "char",
template: this.quill.getLangText("counter-template"),
count: 500
}, options);
}
getContentLength(format) {
let content = this.quill.getText();
if (format === "html") {
let html = this.quill.root.innerHTML;
if (html === "<p><br></p>" || html === "<div><br><div>") {
html = "";
}
content = html;
}
const text = content.replace(/\s/g, "").trim();
if (this.options.unit === "word") {
return !content.trim() ? 0 : content.trim().split(/\s+/).length;
}
return text.length;
}
}
export {
Counter as default
};
//# sourceMappingURL=counter.es.js.map