%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]
%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

% todo: missing only, force always, multiple fallbacks with test, scale
%
% \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]

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

\registerctxluafile{font-col}{1.001}

\unprotect

\def\definefontfallback
  {\doquadrupleempty\dodefinefontfallback}

\def\dodefinefontfallback[#1][#2][#3][#4]%
  {\ctxlua{fonts.collections.define("#1","#2",\!!bs#3\!!es,\!!bs#4\!!es)}}

\def\resetfontfallback
  {\dodoubleempty\doresetfontfallback}

\def\doresetfontfallback[#1][#2]%
  {\ctxlua{fonts.collections.reset("#1","#2")}}

% add fallbacks to last font

\def\dodefinefontfallbacks#1%
  {\ctxlua{fonts.collections.prepare("#1")}}

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

\setfalse\doingfontfallbacks

\def\dodefinefontfallbacksindeed#1%
  {\begingroup
     \settrue\doingfontfallbacks
     \lastrawfontcall % sets current font id
     \dodefinefontfallbacks#1%
   \endgroup}

\appendtoks
    \ifconditional\doingfontfallbacks\else
        \ifx\@@fontfallbacks\empty
            \ifx\@@fontclassfallbacks\empty
            \else
                \dodefinefontfallbacksindeed\@@fontclassfallbacks
            \fi
        \else
            \dodefinefontfallbacksindeed\@@fontfallbacks
        \fi
   \fi
\to\everydefinefont

\def\dostartcloningfonts
  {\bgroup
   \let\savedfontspec\somefontspec}

\def\dostopcloningfonts
  {\egroup}

\def\doclonefonta#1#2% kind of dododefinefont
  {\ctxlua{fonts.collections.message("defining #1 (relative scale: #2)")}%
   \autofontsizefalse
   \let\lastfontidentifier\s!dummy
   \def\localrelativefontsize{#2}%
   \let\localabsolutefontsize\fontbody
   \lowleveldefinefont{#1}\rawfontidentifier
   \csname\rawfontidentifier\endcsname
   \autofontsizefalse
   %\setfontcharacteristics
   }%\the\everyfontswitch}

\def\doclonefontb#1% #2
  {\doclonefonta{#1 \savedfontspec}}

% 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]
%
% \definefont[MySerif][SerifPlus at 10pt]
%
% \startcolumns[n=6]
%     \MySerif
%     \dostepwiserecurse {0} {65000} {1} {
%         \iffontchar\font\recurselevel
%             {\tttf\uchexnumbers\recurselevel:} \char\recurselevel\par
%         \fi
%     }
% \stopcolumns

% \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
