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

\registerctxluafile{lang-url}{1.001}

\unprotect

%D Traditionally this code is in the language namespace as
%D hyphenation relates to languages.

%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

\newtoks\everyhyphenatedurl

\appendtoks
    \resetfontfeature
    \resetcharacterspacing
    %
    \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

\let\hyphenatedurlseparator    \empty % \periodcentered
\let\hyphenatedurldiscretionary\empty

\setnewconstant\hyphenatedurllefthyphenmin \plusthree
\setnewconstant\hyphenatedurlrighthyphenmin\plusthree

\def\lang_url_more{\penalty\plustenthousand\hskip\scratchskipone\penalty\plustenthousand}
\def\lang_url_less{\penalty\plustenthousand\hskip\scratchskiptwo\penalty\plustenthousand}
\def\lang_url_trac{\penalty\plustenthousand\hsmash{\darkred\vl}\penalty\plustenthousand}

\def\lang_url_a#1{\lang_url_more\char#1\lang_url_show\discretionary{}{\hyphenatedurlseparator}{}}
\def\lang_url_b#1{\lang_url_more\discretionary{\hyphenatedurlseparator}{}{}\lang_url_show\char#1\relax}
\def\lang_url_d#1{\lang_url_more\discretionary{\lang_url_show}{\lang_url_show}{\lang_url_show}}
\def\lang_url_l#1{\lang_url_less\char#1\relax}
\def\lang_url_c#1{\lang_url_more\char#1\relax}
\def\lang_url_L#1{\lang_url_less\char#1\relax}
\def\lang_url_C#1{\lang_url_more\char#1\relax}

\unexpanded\def\showhyphenatedurlbreaks % for old times sake
  {\let\lang_url_show\lang_url_trac}

\installtextracker
  {languages.url}
  {\let\lang_url_show\lang_url_trac}
  {\let\lang_url_show\relax}

\let\lang_url_show\relax

\unexpanded\def\sethyphenatedurlnormal#1{\clf_sethyphenatedurlcharacters{#1}{\v!normal}}
\unexpanded\def\sethyphenatedurlbefore#1{\clf_sethyphenatedurlcharacters{#1}{\v!before}}
\unexpanded\def\sethyphenatedurlafter #1{\clf_sethyphenatedurlcharacters{#1}{\v!after }}

% \sethyphenatedurlafter{ABCDEF}

\unexpanded\def\hyphenatedurl#1%
  {\dontleavehmode
   \begingroup
   \the\everyhyphenatedurl
   \normallanguage\zerocount
   \let\a\lang_url_a % after
   \let\b\lang_url_b % before
   \let\d\lang_url_d % disc
   \let\l\lang_url_l % letter
   \let\c\lang_url_c % character
   \let\L\lang_url_L % letter_nobreak
   \let\C\lang_url_C % character_nobreak
   \scratchskipone\zeropoint\s!plus\dimexpr\emwidth/12\s!minus\dimexpr\emwidth/24\relax % 1.00pt @ 12pt
   \scratchskiptwo\zeropoint\s!plus\dimexpr\emwidth/48\s!minus\dimexpr\emwidth/96\relax % 0.25pt @ 12pt
   \normalexpanded{\noexpand\clf_hyphenatedurl
     {\noexpand\detokenize{#1}}%
     \hyphenatedurllefthyphenmin
     \hyphenatedurlrighthyphenmin
     {\hyphenatedurldiscretionary}%
   }%
   \endgroup}

%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

% \setuppapersize[A7]
%
% \unexpanded\def\WhateverA#1%
%   {\dontleavehmode
%    \begingroup
%    \prehyphenchar"B7\relax
%    \setbox\scratchbox\hbox{\tttf#1}%
%    \prehyphenchar`-\relax
%    \unhbox\scratchbox
%    \endgroup}
%
% \unexpanded\def\WhateverB#1%
%   {\dontleavehmode
%    \begingroup
%    \tttf
%    \prehyphenchar\minusone
%  % \localrightbox{\llap{_}}%
%    \localrightbox{\llap{\smash{\lower1.5ex\hbox{\char"2192}}}}%
%    \setbox\scratchbox\hbox{#1}%
%    \prehyphenchar`-\relax
%    \unhbox\scratchbox
%    \endgroup}
%
% \begingroup \hsize1cm
%   \WhateverA{thisisaboringandverylongcommand}\par
%   \WhateverB{thisisaboringandverylongcommand}\par
% \endgroup
