mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
feat: added markdown links
This commit is contained in:
parent
2331b328d8
commit
6f4ab9a55d
@ -124,3 +124,58 @@ ShortcutEventHandler backquoteToCodeHandler = (editorState, event) {
|
|||||||
|
|
||||||
return KeyEventResult.handled;
|
return KeyEventResult.handled;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// To create a link, enclose the link text in brackets (e.g., [link text]).
|
||||||
|
/// Then, immediately follow it with the URL in parentheses (e.g., (https://example.com)).
|
||||||
|
ShortcutEventHandler markdownLinkToLinkHandler = (editorState, event) {
|
||||||
|
final selectionService = editorState.service.selectionService;
|
||||||
|
final selection = selectionService.currentSelection.value;
|
||||||
|
final textNodes = selectionService.currentSelectedNodes.whereType<TextNode>();
|
||||||
|
if (selection == null || !selection.isSingle || textNodes.length != 1) {
|
||||||
|
return KeyEventResult.ignored;
|
||||||
|
}
|
||||||
|
|
||||||
|
// find all of the indexs for important characters
|
||||||
|
final textNode = textNodes.first;
|
||||||
|
final text = textNode.toRawString();
|
||||||
|
final firstOpeningBracket = text.indexOf('[');
|
||||||
|
final firstClosingBracket = text.indexOf(']');
|
||||||
|
|
||||||
|
// use regex to validate the format of the link
|
||||||
|
// note: this enforces that the link has http or https
|
||||||
|
final regexp = RegExp(r'\[([\w\s\d]+)\]\(((?:\/|https?:\/\/)[\w\d./?=#]+)$');
|
||||||
|
final match = regexp.firstMatch(text);
|
||||||
|
if (match == null) {
|
||||||
|
return KeyEventResult.ignored;
|
||||||
|
}
|
||||||
|
|
||||||
|
// extract the text and the url of the link
|
||||||
|
final linkText = match.group(1);
|
||||||
|
final linkUrl = match.group(2);
|
||||||
|
|
||||||
|
// Delete the initial opening bracket,
|
||||||
|
// update the href attribute of the text surrounded by [ ] to the url,
|
||||||
|
// delete everything after the text,
|
||||||
|
// and update the cursor position.
|
||||||
|
TransactionBuilder(editorState)
|
||||||
|
..deleteText(textNode, firstOpeningBracket, 1)
|
||||||
|
..formatText(
|
||||||
|
textNode,
|
||||||
|
firstOpeningBracket,
|
||||||
|
firstClosingBracket - firstOpeningBracket - 1,
|
||||||
|
{
|
||||||
|
BuiltInAttributeKey.href: linkUrl,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
..deleteText(textNode, firstClosingBracket - 1,
|
||||||
|
selection.end.offset - firstClosingBracket)
|
||||||
|
..afterSelection = Selection.collapsed(
|
||||||
|
Position(
|
||||||
|
path: textNode.path,
|
||||||
|
offset: firstOpeningBracket + linkText!.length,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
..commit();
|
||||||
|
|
||||||
|
return KeyEventResult.handled;
|
||||||
|
};
|
||||||
|
@ -257,6 +257,11 @@ List<ShortcutEvent> builtInShortcutEvents = [
|
|||||||
command: 'backquote',
|
command: 'backquote',
|
||||||
handler: backquoteToCodeHandler,
|
handler: backquoteToCodeHandler,
|
||||||
),
|
),
|
||||||
|
ShortcutEvent(
|
||||||
|
key: 'Markdown link to link',
|
||||||
|
command: 'shift+parenthesis right',
|
||||||
|
handler: markdownLinkToLinkHandler,
|
||||||
|
),
|
||||||
// https://github.com/flutter/flutter/issues/104944
|
// https://github.com/flutter/flutter/issues/104944
|
||||||
// Workaround: Using space editing on the web platform often results in errors,
|
// Workaround: Using space editing on the web platform often results in errors,
|
||||||
// so adding a shortcut event to handle the space input instead of using the
|
// so adding a shortcut event to handle the space input instead of using the
|
||||||
|
Loading…
Reference in New Issue
Block a user