prettier-plugin-pegjs v2.0.2
prettier-plugin-pegjs
A prettier plugin for formatting Pegjs grammars. You can try it out online in the playground
Intro
Prettier is an opinionated code formatter. It enforces a consistent style by parsing your code and re-printing it with its own rules that take the maximum line length into account, wrapping code when necessary.
This plugin adds support for the Pegjs language to Prettier.
Input
Expression = head:Term tail:(_("+"/"-")_ Term) * {
return tail.reduce(function(result, element) {if (element[1] === "+") { return result + element[3]; }
if (element[1] === "-") { return result - element[3]; }
}, head)}Output
Expression
= head:Term tail:(_ "+" / "-" _ Term)* {
return tail.reduce(function (result, element) {
if (element[1] === "+") {
return result + element[3];
}
if (element[1] === "-") {
return result - element[3];
}
}, head);
}Install
yarn:
yarn add --dev prettier prettier-plugin-pegjs
# or globally
yarn global add prettier prettier-plugin-pegjsnpm:
npm install --save-dev prettier prettier-plugin-pegjs
# or globally
npm install --global prettier prettier-plugin-pegjsUse
With Node.js
If you installed prettier as a local dependency, you can add prettier as a
script in your package.json,
{
"scripts": {
"prettier": "prettier"
}
}and then run it via
yarn run prettier path/to/grammar.pegjs --write
# or
npm run prettier path/to/grammar.pegjs --writeIf you installed globally, run
prettier path/to/grammar.pegjs --writeIn the Browser
This package exposes a standalone.ts that wraps prettier and exports a
printPrettier function that can be called as
printPrettier(YOUR_CODE, {
// example option
tabWidth: 2,
});Options
The standard Prettier options (such as tabWidth) can be used. Additionally,
you may set actionParser to specify how the code inside a Pegjs action is
printed. actionParser can be the parser from any valid Prettier plugin.
It defaults to "babel-ts" for Javascript and Typescript, but it could be set
to a different parser if your actions are written in a different language/dialect.
Development
To make a production build, run
npm run buildTo develop, run
npm run watchYou can then execute Prettier with
prettier --plugin-search-dir=./ ...or
prettier --plugin=./build/prettier-plugin-pegjs.js ...and the Pegjs plugin will load from the current directory.
Code structure
prettier-plugin-pegjs uses a Pegjs grammar (located in grammars/)
to parse Pegjs grammars! This grammar is slightly modified from Pegjs's
official grammar to include delimiters and strings as AST nodes.
For example, the = in Rule = a / b is assigned an AST node.
This is so that prettier-plugin-pegjs can use Prettier's automatic
comment placement algorithm, which searches through the AST and places comments
based on an AST node's start and end position.
prettier-plugin-pegjs uses webpack to dynamically compile imported
Pegjs grammars, so they can be used like native ES6 imports, though
of course they are not.
The plugin is organized as follows:
prettier-plugin-pegjs.tsThis file exports the objects required of a Prettier plugin.standalone.tsThis file wraps the Prettier parser and pre-loadsprettier-plugin-pegjsas a plugin.grammars/pegjs.peggyThe Pegjs grammar that parsers Pegjs/Peggy grammars.libs/parser.tsThe parser which loads a Pegjs-created parser and creates an AST from a string.libs/printer.tsPrinters take an AST and produce a Doc (the intermediate format that Prettier uses). This is where most of the details of the plugin lie.