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