diff options
Diffstat (limited to 'macros/latex/contrib/media4svg/media4svg.sty')
-rw-r--r-- | macros/latex/contrib/media4svg/media4svg.sty | 65 |
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> } } |