@mieweb/wikigdrive
Version:
Google Drive to MarkDown synchronization
104 lines (90 loc) • 2.68 kB
text/typescript
import {FileContentService} from '../../utils/FileContentService.ts';
import {FileId} from '../../model/model.ts';
interface Link {
fileId: string;
fileName: string;
links: string[];
}
export const LINKS_NAME = '.wgd-local-links.csv';
export class LocalLinks {
private links: Link[];
private notGenerated = true;
constructor(private transformFileService: FileContentService) {
}
async load() {
if (!await this.transformFileService.exists(LINKS_NAME)) {
this.notGenerated = true;
this.links = [];
return;
}
const content = await this.transformFileService.readFile(LINKS_NAME) || '';
const rows = content.split('\n').map(row => row.trim()).filter(row => !!row);
rows.shift();
const groups = {};
for (const row of rows) {
const cells = row.split(';');
if (!groups[cells[0]]) {
groups[cells[0]] = {
fileId: cells[0],
fileName: cells[1],
links: []
};
}
groups[cells[0]].links.push(cells[2]);
}
this.notGenerated = false;
this.links = Object.values(groups);
}
append(fileId: FileId, fileName: string, links: string[]) {
const link = this.links.find(l => l.fileId === fileId);
if (link) {
link.fileName = fileName;
link.links = links;
} else {
this.links.push({
fileId, fileName, links
});
}
}
getBackLinks(fileId: FileId) {
const retVal = new Set<string>();
for (const link of this.links) {
for (const targetLink of link.links) {
if (targetLink === 'gdoc:' + fileId) {
retVal.add(link.fileId);
}
}
}
return Array.from(retVal)
.map(fileId => ({
fileId,
linksCount: this.links.find(link => link.fileId === fileId)?.links.length || 0
}));
}
getLinks(fileId: FileId) {
if (this.notGenerated) {
return false;
}
for (const link of this.links) {
if (link.fileId === fileId) {
const links = link.links
.filter(link => link.startsWith('gdoc:'))
.map(link => link.substring('gdoc:'.length).replace(/#.*/, ''));
return links.map(fileId => ({
fileId,
linksCount: this.links.find(link => link.fileId === fileId)?.links.length || 0
}));
}
}
return [];
}
async save() {
const content = 'source;name;dest';
const rowsContent = this.links.map(row => {
return row.links.map(dest => {
return `${row.fileId};${row.fileName};${dest}`;
}).join('\n').trim();
}).join('\n');
await this.transformFileService.writeFile(LINKS_NAME, content + '\n' + rowsContent);
}
}