summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/font-fea.mkvi
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/font-fea.mkvi')
-rw-r--r--Master/texmf-dist/tex/context/base/font-fea.mkvi190
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