Clean up and working on the rich text editor. Will probably swap my version out for something else...
This commit is contained in:
@@ -24,6 +24,7 @@ import Strike from '@tiptap/extension-strike';
|
||||
import Text from '@tiptap/extension-text';
|
||||
import TextStyle from '@tiptap/extension-text-style';
|
||||
import Typography from '@tiptap/extension-typography';
|
||||
import Underline from '@tiptap/extension-underline';
|
||||
|
||||
import "./element_tiptap_editor.scss";
|
||||
|
||||
@@ -125,10 +126,11 @@ onMount(() => {
|
||||
CodeBlock, // part of StarterKit
|
||||
Italic, // part of StarterKit
|
||||
Strike, // part of StarterKit
|
||||
Underline, // part of StarterKit
|
||||
BulletList, // part of StarterKit
|
||||
Color.configure({ types: [TextStyle.name, ListItem.name] }),
|
||||
TextStyle.configure({ types: [ListItem.name] }),
|
||||
Heading.configure({ levels: [1, 2, 3, 4, 5, 6] }),
|
||||
// Color.configure({ types: [TextStyle.name, ListItem.name] }),
|
||||
// TextStyle.configure({ types: [ListItem.name] }),
|
||||
// Heading.configure({ levels: [1, 2, 3, 4, 5, 6] }),
|
||||
Highlight,
|
||||
History.configure({
|
||||
depth: 100,
|
||||
@@ -141,56 +143,56 @@ onMount(() => {
|
||||
protocols: ['http', 'https'],
|
||||
isAllowedUri: (url, ctx) => {
|
||||
try {
|
||||
// construct URL
|
||||
const parsedUrl = url.includes(':') ? new URL(url) : new URL(`${ctx.defaultProtocol}://${url}`)
|
||||
// construct URL
|
||||
const parsedUrl = url.includes(':') ? new URL(url) : new URL(`${ctx.defaultProtocol}://${url}`)
|
||||
|
||||
// use default validation
|
||||
if (!ctx.defaultValidate(parsedUrl.href)) {
|
||||
// use default validation
|
||||
if (!ctx.defaultValidate(parsedUrl.href)) {
|
||||
return false
|
||||
}
|
||||
|
||||
// disallowed protocols
|
||||
const disallowedProtocols = ['ftp', 'file', 'mailto']
|
||||
const protocol = parsedUrl.protocol.replace(':', '')
|
||||
|
||||
if (disallowedProtocols.includes(protocol)) {
|
||||
return false
|
||||
}
|
||||
|
||||
// only allow protocols specified in ctx.protocols
|
||||
const allowedProtocols = ctx.protocols.map(p => (typeof p === 'string' ? p : p.scheme))
|
||||
|
||||
if (!allowedProtocols.includes(protocol)) {
|
||||
return false
|
||||
}
|
||||
|
||||
// disallowed domains
|
||||
const disallowedDomains = ['example-phishing.com', 'malicious-site.net']
|
||||
const domain = parsedUrl.hostname
|
||||
|
||||
if (disallowedDomains.includes(domain)) {
|
||||
return false
|
||||
}
|
||||
|
||||
// all checks have passed
|
||||
return true
|
||||
} catch (error) {
|
||||
return false
|
||||
}
|
||||
|
||||
// disallowed protocols
|
||||
const disallowedProtocols = ['ftp', 'file', 'mailto']
|
||||
const protocol = parsedUrl.protocol.replace(':', '')
|
||||
|
||||
if (disallowedProtocols.includes(protocol)) {
|
||||
return false
|
||||
}
|
||||
|
||||
// only allow protocols specified in ctx.protocols
|
||||
const allowedProtocols = ctx.protocols.map(p => (typeof p === 'string' ? p : p.scheme))
|
||||
|
||||
if (!allowedProtocols.includes(protocol)) {
|
||||
return false
|
||||
}
|
||||
|
||||
// disallowed domains
|
||||
const disallowedDomains = ['example-phishing.com', 'malicious-site.net']
|
||||
const domain = parsedUrl.hostname
|
||||
|
||||
if (disallowedDomains.includes(domain)) {
|
||||
return false
|
||||
}
|
||||
|
||||
// all checks have passed
|
||||
return true
|
||||
} catch (error) {
|
||||
return false
|
||||
}
|
||||
},
|
||||
shouldAutoLink: url => {
|
||||
try {
|
||||
// construct URL
|
||||
const parsedUrl = url.includes(':') ? new URL(url) : new URL(`https://${url}`)
|
||||
// construct URL
|
||||
const parsedUrl = url.includes(':') ? new URL(url) : new URL(`https://${url}`)
|
||||
|
||||
// only auto-link if the domain is not in the disallowed list
|
||||
const disallowedDomains = ['example-no-autolink.com', 'another-no-autolink.com']
|
||||
const domain = parsedUrl.hostname
|
||||
// only auto-link if the domain is not in the disallowed list
|
||||
const disallowedDomains = ['example-no-autolink.com', 'another-no-autolink.com']
|
||||
const domain = parsedUrl.hostname
|
||||
|
||||
return !disallowedDomains.includes(domain)
|
||||
} catch (error) {
|
||||
return false
|
||||
}
|
||||
return !disallowedDomains.includes(domain)
|
||||
} catch (error) {
|
||||
return false
|
||||
}
|
||||
},
|
||||
}),
|
||||
ListItem,
|
||||
@@ -201,18 +203,20 @@ onMount(() => {
|
||||
Typography,
|
||||
],
|
||||
content: html_text,
|
||||
onTransaction: () => {
|
||||
onTransaction: ({ editor, transaction }) => {
|
||||
// console.log('onTransaction');
|
||||
// force re-render so `editor.isActive` works as expected
|
||||
editor = editor;
|
||||
// editor = editor;
|
||||
|
||||
let updated_html = editor.getHTML();
|
||||
if (updated_html == '<p></p>') {
|
||||
new_html = '';
|
||||
} else {
|
||||
new_html = updated_html;
|
||||
}
|
||||
// let updated_html = editor.getHTML();
|
||||
// if (updated_html == '<p></p>') {
|
||||
// new_html = '';
|
||||
// } else {
|
||||
// new_html = updated_html;
|
||||
// }
|
||||
},
|
||||
onUpdate: ({ editor }) => {
|
||||
console.log('onUpdate', editor.getHTML());
|
||||
let updated_html = editor.getHTML();
|
||||
if (updated_html == '<p></p>') {
|
||||
new_html = '';
|
||||
|
||||
Reference in New Issue
Block a user