summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/third/filter
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-12-18 23:05:57 +0000
committerKarl Berry <karl@freefriends.org>2011-12-18 23:05:57 +0000
commit424d653e8d427f93d1c13b037f95db9e89936bba (patch)
tree8ead1f1e5f6c4fc0f446f04df7636cf034ba944b /Master/texmf-dist/tex/context/third/filter
parentba869cdd7651e89b0fc24a5f0555392369be2678 (diff)
context-filter (18dec11)
git-svn-id: svn://tug.org/texlive/trunk@24865 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/third/filter')
-rw-r--r--Master/texmf-dist/tex/context/third/filter/t-filter.mkii445
-rw-r--r--Master/texmf-dist/tex/context/third/filter/t-filter.mkiv454
-rw-r--r--Master/texmf-dist/tex/context/third/filter/t-filter.tex537
-rw-r--r--Master/texmf-dist/tex/context/third/filter/t-module-catcodes.tex70
4 files changed, 946 insertions, 560 deletions
diff --git a/Master/texmf-dist/tex/context/third/filter/t-filter.mkii b/Master/texmf-dist/tex/context/third/filter/t-filter.mkii
new file mode 100644
index 00000000000..9735eab750c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/third/filter/t-filter.mkii
@@ -0,0 +1,445 @@
+%D \module
+%D [ file=t-filter,
+%D version=2011.12.17,
+%D title=\CONTEXT\ User Module,
+%D subtitle=Filter,
+%D author=Aditya Mahajan,
+%D date=\currentdate,
+%D copyright=Aditya Mahajan,
+%D email=adityam <at> ieee <dot> org,
+%D license=Simplified BSD License]
+
+\writestatus{loading}{Filter (ver: 2011.12.17)}
+
+\ifx\undefined\normalexpanded \let\normalexpanded\expanded \fi
+
+\startmodule [filter]
+\usemodule [module-catcodes]
+
+\unprotectmodulecatcodes
+
+%D \subject {Interface}
+%D
+%D Using interface constants allows one to use \type{\c!filter} etc. in
+%D the module definition, and thereby reduces the risk of a typo.
+%D Currently, only English names are provided. If someone wants a
+%D multi-lingual interface, let me know and I will add other language
+%D names as well,
+
+\startinterface all
+ \setinterfaceconstant {filter} {filter}
+ \setinterfaceconstant {filtercommand} {filtercommand}
+ \setinterfaceconstant {output} {output}
+ \setinterfaceconstant {read} {read}
+ \setinterfaceconstant {readcommand} {readcommand}
+\stopinterface
+
+
+%D \subject {Name space}
+%D
+%D We use logical names to easily catch typos.
+
+\def\externalfilter@id {externalfilter}
+\def\externalfilter@namespace {@@@@\externalfilter@id}
+\def\externalfilter@name {}
+
+\def\externalfilter@temp_prefix {temp}
+\def\externalfilter@count {\externalfilter@namespace-\externalfilter@name-counter}
+
+\installparameterhandler \externalfilter@namespace \externalfilter@id
+\installparameterhashhandler \externalfilter@namespace \externalfilter@id
+\installsetuphandler \externalfilter@namespace \externalfilter@id
+
+% For backward compatibility
+\let\setupexternalfilters \setupexternalfilter
+
+%D \subject {Messages}
+
+\def\m!externalfilter{t-filter}
+
+\setinterfacemessage\m!externalfilter{title} {\m!externalfilter}
+\setinterfacemessage\m!externalfilter{notfound} {file -- cannot be found}
+\setinterfacemessage\m!externalfilter{missing} {output file missing}
+\setinterfacemessage\m!externalfilter{forbidden} {Fatal Error: Cannot use absolute path -- as directory}
+\setinterfacemessage\m!externalfilter{slash} {Appending / to directory -- }
+\setinterfacemessage\m!externalfilter{reuse} {\c!state=\v!stop : Not running filter on file --}
+\setinterfacemessage\m!externalfilter{force} {mode 'force' enabled: Forcing running of filters}
+
+
+%D \subject {Tracing Macros}
+
+\newif\iftraceexternalfilters
+
+\def\traceexternalfilters
+ {\traceexternalfilterstrue}
+
+\starttexdefinition externalfilter@show_filenames
+ \writestatus\m!externalfilter{current filter : \externalfilter@name}
+ \writestatus\m!externalfilter{base file : \externalfilter@base_file}
+ \writestatus\m!externalfilter{input file : \externalfilter@input_file}
+ \writestatus\m!externalfilter{output file : \externalfilter@output_file}
+\stoptexdefinition
+
+\starttexdefinition externalfilter@show_status #1
+ \iftraceexternalfilters
+ \writestatus\m!externalfilter{#1}
+ \fi
+\stoptexdefinition
+
+\starttexdefinition externalfilter@show_filtercommand
+ \writestatus\m!externalfilter{command : \externalfilterparameter\c!filtercommand}
+ \writestatus\m!externalfilter{state : \externalfilterparameter\c!state}
+\stoptexdefinition
+
+%D \section {The main user macros}
+
+%D \subsubject {Define a new filter}
+
+\def\defineexternalfilter
+ {\dodoubleargument\externalfilter@define}
+
+\starttexdefinition externalfilter@define [#1][#2]
+ \externalfilter@show_status{defining filter : #1}
+
+ \setupexternalfilter[#1][\s!parent=\externalfilter@namespace,#2]
+ \edef\externalfilter@name{#1}
+
+ \doif{\externalfilterparameter\c!continue}\v!yes
+ {\expandafter\newcounter\csname\externalfilter@count\endcsname}
+
+ \setvalue{\e!start#1}{\bgroup\obeylines\dodoubleargument\externalfilter@start[#1]}
+ \setvalue {\e!stop#1}{\externalfilter@process_filter}
+
+ \setvalue{process#1file}{\dodoubleargument\externalfilter@process_file[#1]}
+ \setvalue{process#1buffer}{\dotripleargument\externalfilter@process_buffer[#1]}
+ \setvalue{inline#1}{\dodoubleargument\externalfilter@inline[#1]}
+
+\stoptexdefinition
+
+\starttexdefinition externalfilter@start [#1][#2]
+ % #1 = filter
+ % #2 = options
+ \egroup %\bgroup in \start#1
+
+ \edef\externalfilter@name{#1}
+
+ \begingroup % to keep assignments local
+ \setupexternalfilter[#1][\c!name=,#2]
+
+ \externalfilter@set_filenames
+
+ % Capture the contents of the buffer
+ \dostartbuffer[\externalfilter@buffer_name][\e!start#1][\e!stop#1]
+\stoptexdefinition
+
+\starttexdefinition externalfilter@process_file [#1][#2]#3
+ % #1 = filter
+ % #2 = options
+ % #3 = filename
+ \begingroup
+
+ \edef\externalfilter@name{#1}
+ \setupexternalfilter[#1][\c!name=,#2]
+
+ \externalfilter@set_directory
+
+ \edef\externalfilter@input_file{#3}
+ \splitfilename{#3}
+ %NOTE: \edef doesn not work because \splitoffname is not expandable
+ \def\externalfilter@base_file {\splitoffname}
+
+ % The output is always in the directory specified by
+ % \c!directory; even if the input is from some other directory
+ \def\externalfilter@output_file{\externalfilter@get_directory\externalfilterparameter\c!output}
+
+ \iftraceexternalfilters \externalfilter@show_filenames \fi
+ \externalfilter@execute_filter
+ \externalfilter@read_processed_file
+
+ \endgroup
+\stoptexdefinition
+
+\starttexdefinition externalfilter@process_buffer [#1][#2][#3]
+ % #1 = filter
+ % #2 = options
+ % #3 = buffer
+ \begingroup
+
+ \edef\externalfilter@name{#1}
+ \ifthirdargument
+ \setupexternalfilter[#1][\c!name=,#2]
+ \fi
+
+ \externalfilter@set_directory
+
+ \ifthirdargument
+ \edef\externalfilter@buffer_name{#3}
+ \else
+ \edef\externalfilter@buffer_name{#2}
+ \fi
+
+ \externalfilter@set_filenames_extras
+ % In MkII, the above function sets the wrong value of
+ % \type{\externalfilter@input_file}. So, we reset that name here.
+ \edef\externalfilter@input_file {\externalfilter@base_file.\f!temporaryextension}
+
+ \iftraceexternalfilters \externalfilter@show_filenames \fi
+
+ \externalfilter@process_filter
+
+\stoptexdefinition
+
+\starttexdefinition externalfilter@inline [#1][#2]
+ \edef\externalfilter@name{#1}
+
+ \begingroup % to keep assignments local
+ \setupexternalfilter[#1][\c!numbering=,\c!name=,\c!before=,\c!after=,#2]
+
+ \externalfilter@set_filenames
+
+ \pushcatcodetable
+ \futurelet\next\externalfilter@inline_indeed
+\stoptexdefinition
+
+%D \subsubject {Write argument to file verbatim}
+%D
+%D Surprisingly, there is nothing in the core to define a function that write its
+%D argument to a file verbatim. I basically copied the \type{\type} macro.
+
+\starttexdefinition externalfilter@inline_indeed
+ \ifx\next\bgroup
+ \expandafter\externalfilter@inline_group
+ \else
+ \expandafter\externalfilter@inline_other
+ \fi
+\stoptexdefinition
+
+\starttexdefinition externalfilter@inline_group
+ \setcatcodetable \externalfilter@read_catcodes
+ \externalfilter@process_inline
+\stoptexdefinition
+
+\starttexdefinition externalfilter@inline_other #1
+ \setcatcodetable \externalfilter@verb_catcodes
+
+ \def\next##1#1{\externalfilter@process_inline{##1}}
+ \next
+\stoptexdefinition
+
+\newwrite\externalfilter@write
+
+\starttexdefinition externalfilter@process_inline #1
+ \immediate\openout \externalfilter@write\externalfilter@input_file
+ \immediate\write \externalfilter@write{\detokenize{#1}}
+ \immediate\closeout\externalfilter@write
+
+ \popcatcodetable
+
+ \externalfilter@execute_filter
+ \endlinechar\minusone %to prevent line break after reading file
+ \externalfilter@read_processed_file
+
+ % Finalization
+ \doif{\externalfilterparameter\c!continue}\v!yes
+ {\doglobal\expandafter\increment\csname\externalfilter@count\endcsname}
+ \endgroup
+\stoptexdefinition
+
+
+%D \section {Helper Functions}
+%D
+%D \subsubject {First and last character of a string}
+
+\def\externalfilter@get_first_character#1%
+ {\externalfilter@get_first_character_indeed#1\relax}
+
+\def\externalfilter@get_first_character_indeed#1#2\relax{#1}
+
+\def\externalfilter@get_last_character#1%
+ {\@EA\externalfilter@get_last_character_indeed#1\relax}
+
+\def\externalfilter@get_last_character_indeed#1#2%
+ {\ifx#2\relax#1\else\@EA\externalfilter@get_last_character_indeed\@EA#2\fi}
+
+%D \subsubject {Setting font and color attributes}
+
+
+\starttexdefinition externalfilter@attributes_start #1#2#3
+ % id style color
+ \edef\externalfilter@attributes_style{\getvalue{#1parameter}{#2}}
+ \edef\externalfilter@attributes_color{\getvalue{#1parameter}{#3}}
+
+ \expandafter\startcolor\expandafter[\externalfilter@attributes_color]
+ \expandafter\doconvertfont{\externalfilter@attributes_style}
+\stoptexdefinition
+
+\def\externalfilter@attributes_stop{\stopcolor}
+
+%D \subsubject {Set the name of output directory}
+
+\starttexdefinition externalfilter@set_directory
+ \edef\externalfilter@get_directory{\externalfilterparameter\c!directory}
+ \doifsomething{\externalfilter@get_directory}\externalfilter@set_directory_indeed
+\stoptexdefinition
+
+\starttexdefinition externalfilter@set_directory_indeed
+ \doif{\externalfilter@get_first_character\externalfilter@get_directory}{/}
+ {\writeline
+ \showmessage\m!externalfilter{forbidden}\externalfilter@get_directory
+ \batchmode
+ \errmessage{}
+ \normalend}
+
+ \doifnot{\externalfilter@get_last_character\externalfilter@get_directory}{/}
+ {\showmessage\m!externalfilter{slash}\externalfilter@get_directory
+ \edef\externalfilter@get_directory{\externalfilter@get_directory/}}
+\stoptexdefinition
+
+
+
+%D \subsubject {Set file names}
+%D
+%D \type{\externalfilter@base_file} is the name of the temporary file without
+%D extension. Its actual value depends on the state of \type{continue} key as
+%D well as the value of \type{name} key.
+
+\starttexdefinition externalfilter@set_filenames
+ \externalfilter@set_directory
+
+ % Set the name of temp file for the filter
+ \doifelse{\externalfilterparameter\c!continue}\v!yes
+ {\edef\externalfilter@buffer_name{\externalfilter@temp_prefix-\externalfilter@name-\csname\externalfilter@count\endcsname}}
+ {\edef\externalfilter@buffer_name{\externalfilter@temp_prefix-\externalfilter@name}}
+ \doifsomething{\externalfilterparameter\c!name}
+ {\edef\externalfilter@buffer_name{\externalfilter@temp_prefix-\externalfilter@name-\externalfilterparameter\c!name}}
+
+
+ \externalfilter@set_filenames_extras
+
+ \iftraceexternalfilters \externalfilter@show_filenames \fi
+\stoptexdefinition
+
+\starttexdefinition externalfilter@set_filenames_extras
+ % The following macros are useful for filter= and filtercommand= options
+ % The basename of the external file
+ \edef\externalfilter@base_file {\jobname-\externalfilter@buffer_name}
+
+ % In MkII, the buffer output is written to \TEXbufferfile{buffername} where
+ % the macro \TEXbufferfile is defined as
+ %
+ % \def\TEXbufferfile #1{\bufferprefix#1.\f!temporaryextension}
+ %
+ % We redefine bufferprefix to include the directory name.
+ \edef\bufferprefix{\externalfilter@get_directory\jobname-}
+
+ % In MkIV, we do not need to do such jugglary, because we can specify the
+ % name of the file where the buffer has to be saved. This file is
+ % \externalfilter@input_file (because it is the input to the filter).
+ \edef\externalfilter@input_file {\externalfilter@get_directory\externalfilter@base_file.\f!temporaryextension}
+
+ % Append directory name to the name of the output file
+ \edef\externalfilter@output_file{\externalfilter@get_directory\externalfilterparameter\c!output}
+\stoptexdefinition
+
+
+
+%D \subsubject {Process Filter}
+%D
+%D Execute filter, read the output and do book-keeping if needed.
+
+\starttexdefinition externalfilter@process_filter
+ \externalfilter@execute_filter
+ \externalfilter@read_processed_file
+ \endgroup
+
+ % Finalization
+ \doif{\externalfilterparameter\c!continue}\v!yes
+ {\doglobal\expandafter\increment\csname\externalfilter@count\endcsname}
+
+ \expanded{\checknextindentation[\externalfilterparameter\c!indentnext]}
+ \dorechecknextindentation
+\stoptexdefinition
+
+%D \subsubject {Execute Filter}
+
+\starttexdefinition externalfilter@execute_filter
+ \processcommacommand[\externalfilterparameter{\c!filter\c!setups}]\directsetup
+ \externalfilter@show_filtercommand
+
+ \doifelse{\externalfilterparameter\c!continue}\v!yes
+ {\doifelse{\externalfilterparameter\c!state}\v!stop
+ {\showmessage\m!externalfilter{reuse}\externalfilter@input_file}
+ {\doifmode{*first}
+ {\doifmodeelse{force}
+ {\showmessage\m!externalfilter{force}
+ \executesystemcommand
+ {mtxrun --direct \externalfilterparameter\c!filtercommand}}
+ {\executesystemcommand
+ {mtxrun --ifchanged=\externalfilter@input_file\space
+ --direct \externalfilterparameter\c!filtercommand}}}}}
+ {\executesystemcommand
+ {\externalfilterparameter\c!filtercommand}}
+\stoptexdefinition
+
+%D \subsubject {Read output}
+
+\starttexdefinition externalfilter@read_processed_file
+ \doif{\externalfilterparameter\c!read}\v!yes
+ {\doiffileelse{\externalfilter@output_file}
+ {\externalfilter@read_processed_file_indeed}
+ {\showmessage\m!externalfilter{notfound}\externalfilter@output_file
+ \externalfilter@show_filenames
+ \blank
+ {\tttf [[\getmessage\m!externalfilter{missing}]]}
+ \blank}}
+\stoptexdefinition
+
+\starttexdefinition externalfilter@read_processed_file_indeed
+ \externalfilterparameter\c!before
+
+ \begingroup
+ \externalfilter@attributes_start \externalfilter@id \c!style \c!color
+ \processcommacommand[\externalfilterparameter\c!setups]\directsetup
+ \externalfilterparameter\c!readcommand\externalfilter@output_file
+ \externalfilter@attributes_stop
+ \endgroup
+
+ \externalfilterparameter\c!after
+\stoptexdefinition
+
+%D \section {Default Values}
+
+\setupexternalfilters
+ [
+ \c!before=,
+ \c!after=,
+ \c!style=,
+ \c!color=,
+ \c!indentnext=\v!auto,
+ \c!setups=,
+ \c!continue=\v!no,
+ \c!read=\v!yes,
+ \c!readcommand=\ReadFile,
+ \c!directory=,
+ \c!output=\externalfilterbasefile.tex,
+ \c!filter=,
+ \c!filtercommand={\externalfilterparameter\c!filter\space \externalfilter@input_file},
+ \c!buffer\c!before=,
+ \c!buffer\c!after=,
+ ]
+
+\doifmodeelse{reuse}
+ {\setupexternalfilters[state=stop]}
+ {\setupexternalfilters[state=start]}
+
+\def\externalfilterbasefile {\externalfilter@base_file}
+\def\externalfilterinputfile {\externalfilter@input_file}
+\def\externalfilteroutputfile{\externalfilter@output_file}
+\def\currentexternalfilter {\externalfilter@name}
+
+% Default value
+\def\externalfilter@input_file {}
+\def\externalfilter@output_file{}
+
+\protectmodulecatcodes
+\stopmodule
diff --git a/Master/texmf-dist/tex/context/third/filter/t-filter.mkiv b/Master/texmf-dist/tex/context/third/filter/t-filter.mkiv
new file mode 100644
index 00000000000..9b19204efef
--- /dev/null
+++ b/Master/texmf-dist/tex/context/third/filter/t-filter.mkiv
@@ -0,0 +1,454 @@
+%D \module
+%D [ file=t-filter,
+%D version=2011.12.17,
+%D title=\CONTEXT\ User Module,
+%D subtitle=Filter,
+%D author=Aditya Mahajan,
+%D date=\currentdate,
+%D copyright=Aditya Mahajan,
+%D email=adityam <at> ieee <dot> org,
+%D license=Simplified BSD License]
+
+\writestatus{loading}{Filter (ver: 2011.12.17)}
+
+\ifx\undefined\normalexpanded \let\normalexpanded\expanded \fi
+
+\startmodule [filter]
+\usemodule [module-catcodes]
+\unprotectmodulecatcodes
+
+%D \subject {Interface}
+%D
+%D Using interface constants allows one to use \type{\c!filter} etc. in
+%D the module definition, and thereby reduces the risk of a typo.
+%D Currently, only English names are provided. If someone wants a
+%D multi-lingual interface, let me know and I will add other language
+%D names as well,
+
+\startinterface all
+ \setinterfaceconstant {filter} {filter}
+ \setinterfaceconstant {filtercommand} {filtercommand}
+ \setinterfaceconstant {output} {output}
+ \setinterfaceconstant {read} {read}
+ \setinterfaceconstant {readcommand} {readcommand}
+\stopinterface
+
+
+%D \subject {Name space}
+%D
+%D We use logical names to easily catch typos.
+
+\def\externalfilter@id {externalfilter}
+\def\externalfilter@namespace {@@@@\externalfilter@id}
+\def\externalfilter@name {}
+
+\def\externalfilter@temp_prefix {temp}
+\def\externalfilter@count {\externalfilter@namespace-\externalfilter@name-counter}
+
+\installparameterhandler \externalfilter@namespace \externalfilter@id
+\installparameterhashhandler \externalfilter@namespace \externalfilter@id
+\installsetuphandler \externalfilter@namespace \externalfilter@id
+\installstyleandcolorhandler \externalfilter@namespace \externalfilter@id
+
+% For backward compatibility
+\let\setupexternalfilters \setupexternalfilter
+
+
+%D \subject {Messages}
+
+\def\m!externalfilter{t-filter}
+
+\setinterfacemessage\m!externalfilter{title} {\m!externalfilter}
+\setinterfacemessage\m!externalfilter{notfound} {file -- cannot be found}
+\setinterfacemessage\m!externalfilter{missing} {output file missing}
+\setinterfacemessage\m!externalfilter{forbidden} {Fatal Error: Cannot use absolute path -- as directory}
+\setinterfacemessage\m!externalfilter{slash} {Appending / to directory -- }
+\setinterfacemessage\m!externalfilter{reuse} {\c!state=\v!stop : Not running filter on file --}
+\setinterfacemessage\m!externalfilter{force} {mode 'force' enabled: Forcing running of filters}
+
+
+%D \subject {Tracing Macros}
+
+\newif\iftraceexternalfilters
+
+\def\traceexternalfilters
+ {\traceexternalfilterstrue
+ \doifmode\s!mkiv{\enabletrackers[graphic.runfile]}}
+
+\starttexdefinition externalfilter@show_filenames
+ \writestatus\m!externalfilter{current filter : \externalfilter@name}
+ \writestatus\m!externalfilter{base file : \externalfilter@base_file}
+ \writestatus\m!externalfilter{input file : \externalfilter@input_file}
+ \writestatus\m!externalfilter{output file : \externalfilter@output_file}
+\stoptexdefinition
+
+\starttexdefinition externalfilter@show_status #1
+ \iftraceexternalfilters
+ \writestatus\m!externalfilter{#1}
+ \fi
+\stoptexdefinition
+
+\starttexdefinition externalfilter@show_filtercommand
+ \writestatus\m!externalfilter{command : \externalfilterparameter\c!filtercommand}
+ \writestatus\m!externalfilter{state : \externalfilterparameter\c!state}
+\stoptexdefinition
+
+%D \section {The main user macros}
+
+%D \subsubject {Define a new filter}
+
+\def\defineexternalfilter
+ {\dodoubleargument\externalfilter@define}
+
+\starttexdefinition externalfilter@define [#1][#2]
+ \externalfilter@show_status{defining filter : #1}
+
+ \setupexternalfilter[#1][\s!parent=\externalfilter@namespace,#2]
+ \edef\externalfilter@name{#1}
+
+ \doif{\externalfilterparameter\c!continue}\v!yes
+ {\expandafter\newcounter\csname\externalfilter@count\endcsname}
+
+ \setvalue{\e!start#1}{\bgroup\obeylines\dodoubleargument\externalfilter@start[#1]}
+ \setvalue {\e!stop#1}{\externalfilter@process_filter}
+
+ \setvalue{process#1file}{\dodoubleargument\externalfilter@process_file[#1]}
+ \setvalue{process#1buffer}{\dotripleargument\externalfilter@process_buffer[#1]}
+ \setvalue{inline#1}{\dodoubleargument\externalfilter@inline[#1]}
+
+\stoptexdefinition
+
+\starttexdefinition externalfilter@start [#1][#2]
+ % #1 = filter
+ % #2 = options
+ \egroup %\bgroup in \start#1
+
+ \edef\externalfilter@name{#1}
+
+ \begingroup % to keep assignments local
+ \setupexternalfilter[#1][\c!name=,#2]
+
+ \externalfilter@set_filenames
+
+ % Capture the contents of the buffer
+ \dostartbuffer[\externalfilter@buffer_name][\e!start#1][\e!stop#1]
+\stoptexdefinition
+
+\starttexdefinition externalfilter@process_file [#1][#2]#3
+ % #1 = filter
+ % #2 = options
+ % #3 = filename
+ \begingroup
+
+ \edef\externalfilter@name{#1}
+ \setupexternalfilter[#1][\c!name=,#2]
+
+ \externalfilter@set_directory
+
+ \edef\externalfilter@input_file{#3}
+ \splitfilename{#3}
+ %NOTE: \edef doesn not work because \splitoffname is not expandable
+ \def\externalfilter@base_file {\splitoffname}
+
+ % The output is always in the directory specified by
+ % \c!directory; even if the input is from some other directory
+ \def\externalfilter@output_file{\externalfilter@get_directory\externalfilterparameter\c!output}
+
+ \iftraceexternalfilters \externalfilter@show_filenames \fi
+ \externalfilter@execute_filter
+ \externalfilter@read_processed_file
+
+ \endgroup
+\stoptexdefinition
+
+\starttexdefinition externalfilter@process_buffer [#1][#2][#3]
+ % #1 = filter
+ % #2 = options
+ % #3 = buffer
+ \begingroup
+
+ \edef\externalfilter@name{#1}
+ \ifthirdargument
+ \setupexternalfilter[#1][\c!name=,#2]
+ \fi
+
+ \externalfilter@set_directory
+
+ \ifthirdargument
+ \edef\externalfilter@buffer_name{#3}
+ \else
+ \edef\externalfilter@buffer_name{#2}
+ \fi
+
+ \externalfilter@set_filenames_extras
+
+ \iftraceexternalfilters \externalfilter@show_filenames \fi
+
+ \externalfilter@process_filter
+
+\stoptexdefinition
+
+\starttexdefinition externalfilter@inline [#1][#2]
+ \edef\externalfilter@name{#1}
+
+ \begingroup % to keep assignments local
+ \setupexternalfilter[#1][\c!numbering=,\c!name=,\c!before=,\c!after=,#2]
+
+ \externalfilter@set_filenames
+
+ \pushcatcodetable
+ \futurelet\next\externalfilter@inline_indeed
+\stoptexdefinition
+
+%D \subsubject {Write argument to file verbatim}
+%D
+%D Surprisingly, there is nothing in the core to define a function that write its
+%D argument to a file verbatim. I basically copied the \type{\type} macro.
+
+\starttexdefinition externalfilter@inline_indeed
+ \ifx\next\bgroup
+ \expandafter\externalfilter@inline_group
+ \else
+ \expandafter\externalfilter@inline_other
+ \fi
+\stoptexdefinition
+
+\starttexdefinition externalfilter@inline_group
+ \setcatcodetable \externalfilter@read_catcodes
+ \externalfilter@process_inline
+\stoptexdefinition
+
+\starttexdefinition externalfilter@inline_other #1
+ \setcatcodetable \externalfilter@verb_catcodes
+
+ \def\next##1#1{\externalfilter@process_inline{##1}}
+ \next
+\stoptexdefinition
+
+\newwrite\externalfilter@write
+
+\starttexdefinition externalfilter@process_inline #1
+ \immediate\openout \externalfilter@write\externalfilter@input_file
+ \immediate\write \externalfilter@write{\detokenize{#1}}
+ \immediate\closeout\externalfilter@write
+
+ \popcatcodetable
+
+ \externalfilter@execute_filter
+ \endlinechar\minusone %to prevent line break after reading file
+ \externalfilter@read_processed_file
+
+ % Finalization
+ \doif{\externalfilterparameter\c!continue}\v!yes
+ {\doglobal\expandafter\increment\csname\externalfilter@count\endcsname}
+ \endgroup
+\stoptexdefinition
+
+
+%D \section {Helper Functions}
+%D
+%D \subsubject {First and last character of a string}
+
+\def\externalfilter@get_first_character#1%
+ {\externalfilter@get_first_character_indeed#1\relax}
+
+\def\externalfilter@get_first_character_indeed#1#2\relax{#1}
+
+\def\externalfilter@get_last_character#1%
+ {\@EA\externalfilter@get_last_character_indeed#1\relax}
+
+\def\externalfilter@get_last_character_indeed#1#2%
+ {\ifx#2\relax#1\else\@EA\externalfilter@get_last_character_indeed\@EA#2\fi}
+
+%D \subsubject {Setting font and color attributes}
+%D I want to use the same interface for MkII and MkIV
+
+\starttexdefinition externalfilter@attributes_start #1#2#3
+ % id style color
+ \getvalue{use#1styleandcolor}{#2}{#3}
+\stoptexdefinition
+
+\def\externalfilter@attributes_stop{}
+
+%D \subsubject {Set the name of output directory}
+
+\starttexdefinition externalfilter@set_directory
+ \edef\externalfilter@get_directory{\externalfilterparameter\c!directory}
+ \doifsomething{\externalfilter@get_directory}\externalfilter@set_directory_indeed
+\stoptexdefinition
+
+\starttexdefinition externalfilter@set_directory_indeed
+ \doif{\externalfilter@get_first_character\externalfilter@get_directory}{/}
+ {\writeline
+ \showmessage\m!externalfilter{forbidden}\externalfilter@get_directory
+ \batchmode
+ \errmessage{}
+ \normalend}
+
+ \doifnot{\externalfilter@get_last_character\externalfilter@get_directory}{/}
+ {\showmessage\m!externalfilter{slash}\externalfilter@get_directory
+ \edef\externalfilter@get_directory{\externalfilter@get_directory/}}
+\stoptexdefinition
+
+
+
+%D \subsubject {Set file names}
+%D
+%D \type{\externalfilter@base_file} is the name of the temporary file without
+%D extension. Its actual value depends on the state of \type{continue} key as
+%D well as the value of \type{name} key.
+
+\starttexdefinition externalfilter@set_filenames
+ \externalfilter@set_directory
+
+ % Set the name of temp file for the filter
+ \doifelse{\externalfilterparameter\c!continue}\v!yes
+ {\edef\externalfilter@buffer_name{\externalfilter@temp_prefix-\externalfilter@name-\csname\externalfilter@count\endcsname}}
+ {\edef\externalfilter@buffer_name{\externalfilter@temp_prefix-\externalfilter@name}}
+ \doifsomething{\externalfilterparameter\c!name}
+ {\edef\externalfilter@buffer_name{\externalfilter@temp_prefix-\externalfilter@name-\externalfilterparameter\c!name}}
+
+
+ \externalfilter@set_filenames_extras
+
+ \iftraceexternalfilters \externalfilter@show_filenames \fi
+\stoptexdefinition
+
+\starttexdefinition externalfilter@set_filenames_extras
+ % The following macros are useful for filter= and filtercommand= options
+ % The basename of the external file
+ \edef\externalfilter@base_file {\jobname-\externalfilter@buffer_name}
+
+ % In MkIV, we can specify the name of the file where the buffer has
+ % to be saved. This file is \externalfilter@input_file (because it is
+ % the input to the filter).
+ \edef\externalfilter@input_file {\externalfilter@get_directory\externalfilter@base_file.\f!temporaryextension}
+
+ % Append directory name to the name of the output file
+ \edef\externalfilter@output_file{\externalfilter@get_directory\externalfilterparameter\c!output}
+\stoptexdefinition
+
+
+
+%D \subsubject {Process Filter}
+%D
+%D Execute filter, read the output and do book-keeping if needed.
+
+\starttexdefinition externalfilter@process_filter
+ % By defualt, buffers are in memory in MkIV. So, we save them to disk
+ % To imitate the behavior of MkII, we need
+ %
+ % \savebuffer[\externalfilter@buffer_name][\externalfilter@input_file]
+ %
+ % However, in MkIV, we can save a list of buffers to a file. The empty
+ % elements of the list are ignored. So, instead we use the following
+ % \savebuffer[\externalfilterparameter{\c!buffer\c!before},\externalfilter@buffer_name,\externalfilterparameter{\c!buffer\c!after}]
+ % [\externalfilter@input_file]}
+ \savebuffer[\externalfilterparameter{\c!buffer\c!before},
+ \externalfilter@buffer_name,
+ \externalfilterparameter{\c!buffer\c!after}]
+ [\externalfilter@id]
+ \startluacode
+ %% -- On Windows, os.rename does not overwrite files :(
+ file.copy("\jobname-\externalfilter@id.\f!temporaryextension", "\externalfilter@input_file")
+ \stopluacode
+
+
+ \externalfilter@execute_filter
+ \externalfilter@read_processed_file
+ \endgroup
+
+ % Finalization
+ \doif{\externalfilterparameter\c!continue}\v!yes
+ {\doglobal\expandafter\increment\csname\externalfilter@count\endcsname}
+
+ \expanded{\checknextindentation[\externalfilterparameter\c!indentnext]}
+ \dorechecknextindentation
+\stoptexdefinition
+
+%D \subsubject {Execute Filter}
+
+% In MkIV, we use job.files.run to check if a file has changed. This function
+% writes the md5 sum to the tuc file rather than to an external file. So, we
+% must not check for the \type{*first} mode (otherwise the md5 sum is overridden
+% in the next run.
+\starttexdefinition externalfilter@execute_filter
+
+ \processcommacommand[\externalfilterparameter{\c!filter\c!setups}]\directsetup
+ \externalfilter@show_filtercommand
+
+ \doifelse{\externalfilterparameter\c!continue}\v!yes
+ {\doifelse{\externalfilterparameter\c!state}\v!stop
+ {\showmessage\m!externalfilter{reuse}\externalfilter@input_file}
+ {\doifmodeelse{force}
+ {\showmessage\m!externalfilter{force}\empty
+ \executesystemcommand
+ {\externalfilterparameter\c!filtercommand}}
+ {\ctxlua{job.files.run(\!!bs\externalfilter@input_file\!!es,
+ \!!bs\externalfilterparameter\c!filtercommand\!!es)}}}}
+ {\executesystemcommand
+ {\externalfilterparameter\c!filtercommand}}
+\stoptexdefinition
+
+%D \subsubject {Read output}
+
+\starttexdefinition externalfilter@read_processed_file
+ \doif{\externalfilterparameter\c!read}\v!yes
+ {\doiffileelse{\externalfilter@output_file}
+ {\externalfilter@read_processed_file_indeed}
+ {\showmessage\m!externalfilter{notfound}\externalfilter@output_file
+ \externalfilter@show_filenames
+ \blank
+ {\tttf [[\getmessage\m!externalfilter{missing}]]}
+ \blank}}
+\stoptexdefinition
+
+\starttexdefinition externalfilter@read_processed_file_indeed
+ \externalfilterparameter\c!before
+
+ \begingroup
+ \externalfilter@attributes_start \externalfilter@id \c!style \c!color
+ \processcommacommand[\externalfilterparameter\c!setups]\directsetup
+ \externalfilterparameter\c!readcommand\externalfilter@output_file
+ \externalfilter@attributes_stop
+ \endgroup
+
+ \externalfilterparameter\c!after
+\stoptexdefinition
+
+%D \section {Default Values}
+
+\setupexternalfilters
+ [
+ \c!before=,
+ \c!after=,
+ \c!style=,
+ \c!color=,
+ \c!indentnext=\v!auto,
+ \c!setups=,
+ \c!continue=\v!no,
+ \c!read=\v!yes,
+ \c!readcommand=\ReadFile,
+ \c!directory=,
+ \c!output=\externalfilterbasefile.tex,
+ \c!filter=,
+ \c!filtercommand={\externalfilterparameter\c!filter\space \externalfilter@input_file},
+ \c!buffer\c!before=,
+ \c!buffer\c!after=,
+ ]
+
+\doifmodeelse{reuse}
+ {\setupexternalfilters[state=stop]}
+ {\setupexternalfilters[state=start]}
+
+\def\externalfilterbasefile {\externalfilter@base_file}
+\def\externalfilterinputfile {\externalfilter@input_file}
+\def\externalfilteroutputfile{\externalfilter@output_file}
+\def\currentexternalfilter {\externalfilter@name}
+
+% Default value
+\def\externalfilter@input_file {}
+\def\externalfilter@output_file{}
+
+\protectmodulecatcodes
+\stopmodule
diff --git a/Master/texmf-dist/tex/context/third/filter/t-filter.tex b/Master/texmf-dist/tex/context/third/filter/t-filter.tex
deleted file mode 100644
index 66639bd4d64..00000000000
--- a/Master/texmf-dist/tex/context/third/filter/t-filter.tex
+++ /dev/null
@@ -1,537 +0,0 @@
-%D \module
-%D [ file=t-filter,
-%D version=2011.12.04,
-%D title=\CONTEXT\ User Module,
-%D subtitle=Filter,
-%D author=Aditya Mahajan,
-%D date=\currentdate,
-%D copyright=Aditya Mahajan,
-%D email=adityam <at> ieee <dot> org,
-%D license=Simplified BSD License]
-
-\writestatus{loading}{Filter (ver: 2011.12.04)}
-
-\ifx\undefined\normalexpanded \let\normalexpanded\expanded \fi
-
-\startmodule [filter]
-\usemodule [module-catcodes]
-
-\unprotectmodulecatcodes
-
-
-%D \section {Initialization}
-%D
-%D \subsubject {Interface}
-%D
-%D The first step is to set the interface variables. This allows me to use
-%D \type{\c!filter} etc. in the module definition, and thereby reduces the risk
-%D of a typo. Currently, only English names are provided. If someone wants, I
-%D can also add other multi-lingual names.
-
-\startinterface all
- \setinterfaceconstant {filter} {filter}
- \setinterfaceconstant {filtercommand} {filtercommand}
- \setinterfaceconstant {output} {output}
- \setinterfaceconstant {read} {read}
- \setinterfaceconstant {readcommand} {readcommand}
-\stopinterface
-
-
-%D \subsubject {Name space}
-
-\def\externalfilter::id {externalfilter}
-\def\externalfilter::namespace {@@@@\externalfilter::id}
-\def\externalfilter::name {}
-
-\def\externalfilter::temp_prefix {temp}
-\def\externalfilter::count{\externalfilter::namespace-\externalfilter::name-counter}
-
-\installparameterhandler \externalfilter::namespace \externalfilter::id
-\installparameterhashhandler \externalfilter::namespace \externalfilter::id
-\installsetuphandler \externalfilter::namespace \externalfilter::id
-
-\doifmode\s!mkiv
- {\installattributehandler \externalfilter::namespace \externalfilter::id}
-
-\def\m!externalfilter{t-filter}
-
-%D \subsubject {Messages}
-
-\setinterfacemessage\m!externalfilter{title} {\m!externalfilter}
-\setinterfacemessage\m!externalfilter{notfound} {file -- cannot be found}
-\setinterfacemessage\m!externalfilter{missing} {output file missing}
-\setinterfacemessage\m!externalfilter{forbidden} {Fatal Error: Cannot use absolute path -- as directory}
-\setinterfacemessage\m!externalfilter{slash} {Appending / to directory -- }
-\setinterfacemessage\m!externalfilter{reuse} {\c!state=\v!stop : Not running filter on file --}
-\setinterfacemessage\m!externalfilter{force} {mode 'force' enabled: Forcing running of filters}
-
-% For backward compatibility
-\let\setupexternalfilters \setupexternalfilter
-
-%D \section {Tracing Macros}
-
-\newif\iftraceexternalfilters
-
-\def\traceexternalfilters
- {\traceexternalfilterstrue
- \doifmode\s!mkiv{\enabletrackers[graphic.runfile]}}
-
-\starttexdefinition externalfilter::show_filenames
- \writestatus\m!externalfilter{current filter : \externalfilter::name}
- \writestatus\m!externalfilter{base file : \externalfilter::base_file}
- \writestatus\m!externalfilter{input file : \externalfilter::input_file}
- \writestatus\m!externalfilter{output file : \externalfilter::output_file}
-\stoptexdefinition
-
-\starttexdefinition externalfilter::show_status #1
- \iftraceexternalfilters
- \writestatus\m!externalfilter{#1}
- \fi
-\stoptexdefinition
-
-\starttexdefinition externalfilter::show_filtercommand
- \writestatus\m!externalfilter{command : \externalfilterparameter\c!filtercommand}
- \writestatus\m!externalfilter{state : \externalfilterparameter\c!state}
-\stoptexdefinition
-
-%D \section {The main user macros}
-
-%D \subsubject {Define a new filter}
-
-\def\defineexternalfilter
- {\dodoubleargument\externalfilter::define}
-
-\starttexdefinition externalfilter::define [#1][#2]
- \externalfilter::show_status{defining filter : #1}
-
- \setupexternalfilter[#1][\s!parent=\externalfilter::namespace,#2]
- \edef\externalfilter::name{#1}
-
- \doif{\externalfilterparameter\c!continue}\v!yes
- {\expandafter\newcounter\csname\externalfilter::count\endcsname}
-
- \setvalue{\e!start#1}{\bgroup\obeylines\dodoubleargument\externalfilter::start[#1]}
- \setvalue {\e!stop#1}{\externalfilter::process_filter}
-
- \setvalue{process#1file}{\dodoubleargument\externalfilter::process_file[#1]}
- \setvalue{process#1buffer}{\dotripleargument\externalfilter::process_buffer[#1]}
- \setvalue{inline#1}{\dodoubleargument\externalfilter::inline[#1]}
-
-\stoptexdefinition
-
-\starttexdefinition externalfilter::start [#1][#2]
- % #1 = filter
- % #2 = options
- \egroup %\bgroup in \start#1
-
- \edef\externalfilter::name{#1}
-
- \begingroup % to keep assignments local
- \setupexternalfilter[#1][\c!name=,#2]
-
- \externalfilter::set_filenames
-
- % Capture the contents of the buffer
- \dostartbuffer[\externalfilter::temp_file][\e!start#1][\e!stop#1]
-\stoptexdefinition
-
-\starttexdefinition externalfilter::process_file [#1][#2]#3
- % #1 = filter
- % #2 = options
- % #3 = filename
- \begingroup
-
- \edef\externalfilter::name{#1}
- \setupexternalfilter[#1][\c!name=,#2]
-
- \externalfilter::set_directory
-
- \edef\externalfilter::input_file{#3}
- \splitfilename{#3}
- %NOTE: \edef doesn not work because \splitoffname is not expandable
- \def\externalfilter::base_file {\splitoffname}
-
- % The output is always in the directory specified by
- % \c!directory; even if the input is from some other directory
- \def\externalfilter::output_file{\externalfilter::get_directory\externalfilterparameter\c!output}
-
- \iftraceexternalfilters \externalfilter::show_filenames \fi
- \externalfilter::execute_filter
- \externalfilter::read_processed_file
-
- \endgroup
-\stoptexdefinition
-
-\starttexdefinition externalfilter::process_buffer [#1][#2][#3]
- % #1 = filter
- % #2 = options
- % #3 = buffer
- \begingroup
-
- \edef\externalfilter::name{#1}
- \ifthirdargument
- \setupexternalfilter[#1][\c!name=,#2]
- \fi
-
- \externalfilter::set_directory
-
- \ifthirdargument
- \edef\externalfilter::temp_file{#3}
- \else
- \edef\externalfilter::temp_file{#2}
- \fi
-
- \externalfilter::set_filenames_extras
- % In MkII, the above function sets the wrong value of
- % \type{\externalfilter::input_file}. So, we reset that name here.
- \doifmode\s!mkii
- {\edef\externalfilter::input_file {\externalfilter::base_file.\f!temporaryextension}}
-
- \iftraceexternalfilters \externalfilter::show_filenames \fi
-
- \externalfilter::process_filter
-
-\stoptexdefinition
-
-\starttexdefinition externalfilter::inline [#1][#2]
- \edef\externalfilter::name{#1}
-
- \begingroup % to keep assignments local
- \setupexternalfilter[#1][\c!numbering=,\c!name=,\c!before=,\c!after=,#2]
-
- \externalfilter::set_filenames
-
- \pushcatcodetable
- \futurelet\next\externalfilter::inline_aux
-\stoptexdefinition
-
-
-%D \subsubject {Catcode tables}
-%D
-%D Just to be sure, I define all catcode tables that are needed within the
-%D module. Some of these are repetition of what is defined in ConTeXt, but the
-%D internal names keep on changing which is a maintenance nightmare.
-
-\newcatcodetable \externalfilter::read_catcodes
-\newcatcodetable \externalfilter::minimal_catcodes
-\newcatcodetable \externalfilter::verb_catcodes
-
-\startcatcodetable \externalfilter::read_catcodes % same as typcatcodesa
- \catcode\tabasciicode = \othercatcode
- \catcode\endoflineasciicode = \othercatcode
- \catcode\formfeedasciicode = \othercatcode
- \catcode\spaceasciicode = \othercatcode
- \catcode\endoffileasciicode = \othercatcode
- \catcode\leftbraceasciicode = \begingroupcatcode
- \catcode\rightbraceasciicode = \endgroupcatcode
-\stopcatcodetable
-
-\startcatcodetable \externalfilter::minimal_catcodes
- \catcode\backslashasciicode = \escapecatcode
- \catcode\leftbraceasciicode = \begingroupcatcode
- \catcode\rightbraceasciicode = \endgroupcatcode
- \catcode\endoflineasciicode = \activecatcode
- \catcode\formfeedasciicode = \activecatcode
- \catcode\spaceasciicode = \activecatcode
-\stopcatcodetable
-
-\startcatcodetable \externalfilter::verb_catcodes % same as vrbcatcodes
- \catcode\tabasciicode = \othercatcode
- \catcode\endoflineasciicode = \othercatcode
- \catcode\formfeedasciicode = \othercatcode
- \catcode\spaceasciicode = \othercatcode
- \catcode\endoffileasciicode = \othercatcode
-\stopcatcodetable
-
-%D \subsubject {Write argument to file verbatim}
-%D
-%D Surprisingly, there is nothing in the core to define a function that write its
-%D argument to a file verbatim. I basically copied the \type{\type} macro.
-
-\starttexdefinition externalfilter::inline_aux
- \ifx\next\bgroup
- \expandafter\externalfilter::inline_group
- \else
- \expandafter\externalfilter::inline_other
- \fi
-\stoptexdefinition
-
-\starttexdefinition externalfilter::inline_group
- \setcatcodetable \externalfilter::read_catcodes
- \externalfilter::process_inline
-\stoptexdefinition
-
-\starttexdefinition externalfilter::inline_other #1
- \setcatcodetable \externalfilter::verb_catcodes
-
- \def\next##1#1{\externalfilter::process_inline{##1}}
- \next
-\stoptexdefinition
-
-\newwrite\externalfilter::write
-
-\starttexdefinition externalfilter::process_inline #1
- \immediate\openout \externalfilter::write\externalfilter::input_file
- \immediate\write \externalfilter::write{\detokenize{#1}}
- \immediate\closeout\externalfilter::write
-
- \popcatcodetable
-
- \externalfilter::execute_filter
- \endlinechar\minusone %to prevent line break after reading file
- \externalfilter::read_processed_file
-
- % Finalization
- \doif{\externalfilterparameter\c!continue}\v!yes
- {\doglobal\expandafter\increment\csname\externalfilter::count\endcsname}
- \endgroup
-\stoptexdefinition
-
-
-%D \section {Helper Functions}
-%D
-%D \subsubject {First and last character of a string}
-
-\def\externalfilter::get_first_character#1%
- {\externalfilter::get_first_character_aux#1\relax}
-
-\def\externalfilter::get_first_character_aux#1#2\relax{#1}
-
-\def\externalfilter::get_last_character#1%
- {\@EA\externalfilter::get_last_character_aux#1\relax}
-
-\def\externalfilter::get_last_character_aux#1#2%
- {\ifx#2\relax#1\else\@EA\externalfilter::get_last_character_aux\@EA#2\fi}
-
-%D \subsubject {Setting font and color attributes}
-
-
-\starttexdefinition externalfilter::attributes_start #1#2#3
- % id style color
- \edef\externalfilter::attributes_style{\getvalue{#1parameter}{#2}}
- \edef\externalfilter::attributes_color{\getvalue{#1parameter}{#3}}
-
- \expandafter\startcolor\expandafter[\externalfilter::attributes_color]
- \expandafter\doconvertfont{\externalfilter::attributes_style}
-\stoptexdefinition
-
-\def\externalfilter::attributes_stop{\stopcolor}
-
-%D \subsubject {Set the name of output directory}
-
-\starttexdefinition externalfilter::set_directory
- \edef\externalfilter::get_directory{\externalfilterparameter\c!directory}
- \doifsomething{\externalfilter::get_directory}\externalfilter::set_directory_aux
-\stoptexdefinition
-
-\starttexdefinition externalfilter::set_directory_aux
- \doif{\externalfilter::get_first_character\externalfilter::get_directory}{/}
- {\writeline
- \showmessage\m!externalfilter{forbidden}\externalfilter::get_directory
- \batchmode
- \errmessage{}
- \normalend}
-
- \doifnot{\externalfilter::get_last_character\externalfilter::get_directory}{/}
- {\showmessage\m!externalfilter{slash}\externalfilter::get_directory
- \edef\externalfilter::get_directory{\externalfilter::get_directory/}}
-\stoptexdefinition
-
-
-
-%D \subsubject {Set file names}
-%D
-%D \type{\externalfilter::base_file} is the name of the temporary file without
-%D extension. Its actual value depends on the state of \type{continue} key as
-%D well as the value of \type{name} key.
-
-\starttexdefinition externalfilter::set_filenames
- \externalfilter::set_directory
-
- % Set the name of temp file for the filter
- \doifelse{\externalfilterparameter\c!continue}\v!yes
- {\edef\externalfilter::temp_file{\externalfilter::temp_prefix-\externalfilter::name-\csname\externalfilter::count\endcsname}}
- {\edef\externalfilter::temp_file{\externalfilter::temp_prefix-\externalfilter::name}}
- \doifsomething{\externalfilterparameter\c!name}
- {\edef\externalfilter::temp_file{\externalfilter::temp_prefix-\externalfilter::name-\externalfilterparameter\c!name}}
-
-
- \externalfilter::set_filenames_extras
-
- \iftraceexternalfilters \externalfilter::show_filenames \fi
-\stoptexdefinition
-
-\starttexdefinition externalfilter::set_filenames_extras
- % The following macros are useful for filter= and filtercommand= options
- % The basename of the external file
- \edef\externalfilter::base_file {\jobname-\externalfilter::temp_file}
-
- % In MkII, the buffer output is written to \TEXbufferfile{buffername} where
- % the macro \TEXbufferfile is defined as
- %
- % \def\TEXbufferfile #1{\bufferprefix#1.\f!temporaryextension}
- %
- % We redefine bufferprefix to include the directory name.
- \doifmode{\s!mkii}
- {\edef\bufferprefix{\externalfilter::get_directory\jobname-}}
-
- % In MkIV, we do not need to do such jugglary, because we can specify the
- % name of the file where the buffer has to be saved. This file is
- % \externalfilter::input_file (because it is the input to the filter).
- \edef\externalfilter::input_file {\externalfilter::get_directory\externalfilter::base_file.\f!temporaryextension}
-
- % Append directory name to the name of the output file
- \edef\externalfilter::output_file{\externalfilter::get_directory\externalfilterparameter\c!output}
-\stoptexdefinition
-
-
-
-%D \subsubject {Process Filter}
-%D
-%D Execute filter, read the output and do book-keeping if needed.
-
-\starttexdefinition externalfilter::process_filter
- % By defualt, buffers are in memory in MkIV. So, we save them to disk
- % To imitate the behavior of MkII, we need
- %
- % \doifmode\s!mkiv{\savebuffer[\externalfilter::temp_file][\externalfilter::input_file]}
- %
- % However, in MkIV, we can save a list of buffers to a file. The empty
- % elements of the list are ignored. So, instead we use the following
- %\doifmode\s!mkiv
- %{\savebuffer[\externalfilterparameter{\c!buffer\c!before},\externalfilter::temp_file,\externalfilterparameter{\c!buffer\c!after}]
- % [\externalfilter::input_file]}
- \startmode[\s!mkiv]
- \savebuffer[\externalfilterparameter{\c!buffer\c!before},
- \externalfilter::temp_file,
- \externalfilterparameter{\c!buffer\c!after}]
- [\externalfilter::id]
- \startluacode
- %% -- On Windows, os.rename does not overwrite files :(
- file.copy("\jobname-\externalfilter::id.\f!temporaryextension", "\externalfilter::input_file")
- \stopluacode
- \stopmode
-
-
- \externalfilter::execute_filter
- \externalfilter::read_processed_file
- \endgroup
-
- % Finalization
- \doif{\externalfilterparameter\c!continue}\v!yes
- {\doglobal\expandafter\increment\csname\externalfilter::count\endcsname}
-
- \expanded{\checknextindentation[\externalfilterparameter\c!indentnext]}
- \dorechecknextindentation
-\stoptexdefinition
-
-%D \subsubject {Execute Filter}
-
-\starttexdefinition externalfilter::execute_filter_mkii
-
- \processcommacommand[\externalfilterparameter{\c!filter\c!setups}]\directsetup
- \externalfilter::show_filtercommand
-
- \doifelse{\externalfilterparameter\c!continue}\v!yes
- {\doifelse{\externalfilterparameter\c!state}\v!stop
- {\showmessage\m!externalfilter{reuse}\externalfilter::input_file}
- {\doifmode{*first}
- {\doifmodeelse{force}
- {\showmessage\m!externalfilter{force}
- \executesystemcommand
- {mtxrun --direct \externalfilterparameter\c!filtercommand}}
- {\executesystemcommand
- {mtxrun --ifchanged=\externalfilter::input_file\space
- --direct \externalfilterparameter\c!filtercommand}}}}}
- {\executesystemcommand
- {\externalfilterparameter\c!filtercommand}}
-\stoptexdefinition
-
-% In MkIV, we use job.files.run to check if a file has changed. This function
-% writes the md5 sum to the tuc file rather than to an external file. So, we
-% must not check for the \type{*first} mode (otherwise the md5 sum is overridden
-% in the next run.
-\starttexdefinition externalfilter::execute_filter_mkiv
-
- \processcommacommand[\externalfilterparameter{\c!filter\c!setups}]\directsetup
- \externalfilter::show_filtercommand
-
- \doifelse{\externalfilterparameter\c!continue}\v!yes
- {\doifelse{\externalfilterparameter\c!state}\v!stop
- {\showmessage\m!externalfilter{reuse}\externalfilter::input_file}
- {\doifmodeelse{force}
- {\showmessage\m!externalfilter{force}
- \executesystemcommand
- {\externalfilterparameter\c!filtercommand}}
- {\ctxlua{job.files.run(\!!bs\externalfilter::input_file\!!es,
- \!!bs\externalfilterparameter\c!filtercommand\!!es)}}}}
- {\executesystemcommand
- {\externalfilterparameter\c!filtercommand}}
-\stoptexdefinition
-
-\doifmodeelse\s!mkiv
- {\let\externalfilter::execute_filter\externalfilter::execute_filter_mkiv}
- {\let\externalfilter::execute_filter\externalfilter::execute_filter_mkii}
-
-%D \subsubject {Read output}
-
-\starttexdefinition externalfilter::read_processed_file
- \doif{\externalfilterparameter\c!read}\v!yes
- {\doiffileelse{\externalfilter::output_file}
- {\externalfilter::read_processed_file_aux}
- {\showmessage\m!externalfilter{notfound}\externalfilter::output_file
- \externalfilter::show_filenames
- \blank
- {\tttf [[\getmessage\m!externalfilter{missing}]]}
- \blank}}
-\stoptexdefinition
-
-\starttexdefinition externalfilter::read_processed_file_aux
- \externalfilterparameter\c!before
-
- \begingroup
- \externalfilter::attributes_start \externalfilter::id \c!style \c!color
- \processcommacommand[\externalfilterparameter\c!setups]\directsetup
- \externalfilterparameter\c!readcommand\externalfilter::output_file
- \externalfilter::attributes_stop
- \endgroup
-
- \externalfilterparameter\c!after
-\stoptexdefinition
-
-%D \section {Default Values}
-
-\setupexternalfilters
- [
- \c!before=,
- \c!after=,
- \c!style=,
- \c!color=,
- \c!indentnext=\v!auto,
- \c!setups=,
- \c!continue=\v!no,
- \c!read=\v!yes,
- \c!readcommand=\ReadFile,
- \c!directory=,
- \c!output=\externalfilterbasefile.tex,
- \c!filter=,
- \c!filtercommand={\externalfilterparameter\c!filter\space \externalfilter::input_file},
- \c!buffer\c!before=,
- \c!buffer\c!after=,
- ]
-
-\doifmodeelse{reuse}
- {\setupexternalfilters[state=stop]}
- {\setupexternalfilters[state=start]}
-
-\def\externalfilterbasefile {\externalfilter::base_file}
-\def\externalfilterinputfile {\externalfilter::input_file}
-\def\externalfilteroutputfile{\externalfilter::output_file}
-\def\currentexternalfilter {\externalfilter::name}
-
-% Default value
-\def\externalfilter::input_file {}
-\def\externalfilter::output_file{}
-
-\protectmodulecatcodes
-\stopmodule
diff --git a/Master/texmf-dist/tex/context/third/filter/t-module-catcodes.tex b/Master/texmf-dist/tex/context/third/filter/t-module-catcodes.tex
index 8ca4962c806..052c9fca5b3 100644
--- a/Master/texmf-dist/tex/context/third/filter/t-module-catcodes.tex
+++ b/Master/texmf-dist/tex/context/third/filter/t-module-catcodes.tex
@@ -1,6 +1,6 @@
%D \module
%D [ file=t-module-catcodes,
-%D version=2011.09.03,
+%D version=2011.12.17,
%D title=\CONTEXT\ User Module,
%D subtitle=Module Catcodes,
%D author=Aditya Mahajan,
@@ -8,15 +8,18 @@
%D copyright=Aditya Mahajan,
%D email=adityam <at> ieee <dot> org,
%D license=Simplified BSD License]
+%D
+%D MkII and MkIV use different names and values for commonly used catcode
+%D tables. So, I define a private copy of the catcode tables that are needed
+%D by the filter and vim modules.
-\writestatus{loading}{Module Catcodes (ver: 2011.09.03)}
-\startmodule [module-catcodes]
-% EXPERIMENTAL: Catcode table for internal commands
+\writestatus{loading}{Module Catcodes (ver: 2011.12.17)}
-\newcatcodetable \modulecatcodes
+\startmodule [module-catcodes]
-\startcatcodetable \modulecatcodes
+\newcatcodetable \modulecatcodes
+\startcatcodetable \modulecatcodes % same as \prtcatcodes
\catcode\tabasciicode \spacecatcode
\catcode\endoflineasciicode \endoflinecatcode
\catcode\formfeedasciicode \endoflinecatcode
@@ -37,25 +40,8 @@
\catcode`\? \lettercatcode
\catcode\tildeasciicode \activecatcode
\catcode\barasciicode \activecatcode
- \catcode`\: \lettercatcode
\stopcatcodetable
-% IDEA:
-% Instead of using \externalfilter::command we can also define:
-%
-% \startmoduledefinition command #1
-% ...
-% \stopmoduledefinition
-%
-% which will be equivalent to
-%
-% \starttexdefinition externalfilter::command
-% ...
-% \stoptexdefinition
-%
-% and \modulevalue{command} => \getvalue{externalfilter::command}
-
-
\def\unprotectmodulecatcodes
{\pushcatcodetable
\setcatcodetable\modulecatcodes}
@@ -63,6 +49,43 @@
\def\protectmodulecatcodes
{\popcatcodetable}
+\unprotectmodulecatcodes
+
+%D The following catcode tables are used for reading
+%D and writing to files
+
+\newcatcodetable \externalfilter@read_catcodes
+\newcatcodetable \externalfilter@minimal_catcodes
+\newcatcodetable \externalfilter@verb_catcodes
+
+\startcatcodetable \externalfilter@read_catcodes % same as typcatcodesa
+ \catcode\tabasciicode = \othercatcode
+ \catcode\endoflineasciicode = \othercatcode
+ \catcode\formfeedasciicode = \othercatcode
+ \catcode\spaceasciicode = \othercatcode
+ \catcode\endoffileasciicode = \othercatcode
+ \catcode\leftbraceasciicode = \begingroupcatcode
+ \catcode\rightbraceasciicode = \endgroupcatcode
+\stopcatcodetable
+
+\startcatcodetable \externalfilter@minimal_catcodes % for reading t-vim output
+ \catcode\backslashasciicode = \escapecatcode
+ \catcode\leftbraceasciicode = \begingroupcatcode
+ \catcode\rightbraceasciicode = \endgroupcatcode
+ \catcode\endoflineasciicode = \activecatcode
+ \catcode\formfeedasciicode = \activecatcode
+ \catcode\spaceasciicode = \activecatcode
+\stopcatcodetable
+
+\startcatcodetable \externalfilter@verb_catcodes % same as vrbcatcodes
+ \catcode\tabasciicode = \othercatcode
+ \catcode\endoflineasciicode = \othercatcode
+ \catcode\formfeedasciicode = \othercatcode
+ \catcode\spaceasciicode = \othercatcode
+ \catcode\endoffileasciicode = \othercatcode
+\stopcatcodetable
+
+
\ifdefined \activeendoflinetoken \else
% from catc-ini.mkiv
@@ -74,4 +97,5 @@
\egroup
\fi
+\protectmodulecatcodes
\stopmodule