This PR adds two things:
`--debug-print-doc` command that prints the formatted doc
```js
echo "<div><</div>" | ./bin/prettier.js --stdin --debug-print-doc
[
groupConditional(
group([
group([ "<", "div", group([ indent(2, []), softline() ]), ">" ]),
"<",
"</",
"div",
">"
]),
[
group([
group([ "<", "div", group([ indent(2, []), softline() ]), ">" ]),
"<",
"</",
"div",
">"
]),
group([
group([ "<", "div", group([ indent(2, []), softline() ]), ">" ]),
indent(2, groupBreak([ hardline(), "<" ])),
hardline(),
"</",
"div",
">"
])
]
),
";",
hardline()
];
```
The ability to view the IR in real time on the browser display:

The way it works is pretty cool, we take the doc IR and print a valid JavaScript string out of it, that we then send to prettier in order to make it look good :)
80 lines
2.1 KiB
JavaScript
80 lines
2.1 KiB
JavaScript
"use strict";
|
|
|
|
const comments = require("./src/comments");
|
|
const version = require("./package.json").version;
|
|
const printAstToDoc = require("./src/printer").printAstToDoc;
|
|
const printDocToString = require("./src/doc-printer").printDocToString;
|
|
const normalizeOptions = require("./src/options").normalize;
|
|
const parser = require("./src/parser");
|
|
const printDocToDebug = require("./src/doc-debug").printDocToDebug;
|
|
|
|
function parse(text, opts) {
|
|
if (opts.parser === 'flow') {
|
|
return parser.parseWithFlow(text, opts.filename);
|
|
}
|
|
return parser.parseWithBabylon(text);
|
|
}
|
|
|
|
function attachComments(text, ast, opts) {
|
|
if (ast.comments) {
|
|
comments.attach(ast.comments, ast, text);
|
|
ast.comments = [];
|
|
}
|
|
ast.tokens = [];
|
|
opts.originalText = text;
|
|
}
|
|
|
|
function format(text, opts) {
|
|
const ast = parse(text, opts);
|
|
attachComments(text, ast, opts);
|
|
const doc = printAstToDoc(ast, opts);
|
|
const str = printDocToString(doc, opts.printWidth);
|
|
return str;
|
|
}
|
|
|
|
function formatWithShebang(text, opts) {
|
|
if (!text.startsWith("#!")) {
|
|
return format(text, opts);
|
|
}
|
|
|
|
const index = text.indexOf("\n");
|
|
const shebang = text.slice(0, index + 1);
|
|
const programText = text.slice(index + 1);
|
|
const nextChar = text.charAt(index + 1);
|
|
const addNewline = nextChar == "\n" || nextChar == "\r";
|
|
|
|
return shebang + (addNewline ? "\n" : "") + format(programText, opts);
|
|
}
|
|
|
|
module.exports = {
|
|
format: function(text, opts) {
|
|
return formatWithShebang(text, normalizeOptions(opts));
|
|
},
|
|
version: version,
|
|
|
|
__debug: {
|
|
// Doesn't handle shebang for now
|
|
|
|
formatDoc: function(doc, opts) {
|
|
opts = normalizeOptions(opts);
|
|
const debug = printDocToDebug(doc);
|
|
const str = format(debug, opts);
|
|
return str;
|
|
},
|
|
|
|
printToDoc: function(text, opts) {
|
|
opts = normalizeOptions(opts);
|
|
const ast = parse(text, opts);
|
|
attachComments(text, ast, opts);
|
|
const doc = printAstToDoc(ast, opts);
|
|
return doc;
|
|
},
|
|
|
|
printDocToString: function(doc, opts) {
|
|
opts = normalizeOptions(opts);
|
|
const str = printDocToString(doc, opts.printWidth);
|
|
return str;
|
|
}
|
|
}
|
|
};
|