UNPKG

@mieweb/wikigdrive

Version:

Google Drive to MarkDown synchronization

119 lines (118 loc) 4.68 kB
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; } }