java-imp-fields.mkiv /size: 16 Kb    last modification: 2025-02-21 11:03
1%D \module
2%D   [       file=java-imp-fields, % was java-fld
3%D        version=1998.05.20,
4%D          title=\CONTEXT\ JavaScript Macros,
5%D       subtitle=Field Support,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14%D In \LUATEX\ the following does not work out well:
15%D
16%D \starttyping
17%D v = v.replace(/\\\\"e/g,"\\353") ;
18%D \stoptyping
19%D
20%D But this does:
21%D
22%D \starttyping
23%D v = String(v).replace(/\\\\"e/g,"\\353") ;
24%D \stoptyping
25%D
26%D Probably a \UNICODE\ issue. Beware, in \MKIV\ we have a
27%D different escaping of \type {\\}.
28%D
29%D Watch out: cf. the latest pdf specification we've changed On into Yes. Also,
30%D we've changed the test for the on value into !Off as we dón't know what value it
31%D gets in the reader.
32
33% Is this still okay? We can have unicode now, can't we? Anyway it's kind of
34% messy and unneeded in these unicode times.
35
36\startluasetups javascript:pdfencoding
37    local ctx_verbatim = context.verbatim
38    local utfbyte      = utf.byte
39    local sortedhash   = table.sortedhash
40
41    ctx_verbatim("{\n")
42    for accent, group in sortedhash(characters.tex.accentmapping) do
43        for character, mapping in sortedhash(group) do
44            local character = character == "" and " " or character
45            if accent == '"' then
46                ctx_verbatim("    '\\\\%s%s' : '\\u%04X',\n",accent,character,utfbyte(mapping))
47            else
48                ctx_verbatim('    "\\\\%s%s" : "\\u%04X",\n',accent,character,utfbyte(mapping))
49            end
50        end
51    end
52    for command, mapping in sortedhash(characters.tex.commandmapping) do
53        ctx_verbatim('    "\\\\%s" : "\\u%04X",\n',command,utfbyte(mapping))
54    end
55 -- ctx_verbatim("    '\\\\<<' : '\\u00AB',\n")
56 -- ctx_verbatim("    '\\\\>>' : '\\u00BB',\n")
57    ctx_verbatim("}\n")
58
59\stopluasetups
60
61% maybe make { } tex braces in javascript code so that we can call lua
62
63\def\JavaScriptTeXAccentMapping{\luasetup{javascript:pdfencoding}}
64
65\startJSpreamble SanitizeTeXInput used later
66
67var TeXAccentMapping = \JavaScriptTeXAccentMapping
68
69function TeX_Replacer(original,str) {
70    return (TeXAccentMapping[str] || str) ;
71}
72
73function Sanitized_TeX_String(value) {
74    return (value.replace(/(\\..)/g, TeX_Replacer)) ;
75}
76
77var TeX_Key_Mode = 0 ;
78var TeX_Key_Char = "" ;
79
80function Initialize_TeX_Keystroke() {
81    TeX_Key_Char = "" ;
82    TeX_Key_Mode = 0 ;
83}
84
85function Sanitized_TeX_Keystroke(change) {
86    if (!event.willCommit) {
87    if (change=="\\") {
88        TeX_Key_Mode = 1 ;
89        return ("")
90    } else if (TeX_Key_Mode == 1) {
91        TeX_Key_Mode = 2 ;
92        TeX_Key_Char = change ;
93        return ("")
94    } else if (TeX_Key_Mode == 2) {
95        TeX_Key_Mode = 0 ;
96        TeX_Key_Char = "\\"+TeX_Key_Char+change ;
97        return (Sanitized_TeX_String(TeX_Key_Char))
98    } else {
99        TeX_Key_Mode = 0 ;
100        return (change)
101    }
102    }
103}
104
105function Initialize_TeX_Key() {
106    Initialize_TeX_Keystroke() ;
107}
108
109function Convert_TeX_Key() {
110    if (!event.willCommit) {
111        event.change = Sanitized_TeX_Keystroke(event.change) ;
112    }
113}
114
115function Convert_TeX_String() {
116    event.value = Sanitized_TeX_String(event.value) ;
117}
118
119\stopJSpreamble
120
121% \startJScode {Initialize_TeX_Key} uses {SanitizeTeXInput}
122%     Initialize_TeX_Keystroke() ;
123% \stopJScode
124%
125% \startJScode {Convert_TeX_Key} uses {SanitizeTeXInput}
126%     if (!event.willCommit) {
127%         event.change = Sanitized_TeX_Keystroke(event.change) ;
128%     }
129% \stopJScode
130%
131% \startJScode{Convert_TeX_String} uses {SanitizeTeXInput}
132%     event.value = Sanitized_TeX_String(event.value) ;
133% \stopJScode
134
135% was used now but we autocheck anyway so lets test this for a while
136
137\startJSpreamble FieldsStates used later
138
139var visible_field  = new Array() ;
140var visible_fields = 0 ;
141
142function PresetFields() {
143    this.syncAnnotScan() ;
144}
145
146function Preset_Fields() {
147    this.syncAnnotScan() ;
148}
149
150function Hide_When_Down() {
151    event.target.hidden = true ;
152}
153
154function Hide_Field(Name) {
155    var v = this.getField(Name) ;
156    if (v) {
157        v.hidden = true ;
158        v.readonly = true ;
159        this.dirty = false ;
160    }
161}
162
163function Do_Vide_Field(Name, Closable) {
164    var v = this.getField(Name) ;
165    if (v) {
166        ++visible_fields ;
167        visible_field[visible_fields] = Name ;
168        v.hidden = false ;
169        if (Closable) {
170            v.readonly = false ;
171            v.value = "Yes" ;
172        }
173        this.dirty = false ;
174    }
175}
176
177function Vide_Field(Name) {
178    Do_Vide_Field(Name,false) ;
179}
180
181function Vide_Hide_Field(Name) {
182    Do_Vide_Field(Name,true) ;
183}
184
185function Hide_Fields() {
186    while (visible_fields>0) {
187        Hide_Field(visible_field[visible_fields]) ;
188        --visible_fields ;
189    }
190}
191
192function Vide_Fields(Name) {
193    Hide_Fields() ;
194    Vide_Field(Name) ;
195}
196
197function Vide_Hide_Fields(Name) {
198    Hide_Fields() ;
199    Vide_Hide_Field(Name) ;
200}
201
202function Toggle_Hide(Name) {
203    var v = this.getField(Name) ;
204    if (v) {
205        v.hidden = !v.hidden ;
206        this.dirty = false ;
207    }
208}
209
210function Field_On(Name) {
211    v = this.getField(Name) ;
212    if (v) {
213        v.value = "Yes" ;
214        this.dirty = false ;
215    }
216}
217
218function Field_Off(Name) {
219    var v = this.getField(Name) ;
220    if (v) {
221        v.value = "Off" ;
222        this.dirty = false ;
223    }
224}
225
226function Toggle_Value(Name) {
227    var v = this.getField(Name) ;
228    if (v) {
229        if (v.value != "Off") {
230            v.value = "Off" ;
231        } else {
232            v.value = "Yes" ;
233        }
234    }
235    this.dirty = false ;
236}
237
238function Toggle_Read(Name) {
239    var v = this.getField(Name);
240    if (v) {
241        v.readonly = !v.readonly ;
242    }
243}
244
245function Flip_Fields(Name) {
246    var Names = Name.split(",") ;
247    for (var i=0; i < Names.length; i++) {
248        v = this.getField(Names[i]) ;
249        if (v) {
250            v.hidden = !v.hidden ;
251            v.value = "Yes" ;
252        }
253    }
254}
255
256function Forget_Changes() {
257    this.dirty = false ;
258}
259
260function ForgetChanges() {
261    this.dirty = false ;
262}
263
264function Step_Fields (Name, First, Last) {
265    for (var i = Number(First) ; i <= Number(Last) ; i++) {
266        var s = Name + ":" + i ;
267        var v = this.getField(s) ;
268        if (v) {
269            ++visible_fields ;
270            visible_field[visible_fields] = s ;
271            if (v.hidden) {
272                v.hidden   = false ;
273                this.dirty = false ;
274                return ;
275            }
276        }
277    }
278}
279\stopJSpreamble
280
281\definereference[VideFields]   [JS(Vide_Fields)]
282\definereference[HideFields]   [JS(Hide_Fields)]
283\definereference[ForgetChanges][JS(Forget_Changes)]
284\definereference[StepFields]   [JS(Step_Fields)]
285
286% This can be done more efficient, by keeping track of the
287% current top of the stack.
288
289\startJSpreamble FieldStack used later
290
291function Field_Name(FieldSet,i) {
292    return this.getField(FieldSet + ":" + i)
293}
294
295function Reset_Fields(FieldSet) {
296    var i = 1 ;
297    while (true) {
298        var v = Field_Name(FieldSet,i) ;
299        if (!v) {
300            break ;
301        } else {
302            v.value = "Off" ;
303        }
304        i++ ;
305    }
306    this.dirty = false ;
307}
308
309function Set_Fields(FieldSet) {
310    var i = 1 ;
311    while (true) {
312        var v = Field_Name(FieldSet,i) ;
313        if (!v) {
314            break ;
315        } else {
316            v.value = "Yes" ;
317        }
318        i++ ;
319    }
320    this.dirty = false ;
321}
322
323function Set_Field(FieldSet, FieldName) {
324    Reset_Fields(FieldSet) ;
325    var v = Field_Name(FieldSet,FieldName) ;
326    if (v) {
327        v.value = "Yes" ;
328        this.dirty = false ;
329    }
330}
331
332function Reset_Field(FieldSet, FieldName) {
333    Set_Fields(FieldSet) ;
334    var v = Field_Name(FieldSet,FieldName) ;
335    if (v) {
336        v.value = "Off" ;
337        this.dirty = false ;
338    }
339}
340
341function Walk_Field(FieldSet) {
342    var i = 1 ;
343    this.syncAnnotScan();
344    while (true) {
345        var v = Field_Name(FieldSet,i) ;
346        if (v) {
347            if (v.value != "Off") {
348                v.value = "Off" ;
349                v = Field_Name(FieldSet,i + 1) ;
350                if (! v) {
351                    v = Field_Name(FieldSet,1) ;
352                } else {
353                }
354                if (v) {
355                    v.value = "Yes" ;
356                }
357                break ;
358            }
359            i++ ;
360        } else {
361            v = Field_Name(FieldSet,1) ;
362            if (v) {
363                v.value = "Yes" ;
364            }
365            break ;
366        }
367    }
368    this.dirty = false ;
369}
370
371var FieldSets = new Array() ;
372
373function Do_Get_Check_Walk_Field(FieldSet) {
374    var f = FieldSets[FieldSet]
375    if (! f) {
376        f = new Array() ;
377        f.number = 0 ;
378        f.delay = 500 ;
379        f.paused = false ;
380        f.running = false ;
381        f.name = FieldSet ;
382        f.timeout = null ;
383        f.repeat = true ;
384        f.total = 0 ;
385        f.pauseset = new Array() ;
386        FieldSets[FieldSet] = f ;
387        for (var i=1; i>0; i++) {
388            var v = Field_Name(FieldSet,i) ;
389            if (! v) {
390                f.total = i - 1 ;
391                break ;
392            }
393        }
394        f.start = 0 ;
395        f.stop = f.total ;
396        f.pause = 0 ;
397    }
398    this.dirty = false ;
399    return f
400}
401
402function Do_Next_Auto_Walk_Field_Step(FieldSet,fieldset,n) {
403    var v = Field_Name(FieldSet,fieldset.number) ;
404    if (v) {
405        if (v.value != "Off") {
406            v.value = "Off" ;
407        }
408    }
409    v = Field_Name(FieldSet,n) ;
410    if (v) {
411        fieldset.number = n ;
412        v.value = "Yes" ;
413        if (fieldset.pauseset[n]) {
414       //     fieldset.pause = n ;
415       //     Do_Stop_Auto_Walk_Field(Fieldset) ;
416                Do_Stop_Auto_Walk_Field(FieldSet) ;
417                fieldset.paused = true ;
418        }
419    }
420    this.dirty = false ;
421}
422
423function Do_Next_Auto_Walk_Field(FieldSet) {
424    var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
425    if (fieldset) {
426        if (fieldset.number >= fieldset.stop) {
427            if (fieldset.repeat == false) {
428                fieldset.running = false ;
429                Do_Stop_Auto_Walk_Field(fieldset) ;
430            } else {
431                Do_Next_Auto_Walk_Field_Step(FieldSet,fieldset,fieldset.start) ;
432            }
433        } else {
434            Do_Next_Auto_Walk_Field_Step(FieldSet,fieldset,fieldset.number+1) ;
435        }
436        this.dirty = false ;
437    }
438}
439
440function Do_Stop_Auto_Walk_Field(FieldSet) {
441    var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
442    if (fieldset) {
443        try {
444            app.clearInterval(fieldset.timeout) ;
445            app.clearTimeOut(fieldset.timeout) ;
446        } catch (e) {
447        }
448        this.dirty = false ;
449    }
450}
451
452function Do_Start_Auto_Walk_Field(FieldSet) {
453    var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
454    if (fieldset) {
455        Do_Stop_Auto_Walk_Field(FieldSet) ;
456        Do_Next_Auto_Walk_Field(FieldSet) ;
457        fieldset.timeout = app.setInterval("Do_Next_Auto_Walk_Field('"+FieldSet+"')", fieldset.delay) ;
458        this.dirty = false ;
459    }
460}
461
462function Start_Walk_Field(FieldSet, Delay) {
463    var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
464    if (fieldset) {
465        fieldset.number = 0 ;
466        if (Delay) {
467            fieldset.delay = Delay ;
468        }
469        Reset_Fields(FieldSet) ;
470        Do_Start_Auto_Walk_Field(FieldSet) ;
471        fieldset.running = true ;
472        fieldset.paused = false ;
473    }
474}
475
476function Pause_Walk_Field(FieldSet) {
477    var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
478    if (fieldset) {
479        if (fieldset.running) {
480            if (fieldset.paused) {
481                Do_Start_Auto_Walk_Field(FieldSet) ;
482                fieldset.paused = false ;
483            } else {
484                Do_Stop_Auto_Walk_Field(FieldSet) ;
485                fieldset.paused = true ;
486            }
487        }
488    }
489}
490
491function Start_Pause_Walk_Field(FieldSet, Delay, Option) {
492    var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
493    if (fieldset) {
494        if (Option == "once") {
495            fieldset.repeat = false ;
496        } else if (Option == "pause") {
497            fieldset.repeat = false ;
498        } else {
499            fieldset.repeat = true ;
500        }
501        if (Option == "pause") {
502            for (i=3; i<arguments.length; i++) {
503                fieldset.pauseset[parseInt(arguments[i])] = true ;
504            }
505            if (fieldset.pause == fieldset.stop) {
506                fieldset.start = 1 ;
507                fieldset.pause = 0 ;
508            } else if (fieldset.pause > 1) {
509                fieldset.start = fieldset.pause - 1 ;
510            } else {
511                fieldset.start = 1 ;
512            }
513            fieldset.stop = fieldset.total ;
514        } else {
515            var Start = arguments[3] ;
516            var Stop = arguments[4] ;
517            if (typeof Start == "string") {
518                fieldset.start = parseInt(Start) ;
519            } else if (typeof Start == "number") {
520                fieldset.start = Start ;
521            } else {
522                fieldset.start = 1 ;
523            }
524            if (typeof Stop == "string") {
525                fieldset.stop = parseInt(Stop) ;
526            } else if (typeof Stop == "number") {
527                fieldset.stop = Stop ;
528            } else {
529                fieldset.stop = fieldset.total ;
530            }
531            fieldset.pause = 0 ;
532        }
533        if (fieldset.running) {
534            if (fieldset.paused) {
535                Do_Start_Auto_Walk_Field(FieldSet) ;
536                fieldset.paused = false ;
537            } else {
538                Do_Stop_Auto_Walk_Field(FieldSet) ;
539                fieldset.paused = true ;
540            }
541        } else {
542            fieldset.number = fieldset.start - 1  ;
543            if (Delay) {
544                fieldset.delay = Delay ;
545            }
546            Reset_Fields(FieldSet) ;
547            Do_Start_Auto_Walk_Field(FieldSet) ;
548            fieldset.running = true ;
549            fieldset.paused = false ;
550        }
551    }
552}
553
554function Stop_Walk_Field(FieldSet) {
555    var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
556    if (fieldset) {
557        Do_Stop_Auto_Walk_Field(FieldSet) ;
558        fieldset.running = false ;
559        fieldset.paused = false ;
560    }
561}
562
563function Reset_Walk_Field(FieldSet) {
564    var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
565    if (fieldset) {
566        Do_Stop_Auto_Walk_Field(FieldSet) ;
567        fieldset.number = 0 ;
568        fieldset.running = false ;
569        fieldset.paused = false ;
570        Reset_Fields(FieldSet) ;
571    }
572}
573
574function Previous_Walk_Field(FieldSet) {
575    var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
576    if (fieldset) {
577        Do_Stop_Auto_Walk_Field(FieldSet) ;
578        fieldset.running = false ;
579        fieldset.paused = false ;
580        if (fieldset.number>0) {
581            var v = Field_Name(FieldSet,fieldset.number) ;
582            if (v) {
583                if (v.value != "Off") {
584                    v.value = "Off" ;
585                }
586            }
587            fieldset.number-- ;
588            v = Field_Name(FieldSet,fieldset.number) ;
589            if (v) {
590                v.value = "Yes" ;
591            }
592            this.dirty = false ;
593        }
594    }
595}
596
597function Next_Walk_Field(FieldSet) {
598    var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
599    if (fieldset) {
600        Do_Stop_Auto_Walk_Field(FieldSet) ;
601        fieldset.running = false ;
602        fieldset.paused = false ;
603        var f = fieldset.number + 1 ;
604        var v = Field_Name(FieldSet,f) ;
605        if (v) {
606            var v = Field_Name(FieldSet,fieldset.number) ;
607            if (v) {
608                if (v.value != "Off") {
609                    v.value = "Off" ;
610                }
611            }
612            fieldset.number++ ;
613            v = Field_Name(FieldSet,fieldset.number) ;
614            if (v) {
615                v.value = "Yes" ;
616            }
617            this.dirty = false ;
618        }
619    }
620}
621
622function Set_Walk_Field_Delay(FieldSet, Delay) {
623    var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
624    if (fieldset) {
625        if (Delay) {
626            fieldset.delay = Delay ;
627            if (fieldset.running) {
628                Do_Stop_Auto_Walk_Field(FieldSet) ;
629                Do_Start_Auto_Walk_Field(FieldSet) ;
630            }
631        }
632    }
633}
634
635\stopJSpreamble
636
637\definereference[Walk]        [JS(Walk_Field)]
638\definereference[StartWalk]   [JS(Start_Walk_Field)]
639\definereference[StopWalk]    [JS(Stop_Walk_Field)]
640\definereference[PauseWalk]   [JS(Pause_Walk_Field)]
641\definereference[ResetWalk]   [JS(Reset_Walk_Field)]
642\definereference[PreviousWalk][JS(Previous_Walk_Field)]
643\definereference[NextWalk]    [JS(Next_Walk_Field)]
644\definereference[SetWalkDelay][JS(Set_Walk_Field_Delay)]
645
646\endinput
647