diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/font-fea.mkvi')
-rw-r--r-- | Master/texmf-dist/tex/context/base/font-fea.mkvi | 190 |
1 files changed, 167 insertions, 23 deletions
diff --git a/Master/texmf-dist/tex/context/base/font-fea.mkvi b/Master/texmf-dist/tex/context/base/font-fea.mkvi index 969e955759e..c1e051621b4 100644 --- a/Master/texmf-dist/tex/context/base/font-fea.mkvi +++ b/Master/texmf-dist/tex/context/base/font-fea.mkvi @@ -133,32 +133,172 @@ \attribute\zerocount\zerocount % first in list, so fast match -\let\currentfeature\empty +% beware: these are global features on top of existing font features -% ! ! ! very experimental, some test code for idris advanced features ! ! ! -% -% \startbuffer -% \definefontfeature[smallcaps][smallcaps][script=latn] -% \definefontfeature[oldstyle] [oldstyle] [script=latn] -% -% \definedfont[name:cambria at 15pt] -% -% Hello there {\setff{smallcaps}capped 123 \setff{oldstyle}123!} \blank -% Hello there {\addff{smallcaps}capped 123 \addff{oldstyle}123!} \blank -% Hello there {\addff{smallcaps}capped \subff{smallcaps}normal} \blank -% \stopbuffer -% -% \typebuffer \getbuffer +\let\currentfeature \s!current +\let\m_font_feature_list \s!current +\let\m_font_feature_asked\empty + +\newconstant\c_font_feature_state + +% hashing at this end is slower + +\unexpanded\def\addfeature {\doifnextoptionalelse\font_feature_add_yes \font_feature_add_nop } +\unexpanded\def\subtractfeature {\doifnextoptionalelse\font_feature_subtract_yes \font_feature_subtract_nop } +\unexpanded\def\replacefeature {\doifnextoptionalelse\font_feature_replace_yes \font_feature_replace_nop } +\unexpanded\def\resetandaddfeature{\doifnextoptionalelse\font_feature_reset_add_yes\font_feature_reset_add_nop} +\unexpanded\def\feature {\doifnextoptionalelse\font_feature_yes \font_feature_nop } + +\unexpanded\def\font_feature_add_yes [#feature]{\edef\m_font_feature_asked{#feature}\font_feature_add} +\unexpanded\def\font_feature_add_nop #feature{\edef\m_font_feature_asked{#feature}\font_feature_add} + +\unexpanded\def\font_feature_subtract_yes [#feature]{\edef\m_font_feature_asked{#feature}\font_feature_subtract} +\unexpanded\def\font_feature_subtract_nop #feature{\edef\m_font_feature_asked{#feature}\font_feature_subtract} + +\unexpanded\def\font_feature_replace_yes [#feature]{\edef\m_font_feature_asked{#feature}\font_feature_replace} +\unexpanded\def\font_feature_replace_nop #feature{\edef\m_font_feature_asked{#feature}\font_feature_replace} + +\unexpanded\def\font_feature_reset_add_yes[#feature]{\edef\m_font_feature_asked{#feature}\font_feature_reset_add} +\unexpanded\def\font_feature_reset_add_nop #feature{\edef\m_font_feature_asked{#feature}\font_feature_reset_add} + +\let\doaddfeature \font_feature_add_nop % low level faster ones +\let\dosubtractfeature \font_feature_subtract_nop +\let\doreplacefeature \font_feature_replace_nop +\let\doreserandaddfeature\font_feature_reset_add_nop + +\unexpanded\def\font_feature_add + {\ifnum\c_font_feature_state=\plusone + \ifx\m_font_feature_asked\currentfeature\else + \font_feature_add_indeed + \fi + \else + \font_feature_add_indeed + \fi} + +\unexpanded\def\font_feature_add_indeed + {\ctxcommand{feature("+","\m_font_feature_list","\m_font_feature_asked")}% + \edef\m_font_feature_list{\m_font_feature_list+\m_font_feature_asked}% also + at the lua end + \c_font_feature_state\plusone + \let\currentfeature\m_font_feature_asked} + +\unexpanded\def\font_feature_subtract + {\ifnum\c_font_feature_state=\minusone + \ifx\m_font_feature_asked\currentfeature\else + \font_feature_subtract_indeed + \fi + \else + \font_feature_subtract_indeed + \fi} + +\unexpanded\def\font_feature_subtract_indeed + {\ctxcommand{feature("-","\m_font_feature_list","\m_font_feature_asked")}% + \edef\m_font_feature_list{\m_font_feature_list-\m_font_feature_asked}% also - at the lua end + \c_font_feature_state\minusone + \let\currentfeature\m_font_feature_asked} + +\unexpanded\def\font_feature_replace + {\ifnum\c_font_feature_state=\zerocount + \ifx\m_font_feature_asked\currentfeature\else + \font_feature_replace_indeed + \fi + \else + \font_feature_replace_indeed + \fi} -\unexpanded\def\featureattribute#feature{\ctxcommand{featureattribute("#feature")}} -\unexpanded\def\setfontfeature #feature{\ctxcommand{setfontfeature("#feature")}\edef\currentfeature{#feature}} -%unexpanded\def\resetfontfeature {\ctxcommand{resetfontfeature()}\let\currentfeature\empty} % initial value -\unexpanded\def\resetfontfeature {\attribute\zerocount\zerocount \let\currentfeature\empty} % initial value +\unexpanded\def\font_feature_replace_indeed + {\ctxcommand{feature("=","\m_font_feature_list","\m_font_feature_asked")}% + \edef\m_font_feature_list{\m_font_feature_list=\m_font_feature_asked}% also = at the lua end + \c_font_feature_state\zerocount + \let\currentfeature\m_font_feature_asked} -\unexpanded\def\addfontfeaturetoset #feature{\ctxcommand{addfs("#feature")}} % merge -\unexpanded\def\subtractfontfeaturefromset #feature{\ctxcommand{subfs("#feature")}} % merge -\unexpanded\def\addfontfeaturetofont #feature{\ctxcommand{addff("#feature")}} % overload -\unexpanded\def\subtractfontfeaturefromfont#feature{\ctxcommand{subff("#feature")}} % overload +\unexpanded\def\resetfeature + {\ifx\currentfeature\s!current \else + \font_feature_reset_indeed + \fi} + +\unexpanded\def\font_feature_reset_indeed + {\let\m_font_feature_asked\empty + \let\currentfeature \s!current + \let\m_font_feature_list \s!current + \ctxcommand{feature(false)}} + +\unexpanded\def\revivefeature + {\ifx\currentfeature\s!current \else + \font_feature_revive_indeed + \fi} + +\unexpanded\def\font_feature_revive_indeed + {\ctxcommand{feature(true,"\m_font_feature_list")}} + +\unexpanded\def\font_feature_reset_add + {\ifnum\c_font_feature_state=\plusone + \ifx\m_font_feature_asked\currentfeature\else + \font_feature_reset_add_indeed + \fi + \else + \font_feature_reset_add_indeed + \fi} + +\unexpanded\def\font_feature_reset_add_indeed + {\ctxcommand{feature("+","\s!current","\m_font_feature_asked")}% + \edef\m_font_feature_list{\s!current+\m_font_feature_asked}% also + at the lua end + \c_font_feature_state\plusone + \let\currentfeature\m_font_feature_asked} + +\installcorenamespace{featureyes} +\installcorenamespace{featurenop} + +\unexpanded\def\font_feature_yes[#method]{\csname\??featureyes\ifcsname\??featureyes#1\endcsname#1\else\s!unknown\fi\endcsname} +\unexpanded\def\font_feature_nop #method{\csname\??featurenop\ifcsname\??featurenop#1\endcsname#1\else\s!unknown\fi\endcsname} + +\letvalue{\??featureyes +}\addfeature +\letvalue{\??featurenop +}\addfeature +\letvalue{\??featureyes -}\subtractfeature +\letvalue{\??featurenop -}\subtractfeature +\letvalue{\??featureyes =}\replacefeature +\letvalue{\??featurenop =}\replacefeature +\letvalue{\??featureyes !}\resetandaddfeature +\letvalue{\??featurenop !}\resetandaddfeature +\letvalue{\??featureyes >}\revivefeature +\letvalue{\??featurenop >}\revivefeature +\letvalue{\??featureyes <}\resetfeature +\letvalue{\??featurenop <}\resetfeature + +\letvalue{\??featureyes\v!more }\addfeature % add set to previous set and combine with font set +\letvalue{\??featurenop\v!more }\addfeature +\letvalue{\??featureyes\v!less }\subtractfeature % subtract set from previous set and combine with font set +\letvalue{\??featurenop\v!less }\subtractfeature +\letvalue{\??featureyes\v!new }\replacefeature % replace font set +\letvalue{\??featurenop\v!new }\replacefeature +\letvalue{\??featureyes\v!reset }\resetfeature % forget sets and revert to font set +\letvalue{\??featurenop\v!reset }\resetfeature +\letvalue{\??featureyes\v!default}\revivefeature % make sure the current set is used on top of the font set +\letvalue{\??featurenop\v!default}\revivefeature +\letvalue{\??featureyes\v!old }\revivefeature +\letvalue{\??featurenop\v!old }\revivefeature +\letvalue{\??featureyes\v!local }\resetandaddfeature +\letvalue{\??featurenop\v!local }\resetandaddfeature +\letvalue{\??featureyes\s!unknown}\empty +\letvalue{\??featurenop\s!unknown}\empty + +% just for old times sake: + +\unexpanded\def\featureattribute#feature% + {\ctxcommand{featureattribute("#feature")}} + +\unexpanded\def\setfontfeature #feature% + {\edef\currentfeature{#feature}% + \let\m_font_feature_list\currentfeature + \ctxcommand{setfontfeature("\currentfeature")}} + +\let\resetfontfeature\resetfeature + +% these are obsolete (don't use them any longer) + +\let\addfontfeaturetoset \font_feature_add_nop +\let\subtractfontfeaturefromset \font_feature_subtract_nop +\let\addfontfeaturetofont \font_feature_add_nop +\let\subtractfontfeaturefromfont\font_feature_subtract_nop \let\setff\setfontfeature \let\addfs\addfontfeaturetoset @@ -186,4 +326,8 @@ \def\doifelsecurrentfonthasfeature#feature% {\ctxcommand{doifelsecurrentfonthasfeature("#feature")}} +% new: + +\ctxcommand{registerlanguagefeatures()} + \protect \endinput |