pretty-gd-js
Version:
A library that makes GDScript code look pretty.
180 lines (113 loc) • 6.46 kB
Markdown
# pretty.gd for JavaScript

A formatter for GDScript that just works!
## Usage
### Command line
```
$ npm install -g pretty-gd-js
$ pretty-gd --help
Usage: pretty-gd [options] [path] [files...]
Options:
-s, --spaces <size> enforce (or, if -t is also set, convert from) space-based indentation
-t, --tabs enforce tab-based indentation
-p, --stdio read from stdin and write it prettified to stdout
-d, --dir prettify all *.gd files in [path]
-w, --watch automatically prettify any modified *.gd files in [path]
-v, --version display version
-h, --help display help for command
```
### Godot editor
From the terminal/command line, type the following:
```
$ cd path/to/godot/project/
$ pretty-gd -w
Watching ./ for changes...
```
The `-w/--watch` option alone will not check already existing files, but only those that get modified _while_ `pretty-gd -w` is running.
You can add `-d/--dir` to also check existing files, like this: `pretty-gd -d -w`
To disable the annoying "Files have been modified outside Godot" dialog box, go to the following setting and enable it:
`Editor -> Editor Settings -> Text Editor -> Behavior -> Auto Reload Scripts on External Change`
Note that when `pretty-gd` modifies a file, the changes doesn't show up in Godot editor right away. External changes are only detected when the Godot window changes focus.
### JavaScript API
#### Example
```js
import fs from "node:fs"
import Prettifier from "pretty-gd-js"
const prettifier = new Prettifier()
// configure indentation
prettifier.indent_str = "\t"
prettifier.tab_size = 4
let filename = "my_script.gd"
let input = fs.readFileSync(filename)
let output = prettifier.prettify(input) // <- This is the main function
fs.writeFileSync(filename, output + "\n")
```
## Known Issues
- The Godot editor only checks for file changes when the window changes from unfocused to focused. So if you're running `pretty-gd -w` in the background, and it prettifies a script you just saved, you won't see the prettified script until you tab out and back into the editor.
- It seems Godot editor only checks the file timestamp down to the second (at least on some systems), meaning if Godot editor saves a file that then gets changed and resaved externally within the same second, Godot editor doesn't detect it as a change. Hence why `pretty-gd -w` will wait one second before resaving the file.
If you come across any other issues with using this software, please [let me know](https://github.com/poeticAndroid/pretty-gd-js/issues).
## Release Notes
### 2.0.5
- Now using the godot version of `pretty.gd` transpiled from GDscript to JavaScript.
### 1.18.1
- Another bugfix of handling of multiline strings. 🤞
### 1.18.0
- Making sure that lines ending with a `:` is followed by a properly indented line.
- Positive numbers/values can now be signed with a `+`.
- Command line tool renamed to `pretty-gd`. (`pretty.gd` still included as an alias.)
### 1.17.0
- `-a/--auto` option to auto-detect type of indentation on each file, instead of auto-detecting only on the first encountered file and applying it to all files, if neither `-s`, `-t` or `-a` is set.
- `pretty.gd -w` will now prettify a file immediately after detecting a change (which can still take up to a second). Instead of delaying the file write to trigger Godot editor's change detection, `pretty.gd` will write the file straight away and then update it's modification timestamp a second later.
- More strict parsing of number literals.
- A `0` gets added to number literals that start or end with a decimal point or `e`(exponent marker).
- Redundant leading zeroes gets removed from number literals.
- Negative numbers that come after closing brackets`)}]`, strings, names or other numbers are treated as a subtraction of a unsigned number, thus separating the `-` and the number.
- Bugfixed handling of multiline strings, so a string delimiter(`'`, `"`, `'''` or `"""`) can now stand alone on a line and the parser will recognize it as _either_ the beginning _or_ end of a string (and not both).
### 1.16.0
- `match`, `tool`, `onready`, `export`, `setget`, `remote`, `master`, `puppet`, `remotesync`, `mastersync` and `puppetsync` are no longer treated as keywords that has to be surrounded by whitespace.
### 1.15.0
- In `--watch` mode, file changes will be delayed by one second to ensure Godot editor will detect it as an external change.
- Added `--stdio` mode for piping data in and out.
### 1.14.2
- Display version with `--version`.
- Refactored to use ES modules instead of `require`.
- Test tool that [runs in the browser](https://github.com/poeticAndroid/pretty-gd-js/blob/main/test/test.html).
- Fixed bug parsing multi-line strings.
### 1.14.1
- If `--dir` or `--watch` are used without specifying a `path`, it will default to current directory.
- Command-line tool will safely ignore files and folders it cannot access.
### 1.14.0
- Number literals, including hexadecimals, will be corrected to lower case.
- Support for all types of strings, including `r"raw strings"`, `'''triple-single-quoted strings'''` and `%"node strings"`.
- Better handling of multiline strings of any type. API changed slightly.
### 1.13.1
- Command line options to prettify entire folders.
- `not` is no longer treated as a keyword that has to be surrounded by whitespace.
- `{ curly brackets }` are now padded inside.
- Vertical spacing gets adjusted. `func` and `class` declarations get two blank lines above them. Maximum one consecutive blank line everywhere else.
### 1.12.0
- Removed `eol` property. Godot editor always saves with unix-style endings anyway.
### 1.11.3
- The command line tool now actually works
- Command line options
### 1.11.0
- Parse indentation based on visual space, rather than character count
### 1.10.0
- Treat `!` as a sign (like `-` for negative values)
### 1.9.0
- Opening curly brackets is now its own class (which helps with spacing in enums)
### 1.7.0
- Recognize operators longer than one character
- Refactored tokenizer
### 1.3.0
- Added support for `_` in numbers
- Added support for `@annotations`
- Added support for nodepaths starting with `&`, `^` or `%`
### 1.2.0
- Recognizing node paths
### 0.3.0
- Giving keywords some room
### 0.2.0
- Fancy icon!
### 0.1.0
Initial release!