Skip to content

Commit 602b390

Browse files
committed
Merge branch 'main' of github.com:quarto-dev/quarto-cli into main
2 parents dbb9de9 + c1361f0 commit 602b390

File tree

4 files changed

+86
-35
lines changed

4 files changed

+86
-35
lines changed

src/project/types/book/book-render.ts

Lines changed: 75 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
import {
2020
kAbstract,
2121
kAuthor,
22+
kAuthors,
2223
kDate,
2324
kDescription,
2425
kNumberSections,
@@ -78,14 +79,13 @@ import {
7879
} from "./book-shared.ts";
7980
import { bookCrossrefsPostRender } from "./book-crossrefs.ts";
8081
import { bookBibliographyPostRender } from "./book-bibliography.ts";
81-
import {
82-
partitionYamlFrontMatter,
83-
readYamlFromMarkdown,
84-
} from "../../../core/yaml.ts";
82+
import { partitionYamlFrontMatter } from "../../../core/yaml.ts";
8583
import { pathWithForwardSlashes } from "../../../core/path.ts";
8684
import { kDateFormat } from "../website/listing/website-listing-template.ts";
8785
import { removePandocTo } from "../../../command/render/flags.ts";
8886
import { resourcePath } from "../../../core/resources.ts";
87+
import { PandocAttr, PartitionedMarkdown } from "../../../core/pandoc/types.ts";
88+
import { stringify } from "encoding/yaml.ts";
8989

9090
export function bookPandocRenderer(
9191
options: RenderOptions,
@@ -347,42 +347,89 @@ async function mergeExecutedFiles(
347347
file.context.target.source === itemInputPath
348348
);
349349
if (file) {
350-
const partitioned = partitionYamlFrontMatter(
351-
file.executeResult.markdown,
352-
);
350+
const partitioned = partitionMarkdown(file.executeResult.markdown);
351+
352+
// Will always provide the title markdown whether the title was provided by
353+
// front matter or by the first heading. Note that this will
354+
// prefer to use the title that appears in the front matter, and if
355+
// there is no front matter title it will promote the first heading to
356+
// level 1 heading
357+
const resolveTitleMarkdown = (partitioned: PartitionedMarkdown) => {
358+
// Creates a markdown title, dealing with attributes, if present
359+
const createMarkdownTitle = (text: string, attr?: PandocAttr) => {
360+
let attrStr = "";
361+
if (attr) {
362+
const idStr = attr.id !== "" ? `#${attr.id} ` : "";
363+
const clzStr = attr.classes.map((clz) => {
364+
return `.${clz} `;
365+
});
366+
const keyValueStr = attr.keyvalue.map((kv) => {
367+
const escapedValue = kv[1].replaceAll(/"/gm, '\\"');
368+
return `${kv[0]}="${escapedValue}" `;
369+
});
370+
const attrContents = `${idStr}${clzStr}${keyValueStr}`.trim();
371+
attrStr = `{${attrContents}}`;
372+
}
353373

354-
const titleMdFromFrontMatter = (frontMatter?: string) => {
355-
const yaml = frontMatter
356-
? readYamlFromMarkdown(frontMatter)
357-
: undefined;
374+
return `# ${text} ${attrStr}\n\n`;
375+
};
358376

359-
if (yaml) {
360-
const frontTitle = frontMatterTitle(yaml);
377+
let titleText;
378+
let titleAttr;
379+
if (partitioned.yaml) {
380+
const frontTitle = frontMatterTitle(partitioned.yaml);
361381
if (frontTitle) {
362-
const titleMarkdown = frontTitle ? `# ${frontTitle}\n\n` : "";
382+
titleText = frontTitle;
383+
} else {
384+
titleText = partitioned.headingText;
385+
titleAttr = partitioned.headingAttr;
386+
}
387+
} else {
388+
titleText = partitioned.headingText;
389+
titleAttr = partitioned.headingAttr;
390+
}
363391

364-
const titleBlockPath = resourcePath(
365-
"projects/book/pandoc/title-block.md",
366-
);
367-
const titleAttr = `template='${titleBlockPath}'`;
392+
if (titleText === undefined) {
393+
titleText = "";
394+
}
395+
return createMarkdownTitle(titleText, titleAttr);
396+
};
368397

369-
const titleBlockMd = "```````{.quarto-title-block " +
370-
titleAttr + "}\n" +
371-
partitioned?.yaml +
372-
"\n```````";
398+
// If there is front matter for this chapter, this will generate a code
399+
// cell that will be rendered a LUA filter (the code cell will provide the
400+
// path to the template that should be used as well as the front matter
401+
// to use when rendering)
402+
const resolveTitleBlockMarkdown = (yaml?: Metadata) => {
403+
if (yaml) {
404+
const titleBlockPath = resourcePath(
405+
"projects/book/pandoc/title-block.md",
406+
);
373407

374-
return titleMarkdown + titleBlockMd;
375-
} else {
376-
return "";
377-
}
408+
const titleAttr = `template='${titleBlockPath}'`;
409+
const frontMatter = `---\n${
410+
stringify(yaml, { indent: 2 })
411+
}\n---\n`;
412+
413+
const titleBlockMd = "```````{.quarto-title-block " +
414+
titleAttr + "}\n" +
415+
frontMatter +
416+
"\n```````\n\n";
417+
418+
return titleBlockMd;
378419
} else {
379420
return "";
380421
}
381422
};
382423

424+
// Compose the markdown for this chapter
425+
const titleMarkdown = resolveTitleMarkdown(partitioned);
426+
const titleBlockMarkdown = resolveTitleBlockMarkdown(
427+
partitioned.yaml,
428+
);
383429
itemMarkdown = bookItemMetadata(project, item, file) +
384-
titleMdFromFrontMatter(partitioned?.yaml) +
385-
(partitioned?.markdown || file.executeResult.markdown);
430+
titleMarkdown +
431+
titleBlockMarkdown +
432+
partitioned.markdown;
386433
} else {
387434
throw new Error(
388435
"Executed file not found for book item: " + item.file,

src/resources/filters/common/authors.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ local kAffiliationAliasedFields = {
141141
local kNumber = "number"
142142

143143
function processAuthorMeta(meta, authorInput)
144-
if not _quarto.format.isHtmlOutput() and not _quarto.format.isLatexOutput() and not _quarto.format.isIpynbOutput() then
144+
if not _quarto.format.isHtmlOutput() and not _quarto.format.isLatexOutput() and not _quarto.format.isIpynbOutput() and not _quarto.format.isDocxOutput() then
145145
return
146146
end
147147

src/resources/filters/quarto-post/book.lua

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ function quartoBook()
2828
-- read the title block template
2929
local renderedBlocks = compileTemplate(template, processedMeta)
3030

31+
if #renderedBlocks ~= 0 then
32+
local emptyLine = pandoc.LineBreak()
33+
renderedBlocks:insert(emptyLine)
34+
end
35+
3136
return renderedBlocks
3237
end
3338
end

src/resources/projects/book/pandoc/title-block.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ $if(subtitle)$$subtitle$$endif$
55

66
$-- there are affiliations, render that
77
$if(by-affiliation/first)$
8-
$for(by-author)$$if(by-author.url)$[$by-author.name.literal$]($by-author.url$)$else$$by-author.name.literal$$endif$$if(by-author.orcid)$ [![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMjA4MDI1MjA2ODExOTk0QzkzNTEzRjZEQTg1NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozM0NDOEJGNEZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozM0NDOEJGM0ZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZDN0YxMTc0MDcyMDY4MTE5NUZFRDc5MUM2MUUwNEREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU3Q0QyMDgwMjUyMDY4MTE5OTRDOTM1MTNGNkRBODU3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+84NovQAAAR1JREFUeNpiZEADy85ZJgCpeCB2QJM6AMQLo4yOL0AWZETSqACk1gOxAQN+cAGIA4EGPQBxmJA0nwdpjjQ8xqArmczw5tMHXAaALDgP1QMxAGqzAAPxQACqh4ER6uf5MBlkm0X4EGayMfMw/Pr7Bd2gRBZogMFBrv01hisv5jLsv9nLAPIOMnjy8RDDyYctyAbFM2EJbRQw+aAWw/LzVgx7b+cwCHKqMhjJFCBLOzAR6+lXX84xnHjYyqAo5IUizkRCwIENQQckGSDGY4TVgAPEaraQr2a4/24bSuoExcJCfAEJihXkWDj3ZAKy9EJGaEo8T0QSxkjSwORsCAuDQCD+QILmD1A9kECEZgxDaEZhICIzGcIyEyOl2RkgwAAhkmC+eAm0TAAAAABJRU5ErkJggg==)](https://orcid.org/$by-author.orcid$)$endif$$if(by-author.affiliations/first)$
8+
$for(by-author)$$if(by-author.url)$[$by-author.name.literal$]($by-author.url$)$else$$by-author.name.literal$$endif$$if(by-author.affiliations/first)$
99
$if(by-author.affiliations/allbutlast)$
10-
($for(by-author.affiliations/allbutlast)$$if(it.url)$[$it.name$]($it.url$)$else$$it.name$$endif$$if(it.orcid)$ [![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMjA4MDI1MjA2ODExOTk0QzkzNTEzRjZEQTg1NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozM0NDOEJGNEZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozM0NDOEJGM0ZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZDN0YxMTc0MDcyMDY4MTE5NUZFRDc5MUM2MUUwNEREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU3Q0QyMDgwMjUyMDY4MTE5OTRDOTM1MTNGNkRBODU3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+84NovQAAAR1JREFUeNpiZEADy85ZJgCpeCB2QJM6AMQLo4yOL0AWZETSqACk1gOxAQN+cAGIA4EGPQBxmJA0nwdpjjQ8xqArmczw5tMHXAaALDgP1QMxAGqzAAPxQACqh4ER6uf5MBlkm0X4EGayMfMw/Pr7Bd2gRBZogMFBrv01hisv5jLsv9nLAPIOMnjy8RDDyYctyAbFM2EJbRQw+aAWw/LzVgx7b+cwCHKqMhjJFCBLOzAR6+lXX84xnHjYyqAo5IUizkRCwIENQQckGSDGY4TVgAPEaraQr2a4/24bSuoExcJCfAEJihXkWDj3ZAKy9EJGaEo8T0QSxkjSwORsCAuDQCD+QILmD1A9kECEZgxDaEZhICIzGcIyEyOl2RkgwAAhkmC+eAm0TAAAAABJRU5ErkJggg==)](https://orcid.org/$it.orcid$) $endif$, $endfor$$for(by-author.affiliations/last)$$if(it.url)$[$it.name$]($it.url$)$else$$it.name$$endif$$endfor$)
10+
($for(by-author.affiliations/allbutlast)$$if(it.url)$[$it.name$]($it.url$)$else$$it.name$$endif$, $endfor$$for(by-author.affiliations/last)$$if(it.url)$[$it.name$]($it.url$)$else$$it.name$$endif$$endfor$)
1111
$else$
1212
($for(by-author.affiliations/first)$$if(it.url)$[$it.name$]($it.url$)$else$$it.name$$endif$$endfor$)
1313
$endif$
@@ -18,11 +18,10 @@ $-- If there are no affiliations, we can just output authors
1818
$if(by-affiliation)$
1919
$elseif(by-author)$
2020
$for(by-author)$
21-
$if(by-author.url)$| [$by-author.name.literal$]($by-author-url$)$if(by-author.orcid)$ [![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMjA4MDI1MjA2ODExOTk0QzkzNTEzRjZEQTg1NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozM0NDOEJGNEZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozM0NDOEJGM0ZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZDN0YxMTc0MDcyMDY4MTE5NUZFRDc5MUM2MUUwNEREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU3Q0QyMDgwMjUyMDY4MTE5OTRDOTM1MTNGNkRBODU3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+84NovQAAAR1JREFUeNpiZEADy85ZJgCpeCB2QJM6AMQLo4yOL0AWZETSqACk1gOxAQN+cAGIA4EGPQBxmJA0nwdpjjQ8xqArmczw5tMHXAaALDgP1QMxAGqzAAPxQACqh4ER6uf5MBlkm0X4EGayMfMw/Pr7Bd2gRBZogMFBrv01hisv5jLsv9nLAPIOMnjy8RDDyYctyAbFM2EJbRQw+aAWw/LzVgx7b+cwCHKqMhjJFCBLOzAR6+lXX84xnHjYyqAo5IUizkRCwIENQQckGSDGY4TVgAPEaraQr2a4/24bSuoExcJCfAEJihXkWDj3ZAKy9EJGaEo8T0QSxkjSwORsCAuDQCD+QILmD1A9kECEZgxDaEZhICIzGcIyEyOl2RkgwAAhkmC+eAm0TAAAAABJRU5ErkJggg==)](https://orcid.org/$by-author.orcid$)$endif$ $else$
22-
$by-author.name.literal$$if(by-author.orcid)$ [![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMjA4MDI1MjA2ODExOTk0QzkzNTEzRjZEQTg1NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozM0NDOEJGNEZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozM0NDOEJGM0ZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZDN0YxMTc0MDcyMDY4MTE5NUZFRDc5MUM2MUUwNEREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU3Q0QyMDgwMjUyMDY4MTE5OTRDOTM1MTNGNkRBODU3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+84NovQAAAR1JREFUeNpiZEADy85ZJgCpeCB2QJM6AMQLo4yOL0AWZETSqACk1gOxAQN+cAGIA4EGPQBxmJA0nwdpjjQ8xqArmczw5tMHXAaALDgP1QMxAGqzAAPxQACqh4ER6uf5MBlkm0X4EGayMfMw/Pr7Bd2gRBZogMFBrv01hisv5jLsv9nLAPIOMnjy8RDDyYctyAbFM2EJbRQw+aAWw/LzVgx7b+cwCHKqMhjJFCBLOzAR6+lXX84xnHjYyqAo5IUizkRCwIENQQckGSDGY4TVgAPEaraQr2a4/24bSuoExcJCfAEJihXkWDj3ZAKy9EJGaEo8T0QSxkjSwORsCAuDQCD+QILmD1A9kECEZgxDaEZhICIzGcIyEyOl2RkgwAAhkmC+eAm0TAAAAABJRU5ErkJggg==)](https://orcid.org/$by-author.orcid$)$endif$ $endif$$endfor$
21+
$if(by-author.url)$| [$by-author.name.literal$]($by-author-url$) $else$
22+
$by-author.name.literal$ $endif$$endfor$
2323

2424
$if(date)$$date$$endif$
2525
$endif$
2626

27-
$if(abstract)$$abstract$$endif$
28-
 
27+
$if(abstract)$$abstract$$endif$

0 commit comments

Comments
 (0)