Skip to content
This repository was archived by the owner on Aug 16, 2021. It is now read-only.

Repository files navigation

mb-rich-text-editor

NPMJavaScript Style Guide

Why build this editor?

There are so many rich text editor for js, like Quill, Draft.js, which have already been widely used, so why do we need another?

If you have used Sketch, you can see the text editing inside it cares a little different from the editors we mentioned before. In Sketch, text is more like a layer but not an article, each text has its accurate value for font size, font weight, typeface, and spacings for character, line, paragraph. Sketch styles text as designers would do it, but not common users who only need 'h1' as a set of rules to style a header, and do not care much about what exactly the rules are, like the font size, font family, typeface, and so on. So if your app faces designers who treat text more precisely, and want more control over the style of it, you will find it is rough for the editors to handle that, you can't even specify a font size. That is why this editor is created.

What are the differences?

As I mentioned in previous paragraph, this editor aims at people who need a similar text editor in Sketch but not in blog or comment system, so it focus different aspects. You can check the following list to see if you should choose this editor over others:

  • prefers to specify exact values for styling text (no h1s, h2s here to style headers for you)
  • treats text like layers but not articles (focus on what text itself looks like, no concepts like 'ordered list' here)
  • text is text, no links or images can be inserted (if you consider text as layers, this one is not hard to follow)

or you can try it here online to check all features. You should feel comfortable playing it if you have experience with Sketch. Also it's not hard to notice that you can input value for attributes when you want to style a selected area, for selection is safe inside the editor, it won't get lost when you focus on other inputs ;)

Install

yarn install --save mb-rich-text-editor

Usage

1. the editor component

This package will export a default React component, which you can simply import where you expect it.

importReact,{Component}from'react'importEditorfrom'mb-rich-text-editor'classExampleextendsComponent{render(){return(<Editorstore={{ paras }}onSelectionChange={this.handleSelectionChange}onContentChange={this.handleContentChange}/>)}}

Actually, it has only one required prop: store. store is an object that represents the state of the editor, you need to pass an initial state here, but editor will take care of that once it mount. It's structured as:

{paras: [// the style and content of the text inside// each object inside represents a paragraph{paraSpacing: 0,// spacing between paragraphschildren: [// each object inside represents a span inside the paragraph{text: 'hello world',fontFamily: 'Courier New',fontWeight: 'regular',fontSize: 14,color: '#333333',letterSpacing: 0,textDecoration: 'line-through',fontStyle: 'italic',}]}],selection: {// selection inside the editor,// if omitted, default to selecting the whole contentstart: [// selection start point0,// which paragraph it's in0,// which span it's in0,// it's offset in span],end: [// selection end point0,0,0,],}}

some of the styles in paras can be omitted if a default style is specified(see how to specify your default style).

When the content inside the editor changes, onContentChange gets called with the store object mentioned before.

When user manually select text or the content inside the editor changes, onSelectionChange gets called with the store object.

2. rich editing

You may have many buttons, selectors, inputs to manage style, just import editorBridge to do that. Don't worry about the selected area that you want to apply your style, editor will remember that for you.

import{editorBridge}from'mb-rich-text-editor'editorBridge.setAttr(attr,value)

for example, if you want to set a selected area's font size to 53px, just type:

editorBridge.setAttr('fontSize',53)

3. configure the editor

Generally an app has only one editor get focus at a time, and all editors behaves similar in one app. So you can configure how editors act like in your entry point.

// your entry pointimport{configureEditor}from'mb-rich-text-editor'constDEFAULT_STYLE={fontFamily: 'Arial',fontWeight: 'regular',fontSize: 14,color: '#101010',fontStyle: 'normal',textDecoration: 'none',letterSpacing: 0}configureEditor({defaultStyle: DEFAULT_STYLE,// default style for non-styled textclipboard: {stripOutsidePastedStyle: false// defaults to be true, means style of pasted content from outside will be stripped},})

4. util functions

The package will also export some util functions:

  • editorBridge it contains 2 method to interact with the state of the editor:
    • editorBridge.getStore: get current state of the editor
    • editorBridge.setAttr: for rich editing
  • getHTML: get HTML code as string for giving paras and selections
  • getRichTextAttr: get style for giving paras and selections
  • setAttrForParas: get new paras for setting attr entirely, often useful for set attrs of the content outside editing

Bugs and issues

Reporting bugs and starting issues will always be appreciated.

License

GPL © Xdudu

About

A Sketch-like text editor.

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - mockingbot/mb-rich-text-editor: A Sketch-like text editor. · GitHub
Skip to content
This repository was archived by the owner on Aug 16, 2021. It is now read-only.

Repository files navigation

mb-rich-text-editor

NPMJavaScript Style Guide

Why build this editor?

There are so many rich text editor for js, like Quill, Draft.js, which have already been widely used, so why do we need another?

If you have used Sketch, you can see the text editing inside it cares a little different from the editors we mentioned before. In Sketch, text is more like a layer but not an article, each text has its accurate value for font size, font weight, typeface, and spacings for character, line, paragraph. Sketch styles text as designers would do it, but not common users who only need 'h1' as a set of rules to style a header, and do not care much about what exactly the rules are, like the font size, font family, typeface, and so on. So if your app faces designers who treat text more precisely, and want more control over the style of it, you will find it is rough for the editors to handle that, you can't even specify a font size. That is why this editor is created.

What are the differences?

As I mentioned in previous paragraph, this editor aims at people who need a similar text editor in Sketch but not in blog or comment system, so it focus different aspects. You can check the following list to see if you should choose this editor over others:

  • prefers to specify exact values for styling text (no h1s, h2s here to style headers for you)
  • treats text like layers but not articles (focus on what text itself looks like, no concepts like 'ordered list' here)
  • text is text, no links or images can be inserted (if you consider text as layers, this one is not hard to follow)

or you can try it here online to check all features. You should feel comfortable playing it if you have experience with Sketch. Also it's not hard to notice that you can input value for attributes when you want to style a selected area, for selection is safe inside the editor, it won't get lost when you focus on other inputs ;)

Install

yarn install --save mb-rich-text-editor

Usage

1. the editor component

This package will export a default React component, which you can simply import where you expect it.

importReact,{Component}from'react'importEditorfrom'mb-rich-text-editor'classExampleextendsComponent{render(){return(<Editorstore={{ paras }}onSelectionChange={this.handleSelectionChange}onContentChange={this.handleContentChange}/>)}}

Actually, it has only one required prop: store. store is an object that represents the state of the editor, you need to pass an initial state here, but editor will take care of that once it mount. It's structured as:

{paras: [// the style and content of the text inside// each object inside represents a paragraph{paraSpacing: 0,// spacing between paragraphschildren: [// each object inside represents a span inside the paragraph{text: 'hello world',fontFamily: 'Courier New',fontWeight: 'regular',fontSize: 14,color: '#333333',letterSpacing: 0,textDecoration: 'line-through',fontStyle: 'italic',}]}],selection: {// selection inside the editor,// if omitted, default to selecting the whole contentstart: [// selection start point0,// which paragraph it's in0,// which span it's in0,// it's offset in span],end: [// selection end point0,0,0,],}}

some of the styles in paras can be omitted if a default style is specified(see how to specify your default style).

When the content inside the editor changes, onContentChange gets called with the store object mentioned before.

When user manually select text or the content inside the editor changes, onSelectionChange gets called with the store object.

2. rich editing

You may have many buttons, selectors, inputs to manage style, just import editorBridge to do that. Don't worry about the selected area that you want to apply your style, editor will remember that for you.

import{editorBridge}from'mb-rich-text-editor'editorBridge.setAttr(attr,value)

for example, if you want to set a selected area's font size to 53px, just type:

editorBridge.setAttr('fontSize',53)

3. configure the editor

Generally an app has only one editor get focus at a time, and all editors behaves similar in one app. So you can configure how editors act like in your entry point.

// your entry pointimport{configureEditor}from'mb-rich-text-editor'constDEFAULT_STYLE={fontFamily: 'Arial',fontWeight: 'regular',fontSize: 14,color: '#101010',fontStyle: 'normal',textDecoration: 'none',letterSpacing: 0}configureEditor({defaultStyle: DEFAULT_STYLE,// default style for non-styled textclipboard: {stripOutsidePastedStyle: false// defaults to be true, means style of pasted content from outside will be stripped},})

4. util functions

The package will also export some util functions:

  • editorBridge it contains 2 method to interact with the state of the editor:
    • editorBridge.getStore: get current state of the editor
    • editorBridge.setAttr: for rich editing
  • getHTML: get HTML code as string for giving paras and selections
  • getRichTextAttr: get style for giving paras and selections
  • setAttrForParas: get new paras for setting attr entirely, often useful for set attrs of the content outside editing

Bugs and issues

Reporting bugs and starting issues will always be appreciated.

License

GPL © Xdudu

About

A Sketch-like text editor.

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - mockingbot/mb-rich-text-editor: A Sketch-like text editor. · GitHub
Skip to content
This repository was archived by the owner on Aug 16, 2021. It is now read-only.

Repository files navigation

mb-rich-text-editor

NPMJavaScript Style Guide

Why build this editor?

There are so many rich text editor for js, like Quill, Draft.js, which have already been widely used, so why do we need another?

If you have used Sketch, you can see the text editing inside it cares a little different from the editors we mentioned before. In Sketch, text is more like a layer but not an article, each text has its accurate value for font size, font weight, typeface, and spacings for character, line, paragraph. Sketch styles text as designers would do it, but not common users who only need 'h1' as a set of rules to style a header, and do not care much about what exactly the rules are, like the font size, font family, typeface, and so on. So if your app faces designers who treat text more precisely, and want more control over the style of it, you will find it is rough for the editors to handle that, you can't even specify a font size. That is why this editor is created.

What are the differences?

As I mentioned in previous paragraph, this editor aims at people who need a similar text editor in Sketch but not in blog or comment system, so it focus different aspects. You can check the following list to see if you should choose this editor over others:

  • prefers to specify exact values for styling text (no h1s, h2s here to style headers for you)
  • treats text like layers but not articles (focus on what text itself looks like, no concepts like 'ordered list' here)
  • text is text, no links or images can be inserted (if you consider text as layers, this one is not hard to follow)

or you can try it here online to check all features. You should feel comfortable playing it if you have experience with Sketch. Also it's not hard to notice that you can input value for attributes when you want to style a selected area, for selection is safe inside the editor, it won't get lost when you focus on other inputs ;)

Install

yarn install --save mb-rich-text-editor

Usage

1. the editor component

This package will export a default React component, which you can simply import where you expect it.

importReact,{Component}from'react'importEditorfrom'mb-rich-text-editor'classExampleextendsComponent{render(){return(<Editorstore={{ paras }}onSelectionChange={this.handleSelectionChange}onContentChange={this.handleContentChange}/>)}}

Actually, it has only one required prop: store. store is an object that represents the state of the editor, you need to pass an initial state here, but editor will take care of that once it mount. It's structured as:

{paras: [// the style and content of the text inside// each object inside represents a paragraph{paraSpacing: 0,// spacing between paragraphschildren: [// each object inside represents a span inside the paragraph{text: 'hello world',fontFamily: 'Courier New',fontWeight: 'regular',fontSize: 14,color: '#333333',letterSpacing: 0,textDecoration: 'line-through',fontStyle: 'italic',}]}],selection: {// selection inside the editor,// if omitted, default to selecting the whole contentstart: [// selection start point0,// which paragraph it's in0,// which span it's in0,// it's offset in span],end: [// selection end point0,0,0,],}}

some of the styles in paras can be omitted if a default style is specified(see how to specify your default style).

When the content inside the editor changes, onContentChange gets called with the store object mentioned before.

When user manually select text or the content inside the editor changes, onSelectionChange gets called with the store object.

2. rich editing

You may have many buttons, selectors, inputs to manage style, just import editorBridge to do that. Don't worry about the selected area that you want to apply your style, editor will remember that for you.

import{editorBridge}from'mb-rich-text-editor'editorBridge.setAttr(attr,value)

for example, if you want to set a selected area's font size to 53px, just type:

editorBridge.setAttr('fontSize',53)

3. configure the editor

Generally an app has only one editor get focus at a time, and all editors behaves similar in one app. So you can configure how editors act like in your entry point.

// your entry pointimport{configureEditor}from'mb-rich-text-editor'constDEFAULT_STYLE={fontFamily: 'Arial',fontWeight: 'regular',fontSize: 14,color: '#101010',fontStyle: 'normal',textDecoration: 'none',letterSpacing: 0}configureEditor({defaultStyle: DEFAULT_STYLE,// default style for non-styled textclipboard: {stripOutsidePastedStyle: false// defaults to be true, means style of pasted content from outside will be stripped},})

4. util functions

The package will also export some util functions:

  • editorBridge it contains 2 method to interact with the state of the editor:
    • editorBridge.getStore: get current state of the editor
    • editorBridge.setAttr: for rich editing
  • getHTML: get HTML code as string for giving paras and selections
  • getRichTextAttr: get style for giving paras and selections
  • setAttrForParas: get new paras for setting attr entirely, often useful for set attrs of the content outside editing

Bugs and issues

Reporting bugs and starting issues will always be appreciated.

License

GPL © Xdudu

About

A Sketch-like text editor.

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - mockingbot/mb-rich-text-editor: A Sketch-like text editor. · GitHub
Skip to content
This repository was archived by the owner on Aug 16, 2021. It is now read-only.

Repository files navigation

mb-rich-text-editor

NPMJavaScript Style Guide

Why build this editor?

There are so many rich text editor for js, like Quill, Draft.js, which have already been widely used, so why do we need another?

If you have used Sketch, you can see the text editing inside it cares a little different from the editors we mentioned before. In Sketch, text is more like a layer but not an article, each text has its accurate value for font size, font weight, typeface, and spacings for character, line, paragraph. Sketch styles text as designers would do it, but not common users who only need 'h1' as a set of rules to style a header, and do not care much about what exactly the rules are, like the font size, font family, typeface, and so on. So if your app faces designers who treat text more precisely, and want more control over the style of it, you will find it is rough for the editors to handle that, you can't even specify a font size. That is why this editor is created.

What are the differences?

As I mentioned in previous paragraph, this editor aims at people who need a similar text editor in Sketch but not in blog or comment system, so it focus different aspects. You can check the following list to see if you should choose this editor over others:

  • prefers to specify exact values for styling text (no h1s, h2s here to style headers for you)
  • treats text like layers but not articles (focus on what text itself looks like, no concepts like 'ordered list' here)
  • text is text, no links or images can be inserted (if you consider text as layers, this one is not hard to follow)

or you can try it here online to check all features. You should feel comfortable playing it if you have experience with Sketch. Also it's not hard to notice that you can input value for attributes when you want to style a selected area, for selection is safe inside the editor, it won't get lost when you focus on other inputs ;)

Install

yarn install --save mb-rich-text-editor

Usage

1. the editor component

This package will export a default React component, which you can simply import where you expect it.

importReact,{Component}from'react'importEditorfrom'mb-rich-text-editor'classExampleextendsComponent{render(){return(<Editorstore={{ paras }}onSelectionChange={this.handleSelectionChange}onContentChange={this.handleContentChange}/>)}}

Actually, it has only one required prop: store. store is an object that represents the state of the editor, you need to pass an initial state here, but editor will take care of that once it mount. It's structured as:

{paras: [// the style and content of the text inside// each object inside represents a paragraph{paraSpacing: 0,// spacing between paragraphschildren: [// each object inside represents a span inside the paragraph{text: 'hello world',fontFamily: 'Courier New',fontWeight: 'regular',fontSize: 14,color: '#333333',letterSpacing: 0,textDecoration: 'line-through',fontStyle: 'italic',}]}],selection: {// selection inside the editor,// if omitted, default to selecting the whole contentstart: [// selection start point0,// which paragraph it's in0,// which span it's in0,// it's offset in span],end: [// selection end point0,0,0,],}}

some of the styles in paras can be omitted if a default style is specified(see how to specify your default style).

When the content inside the editor changes, onContentChange gets called with the store object mentioned before.

When user manually select text or the content inside the editor changes, onSelectionChange gets called with the store object.

2. rich editing

You may have many buttons, selectors, inputs to manage style, just import editorBridge to do that. Don't worry about the selected area that you want to apply your style, editor will remember that for you.

import{editorBridge}from'mb-rich-text-editor'editorBridge.setAttr(attr,value)

for example, if you want to set a selected area's font size to 53px, just type:

editorBridge.setAttr('fontSize',53)

3. configure the editor

Generally an app has only one editor get focus at a time, and all editors behaves similar in one app. So you can configure how editors act like in your entry point.

// your entry pointimport{configureEditor}from'mb-rich-text-editor'constDEFAULT_STYLE={fontFamily: 'Arial',fontWeight: 'regular',fontSize: 14,color: '#101010',fontStyle: 'normal',textDecoration: 'none',letterSpacing: 0}configureEditor({defaultStyle: DEFAULT_STYLE,// default style for non-styled textclipboard: {stripOutsidePastedStyle: false// defaults to be true, means style of pasted content from outside will be stripped},})

4. util functions

The package will also export some util functions:

  • editorBridge it contains 2 method to interact with the state of the editor:
    • editorBridge.getStore: get current state of the editor
    • editorBridge.setAttr: for rich editing
  • getHTML: get HTML code as string for giving paras and selections
  • getRichTextAttr: get style for giving paras and selections
  • setAttrForParas: get new paras for setting attr entirely, often useful for set attrs of the content outside editing

Bugs and issues

Reporting bugs and starting issues will always be appreciated.

License

GPL © Xdudu

About

A Sketch-like text editor.

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - mockingbot/mb-rich-text-editor: A Sketch-like text editor. · GitHub
Skip to content
This repository was archived by the owner on Aug 16, 2021. It is now read-only.

Repository files navigation

mb-rich-text-editor

NPMJavaScript Style Guide

Why build this editor?

There are so many rich text editor for js, like Quill, Draft.js, which have already been widely used, so why do we need another?

If you have used Sketch, you can see the text editing inside it cares a little different from the editors we mentioned before. In Sketch, text is more like a layer but not an article, each text has its accurate value for font size, font weight, typeface, and spacings for character, line, paragraph. Sketch styles text as designers would do it, but not common users who only need 'h1' as a set of rules to style a header, and do not care much about what exactly the rules are, like the font size, font family, typeface, and so on. So if your app faces designers who treat text more precisely, and want more control over the style of it, you will find it is rough for the editors to handle that, you can't even specify a font size. That is why this editor is created.

What are the differences?

As I mentioned in previous paragraph, this editor aims at people who need a similar text editor in Sketch but not in blog or comment system, so it focus different aspects. You can check the following list to see if you should choose this editor over others:

  • prefers to specify exact values for styling text (no h1s, h2s here to style headers for you)
  • treats text like layers but not articles (focus on what text itself looks like, no concepts like 'ordered list' here)
  • text is text, no links or images can be inserted (if you consider text as layers, this one is not hard to follow)

or you can try it here online to check all features. You should feel comfortable playing it if you have experience with Sketch. Also it's not hard to notice that you can input value for attributes when you want to style a selected area, for selection is safe inside the editor, it won't get lost when you focus on other inputs ;)

Install

yarn install --save mb-rich-text-editor

Usage

1. the editor component

This package will export a default React component, which you can simply import where you expect it.

importReact,{Component}from'react'importEditorfrom'mb-rich-text-editor'classExampleextendsComponent{render(){return(<Editorstore={{ paras }}onSelectionChange={this.handleSelectionChange}onContentChange={this.handleContentChange}/>)}}

Actually, it has only one required prop: store. store is an object that represents the state of the editor, you need to pass an initial state here, but editor will take care of that once it mount. It's structured as:

{paras: [// the style and content of the text inside// each object inside represents a paragraph{paraSpacing: 0,// spacing between paragraphschildren: [// each object inside represents a span inside the paragraph{text: 'hello world',fontFamily: 'Courier New',fontWeight: 'regular',fontSize: 14,color: '#333333',letterSpacing: 0,textDecoration: 'line-through',fontStyle: 'italic',}]}],selection: {// selection inside the editor,// if omitted, default to selecting the whole contentstart: [// selection start point0,// which paragraph it's in0,// which span it's in0,// it's offset in span],end: [// selection end point0,0,0,],}}

some of the styles in paras can be omitted if a default style is specified(see how to specify your default style).

When the content inside the editor changes, onContentChange gets called with the store object mentioned before.

When user manually select text or the content inside the editor changes, onSelectionChange gets called with the store object.

2. rich editing

You may have many buttons, selectors, inputs to manage style, just import editorBridge to do that. Don't worry about the selected area that you want to apply your style, editor will remember that for you.

import{editorBridge}from'mb-rich-text-editor'editorBridge.setAttr(attr,value)

for example, if you want to set a selected area's font size to 53px, just type:

editorBridge.setAttr('fontSize',53)

3. configure the editor

Generally an app has only one editor get focus at a time, and all editors behaves similar in one app. So you can configure how editors act like in your entry point.

// your entry pointimport{configureEditor}from'mb-rich-text-editor'constDEFAULT_STYLE={fontFamily: 'Arial',fontWeight: 'regular',fontSize: 14,color: '#101010',fontStyle: 'normal',textDecoration: 'none',letterSpacing: 0}configureEditor({defaultStyle: DEFAULT_STYLE,// default style for non-styled textclipboard: {stripOutsidePastedStyle: false// defaults to be true, means style of pasted content from outside will be stripped},})

4. util functions

The package will also export some util functions:

  • editorBridge it contains 2 method to interact with the state of the editor:
    • editorBridge.getStore: get current state of the editor
    • editorBridge.setAttr: for rich editing
  • getHTML: get HTML code as string for giving paras and selections
  • getRichTextAttr: get style for giving paras and selections
  • setAttrForParas: get new paras for setting attr entirely, often useful for set attrs of the content outside editing

Bugs and issues

Reporting bugs and starting issues will always be appreciated.

License

GPL © Xdudu

About

A Sketch-like text editor.

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - mockingbot/mb-rich-text-editor: A Sketch-like text editor. · GitHub
Skip to content
This repository was archived by the owner on Aug 16, 2021. It is now read-only.

Repository files navigation

mb-rich-text-editor

NPMJavaScript Style Guide

Why build this editor?

There are so many rich text editor for js, like Quill, Draft.js, which have already been widely used, so why do we need another?

If you have used Sketch, you can see the text editing inside it cares a little different from the editors we mentioned before. In Sketch, text is more like a layer but not an article, each text has its accurate value for font size, font weight, typeface, and spacings for character, line, paragraph. Sketch styles text as designers would do it, but not common users who only need 'h1' as a set of rules to style a header, and do not care much about what exactly the rules are, like the font size, font family, typeface, and so on. So if your app faces designers who treat text more precisely, and want more control over the style of it, you will find it is rough for the editors to handle that, you can't even specify a font size. That is why this editor is created.

What are the differences?

As I mentioned in previous paragraph, this editor aims at people who need a similar text editor in Sketch but not in blog or comment system, so it focus different aspects. You can check the following list to see if you should choose this editor over others:

  • prefers to specify exact values for styling text (no h1s, h2s here to style headers for you)
  • treats text like layers but not articles (focus on what text itself looks like, no concepts like 'ordered list' here)
  • text is text, no links or images can be inserted (if you consider text as layers, this one is not hard to follow)

or you can try it here online to check all features. You should feel comfortable playing it if you have experience with Sketch. Also it's not hard to notice that you can input value for attributes when you want to style a selected area, for selection is safe inside the editor, it won't get lost when you focus on other inputs ;)

Install

yarn install --save mb-rich-text-editor

Usage

1. the editor component

This package will export a default React component, which you can simply import where you expect it.

importReact,{Component}from'react'importEditorfrom'mb-rich-text-editor'classExampleextendsComponent{render(){return(<Editorstore={{ paras }}onSelectionChange={this.handleSelectionChange}onContentChange={this.handleContentChange}/>)}}

Actually, it has only one required prop: store. store is an object that represents the state of the editor, you need to pass an initial state here, but editor will take care of that once it mount. It's structured as:

{paras: [// the style and content of the text inside// each object inside represents a paragraph{paraSpacing: 0,// spacing between paragraphschildren: [// each object inside represents a span inside the paragraph{text: 'hello world',fontFamily: 'Courier New',fontWeight: 'regular',fontSize: 14,color: '#333333',letterSpacing: 0,textDecoration: 'line-through',fontStyle: 'italic',}]}],selection: {// selection inside the editor,// if omitted, default to selecting the whole contentstart: [// selection start point0,// which paragraph it's in0,// which span it's in0,// it's offset in span],end: [// selection end point0,0,0,],}}

some of the styles in paras can be omitted if a default style is specified(see how to specify your default style).

When the content inside the editor changes, onContentChange gets called with the store object mentioned before.

When user manually select text or the content inside the editor changes, onSelectionChange gets called with the store object.

2. rich editing

You may have many buttons, selectors, inputs to manage style, just import editorBridge to do that. Don't worry about the selected area that you want to apply your style, editor will remember that for you.

import{editorBridge}from'mb-rich-text-editor'editorBridge.setAttr(attr,value)

for example, if you want to set a selected area's font size to 53px, just type:

editorBridge.setAttr('fontSize',53)

3. configure the editor

Generally an app has only one editor get focus at a time, and all editors behaves similar in one app. So you can configure how editors act like in your entry point.

// your entry pointimport{configureEditor}from'mb-rich-text-editor'constDEFAULT_STYLE={fontFamily: 'Arial',fontWeight: 'regular',fontSize: 14,color: '#101010',fontStyle: 'normal',textDecoration: 'none',letterSpacing: 0}configureEditor({defaultStyle: DEFAULT_STYLE,// default style for non-styled textclipboard: {stripOutsidePastedStyle: false// defaults to be true, means style of pasted content from outside will be stripped},})

4. util functions

The package will also export some util functions:

  • editorBridge it contains 2 method to interact with the state of the editor:
    • editorBridge.getStore: get current state of the editor
    • editorBridge.setAttr: for rich editing
  • getHTML: get HTML code as string for giving paras and selections
  • getRichTextAttr: get style for giving paras and selections
  • setAttrForParas: get new paras for setting attr entirely, often useful for set attrs of the content outside editing

Bugs and issues

Reporting bugs and starting issues will always be appreciated.

License

GPL © Xdudu

About

A Sketch-like text editor.

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - mockingbot/mb-rich-text-editor: A Sketch-like text editor. · GitHub
Skip to content
This repository was archived by the owner on Aug 16, 2021. It is now read-only.

Repository files navigation

mb-rich-text-editor

NPMJavaScript Style Guide

Why build this editor?

There are so many rich text editor for js, like Quill, Draft.js, which have already been widely used, so why do we need another?

If you have used Sketch, you can see the text editing inside it cares a little different from the editors we mentioned before. In Sketch, text is more like a layer but not an article, each text has its accurate value for font size, font weight, typeface, and spacings for character, line, paragraph. Sketch styles text as designers would do it, but not common users who only need 'h1' as a set of rules to style a header, and do not care much about what exactly the rules are, like the font size, font family, typeface, and so on. So if your app faces designers who treat text more precisely, and want more control over the style of it, you will find it is rough for the editors to handle that, you can't even specify a font size. That is why this editor is created.

What are the differences?

As I mentioned in previous paragraph, this editor aims at people who need a similar text editor in Sketch but not in blog or comment system, so it focus different aspects. You can check the following list to see if you should choose this editor over others:

  • prefers to specify exact values for styling text (no h1s, h2s here to style headers for you)
  • treats text like layers but not articles (focus on what text itself looks like, no concepts like 'ordered list' here)
  • text is text, no links or images can be inserted (if you consider text as layers, this one is not hard to follow)

or you can try it here online to check all features. You should feel comfortable playing it if you have experience with Sketch. Also it's not hard to notice that you can input value for attributes when you want to style a selected area, for selection is safe inside the editor, it won't get lost when you focus on other inputs ;)

Install

yarn install --save mb-rich-text-editor

Usage

1. the editor component

This package will export a default React component, which you can simply import where you expect it.

importReact,{Component}from'react'importEditorfrom'mb-rich-text-editor'classExampleextendsComponent{render(){return(<Editorstore={{ paras }}onSelectionChange={this.handleSelectionChange}onContentChange={this.handleContentChange}/>)}}

Actually, it has only one required prop: store. store is an object that represents the state of the editor, you need to pass an initial state here, but editor will take care of that once it mount. It's structured as:

{paras: [// the style and content of the text inside// each object inside represents a paragraph{paraSpacing: 0,// spacing between paragraphschildren: [// each object inside represents a span inside the paragraph{text: 'hello world',fontFamily: 'Courier New',fontWeight: 'regular',fontSize: 14,color: '#333333',letterSpacing: 0,textDecoration: 'line-through',fontStyle: 'italic',}]}],selection: {// selection inside the editor,// if omitted, default to selecting the whole contentstart: [// selection start point0,// which paragraph it's in0,// which span it's in0,// it's offset in span],end: [// selection end point0,0,0,],}}

some of the styles in paras can be omitted if a default style is specified(see how to specify your default style).

When the content inside the editor changes, onContentChange gets called with the store object mentioned before.

When user manually select text or the content inside the editor changes, onSelectionChange gets called with the store object.

2. rich editing

You may have many buttons, selectors, inputs to manage style, just import editorBridge to do that. Don't worry about the selected area that you want to apply your style, editor will remember that for you.

import{editorBridge}from'mb-rich-text-editor'editorBridge.setAttr(attr,value)

for example, if you want to set a selected area's font size to 53px, just type:

editorBridge.setAttr('fontSize',53)

3. configure the editor

Generally an app has only one editor get focus at a time, and all editors behaves similar in one app. So you can configure how editors act like in your entry point.

// your entry pointimport{configureEditor}from'mb-rich-text-editor'constDEFAULT_STYLE={fontFamily: 'Arial',fontWeight: 'regular',fontSize: 14,color: '#101010',fontStyle: 'normal',textDecoration: 'none',letterSpacing: 0}configureEditor({defaultStyle: DEFAULT_STYLE,// default style for non-styled textclipboard: {stripOutsidePastedStyle: false// defaults to be true, means style of pasted content from outside will be stripped},})

4. util functions

The package will also export some util functions:

  • editorBridge it contains 2 method to interact with the state of the editor:
    • editorBridge.getStore: get current state of the editor
    • editorBridge.setAttr: for rich editing
  • getHTML: get HTML code as string for giving paras and selections
  • getRichTextAttr: get style for giving paras and selections
  • setAttrForParas: get new paras for setting attr entirely, often useful for set attrs of the content outside editing

Bugs and issues

Reporting bugs and starting issues will always be appreciated.

License

GPL © Xdudu

About

A Sketch-like text editor.

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - mockingbot/mb-rich-text-editor: A Sketch-like text editor. · GitHub
Skip to content
This repository was archived by the owner on Aug 16, 2021. It is now read-only.

Repository files navigation

mb-rich-text-editor

NPMJavaScript Style Guide

Why build this editor?

There are so many rich text editor for js, like Quill, Draft.js, which have already been widely used, so why do we need another?

If you have used Sketch, you can see the text editing inside it cares a little different from the editors we mentioned before. In Sketch, text is more like a layer but not an article, each text has its accurate value for font size, font weight, typeface, and spacings for character, line, paragraph. Sketch styles text as designers would do it, but not common users who only need 'h1' as a set of rules to style a header, and do not care much about what exactly the rules are, like the font size, font family, typeface, and so on. So if your app faces designers who treat text more precisely, and want more control over the style of it, you will find it is rough for the editors to handle that, you can't even specify a font size. That is why this editor is created.

What are the differences?

As I mentioned in previous paragraph, this editor aims at people who need a similar text editor in Sketch but not in blog or comment system, so it focus different aspects. You can check the following list to see if you should choose this editor over others:

  • prefers to specify exact values for styling text (no h1s, h2s here to style headers for you)
  • treats text like layers but not articles (focus on what text itself looks like, no concepts like 'ordered list' here)
  • text is text, no links or images can be inserted (if you consider text as layers, this one is not hard to follow)

or you can try it here online to check all features. You should feel comfortable playing it if you have experience with Sketch. Also it's not hard to notice that you can input value for attributes when you want to style a selected area, for selection is safe inside the editor, it won't get lost when you focus on other inputs ;)

Install

yarn install --save mb-rich-text-editor

Usage

1. the editor component

This package will export a default React component, which you can simply import where you expect it.

importReact,{Component}from'react'importEditorfrom'mb-rich-text-editor'classExampleextendsComponent{render(){return(<Editorstore={{ paras }}onSelectionChange={this.handleSelectionChange}onContentChange={this.handleContentChange}/>)}}

Actually, it has only one required prop: store. store is an object that represents the state of the editor, you need to pass an initial state here, but editor will take care of that once it mount. It's structured as:

{paras: [// the style and content of the text inside// each object inside represents a paragraph{paraSpacing: 0,// spacing between paragraphschildren: [// each object inside represents a span inside the paragraph{text: 'hello world',fontFamily: 'Courier New',fontWeight: 'regular',fontSize: 14,color: '#333333',letterSpacing: 0,textDecoration: 'line-through',fontStyle: 'italic',}]}],selection: {// selection inside the editor,// if omitted, default to selecting the whole contentstart: [// selection start point0,// which paragraph it's in0,// which span it's in0,// it's offset in span],end: [// selection end point0,0,0,],}}

some of the styles in paras can be omitted if a default style is specified(see how to specify your default style).

When the content inside the editor changes, onContentChange gets called with the store object mentioned before.

When user manually select text or the content inside the editor changes, onSelectionChange gets called with the store object.

2. rich editing

You may have many buttons, selectors, inputs to manage style, just import editorBridge to do that. Don't worry about the selected area that you want to apply your style, editor will remember that for you.

import{editorBridge}from'mb-rich-text-editor'editorBridge.setAttr(attr,value)

for example, if you want to set a selected area's font size to 53px, just type:

editorBridge.setAttr('fontSize',53)

3. configure the editor

Generally an app has only one editor get focus at a time, and all editors behaves similar in one app. So you can configure how editors act like in your entry point.

// your entry pointimport{configureEditor}from'mb-rich-text-editor'constDEFAULT_STYLE={fontFamily: 'Arial',fontWeight: 'regular',fontSize: 14,color: '#101010',fontStyle: 'normal',textDecoration: 'none',letterSpacing: 0}configureEditor({defaultStyle: DEFAULT_STYLE,// default style for non-styled textclipboard: {stripOutsidePastedStyle: false// defaults to be true, means style of pasted content from outside will be stripped},})

4. util functions

The package will also export some util functions:

  • editorBridge it contains 2 method to interact with the state of the editor:
    • editorBridge.getStore: get current state of the editor
    • editorBridge.setAttr: for rich editing
  • getHTML: get HTML code as string for giving paras and selections
  • getRichTextAttr: get style for giving paras and selections
  • setAttrForParas: get new paras for setting attr entirely, often useful for set attrs of the content outside editing

Bugs and issues

Reporting bugs and starting issues will always be appreciated.

License

GPL © Xdudu

About

A Sketch-like text editor.

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages