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