%D \module
%D   [       file=font-col,
%D        version=2008.06.11,
%D          title=\CONTEXT\ Font Macros,
%D       subtitle=Fallbacks (collections),
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

% ! EXPERIMENTAL ! code will be made more nice
%
% actually we can now do more at the lua end

% todo   : missing only, force always, multiple fallbacks with test, scale
% beware : only english key/values
%
% \resetfontfallback [whatever]
%
% \definefontfallback [whatever] [Slanted]     [0x0060-0x007F] [force=yes]
% \definefontfallback [whatever] [Bold]        [0x0080-0x00FF,0x00A0-0x00AF] [rscale=1.2]
% \definefontfallback [whatever] [BoldSlanted] [0x00C0-0x00C7] [check=yes,force=yes]
%
% \definefontfeature [emboldened]     [effect={width=0.1,delta=0.4,factor=0.3}]
% \definefontsynonym [SansEmboldened] [Sans]                           [features=emboldened]
% \definefontfallback[FakeSansCaps]   [SansEmboldened] [0x0000-0xFFFF] [rscale=.8,method=uppercase]
% \definefontsynonym [SansCaps]       [file:MyriadPro-Regular.otf]     [fallbacks=FakeSansCaps]

\writestatus{loading}{ConTeXt Font Macros / Collections}

\registerctxluafile{font-col}{}

\unprotect

\unexpanded\def\definefontfallback{\doquadrupleempty\font_fallbacks_define}
\unexpanded\def\resetfontfallback {\dodoubleempty   \font_fallbacks_reset }

\def\font_fallbacks_define[#name][#font][#ranges][#settings]%
  {\let\mathsizesuffix\relax
   \clf_fontcollectiondefine{#name}{#font}{#ranges}{#settings}%
   \let\mathsizesuffix\empty}

\def\font_fallbacks_reset[#name][#font]%
  {\clf_fontcollectionreset{#name}{#font}}

\def\font_fallbacks_prepare#name%
  {\clf_fontcollectionprepare{#name}} % add fallbacks to last font

% we might as well move the handling to lua but then we need to pass the
% fallbacks, skewchar etc.

\newconditional\c_font_fallbacks_in_progress

\def\font_fallbacks_prepare_indeed#fallbacks%
  {\begingroup
     \settrue\c_font_fallbacks_in_progress
     \lastrawfontcall % sets current font id
     \font_fallbacks_prepare#fallbacks%
   \endgroup}

\let\m_font_fallbacks\empty % set in the font-ini

\appendtoks
    \ifconditional\c_font_fallbacks_in_progress\else
        \ifx\m_font_fallbacks\empty
            \ifx\m_font_class_fallbacks\empty
            \else
                \font_fallbacks_prepare_indeed\m_font_class_fallbacks
            \fi
        \else
            \font_fallbacks_prepare_indeed\m_font_fallbacks
        \fi
   \fi
\to\everydefinefont

\def\font_fallbacks_start_cloning
  {\begingroup
   \let\savedfontspec\somefontspec}

\def\font_fallbacks_stop_cloning
  {\endgroup}

\def\font_fallbacks_clone_unique#specification#scale% kind of dododefinefont
  {\clf_fontcollectionreport{defining #specification (relative scale: #scale)}% brrr
   \setfalse\c_font_auto_size
   \let\lastfontidentifier\s!dummy
   \def\v_font_size_relative{#scale}%
   \let\v_font_size_absolute\fontbody
   \font_helpers_low_level_define{#specification}\v_font_identifier_basic
   \csname\v_font_identifier_basic\endcsname
   \setfalse\c_font_auto_size} % no \setfontcharacteristics and \the\everyfontswitch needed

\def\font_fallbacks_clone_inherited#font% also a second argument
  {\font_fallbacks_clone_unique{#font \savedfontspec}}

\def\font_fallbacks_register_main        #name{\clf_fontcollectionregister{#name}}
\def\font_fallbacks_prepare_clone_vectors#name{\clf_fontcollectionclone{#name}}

% math (experiment, todo clf_)

\def\font_fallbacks_register_math#1#2#3#4%
  {\doifelsenothing{#3}%
      {\definedfont[#2 at #4sp]}%
      {\definedfont[#2*#3\space at #4\scaledpoint]}%
   \clf_registerfontfallbackid#1\space\fontid\font\space{#2}}

% \def\font_fallbacks_finish_math
%   {\ctxlua{mathematics.finishfallbacks()}}

% check : only replace when present in replacement font (default: no)
% force : force replacent even when basefont has glyph  (default: yes)

% \definefontfallback [whatever] [Slanted]     [0x0060-0x007F] [force=yes]
% \definefontfallback [whatever] [Bold]        [0x0080:0x00FF,0x00A0:0x00AF] [rscale=2.0]
% \definefontfallback [whatever] [BoldSlanted] ["00C0-"00C7] [check=yes,force=yes]
% \definefontfallback [whatever] [Mono]        [latinextendeda] [force=yes] % 0x0100:0x017F
% \definefontfallback [whatever] [Mono]        [latin extended a] [force=yes] % 0x0100:0x017F
%
% \definefontsynonym[SerifPlus][Serif][fallbacks=whatever]
%
% \showfont[SerifPlus][all]

% \definefontfeature[zh][mode=node,script=hang,lang=zhs]
% \definefontfallback[serifwhatever]          [lmroman10-regular]   [0x0000-0x0400][force=yes]
% \definefontfallback[serifboldwhatever]      [lmroman10-bold]      [0x0000-0x0400][force=yes]
% \definefontfallback[serifitalicwhatever]    [lmroman10-italic]    [0x0000-0x0400][force=yes]
% \definefontfallback[serifbolditalicwhatever][lmroman10-bolditalic][0x0000-0x0400][force=yes]
%
% \starttypescript [serif] [zhfont]
%    \definefontsynonym [zhserif]          [AdobeSongStd-Light]   [features=zh,fallbacks=serifwhatever]
%    \definefontsynonym [zhserifbold]      [AdobeHeitiStd-Regular][features=zh,fallbacks=serifboldwhatever]
%    \definefontsynonym [zhserifitalic]    [AdobeKaitiStd-Regular][features=zh,fallbacks=serifitalicwhatever]
%    \definefontsynonym [zhserifbolditalic][AdobeHeitiStd-Regular][features=zh,fallbacks=serifbolditalicwhatever]
% \stoptypescript
%
% \starttypescript [serif][zhfont][name]
%    \definefontsynonym[Serif]             [zhserif]             % [fallbacks=serifwhatever]
%    \definefontsynonym[SerifBold]         [zhserifbold]         % [fallbacks=serifboldwhatever]
%    \definefontsynonym[SerifItalic]       [zhserifitalic]       % [fallbacks=serifitalicwhatever]
%    \definefontsynonym[SerifBoldItalic]   [zhserifbolditalic]   % [fallbacks=serifbolditalicwhatever]
% \stoptypescript
%
% \starttypescript[myfont]
%    \definetypeface[myfont][rm][serif][zhfont]
% \stoptypescript
%
% \usetypescript[myfont] \setupbodyfont[myfont,rm,12pt]
%
% \starttext
%   fonts {\bf fonts} {\bi fonts} {\it fonts}
% \stoptext

\protect \endinput
