summaryrefslogtreecommitdiff
path: root/editor/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'editor/plugins')
-rwxr-xr-xeditor/plugins/plugins.ml38
1 files changed, 36 insertions, 2 deletions
diff --git a/editor/plugins/plugins.ml b/editor/plugins/plugins.ml
index 51b761c..6645628 100755
--- a/editor/plugins/plugins.ml
+++ b/editor/plugins/plugins.ml
@@ -73,6 +73,10 @@ let handle_backspace pm state dispatch =
Js._false )
+(** Activate the given mark at position.
+
+ [toggle_mark regex pm] will create a rule with the given regex, and
+ then apply the mark *)
let toggle_mark :
Js.regExp Js.t -> PM.t -> string -> PM.InputRule.input_rule Js.t =
fun regExp pm mark_type_name ->
@@ -110,11 +114,41 @@ let toggle_mark :
Js.some tr ) )
+(** Transform the selection into URL *)
+let into_url : Js.regExp Js.t -> PM.t -> PM.InputRule.input_rule Js.t =
+ fun regExp pm ->
+ PM.InputRule.create
+ pm
+ regExp
+ ~fn:
+ ( Js.wrap_callback
+ @@ fun (state : PM.State.editor_state Js.t) content ~from ~to_ ->
+ let matched_text = Js.array_get content 1 |> Js.Optdef.to_option
+ and mark = PM.O.get state##.schema##.marks "link" in
+
+ match (matched_text, mark) with
+ | Some url, Some mark_type ->
+ let attrs = PM.O.init [| ("href", url) |] in
+ (* Create the mark containing the URL *)
+ let m = state##.schema##mark_fromType mark_type (Js.some attrs) in
+ (* Apply the mark as a transaction *)
+ let tr =
+ state
+ ##. tr
+ ## (addMark ~from ~to_ m)
+ ## (insertText (Jstr.v " ") ~from:Js.null ~to_:Js.null)
+ in
+ Js.some tr
+ | _ ->
+ Js.null )
+
+
let input_rule pm =
let bold = toggle_mark (new%js Js.regExp (Js.string "\\*\\*$")) pm "strong"
- and em = toggle_mark (new%js Js.regExp (Js.string "//$")) pm "em" in
+ and em = toggle_mark (new%js Js.regExp (Js.string "__$")) pm "em"
+ and url = into_url (new%js Js.regExp (Js.string "(\\w+://\\S+)\\s$")) pm in
- PM.InputRule.to_plugin pm (Js.array [| bold; em |])
+ PM.InputRule.to_plugin pm (Js.array [| bold; url; em |])
let default pm schema =