1if not modules then modules = { } end modules [ ' data-con ' ] = {
2 version = 1 . 100 ,
3 comment = " companion to luat-lib.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
9local setmetatable = setmetatable
10local format , lower , gsub = string . format , string . lower , string . gsub
11
12local trace_cache = false trackers . register ( " resolvers.cache " , function ( v ) trace_cache = v end )
13local trace_containers = false trackers . register ( " resolvers.containers " , function ( v ) trace_containers = v end )
14local trace_storage = false trackers . register ( " resolvers.storage " , function ( v ) trace_storage = v end )
15
16
29
30containers = containers or { }
31local containers = containers
32containers . usecache = true
33
34local getwritablepath = caches . getwritablepath
35local getreadablepaths = caches . getreadablepaths
36local cacheiswritable = caches . is_writable
37local loaddatafromcache = caches . loaddata
38local savedataincache = caches . savedata
39
40local report_containers = logs . reporter ( " resolvers " , " containers " )
41
42local allocated = { }
43
44local mt = {
45 __index = function ( t , k )
46 if k = = " writable " then
47 local writable = getwritablepath ( t . category , t . subcategory ) or { " . " }
48 t . writable = writable
49 return writable
50 elseif k = = " readables " then
51 local readables = getreadablepaths ( t . category , t . subcategory ) or { " . " }
52 t . readables = readables
53 return readables
54 end
55 end ,
56 __storage__ = true
57}
58
59function containers . define ( category , subcategory , version , enabled )
60 if category and subcategory then
61 local c = allocated [ category ]
62 if not c then
63 c = { }
64 allocated [ category ] = c
65 end
66 local s = c [ subcategory ]
67 if not s then
68 s = {
69 category = category ,
70 subcategory = subcategory ,
71 storage = { } ,
72 enabled = enabled ,
73 version = version or math . pi ,
74 trace = false ,
75
76
77 }
78 setmetatable ( s , mt )
79 c [ subcategory ] = s
80 end
81 return s
82 end
83end
84
85function containers . is_usable ( container , name )
86 return container . enabled and caches and cacheiswritable ( container . writable , name )
87end
88
89function containers . is_valid ( container , name )
90 if name and name ~ = " " then
91 local storage = container . storage [ name ]
92 return storage and storage . cache_version = = container . version
93 else
94 return false
95 end
96end
97
98function containers . read ( container , name )
99 local storage = container . storage
100 local stored = storage [ name ]
101 if not stored and container . enabled and caches and containers . usecache then
102 stored = loaddatafromcache ( container . readables , name , container . writable )
103 if stored and stored . cache_version = = container . version then
104 if trace_cache or trace_containers then
105 report_containers ( " action %a, category %a, name %a " , " load " , container . subcategory , name )
106 end
107 else
108 stored = nil
109 end
110 storage [ name ] = stored
111 elseif stored then
112 if trace_cache or trace_containers then
113 report_containers ( " action %a, category %a, name %a " , " reuse " , container . subcategory , name )
114 end
115 end
116 return stored
117end
118
119function containers . write ( container , name , data , fast )
120 if data then
121 data . cache_version = container . version
122 if container . enabled and caches then
123 local unique = data . unique
124 local shared = data . shared
125 data . unique = nil
126 data . shared = nil
127 savedataincache ( container . writable , name , data , fast )
128 if trace_cache or trace_containers then
129 report_containers ( " action %a, category %a, name %a " , " save " , container . subcategory , name )
130 end
131 data . unique = unique
132 data . shared = shared
133 end
134 if trace_cache or trace_containers then
135 report_containers ( " action %a, category %a, name %a " , " store " , container . subcategory , name )
136 end
137 container . storage [ name ] = data
138 end
139 return data
140end
141
142function containers . content ( container , name )
143 return container . storage [ name ]
144end
145
146function containers . cleanname ( name )
147
148 return ( gsub ( lower ( name ) , " [^%w\128-\255]+ " , " - " ) )
149end
150 |