summaryrefslogtreecommitdiff
path: root/tex/context/third/enigma/t-enigma.mkvi
blob: b5fea293a88e231262460033e3949e13de855e12 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
%D \module
%D   [     file=t-enigma.mkvi,
%D      version=2013-03-28 02:15:37+0100,
%D        title=\CONTEXT\ User Module,
%D     subtitle=Enigma,
%D       author=Philipp Gesang,
%D         date=\currentdate,
%D    copyright=Philipp Gesang,
%D      license=2-clause BSD,
%D        email={phg42 dot 2a at gmail dot com}]
%C This module is licensed under the conditions of the BSD license with
%C two clauses. There is a copy in a file named "COPYING" in the
%C t-enigma source tree.

\unprotect

\writestatus{loading} {ConTeXt module / Enigma Document Encryption}

\startinterface all
  \setinterfacevariable {enigma} {enigma}
\stopinterface

\definenamespace [\v!enigma] [
 \v!command=\v!no,
    comment=Enigma Document Encryption,
    \s!name=\v!enigma,
  \s!parent=\v!enigma,
      % setup=\v!list,
      setup=\v!no,
      style=\v!no,
       type=module,
    version=hg-tip,
]

%D Loading the \LUA\ conversion routines.

\startluacode
thirddata = thirddata or { }
\stopluacode
\registerctxluafile{enigma}

%D \startdocsection[title=Macro Generator]
%D \startparagraph
%D The main setup.\reference[listing:define]{} The
%D \texmacro{defineenigma} macro does not adhere to the reommended
%D practis of automatical macro derivation. Rather, we have our own
%D parser do the job of setting globals. This is a consequence of the
%D intention to offer the same behavior in any of the three main
%D formats, \PLAIN, \CONTEXT and \LATEX. Hence, we don’t rely on the
%D internal mechanisms but implement our own macro generator.
%D \stopparagraph

\def\enigma_define_indeed#id{%
  \edef\enigmaid{#id}%
  \expandafter\gdef\csname \e!start\enigmaid\endcsname{%
    \endgraf
    \bgroup
    \ctxlua{
      if thirddata.enigma.machines["#id"] then
        nodes.tasks.enableaction("processors",
                                 "thirddata.enigma.callbacks.#id")
      else
        print([[ENIGMA: No machine of that name: #id!]])
      end
    }%
  }%
  %
  \expandafter\gdef\csname \e!stop\enigmaid\endcsname{%
    \endgraf%% We need to force a paragraph here for the callback to be
            %% applied.
    \ctxlua{
      nodes.tasks.disableaction("processors",
                                "thirddata.enigma.callbacks.#id")
      thirddata.enigma.machines["#id"]:processed_chars()
    }%
    \egroup%
  }%
}

%D \startparagraph
%D The \texmacro{enigma_inherit}\reference[listing:inherit]{} is called
%D as an intermediate step when deriving one machine from an already
%D existing one. It gets the stored configuration of its ancestor,
%D relying on the \luafunction{retrieve_raw_args} function (see
%D \at{page}[listing:retrieve].
%D \stopparagraph
\def\enigma_inherit#to#from{%
  \ctxlua{%
    local enigma       = thirddata.enigma
    local current_args = enigma.retrieve_raw_args(\!!bs#from\!!es)
    enigma.save_raw_args(current_args, \!!bs#to\!!es)
    enigma.new_callback(enigma.new_machine(\!!bs#to\!!es),
                        \!!bs#to\!!es)
  }%
  \enigma_define_indeed{#to}%
}

\def\enigma_define[#id][#secondid]{%
  \ifsecondargument %% Copy an existing machine and callback.
    \enigma_inherit{#id}{#secondid}%
  \else             %% Create a new machine.
    \iffirstargument
      \enigma_define_indeed{#id}%
    \else
      \donothing
    \fi
  \fi
  \endgroup%
}

\def\defineenigma{%
  \begingroup
  \dodoubleempty\enigma_define
}

%D \stopdocsection

%D \startdocsection[title=Setup]
\def\enigma_setup_indeed#args{%
    \ctxlua{
      local enigma = thirddata.enigma
      local current_args =
        enigma.parse_args(\!!bs\detokenize{#args}\!!es)
      enigma.save_raw_args(current_args, \!!bs\currentenigmaid\!!es)
      enigma.new_callback(
        enigma.new_machine(\!!bs\currentenigmaid\!!es),
        \!!bs\currentenigmaid\!!es)
    }%
}

%D \startparagraph
%D The module setup \texmacro{setupenigma} expects key=value, notation.
%D All the logic is at the Lua end, not much to see here …
%D \stopparagraph

\def\enigma_setup[#id][#args]{%
  \ifsecondargument
    \edef\currentenigmaid{#id}
    \pushcatcodetable
    \catcodetable \txtcatcodes
      \enigma_setup_indeed{#args}%
  \else
    \donothing
  \fi
  \popcatcodetable
  \egroup%
}

\def\setupenigma{%
  \bgroup
  \dodoubleempty\enigma_setup%
}

%D \stopdocsection

\protect
% vim:ft=context:sw=2:ts=2:tw=71