From 424d653e8d427f93d1c13b037f95db9e89936bba Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 18 Dec 2011 23:05:57 +0000 Subject: context-filter (18dec11) git-svn-id: svn://tug.org/texlive/trunk@24865 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/context/third/filter/t-filter.mkii | 445 +++++++++++++++++ .../tex/context/third/filter/t-filter.mkiv | 454 +++++++++++++++++ .../tex/context/third/filter/t-filter.tex | 537 --------------------- .../tex/context/third/filter/t-module-catcodes.tex | 70 ++- 4 files changed, 946 insertions(+), 560 deletions(-) create mode 100644 Master/texmf-dist/tex/context/third/filter/t-filter.mkii create mode 100644 Master/texmf-dist/tex/context/third/filter/t-filter.mkiv delete mode 100644 Master/texmf-dist/tex/context/third/filter/t-filter.tex (limited to 'Master/texmf-dist/tex/context') 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 ieee 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 ieee 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 ieee 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 ieee 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 -- cgit v1.2.3