Presenter::EscapedText: escape_js_calls
authorSven Schöling <s.schoeling@googlemail.com>
Fri, 26 Mar 2021 18:19:47 +0000 (19:19 +0100)
committerSven Schöling <s.schoeling@googlemail.com>
Fri, 25 Jun 2021 13:51:32 +0000 (15:51 +0200)
Helferfunktion um das manuelle Zusammenstückeln von onclick Callbacks zu
erleichtern.

SL/Presenter/EscapedText.pm

index ca3c8ca..1c92f6f 100644 (file)
@@ -2,8 +2,9 @@ package SL::Presenter::EscapedText;
 
 use strict;
 use Exporter qw(import);
+use Scalar::Util qw(looks_like_number);
 
-our @EXPORT_OK = qw(escape is_escaped escape_js);
+our @EXPORT_OK = qw(escape is_escaped escape_js escape_js_call);
 our %EXPORT_TAGS = (ALL => \@EXPORT_OK);
 
 use JSON ();
@@ -54,6 +55,20 @@ sub escape_js {
   __PACKAGE__->new(text => $text, is_escaped => 1);
 }
 
+sub escape_js_call {
+  my ($func, @args) = @_;
+
+  escape(
+      sprintf "%s(%s)",
+      escape_js($func),
+      join ", ", map {
+        looks_like_number($_)
+          ? $_
+          : '"' . escape_js($_) . '"'
+      } @args
+  );
+}
+
 # internal magic
 sub escaped_text {
   my ($self) = @_;
@@ -141,6 +156,18 @@ Static constructor, can be exported. Equivalent to calling C<< new(text => $text
 
 Static constructor, can be exported. Like C<escape> but also escapes Javascript.
 
+=item C<escape_js_call $func_name, @args>
+
+Static constructor, can be exported. Used to construct a javascript call than
+can be used for onclick handlers in other Presenter functions.
+
+For example:
+
+  L.button_tag(
+    P.escape_js_call("kivi.Package.some_func", arg_one, arg_two, arg_three)
+    title
+  )
+
 =back
 
 =head1 METHODS