cortav  Check-in [47905a08e6]

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: 47905a08e6a0a0a6e1b45f17e3ecf39bc73117fba64f6c7db187d16038987dd4
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