0.5.0-alpha.4 • Published 4 months ago

@mercuriya/slate-linkify v0.5.0-alpha.4

Weekly downloads
265
License
MIT
Repository
github
Last release
4 months ago

slate-linkify

Plugin transforms typed or pasted hyperlinks into an anchor tags.

Installation

yarn add @mercuriya/slate-linkify
npm install @mercuriya/slate-linkify --save

Configuration

In your file with Slate component:

import React from 'react';
import { createEditor } from 'slate';
import { Slate, Editable, useSlateStatic, withReact } from 'slate-react';
import { onKeyDown as linkifyOnKeyDown, withLinkify } from '@mercuriya/slate-linkify';
import Link from '@material-ui/core/Link';

export default function EditorComponent(props) {
  const [value, setValue] = useState([ /* some initial state here */ ]);
  const editor = useMemo(
    () =>
      withLinkify(withReact(createEditor()), {
        // slate-linkify options
        renderComponent: props => <Link {...props} />,
      }),
    [],
  );
  const renderElement = useCallback(props => <Element {...props} />, []);
  const onKeyDown = useCallback(function handleKeyDown(event) {
    linkifyOnKeyDown(event, editor);
  }, []);

  return (
    <Slate editor={editor} value={value} onChange={value => setValue(value)}>
      <Editable renderElement={renderElement} onKeyDown={onKeyDown} />
    </Slate>
  );
}

const Element = ({ attributes, children, element }) => {
  const editor = useSlateStatic();
  switch (element.type) {
    case 'link':
      // ❗️ this part is required
      return editor.linkElementType({ attributes, children, element });
    default:
      return <p {...attributes}>{children}</p>;
  }
};

Description

This plugin inspired by amazing draft-js-linkify-plugin and slate plugins official examples. It allows user to create links while typing or pasting without any additional manipulations.

It has issues, like: it doesn't know if remote site should use https or not. For example in cases like: typing...typing... google.com continue typing.... It is also ignores html pastes, because, in my opinion, they should be handled by other plugins, as official paste-html example does.

Please, see stories for more usage examples.

Options

NameTypeDescription
target? (default: _blank)stringAn anchor target property
rel? (default: noreferrer noopener)stringAn anchor rel property
className?stringAn anchor custom class name
renderComponent?args => React.ReactNodeA render function that allows you to use a custom link component with props you need
0.5.0-alpha.3

4 months ago

0.5.0-alpha.4

4 months ago

0.5.0-alpha.2

4 months ago

0.5.0-alpha.1

11 months ago

0.4.1

3 years ago

0.4.0

3 years ago

0.3.0

4 years ago

0.3.1

4 years ago

0.2.0

4 years ago

0.1.2

5 years ago

0.1.1

5 years ago

0.1.0

5 years ago