Skip to content

Commit f57b415

Browse files
authored
Merge pull request #33 from darkriszty/feature/size-limit
Limit table formatting input to 1M chars by default
2 parents d250ea3 + 8a11969 commit f57b415

13 files changed

Lines changed: 2532 additions & 150 deletions

.travis.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ os:
88
- linux
99

1010
before_install:
11-
- if [ $TRAVIS_OS_NAME == "linux" ]; then
12-
export CXX="g++-4.9" CC="gcc-4.9" DISPLAY=:99.0;
13-
sh -e /etc/init.d/xvfb start;
14-
sleep 3;
11+
- |
12+
if [ $TRAVIS_OS_NAME == "linux" ]; then
13+
export DISPLAY=':99.0'
14+
/usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
1515
fi
1616
1717
install:

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "markdown-table-prettify",
33
"displayName": "Markdown Table Prettifier",
44
"description": "Transforms markdown tables to be more readable.",
5-
"version": "2.4.0",
5+
"version": "2.5.0",
66
"publisher": "darkriszty",
77
"repository": {
88
"type": "git",
@@ -31,6 +31,11 @@
3131
"type": "boolean",
3232
"default": true,
3333
"description": "Whether or not show window messages."
34+
},
35+
"markdownTablePrettify.maxTextLength": {
36+
"type": "integer",
37+
"default": 1000000,
38+
"description": "The maximum text length to apply formatting to."
3439
}
3540
}
3641
}

src/extension/prettyfierFactory.ts

Lines changed: 69 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,70 @@
1-
import * as vscode from 'vscode';
2-
import { TableDocumentPrettyfier } from './tableDocumentPrettyfier';
3-
import { TableFinder } from '../tableFinding/tableFinder';
4-
import { TableDocumentRangePrettyfier } from "./tableDocumentRangePrettyfier";
5-
import { ConsoleLogger } from '../diagnostics/consoleLogger';
6-
import { VsWindowLogger } from '../diagnostics/vsWindowLogger';
7-
import { TableFactory } from "../modelFactory/tableFactory";
8-
import { AlignmentFactory } from "../modelFactory/alignmentFactory";
9-
import { TableValidator } from "../modelFactory/tableValidator";
10-
import { TableStringWriter } from "../writers/tableStringWriter";
11-
import { ContentPadCalculator } from '../padCalculation/contentPadCalculator';
12-
import { TableViewModelFactory } from '../viewModelFactories/tableViewModelFactory';
13-
import { RowViewModelFactory } from '../viewModelFactories/rowViewModelFactory';
14-
import { TrimmerTransformer } from '../modelFactory/transformers/trimmerTransformer';
15-
import { BorderTransformer } from '../modelFactory/transformers/borderTransformer';
16-
import { SelectionInterpreter } from '../modelFactory/selectionInterpreter';
17-
import { PadCalculatorSelector } from '../padCalculation/padCalculatorSelector';
18-
import { AlignmentMarkerStrategy } from '../viewModelFactories/alignmentMarking';
19-
20-
export function getDocumentRangePrettyfier(strict: boolean = false) {
21-
return new TableDocumentRangePrettyfier(
22-
new TableFactory(
23-
new AlignmentFactory(), new SelectionInterpreter(strict),
24-
new TrimmerTransformer(new BorderTransformer(null))
25-
),
26-
new TableValidator(new SelectionInterpreter(strict)),
27-
new TableViewModelFactory(
28-
new RowViewModelFactory(
29-
new ContentPadCalculator(new PadCalculatorSelector(), " "),
30-
new AlignmentMarkerStrategy(":")
31-
)
32-
),
33-
new TableStringWriter(),
34-
[
35-
...(canShowWindowMessages() ? [ new VsWindowLogger() ] : []),
36-
new ConsoleLogger()
37-
]
38-
);
39-
}
40-
41-
export function getDocumentPrettyfier(strict: boolean = true): vscode.DocumentFormattingEditProvider {
42-
return new TableDocumentPrettyfier(
43-
new TableFinder(new TableValidator(new SelectionInterpreter(strict))),
44-
getDocumentRangePrettyfier(strict)
45-
);
46-
}
47-
48-
function canShowWindowMessages(): boolean {
49-
return getConfigurationValue<boolean>("showWindowMessages", true);
50-
}
51-
52-
function getConfigurationValue<T>(key: string, defaultValue: T): T {
53-
return vscode.workspace.getConfiguration("markdownTablePrettify").get(key, defaultValue);
1+
import * as vscode from 'vscode';
2+
import { SizeLimitChecker } from './sizeLimitCheker';
3+
import { TableDocumentPrettyfier } from './tableDocumentPrettyfier';
4+
import { TableFinder } from '../tableFinding/tableFinder';
5+
import { TableDocumentRangePrettyfier } from "./tableDocumentRangePrettyfier";
6+
import { ILogger } from '../diagnostics/logger';
7+
import { ConsoleLogger } from '../diagnostics/consoleLogger';
8+
import { VsWindowLogger } from '../diagnostics/vsWindowLogger';
9+
import { TableFactory } from "../modelFactory/tableFactory";
10+
import { AlignmentFactory } from "../modelFactory/alignmentFactory";
11+
import { TableValidator } from "../modelFactory/tableValidator";
12+
import { TableStringWriter } from "../writers/tableStringWriter";
13+
import { ContentPadCalculator } from '../padCalculation/contentPadCalculator';
14+
import { TableViewModelFactory } from '../viewModelFactories/tableViewModelFactory';
15+
import { RowViewModelFactory } from '../viewModelFactories/rowViewModelFactory';
16+
import { TrimmerTransformer } from '../modelFactory/transformers/trimmerTransformer';
17+
import { BorderTransformer } from '../modelFactory/transformers/borderTransformer';
18+
import { SelectionInterpreter } from '../modelFactory/selectionInterpreter';
19+
import { PadCalculatorSelector } from '../padCalculation/padCalculatorSelector';
20+
import { AlignmentMarkerStrategy } from '../viewModelFactories/alignmentMarking';
21+
22+
export function getDocumentRangePrettyfier(strict: boolean = false, sizeLimitCheker: SizeLimitChecker = null, loggers: ILogger[] = null) {
23+
loggers = loggers || getLoggers();
24+
sizeLimitCheker = sizeLimitCheker || getSizeLimitChecker(loggers);
25+
26+
return new TableDocumentRangePrettyfier(
27+
new TableFactory(
28+
new AlignmentFactory(), new SelectionInterpreter(strict),
29+
new TrimmerTransformer(new BorderTransformer(null))
30+
),
31+
new TableValidator(new SelectionInterpreter(strict)),
32+
new TableViewModelFactory(
33+
new RowViewModelFactory(
34+
new ContentPadCalculator(new PadCalculatorSelector(), " "),
35+
new AlignmentMarkerStrategy(":")
36+
)
37+
),
38+
new TableStringWriter(),
39+
loggers,
40+
sizeLimitCheker
41+
);
42+
}
43+
44+
export function getDocumentPrettyfier(strict: boolean = true): vscode.DocumentFormattingEditProvider {
45+
const loggers = getLoggers();
46+
const sizeLimitCheker = getSizeLimitChecker(loggers);
47+
48+
return new TableDocumentPrettyfier(
49+
new TableFinder(new TableValidator(new SelectionInterpreter(strict))),
50+
getDocumentRangePrettyfier(strict, sizeLimitCheker, loggers),
51+
sizeLimitCheker
52+
);
53+
}
54+
55+
function getLoggers(): ILogger[] {
56+
const canShowWindowMessages = getConfigurationValue<boolean>("showWindowMessages", true);
57+
return [
58+
...(canShowWindowMessages ? [ new VsWindowLogger() ] : []),
59+
new ConsoleLogger()
60+
]
61+
}
62+
63+
function getSizeLimitChecker(loggers: ILogger[]): SizeLimitChecker {
64+
const maxTextLength = getConfigurationValue<number>("maxTextLength", 1000000);
65+
return new SizeLimitChecker(loggers, maxTextLength);
66+
}
67+
68+
function getConfigurationValue<T>(key: string, defaultValue: T): T {
69+
return vscode.workspace.getConfiguration("markdownTablePrettify").get(key, defaultValue);
5470
}

src/extension/sizeLimitCheker.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { ILogger } from "../diagnostics/logger";
2+
3+
export class SizeLimitChecker {
4+
constructor(
5+
private readonly _loggers: ILogger[],
6+
private readonly _maxTextLength: number
7+
){}
8+
9+
public get maxTextLength() : number {
10+
return this._maxTextLength;
11+
}
12+
13+
public isWithinAllowedSizeLimit(text: string): boolean {
14+
const whithinLimit = text.length <= this._maxTextLength;
15+
this.logWhenTooBig(whithinLimit);
16+
return whithinLimit;
17+
}
18+
19+
private logWhenTooBig(whithinLimit: boolean) {
20+
if (!whithinLimit) {
21+
this._loggers.forEach(_ => _.logInfo(`Skipped markdown table prettifying due to text size limit. Configure this in the extension settings (current limit: ${this._maxTextLength} chars).`));
22+
}
23+
}
24+
}
Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
1-
import * as vscode from "vscode";
2-
import { TableDocumentRangePrettyfier } from "./tableDocumentRangePrettyfier";
3-
import { TableFinder } from "../tableFinding/tableFinder";
4-
5-
export class TableDocumentPrettyfier implements vscode.DocumentFormattingEditProvider {
6-
7-
constructor(
8-
private readonly _tableFinder: TableFinder,
9-
private readonly _tableDocumentRangePrettyfier: TableDocumentRangePrettyfier
10-
) { }
11-
12-
public provideDocumentFormattingEdits(document: vscode.TextDocument,
13-
options: vscode.FormattingOptions, token: vscode.CancellationToken): vscode.TextEdit[]
14-
{
15-
let result: vscode.TextEdit[] = [];
16-
let tables: vscode.Range[] = this._tableFinder.getTables(document);
17-
for (let tableRange of tables) {
18-
let edits = this._tableDocumentRangePrettyfier.provideDocumentRangeFormattingEdits(document, tableRange, options, token);
19-
result = result.concat(edits);
20-
}
21-
return result;
22-
}
23-
}
1+
import * as vscode from "vscode";
2+
import { SizeLimitChecker } from "./sizeLimitCheker";
3+
import { TableDocumentRangePrettyfier } from "./tableDocumentRangePrettyfier";
4+
import { TableFinder } from "../tableFinding/tableFinder";
5+
6+
export class TableDocumentPrettyfier implements vscode.DocumentFormattingEditProvider {
7+
8+
constructor(
9+
private readonly _tableFinder: TableFinder,
10+
private readonly _tableDocumentRangePrettyfier: TableDocumentRangePrettyfier,
11+
private readonly _sizeLimitChecker: SizeLimitChecker
12+
) { }
13+
14+
public provideDocumentFormattingEdits(document: vscode.TextDocument,
15+
options: vscode.FormattingOptions, token: vscode.CancellationToken): vscode.TextEdit[]
16+
{
17+
let result: vscode.TextEdit[] = [];
18+
19+
let tables: vscode.Range[] = this._sizeLimitChecker.isWithinAllowedSizeLimit(document.getText())
20+
? this._tableFinder.getTables(document)
21+
: [];
22+
for (let tableRange of tables) {
23+
let edits = this._tableDocumentRangePrettyfier.provideDocumentRangeFormattingEdits(document, tableRange, options, token);
24+
result = result.concat(edits);
25+
}
26+
return result;
27+
}
28+
}
Lines changed: 57 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,58 @@
1-
import * as vscode from "vscode";
2-
import { ILogger } from "../diagnostics/logger";
3-
import { SelectionBasedLogToogler } from "../diagnostics/selectionBasedLogToogler";
4-
import { Table } from "../models/table";
5-
import { TableFactory } from "../modelFactory/tableFactory";
6-
import { TableValidator } from "../modelFactory/tableValidator";
7-
import { TableViewModel } from "../viewModels/tableViewModel";
8-
import { TableViewModelFactory } from "../viewModelFactories/tableViewModelFactory";
9-
import { TableStringWriter } from "../writers/tableStringWriter";
10-
11-
export class TableDocumentRangePrettyfier implements vscode.DocumentRangeFormattingEditProvider {
12-
13-
constructor(
14-
private _tableFactory: TableFactory,
15-
private _tableValidator: TableValidator,
16-
private _viewModelFactory: TableViewModelFactory,
17-
private _writer: TableStringWriter,
18-
private _loggers: ILogger[]
19-
) { }
20-
21-
public provideDocumentRangeFormattingEdits(
22-
document: vscode.TextDocument, range: vscode.Range,
23-
options: vscode.FormattingOptions, token: vscode.CancellationToken) : vscode.TextEdit[]
24-
{
25-
const result: vscode.TextEdit[] = [];
26-
const selection = document.getText(range);
27-
28-
this.toogleLogging(document, range);
29-
let message: string = null;
30-
31-
try {
32-
if (this._tableValidator.isValid(selection)) {
33-
const table: Table = this._tableFactory.getModel(selection);
34-
const tableVm: TableViewModel = this._viewModelFactory.build(table);
35-
const formattedTable: string = this._writer.writeTable(tableVm);
36-
result.push(new vscode.TextEdit(range, formattedTable));
37-
} else {
38-
message = "Can't parse table from invalid text."
39-
}
40-
} catch (ex) {
41-
this._loggers.forEach(_ => _.logError(ex));
42-
}
43-
44-
if (!!message)
45-
this._loggers.forEach(_ => _.logInfo(message));
46-
47-
return result;
48-
}
49-
50-
private toogleLogging(document: vscode.TextDocument, range: vscode.Range) {
51-
const toogler = new SelectionBasedLogToogler(document, range);
52-
toogler.toogleLoggers(this._loggers);
53-
}
1+
import * as vscode from "vscode";
2+
import { SizeLimitChecker } from "./sizeLimitCheker";
3+
import { ILogger } from "../diagnostics/logger";
4+
import { SelectionBasedLogToogler } from "../diagnostics/selectionBasedLogToogler";
5+
import { Table } from "../models/table";
6+
import { TableFactory } from "../modelFactory/tableFactory";
7+
import { TableValidator } from "../modelFactory/tableValidator";
8+
import { TableViewModel } from "../viewModels/tableViewModel";
9+
import { TableViewModelFactory } from "../viewModelFactories/tableViewModelFactory";
10+
import { TableStringWriter } from "../writers/tableStringWriter";
11+
12+
export class TableDocumentRangePrettyfier implements vscode.DocumentRangeFormattingEditProvider {
13+
14+
constructor(
15+
private readonly _tableFactory: TableFactory,
16+
private readonly _tableValidator: TableValidator,
17+
private readonly _viewModelFactory: TableViewModelFactory,
18+
private readonly _writer: TableStringWriter,
19+
private readonly _loggers: ILogger[],
20+
private readonly _sizeLimitChecker: SizeLimitChecker
21+
) { }
22+
23+
public provideDocumentRangeFormattingEdits(
24+
document: vscode.TextDocument, range: vscode.Range,
25+
options: vscode.FormattingOptions, token: vscode.CancellationToken) : vscode.TextEdit[]
26+
{
27+
const result: vscode.TextEdit[] = [];
28+
const selection = document.getText(range);
29+
30+
this.toogleLogging(document, range);
31+
let message: string = null;
32+
33+
try {
34+
if (!this._sizeLimitChecker.isWithinAllowedSizeLimit(selection)) {
35+
return result;
36+
} else if (this._tableValidator.isValid(selection)) {
37+
const table: Table = this._tableFactory.getModel(selection);
38+
const tableVm: TableViewModel = this._viewModelFactory.build(table);
39+
const formattedTable: string = this._writer.writeTable(tableVm);
40+
result.push(new vscode.TextEdit(range, formattedTable));
41+
} else {
42+
message = "Can't parse table from invalid text."
43+
}
44+
} catch (ex) {
45+
this._loggers.forEach(_ => _.logError(ex));
46+
}
47+
48+
if (!!message)
49+
this._loggers.forEach(_ => _.logInfo(message));
50+
51+
return result;
52+
}
53+
54+
private toogleLogging(document: vscode.TextDocument, range: vscode.Range): void {
55+
const toogler = new SelectionBasedLogToogler(document, range);
56+
toogler.toogleLoggers(this._loggers);
57+
}
5458
}

test/stubs/markdownTextDocumentStub.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ export class MarkdownTextDocumentStub implements vscode.TextDocument {
1111
version: number;
1212
isDirty: boolean;
1313
lineCount: number;
14+
isClosed: boolean;
15+
eol: vscode.EndOfLine;
1416

1517
constructor(text: string) {
1618
this.setLines(text);

0 commit comments

Comments
 (0)