Skip to content

Commit 8b50748

Browse files
committed
Re-use MultiTablePrettyfier logic
1 parent aec56b3 commit 8b50748

10 files changed

Lines changed: 215 additions & 326 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ All notable changes to the `markdowntableprettify` extension will be documented
55
The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).
66

77
## [Unreleased]
8+
- Add cli support
89

910
## 2.5.0 - 2020-07-04
1011
### Added

README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,37 @@ Makes tables more readable for humans. Compatible with the Markdown writer plugi
1111
- Save space by not right-padding the last column if the table has no border.
1212
- Support empty columns inside tables.
1313
- Support column alignment options with ":".
14+
- CLI support to format files.
1415

1516
![feature X](assets/animation.gif)
1617

18+
### CLI formatting
19+
20+
Formatting files or checking if they're already formatted is possible from the command line. This requires `node` and `npm`.
21+
22+
The extension has to be downloaded and compiled:
23+
- Download the extension from git or locate your VSCode installed extension path.
24+
- Go to the extension directory.
25+
- Run `npm install`.
26+
- Run `npm run compile`.
27+
28+
The tipical location of the installed extension (your actual version might differ):
29+
- Windows %USERPROFILE%\.vscode\extensions\darkriszty.markdown-table-prettify-3.0.0
30+
- macOS ~/.vscode/extensions/darkriszty.markdown-table-prettify-3.0.0
31+
- Linux ~/.vscode/extensions/darkriszty.markdown-table-prettify-3.0.0
32+
33+
Available features from the command line:
34+
- To format a file: `npm run --silent prettify-md < input.md`.
35+
- To format a file and save the output: `npm run --silent prettify-md < input.md > output.md`.
36+
- To check whether a file is prettyfied or not: `npm run --silent prettify-md --check < input.md`. This will fail if the file is not prettyfied.
37+
1738
## Extension Settings
1839

1940
The extension is available for markdown language mode. It can either format a selected table (`Format Selection`) or the entire document (`Format Document`).
2041

42+
Configurable settings:
43+
- The maximum texth length of a selection/entire document to consider for formatting. Defaults to 1M chars. There is no limit when running from the command line.
44+
2145
## Known Issues
2246

2347
- Tables with mixed character widths (eg: CJK) are not always properly formatted (issue #4).

cli/inputReader.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export class InputReader {
22
static subscribe(readDone): void {
3+
//TODO: read the "--check" argument
34
if (process.stdin.isTTY) {
45
readDone(process.argv[2] || "");
56
} else {

src/extension/prettyfierFactory.ts

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,36 +18,43 @@ import { BorderTransformer } from '../modelFactory/transformers/borderTransforme
1818
import { SelectionInterpreter } from '../modelFactory/selectionInterpreter';
1919
import { PadCalculatorSelector } from '../padCalculation/padCalculatorSelector';
2020
import { AlignmentMarkerStrategy } from '../viewModelFactories/alignmentMarking';
21+
import { MultiTablePrettyfier } from '../prettyfiers/multiTablePrettyfier';
22+
import { SingleTablePrettyfier } from '../prettyfiers/singleTablePrettyfier';
2123

2224
export function getDocumentRangePrettyfier(strict: boolean = false, sizeLimitCheker: ConfigSizeLimitChecker = null, loggers: ILogger[] = null) {
2325
loggers = loggers || getLoggers();
2426
sizeLimitCheker = sizeLimitCheker || getSizeLimitChecker(loggers);
2527

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-
);
28+
return new TableDocumentRangePrettyfier(getSingleTablePrettyfier(loggers, sizeLimitCheker));
4229
}
4330

4431
export function getDocumentPrettyfier(strict: boolean = true): vscode.DocumentFormattingEditProvider {
4532
const loggers = getLoggers();
4633
const sizeLimitCheker = getSizeLimitChecker(loggers);
4734

4835
return new TableDocumentPrettyfier(
49-
new TableFinder(new TableValidator(new SelectionInterpreter(strict))),
50-
getDocumentRangePrettyfier(strict, sizeLimitCheker, loggers),
36+
new MultiTablePrettyfier(
37+
new TableFinder(new TableValidator(new SelectionInterpreter(strict))),
38+
getSingleTablePrettyfier(loggers, sizeLimitCheker),
39+
sizeLimitCheker
40+
)
41+
);
42+
}
43+
44+
function getSingleTablePrettyfier(loggers: ILogger[], sizeLimitCheker: ConfigSizeLimitChecker): SingleTablePrettyfier {
45+
return new SingleTablePrettyfier(
46+
new TableFactory(
47+
new AlignmentFactory(),
48+
new SelectionInterpreter(false),
49+
new TrimmerTransformer(new BorderTransformer(null))
50+
),
51+
new TableValidator(new SelectionInterpreter(false)),
52+
new TableViewModelFactory(new RowViewModelFactory(
53+
new ContentPadCalculator(new PadCalculatorSelector(), " "),
54+
new AlignmentMarkerStrategy(":")
55+
)),
56+
new TableStringWriter(),
57+
loggers,
5158
sizeLimitCheker
5259
);
5360
}
Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,25 @@
11
import * as vscode from "vscode";
2-
import { SizeLimitChecker } from "../prettyfiers/sizeLimit/sizeLimitChecker";
3-
import { TableDocumentRangePrettyfier } from "./tableDocumentRangePrettyfier";
4-
import { TableFinder } from "../tableFinding/tableFinder";
5-
import { Document } from "../models/doc/document";
6-
import { Range } from "../models/doc/range";
2+
import { MultiTablePrettyfier } from "../prettyfiers/multiTablePrettyfier";
73

84
export class TableDocumentPrettyfier implements vscode.DocumentFormattingEditProvider {
95

106
constructor(
11-
private readonly _tableFinder: TableFinder,
12-
private readonly _tableDocumentRangePrettyfier: TableDocumentRangePrettyfier,
13-
private readonly _sizeLimitChecker: SizeLimitChecker
7+
private readonly _multiTablePrettyfier: MultiTablePrettyfier
148
) { }
159

1610
public provideDocumentFormattingEdits(document: vscode.TextDocument,
1711
options: vscode.FormattingOptions, token: vscode.CancellationToken): vscode.TextEdit[]
1812
{
19-
let result: vscode.TextEdit[] = [];
20-
const input = document.getText();
13+
const formattedDocument: string = this._multiTablePrettyfier.formatTables(document.getText());
2114

22-
if (!this._sizeLimitChecker.isWithinAllowedSizeLimit(input)) {
23-
return result;
24-
}
25-
26-
const doc = new Document(document.getText());
27-
let tableRange: Range = null;
28-
let tableSearchStartLine = 0;
29-
30-
while ((tableRange = this._tableFinder.getNextRange(doc, tableSearchStartLine)) != null) {
31-
const vsCodeRange = new vscode.Range(new vscode.Position(tableRange.startLine, 0), new vscode.Position(tableRange.endLine, Number.MAX_SAFE_INTEGER));
32-
result = result.concat(this._tableDocumentRangePrettyfier.provideDocumentRangeFormattingEdits(document, vsCodeRange, options, token));
33-
tableSearchStartLine = tableRange.endLine + 1;
34-
}
35-
return result;
15+
return [
16+
new vscode.TextEdit(
17+
new vscode.Range(
18+
new vscode.Position(0, 0),
19+
new vscode.Position(document.lineCount - 1, Number.MAX_SAFE_INTEGER)
20+
),
21+
formattedDocument
22+
)
23+
];
3624
}
3725
}
Lines changed: 6 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,21 @@
11
import * as vscode from "vscode";
2-
import { SizeLimitChecker } from "../prettyfiers/sizeLimit/sizeLimitChecker";
3-
import { ILogger } from "../diagnostics/logger";
4-
import { SelectionBasedLogToogler } from "../diagnostics/selectionBasedLogToogler";
52
import { Document } from "../models/doc/document";
63
import { Range } from "../models/doc/range";
7-
import { Table } from "../models/table";
8-
import { TableFactory } from "../modelFactory/tableFactory";
9-
import { TableValidator } from "../modelFactory/tableValidator";
10-
import { TableViewModel } from "../viewModels/tableViewModel";
11-
import { TableViewModelFactory } from "../viewModelFactories/tableViewModelFactory";
12-
import { TableStringWriter } from "../writers/tableStringWriter";
4+
import { SingleTablePrettyfier } from "../prettyfiers/singleTablePrettyfier";
135

146
export class TableDocumentRangePrettyfier implements vscode.DocumentRangeFormattingEditProvider {
157

168
constructor(
17-
private readonly _tableFactory: TableFactory,
18-
private readonly _tableValidator: TableValidator,
19-
private readonly _viewModelFactory: TableViewModelFactory,
20-
private readonly _writer: TableStringWriter,
21-
private readonly _loggers: ILogger[],
22-
private readonly _sizeLimitChecker: SizeLimitChecker
9+
private readonly _singleTablePrettyfier: SingleTablePrettyfier
2310
) { }
2411

2512
public provideDocumentRangeFormattingEdits(
2613
document: vscode.TextDocument, range: vscode.Range,
2714
options: vscode.FormattingOptions, token: vscode.CancellationToken) : vscode.TextEdit[]
2815
{
29-
const result: vscode.TextEdit[] = [];
30-
const selection: string = document.getText(range);
31-
32-
this.toogleLogging(document, range);
33-
let message: string = null;
34-
35-
try {
36-
if (!this._sizeLimitChecker.isWithinAllowedSizeLimit(selection)) {
37-
return result;
38-
} else if (this._tableValidator.isValid(selection)) {
39-
const table: Table = this._tableFactory.getModel(new Document(selection), new Range(range.start.line, range.end.line));
40-
const tableVm: TableViewModel = this._viewModelFactory.build(table);
41-
const formattedTable: string = this._writer.writeTable(tableVm);
42-
result.push(new vscode.TextEdit(range, formattedTable));
43-
} else {
44-
message = "Can't parse table from invalid text."
45-
}
46-
} catch (ex) {
47-
this._loggers.forEach(_ => _.logError(ex));
48-
}
49-
50-
if (!!message)
51-
this._loggers.forEach(_ => _.logInfo(message));
52-
53-
return result;
54-
}
55-
56-
private toogleLogging(document: vscode.TextDocument, range: vscode.Range): void {
57-
const toogler = new SelectionBasedLogToogler(document, range);
58-
toogler.toogleLoggers(this._loggers);
16+
const formattedTable: string = this._singleTablePrettyfier.prettifyTable(
17+
new Document(document.getText()), new Range(range.start.line, range.end.line)
18+
);
19+
return [ new vscode.TextEdit(range, formattedTable) ];
5920
}
6021
}

test/systemTests/vsPrettyfierFromFile.ts

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import * as fs from 'fs';
44
import * as path from 'path';
55
import { ConfigSizeLimitChecker } from '../../src/prettyfiers/sizeLimit/configSizeLimitCheker';
66
import { TableDocumentPrettyfier } from '../../src/extension/tableDocumentPrettyfier';
7-
import { TableDocumentRangePrettyfier } from "../../src/extension/tableDocumentRangePrettyfier";
87
import { ILogger } from "../../src/diagnostics/logger";
98
import { ConsoleLogger } from '../../src/diagnostics/consoleLogger';
109
import { AlignmentFactory } from "../../src/modelFactory/alignmentFactory";
@@ -20,6 +19,8 @@ import { AlignmentMarkerStrategy } from '../../src/viewModelFactories/alignmentM
2019
import { RowViewModelFactory } from "../../src/viewModelFactories/rowViewModelFactory";
2120
import { TableViewModelFactory } from "../../src/viewModelFactories/tableViewModelFactory";
2221
import { TableStringWriter } from "../../src/writers/tableStringWriter";
22+
import { MultiTablePrettyfier } from '../../src/prettyfiers/multiTablePrettyfier';
23+
import { SingleTablePrettyfier } from '../../src/prettyfiers/singleTablePrettyfier';
2324

2425
export class VsPrettyfierFromFile {
2526
private readonly _logger: ILogger;
@@ -67,23 +68,25 @@ export class VsPrettyfierFromFile {
6768

6869
private createPrettyfier(): TableDocumentPrettyfier {
6970
return new TableDocumentPrettyfier(
70-
new TableFinder(new TableValidator(new SelectionInterpreter(true))),
71-
new TableDocumentRangePrettyfier(
72-
new TableFactory(
73-
new AlignmentFactory(),
74-
new SelectionInterpreter(false),
75-
new TrimmerTransformer(new BorderTransformer(null))
71+
new MultiTablePrettyfier(
72+
new TableFinder(new TableValidator(new SelectionInterpreter(true))),
73+
new SingleTablePrettyfier(
74+
new TableFactory(
75+
new AlignmentFactory(),
76+
new SelectionInterpreter(false),
77+
new TrimmerTransformer(new BorderTransformer(null))
78+
),
79+
new TableValidator(new SelectionInterpreter(false)),
80+
new TableViewModelFactory(new RowViewModelFactory(
81+
new ContentPadCalculator(new PadCalculatorSelector(), " "),
82+
new AlignmentMarkerStrategy(":")
83+
)),
84+
new TableStringWriter(),
85+
[ this._logger ],
86+
new ConfigSizeLimitChecker([ this._logger ], 50000)
7687
),
77-
new TableValidator(new SelectionInterpreter(false)),
78-
new TableViewModelFactory(new RowViewModelFactory(
79-
new ContentPadCalculator(new PadCalculatorSelector(), " "),
80-
new AlignmentMarkerStrategy(":")
81-
)),
82-
new TableStringWriter(),
83-
[ this._logger ],
8488
new ConfigSizeLimitChecker([ this._logger ], 50000)
85-
),
86-
new ConfigSizeLimitChecker([ this._logger ], 50000)
89+
)
8790
);
8891
}
8992
}

0 commit comments

Comments
 (0)