1if not modules then modules = { } end modules [ ' grph-mem ' ] = {
2 version = 1 . 001 ,
3 comment = " companion to grph-inc.mkiv " ,
4 author = " Hans Hagen, PRAGMA-ADE, Hasselt NL " ,
5 copyright = " PRAGMA ADE / ConTeXt Development Team " ,
6 license = " see context related readme files "
7}
8
9
10
11
12
13
14
15
16
17
18local gsub = string . gsub
19
20local report = logs . reporter ( " memstream " )
21local trace = false trackers . register ( " graphics.memstreams " , function ( v ) trace = v end )
22local data = { }
23
24local function setmemstream ( name , stream , once )
25 if once and data [ name ] then
26 if trace then
27 report ( " not overloading %a " , name )
28 end
29 return data [ name ]
30 end
31 local kind = figures . guessfromstring ( stream )
32 local identifier = false
33 if kind = = " pdf " then
34 identifier = pdfe . new ( stream , # stream , name )
35 if not identifier then
36 report ( " no valid pdf stream %a " , name )
37 elseif trace then
38 report ( " setting %a with identifier %a " , name , identifier )
39 end
40 else
41 identifier = " m_k_i_v_memstream_ " . . name . . " . " . . kind
42 io . savedata ( identifier , stream )
43 end
44 if not identifier then
45 identifier = " invalid-memstream "
46 end
47 data [ name ] = identifier
48 return identifier
49end
50
51resolvers . setmemstream = setmemstream
52
53function resolvers . finders . memstream ( specification )
54 local name = specification . path
55 local identifier = data [ name ]
56 if identifier then
57 if trace then
58 report ( " reusing %a with identifier %a " , name , identifier )
59 end
60 return identifier
61 end
62 local stream = io . loaddata ( name )
63 if stream and stream ~ = " " then
64 return setmemstream ( name , stream )
65 end
66 if trace then
67 report ( " no valid memstream %a " , name )
68 end
69 return resolvers . finders . notfound ( )
70end
71
72local flush = { }
73
74function resolvers . resetmemstream ( name , afterpage )
75 if afterpage then
76 flush [ # flush + 1 ] = name
77 end
78end
79
80luatex . registerpageactions ( function ( )
81 if # flush > 0 then
82 for i = 1 , # flush do
83 local identifier = data [ name ]
84 if identifier then
85 os . remove ( identifier )
86 data [ name ] = nil
87 end
88 end
89 flush = { }
90 end
91end )
92
93figures . identifiers . list [ # figures . identifiers . list + 1 ] = function ( specification )
94 local name = specification . request . name
95 if name then
96 local base = gsub ( name , " ^memstream:/// " , " " )
97 if base ~ = name then
98 local identifier = data [ base ]
99 if identifier then
100 if trace then
101 report ( " requested %a has identifier %s " , name , identifier )
102 end
103 specification . status . status = 1
104 specification . used . fullname = name
105 else
106 if trace then
107 report ( " requested %a is not found " , name )
108 end
109 end
110 end
111 end
112end
113
114figures . setmemstream = resolvers . setmemstream
115 |