page-sel.lmt /size: 2459 b    last modification: 2024-01-16 10:22
1if not modules then modules = { } end modules ['page-sel'] = {
2    version   = 1.001,
3    comment   = "companion to page-sel.mkxl",
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--- maybe more will end up here
10
11local addsuffix = file.addsuffix
12local context = context
13
14do
15
16    local sections = { }
17
18    local function sectionpage(filename,reference,what)
19        local filedata = sections[filename]
20        if not filedata then
21            filedata = {
22                data = job.loadother(filename,"tuc") or false,
23                list = { }
24            }
25            sections[filename] = filedata
26        end
27        local list  = filedata.list
28        local entry = list[reference]
29        if not entry then
30            local first = 0
31            local last  = 0
32            local data  = filedata.data
33            if data then
34                local lists = data.structures.lists.collected
35                local pages = data.structures.pages.collected
36                if lists and pages then
37                    for i=1,#lists do
38                        local li = lists[i]
39                        if li.references.reference == reference then
40                            local level = li.metadata.level
41                            first = li.references.realpage
42                            last  = pages[#pages].number
43                            for j=i+1,#lists do
44                                local lj = lists[j]
45                                if lj.metadata.level == level then
46                                    last = lj.references.realpage - 1
47                                    break
48                                end
49                            end
50                        end
51                    end
52                end
53            end
54            entry = {
55                first = first,
56                last  = last,
57            }
58            list[reference] = entry
59        end
60        context(what and entry.first or entry.last)
61    end
62
63    interfaces.implement {
64        name      = "firstsectionpage",
65        public    = true,
66        arguments = { "optional", "optional", true },
67        actions   = sectionpage
68    }
69
70    interfaces.implement {
71        name      = "lastsectionpage",
72        public    = true,
73        arguments = { "optional", "optional", false },
74        actions   = sectionpage
75    }
76
77end
78