pell

pell

简洁高效的开源网页文本编辑器

pell是一款轻量级的开源网页文本编辑器,采用纯JavaScript实现,无需额外依赖。它支持加粗、斜体、插入链接等常用编辑功能,并且易于定制。pell的文件大小仅1.38kB(gzip压缩后),远小于同类编辑器,适合需要简洁高效富文本功能的网页项目。作为开源项目,pell提供了简洁的API接口,方便开发者集成和扩展。它支持自定义样式,可通过SCSS或CSS轻松调整外观。pell兼容主流浏览器,适用于各类网页应用中需要轻量级文本编辑功能的场景。

pell文本编辑器WYSIWYGJavaScript开源Github开源项目

v2 working branch and v2 project board


<img src="./images/logo.png" width="128" alt="Logo">

npm cdnjs

pell is the simplest and smallest WYSIWYG text editor for web, with no dependencies

Demo

Comparisons

librarysize (min+gzip)size (min)jquerybootstrapreactlink
pell1.38kB3.54kBhttps://github.com/jaredreich/pell
squire16kB49kBhttps://github.com/neilj/Squire
medium-editor27kB105kBhttps://github.com/yabwe/medium-editor
quill43kB205kBhttps://github.com/quilljs/quill
trix47kB204kBhttps://github.com/basecamp/trix
ckeditor163kB551kBhttps://ckeditor.com
trumbowyg8kB23kBxhttps://github.com/Alex-D/Trumbowyg
summernote26kB93kBxxhttps://github.com/summernote/summernote
draft46kB147kBxhttps://github.com/facebook/draft-js
froala52kB186kBxhttps://github.com/froala/wysiwyg-editor
tinymce157kB491kBxhttps://github.com/tinymce/tinymce

Features

  • Pure JavaScript, no dependencies, written in ES6
  • Easily customizable with the sass file (pell.scss) or overwrite the CSS

Included actions:

  • Bold
  • Italic
  • Underline
  • Strike-through
  • Heading 1
  • Heading 2
  • Paragraph
  • Quote
  • Ordered List
  • Unordered List
  • Code
  • Horizontal Rule
  • Link
  • Image

Other available actions (listed at https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand):

  • Justify Center
  • Justify Full
  • Justify Left
  • Justify Right
  • Subscript
  • Superscript
  • Font Name
  • Font Size
  • Indent
  • Outdent
  • Clear Formatting
  • Undo
  • Redo

Or create any custom action!

Browser Support

  • IE 9+ (theoretically, but good luck)
  • Chrome 5+
  • Firefox 4+
  • Safari 5+
  • Opera 11.6+

Installation

npm:

npm install --save pell

HTML:

<head> ... <link rel="stylesheet" type="text/css" href="https://unpkg.com/pell/dist/pell.min.css"> <style> /* override styles here */ .pell-content { background-color: pink; } </style> </head> <body> ... <!-- Bottom of body --> <script src="https://unpkg.com/pell"></script> </body>

Usage

API

// ES6 import pell from 'pell' // or import { exec, init } from 'pell'
// Browser pell // or window.pell
// Initialize pell on an HTMLElement pell.init({ // <HTMLElement>, required element: document.getElementById('some-id'), // <Function>, required // Use the output html, triggered by element's `oninput` event onChange: html => console.log(html), // <string>, optional, default = 'div' // Instructs the editor which element to inject via the return key defaultParagraphSeparator: 'div', // <boolean>, optional, default = false // Outputs <span style="font-weight: bold;"></span> instead of <b></b> styleWithCSS: false, // <Array[string | Object]>, string if overwriting, object if customizing/creating // action.name<string> (only required if overwriting) // action.icon<string> (optional if overwriting, required if custom action) // action.title<string> (optional) // action.result<Function> (required) // Specify the actions you specifically want (in order) actions: [ 'bold', { name: 'custom', icon: 'C', title: 'Custom Action', result: () => console.log('Do something!') }, 'underline' ], // classes<Array[string]> (optional) // Choose your custom class names classes: { actionbar: 'pell-actionbar', button: 'pell-button', content: 'pell-content', selected: 'pell-button-selected' } }) // Execute a document command, see reference: // https://developer.mozilla.org/en/docs/Web/API/Document/execCommand // this is just `document.execCommand(command, false, value)` pell.exec(command<string>, value<string>)

List of overwriteable action names

  • bold
  • italic
  • underline
  • strikethrough
  • heading1
  • heading2
  • paragraph
  • quote
  • olist
  • ulist
  • code
  • line
  • link
  • image

Examples

General

<div id="editor" class="pell"></div> <div> HTML output: <div id="html-output" style="white-space:pre-wrap;"></div> </div>
import { exec, init } from 'pell' const editor = init({ element: document.getElementById('editor'), onChange: html => { document.getElementById('html-output').textContent = html }, defaultParagraphSeparator: 'p', styleWithCSS: true, actions: [ 'bold', 'underline', { name: 'italic', result: () => exec('italic') }, { name: 'backColor', icon: '<div style="background-color:pink;">A</div>', title: 'Highlight Color', result: () => exec('backColor', 'pink') }, { name: 'image', result: () => { const url = window.prompt('Enter the image URL') if (url) exec('insertImage', url) } }, { name: 'link', result: () => { const url = window.prompt('Enter the link URL') if (url) exec('createLink', url) } } ], classes: { actionbar: 'pell-actionbar-custom-name', button: 'pell-button-custom-name', content: 'pell-content-custom-name', selected: 'pell-button-selected-custom-name' } }) // editor.content<HTMLElement> // To change the editor's content: editor.content.innerHTML = '<b><u><i>Initial content!</i></u></b>'

Example (Markdown)

<div id="editor" class="pell"></div> <div> Markdown output: <div id="markdown-output" style="white-space:pre-wrap;"></div> </div>
import { init } from 'pell' import Turndown from 'turndown' const { turndown } = new Turndown({ headingStyle: 'atx' }) init({ element: document.getElementById('editor'), actions: ['bold', 'italic', 'heading1', 'heading2', 'olist', 'ulist'], onChange: html => { document.getElementById('markdown-output').innerHTML = turndown(html) } })

Frameworks

Custom Styles

SCSS

$pell-content-height: 400px; // See all overwriteable variables in src/pell.scss // Then import pell.scss into styles: @import '../../node_modules/pell/src/pell';

CSS

/* After pell styles are applied to DOM: */ .pell-content { height: 400px; }

License

MIT

Credits

BrowserStack for cross browser testing:

<a href="https://www.browserstack.com" target="_blank" rel="noopener noreferrer"><img width="128" src="./images/browserstack.png" alt="BrowserStack logo"></a>

编辑推荐精选

QoderWork

QoderWork

阿里Qoder团队推出的桌面端AI智能体

QoderWork 是阿里推出的本地优先桌面 AI 智能体,适配 macOS14+/Windows10+,以自然语言交互实现文件管理、数据分析、AI 视觉生成、浏览器自动化等办公任务,自主拆解执行复杂工作流,数据本地运行零上传,技能市场可无限扩展,是高效的 Agentic 生产力办公助手。

音述AI

音述AI

全球首个AI音乐社区

音述AI是全球首个AI音乐社区,致力让每个人都能用音乐表达自我。音述AI提供零门槛AI创作工具,独创GETI法则帮助用户精准定义音乐风格,AI润色功能支持自动优化作品质感。音述AI支持交流讨论、二次创作与价值变现。针对中文用户的语言习惯与文化背景进行专门优化,支持国风融合、C-pop等本土音乐标签,让技术更好地承载人文表达。

lynote.ai

lynote.ai

一站式搞定所有学习需求

不再被海量信息淹没,开始真正理解知识。Lynote 可摘要 YouTube 视频、PDF、文章等内容。即时创建笔记,检测 AI 内容并下载资料,将您的学习效率提升 10 倍。

AniShort

AniShort

为AI短剧协作而生

专为AI短剧协作而生的AniShort正式发布,深度重构AI短剧全流程生产模式,整合创意策划、制作执行、实时协作、在线审片、资产复用等全链路功能,独创无限画布、双轨并行工业化工作流与Ani智能体助手,集成多款主流AI大模型,破解素材零散、版本混乱、沟通低效等行业痛点,助力3人团队效率提升800%,打造标准化、可追溯的AI短剧量产体系,是AI短剧团队协同创作、提升制作效率的核心工具。

seedancetwo2.0

seedancetwo2.0

能听懂你表达的视频模型

Seedance two是基于seedance2.0的中国大模型,支持图像、视频、音频、文本四种模态输入,表达方式更丰富,生成也更可控。

nano-banana纳米香蕉中文站

nano-banana纳米香蕉中文站

国内直接访问,限时3折

输入简单文字,生成想要的图片,纳米香蕉中文站基于 Google 模型的 AI 图片生成网站,支持文字生图、图生图。官网价格限时3折活动

扣子-AI办公

扣子-AI办公

职场AI,就用扣子

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

堆友

堆友

多风格AI绘画神器

堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。

图像生成热门AI工具AI图像AI反应堆AI工具箱AI绘画GOAI艺术字堆友相机
码上飞

码上飞

零代码AI应用开发平台

零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

下拉加载更多