@mieweb/wikigdrive
Version:
Google Drive to MarkDown synchronization
119 lines (118 loc) • 4.68 kB
JavaScript
import { MimeTypes } from '../../model/GoogleFile.js';
import { googleMimeToExt } from './TaskLocalFileTransform.js';
import { slugify } from '../../utils/slugify.js';
const MAX_PATH_LENGTH = 2000;
const MAX_FILENAME_LENGTH = 200;
export function getDesiredPath(name, mimeType) {
name = name.replace(/[&]+/g, ' and ');
name = name
.replace(/[/,:()]+/g, ' ')
.replace(/\p{P}/gu, (match) => {
if (['.', '_'].includes(match)) {
return match;
}
return ' ';
});
name = name.trim();
name = slugify(name, { replacement: '-', lower: true, remove: /[#*+~()'"!:@]/g });
if (mimeType) {
const ext = googleMimeToExt(mimeType, name);
switch (mimeType) {
case MimeTypes.DOCUMENT_MIME:
name += '.md';
break;
case MimeTypes.DRAWING_MIME:
name += '.svg';
break;
case MimeTypes.FOLDER_MIME:
break;
default:
if (name.indexOf('.') === -1) {
name += '.' + ext;
}
}
}
return name.substring(0, MAX_FILENAME_LENGTH);
}
export class LocalFilesGenerator {
async generateLocalFiles(googleFiles) {
const retVal = [];
for (const googleFile of googleFiles) {
const desiredLocalPath = getDesiredPath(googleFile.name, googleFile.mimeType).substring(0, MAX_PATH_LENGTH);
switch (googleFile.mimeType) {
case MimeTypes.FOLDER_MIME:
{
const folder = {
type: 'directory',
id: googleFile.id,
title: googleFile.name,
modifiedTime: googleFile.modifiedTime,
version: +googleFile.version,
mimeType: googleFile.mimeType,
fileName: desiredLocalPath,
};
retVal.push(folder);
}
break;
case MimeTypes.DOCUMENT_MIME:
{
const mdFile = {
type: 'md',
id: googleFile.id,
title: googleFile.name,
modifiedTime: googleFile.modifiedTime,
version: +googleFile.version,
mimeType: 'text/x-markdown',
lastAuthor: googleFile.lastAuthor,
fileName: desiredLocalPath,
};
retVal.push(mdFile);
}
break;
case MimeTypes.DRAWING_MIME:
{
const drawingFile = {
type: 'drawing',
id: googleFile.id,
title: googleFile.name,
modifiedTime: googleFile.modifiedTime,
version: +googleFile.version,
mimeType: 'image/svg+xml',
fileName: desiredLocalPath,
};
retVal.push(drawingFile);
}
break;
case MimeTypes.SHORTCUT:
{
const shortcutFile = {
type: 'shortcut',
id: googleFile.id,
title: googleFile.name,
modifiedTime: googleFile.modifiedTime,
version: +googleFile.version,
mimeType: MimeTypes.SHORTCUT,
fileName: desiredLocalPath,
};
retVal.push(shortcutFile);
}
break;
default:
{
const binaryFile = {
type: 'binary',
id: googleFile.id,
title: googleFile.name,
modifiedTime: googleFile.modifiedTime,
version: +googleFile.version,
mimeType: googleFile.mimeType,
fileName: desiredLocalPath,
};
retVal.push(binaryFile);
}
break;
}
}
return retVal;
}
}