Skip to content

Commit d5f7035

Browse files
author
Allen Manning
authored
Merge pull request #4644 from quarto-dev/feature/folder-from-index
[Confluence] "Flatten" index.qmd to parent folder. #4551
2 parents 394cef9 + 4cfd0f5 commit d5f7035

File tree

3 files changed

+594
-13
lines changed

3 files changed

+594
-13
lines changed

src/publish/confluence/confluence-helper.ts

Lines changed: 103 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
import { trace } from "./confluence-logger.ts";
22
import { ApiError, PublishRecord } from "../types.ts";
3-
import { ensureTrailingSlash } from "../../core/path.ts";
43
import {
5-
join,
6-
basename,
7-
parse,
8-
dirname,
9-
toFileUrl,
10-
resolve,
11-
} from "path/mod.ts";
4+
ensureTrailingSlash,
5+
pathWithForwardSlashes,
6+
} from "../../core/path.ts";
7+
import { join } from "path/mod.ts";
128
import { isHttpUrl } from "../../core/url.ts";
13-
import { pathWithForwardSlashes } from "../../core/path.ts";
149
import { AccountToken, InputMetadata } from "../provider.ts";
1510
import {
1611
ConfluenceParent,
@@ -29,8 +24,6 @@ import {
2924
ContentUpdate,
3025
ContentVersion,
3126
EMPTY_PARENT,
32-
LogLevel,
33-
LogPrefix,
3427
PAGE_TYPE,
3528
SiteFileMetadata,
3629
SitePage,
@@ -469,6 +462,97 @@ export const buildSpaceChanges = (
469462
return spaceChanges;
470463
};
471464

465+
export const flattenIndexes = (
466+
changes: ConfluenceSpaceChange[],
467+
metadataByFileName: Record<string, SitePage>
468+
): ConfluenceSpaceChange[] => {
469+
const getFileNameForChange = (change: ConfluenceSpaceChange) => {
470+
if (isContentDelete(change)) {
471+
return "";
472+
}
473+
474+
return pathWithForwardSlashes(change?.fileName ?? "");
475+
};
476+
477+
const isIndexFile = (change: ConfluenceSpaceChange) => {
478+
return getFileNameForChange(change)?.endsWith("/index.xml");
479+
};
480+
481+
const toIndexPageLookup = (
482+
accumulator: Record<string, ConfluenceSpaceChange>,
483+
change: ConfluenceSpaceChange
484+
): Record<string, any> => {
485+
if (isContentDelete(change)) {
486+
return accumulator;
487+
}
488+
const fileName = getFileNameForChange(change);
489+
const isIndex = isIndexFile(change);
490+
491+
if (isIndex) {
492+
const folderFileName = fileName.replace("/index.xml", "");
493+
return {
494+
...accumulator,
495+
[folderFileName]: change,
496+
};
497+
}
498+
499+
return accumulator;
500+
};
501+
502+
const indexLookup: Record<string, ConfluenceSpaceChange> = changes.reduce(
503+
toIndexPageLookup,
504+
{}
505+
);
506+
507+
const toFlattenedIndexes = (
508+
accumulator: ConfluenceSpaceChange[],
509+
change: ConfluenceSpaceChange
510+
): ConfluenceSpaceChange[] => {
511+
if (isContentDelete(change)) {
512+
return [...accumulator, change];
513+
}
514+
515+
const fileName = getFileNameForChange(change);
516+
const parentFileName = fileName.replace("/index.xml", "");
517+
const parentSitePage: SitePage = metadataByFileName[parentFileName];
518+
if (isIndexFile(change)) {
519+
if (parentSitePage) {
520+
// The parent has already been created, this index create
521+
// is actually an index parent update update the folder with
522+
// index contents
523+
const parentUpdate = buildContentUpdate(
524+
parentSitePage.id,
525+
change.title,
526+
change.body,
527+
parentSitePage.metadata.fileName ?? "",
528+
"",
529+
ContentStatusEnum.current,
530+
PAGE_TYPE,
531+
null,
532+
parentSitePage.ancestors
533+
);
534+
535+
return [...accumulator, parentUpdate];
536+
} else {
537+
return [...accumulator]; //filter out index file creates
538+
}
539+
}
540+
541+
const indexCreateChange: ConfluenceSpaceChange = indexLookup[fileName];
542+
543+
if (indexCreateChange && !isContentDelete(indexCreateChange)) {
544+
change.title = indexCreateChange.title ?? change.title;
545+
change.body = indexCreateChange.body ?? change.body;
546+
}
547+
548+
return [...accumulator, change];
549+
};
550+
551+
const flattenedIndexes = changes.reduce(toFlattenedIndexes, []);
552+
553+
return flattenedIndexes;
554+
};
555+
472556
export const replaceExtension = (
473557
fileName: string,
474558
oldExtension: string,
@@ -596,6 +680,14 @@ export const updateLinks = (
596680
siteFilePath = siteFilePath.slice(1); //remove '/'
597681
}
598682

683+
if (siteFilePath.endsWith("/index.qmd")) {
684+
//flatten child index links to the parent
685+
const siteFilePathParent = siteFilePath.replace("/index.qmd", "");
686+
if (fileMetadataTable[siteFilePathParent]) {
687+
siteFilePath = siteFilePathParent;
688+
}
689+
}
690+
599691
const sitePage: SitePage | null = fileMetadataTable[siteFilePath] ?? null;
600692

601693
if (sitePage) {

src/publish/confluence/confluence.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import {
5656
doWithSpinner,
5757
filterFilesForUpdate,
5858
findAttachments,
59+
flattenIndexes,
5960
footnoteTransform,
6061
getNextVersion,
6162
getTitle,
@@ -665,6 +666,7 @@ async function publish(
665666
trace("fileMetadata", fileMetadata);
666667

667668
let metadataByFilename = buildFileToMetaTable(existingSite);
669+
668670
trace("metadataByFilename", metadataByFilename);
669671

670672
let changeList: ConfluenceSpaceChange[] = buildSpaceChanges(
@@ -674,6 +676,8 @@ async function publish(
674676
existingSite
675677
);
676678

679+
changeList = flattenIndexes(changeList, metadataByFilename);
680+
677681
const { pass1Changes, pass2Changes } = updateLinks(
678682
metadataByFilename,
679683
changeList,

0 commit comments

Comments
 (0)