Overview
Comment: | ref now recurses into parents properly |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
47905a08e6a0a0a6e1b45f17e3ecf39b |
User & Date: | lexi on 2022-09-09 23:22:07 |
Other Links: | manifest | tags |
Context
2022-09-10
| ||
01:02 | add path class; add URI support for HTML link output check-in: 8c11f3b669 user: lexi tags: trunk | |
2022-09-09
| ||
23:22 | ref now recurses into parents properly check-in: 47905a08e6 user: lexi tags: trunk | |
22:02 | update docs check-in: 35f8445017 user: lexi tags: trunk | |
Changes
Modified cortav.lua from [454581060f] to [00eceed9de].
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 .... 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 .... 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 |
self:fail('template instantiation requires at least %u arguments (in ID “%s”)',n,id) end return arg else return sp end end) end if not id:find'%.' then local rid = self.sec.refs[id] if rid then return rid, id, self.sec end --nothing in the current section, but this ID could be looked up in the context of a macro expansion. if so, check section of the site of invocation as well if self.invocation then rid = self.invocation.origin:ref(id) if rid then return rid, id, self.invocation.origin.sec end end self:fail("no such ref %s in current section", id or '') else local sec, ref = string.match(id, "(.-)%.(.+)") local s if sec == '' then if self.invocation == nil then self:fail('site-of-invocation IDs can only be dereferenced in a macro expansion (offending ID: “%s”)', id) end s = self.invocation.origin.sec end s = s or self.doc.sections[sec] if not s then -- fall back on inheritance tree for i, p in ipairs(self.doc.parents) do if p.sections[sec] then s = p.sections[sec] break end end end if s then if s.refs[ref] then return s.refs[ref], ref, sec else self:fail("no such ref %s in section %s", ref, sec) end else self:fail("no such section %s", sec) end end end }; } ct.sec = declare { ident = 'section'; mk = function() return { ................................................................................ origin = c:clone(); } table.insert(c.sec.blocks, tbl) j:hook('block_table_insert', c, tbl, l) j:hook('block_table_row_insert', c, tbl, tbl.rows[1], l) end end ct.ctlseqs = { {seq = '.', fn = insert_paragraph}; {seq = '¶', fn = insert_paragraph}; {seq = '❡', fn = insert_paragraph}; {seq = '#', fn = insert_section}; {seq = '§', fn = insert_section}; ................................................................................ })[c] ~= true then return false end end return true end end; fn = blockwrap(function() return { kind = 'horiz-rule' } end)}; {seq='@', fn=function(s,c,j,d) local function mirror(b) local ch = {} local rev = { ['['] = ']'; [']'] = '['; ['{'] = '}'; ['}'] = '{'; ['('] = ')'; [')'] = '('; |
> > | | | | | < < | | < < < < | | | > > > > | | < | < | < < > > | > > | < < | > > > > | | < > > > > > > > > > > > | | < < | > > > > > > > > > > > > > > > > > > > > > > > > > |
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 .... 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 .... 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 |
self:fail('template instantiation requires at least %u arguments (in ID “%s”)',n,id) end return arg else return sp end end) end local function checkFromSec(sec,doc) if sec and not id:find'%.' then local rid = sec.refs[id] if rid then return rid, id, sec end if doc.sections[rid] then return nil, id, doc.sections[rid] end else local secid, ref = string.match(id, "(.-)%.(.+)") local s s = s or doc.sections[secid] if s then if s.refs[ref] then return s.refs[ref], ref, s end end end end local function scanParents(doc) for i, p in ipairs(doc.parents) do -- TODO figure out a way to ref the embedding section local o,i,s = checkFromSec(nil, p) if o or s then return o,i,s end end -- breadth-first search for i, p in ipairs(doc.parents) do local o,i,s = scanParents(p) if o or s then return o,i,s end end end local o,i,s = checkFromSec(self.sec, self.doc) if o or s then return o,i,s end --nothing in the current section, but this ID could be looked up in the context of a macro expansion. if so, check section of the site of invocation as well if self.invocation then local dp = id:find'%.' if dp == 1 then local s = self.invocation.origin.sec local ref = id:sub(2) if s and s.refs[ref] then return s.refs[ref], ref, s end elseif not dp then rid = self.invocation.origin:ref(id) if rid then return rid, id, self.invocation.origin.sec end end end o,i,s = scanParents(doc) if o or s then return o,i,s end self:fail("ID “%s” does not name an object or section", id) end }; } ct.sec = declare { ident = 'section'; mk = function() return { ................................................................................ origin = c:clone(); } table.insert(c.sec.blocks, tbl) j:hook('block_table_insert', c, tbl, l) j:hook('block_table_row_insert', c, tbl, tbl.rows[1], l) end end local function insert_link_block(seq) return blockwrap(function(s,c) local r = s:sub(#seq):gsub('^%s+','') -- chomp local uri, txt = r:match('^([^%s]*)%s*(.*)$') return { uri = ss.uri(uri); label = ct.parse_span(txt, c); } end) end ct.ctlseqs = { {seq = '.', fn = insert_paragraph}; {seq = '¶', fn = insert_paragraph}; {seq = '❡', fn = insert_paragraph}; {seq = '#', fn = insert_section}; {seq = '§', fn = insert_section}; ................................................................................ })[c] ~= true then return false end end return true end end; fn = blockwrap(function() return { kind = 'horiz-rule' } end)}; {seq='=>', fn = insert_link_block '=>'}; {seq='⇒', fn = insert_link_block '⇒'}; {seq='@', fn=function(s,c,j,d) local function mirror(b) local ch = {} local rev = { ['['] = ']'; [']'] = '['; ['{'] = '}'; ['}'] = '{'; ['('] = ')'; [')'] = '('; |
Modified render/html.lua from [84a861628f] to [f159ef53c2].
613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 |
function span_renderers.raw(v,b,s)
return htmlSpan(v.spans, b, s)
end
function span_renderers.link(sp,b,s)
local href
if b.origin.doc.sections[sp.ref] then
href = '#' .. sp.ref
else
if sp.addr then href = sp.addr else
local r = b.origin:ref(sp.ref)
if type(r) == 'table' then
href = '#' .. getSafeID(r)
else href = r end
end
|
| |
613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 |
function span_renderers.raw(v,b,s)
return htmlSpan(v.spans, b, s)
end
function span_renderers.link(sp,b,s)
local href
if b.origin.doc.sections[sp.ref] then
href = '#' .. getSafeID(sp)
else
if sp.addr then href = sp.addr else
local r = b.origin:ref(sp.ref)
if type(r) == 'table' then
href = '#' .. getSafeID(r)
else href = r end
end
|