55
56
57
58
59
60
61
62
63
64
65
66
67
68
..
98
99
100
101
102
103
104
105
106
107
108
109
110
111
...
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
...
761
762
763
764
765
766
767
768
769
770
771
772
773
774
...
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
....
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
....
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
|
li {
padding: 0.1em 0;
}
]];
list_ordered = [[]];
list_unordered = [[]];
footnote = [[
aside.footnote {
font-family: 90%;
grid-template-columns: 1em 1fr min-content;
grid-template-rows: 1fr min-content;
position: fixed;
padding: 1em;
background: @tone(0.03);
................................................................................
backdrop-filter: blur(0px);
}
aside.footnote:target ~ #cover {
opacity: 100%;
pointer-events: all;
backdrop-filter: blur(5px);
}
}
@media print {
aside.footnote {
display: grid;
position: relative;
}
aside.footnote:first-of-type {
................................................................................
}
}
aside.footnote > div.number {
text-align:right;
grid-row: 1/2;
grid-column: 1/2;
}
aside.footnote > div.text {
grid-row: 1/2;
grid-column: 2/4;
padding-left: 1em;
overflow-y: auto;
}
aside.footnote > div.text > p:first-child {
margin-top: 0;
}
]];
header = [[
body { padding: 0 2.5em !important }
h1,h2,h3,h4,h5,h6 { border-bottom: 1px solid @tone(0.7); }
h1 { font-size: 200%; border-bottom-style: double !important; border-bottom-width: 3px !important; margin: 0em -1em; }
................................................................................
end
function span_renderers.footnote(f,b,s)
local linkattr = {}
if opts.epub then
linkattr['epub:type'] = 'noteref'
else
addStyle 'footnote'
end
local source, sid, ssec = b.origin:ref(f.ref)
local cnc = getSafeID(ssec) .. ' ' .. sid
local fn
if footnotes[cnc] then
fn = footnotes[cnc]
else
................................................................................
table.insert(secnodes, block_renderers[bl.kind](bl,sec))
end
end
if next(secnodes) then
if doc.secorder[2] then --#secs>1?
-- only wrap in a section if >1 section
table.insert(ir, tag('section',
{id = getSafeID(sec)},
secnodes))
else
ir = secnodes
end
end
end
return ir
end
................................................................................
do local fnsorted = {}
for _, fn in pairs(footnotes) do
fnsorted[fn.num] = fn
end
for _, fn in ipairs(fnsorted) do
local tag = tagproc.toIR.tag
local body = {nodes={}}
local ftir = {}
for l in fn.source:gmatch('([^\n]*)') do
ct.parse_line(l, fn.origin, ftir)
end
renderBlocks(ftir,body)
local fattr = {id=fn.id}
if opts.epub then
---UUUUUUGHHH
local npfx = string.format('(%u) ', fn.num)
if next(body.nodes) then
local n = body.nodes[1]
repeat
................................................................................
else
n.nodes[1] = {tag='p',attrs={},nodes={npfx}}
break
end
until false
else
body.nodes[1] = {tag='p',attrs={},nodes={npfx}}
end
fattr['epub:type'] = 'footnote'
else
fattr.class = 'footnote'
end
local note = tag('aside', fattr, opts.epub and body.nodes or {
tag('div',{class='number'}, tostring(fn.num)),
tag('div',{class='text'}, body.nodes),
tag('a',{href='#0'},'⤫')
})
table.insert(ir, note)
end
end
if next(footnotes) and not opts.epub then
table.insert(ir, tagproc.toIR.tag('div',{id='cover'},''))
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
>
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
>
>
|
>
>
>
>
>
>
>
>
|
|
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
...
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
...
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
...
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
...
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
....
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
....
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
|
li {
padding: 0.1em 0;
}
]];
list_ordered = [[]];
list_unordered = [[]];
footnote = [[
@media screen {
a[href].fnref {
text-decoration-style: dashed;
color: @tone(0.7 45);
text-decoration-color: @tone/0.4(0.7 45);
}
a[href]:hover.fnref {
color: @tone(0.9 45);
text-decoration-color: @tone/0.7(0.7 45);
}
}
aside.footnote {
font-family: 90%;
grid-template-columns: 1em 1fr min-content;
grid-template-rows: 1fr min-content;
position: fixed;
padding: 1em;
background: @tone(0.03);
................................................................................
backdrop-filter: blur(0px);
}
aside.footnote:target ~ #cover {
opacity: 100%;
pointer-events: all;
backdrop-filter: blur(5px);
}
}
@media screen and (max-width: calc(@width + 20em)) {
aside.footnote {
left: 1em;
right: 1em;
}
}
@media print {
aside.footnote {
display: grid;
position: relative;
}
aside.footnote:first-of-type {
................................................................................
}
}
aside.footnote > div.number {
text-align:right;
grid-row: 1/2;
grid-column: 1/2;
}
aside.footnote > .text {
grid-row: 1/2;
grid-column: 2/4;
padding-left: 1em;
overflow-y: auto;
margin-top: 0;
}
aside.footnote > .text > :first-child {
margin-top: 0;
}
]];
header = [[
body { padding: 0 2.5em !important }
h1,h2,h3,h4,h5,h6 { border-bottom: 1px solid @tone(0.7); }
h1 { font-size: 200%; border-bottom-style: double !important; border-bottom-width: 3px !important; margin: 0em -1em; }
................................................................................
end
function span_renderers.footnote(f,b,s)
local linkattr = {}
if opts.epub then
linkattr['epub:type'] = 'noteref'
else
addStyle 'footnote'
linkattr.class = 'fnref'
end
local source, sid, ssec = b.origin:ref(f.ref)
local cnc = getSafeID(ssec) .. ' ' .. sid
local fn
if footnotes[cnc] then
fn = footnotes[cnc]
else
................................................................................
table.insert(secnodes, block_renderers[bl.kind](bl,sec))
end
end
if next(secnodes) then
if doc.secorder[2] then --#secs>1?
-- only wrap in a section if >1 section
table.insert(ir, tag('section',
{id = getSafeID(sec)},
secnodes))
else
ir = secnodes
end
end
end
return ir
end
................................................................................
do local fnsorted = {}
for _, fn in pairs(footnotes) do
fnsorted[fn.num] = fn
end
for _, fn in ipairs(fnsorted) do
local tag = tagproc.toIR.tag
local body
if type(fn.source) == 'table' then
if fn.source.kind == 'resource' then
local fake_embed = {
kind = 'embed';
rsrc = fn.source;
origin = fn.origin;
mode = 'inline';
}
local rendered = astproc.toIR.block_renderers.embed(
fake_embed, fn.origin.sec
)
if not rendered then
fn.origin:fail('unacceptable resource mime type “%s” for footnote target “%s”', fn.source.mime, fn.source.id or '(anonymous)')
end
body = rendered
else
fn.origin:fail('footnote span links to block “%s” of unacceptable kind “%s”', fn.source.kind)
end
else
body = {tag='div',nodes={}}
local ftir = {}
for l in fn.source:gmatch('([^\n]*)') do
ct.parse_line(l, fn.origin, ftir)
end
renderBlocks(ftir,body)
end
local fattr = {id=fn.id}
if opts.epub then
---UUUUUUGHHH
local npfx = string.format('(%u) ', fn.num)
if next(body.nodes) then
local n = body.nodes[1]
repeat
................................................................................
else
n.nodes[1] = {tag='p',attrs={},nodes={npfx}}
break
end
until false
else
if body.tag == 'div' then
body.nodes[1] = {tag='p',attrs={},nodes={npfx}}
elseif body.tag == 'pre' then
body.nodes[1] = npfx .. body.nodes[1]
else
body = {tag='div', nodes = {npfx, body}}
end
end
fattr['epub:type'] = 'footnote'
else
fattr.class = 'footnote'
end
body.attrs = body.attrs or {}
body.attrs.class = 'text'
local note = tag('aside', fattr, opts.epub and body.nodes or {
tag('div',{class='number'}, tostring(fn.num)),
body,
-- tag('div',{class='text'}, body.nodes),
tag('a',{href='#0'},'⤫')
})
table.insert(ir, note)
end
end
if next(footnotes) and not opts.epub then
table.insert(ir, tagproc.toIR.tag('div',{id='cover'},''))
|