summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/media4svg/media4svg.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/media4svg/media4svg.sty')
-rw-r--r--macros/latex/contrib/media4svg/media4svg.sty65
1 files changed, 37 insertions, 28 deletions
diff --git a/macros/latex/contrib/media4svg/media4svg.sty b/macros/latex/contrib/media4svg/media4svg.sty
index 1d064c818d..680cf944a5 100644
--- a/macros/latex/contrib/media4svg/media4svg.sty
+++ b/macros/latex/contrib/media4svg/media4svg.sty
@@ -23,8 +23,8 @@
%
% The Current Maintainer of this work is A. Grahn.
-\def\g@msvg@date@tl{2022/09/12}
-\def\g@msvg@version@tl{0.10}
+\def\g@msvg@date@tl{2022/09/23}
+\def\g@msvg@version@tl{0.11}
\NeedsTeXFormat{LaTeX2e}[2022-06-01]
\ProvidesExplPackage{media4svg}{\g@msvg@date@tl}{\g@msvg@version@tl}
@@ -194,12 +194,14 @@
\msg_error:nn{media4svg}{missing~driver~option}
}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
\seq_new:N\l_msvg_ytids_seq % takes list of yt video ids
-%\tl_const:Nn\g_msvg_minwd_px_tl{640} % foreignObject with at least this width
-\tl_const:Nn\g_msvg_minwd_px_tl{480} % foreignObject with at least this width
+% assumed vert. screen resolution, for setting <svg> viewBox dimensions
+% and to sensibly scale video player controls
+\tl_const:Nn\g_msvg_screen_px_tl{1080} % Full HD
+\tl_const:Nx\g_msvg_px_per_bp_tl{
+ \fp_eval:n{\g_msvg_screen_px_tl/\dim_to_decimal_in_bp:n{\paperheight}}
+}
\NewDocumentCommand\includemedia{O{}mm}{% #1 options, #2 text/image,
\msvg_uriend: % #3 media file/url or (comma-sep'd list of) yt ids
@@ -240,16 +242,16 @@
\l_msvg_full_name_tl}{72}{{?nl}}\g_msvg_media_blob_tl
}
}
- \tl_set:Nx\l_msvg_foreign_scale_tl{
- \fp_eval:n{\g_msvg_minwd_px_tl/\dim_to_decimal_in_bp:n{\g_msvg_wd_tl}}
- }
\special{dvisvgm:raw
\bool_if:nT{
\tl_if_blank_p:V\g_msvg_controls_tl&&
!\bool_if_p:N\g_msvg_yt_bool
}{
+ % In Chrome, with controls disabled, <video> cannot get the focus, which is
+ % necessary for keyboard interaction. As a fix, we insert a zero-size <svg>
+ % that receives the keyboard events instead.
<svg~
- id='msvg_kbdCtrl_\g_msvg_id_tl'~
+ id='msvg_kbdCtrl_\g_msvg_id_tl'~ % rec
width='0'~height='0'~onfocus=''~
onkeydown='
event.preventDefault();
@@ -302,13 +304,17 @@
break;
}
'
- ></svg>{?nl}
+ />
}
- <g~transform='translate({?x},{?(y-(\dim_to_decimal_in_bp:n{\g_msvg_ht_tl}))})
- scale(\fp_eval:n{1/\l_msvg_foreign_scale_tl})'>
+ <g~transform='translate({?x},{?(y-(\dim_to_decimal_in_bp:n{\g_msvg_ht_tl}))})'>
+ <svg~
+ width='\dim_to_decimal_in_bp:n{\g_msvg_wd_tl}'~
+ height='\dim_to_decimal_in_bp:n{\g_msvg_tt_tl}'~
+ viewBox='0~0~\fp_eval:n{\g_msvg_px_per_bp_tl*\dim_to_decimal_in_bp:n{\g_msvg_wd_tl}}~
+ \fp_eval:n{\g_msvg_px_per_bp_tl*\dim_to_decimal_in_bp:n{\g_msvg_tt_tl}}'
+ >
<foreignObject~
- width='\fp_eval:n{\l_msvg_foreign_scale_tl*\dim_to_decimal_in_bp:n{\g_msvg_wd_tl}}'~
- height='\fp_eval:n{\l_msvg_foreign_scale_tl*\dim_to_decimal_in_bp:n{\g_msvg_tt_tl}}'~
+ width='100\msvg_percent:'~height='100\msvg_percent:'~
style='cursor:~pointer;'~
\bool_if:nT{
\tl_if_blank_p:V\g_msvg_controls_tl&&
@@ -324,7 +330,7 @@
return;% <-- this prevents download-video-? dialogue in Chrome
'
}
- >{?nl}
+ >
\bool_if:NTF\g_msvg_yt_bool{
<g~xmlns='http://www.w3.org/1999/xhtml'>
<iframe~
@@ -339,7 +345,7 @@
}
\g_msvg_controlsyt_tl\g_msvg_autoplayyt_tl\g_msvg_loopyt_tl
\g_msvg_mutedyt_tl\g_msvg_timeyt_tl
- '/>{?nl}
+ '/>
</g>
}{
<video~
@@ -347,7 +353,7 @@
id='msvg_\g_msvg_id_tl'~
\g_msvg_controls_tl\g_msvg_autoplay_tl\g_msvg_loop_tl\g_msvg_muted_tl
\tl_if_blank:VT\g_msvg_controls_tl{
- onplaying=' % in Chrome, keyboard control
+ onplay=' % in Chrome, keyboard control
$("kbdCtrl_\g_msvg_id_tl").focus();% via separate <svg> element
event.target.focus(); % Firefox
'~
@@ -407,28 +413,31 @@
onmouseup='event.preventDefault();event.stopPropagation();
if(event.button==0) event.target.play();'~
onmousedown='event.preventDefault();event.stopPropagation();
+ $("kbdCtrl_\g_msvg_id_tl").focus();% for Chrome, again
+ event.target.focus();
if(event.button==0) event.target.pause();'~
}
\tl_if_blank:VF\g_msvg_time_tl{
onloadstart='event.target.currentTime=\g_msvg_time_tl;'~
}
xmlns='http://www.w3.org/1999/xhtml'
- >{?nl}
+ >
\bool_if:NTF\g_msvg_embed_bool{
\sys_if_engine_luatex:TF{
<source~src='data:\g_msvg_mtype_tl;base64,{?nl}
\directlua{media4svg.base64("\l_msvg_full_name_tl",72,"{?nl}")}'~
- type='\g_msvg_mtype_tl'/>{?nl}
+ type='\g_msvg_mtype_tl'/>
}{
<source~src='data:\g_msvg_mtype_tl;base64,{?nl}
- \g_msvg_media_blob_tl'~type='\g_msvg_mtype_tl'/>{?nl}
+ \g_msvg_media_blob_tl'~type='\g_msvg_mtype_tl'/>
}
}{
- <source~src='\l_msvg_media_arg_tl'~type='\g_msvg_mtype_tl'/>{?nl}
+ <source~src='\l_msvg_media_arg_tl'~type='\g_msvg_mtype_tl'/>
}
- </video>{?nl}
+ </video>
}
</foreignObject>
+ </svg>
</g>
}
\bool_if:NT\g_msvg_embed_bool{\sys_if_engine_luatex:T{\message{>}}}
@@ -889,13 +898,13 @@
\AddToHook{shipout/before}{\int_gincr:N\g@msvg@page@int}
\AddToHook{shipout/background}{
\put(0,0){
- \special{dvisvgm:rawdef {?nl}
- <script~type="text/javascript">{?nl}
- <![CDATA[{?nl}
+ \special{dvisvgm:rawdef
+ <script~type="text/javascript">
+ <![CDATA[
function~$(id)~{
return~document.getElementById("msvg_"+id.toString().trim());
- };{?nl}
- ]]>{?nl}
+ };
+ ]]>
</script>
}
}