Skip to content

Commit e344c82

Browse files
authored
Merge pull request #41 from darkriszty/feature/cli
Feature/cli
2 parents 4f3485f + 72b8fc7 commit e344c82

82 files changed

Lines changed: 1552 additions & 877 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
66

77
## [Unreleased]
88

9+
## 3.0.0 - 2020-10-06
10+
### Added
11+
- Issue #32: Major refactoring to support CLI. Support `npm run prettify-md` and `npm run check-md`.
12+
- Issue #40: Provide command to run alongside prettier (shortcut `CTRL+ALT+M`).
13+
914
## 2.5.0 - 2020-07-04
1015
### Added
1116
- Issue #30: Add configurable text limit for table formatting

Dockerfile

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
FROM node:current
2+
3+
WORKDIR /app
4+
5+
COPY . .
6+
7+
RUN npm ci
8+
RUN npm run compile
9+
10+
ENTRYPOINT [ "node", "./out/cli/index.js" ]

README.md

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,47 @@ 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 and docker support to prettify 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+
- Locate the installed extension path or download the extension from Github.
24+
- Go to the extension directory.
25+
- Run `npm install`.
26+
- Run `npm run compile`.
27+
28+
The typical 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 prettify a file: `npm run --silent prettify-md < input.md`.
35+
- To prettify 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 check-md < input.md`. This will fail with an exception and return code `1` if the file is not prettyfied.
37+
38+
> Note: the `--silent` switch sets the npm log level to silent, which is useful to hide the executed file name and concentrate on the actual output.
39+
40+
### Formatting with docker
41+
42+
Available features from docker:
43+
- To prettify a file: `docker container run -i darkriszty/prettify-md < input.md`.
44+
- To prettify a file and save the output: `docker container run -i darkriszty/prettify-md < input.md > output.md`.
45+
- To check whether a file is prettyfied or not: `docker container run -i darkriszty/prettify-md --check < input.md`. This will fail with an exception and return code `1` if the file is not prettyfied.
46+
1747
## Extension Settings
1848

19-
The extension is available for markdown language mode. It can either format a selected table (`Format Selection`) or the entire document (`Format Document`).
49+
The extension is available for markdown language mode. It can either prettify a selected table (`Format Selection`) or the entire document (`Format Document`).
50+
A VSCode command called `Prettify markdown tables` is also available to format format the currently opened document.
51+
52+
Configurable settings:
53+
- 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.
54+
- Keyboard shortcut to prettify the currently opened markdown document. Default: CTRL+ALT+M (CMD+ALT+M on Mac).
2055

2156
## Known Issues
2257

cli/cliPrettify.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { MultiTablePrettyfier } from "../src/prettyfiers/multiTablePrettyfier";
2+
import { TableFinder } from "../src/tableFinding/tableFinder";
3+
import { TableValidator } from "../src/modelFactory/tableValidator";
4+
import { SelectionInterpreter } from "../src/modelFactory/selectionInterpreter";
5+
import { TableFactory } from "../src/modelFactory/tableFactory";
6+
import { AlignmentFactory } from "../src/modelFactory/alignmentFactory";
7+
import { TrimmerTransformer } from "../src/modelFactory/transformers/trimmerTransformer";
8+
import { BorderTransformer } from "../src/modelFactory/transformers/borderTransformer";
9+
import { ConsoleLogger } from "../src/diagnostics/consoleLogger";
10+
import { SingleTablePrettyfier } from "../src/prettyfiers/singleTablePrettyfier";
11+
import { NoSizeLimitChecker } from "../src/prettyfiers/sizeLimit/noSizeLimitChecker";
12+
import { TableViewModelFactory } from "../src/viewModelFactories/tableViewModelFactory";
13+
import { RowViewModelFactory } from "../src/viewModelFactories/rowViewModelFactory";
14+
import { ContentPadCalculator } from "../src/padCalculation/contentPadCalculator";
15+
import { PadCalculatorSelector } from "../src/padCalculation/padCalculatorSelector";
16+
import { AlignmentMarkerStrategy } from "../src/viewModelFactories/alignmentMarking";
17+
import { TableStringWriter } from "../src/writers/tableStringWriter";
18+
19+
export class CliPrettify {
20+
21+
public static prettify(text: string): string {
22+
const prettyfier = this.createPrettyfier();
23+
return prettyfier.formatTables(text);
24+
}
25+
26+
public static check(text: string): void {
27+
if (this.prettify(text) !== text) {
28+
throw new Error("The input file is not prettyfied!");
29+
}
30+
}
31+
32+
private static createPrettyfier(): MultiTablePrettyfier {
33+
const logger = new ConsoleLogger();
34+
return new MultiTablePrettyfier(
35+
new TableFinder(new TableValidator(new SelectionInterpreter(true))),
36+
new SingleTablePrettyfier(
37+
new TableFactory(
38+
new AlignmentFactory(),
39+
new SelectionInterpreter(false),
40+
new TrimmerTransformer(new BorderTransformer(null))
41+
),
42+
new TableValidator(new SelectionInterpreter(false)),
43+
new TableViewModelFactory(new RowViewModelFactory(
44+
new ContentPadCalculator(new PadCalculatorSelector(), " "),
45+
new AlignmentMarkerStrategy(":")
46+
)),
47+
new TableStringWriter(),
48+
[ logger ],
49+
new NoSizeLimitChecker()
50+
),
51+
new NoSizeLimitChecker()
52+
);
53+
}
54+
}

cli/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { CliPrettify } from "./cliPrettify";
2+
import { InputReader } from "./inputReader";
3+
4+
const checkOnly = process.argv.length > 2 || process.argv.find(arg => arg === "--check");
5+
6+
InputReader.subscribe(input =>
7+
checkOnly
8+
? CliPrettify.check(input)
9+
: process.stdout.write(CliPrettify.prettify(input))
10+
);

cli/inputReader.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
export class InputReader {
2+
static subscribe(readDone): void {
3+
if (process.stdin.isTTY) {
4+
readDone(process.argv[2] || "");
5+
} else {
6+
let data = "";
7+
process.stdin.setEncoding("utf-8");
8+
9+
process.stdin.on("readable", function() {
10+
let chunk;
11+
while (chunk = process.stdin.read()) {
12+
data += chunk;
13+
}
14+
});
15+
16+
process.stdin.on("end", function () {
17+
data = data.replace(/\n$/, "");
18+
readDone(data);
19+
});
20+
}
21+
}
22+
}

package.json

Lines changed: 17 additions & 3 deletions
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.5.0",
5+
"version": "3.0.0",
66
"publisher": "darkriszty",
77
"repository": {
88
"type": "git",
@@ -38,7 +38,19 @@
3838
"description": "The maximum text length to apply formatting to."
3939
}
4040
}
41-
}
41+
},
42+
"commands": [{
43+
"command": "markdownTablePrettify.prettifyTables",
44+
"title": "Prettify markdown tables"
45+
}],
46+
"keybindings": [
47+
{
48+
"command": "markdownTablePrettify.prettifyTables",
49+
"key": "ctrl+alt+m",
50+
"mac": "cmd+alt+m",
51+
"when": "editorTextFocus && editorLangId == markdown && !editorReadonly && !inCompositeEditor"
52+
}
53+
]
4254
},
4355
"capabilities": {
4456
"documentFormattingProvider": "true"
@@ -47,7 +59,9 @@
4759
"vscode:prepublish": "tsc -p ./",
4860
"compile": "tsc -p ./",
4961
"pretest": "npm run compile",
50-
"test": "gulp copy-systemTest-resources && node ./out/test/index.js"
62+
"test": "gulp copy-systemTest-resources && node ./out/test/index.js",
63+
"prettify-md": "node ./out/cli/index.js",
64+
"check-md": "node ./out/cli/index.js --check"
5165
},
5266
"devDependencies": {
5367
"@types/mocha": "^7.0.2",

src/extension/extension.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
'use strict';
22
import * as vscode from 'vscode';
3-
import { getDocumentRangePrettyfier, getDocumentPrettyfier } from './prettyfierFactory';
3+
import { getDocumentRangePrettyfier, getDocumentPrettyfier, getDocumentPrettyfierCommand } from './prettyfierFactory';
44

55
// This method is called when the extension is activated.
66
// The extension is activated the very first time the command is executed.
77
export function activate(context: vscode.ExtensionContext): void {
88
const MD_MODE: vscode.DocumentFilter = { language: "markdown" };
9+
const command = "markdownTablePrettify.prettifyTables";
910

1011
context.subscriptions.push(
1112
vscode.languages.registerDocumentRangeFormattingEditProvider(MD_MODE, getDocumentRangePrettyfier()),
12-
vscode.languages.registerDocumentFormattingEditProvider(MD_MODE, getDocumentPrettyfier())
13+
vscode.languages.registerDocumentFormattingEditProvider(MD_MODE, getDocumentPrettyfier()),
14+
vscode.commands.registerTextEditorCommand(command, textEditor => getDocumentPrettyfierCommand().prettifyDocument(textEditor))
1315
);
1416
}
1517

src/extension/prettyfierFactory.ts

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as vscode from 'vscode';
2-
import { SizeLimitChecker } from './sizeLimitCheker';
2+
import { ConfigSizeLimitChecker } from '../prettyfiers/sizeLimit/configSizeLimitCheker';
33
import { TableDocumentPrettyfier } from './tableDocumentPrettyfier';
4+
import { TableDocumentPrettyfierCommand } from './tableDocumentPrettyfierCommand';
45
import { TableFinder } from '../tableFinding/tableFinder';
56
import { TableDocumentRangePrettyfier } from "./tableDocumentRangePrettyfier";
67
import { ILogger } from '../diagnostics/logger';
@@ -18,36 +19,56 @@ import { BorderTransformer } from '../modelFactory/transformers/borderTransforme
1819
import { SelectionInterpreter } from '../modelFactory/selectionInterpreter';
1920
import { PadCalculatorSelector } from '../padCalculation/padCalculatorSelector';
2021
import { AlignmentMarkerStrategy } from '../viewModelFactories/alignmentMarking';
22+
import { MultiTablePrettyfier } from '../prettyfiers/multiTablePrettyfier';
23+
import { SingleTablePrettyfier } from '../prettyfiers/singleTablePrettyfier';
2124

22-
export function getDocumentRangePrettyfier(strict: boolean = false, sizeLimitCheker: SizeLimitChecker = null, loggers: ILogger[] = null) {
25+
export function getDocumentRangePrettyfier(strict: boolean = false, sizeLimitCheker: ConfigSizeLimitChecker = null, loggers: ILogger[] = null) {
2326
loggers = loggers || getLoggers();
2427
sizeLimitCheker = sizeLimitCheker || getSizeLimitChecker(loggers);
2528

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-
);
29+
return new TableDocumentRangePrettyfier(getSingleTablePrettyfier(loggers, sizeLimitCheker));
4230
}
4331

4432
export function getDocumentPrettyfier(strict: boolean = true): vscode.DocumentFormattingEditProvider {
4533
const loggers = getLoggers();
4634
const sizeLimitCheker = getSizeLimitChecker(loggers);
4735

4836
return new TableDocumentPrettyfier(
49-
new TableFinder(new TableValidator(new SelectionInterpreter(strict))),
50-
getDocumentRangePrettyfier(strict, sizeLimitCheker, loggers),
37+
new MultiTablePrettyfier(
38+
new TableFinder(new TableValidator(new SelectionInterpreter(strict))),
39+
getSingleTablePrettyfier(loggers, sizeLimitCheker),
40+
sizeLimitCheker
41+
)
42+
);
43+
}
44+
45+
export function getDocumentPrettyfierCommand(): TableDocumentPrettyfierCommand {
46+
const loggers = getLoggers();
47+
const sizeLimitCheker = getSizeLimitChecker(loggers);
48+
49+
return new TableDocumentPrettyfierCommand(
50+
new MultiTablePrettyfier(
51+
new TableFinder(new TableValidator(new SelectionInterpreter(true))),
52+
getSingleTablePrettyfier(loggers, sizeLimitCheker),
53+
sizeLimitCheker
54+
)
55+
);
56+
}
57+
58+
function getSingleTablePrettyfier(loggers: ILogger[], sizeLimitCheker: ConfigSizeLimitChecker): SingleTablePrettyfier {
59+
return new SingleTablePrettyfier(
60+
new TableFactory(
61+
new AlignmentFactory(),
62+
new SelectionInterpreter(false),
63+
new TrimmerTransformer(new BorderTransformer(null))
64+
),
65+
new TableValidator(new SelectionInterpreter(false)),
66+
new TableViewModelFactory(new RowViewModelFactory(
67+
new ContentPadCalculator(new PadCalculatorSelector(), " "),
68+
new AlignmentMarkerStrategy(":")
69+
)),
70+
new TableStringWriter(),
71+
loggers,
5172
sizeLimitCheker
5273
);
5374
}
@@ -60,9 +81,9 @@ function getLoggers(): ILogger[] {
6081
]
6182
}
6283

63-
function getSizeLimitChecker(loggers: ILogger[]): SizeLimitChecker {
84+
function getSizeLimitChecker(loggers: ILogger[]): ConfigSizeLimitChecker {
6485
const maxTextLength = getConfigurationValue<number>("maxTextLength", 1000000);
65-
return new SizeLimitChecker(loggers, maxTextLength);
86+
return new ConfigSizeLimitChecker(loggers, maxTextLength);
6687
}
6788

6889
function getConfigurationValue<T>(key: string, defaultValue: T): T {
Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,25 @@
11
import * as vscode from "vscode";
2-
import { SizeLimitChecker } from "./sizeLimitCheker";
3-
import { TableDocumentRangePrettyfier } from "./tableDocumentRangePrettyfier";
4-
import { TableFinder } from "../tableFinding/tableFinder";
2+
import { MultiTablePrettyfier } from "../prettyfiers/multiTablePrettyfier";
53

64
export class TableDocumentPrettyfier implements vscode.DocumentFormattingEditProvider {
75

86
constructor(
9-
private readonly _tableFinder: TableFinder,
10-
private readonly _tableDocumentRangePrettyfier: TableDocumentRangePrettyfier,
11-
private readonly _sizeLimitChecker: SizeLimitChecker
7+
private readonly _multiTablePrettyfier: MultiTablePrettyfier
128
) { }
139

1410
public provideDocumentFormattingEdits(document: vscode.TextDocument,
1511
options: vscode.FormattingOptions, token: vscode.CancellationToken): vscode.TextEdit[]
1612
{
17-
let result: vscode.TextEdit[] = [];
13+
const formattedDocument: string = this._multiTablePrettyfier.formatTables(document.getText());
1814

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;
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+
];
2724
}
2825
}

0 commit comments

Comments
 (0)