Skip to content

Commit

Permalink
Update fileManipulate.ts
Browse files Browse the repository at this point in the history
  • Loading branch information
Mefisto04 authored Oct 13, 2024
1 parent 53aa2d9 commit 2351758
Showing 1 changed file with 117 additions and 14 deletions.
131 changes: 117 additions & 14 deletions src/core/file/fileManipulate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@ interface FileManipulator {
removeEmptyLines(content: string): string;
}

const rtrimLines = (content: string): string => content.replace(/[ \t]+$/gm, '');
const rtrimLines = (content: string): string =>
content
.split('\n')
.map((line) => line.trimEnd())
.join('\n');


class BaseManipulator implements FileManipulator {
removeComments(content: string): string {
Expand Down Expand Up @@ -40,22 +45,128 @@ class StripCommentsManipulator extends BaseManipulator {

class PythonManipulator extends BaseManipulator {
removeDocStrings(content: string): string {
const docstringRegex = /(?:^|\n)\s*(?:'{3}|"{3})[\s\S]*?(?:'{3}|"{3})/gm;
return content.replace(docstringRegex, '');
if (!content) return '';
const lines = content.split('\n');

let result = '';

let buffer = '';
let quoteType: '' | "'" | '"' = '';
let tripleQuotes = 0;

const doubleQuoteRegex = /^\s*(?<!\\)(?:""")\s*(?:\n)?[\s\S]*?(?<!("""))(?<!\\)(?:""")/gm;
const singleQuoteRegex = /^\s*(?<!\\)(?:''')\s*(?:\n)?[\s\S]*?(?<!('''))(?<!\\)(?:''')/gm;

const sz = lines.length;
for (let i = 0; i < sz; i++) {
const line = lines[i] + (i !== sz - 1 ? '\n' : '');
buffer += line;
if (quoteType === '') {
const indexSingle = line.search(/(?<![\"])(?<!\\)'''(?![\"])/g);
const indexDouble = line.search(/(?<![\'])(?<!\\)"""(?![\'])/g);
if (indexSingle !== -1 && (indexDouble === -1 || indexSingle < indexDouble)) {
quoteType = "'";
} else if (indexDouble !== -1 && (indexSingle === -1 || indexDouble < indexSingle)) {
quoteType = '"';
}
}
if (quoteType === "'") {
tripleQuotes += (line.match(/(?<![\"])(?<!\\)'''(?!["])/g) || []).length;
}
if (quoteType === '"') {
tripleQuotes += (line.match(/(?<![\'])(?<!\\)"""(?![\'])/g) || []).length;
}

if (tripleQuotes % 2 === 0) {
const docstringRegex = quoteType === '"' ? doubleQuoteRegex : singleQuoteRegex;
buffer = buffer.replace(docstringRegex, '');
result += buffer;
buffer = '';
tripleQuotes = 0;
quoteType = '';
}
}

result += buffer;
return result;
}

removeHashComments(content: string): string {
const hashCommentRegex = /(?<!["'])#.*$/gm;
return content.replace(hashCommentRegex, '');
const searchInPairs = (pairs: [number, number][], hashIndex: number): boolean => {
return pairs.some(([start, end]) => hashIndex > start && hashIndex < end);
};

let result = '';
const pairs: [number, number][] = [];
let prevQuote = 0;
while (prevQuote < content.length) {
const openingQuote = content.slice(prevQuote + 1).search(/(?<!\\)(?:"|'|'''|""")/g) + prevQuote + 1;
if (openingQuote === prevQuote) break;

let closingQuote;
if (content.startsWith('"""', openingQuote) || content.startsWith("'''", openingQuote)) {
const quoteType = content.slice(openingQuote, openingQuote + 3);
closingQuote = content.indexOf(quoteType, openingQuote + 3);
} else {
const quoteType = content[openingQuote];
closingQuote = content.indexOf(quoteType, openingQuote + 1);
}

if (closingQuote === -1) break;
pairs.push([openingQuote, closingQuote]);
prevQuote = closingQuote;
}
let prevHash = 0;
while (prevHash < content.length) {
const hashIndex = content.slice(prevHash).search(/(?<!\\)#/g) + prevHash;
if (hashIndex === prevHash - 1) {
result += content.slice(prevHash);
break;
}

const isInsideString = searchInPairs(pairs, hashIndex);
const nextNewLine = content.indexOf('\n', hashIndex);

if (!isInsideString) {
if (nextNewLine === -1) {
result += content.slice(prevHash);
break;
}
result += `${content.slice(prevHash, hashIndex)}\n`;
} else {
if (nextNewLine === -1) {
result += content.slice(prevHash);
break;
}
result += `${content.slice(prevHash, nextNewLine)}\n`;
}

prevHash = nextNewLine + 1;
}
return result;
}


removeComments(content: string): string {
let result = this.removeDocStrings(content);
result = this.removeHashComments(result);
return rtrimLines(result);
}
}

class CompositeManipulator extends BaseManipulator {
private manipulators: FileManipulator[];

constructor(...manipulators: FileManipulator[]) {
super();
this.manipulators = manipulators;
}

removeComments(content: string): string {
return this.manipulators.reduce((acc, manipulator) => manipulator.removeComments(acc), content);
}
}

const manipulators: Record<string, FileManipulator> = {
'.c': new StripCommentsManipulator('c'),
'.cs': new StripCommentsManipulator('csharp'),
Expand Down Expand Up @@ -96,15 +207,7 @@ const manipulators: Record<string, FileManipulator> = {
),
};

const getOrCreateManipulator = (ext: string): FileManipulator => {
if (!manipulators[ext]) {
manipulators[ext] =
ext === '.py' ? new PythonManipulator() : new StripCommentsManipulator('javascript');
}
return manipulators[ext];
};

export const getFileManipulator = (filePath: string): FileManipulator | null => {
const ext = path.extname(filePath);
return getOrCreateManipulator(ext) || null;
return manipulators[ext] || null;
};

0 comments on commit 2351758

Please sign in to comment.