From 85b7bc695629926641c7cb752fd478adfdf374f3 Mon Sep 17 00:00:00 2001 From: Marius Date: Sun, 4 Jul 2010 15:32:09 +0300 Subject: stable 2010-05-24 13:10 --- tex/context/base/lang-url.mkii | 306 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 tex/context/base/lang-url.mkii (limited to 'tex/context/base/lang-url.mkii') diff --git a/tex/context/base/lang-url.mkii b/tex/context/base/lang-url.mkii new file mode 100644 index 000000000..fdf530b45 --- /dev/null +++ b/tex/context/base/lang-url.mkii @@ -0,0 +1,306 @@ +%D \module +%D [ file=lang-url, +%D version=2008.01.22, % used to be lang-mis +%D title=\CONTEXT\ Language Macros, +%D subtitle=Language Options, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +%D This is rather old code. The following solution was used +%D for a long time and is kind of built-up over the years. + +\ifx\\\undefined \let\\\crlf \fi + +%D \macros +%D {hyphenatedurl} +%D +%D For those who want to put full \URL's in a text, we offer +%D +%D \startbuffer +%D \hyphenatedurl{http://optimist.optimist/optimist/optimist.optimist#optimist} +%D \stopbuffer +%D +%D \typebuffer +%D +%D which breaks at the appropriate places. Watch the \type{#} +%D hack. +%D +%D When passed as argument, like in \type {\goto}, one needs +%D to substitute a \type {\\} for each \type{#}. +%D +%D \startbuffer +%D \hyphenatedurl{http://this.is.a.rather/strange/reference#indeed} +%D \stopbuffer +%D +%D \typebuffer + +\ifx\urlsplitmode\undefined \chardef\urlsplitmode\plusone \fi + +% 0 => don't split +% 1 => . : na, rest voor +% 2 => alles na +% 3 => alles voor + +% \bgroup \catcode`\~=\active \catcode`\/=\active +% +% \unexpanded\gdef\hyphenatedurl#1% {}{} handles accents +% {\bgroup +% \ifnum\hyphenpenalty<10000 \else +% \def\discretionary##1##2##3{##1\allowbreak##2}% +% \fi +% \obeyhyphens +% \def\splitbefore##1% +% {\setbox\scratchbox=\hbox{##1{}{}}% +% \ifcase\urlsplitmode +% \box\scratchbox +% \or +% \postwordbreak\box\scratchbox\prewordbreak +% \or +% \prewordbreak\discretionary{\box\scratchbox}{}{\box\scratchbox}\prewordbreak +% \else +% \postwordbreak\box\scratchbox\prewordbreak +% \fi}% +% \def\splitafter##1% +% {\ifcase\urlsplitmode +% ##1{}{}% +% \or +% \prewordbreak\discretionary{##1{}{}}{}{##1{}{}}\prewordbreak +% \or +% \prewordbreak\discretionary{##1{}{}}{}{##1{}{}}\prewordbreak +% \else +% \prewordbreak\discretionary{}{##1{}{}}{##1{}{}}\prewordbreak +% \fi}% +% \def\splitanyway##1% +% {\prewordbreak##1\prewordbreak}% +% \def\flushurl% +% {\savedurl\let\savedurl\empty}% +% \def\\% +% {\spliturl\#}% +% \let\~=\lettertilde\let~=\~% +% \let\/=\letterslash\let/=\/% +% \let\savedurl\empty +% \scratchcounter\zerocount % used for hyphenmethod +% \handletokens#1\with\scanurl\savedurl +% \egroup} +% +% \egroup + +% \chardef\urlhyphenmethod=0 + +% \def\scanurl#1% +% {\advance\scratchcounter\plusone +% \ifx#1\blankspace +% \flushurl\splitanyway\normalspace +% \else\ifx#1\ % +% \flushurl\splitanyway\normalspace +% \else\ifx#1\space +% \flushurl\splitanyway\normalspace +% \else\ifx#1\~% +% \flushurl\splitbefore\~% +% \else\ifx#1\#% +% \flushurl\splitbefore\#% +% \else\ifx#1\&% +% \flushurl\splitbefore\&% +% \else\ifx#1\%% +% \flushurl\splitbefore\%% +% \else\ifx#1\_% +% \flushurl\splitbefore\_% +% \else\if\noexpand#1\relax +% #1% +% \else\ifnum\catcode`#1=8 +% \flushurl\splitbefore\_% +% \else\ifnum\catcode`#1=6 +% \flushurl\splitbefore\#% +% \else\ifnum\catcode`#1=4 +% \flushurl\splitbefore\&% +% \else\expandafter\if\string#1\lettertilde +% \flushurl\splitbefore\~% +% \else\expandafter\if\string#1\letterpercent +% \flushurl\splitbefore\%% +% \else\expandafter\if\string#1\letterunderscore +% \flushurl\splitbefore\_% +% \else\expandafter\if\string#1\letterquestionmark +% \flushurl\splitafter\letterquestionmark +% \else\expandafter\if\string#1\letterat +% \flushurl\splitafter\letterat +% \else\expandafter\if\string#1\letterslash +% \edef\savedurl{\savedurl\letterslash}% +% \else\expandafter\if\string#1+% +% \flushurl\splitafter+% +% \else\expandafter\if\string#1:% +% \flushurl\splitafter:% +% \else\expandafter\if\string#1.% +% \flushurl\splitafter.% +% \else\expandafter\if\string#1(% +% \flushurl\splitbefore(% +% \else\expandafter\if\string#1)% +% \flushurl\splitafter)% +% \else +% \ifx\savedurl\empty\else +% \splitbefore\savedurl +% \let\savedurl\empty +% \fi +% \ifcase\urlhyphenmethod +% \string#1% +% \else +% \ifnum\scratchcounter>\plusthree % so, \http: will not break +% \edef\savedurl{\string#1}% +% \else +% \string#1% +% \fi +% \fi +% \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +%D The following approach takes more resources but is cleaner (after all, we now +%D have huge \TEX's. It's is basically a \TEX\ version of the \MKIV\ variant. + +\newtoks\everyhyphenatedurl + +\appendtoks + \let\&\letterampersand + \let\#\letterhash + \let\~\lettertilde + \let\\\letterbackslash + \let\$\letterdollar + \let\^\letterhat + \let\_\letterunderscore + \let\{\letterleftbrace + \let\}\letterrightbrace + \let\|\letterbar + \let~=\lettertilde + \let|=\letterbar +\to \everyhyphenatedurl + +\def\hyphenatedurlseparator{} % \periodcentered + +\def\dohyphenatedurlnormal#1{\char#1\relax}% +\def\dohyphenatedurlafter #1{\char#1\discretionary{}{\hyphenatedurlseparator}{}}% +\def\dohyphenatedurlbefore#1{\discretionary{\hyphenatedurlseparator}{}{}\char#1\relax}% + +% 0=normal 1=before 2=after + +\def\sethyphenatedurlnormal#1{\expandafter\chardef\csname url @ #1\endcsname\zerocount} +\def\sethyphenatedurlbefore#1{\expandafter\chardef\csname url @ #1\endcsname\plusone } +\def\sethyphenatedurlafter #1{\expandafter\chardef\csname url @ #1\endcsname\plustwo } + +\sethyphenatedurlbefore ! +\sethyphenatedurlbefore " +\sethyphenatedurlbefore \letterhash +\sethyphenatedurlbefore \letterdollar +\sethyphenatedurlbefore \letterpercent +\sethyphenatedurlbefore \letterampersand +\sethyphenatedurlbefore ( +\sethyphenatedurlbefore * +\sethyphenatedurlbefore + +\sethyphenatedurlbefore , +\sethyphenatedurlbefore - +\sethyphenatedurlbefore . +\sethyphenatedurlbefore / +\sethyphenatedurlbefore : +\sethyphenatedurlbefore ; +\sethyphenatedurlbefore < +\sethyphenatedurlbefore = +\sethyphenatedurlbefore > +\sethyphenatedurlbefore ? +\sethyphenatedurlbefore @ +\sethyphenatedurlbefore [ +\sethyphenatedurlbefore \letterbackslash +\sethyphenatedurlbefore ^ +\sethyphenatedurlbefore _ +\sethyphenatedurlbefore ` +\sethyphenatedurlbefore \letteropenbrace +\sethyphenatedurlbefore \letterbar +\sethyphenatedurlbefore \lettertilde + +\sethyphenatedurlafter ' +\sethyphenatedurlafter ) +\sethyphenatedurlafter ] +\sethyphenatedurlafter \letterclosebrace + +\unexpanded \def\hyphenatedurl#1% + {\dontleavehmode + \begingroup + \the\everyhyphenatedurl + \edef\ascii{#1}% + \expanded{\handletokens{\detokenize\expandafter{\ascii}}}\with\dohyphenatedurl + \endgroup} + +\def\dohyphenatedurl#1% + {\ifcase\executeifdefined{url @ #1}\zerocount\relax + \expandafter\dohyphenatedurlnormal + \or + \expandafter\dohyphenatedurlbefore + \or + \expandafter\dohyphenatedurlafter + \fi{\number`#1}} + +% maybe ... to be finished +% +% \def\hyphenatedstring#1% +% {\bgroup +% \nohyphens +% \def\next##1{##1\doif{##1}{-}{\allowbreak}}% +% \handletokens#1\with\next +% \egroup} +% +% {\hsize1cm\hyphenatedstring{ABXXXXXXXXXXC-12345-12345}} + +%D \macros +%D {hyphenatedfilename} +%D +%D For the moment we treat filenames in a similar way, +%D +%D \starttyping +%D \hyphenatedfilename{here/there/filename.suffix} +%D \stoptyping + +\ifx\hyphenatedfilename\undefined \let\hyphenatedfilename\hyphenatedurl \fi + +% \def\test#1% +% {\dontleavehmode +% \begingroup +% \tttf +% \hyphenatedurl {% +% \letterampersand #1\letterampersand #1\letterampersand #1\letterampersand #1\letterampersand +% \letterhash #1\letterhash #1\letterpercent #1\letterslash #1\letterampersand +% }% +% \endgroup} + +% \dorecurse{100}{\test{a} \test{ab} \test{abc} \test{abcd} \test{abcde} \test{abcdef}} + +\protect \endinput + +% \bgroup + +% \gdef\lettercolon{:} + +% \catcode`\:=\active +% \catcode`\^=\active +% \catcode`\/=\active +% \catcode`\~=\active + +% \gdef\theurlcolon {\nobreak\hbox{\lettercolon}\allowbreak} +% \gdef\theurlslash#1{\nobreak\hbox{\letterslash}\ifx#1\relax\else\ifnum`/=\expandafter`\string#1\else\allowbreak\fi#1\fi} +% \gdef\theurlhat {\allowbreak\hbox{\letterhat}\nobreak} +% \gdef\theurltilde {\allowbreak\hbox{\lettertilde}\nobreak} + +% \gdef\ForMojcaWhoLikesHacks#1% +% {\dontleavehmode +% \begingroup +% \mathcode`\:="8000 \let:\theurlcolon +% \mathcode`\^="8000 \let^\theurlhat +% \mathcode`\/="8000 \let/\theurlslash +% \mathcode`\~="8000 \let~\theurltilde +% \everymath\emptytoks +% \mathsurround\zeropoint$\tf#1\relax$% +% \endgroup} +% \egroup + +% \hsize 1mm \ForMojcaWhoLikesHacks{http://www.sil.org//silesr/} -- cgit v1.2.3