@wordpress/format-library 4.20.1 → 4.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 4.21.0 (2023-10-18)
6
+
5
7
  ## 4.20.0 (2023-10-05)
6
8
 
7
9
  ## 4.19.0 (2023-09-20)
@@ -120,24 +120,28 @@ const link = {
120
120
  html,
121
121
  plainText
122
122
  }) {
123
- if ((0, _richText.isCollapsed)(value)) {
124
- return value;
125
- }
126
123
  const pastedText = (html || plainText).replace(/<[^>]+>/g, '').trim();
127
124
 
128
125
  // A URL was pasted, turn the selection into a link.
129
- if (!(0, _url.isURL)(pastedText)) {
126
+ // For the link pasting feature, allow only http(s) protocols.
127
+ if (!(0, _url.isURL)(pastedText) || !/^https?:/.test(pastedText)) {
130
128
  return value;
131
129
  }
132
130
 
133
131
  // Allows us to ask for this information when we get a report.
134
132
  window.console.log('Created link:\n\n', pastedText);
135
- return (0, _richText.applyFormat)(value, {
133
+ const format = {
136
134
  type: name,
137
135
  attributes: {
138
136
  url: (0, _htmlEntities.decodeEntities)(pastedText)
139
137
  }
140
- });
138
+ };
139
+ if ((0, _richText.isCollapsed)(value)) {
140
+ return (0, _richText.insert)(value, (0, _richText.applyFormat)((0, _richText.create)({
141
+ text: plainText
142
+ }), format, 0, plainText.length));
143
+ }
144
+ return (0, _richText.applyFormat)(value, format);
141
145
  },
142
146
  edit: Edit
143
147
  };
@@ -1 +1 @@
1
- {"version":3,"names":["_i18n","require","_element","_richText","_url","_blockEditor","_htmlEntities","_icons","_a11y","_inline","_interopRequireDefault","_utils","name","title","__","Edit","isActive","activeAttributes","value","onChange","onFocus","contentRef","addingLink","setAddingLink","useState","addLink","text","getTextContent","slice","isURL","isValidHref","applyFormat","type","attributes","url","isEmail","stopAddingLink","returnFocus","onRemoveFormat","removeFormat","speak","_react","createElement","Fragment","RichTextShortcut","character","onUse","RichTextToolbarButton","icon","linkOff","onClick","shortcutType","shortcutCharacter","linkIcon","default","link","tagName","className","id","_id","target","rel","__unstablePasteRule","html","plainText","isCollapsed","pastedText","replace","trim","window","console","log","decodeEntities","edit","exports"],"sources":["@wordpress/format-library/src/link/index.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useState } from '@wordpress/element';\nimport {\n\tgetTextContent,\n\tapplyFormat,\n\tremoveFormat,\n\tslice,\n\tisCollapsed,\n} from '@wordpress/rich-text';\nimport { isURL, isEmail } from '@wordpress/url';\nimport {\n\tRichTextToolbarButton,\n\tRichTextShortcut,\n} from '@wordpress/block-editor';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport { link as linkIcon, linkOff } from '@wordpress/icons';\nimport { speak } from '@wordpress/a11y';\n\n/**\n * Internal dependencies\n */\nimport InlineLinkUI from './inline';\nimport { isValidHref } from './utils';\n\nconst name = 'core/link';\nconst title = __( 'Link' );\n\nfunction Edit( {\n\tisActive,\n\tactiveAttributes,\n\tvalue,\n\tonChange,\n\tonFocus,\n\tcontentRef,\n} ) {\n\tconst [ addingLink, setAddingLink ] = useState( false );\n\n\tfunction addLink() {\n\t\tconst text = getTextContent( slice( value ) );\n\n\t\tif ( text && isURL( text ) && isValidHref( text ) ) {\n\t\t\tonChange(\n\t\t\t\tapplyFormat( value, {\n\t\t\t\t\ttype: name,\n\t\t\t\t\tattributes: { url: text },\n\t\t\t\t} )\n\t\t\t);\n\t\t} else if ( text && isEmail( text ) ) {\n\t\t\tonChange(\n\t\t\t\tapplyFormat( value, {\n\t\t\t\t\ttype: name,\n\t\t\t\t\tattributes: { url: `mailto:${ text }` },\n\t\t\t\t} )\n\t\t\t);\n\t\t} else {\n\t\t\tsetAddingLink( true );\n\t\t}\n\t}\n\n\tfunction stopAddingLink( returnFocus = true ) {\n\t\tsetAddingLink( false );\n\t\tif ( returnFocus ) {\n\t\t\tonFocus();\n\t\t}\n\t}\n\n\tfunction onRemoveFormat() {\n\t\tonChange( removeFormat( value, name ) );\n\t\tspeak( __( 'Link removed.' ), 'assertive' );\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<RichTextShortcut type=\"primary\" character=\"k\" onUse={ addLink } />\n\t\t\t<RichTextShortcut\n\t\t\t\ttype=\"primaryShift\"\n\t\t\t\tcharacter=\"k\"\n\t\t\t\tonUse={ onRemoveFormat }\n\t\t\t/>\n\t\t\t{ isActive && (\n\t\t\t\t<RichTextToolbarButton\n\t\t\t\t\tname=\"link\"\n\t\t\t\t\ticon={ linkOff }\n\t\t\t\t\ttitle={ __( 'Unlink' ) }\n\t\t\t\t\tonClick={ onRemoveFormat }\n\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\tshortcutType=\"primaryShift\"\n\t\t\t\t\tshortcutCharacter=\"k\"\n\t\t\t\t\taria-haspopup=\"true\"\n\t\t\t\t\taria-expanded={ addingLink || isActive }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ! isActive && (\n\t\t\t\t<RichTextToolbarButton\n\t\t\t\t\tname=\"link\"\n\t\t\t\t\ticon={ linkIcon }\n\t\t\t\t\ttitle={ title }\n\t\t\t\t\tonClick={ addLink }\n\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\tshortcutType=\"primary\"\n\t\t\t\t\tshortcutCharacter=\"k\"\n\t\t\t\t\taria-haspopup=\"true\"\n\t\t\t\t\taria-expanded={ addingLink || isActive }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ( addingLink || isActive ) && (\n\t\t\t\t<InlineLinkUI\n\t\t\t\t\taddingLink={ addingLink }\n\t\t\t\t\tstopAddingLink={ stopAddingLink }\n\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\tactiveAttributes={ activeAttributes }\n\t\t\t\t\tvalue={ value }\n\t\t\t\t\tonChange={ onChange }\n\t\t\t\t\tcontentRef={ contentRef }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nexport const link = {\n\tname,\n\ttitle,\n\ttagName: 'a',\n\tclassName: null,\n\tattributes: {\n\t\turl: 'href',\n\t\ttype: 'data-type',\n\t\tid: 'data-id',\n\t\t_id: 'id',\n\t\ttarget: 'target',\n\t\trel: 'rel',\n\t},\n\t__unstablePasteRule( value, { html, plainText } ) {\n\t\tif ( isCollapsed( value ) ) {\n\t\t\treturn value;\n\t\t}\n\n\t\tconst pastedText = ( html || plainText )\n\t\t\t.replace( /<[^>]+>/g, '' )\n\t\t\t.trim();\n\n\t\t// A URL was pasted, turn the selection into a link.\n\t\tif ( ! isURL( pastedText ) ) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// Allows us to ask for this information when we get a report.\n\t\twindow.console.log( 'Created link:\\n\\n', pastedText );\n\n\t\treturn applyFormat( value, {\n\t\t\ttype: name,\n\t\t\tattributes: {\n\t\t\t\turl: decodeEntities( pastedText ),\n\t\t\t},\n\t\t} );\n\t},\n\tedit: Edit,\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["_i18n","require","_element","_richText","_url","_blockEditor","_htmlEntities","_icons","_a11y","_inline","_interopRequireDefault","_utils","name","title","__","Edit","isActive","activeAttributes","value","onChange","onFocus","contentRef","addingLink","setAddingLink","useState","addLink","text","getTextContent","slice","isURL","isValidHref","applyFormat","type","attributes","url","isEmail","stopAddingLink","returnFocus","onRemoveFormat","removeFormat","speak","_react","createElement","Fragment","RichTextShortcut","character","onUse","RichTextToolbarButton","icon","linkOff","onClick","shortcutType","shortcutCharacter","linkIcon","default","link","tagName","className","id","_id","target","rel","__unstablePasteRule","html","plainText","pastedText","replace","trim","test","window","console","log","format","decodeEntities","isCollapsed","insert","create","length","edit","exports"],"sources":["@wordpress/format-library/src/link/index.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useState } from '@wordpress/element';\nimport {\n\tgetTextContent,\n\tapplyFormat,\n\tremoveFormat,\n\tslice,\n\tisCollapsed,\n\tinsert,\n\tcreate,\n} from '@wordpress/rich-text';\nimport { isURL, isEmail } from '@wordpress/url';\nimport {\n\tRichTextToolbarButton,\n\tRichTextShortcut,\n} from '@wordpress/block-editor';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport { link as linkIcon, linkOff } from '@wordpress/icons';\nimport { speak } from '@wordpress/a11y';\n\n/**\n * Internal dependencies\n */\nimport InlineLinkUI from './inline';\nimport { isValidHref } from './utils';\n\nconst name = 'core/link';\nconst title = __( 'Link' );\n\nfunction Edit( {\n\tisActive,\n\tactiveAttributes,\n\tvalue,\n\tonChange,\n\tonFocus,\n\tcontentRef,\n} ) {\n\tconst [ addingLink, setAddingLink ] = useState( false );\n\n\tfunction addLink() {\n\t\tconst text = getTextContent( slice( value ) );\n\n\t\tif ( text && isURL( text ) && isValidHref( text ) ) {\n\t\t\tonChange(\n\t\t\t\tapplyFormat( value, {\n\t\t\t\t\ttype: name,\n\t\t\t\t\tattributes: { url: text },\n\t\t\t\t} )\n\t\t\t);\n\t\t} else if ( text && isEmail( text ) ) {\n\t\t\tonChange(\n\t\t\t\tapplyFormat( value, {\n\t\t\t\t\ttype: name,\n\t\t\t\t\tattributes: { url: `mailto:${ text }` },\n\t\t\t\t} )\n\t\t\t);\n\t\t} else {\n\t\t\tsetAddingLink( true );\n\t\t}\n\t}\n\n\tfunction stopAddingLink( returnFocus = true ) {\n\t\tsetAddingLink( false );\n\t\tif ( returnFocus ) {\n\t\t\tonFocus();\n\t\t}\n\t}\n\n\tfunction onRemoveFormat() {\n\t\tonChange( removeFormat( value, name ) );\n\t\tspeak( __( 'Link removed.' ), 'assertive' );\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<RichTextShortcut type=\"primary\" character=\"k\" onUse={ addLink } />\n\t\t\t<RichTextShortcut\n\t\t\t\ttype=\"primaryShift\"\n\t\t\t\tcharacter=\"k\"\n\t\t\t\tonUse={ onRemoveFormat }\n\t\t\t/>\n\t\t\t{ isActive && (\n\t\t\t\t<RichTextToolbarButton\n\t\t\t\t\tname=\"link\"\n\t\t\t\t\ticon={ linkOff }\n\t\t\t\t\ttitle={ __( 'Unlink' ) }\n\t\t\t\t\tonClick={ onRemoveFormat }\n\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\tshortcutType=\"primaryShift\"\n\t\t\t\t\tshortcutCharacter=\"k\"\n\t\t\t\t\taria-haspopup=\"true\"\n\t\t\t\t\taria-expanded={ addingLink || isActive }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ! isActive && (\n\t\t\t\t<RichTextToolbarButton\n\t\t\t\t\tname=\"link\"\n\t\t\t\t\ticon={ linkIcon }\n\t\t\t\t\ttitle={ title }\n\t\t\t\t\tonClick={ addLink }\n\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\tshortcutType=\"primary\"\n\t\t\t\t\tshortcutCharacter=\"k\"\n\t\t\t\t\taria-haspopup=\"true\"\n\t\t\t\t\taria-expanded={ addingLink || isActive }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ( addingLink || isActive ) && (\n\t\t\t\t<InlineLinkUI\n\t\t\t\t\taddingLink={ addingLink }\n\t\t\t\t\tstopAddingLink={ stopAddingLink }\n\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\tactiveAttributes={ activeAttributes }\n\t\t\t\t\tvalue={ value }\n\t\t\t\t\tonChange={ onChange }\n\t\t\t\t\tcontentRef={ contentRef }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nexport const link = {\n\tname,\n\ttitle,\n\ttagName: 'a',\n\tclassName: null,\n\tattributes: {\n\t\turl: 'href',\n\t\ttype: 'data-type',\n\t\tid: 'data-id',\n\t\t_id: 'id',\n\t\ttarget: 'target',\n\t\trel: 'rel',\n\t},\n\t__unstablePasteRule( value, { html, plainText } ) {\n\t\tconst pastedText = ( html || plainText )\n\t\t\t.replace( /<[^>]+>/g, '' )\n\t\t\t.trim();\n\n\t\t// A URL was pasted, turn the selection into a link.\n\t\t// For the link pasting feature, allow only http(s) protocols.\n\t\tif ( ! isURL( pastedText ) || ! /^https?:/.test( pastedText ) ) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// Allows us to ask for this information when we get a report.\n\t\twindow.console.log( 'Created link:\\n\\n', pastedText );\n\n\t\tconst format = {\n\t\t\ttype: name,\n\t\t\tattributes: {\n\t\t\t\turl: decodeEntities( pastedText ),\n\t\t\t},\n\t\t};\n\n\t\tif ( isCollapsed( value ) ) {\n\t\t\treturn insert(\n\t\t\t\tvalue,\n\t\t\t\tapplyFormat(\n\t\t\t\t\tcreate( { text: plainText } ),\n\t\t\t\t\tformat,\n\t\t\t\t\t0,\n\t\t\t\t\tplainText.length\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\treturn applyFormat( value, format );\n\t},\n\tedit: Edit,\n};\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { createElement, Fragment } from "react";
4
4
  */
5
5
  import { __ } from '@wordpress/i18n';
6
6
  import { useState } from '@wordpress/element';
7
- import { getTextContent, applyFormat, removeFormat, slice, isCollapsed } from '@wordpress/rich-text';
7
+ import { getTextContent, applyFormat, removeFormat, slice, isCollapsed, insert, create } from '@wordpress/rich-text';
8
8
  import { isURL, isEmail } from '@wordpress/url';
9
9
  import { RichTextToolbarButton, RichTextShortcut } from '@wordpress/block-editor';
10
10
  import { decodeEntities } from '@wordpress/html-entities';
@@ -112,24 +112,28 @@ export const link = {
112
112
  html,
113
113
  plainText
114
114
  }) {
115
- if (isCollapsed(value)) {
116
- return value;
117
- }
118
115
  const pastedText = (html || plainText).replace(/<[^>]+>/g, '').trim();
119
116
 
120
117
  // A URL was pasted, turn the selection into a link.
121
- if (!isURL(pastedText)) {
118
+ // For the link pasting feature, allow only http(s) protocols.
119
+ if (!isURL(pastedText) || !/^https?:/.test(pastedText)) {
122
120
  return value;
123
121
  }
124
122
 
125
123
  // Allows us to ask for this information when we get a report.
126
124
  window.console.log('Created link:\n\n', pastedText);
127
- return applyFormat(value, {
125
+ const format = {
128
126
  type: name,
129
127
  attributes: {
130
128
  url: decodeEntities(pastedText)
131
129
  }
132
- });
130
+ };
131
+ if (isCollapsed(value)) {
132
+ return insert(value, applyFormat(create({
133
+ text: plainText
134
+ }), format, 0, plainText.length));
135
+ }
136
+ return applyFormat(value, format);
133
137
  },
134
138
  edit: Edit
135
139
  };
@@ -1 +1 @@
1
- {"version":3,"names":["__","useState","getTextContent","applyFormat","removeFormat","slice","isCollapsed","isURL","isEmail","RichTextToolbarButton","RichTextShortcut","decodeEntities","link","linkIcon","linkOff","speak","InlineLinkUI","isValidHref","name","title","Edit","isActive","activeAttributes","value","onChange","onFocus","contentRef","addingLink","setAddingLink","addLink","text","type","attributes","url","stopAddingLink","returnFocus","onRemoveFormat","createElement","Fragment","character","onUse","icon","onClick","shortcutType","shortcutCharacter","tagName","className","id","_id","target","rel","__unstablePasteRule","html","plainText","pastedText","replace","trim","window","console","log","edit"],"sources":["@wordpress/format-library/src/link/index.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useState } from '@wordpress/element';\nimport {\n\tgetTextContent,\n\tapplyFormat,\n\tremoveFormat,\n\tslice,\n\tisCollapsed,\n} from '@wordpress/rich-text';\nimport { isURL, isEmail } from '@wordpress/url';\nimport {\n\tRichTextToolbarButton,\n\tRichTextShortcut,\n} from '@wordpress/block-editor';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport { link as linkIcon, linkOff } from '@wordpress/icons';\nimport { speak } from '@wordpress/a11y';\n\n/**\n * Internal dependencies\n */\nimport InlineLinkUI from './inline';\nimport { isValidHref } from './utils';\n\nconst name = 'core/link';\nconst title = __( 'Link' );\n\nfunction Edit( {\n\tisActive,\n\tactiveAttributes,\n\tvalue,\n\tonChange,\n\tonFocus,\n\tcontentRef,\n} ) {\n\tconst [ addingLink, setAddingLink ] = useState( false );\n\n\tfunction addLink() {\n\t\tconst text = getTextContent( slice( value ) );\n\n\t\tif ( text && isURL( text ) && isValidHref( text ) ) {\n\t\t\tonChange(\n\t\t\t\tapplyFormat( value, {\n\t\t\t\t\ttype: name,\n\t\t\t\t\tattributes: { url: text },\n\t\t\t\t} )\n\t\t\t);\n\t\t} else if ( text && isEmail( text ) ) {\n\t\t\tonChange(\n\t\t\t\tapplyFormat( value, {\n\t\t\t\t\ttype: name,\n\t\t\t\t\tattributes: { url: `mailto:${ text }` },\n\t\t\t\t} )\n\t\t\t);\n\t\t} else {\n\t\t\tsetAddingLink( true );\n\t\t}\n\t}\n\n\tfunction stopAddingLink( returnFocus = true ) {\n\t\tsetAddingLink( false );\n\t\tif ( returnFocus ) {\n\t\t\tonFocus();\n\t\t}\n\t}\n\n\tfunction onRemoveFormat() {\n\t\tonChange( removeFormat( value, name ) );\n\t\tspeak( __( 'Link removed.' ), 'assertive' );\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<RichTextShortcut type=\"primary\" character=\"k\" onUse={ addLink } />\n\t\t\t<RichTextShortcut\n\t\t\t\ttype=\"primaryShift\"\n\t\t\t\tcharacter=\"k\"\n\t\t\t\tonUse={ onRemoveFormat }\n\t\t\t/>\n\t\t\t{ isActive && (\n\t\t\t\t<RichTextToolbarButton\n\t\t\t\t\tname=\"link\"\n\t\t\t\t\ticon={ linkOff }\n\t\t\t\t\ttitle={ __( 'Unlink' ) }\n\t\t\t\t\tonClick={ onRemoveFormat }\n\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\tshortcutType=\"primaryShift\"\n\t\t\t\t\tshortcutCharacter=\"k\"\n\t\t\t\t\taria-haspopup=\"true\"\n\t\t\t\t\taria-expanded={ addingLink || isActive }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ! isActive && (\n\t\t\t\t<RichTextToolbarButton\n\t\t\t\t\tname=\"link\"\n\t\t\t\t\ticon={ linkIcon }\n\t\t\t\t\ttitle={ title }\n\t\t\t\t\tonClick={ addLink }\n\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\tshortcutType=\"primary\"\n\t\t\t\t\tshortcutCharacter=\"k\"\n\t\t\t\t\taria-haspopup=\"true\"\n\t\t\t\t\taria-expanded={ addingLink || isActive }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ( addingLink || isActive ) && (\n\t\t\t\t<InlineLinkUI\n\t\t\t\t\taddingLink={ addingLink }\n\t\t\t\t\tstopAddingLink={ stopAddingLink }\n\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\tactiveAttributes={ activeAttributes }\n\t\t\t\t\tvalue={ value }\n\t\t\t\t\tonChange={ onChange }\n\t\t\t\t\tcontentRef={ contentRef }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nexport const link = {\n\tname,\n\ttitle,\n\ttagName: 'a',\n\tclassName: null,\n\tattributes: {\n\t\turl: 'href',\n\t\ttype: 'data-type',\n\t\tid: 'data-id',\n\t\t_id: 'id',\n\t\ttarget: 'target',\n\t\trel: 'rel',\n\t},\n\t__unstablePasteRule( value, { html, plainText } ) {\n\t\tif ( isCollapsed( value ) ) {\n\t\t\treturn value;\n\t\t}\n\n\t\tconst pastedText = ( html || plainText )\n\t\t\t.replace( /<[^>]+>/g, '' )\n\t\t\t.trim();\n\n\t\t// A URL was pasted, turn the selection into a link.\n\t\tif ( ! isURL( pastedText ) ) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// Allows us to ask for this information when we get a report.\n\t\twindow.console.log( 'Created link:\\n\\n', pastedText );\n\n\t\treturn applyFormat( value, {\n\t\t\ttype: name,\n\t\t\tattributes: {\n\t\t\t\turl: decodeEntities( pastedText ),\n\t\t\t},\n\t\t} );\n\t},\n\tedit: Edit,\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["__","useState","getTextContent","applyFormat","removeFormat","slice","isCollapsed","insert","create","isURL","isEmail","RichTextToolbarButton","RichTextShortcut","decodeEntities","link","linkIcon","linkOff","speak","InlineLinkUI","isValidHref","name","title","Edit","isActive","activeAttributes","value","onChange","onFocus","contentRef","addingLink","setAddingLink","addLink","text","type","attributes","url","stopAddingLink","returnFocus","onRemoveFormat","createElement","Fragment","character","onUse","icon","onClick","shortcutType","shortcutCharacter","tagName","className","id","_id","target","rel","__unstablePasteRule","html","plainText","pastedText","replace","trim","test","window","console","log","format","length","edit"],"sources":["@wordpress/format-library/src/link/index.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useState } from '@wordpress/element';\nimport {\n\tgetTextContent,\n\tapplyFormat,\n\tremoveFormat,\n\tslice,\n\tisCollapsed,\n\tinsert,\n\tcreate,\n} from '@wordpress/rich-text';\nimport { isURL, isEmail } from '@wordpress/url';\nimport {\n\tRichTextToolbarButton,\n\tRichTextShortcut,\n} from '@wordpress/block-editor';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport { link as linkIcon, linkOff } from '@wordpress/icons';\nimport { speak } from '@wordpress/a11y';\n\n/**\n * Internal dependencies\n */\nimport InlineLinkUI from './inline';\nimport { isValidHref } from './utils';\n\nconst name = 'core/link';\nconst title = __( 'Link' );\n\nfunction Edit( {\n\tisActive,\n\tactiveAttributes,\n\tvalue,\n\tonChange,\n\tonFocus,\n\tcontentRef,\n} ) {\n\tconst [ addingLink, setAddingLink ] = useState( false );\n\n\tfunction addLink() {\n\t\tconst text = getTextContent( slice( value ) );\n\n\t\tif ( text && isURL( text ) && isValidHref( text ) ) {\n\t\t\tonChange(\n\t\t\t\tapplyFormat( value, {\n\t\t\t\t\ttype: name,\n\t\t\t\t\tattributes: { url: text },\n\t\t\t\t} )\n\t\t\t);\n\t\t} else if ( text && isEmail( text ) ) {\n\t\t\tonChange(\n\t\t\t\tapplyFormat( value, {\n\t\t\t\t\ttype: name,\n\t\t\t\t\tattributes: { url: `mailto:${ text }` },\n\t\t\t\t} )\n\t\t\t);\n\t\t} else {\n\t\t\tsetAddingLink( true );\n\t\t}\n\t}\n\n\tfunction stopAddingLink( returnFocus = true ) {\n\t\tsetAddingLink( false );\n\t\tif ( returnFocus ) {\n\t\t\tonFocus();\n\t\t}\n\t}\n\n\tfunction onRemoveFormat() {\n\t\tonChange( removeFormat( value, name ) );\n\t\tspeak( __( 'Link removed.' ), 'assertive' );\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<RichTextShortcut type=\"primary\" character=\"k\" onUse={ addLink } />\n\t\t\t<RichTextShortcut\n\t\t\t\ttype=\"primaryShift\"\n\t\t\t\tcharacter=\"k\"\n\t\t\t\tonUse={ onRemoveFormat }\n\t\t\t/>\n\t\t\t{ isActive && (\n\t\t\t\t<RichTextToolbarButton\n\t\t\t\t\tname=\"link\"\n\t\t\t\t\ticon={ linkOff }\n\t\t\t\t\ttitle={ __( 'Unlink' ) }\n\t\t\t\t\tonClick={ onRemoveFormat }\n\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\tshortcutType=\"primaryShift\"\n\t\t\t\t\tshortcutCharacter=\"k\"\n\t\t\t\t\taria-haspopup=\"true\"\n\t\t\t\t\taria-expanded={ addingLink || isActive }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ! isActive && (\n\t\t\t\t<RichTextToolbarButton\n\t\t\t\t\tname=\"link\"\n\t\t\t\t\ticon={ linkIcon }\n\t\t\t\t\ttitle={ title }\n\t\t\t\t\tonClick={ addLink }\n\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\tshortcutType=\"primary\"\n\t\t\t\t\tshortcutCharacter=\"k\"\n\t\t\t\t\taria-haspopup=\"true\"\n\t\t\t\t\taria-expanded={ addingLink || isActive }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ( addingLink || isActive ) && (\n\t\t\t\t<InlineLinkUI\n\t\t\t\t\taddingLink={ addingLink }\n\t\t\t\t\tstopAddingLink={ stopAddingLink }\n\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\tactiveAttributes={ activeAttributes }\n\t\t\t\t\tvalue={ value }\n\t\t\t\t\tonChange={ onChange }\n\t\t\t\t\tcontentRef={ contentRef }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nexport const link = {\n\tname,\n\ttitle,\n\ttagName: 'a',\n\tclassName: null,\n\tattributes: {\n\t\turl: 'href',\n\t\ttype: 'data-type',\n\t\tid: 'data-id',\n\t\t_id: 'id',\n\t\ttarget: 'target',\n\t\trel: 'rel',\n\t},\n\t__unstablePasteRule( value, { html, plainText } ) {\n\t\tconst pastedText = ( html || plainText )\n\t\t\t.replace( /<[^>]+>/g, '' )\n\t\t\t.trim();\n\n\t\t// A URL was pasted, turn the selection into a link.\n\t\t// For the link pasting feature, allow only http(s) protocols.\n\t\tif ( ! isURL( pastedText ) || ! /^https?:/.test( pastedText ) ) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// Allows us to ask for this information when we get a report.\n\t\twindow.console.log( 'Created link:\\n\\n', pastedText );\n\n\t\tconst format = {\n\t\t\ttype: name,\n\t\t\tattributes: {\n\t\t\t\turl: decodeEntities( pastedText ),\n\t\t\t},\n\t\t};\n\n\t\tif ( isCollapsed( value ) ) {\n\t\t\treturn insert(\n\t\t\t\tvalue,\n\t\t\t\tapplyFormat(\n\t\t\t\t\tcreate( { text: plainText } ),\n\t\t\t\t\tformat,\n\t\t\t\t\t0,\n\t\t\t\t\tplainText.length\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\treturn applyFormat( value, format );\n\t},\n\tedit: Edit,\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/format-library",
3
- "version": "4.20.1",
3
+ "version": "4.21.0",
4
4
  "description": "Format library for the WordPress editor.",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -26,17 +26,17 @@
26
26
  "react-native": "src/index",
27
27
  "dependencies": {
28
28
  "@babel/runtime": "^7.16.0",
29
- "@wordpress/a11y": "^3.43.0",
30
- "@wordpress/block-editor": "^12.11.1",
31
- "@wordpress/components": "^25.9.1",
32
- "@wordpress/compose": "^6.20.0",
33
- "@wordpress/data": "^9.13.1",
34
- "@wordpress/element": "^5.20.0",
35
- "@wordpress/html-entities": "^3.43.0",
36
- "@wordpress/i18n": "^4.43.0",
37
- "@wordpress/icons": "^9.34.0",
38
- "@wordpress/rich-text": "^6.20.1",
39
- "@wordpress/url": "^3.44.0"
29
+ "@wordpress/a11y": "^3.44.0",
30
+ "@wordpress/block-editor": "^12.12.0",
31
+ "@wordpress/components": "^25.10.0",
32
+ "@wordpress/compose": "^6.21.0",
33
+ "@wordpress/data": "^9.14.0",
34
+ "@wordpress/element": "^5.21.0",
35
+ "@wordpress/html-entities": "^3.44.0",
36
+ "@wordpress/i18n": "^4.44.0",
37
+ "@wordpress/icons": "^9.35.0",
38
+ "@wordpress/rich-text": "^6.21.0",
39
+ "@wordpress/url": "^3.45.0"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "react": "^18.0.0",
@@ -45,5 +45,5 @@
45
45
  "publishConfig": {
46
46
  "access": "public"
47
47
  },
48
- "gitHead": "e17f760ed0dc11cce78157d7c2f2086b1b3c09d8"
48
+ "gitHead": "f83bb1a71e8fa416131b81a9f282a72a1dc6c694"
49
49
  }
package/src/link/index.js CHANGED
@@ -9,6 +9,8 @@ import {
9
9
  removeFormat,
10
10
  slice,
11
11
  isCollapsed,
12
+ insert,
13
+ create,
12
14
  } from '@wordpress/rich-text';
13
15
  import { isURL, isEmail } from '@wordpress/url';
14
16
  import {
@@ -135,28 +137,39 @@ export const link = {
135
137
  rel: 'rel',
136
138
  },
137
139
  __unstablePasteRule( value, { html, plainText } ) {
138
- if ( isCollapsed( value ) ) {
139
- return value;
140
- }
141
-
142
140
  const pastedText = ( html || plainText )
143
141
  .replace( /<[^>]+>/g, '' )
144
142
  .trim();
145
143
 
146
144
  // A URL was pasted, turn the selection into a link.
147
- if ( ! isURL( pastedText ) ) {
145
+ // For the link pasting feature, allow only http(s) protocols.
146
+ if ( ! isURL( pastedText ) || ! /^https?:/.test( pastedText ) ) {
148
147
  return value;
149
148
  }
150
149
 
151
150
  // Allows us to ask for this information when we get a report.
152
151
  window.console.log( 'Created link:\n\n', pastedText );
153
152
 
154
- return applyFormat( value, {
153
+ const format = {
155
154
  type: name,
156
155
  attributes: {
157
156
  url: decodeEntities( pastedText ),
158
157
  },
159
- } );
158
+ };
159
+
160
+ if ( isCollapsed( value ) ) {
161
+ return insert(
162
+ value,
163
+ applyFormat(
164
+ create( { text: plainText } ),
165
+ format,
166
+ 0,
167
+ plainText.length
168
+ )
169
+ );
170
+ }
171
+
172
+ return applyFormat( value, format );
160
173
  },
161
174
  edit: Edit,
162
175
  };