% Externalized render helpers for backend-specific inline embeds.

\RequirePackage{expl3}
\RequirePackage{xparse}
\RequirePackage{graphicx}
\RequirePackage{pdftexcmds}

\ExplSyntaxOn

\tl_new:N \l__font_externalized_cache_dir_tl
\tl_new:N \l__font_externalized_hash_tl
\tl_new:N \l__font_externalized_tex_path_tl
\tl_new:N \l__font_externalized_pdf_path_tl
\tl_new:N \l__font_externalized_engine_tl
\tl_new:N \l__font_externalized_familyid_tl
\tl_new:N \l__font_externalized_rendercommand_tl
\tl_new:N \l__font_externalized_clusterwise_tl
\tl_new:N \l__font_externalized_cache_key_tl
\tl_new:N \l__font_externalized_shell_cmd_tl
\tl_new:N \l__font_externalized_runner_path_tl
\tl_new:N \l__font_externalized_current_line_tl
\tl_new:N \l__font_externalized_middle_body_tl
\tl_new:N \l__font_externalized_block_body_tl
\tl_new:N \l__font_externalized_middle_text_tl
\tl_new:N \l__font_externalized_range_text_tl
\tl_new:N \l__font_externalized_plan_path_tl
\tl_new:N \l__font_externalized_plan_child_tl
\tl_new:N \l__font_externalized_plan_first_tl
\tl_new:N \l__font_externalized_plan_middle_tl
\tl_new:N \l__font_externalized_plan_last_tl
\bool_new:N \l__font_externalized_first_cluster_bool
\bool_new:N \g__font_externalized_cleanup_bool
\seq_new:N \g__font_externalized_cleanup_pdf_seq
\seq_new:N \g__font_externalized_cleanup_file_seq
\seq_new:N \l__font_externalized_cluster_seq
\seq_new:N \l__font_externalized_line_seq
\seq_new:N \l__font_externalized_line_width_seq
\iow_new:N \l__font_externalized_iow
\box_new:N \l__font_externalized_measure_box
\box_new:N \l__font_externalized_nowrap_box
\box_new:N \l__font_externalized_wrapped_box
\dim_new:N \l__font_externalized_target_width_dim
\dim_new:N \l__font_externalized_first_width_dim
\dim_new:N \l__font_externalized_rest_width_dim
\dim_new:N \l__font_externalized_line_width_dim
\dim_new:N \l__font_externalized_cluster_width_dim
\dim_new:N \l__font_externalized_space_width_dim
\dim_new:N \l__font_externalized_full_line_threshold_dim

\cs_new:Npn \__font_externalized_current_font_size:
  { \use:c { f@size } pt }

\cs_new:Npn \__font_externalized_current_baselineskip:
  { \the\baselineskip }

\cs_new:Npn \__font_externalized_current_linewidth:
  { \the\dimexpr\linewidth-\leftskip-\rightskip\relax }

\cs_new:Npn \__font_externalized_current_first_width:
  { \the\dimexpr\linewidth-\leftskip-\rightskip\relax }

\cs_new:Npn \__font_externalized_current_rest_width:
  { \the\dimexpr\linewidth-\leftskip-\rightskip\relax }

\prg_new_conditional:Npnn \__font_externalized_rendercommand_is_block:n #1 { TF }
  {
    \regex_match:nnTF { block \z } {#1}
      { \prg_return_true: }
      { \prg_return_false: }
  }

\bool_gset_false:N \g__font_externalized_cleanup_bool

\cs_generate_variant:Nn \__font_externalized_include:nnnnn { nnnnV }

\NewDocumentCommand \ExternalizedCleanupOn {} 
  { \bool_gset_true:N \g__font_externalized_cleanup_bool }

\NewDocumentCommand \ExternalizedCleanupOff {} 
  { \bool_gset_false:N \g__font_externalized_cleanup_bool }

\cs_new_protected:Npn \__font_externalized_shell_now:n #1
  {
    \sys_if_shell:TF
      { \sys_shell_now:n {#1} }
      {
        \PackageError{font-externalized}
          {Externalized~rendering~requires~shell-escape}
          {Rebuild~with~shell-escape~enabled~to~use~this~command.}
      }
  }

\cs_new:Npn \__font_externalized_strip_quotes:n #1
  {
    \tl_set:Nn \l_tmpa_tl {#1}
    \tl_replace_all:Nnn \l_tmpa_tl { " } { }
    \tl_use:N \l_tmpa_tl
  }

\cs_new:Npn \__font_externalized_hash:n #1
  {
    \str_lowercase:f { \use:c { pdf@mdfivesum } {#1} }
  }

\cs_new:Npn \__font_externalized_cmd_space:
  { \char_generate:nn { 32 } { 12 } }

\cs_new_protected:Npn \__font_externalized_resolve_runner:
  {
    \tl_set:Nx \l__font_externalized_runner_path_tl
      { \file_full_name:n { impe-externalized-render.lua } }
    \tl_if_blank:VTF \l__font_externalized_runner_path_tl
      {
        \PackageError{font-externalized}
          {Portable~externalized-render~helper~not~found}
          {Install~impe-externalized-render.lua~with~the~IMPE~runtime.}
      }
      { }
  }

\cs_new_protected:Npn \__font_externalized_set_paths:n #1
  {
    \tl_set:Nn \l__font_externalized_cache_dir_tl { .impe-externalized }
    \tl_set:Nx \l__font_externalized_hash_tl
      { \__font_externalized_hash:n {#1} }
    \tl_set:Nx \l__font_externalized_tex_path_tl
      { \l__font_externalized_cache_dir_tl / impe-externalized-\l__font_externalized_hash_tl.tex }
    \tl_set:Nx \l__font_externalized_pdf_path_tl
      { \l__font_externalized_cache_dir_tl / impe-externalized-\l__font_externalized_hash_tl.pdf }
    \tl_set:Nx \l__font_externalized_plan_path_tl
      { \l__font_externalized_cache_dir_tl / impe-externalized-\l__font_externalized_hash_tl-plan.tex }
    \tl_set:Nx \l__font_externalized_plan_child_tl
      { impe-externalized-\l__font_externalized_hash_tl-plan.tex }
  }

\cs_new_protected:Npn \__font_externalized_ensure_cache_dir:
  {
    \file_if_exist:nF { \l__font_externalized_cache_dir_tl / . }
      {
        \__font_externalized_resolve_runner:
        \tl_set:Nx \l__font_externalized_shell_cmd_tl
          {
            texlua
            \__font_externalized_cmd_space:
            "\tl_use:N \l__font_externalized_runner_path_tl"
            \__font_externalized_cmd_space:
            mkdir
            \__font_externalized_cmd_space:
            "\tl_use:N \l__font_externalized_cache_dir_tl"
          }
        \exp_args:NV \__font_externalized_shell_now:n \l__font_externalized_shell_cmd_tl
      }
  }

\cs_new_protected:Npn \__font_externalized_write_source:nnn #1#2#3
  {
    \__font_externalized_ensure_cache_dir:
    \file_if_exist:VTF \l__font_externalized_tex_path_tl
      { }
      {
        \iow_open:NV \l__font_externalized_iow \l__font_externalized_tex_path_tl
        \__font_externalized_rendercommand_is_block:nTF {#3}
          {
            \iow_now:Nx \l__font_externalized_iow
              {
                \c_backslash_str documentclass
                [varwidth=\__font_externalized_current_linewidth:,border=0pt]
                {standalone}
              }
          }
          { \iow_now:Nn \l__font_externalized_iow { \documentclass[varwidth,border=0pt]{standalone} } }
        \iow_now:Nn \l__font_externalized_iow { \usepackage{impe} }
        \iow_now:Nx \l__font_externalized_iow
          { \UseTemplateSet { fonts = { \tl_to_str:n {#2} } } }
        \iow_now:Nn \l__font_externalized_iow { \begin{document} }
        \iow_now:Nx \l__font_externalized_iow
          {
            \c_backslash_str fontsize
            { \__font_externalized_current_font_size: }
            { \__font_externalized_current_baselineskip: }
            \c_backslash_str selectfont
          }
        \__font_externalized_rendercommand_is_block:nTF {#3}
          {
            \iow_now:Nx \l__font_externalized_iow
              {
                \c_backslash_str setlength
                { \c_backslash_str textwidth }
                { \__font_externalized_current_linewidth: }
              }
            \iow_now:Nx \l__font_externalized_iow
              {
                \c_backslash_str setlength
                { \c_backslash_str linewidth }
                { \__font_externalized_current_linewidth: }
              }
            \iow_now:Nx \l__font_externalized_iow
              {
                \c_backslash_str setlength
                { \c_backslash_str columnwidth }
                { \__font_externalized_current_linewidth: }
              }
            \iow_now:Nx \l__font_externalized_iow
              {
                \c_backslash_str hsize =
                \__font_externalized_current_linewidth:
              }
            \iow_now:Nx \l__font_externalized_iow
              {
                \c_backslash_str \tl_to_str:n {#3}
                { \exp_not:n {#1} }
              }
          }
          {
            \iow_now:Nx \l__font_externalized_iow
              {
                \c_backslash_str \tl_to_str:n {#3}
                { \exp_not:n {#1} }
              }
          }
        \iow_now:Nn \l__font_externalized_iow { \end{document} }
        \iow_close:N \l__font_externalized_iow
      }
  }

\cs_new_protected:Npn \__font_externalized_write_source_raw:nn #1#2
  {
    \__font_externalized_ensure_cache_dir:
    \file_if_exist:VTF \l__font_externalized_tex_path_tl
      { }
      {
        \iow_open:NV \l__font_externalized_iow \l__font_externalized_tex_path_tl
        \iow_now:Nx \l__font_externalized_iow
          {
            \c_backslash_str documentclass
            [varwidth=\__font_externalized_current_linewidth:,border=0pt]
            {standalone}
          }
        \iow_now:Nn \l__font_externalized_iow { \usepackage{impe} }
        \iow_now:Nx \l__font_externalized_iow
          { \UseTemplateSet { fonts = { \tl_to_str:n {#1} } } }
        \iow_now:Nn \l__font_externalized_iow { \begin{document} }
        \iow_now:Nx \l__font_externalized_iow
          {
            \c_backslash_str fontsize
            { \__font_externalized_current_font_size: }
            { \__font_externalized_current_baselineskip: }
            \c_backslash_str selectfont
          }
        \iow_now:Nx \l__font_externalized_iow
          {
            \c_backslash_str setlength
            { \c_backslash_str textwidth }
            { \__font_externalized_current_linewidth: }
          }
        \iow_now:Nx \l__font_externalized_iow
          {
            \c_backslash_str setlength
            { \c_backslash_str linewidth }
            { \__font_externalized_current_linewidth: }
          }
        \iow_now:Nx \l__font_externalized_iow
          {
            \c_backslash_str setlength
            { \c_backslash_str columnwidth }
            { \__font_externalized_current_linewidth: }
          }
        \iow_now:Nx \l__font_externalized_iow
          {
            \c_backslash_str hsize =
            \__font_externalized_current_linewidth:
          }
        \iow_now:Nx \l__font_externalized_iow { \exp_not:n {#2} }
        \iow_now:Nn \l__font_externalized_iow { \end{document} }
        \iow_close:N \l__font_externalized_iow
      }
  }

\cs_generate_variant:Nn \__font_externalized_write_source_raw:nn { nV }

\cs_new_protected:Npn \__font_externalized_ensure_pdf:
  {
    \file_if_exist:VTF \l__font_externalized_pdf_path_tl
      { }
      {
        \__font_externalized_ensure_cache_dir:
        \__font_externalized_resolve_runner:
        \tl_set:Nx \l__font_externalized_shell_cmd_tl
          {
            texlua
            \__font_externalized_cmd_space:
            "\tl_use:N \l__font_externalized_runner_path_tl"
            \__font_externalized_cmd_space:
            render
            \__font_externalized_cmd_space:
            "\tl_use:N \l__font_externalized_engine_tl"
            \__font_externalized_cmd_space:
            "\tl_use:N \l__font_externalized_tex_path_tl"
          }
        \exp_args:NV \__font_externalized_shell_now:n \l__font_externalized_shell_cmd_tl
      }
  }

\cs_new_protected:Npn \__font_externalized_note_cleanup_pdf:
  {
    \seq_if_in:NVF \g__font_externalized_cleanup_pdf_seq \l__font_externalized_pdf_path_tl
      { \seq_gput_right:NV \g__font_externalized_cleanup_pdf_seq \l__font_externalized_pdf_path_tl }
  }

\cs_new_protected:Npn \__font_externalized_note_cleanup_file:n #1
  {
    \tl_set:Nx \l_tmpa_tl {#1}
    \seq_if_in:NVF \g__font_externalized_cleanup_file_seq \l_tmpa_tl
      { \seq_gput_right:NV \g__font_externalized_cleanup_file_seq \l_tmpa_tl }
  }

\cs_new_protected:Npn \__font_externalized_note_cleanup_sidecars:
  {
    \__font_externalized_note_cleanup_file:n { \l__font_externalized_tex_path_tl }
    \tl_set:Nx \l_tmpa_tl { \l__font_externalized_tex_path_tl }
    \regex_replace_once:nnN { \.tex \z } { .aux } \l_tmpa_tl
    \__font_externalized_note_cleanup_file:n { \l_tmpa_tl }
    \tl_set:Nx \l_tmpa_tl { \l__font_externalized_tex_path_tl }
    \regex_replace_once:nnN { \.tex \z } { .log } \l_tmpa_tl
    \__font_externalized_note_cleanup_file:n { \l_tmpa_tl }
    \__font_externalized_note_cleanup_file:n { \l__font_externalized_plan_path_tl }
  }

\cs_new_protected:Npn \__font_externalized_cleanup_file:n #1
  {
    \tl_set:Nn \l_tmpa_tl {#1}
    \__font_externalized_resolve_runner:
    \tl_set:Nx \l__font_externalized_shell_cmd_tl
      {
        texlua
        \__font_externalized_cmd_space:
        "\tl_use:N \l__font_externalized_runner_path_tl"
        \__font_externalized_cmd_space:
        remove
        \__font_externalized_cmd_space:
        "\tl_use:N \l_tmpa_tl"
      }
    \exp_args:NV \__font_externalized_shell_now:n \l__font_externalized_shell_cmd_tl
  }

\cs_new_protected:Npn \__font_externalized_cleanup_file_item:n #1
  { \__font_externalized_cleanup_file:n {#1} }

\cs_new_protected:Npn \__font_externalized_include:nnnnn #1#2#3#4#5
  {
    \tl_set:Nn \l__font_externalized_engine_tl {#2}
    \tl_set:Nn \l__font_externalized_familyid_tl {#3}
    \tl_set:Nn \l__font_externalized_rendercommand_tl {#4}
    \tl_set:Nx \l__font_externalized_cache_key_tl
      {
        \tl_to_str:n {#2} | \tl_to_str:n {#3} | \tl_to_str:n {#4} | \tl_to_str:n {#5}
        | \__font_externalized_current_font_size:
        | \__font_externalized_current_baselineskip:
        | \__font_externalized_current_linewidth:
      }
    \__font_externalized_set_paths:n { \l__font_externalized_cache_key_tl }
    \__font_externalized_write_source:nnn {#5} {#3} {#4}
    \__font_externalized_ensure_pdf:
    \file_if_exist:VTF \l__font_externalized_pdf_path_tl
      {
        \__font_externalized_note_cleanup_sidecars:
        \bool_if:NT \g__font_externalized_cleanup_bool
          { \__font_externalized_note_cleanup_pdf: }
        \__font_externalized_rendercommand_is_block:nTF {#4}
          {
            \par
            \noindent
            \tl_if_blank:nTF {#1}
              { \includegraphics{\l__font_externalized_pdf_path_tl} }
              { \includegraphics[#1]{\l__font_externalized_pdf_path_tl} }
            \par
          }
          {
            \tl_if_blank:nTF {#1}
              { \includegraphics{\l__font_externalized_pdf_path_tl} }
              { \includegraphics[#1]{\l__font_externalized_pdf_path_tl} }
          }
      }
      {
        \PackageError{font-externalized}
          {Failed~to~produce~externalized~render~for~`\tl_to_str:n {#3}`}
          {Check~the~external~engine~output~and~the~generated~source~in~\tl_use:N \l__font_externalized_cache_dir_tl .}
      }
  }

\cs_new_protected:Npn \__font_externalized_include_single:nnnnn #1#2#3#4#5
  {
    \__font_externalized_include:nnnnn {#1} {#2} {#3} {#4} {#5}
  }

\cs_new_protected:Npn \__font_externalized_measure_render_width:nn #1#2
  {
    \hbox_set:Nn \l__font_externalized_measure_box
      { \use:c {#1} {#2} }
    \dim_set:Nn \l__font_externalized_cluster_width_dim
      { \box_wd:N \l__font_externalized_measure_box }
  }

\cs_new_protected:Npn \__font_externalized_compute_space_width:nn #1#2
  {
    \dim_zero:N \l__font_externalized_space_width_dim
    \int_compare:nNnT { \seq_count:N \l__font_externalized_cluster_seq } > { 1 }
      {
        \tl_set:Nx \l_tmpa_tl
          { \seq_item:Nn \l__font_externalized_cluster_seq { 1 } }
        \tl_set:Nx \l_tmpb_tl
          { \seq_item:Nn \l__font_externalized_cluster_seq { 2 } }
        \__font_externalized_measure_render_width:nn {#1} { \l_tmpa_tl }
        \dim_set:Nn \l_tmpa_dim { \l__font_externalized_cluster_width_dim }
        \__font_externalized_measure_render_width:nn {#1} { \l_tmpb_tl }
        \dim_set:Nn \l_tmpb_dim { \l__font_externalized_cluster_width_dim }
        \hbox_set:Nn \l__font_externalized_measure_box
          {
            \use:c {#1}
              {
                \l_tmpa_tl
                \c_space_tl
                \l_tmpb_tl
              }
          }
        \dim_set:Nn \l__font_externalized_space_width_dim
          {
            \box_wd:N \l__font_externalized_measure_box
            - \l_tmpa_dim
            - \l_tmpb_dim
          }
        \dim_compare:nNnT { \l__font_externalized_space_width_dim } < { 0pt }
          { \dim_zero:N \l__font_externalized_space_width_dim }
      }
  }

\cs_new_protected:Npn \__font_externalized_split_clusters:n #1
  {
    \seq_clear:N \l__font_externalized_cluster_seq
    \tl_set:Nn \l_tmpa_tl {#1}
    \exp_args:NV \__font_externalized_split_clusters_xstring:n \l_tmpa_tl
  }

\cs_new_protected:Npn \__font_externalized_split_clusters_xstring:n #1
  {
    \IfSubStr{#1}{\space}
      {
        \StrBefore{#1}{\space}[\__fontexternalizedfirst]
        \StrBehind{#1}{\space}[\__fontexternalizedrest]
        \tl_set:Nx \l_tmpa_tl { \__fontexternalizedfirst }
        \tl_if_blank:VF \l_tmpa_tl
          { \seq_put_right:NV \l__font_externalized_cluster_seq \l_tmpa_tl }
        \tl_set:Nx \l_tmpa_tl { \__fontexternalizedrest }
        \tl_if_blank:VF \l_tmpa_tl
          { \exp_args:NV \__font_externalized_split_clusters_xstring:n \l_tmpa_tl }
      }
      {
        \tl_set:Nn \l_tmpa_tl {#1}
        \tl_if_blank:VF \l_tmpa_tl
          { \seq_put_right:NV \l__font_externalized_cluster_seq \l_tmpa_tl }
      }
  }

\cs_new_protected:Npn \__font_externalized_flush_current_line:
  {
    \tl_if_blank:VF \l__font_externalized_current_line_tl
      {
        \seq_put_right:NV \l__font_externalized_line_seq \l__font_externalized_current_line_tl
        \seq_put_right:Nx \l__font_externalized_line_width_seq
          { \dim_use:N \l__font_externalized_line_width_dim }
        \tl_clear:N \l__font_externalized_current_line_tl
        \dim_zero:N \l__font_externalized_line_width_dim
      }
  }

\cs_new_protected:Npn \__font_externalized_compute_lines:n #1
  {
    \seq_clear:N \l__font_externalized_line_seq
    \seq_clear:N \l__font_externalized_line_width_seq
    \tl_clear:N \l__font_externalized_current_line_tl
    \dim_zero:N \l__font_externalized_line_width_dim
    \dim_set:Nn \l__font_externalized_target_width_dim
      { \l__font_externalized_full_line_threshold_dim }
    \seq_map_inline:Nn \l__font_externalized_cluster_seq
      {
        \__font_externalized_measure_render_width:nn {#1} {##1}
        \dim_set:Nn \l_tmpa_dim { \l__font_externalized_cluster_width_dim }
        \tl_if_blank:VTF \l__font_externalized_current_line_tl
          {
            \tl_set:Nn \l__font_externalized_current_line_tl {##1}
            \dim_set:Nn \l__font_externalized_line_width_dim { \l_tmpa_dim }
          }
          {
            \dim_set:Nn \l_tmpb_dim
              {
                \l__font_externalized_line_width_dim
                + \l__font_externalized_space_width_dim
                + \l_tmpa_dim
              }
            \dim_compare:nNnTF { \l_tmpb_dim } > { \l__font_externalized_target_width_dim }
              {
                \__font_externalized_flush_current_line:
                \tl_set:Nn \l__font_externalized_current_line_tl {##1}
                \dim_set:Nn \l__font_externalized_line_width_dim { \l_tmpa_dim }
              }
              {
                \tl_put_right:Nn \l__font_externalized_current_line_tl { ~ ##1 }
                \dim_set:Nn \l__font_externalized_line_width_dim { \l_tmpb_dim }
              }
          }
      }
    \__font_externalized_flush_current_line:
  }

\cs_new_protected:Npn \__font_externalized_build_line_block:nN #1#2
  {
    \tl_clear:N \l__font_externalized_block_body_tl
    \seq_map_inline:Nn #2
      {
        \tl_put_right:Nx \l__font_externalized_block_body_tl
          {
            \c_backslash_str noindent
            \c_backslash_str \tl_to_str:n {#1}
            { \exp_not:n {##1} }
            \c_backslash_str par
          }
      }
  }

\cs_new_protected:Npn \__font_externalized_build_line_block_from_range:nnn #1#2#3
  {
    \tl_clear:N \l__font_externalized_block_body_tl
    \int_step_inline:nnnn {#2} {1} {#3}
      {
        \tl_set:Nx \l_tmpa_tl
          { \seq_item:Nn \l__font_externalized_line_seq {##1} }
        \tl_put_right:Nx \l__font_externalized_block_body_tl
          {
            \c_backslash_str noindent
            \c_backslash_str \tl_to_str:n {#1}
            { \exp_not:V \l_tmpa_tl }
            \c_backslash_str par
          }
      }
  }

\cs_new_protected:Npn \__font_externalized_build_middle_text_from_range:nn #1#2
  {
    \tl_clear:N \l__font_externalized_middle_text_tl
    \int_step_inline:nnnn {#1} {1} {#2}
      {
        \tl_set:Nx \l_tmpa_tl
          { \seq_item:Nn \l__font_externalized_line_seq {##1} }
        \tl_if_blank:VTF \l__font_externalized_middle_text_tl
          { \tl_set_eq:NN \l__font_externalized_middle_text_tl \l_tmpa_tl }
          { \tl_put_right:Nx \l__font_externalized_middle_text_tl { ~ \exp_not:V \l_tmpa_tl } }
      }
  }

\cs_new_protected:Npn \__font_externalized_include_raw_block:nnnn #1#2#3#4
  {
    \tl_set:Nn \l__font_externalized_engine_tl {#1}
    \tl_set:Nn \l__font_externalized_familyid_tl {#2}
    \tl_set:Nx \l__font_externalized_cache_key_tl
      {
        raw | \tl_to_str:n {#1} | \tl_to_str:n {#2} | \tl_to_str:n {#3} | \tl_to_str:n {#4}
        | \__font_externalized_current_font_size:
        | \__font_externalized_current_baselineskip:
        | \__font_externalized_current_linewidth:
      }
    \__font_externalized_set_paths:n { \l__font_externalized_cache_key_tl }
    \__font_externalized_write_source_raw:nn {#2} {#4}
    \__font_externalized_ensure_pdf:
    \file_if_exist:VTF \l__font_externalized_pdf_path_tl
      {
        \__font_externalized_note_cleanup_sidecars:
        \bool_if:NT \g__font_externalized_cleanup_bool
          { \__font_externalized_note_cleanup_pdf: }
        \par
        \noindent
        \includegraphics{\l__font_externalized_pdf_path_tl}
        \par
      }
      {
        \PackageError{font-externalized}
          {Failed~to~produce~smart~externalized~render~for~`\tl_to_str:n {#2}`}
          {Check~the~generated~source~and~external~engine~log~in~\tl_use:N \l__font_externalized_cache_dir_tl .}
      }
  }

\cs_generate_variant:Nn \__font_externalized_include_raw_block:nnnn { nnnV }

\cs_new_protected:Npn \__font_externalized_include_lineblock:nnnnn #1#2#3#4#5
  {
    \__font_externalized_split_clusters:n {#5}
    \__font_externalized_compute_space_width:nn {#4} {#5}
    \__font_externalized_compute_lines:n {#4}
    \__font_externalized_build_line_block_from_range:nnn
      {#4} { 1 } { \seq_count:N \l__font_externalized_line_seq }
    \__font_externalized_include_raw_block:nnnV
      {#2} {#3} {#4} \l__font_externalized_block_body_tl
  }

\cs_new_protected:Npn \__font_externalized_include_clusterwise:nnnnn #1#2#3#4#5
  {
    \__font_externalized_split_clusters:n {#5}
    \bool_set_true:N \l__font_externalized_first_cluster_bool
    \seq_map_inline:Nn \l__font_externalized_cluster_seq
      {
        \tl_if_blank:nF {##1}
          {
            \bool_if:NF \l__font_externalized_first_cluster_bool
              { \hskip 0.5em plus 0.12em minus 0.08em\relax }
            \bool_set_false:N \l__font_externalized_first_cluster_bool
            \__font_externalized_include:nnnnn {#1} {#2} {#3} {#4} {##1}
          }
      }
  }

\cs_new_protected:Npn \__font_define_externalized_command:nnnnn #1#2#3#4#5
  {
    \exp_args:Nc \DeclareDocumentCommand {#1} { O{} m }
      {
        \tl_set:Nn \l__font_externalized_clusterwise_tl {#5}
        \str_case:VnF \l__font_externalized_clusterwise_tl
          {
            { true }
              { \__font_externalized_include_clusterwise:nnnnn {##1} {#2} {#3} {#4} {##2} }
            { lineblock }
              { \__font_externalized_include_lineblock:nnnnn {##1} {#2} {#3} {#4} {##2} }
          }
          { \__font_externalized_include_single:nnnnn {##1} {#2} {#3} {#4} {##2} }
      }
  }

\AtEndDocument
  {
    \bool_if:NT \g__font_externalized_cleanup_bool
      {
        \seq_map_function:NN
          \g__font_externalized_cleanup_file_seq
          \__font_externalized_cleanup_file_item:n
        \seq_map_function:NN
          \g__font_externalized_cleanup_pdf_seq
          \__font_externalized_cleanup_file_item:n
      }
  }

\ExplSyntaxOff
