Merge branch 'master' into master

This commit is contained in:
Glavin Wiechert 2017-06-17 23:28:15 -03:00 committed by GitHub
commit c360b256bd
37 changed files with 1769 additions and 596 deletions

View File

@ -23,6 +23,13 @@ go:
matrix: matrix:
include: include:
- os: linux
dist: trusty
sudo: required
services:
- docker
env:
- ATOM_CHANNEL=stable
# - os: linux # - os: linux
# dist: trusty # dist: trusty
# sudo: require # sudo: require
@ -78,7 +85,7 @@ before_install:
git clone --depth=1 https://github.com/Linuxbrew/brew.git ~/.linuxbrew || true; git clone --depth=1 https://github.com/Linuxbrew/brew.git ~/.linuxbrew || true;
fi fi
# Update Homebrew # Update Homebrew
- brew update # - brew update
- brew tap homebrew/dupes - brew tap homebrew/dupes
- brew tap homebrew/versions - brew tap homebrew/versions
# Ruby language support # Ruby language support
@ -87,7 +94,11 @@ before_install:
- gem install htmlbeautifier - gem install htmlbeautifier
- gem install puppet-lint - gem install puppet-lint
# Sass language support # Sass language support
- gem install sass - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
gem install sass;
else
docker pull unibeautify/sass-convert;
fi
# Python language support # Python language support
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo chmod 777 -R /opt/python; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo chmod 777 -R /opt/python; fi
- pip install --upgrade pip - pip install --upgrade pip
@ -96,10 +107,19 @@ before_install:
# SQL language support # SQL language support
- pip install --upgrade sqlparse - pip install --upgrade sqlparse
# Java, C, C++, C#, Objective-C, D, Pawn, Vala # Java, C, C++, C#, Objective-C, D, Pawn, Vala
- brew install uncrustify - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
brew install uncrustify;
else
docker pull unibeautify/uncrustify;
fi
# R # R
- brew tap homebrew/science - brew tap homebrew/science
- brew install r - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
brew install r;
rscript --version;
else
docker pull unibeautify/rscript;
fi
# PHP # PHP
- brew tap homebrew/homebrew-php - brew tap homebrew/homebrew-php
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
@ -122,11 +142,12 @@ before_install:
# - stack install stylish-haskell # - stack install stylish-haskell
# Elm # Elm
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
curl -L -o /tmp/elm-format.tgz https://github.com/avh4/elm-format/releases/download/0.2.0-alpha/elm-format-0.2.0-alpha-mac-x64.tgz; curl -L -o /tmp/elm-format.tgz
https://github.com/avh4/elm-format/releases/download/0.7.0-exp/elm-format-0.17-0.7.0-exp-mac-x64.tgz;
tar xvzf /tmp/elm-format.tgz -C /usr/local/bin; tar xvzf /tmp/elm-format.tgz -C /usr/local/bin;
fi fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
curl -L -o /tmp/elm-format.tgz https://github.com/avh4/elm-format/releases/download/0.2.0-alpha/elm-format-0.2.0-alpha-linux-x64.tgz; curl -L -o /tmp/elm-format.tgz https://github.com/avh4/elm-format/releases/download/0.7.0-exp/elm-format-0.17-0.7.0-exp-linux-x64.tgz;
tar xvzf /tmp/elm-format.tgz -C $HOME/.linuxbrew/bin; tar xvzf /tmp/elm-format.tgz -C $HOME/.linuxbrew/bin;
fi fi
# OCaml # OCaml

View File

@ -1,8 +1,11 @@
# Next # Next
- Fix [#1652](https://github.com/Glavin001/atom-beautify/issues/1652) and [#1653](https://github.com/Glavin001/atom-beautify/issues/1653). Add `.rb` to temp files passed in to the `rubocop` executable so they are not excluded.
- Fix [#1703](https://github.com/Glavin001/atom-beautify/issues/1703). Now Fortran 2003/2008 file extensions are available for Fortran beautifier. - Fix [#1703](https://github.com/Glavin001/atom-beautify/issues/1703). Now Fortran 2003/2008 file extensions are available for Fortran beautifier.
- ... - ...
# v0.30.0 (2017-06-17)
- Close [#1687](https://github.com/Glavin001/atom-beautify/issues/1687). Introducing Executables with Docker support! Executables wrap any non-preinstalled application, check if it is installed, and provide additional configuration options, including Docker support! See [#1687](https://github.com/Glavin001/atom-beautify/issues/1687) for more information.
- Fix [#1652](https://github.com/Glavin001/atom-beautify/issues/1652) and [#1653](https://github.com/Glavin001/atom-beautify/issues/1653). Add `.rb` to temp files passed in to the `rubocop` executable so they are not excluded.
# v0.29.26 (2017-05-28) # v0.29.26 (2017-05-28)
- Fix #116. Switch from setText to setTextViaDiff, preserve folds - Fix #116. Switch from setText to setTextViaDiff, preserve folds
- Add more perl filetypes (#1603) - Add more perl filetypes (#1603)

46
CODE_OF_CONDUCT.md Normal file
View File

@ -0,0 +1,46 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at glavin.wiechert@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View File

@ -1,4 +1,5 @@
# :lipstick: [{{package.name}}](https://github.com/Glavin001/atom-beautify) # :lipstick: [{{package.name}}](https://github.com/Glavin001/atom-beautify)
[![Greenkeeper badge](https://badges.greenkeeper.io/Glavin001/atom-beautify.svg)](https://greenkeeper.io/)
[![GitHub issues](https://img.shields.io/github/issues/Glavin001/atom-beautify.svg?style=flat-square)](https://github.com/Glavin001/atom-beautify/issues) [![GitHub issues](https://img.shields.io/github/issues/Glavin001/atom-beautify.svg?style=flat-square)](https://github.com/Glavin001/atom-beautify/issues)
[![GitHub stars](https://img.shields.io/github/stars/Glavin001/atom-beautify.svg?style=flat-square)](https://github.com/Glavin001/atom-beautify/stargazers) [![GitHub stars](https://img.shields.io/github/stars/Glavin001/atom-beautify.svg?style=flat-square)](https://github.com/Glavin001/atom-beautify/stargazers)
[![Gitter](https://img.shields.io/gitter/room/Glavin001/atom-beautify.svg?style=flat-square)](https://gitter.im/Glavin001/atom-beautify) [![Gitter](https://img.shields.io/gitter/room/Glavin001/atom-beautify.svg?style=flat-square)](https://gitter.im/Glavin001/atom-beautify)

225
README.md
View File

@ -1,4 +1,5 @@
# :lipstick: [atom-beautify](https://github.com/Glavin001/atom-beautify) # :lipstick: [atom-beautify](https://github.com/Glavin001/atom-beautify)
[![Greenkeeper badge](https://badges.greenkeeper.io/Glavin001/atom-beautify.svg)](https://greenkeeper.io/)
[![GitHub issues](https://img.shields.io/github/issues/Glavin001/atom-beautify.svg?style=flat-square)](https://github.com/Glavin001/atom-beautify/issues) [![GitHub issues](https://img.shields.io/github/issues/Glavin001/atom-beautify.svg?style=flat-square)](https://github.com/Glavin001/atom-beautify/issues)
[![GitHub stars](https://img.shields.io/github/stars/Glavin001/atom-beautify.svg?style=flat-square)](https://github.com/Glavin001/atom-beautify/stargazers) [![GitHub stars](https://img.shields.io/github/stars/Glavin001/atom-beautify.svg?style=flat-square)](https://github.com/Glavin001/atom-beautify/stargazers)
[![Gitter](https://img.shields.io/gitter/room/Glavin001/atom-beautify.svg?style=flat-square)](https://gitter.im/Glavin001/atom-beautify) [![Gitter](https://img.shields.io/gitter/room/Glavin001/atom-beautify.svg?style=flat-square)](https://gitter.im/Glavin001/atom-beautify)
@ -67,53 +68,53 @@ See [`unibeautify` branch](../../tree/unibeautify) for work in progress and [Iss
Some of the supported beautifiers are developed for Node.js and are automatically installed when Atom-Beautify is installed. However, other beautifiers are command-line interface (CLI) applications and require you to manually install them. Some of the supported beautifiers are developed for Node.js and are automatically installed when Atom-Beautify is installed. However, other beautifiers are command-line interface (CLI) applications and require you to manually install them.
| Beautifier | Is Pre-Installed? | Installation Instructions | | Beautifier | Preinstalled | [:whale: Docker](https://www.docker.com/) | Installation |
| --- | --- | --- | | --- | --- | --- |--- |
| align-yaml | :white_check_mark: | Nothing! | | align-yaml | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| autopep8 | :x: | Go to https://github.com/hhatto/autopep8 and follow the instructions. | | autopep8 | :warning: 2 executables | :warning: Only 1 of 2 executables | :whale: With [Docker](https://www.docker.com/):<br/>1. Install [autopep8 (`autopep8`)](https://github.com/hhatto/autopep8) with `docker pull unibeautify/autopep8`<br/><br/>:bookmark_tabs: Manually:<br/>1. Install [autopep8 (`autopep8`)](https://github.com/hhatto/autopep8) by following https://github.com/hhatto/autopep8#installation<br/>2. Install [isort (`isort`)](https://github.com/timothycrosley/isort) by following https://github.com/timothycrosley/isort#installing-isort<br/> |
| beautysh | :x: | Go to https://github.com/bemeurer/beautysh and follow the instructions. | | beautysh | :warning: 1 executable | :white_check_mark: :100:% of executables | :whale: With [Docker](https://www.docker.com/):<br/>1. Install [beautysh (`beautysh`)](https://github.com/bemeurer/beautysh) with `docker pull unibeautify/beautysh`<br/><br/>:bookmark_tabs: Manually:<br/>1. Install [beautysh (`beautysh`)](https://github.com/bemeurer/beautysh) by following https://github.com/bemeurer/beautysh#installation<br/> |
| clang-format | :x: | Go to https://clang.llvm.org/docs/ClangFormat.html and follow the instructions. | | clang-format | :warning: 1 executable | :white_check_mark: :100:% of executables | :whale: With [Docker](https://www.docker.com/):<br/>1. Install [ClangFormat (`clang-format`)](https://clang.llvm.org/docs/ClangFormat.html) with `docker pull unibeautify/clang-format`<br/><br/>:bookmark_tabs: Manually:<br/>1. Install [ClangFormat (`clang-format`)](https://clang.llvm.org/docs/ClangFormat.html) by following https://clang.llvm.org/docs/ClangFormat.html<br/> |
| cljfmt | :white_check_mark: | Nothing! | | cljfmt | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| Coffee Formatter | :white_check_mark: | Nothing! | | Coffee Formatter | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| coffee-fmt | :white_check_mark: | Nothing! | | coffee-fmt | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| Crystal | :x: | Go to http://crystal-lang.org and follow the instructions. | | Crystal | :warning: 1 executable | :white_check_mark: :100:% of executables | :whale: With [Docker](https://www.docker.com/):<br/>1. Install [Crystal (`crystal`)](http://crystal-lang.org) with `docker pull unibeautify/crystal`<br/><br/>:bookmark_tabs: Manually:<br/>1. Install [Crystal (`crystal`)](http://crystal-lang.org) by following https://crystal-lang.org/docs/installation/<br/> |
| CSScomb | :white_check_mark: | Nothing! | | CSScomb | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| dfmt | :x: | Go to https://github.com/Hackerpilot/dfmt and follow the instructions. | | dfmt | :warning: 1 executable | :x: No Docker support | :bookmark_tabs: Manually:<br/>1. Install [Dfmt (`dfmt`)](https://github.com/Hackerpilot/dfmt) by following https://github.com/dlang-community/dfmt#building<br/> |
| elm-format | :x: | Go to https://github.com/avh4/elm-format and follow the instructions. | | elm-format | :warning: 1 executable | :white_check_mark: :100:% of executables | :whale: With [Docker](https://www.docker.com/):<br/>1. Install [elm-format (`elm-format`)](https://github.com/avh4/elm-format) with `docker pull unibeautify/elm-format`<br/><br/>:bookmark_tabs: Manually:<br/>1. Install [elm-format (`elm-format`)](https://github.com/avh4/elm-format) by following https://github.com/avh4/elm-format#installation-<br/> |
| erl_tidy | :x: | Go to http://erlang.org/doc/man/erl_tidy.html and follow the instructions. | | erl_tidy | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to http://erlang.org/doc/man/erl_tidy.html and follow the instructions. |
| ESLint Fixer | :white_check_mark: | Nothing! | | ESLint Fixer | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| formatR | :x: | Go to https://github.com/yihui/formatR and follow the instructions. | | formatR | :warning: 1 executable | :white_check_mark: :100:% of executables | :whale: With [Docker](https://www.docker.com/):<br/>1. Install [Rscript (`rscript`)](https://github.com/yihui/formatR) with `docker pull unibeautify/rscript`<br/><br/>:bookmark_tabs: Manually:<br/>1. Install [Rscript (`rscript`)](https://github.com/yihui/formatR) by following https://github.com/yihui/formatR<br/> |
| Fortran Beautifier | :x: | Go to https://www.gnu.org/software/emacs/ and follow the instructions. | | Fortran Beautifier | :warning: 1 executable | :x: No Docker support | :bookmark_tabs: Manually:<br/>1. Install [Emacs (`emacs`)](https://www.gnu.org/software/emacs/) by following https://www.gnu.org/software/emacs/<br/> |
| Gherkin formatter | :white_check_mark: | Nothing! | | Gherkin formatter | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| gofmt | :x: | Go to https://golang.org/cmd/gofmt/ and follow the instructions. | | gofmt | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to https://golang.org/cmd/gofmt/ and follow the instructions. |
| hh_format | :x: | Go to http://hhvm.com/ and follow the instructions. | | hh_format | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to http://hhvm.com/ and follow the instructions. |
| HTML Beautifier | :x: | Go to https://github.com/threedaymonk/htmlbeautifier and follow the instructions. | | HTML Beautifier | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to https://github.com/threedaymonk/htmlbeautifier and follow the instructions. |
| JS Beautify | :white_check_mark: | Nothing! | | JS Beautify | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| JSCS Fixer | :white_check_mark: | Nothing! | | JSCS Fixer | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| Latex Beautify | :x: | Go to https://github.com/cmhughes/latexindent.pl and follow the instructions. | | Latex Beautify | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to https://github.com/cmhughes/latexindent.pl and follow the instructions. |
| Lua beautifier | :x: | Go to https://www.perl.org/ and follow the instructions. | | Lua beautifier | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| Marko Beautifier | :white_check_mark: | Nothing! | | Marko Beautifier | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| Nginx Beautify | :white_check_mark: | Nothing! | | Nginx Beautify | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| ocp-indent | :x: | Go to https://www.typerex.org/ocp-indent.html and follow the instructions. | | ocp-indent | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to https://www.typerex.org/ocp-indent.html and follow the instructions. |
| Perltidy | :x: | Go to http://perltidy.sourceforge.net/ and follow the instructions. | | Perltidy | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to http://perltidy.sourceforge.net/ and follow the instructions. |
| PHP-CS-Fixer | :x: | Go to https://github.com/FriendsOfPHP/PHP-CS-Fixer and follow the instructions. | | PHP-CS-Fixer | :warning: 2 executables | :warning: Only 1 of 2 executables | :whale: With [Docker](https://www.docker.com/):<br/>1. Install [PHP-CS-Fixer (`php-cs-fixer`)](https://github.com/FriendsOfPHP/PHP-CS-Fixer) with `docker pull unibeautify/php-cs-fixer`<br/><br/>:bookmark_tabs: Manually:<br/>1. Install [PHP (`php`)](http://php.net/) by following http://php.net/manual/en/install.php<br/>2. Install [PHP-CS-Fixer (`php-cs-fixer`)](https://github.com/FriendsOfPHP/PHP-CS-Fixer) by following https://github.com/FriendsOfPHP/PHP-CS-Fixer#installation<br/> |
| PHPCBF | :x: | Go to http://php.net/manual/en/install.php and follow the instructions. | | PHPCBF | :warning: 1 executable | :white_check_mark: :100:% of executables | :whale: With [Docker](https://www.docker.com/):<br/>1. Install [PHPCBF (`phpcbf`)](https://github.com/squizlabs/PHP_CodeSniffer) with `docker pull unibeautify/phpcbf`<br/><br/>:bookmark_tabs: Manually:<br/>1. Install [PHPCBF (`phpcbf`)](https://github.com/squizlabs/PHP_CodeSniffer) by following https://github.com/squizlabs/PHP_CodeSniffer#installation<br/> |
| Pretty Diff | :white_check_mark: | Nothing! | | Pretty Diff | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| Pug Beautify | :white_check_mark: | Nothing! | | Pug Beautify | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| puppet-lint | :x: | Go to http://puppet-lint.com/ and follow the instructions. | | puppet-lint | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to http://puppet-lint.com/ and follow the instructions. |
| pybeautifier | :x: | Go to https://github.com/guyskk/pybeautifier and follow the instructions. | | pybeautifier | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to https://github.com/guyskk/pybeautifier and follow the instructions. |
| Remark | :white_check_mark: | Nothing! | | Remark | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| Rubocop | :x: | Go to https://github.com/bbatsov/rubocop and follow the instructions. | | Rubocop | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to https://github.com/bbatsov/rubocop and follow the instructions. |
| Ruby Beautify | :x: | Go to https://github.com/erniebrodeur/ruby-beautify and follow the instructions. | | Ruby Beautify | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to https://github.com/erniebrodeur/ruby-beautify and follow the instructions. |
| rustfmt | :x: | Go to https://github.com/nrc/rustfmt and follow the instructions. | | rustfmt | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to https://github.com/nrc/rustfmt and follow the instructions. |
| SassConvert | :x: | Go to http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax and follow the instructions. | | SassConvert | :warning: 1 executable | :white_check_mark: :100:% of executables | :whale: With [Docker](https://www.docker.com/):<br/>1. Install [SassConvert (`sass-convert`)](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax) with `docker pull unibeautify/sass-convert`<br/><br/>:bookmark_tabs: Manually:<br/>1. Install [SassConvert (`sass-convert`)](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax) by following http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax<br/> |
| sqlformat | :x: | Go to https://github.com/andialbrecht/sqlparse and follow the instructions. | | sqlformat | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to https://github.com/andialbrecht/sqlparse and follow the instructions. |
| stylish-haskell | :x: | Go to https://github.com/jaspervdj/stylish-haskell and follow the instructions. | | stylish-haskell | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to https://github.com/jaspervdj/stylish-haskell and follow the instructions. |
| Tidy Markdown | :white_check_mark: | Nothing! | | Tidy Markdown | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| TypeScript Formatter | :white_check_mark: | Nothing! | | TypeScript Formatter | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| Uncrustify | :x: | Go to https://github.com/uncrustify/uncrustify and follow the instructions. | | Uncrustify | :warning: 1 executable | :white_check_mark: :100:% of executables | :whale: With [Docker](https://www.docker.com/):<br/>1. Install [Uncrustify (`uncrustify`)](http://uncrustify.sourceforge.net/) with `docker pull unibeautify/uncrustify`<br/><br/>:bookmark_tabs: Manually:<br/>1. Install [Uncrustify (`uncrustify`)](http://uncrustify.sourceforge.net/) by following https://github.com/uncrustify/uncrustify<br/> |
| Vue Beautifier | :white_check_mark: | Nothing! | | Vue Beautifier | :white_check_mark: | :ok_hand: Not necessary | :smiley: Nothing! |
| yapf | :x: | Go to https://github.com/google/yapf and follow the instructions. | | yapf | :warning: Manual installation | :construction: Not an executable | :page_facing_up: Go to https://github.com/google/yapf and follow the instructions. |
## Language Support ## Language Support
@ -121,71 +122,71 @@ See [all supported options in the documentation at `docs/options.md`](docs/opti
| Language | Grammars | File Extensions | Supported Beautifiers | | Language | Grammars | File Extensions | Supported Beautifiers |
| --- | --- | --- | ---- | | --- | --- | --- | ---- |
| Apex | `Apex` |`.cls`, `.trigger` | [`Uncrustify`](https://github.com/uncrustify/uncrustify) (Default) | | Apex | `Apex` |`.cls`, `.trigger` | **[`Uncrustify`](https://github.com/uncrustify/uncrustify)** |
| Arduino | `Arduino` |`.ino`, `.pde` | [`Uncrustify`](https://github.com/uncrustify/uncrustify) (Default) | | Arduino | `Arduino` |`.ino`, `.pde` | **[`Uncrustify`](https://github.com/uncrustify/uncrustify)** |
| Bash | `Shell Script` |`.bash`, `.sh` | [`beautysh`](https://github.com/bemeurer/beautysh) (Default) | | Bash | `Shell Script` |`.bash`, `.sh` | **[`beautysh`](https://github.com/bemeurer/beautysh)** |
| C | `C`, `opencl` |`.h`, `.c`, `.cl` | [`Uncrustify`](https://github.com/uncrustify/uncrustify) (Default), [`clang-format`](https://clang.llvm.org/docs/ClangFormat.html) | | C | `C`, `opencl` |`.h`, `.c`, `.cl` | **[`Uncrustify`](https://github.com/uncrustify/uncrustify)**, [`clang-format`](https://clang.llvm.org/docs/ClangFormat.html) |
| Coldfusion | `html` |`.cfm`, `.cfml`, `.cfc` | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | Coldfusion | `html` |`.cfm`, `.cfml`, `.cfc` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| Clojure | `Clojure` |`.clj`, `.cljs`, `.edn` | [`cljfmt`](https://github.com/snoe/node-cljfmt) (Default) | | Clojure | `Clojure` |`.clj`, `.cljs`, `.edn` | **[`cljfmt`](https://github.com/snoe/node-cljfmt)** |
| CoffeeScript | `CoffeeScript` |`.coffee` | [`Coffee Formatter`](https://github.com/Glavin001/Coffee-Formatter), [`coffee-fmt`](https://github.com/sterpe/coffee-fmt) (Default) | | CoffeeScript | `CoffeeScript` |`.coffee` | **[`coffee-fmt`](https://github.com/sterpe/coffee-fmt)**, [`Coffee Formatter`](https://github.com/Glavin001/Coffee-Formatter) |
| C++ | `C++` |`.h`, `.hh`, `.cc`, `.cpp`, `.cxx`, `.C`, `.cu`, `.c++`, `.hpp`, `.hxx`, `.h++`, `.cuh` | [`Uncrustify`](https://github.com/uncrustify/uncrustify) (Default), [`clang-format`](https://clang.llvm.org/docs/ClangFormat.html) | | C++ | `C++` |`.h`, `.hh`, `.cc`, `.cpp`, `.cxx`, `.C`, `.cu`, `.c++`, `.hpp`, `.hxx`, `.h++`, `.cuh` | **[`Uncrustify`](https://github.com/uncrustify/uncrustify)**, [`clang-format`](https://clang.llvm.org/docs/ClangFormat.html) |
| Crystal | `Crystal` |`.cr` | [`Crystal`](http://crystal-lang.org) (Default) | | Crystal | `Crystal` |`.cr` | **[`Crystal`](http://crystal-lang.org)** |
| C# | `C#` |`.cs` | [`Uncrustify`](https://github.com/uncrustify/uncrustify) (Default) | | C# | `C#` |`.cs` | **[`Uncrustify`](https://github.com/uncrustify/uncrustify)** |
| CSS | `CSS` |`.css` | [`CSScomb`](https://github.com/csscomb/csscomb.js), [`JS Beautify`](https://github.com/beautify-web/js-beautify) (Default), [`Pretty Diff`](https://github.com/prettydiff/prettydiff), [`SassConvert`](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax) | | CSS | `CSS` |`.css` | **[`JS Beautify`](https://github.com/beautify-web/js-beautify)**, [`CSScomb`](https://github.com/csscomb/csscomb.js), [`Pretty Diff`](https://github.com/prettydiff/prettydiff), [`SassConvert`](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax) |
| CSV | `CSV` |`.csv` | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | CSV | `CSV` |`.csv` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| D | `D` |`.d` | [`Uncrustify`](https://github.com/uncrustify/uncrustify) (Default), [`dfmt`](https://github.com/Hackerpilot/dfmt) | | D | `D` |`.d` | **[`Uncrustify`](https://github.com/uncrustify/uncrustify)**, [`dfmt`](https://github.com/Hackerpilot/dfmt) |
| EJS | `EJS`, `JavaScript Template`, `HTML (Angular)` |`.ejs` | [`JS Beautify`](https://github.com/beautify-web/js-beautify) (Default), [`Pretty Diff`](https://github.com/prettydiff/prettydiff) | | EJS | `EJS`, `JavaScript Template`, `HTML (Angular)` |`.ejs` | **[`JS Beautify`](https://github.com/beautify-web/js-beautify)**, [`Pretty Diff`](https://github.com/prettydiff/prettydiff) |
| Elm | `Elm` |`.elm` | [`elm-format`](https://github.com/avh4/elm-format) (Default) | | Elm | `Elm` |`.elm` | **[`elm-format`](https://github.com/avh4/elm-format)** |
| ERB | `HTML (Ruby - ERB)`, `HTML (Rails)` |`.erb` | [`HTML Beautifier`](https://github.com/threedaymonk/htmlbeautifier), [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | ERB | `HTML (Ruby - ERB)`, `HTML (Rails)` |`.erb` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)**, [`HTML Beautifier`](https://github.com/threedaymonk/htmlbeautifier) |
| Erlang | `Erlang` |`.erl` | [`erl_tidy`](http://erlang.org/doc/man/erl_tidy.html) (Default) | | Erlang | `Erlang` |`.erl` | **[`erl_tidy`](http://erlang.org/doc/man/erl_tidy.html)** |
| Fortran | `Fortran - Modern` |`.f90`, `.F90`, `.f95`, `.F95` | [`Fortran Beautifier`](https://www.gnu.org/software/emacs/) (Default) | | Fortran | `Fortran - Modern` |`.f90`, `.F90`, `.f95`, `.F95` | **[`Fortran Beautifier`](https://www.gnu.org/software/emacs/)** |
| gherkin | `Gherkin` |`.feature` | [`Gherkin formatter`](https://github.com/Glavin001/atom-beautify/blob/master/src/beautifiers/gherkin.coffee) (Default) | | gherkin | `Gherkin` |`.feature` | **[`Gherkin formatter`](https://github.com/Glavin001/atom-beautify/blob/master/src/beautifiers/gherkin.coffee)** |
| GLSL | `C`, `opencl`, `GLSL` |`.vert`, `.frag` | [`clang-format`](https://clang.llvm.org/docs/ClangFormat.html) (Default) | | GLSL | `C`, `opencl`, `GLSL` |`.vert`, `.frag` | **[`clang-format`](https://clang.llvm.org/docs/ClangFormat.html)** |
| Go | `Go` |`.go` | [`gofmt`](https://golang.org/cmd/gofmt/) (Default) | | Go | `Go` |`.go` | **[`gofmt`](https://golang.org/cmd/gofmt/)** |
| Golang Template | `HTML (Go)`, `Go Template` |`.gohtml` | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | Golang Template | `HTML (Go)`, `Go Template` |`.gohtml` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| Handlebars | `Handlebars`, `HTML (Handlebars)` |`.hbs`, `.handlebars` | [`JS Beautify`](https://github.com/beautify-web/js-beautify) (Default), [`Pretty Diff`](https://github.com/prettydiff/prettydiff) | | Handlebars | `Handlebars`, `HTML (Handlebars)` |`.hbs`, `.handlebars` | **[`JS Beautify`](https://github.com/beautify-web/js-beautify)**, [`Pretty Diff`](https://github.com/prettydiff/prettydiff) |
| Haskell | `Haskell` |`.hs` | [`stylish-haskell`](https://github.com/jaspervdj/stylish-haskell) (Default) | | Haskell | `Haskell` |`.hs` | **[`stylish-haskell`](https://github.com/jaspervdj/stylish-haskell)** |
| HTML | `HTML` |`.html` | [`JS Beautify`](https://github.com/beautify-web/js-beautify) (Default), [`Pretty Diff`](https://github.com/prettydiff/prettydiff) | | HTML | `HTML` |`.html` | **[`JS Beautify`](https://github.com/beautify-web/js-beautify)**, [`Pretty Diff`](https://github.com/prettydiff/prettydiff) |
| Jade | `Jade`, `Pug` |`.jade`, `.pug` | [`Pug Beautify`](https://github.com/vingorius/pug-beautify) (Default) | | Jade | `Jade`, `Pug` |`.jade`, `.pug` | **[`Pug Beautify`](https://github.com/vingorius/pug-beautify)** |
| Java | `Java` |`.java` | [`Uncrustify`](https://github.com/uncrustify/uncrustify) (Default) | | Java | `Java` |`.java` | **[`Uncrustify`](https://github.com/uncrustify/uncrustify)** |
| JavaScript | `JavaScript` |`.js` | [`ESLint Fixer`](https://github.com/eslint/eslint), [`JS Beautify`](https://github.com/beautify-web/js-beautify) (Default), [`JSCS Fixer`](https://github.com/jscs-dev/node-jscs/), [`Pretty Diff`](https://github.com/prettydiff/prettydiff) | | JavaScript | `JavaScript` |`.js` | **[`JS Beautify`](https://github.com/beautify-web/js-beautify)**, [`ESLint Fixer`](https://github.com/eslint/eslint), [`JSCS Fixer`](https://github.com/jscs-dev/node-jscs/), [`Pretty Diff`](https://github.com/prettydiff/prettydiff) |
| JSON | `JSON` |`.json` | [`JS Beautify`](https://github.com/beautify-web/js-beautify) (Default), [`Pretty Diff`](https://github.com/prettydiff/prettydiff) | | JSON | `JSON` |`.json` | **[`JS Beautify`](https://github.com/beautify-web/js-beautify)**, [`Pretty Diff`](https://github.com/prettydiff/prettydiff) |
| JSX | `JSX`, `JavaScript (JSX)`, `Babel ES6 JavaScript`, `JavaScript with JSX` |`.jsx`, `.js` | [`JS Beautify`](https://github.com/beautify-web/js-beautify), [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | JSX | `JSX`, `JavaScript (JSX)`, `Babel ES6 JavaScript`, `JavaScript with JSX` |`.jsx`, `.js` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)**, [`JS Beautify`](https://github.com/beautify-web/js-beautify) |
| LaTeX | `BibTeX`, `LaTeX`, `TeX` |`.bib`, `.tex`, `.sty`, `.cls`, `.dtx`, `.ins`, `.bbx`, `.cbx` | [`Latex Beautify`](https://github.com/cmhughes/latexindent.pl) (Default) | | LaTeX | `BibTeX`, `LaTeX`, `TeX` |`.bib`, `.tex`, `.sty`, `.cls`, `.dtx`, `.ins`, `.bbx`, `.cbx` | **[`Latex Beautify`](https://github.com/cmhughes/latexindent.pl)** |
| LESS | `LESS` |`.less` | [`CSScomb`](https://github.com/csscomb/csscomb.js), [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | LESS | `LESS` |`.less` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)**, [`CSScomb`](https://github.com/csscomb/csscomb.js) |
| Lua | `Lua` |`.lua` | [`Lua beautifier`](https://www.perl.org/) (Default) | | Lua | `Lua` |`.lua` | **[`Lua beautifier`](https://github.com/Glavin001/atom-beautify/blob/master/src/beautifiers/lua-beautifier/beautifier.coffee)** |
| Markdown | `GitHub Markdown` |`.markdown`, `.md` | [`Remark`](https://github.com/wooorm/remark), [`Tidy Markdown`](https://github.com/slang800/tidy-markdown) (Default) | | Markdown | `GitHub Markdown` |`.markdown`, `.md` | **[`Tidy Markdown`](https://github.com/slang800/tidy-markdown)**, [`Remark`](https://github.com/wooorm/remark) |
| Marko | `Marko` |`.marko` | [`Marko Beautifier`](https://github.com/marko-js/marko-prettyprint) (Default) | | Marko | `Marko` |`.marko` | **[`Marko Beautifier`](https://github.com/marko-js/marko-prettyprint)** |
| Mustache | `HTML (Mustache)` |`.mustache` | [`JS Beautify`](https://github.com/beautify-web/js-beautify) (Default), [`Pretty Diff`](https://github.com/prettydiff/prettydiff) | | Mustache | `HTML (Mustache)` |`.mustache` | **[`JS Beautify`](https://github.com/beautify-web/js-beautify)**, [`Pretty Diff`](https://github.com/prettydiff/prettydiff) |
| Nginx | `nginx` |`.conf` | [`Nginx Beautify`](https://github.com/denysvitali/nginxbeautify) (Default) | | Nginx | `nginx` |`.conf` | **[`Nginx Beautify`](https://github.com/denysvitali/nginxbeautify)** |
| Nunjucks | `Nunjucks`, `Nunjucks Templates`, `HTML (Nunjucks Templates)` |`.njk`, `.nunjucks` | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | Nunjucks | `Nunjucks`, `Nunjucks Templates`, `HTML (Nunjucks Templates)` |`.njk`, `.nunjucks` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| Objective-C | `Objective-C`, `Objective-C++` |`.m`, `.mm`, `.h` | [`Uncrustify`](https://github.com/uncrustify/uncrustify) (Default), [`clang-format`](https://clang.llvm.org/docs/ClangFormat.html) | | Objective-C | `Objective-C`, `Objective-C++` |`.m`, `.mm`, `.h` | **[`Uncrustify`](https://github.com/uncrustify/uncrustify)**, [`clang-format`](https://clang.llvm.org/docs/ClangFormat.html) |
| OCaml | `OCaml` |`.ml` | [`ocp-indent`](https://www.typerex.org/ocp-indent.html) (Default) | | OCaml | `OCaml` |`.ml` | **[`ocp-indent`](https://www.typerex.org/ocp-indent.html)** |
| Pawn | `Pawn` | | [`Uncrustify`](https://github.com/uncrustify/uncrustify) (Default) | | Pawn | `Pawn` | | **[`Uncrustify`](https://github.com/uncrustify/uncrustify)** |
| Perl | `Perl`, `Perl 6` |`.pl`, `.PL`, `.pm`, `.pod`, `.t` | [`Perltidy`](http://perltidy.sourceforge.net/) (Default) | | Perl | `Perl`, `Perl 6` |`.pl`, `.PL`, `.pm`, `.pod`, `.t` | **[`Perltidy`](http://perltidy.sourceforge.net/)** |
| PHP | `PHP` |`.php`, `.module`, `.inc` | [`PHP-CS-Fixer`](https://github.com/FriendsOfPHP/PHP-CS-Fixer) (Default), [`PHPCBF`](http://php.net/manual/en/install.php), [`hh_format`](http://hhvm.com/) | | PHP | `PHP` |`.php`, `.module`, `.inc` | **[`PHP-CS-Fixer`](https://github.com/FriendsOfPHP/PHP-CS-Fixer)**, [`PHPCBF`](http://php.net/manual/en/install.php), [`hh_format`](http://hhvm.com/) |
| Puppet | `Puppet` |`.pp` | [`puppet-lint`](http://puppet-lint.com/) (Default) | | Puppet | `Puppet` |`.pp` | **[`puppet-lint`](http://puppet-lint.com/)** |
| Python | `Python` |`.py` | [`autopep8`](https://github.com/hhatto/autopep8) (Default), [`pybeautifier`](https://github.com/guyskk/pybeautifier), [`yapf`](https://github.com/google/yapf) | | Python | `Python` |`.py` | **[`autopep8`](https://github.com/hhatto/autopep8)**, [`pybeautifier`](https://github.com/guyskk/pybeautifier), [`yapf`](https://github.com/google/yapf) |
| R | `R` |`.r`, `.R` | [`formatR`](https://github.com/yihui/formatR) (Default) | | R | `R` |`.r`, `.R` | **[`formatR`](https://github.com/yihui/formatR)** |
| Riot.js | `Riot.js`, `HTML (Riot Tag)` |`.tag` | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | Riot.js | `Riot.js`, `HTML (Riot Tag)` |`.tag` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| Ruby | `Ruby`, `Ruby on Rails` |`.rb` | [`Rubocop`](https://github.com/bbatsov/rubocop) (Default), [`Ruby Beautify`](https://github.com/erniebrodeur/ruby-beautify) | | Ruby | `Ruby`, `Ruby on Rails` |`.rb` | **[`Rubocop`](https://github.com/bbatsov/rubocop)**, [`Ruby Beautify`](https://github.com/erniebrodeur/ruby-beautify) |
| Rust | `Rust` |`.rs`, `.rlib` | [`rustfmt`](https://github.com/nrc/rustfmt) (Default) | | Rust | `Rust` |`.rs`, `.rlib` | **[`rustfmt`](https://github.com/nrc/rustfmt)** |
| Sass | `Sass` |`.sass` | [`SassConvert`](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax) (Default) | | Sass | `Sass` |`.sass` | **[`SassConvert`](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax)** |
| SCSS | `SCSS` |`.scss` | [`CSScomb`](https://github.com/csscomb/csscomb.js), [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default), [`SassConvert`](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax) | | SCSS | `SCSS` |`.scss` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)**, [`CSScomb`](https://github.com/csscomb/csscomb.js), [`SassConvert`](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax) |
| Spacebars | `Spacebars` | | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | Spacebars | `Spacebars` | | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| SQL | `SQL (Rails)`, `SQL` |`.sql` | [`sqlformat`](https://github.com/andialbrecht/sqlparse) (Default) | | SQL | `SQL (Rails)`, `SQL` |`.sql` | **[`sqlformat`](https://github.com/andialbrecht/sqlparse)** |
| SVG | `SVG` |`.svg` | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | SVG | `SVG` |`.svg` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| Swig | `HTML (Swig)`, `SWIG` |`.swig` | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | Swig | `HTML (Swig)`, `SWIG` |`.swig` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| TSS | `TSS` |`.tss` | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | TSS | `TSS` |`.tss` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| Twig | `HTML (Twig)` |`.twig` | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | Twig | `HTML (Twig)` |`.twig` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| TypeScript | `TypeScript` |`.ts` | [`TypeScript Formatter`](https://github.com/vvakame/typescript-formatter) (Default) | | TypeScript | `TypeScript` |`.ts` | **[`TypeScript Formatter`](https://github.com/vvakame/typescript-formatter)** |
| UX Markup | `UX` |`.ux` | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | UX Markup | `UX` |`.ux` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| Vala | `Vala` |`.vala`, `.vapi` | [`Uncrustify`](https://github.com/uncrustify/uncrustify) (Default) | | Vala | `Vala` |`.vala`, `.vapi` | **[`Uncrustify`](https://github.com/uncrustify/uncrustify)** |
| Visualforce | `Visualforce` |`.page` | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | Visualforce | `Visualforce` |`.page` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| Vue | `Vue Component` |`.vue` | [`Vue Beautifier`](https://github.com/Glavin001/atom-beautify/blob/master/src/beautifiers/vue-beautifier.coffee) (Default) | | Vue | `Vue Component` |`.vue` | **[`Vue Beautifier`](https://github.com/Glavin001/atom-beautify/blob/master/src/beautifiers/vue-beautifier.coffee)** |
| XML | `SLD`, `XML`, `XHTML`, `XSD`, `XSL`, `JSP`, `GSP` |`.sld`, `.xml`, `.xhtml`, `.xsd`, `.xsl`, `.jsp`, `.gsp`, `.plist`, `.recipe`, `.config` | [`JS Beautify`](https://github.com/beautify-web/js-beautify), [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | XML | `SLD`, `XML`, `XHTML`, `XSD`, `XSL`, `JSP`, `GSP` |`.sld`, `.xml`, `.xhtml`, `.xsd`, `.xsl`, `.jsp`, `.gsp`, `.plist`, `.recipe`, `.config` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)**, [`JS Beautify`](https://github.com/beautify-web/js-beautify) |
| XTemplate | `XTemplate` |`.xtemplate` | [`Pretty Diff`](https://github.com/prettydiff/prettydiff) (Default) | | XTemplate | `XTemplate` |`.xtemplate` | **[`Pretty Diff`](https://github.com/prettydiff/prettydiff)** |
| YAML | `YAML` |`.yml`, `.yaml` | [`align-yaml`](https://github.com/jonschlinkert/align-yaml) (Default) | | YAML | `YAML` |`.yml`, `.yaml` | **[`align-yaml`](https://github.com/jonschlinkert/align-yaml)** |
## Usage ## Usage

View File

@ -1,5 +1,5 @@
version: "{build}" version: "{build}"
os: Windows Server 2012 R2 image: Visual Studio 2017
test: off test: off
deploy: off deploy: off
@ -46,9 +46,6 @@ install:
- ECHO "Filesystem root:" - ECHO "Filesystem root:"
- ps: "ls \"C:/\"" - ps: "ls \"C:/\""
- ECHO "Installed SDKs:"
- ps: "ls \"C:/Program Files/Microsoft SDKs/Windows\""
- cinst atom -y - cinst atom -y
- cd %APPVEYOR_BUILD_FOLDER% - cd %APPVEYOR_BUILD_FOLDER%
# Add Atom's bin (apm, etc) to PATH # Add Atom's bin (apm, etc) to PATH
@ -116,18 +113,22 @@ install:
- where php-cs-fixer - where php-cs-fixer
# Uncrustify # Uncrustify
- curl -k -L http://sourceforge.net/projects/uncrustify/files/uncrustify/uncrustify-0.61/uncrustify-0.61.3-gf65394e-win32.zip/download -o uncrustify.zip - curl -k -L https://sourceforge.net/projects/uncrustify/files/uncrustify/uncrustify-0.65/uncrustify-0.65-win32.zip/download -o uncrustify.zip
- cinst 7zip.commandline -y - cinst 7zip.commandline -y
- 7za e uncrustify.zip -ouncrustify-d - 7za e uncrustify.zip -ouncrustify-d
- "SET PATH=%cd%\\uncrustify-d;%PATH%" - "SET PATH=%cd%\\uncrustify-d;%PATH%"
- where uncrustify - where uncrustify
# elm-format # elm-format
- curl -k -L https://github.com/avh4/elm-format/releases/download/0.2.0-alpha/elm-format-0.2.0-alpha-win-x64.zip -o elm-format.zip - curl -k -L https://github.com/avh4/elm-format/releases/download/0.7.0-exp/elm-format-0.18-0.7.0-exp-win-i386.zip -o elm-format.zip
- 7za e elm-format.zip -oelm-format-d - 7za e elm-format.zip -oelm-format-d
- "SET PATH=%cd%\\elm-format-d;%PATH%" - "SET PATH=%cd%\\elm-format-d;%PATH%"
- where elm-format - where elm-format
# Beautysh
- pip install beautysh
- where beautysh
build_script: build_script:
- cd %APPVEYOR_BUILD_FOLDER% - cd %APPVEYOR_BUILD_FOLDER%

View File

@ -1,3 +1,4 @@
#!/usr/bin/env coffee #!/usr/bin/env coffee
# Dependencies # Dependencies
@ -11,7 +12,10 @@ pkg = require('../package.json')
console.log('Generating options...') console.log('Generating options...')
beautifier = new Beautifiers() beautifier = new Beautifiers()
languageOptions = beautifier.options languageOptions = beautifier.options
executableOptions = languageOptions.executables
delete languageOptions.executables
packageOptions = require('../src/config.coffee') packageOptions = require('../src/config.coffee')
packageOptions.executables = executableOptions
# Build options by Beautifier # Build options by Beautifier
beautifiersMap = _.keyBy(beautifier.beautifiers, 'name') beautifiersMap = _.keyBy(beautifier.beautifiers, 'name')
languagesMap = _.keyBy(beautifier.languages.languages, 'name') languagesMap = _.keyBy(beautifier.languages.languages, 'name')
@ -82,10 +86,19 @@ Handlebars.registerHelper('example-config', (key, option, options) ->
Handlebars.registerHelper('language-beautifiers-support', (languageOptions, options) -> Handlebars.registerHelper('language-beautifiers-support', (languageOptions, options) ->
rows = _.map(languageOptions, (val, k) -> rows = _.chain(languageOptions)
.filter((val, k) -> k isnt "executables")
.map((val, k) ->
name = val.title name = val.title
defaultBeautifier = _.get(val, "properties.default_beautifier.default") defaultBeautifier = _.get(val, "properties.default_beautifier.default")
beautifiers = _.map(val.beautifiers, (b) -> beautifiers = _.chain(val.beautifiers)
.sortBy()
.sortBy((b) ->
beautifier = beautifiersMap[b]
isDefault = b is defaultBeautifier
return !isDefault
)
.map((b) ->
beautifier = beautifiersMap[b] beautifier = beautifiersMap[b]
isDefault = b is defaultBeautifier isDefault = b is defaultBeautifier
if beautifier.link if beautifier.link
@ -93,14 +106,16 @@ Handlebars.registerHelper('language-beautifiers-support', (languageOptions, opti
else else
r = "`#{b}`" r = "`#{b}`"
if isDefault if isDefault
r += " (Default)" r = "**#{r}**"
return r return r
) )
.value()
grammars = _.map(val.grammars, (b) -> "`#{b}`") grammars = _.map(val.grammars, (b) -> "`#{b}`")
extensions = _.map(val.extensions, (b) -> "`.#{b}`") extensions = _.map(val.extensions, (b) -> "`.#{b}`")
return "| #{name} | #{grammars.join(', ')} |#{extensions.join(', ')} | #{beautifiers.join(', ')} |" return "| #{name} | #{grammars.join(', ')} |#{extensions.join(', ')} | #{beautifiers.join(', ')} |"
) )
.value()
results = """ results = """
| Language | Grammars | File Extensions | Supported Beautifiers | | Language | Grammars | File Extensions | Supported Beautifiers |
| --- | --- | --- | ---- | | --- | --- | --- | ---- |
@ -148,7 +163,7 @@ Handlebars.registerHelper('language-options-support', (languageOptions, options)
Handlebars.registerHelper('beautifiers-info', (beautifiers, options) -> Handlebars.registerHelper('beautifiers-info', (beautifiers, options) ->
### ###
| Beautifier | Is Pre-Installed? | Installation Instructions | | Beautifier | Preinstalled? | Installation Instructions |
| --- | ---- | | --- | ---- |
| Pretty Diff | :white_check_mark: | N/A | | Pretty Diff | :white_check_mark: | N/A |
| AutoPEP8 | :x: | LINK | | AutoPEP8 | :x: | LINK |
@ -157,13 +172,63 @@ Handlebars.registerHelper('beautifiers-info', (beautifiers, options) ->
rows = _.map(beautifiers, (beautifier, k) -> rows = _.map(beautifiers, (beautifier, k) ->
name = beautifier.name name = beautifier.name
isPreInstalled = beautifier.isPreInstalled isPreInstalled = beautifier.isPreInstalled
if typeof isPreInstalled is "function"
isPreInstalled = beautifier.isPreInstalled()
link = beautifier.link link = beautifier.link
installationInstructions = if isPreInstalled then "Nothing!" else "Go to #{link} and follow the instructions." executables = beautifier.executables or []
return "| #{name} | #{if isPreInstalled then ':white_check_mark:' else ':x:'} | #{installationInstructions} |" hasExecutables = executables.length > 0
dockerExecutables = executables.filter((exe) -> !!exe.docker)
hasDockerExecutables = dockerExecutables.length > 0
installWithDocker = dockerExecutables.map((d) -> "- #{d.docker.image}").join('\n')
preinstalledCell = do (() ->
if isPreInstalled
":white_check_mark:"
else
if executables.length > 0
":warning: #{executables.length} executable#{if executables.length is 1 then '' else 's'}"
else
":warning: Manual installation"
)
dockerCell = do (() ->
if isPreInstalled
":ok_hand: Not necessary"
else
if hasExecutables
if dockerExecutables.length is executables.length
":white_check_mark: :100:% of executables"
else if dockerExecutables.length > 0
":warning: Only #{dockerExecutables.length} of #{executables.length} executables"
else
":x: No Docker support"
else
":construction: Not an executable"
)
installationInstructions = do (() ->
if isPreInstalled
":smiley: Nothing!"
else
if hasExecutables
executablesInstallation = ""
if hasDockerExecutables
executablesInstallation += ":whale: With [Docker](https://www.docker.com/):<br/>"
dockerExecutables.forEach((e, i) ->
executablesInstallation += "#{i+1}. Install [#{e.name or e.cmd} (`#{e.cmd}`)](#{e.homepage}) with `docker pull #{e.docker.image}`<br/>"
)
executablesInstallation += "<br/>"
executablesInstallation += ":bookmark_tabs: Manually:<br/>"
executables.forEach((e, i) ->
executablesInstallation += "#{i+1}. Install [#{e.name or e.cmd} (`#{e.cmd}`)](#{e.homepage}) by following #{e.installation}<br/>"
)
return executablesInstallation
else
":page_facing_up: Go to #{link} and follow the instructions."
)
return "| #{name} | #{preinstalledCell} | #{dockerCell} | #{installationInstructions} |"
) )
results = """ results = """
| Beautifier | Is Pre-Installed? | Installation Instructions | | Beautifier | Preinstalled | [:whale: Docker](https://www.docker.com/) | Installation |
| --- | --- | --- | | --- | --- | --- |--- |
#{rows.join('\n')} #{rows.join('\n')}
""" """
return new Handlebars.SafeString(results) return new Handlebars.SafeString(results)

View File

@ -124,6 +124,250 @@ Show loading view when beautifying
2. Go into *Packages* and search for "*Atom Beautify*" package. 2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*Show Loading View*" and change it to your desired configuration. 3. Find the option "*Show Loading View*" and change it to your desired configuration.
#### [Executables](#executables)
**Description**:
Configure executables used by beautifiers.
##### [autopep8](#autopep8)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for autopep8 executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*autopep8*" and change it to your desired configuration.
##### [beautysh](#beautysh)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for beautysh executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*beautysh*" and change it to your desired configuration.
##### [ClangFormat](#clangformat)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for ClangFormat executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*ClangFormat*" and change it to your desired configuration.
##### [Crystal](#crystal)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for Crystal executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*Crystal*" and change it to your desired configuration.
##### [Dfmt](#dfmt)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for Dfmt executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*Dfmt*" and change it to your desired configuration.
##### [elm-format](#elm-format)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for elm-format executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*elm-format*" and change it to your desired configuration.
##### [Emacs](#emacs)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for Emacs executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*Emacs*" and change it to your desired configuration.
##### [isort](#isort)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for isort executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*isort*" and change it to your desired configuration.
##### [PHP](#php)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for PHP executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*PHP*" and change it to your desired configuration.
##### [PHP-CS-Fixer](#php-cs-fixer)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for PHP-CS-Fixer executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*PHP-CS-Fixer*" and change it to your desired configuration.
##### [PHPCBF](#phpcbf)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for PHPCBF executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*PHPCBF*" and change it to your desired configuration.
##### [Rscript](#rscript)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for Rscript executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*Rscript*" and change it to your desired configuration.
##### [SassConvert](#sassconvert)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for SassConvert executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*SassConvert*" and change it to your desired configuration.
##### [Uncrustify](#uncrustify)
**Important**: This option is only configurable from within Atom Beautify's setting panel.
**Type**: `object`
**Description**:
Options for Uncrustify executable.
**How to Configure**
1. You can open the [Settings View](https://github.com/atom/settings-view) by navigating to
*Edit > Preferences (Linux)*, *Atom > Preferences (OS X)*, or *File > Preferences (Windows)*.
2. Go into *Packages* and search for "*Atom Beautify*" package.
3. Find the option "*Uncrustify*" and change it to your desired configuration.
## Language Options ## Language Options
@ -1718,7 +1962,7 @@ If lists of assignments or properties should be vertically aligned for faster an
**Description**: **Description**:
Path to custom CSScomb config file, used in absense of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb) Path to custom CSScomb config file, used in absence of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -1922,7 +2166,7 @@ Add a newline between CSS rules (Supported by JS Beautify, Pretty Diff)
**Description**: **Description**:
If in CSS values leading 0s immediately preceeding a decimal should be removed or prevented. (Supported by Pretty Diff) If in CSS values leading 0s immediately preceding a decimal should be removed or prevented. (Supported by Pretty Diff)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -7074,7 +7318,7 @@ Automatically beautify LaTeX files on save
**Description**: **Description**:
(Supported by Latex Beautify) Aligns columns by the alignment tabs for environments specified (Supported by Latex Beautify)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -7179,7 +7423,7 @@ Indentation character (Supported by Latex Beautify)
**Description**: **Description**:
Indent the preable (Supported by Latex Beautify) Indent the preamble (Supported by Latex Beautify)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -7356,7 +7600,7 @@ If lists of assignments or properties should be vertically aligned for faster an
**Description**: **Description**:
Path to custom CSScomb config file, used in absense of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb) Path to custom CSScomb config file, used in absence of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -7536,7 +7780,7 @@ Add a newline between CSS rules (Supported by Pretty Diff)
**Description**: **Description**:
If in CSS values leading 0s immediately preceeding a decimal should be removed or prevented. (Supported by Pretty Diff) If in CSS values leading 0s immediately preceding a decimal should be removed or prevented. (Supported by Pretty Diff)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -10084,7 +10328,7 @@ Automatically beautify Python files on save
**Description**: **Description**:
formater used by pybeautifier (Supported by autopep8, pybeautifier) formatter used by pybeautifier (Supported by autopep8, pybeautifier)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -10957,7 +11201,7 @@ If lists of assignments or properties should be vertically aligned for faster an
**Description**: **Description**:
Path to custom CSScomb config file, used in absense of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb) Path to custom CSScomb config file, used in absence of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -11137,7 +11381,7 @@ Add a newline between CSS rules (Supported by Pretty Diff)
**Description**: **Description**:
If in CSS values leading 0s immediately preceeding a decimal should be removed or prevented. (Supported by Pretty Diff) If in CSS values leading 0s immediately preceding a decimal should be removed or prevented. (Supported by Pretty Diff)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -12181,7 +12425,7 @@ Add a newline between CSS rules (Supported by Pretty Diff)
**Description**: **Description**:
If in CSS values leading 0s immediately preceeding a decimal should be removed or prevented. (Supported by Pretty Diff) If in CSS values leading 0s immediately preceding a decimal should be removed or prevented. (Supported by Pretty Diff)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -15191,7 +15435,7 @@ Supported options for each beautifier.
**Description**: **Description**:
Path to custom CSScomb config file, used in absense of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb) Path to custom CSScomb config file, used in absence of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -16742,7 +16986,7 @@ Indentation uses tabs, overrides `Indent Size` and `Indent Char` (Supported by L
**Description**: **Description**:
Indent the preable (Supported by Latex Beautify) Indent the preamble (Supported by Latex Beautify)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -16842,7 +17086,7 @@ Remove trailing whitespace (Supported by Latex Beautify)
**Description**: **Description**:
(Supported by Latex Beautify) Aligns columns by the alignment tabs for environments specified (Supported by Latex Beautify)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -17973,7 +18217,7 @@ If lists of assignments or properties should be vertically aligned for faster an
**Description**: **Description**:
If in CSS values leading 0s immediately preceeding a decimal should be removed or prevented. (Supported by Pretty Diff) If in CSS values leading 0s immediately preceding a decimal should be removed or prevented. (Supported by Pretty Diff)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -19737,7 +19981,7 @@ do not fix these errors/warnings (Supported by autopep8, pybeautifier)
**Description**: **Description**:
formater used by pybeautifier (Supported by autopep8, pybeautifier) formatter used by pybeautifier (Supported by autopep8, pybeautifier)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**
@ -20090,7 +20334,7 @@ do not fix these errors/warnings (Supported by autopep8, pybeautifier)
**Description**: **Description**:
formater used by pybeautifier (Supported by autopep8, pybeautifier) formatter used by pybeautifier (Supported by autopep8, pybeautifier)
**Example `.jsbeautifyrc` Configuration** **Example `.jsbeautifyrc` Configuration**

View File

@ -1,4 +1,4 @@
module Main (..) where module Main exposing (..)
addThings x y = addThings x y =

View File

@ -1,7 +1,7 @@
{ {
"name": "atom-beautify", "name": "atom-beautify",
"main": "./src/beautify", "main": "./src/beautify",
"version": "0.29.26", "version": "0.30.0",
"private": true, "private": true,
"description": "Beautify HTML, CSS, JavaScript, PHP, Python, Ruby, Java, C, C++, C#, Objective-C, CoffeeScript, TypeScript, Coldfusion, SQL, and more in Atom", "description": "Beautify HTML, CSS, JavaScript, PHP, Python, Ruby, Java, C, C++, C#, Objective-C, CoffeeScript, TypeScript, Coldfusion, SQL, and more in Atom",
"repository": { "repository": {
@ -149,47 +149,49 @@
}, },
"dependencies": { "dependencies": {
"align-yaml": "^0.1.8", "align-yaml": "^0.1.8",
"async": "^2.0.1", "async": "^2.4.1",
"atom-message-panel": "^1.2.4", "atom-message-panel": "^1.3.0",
"atom-space-pen-views": "^2.0.5", "atom-space-pen-views": "^2.2.0",
"bluebird": "^3.4.3", "bluebird": "^3.5.0",
"coffee-fmt": "^0.12.0", "coffee-fmt": "^0.12.0",
"coffee-formatter": "^0.1.2", "coffee-formatter": "^0.1.2",
"coffee-script": "^1.11.0", "coffee-script": "^1.12.6",
"csscomb": "^4.0.1", "csscomb": "^4.2.0",
"diff": "3.0.0", "diff": "^3.2.0",
"editorconfig": "^0.13.2", "editorconfig": "^0.13.2",
"eslint": "^3.13.1", "eslint": "^4.0.0",
"event-kit": "^2.1.0", "event-kit": "^2.3.0",
"expand-home-dir": "0.0.3", "expand-home-dir": "0.0.3",
"extend": "^3.0.0", "extend": "^3.0.1",
"gherkin": "2.12.2", "gherkin": "^2.12.2",
"handlebars": "^4.0.2", "handlebars": "^4.0.10",
"js-beautify": "^1.6.3", "js-beautify": "^1.6.14",
"jscs": "^3.0.7", "jscs": "^3.0.7",
"lodash": "^4.14.2", "lodash": "^4.17.4",
"loophole": "^1.0.0", "loophole": "^1.1.0",
"marko-prettyprint": "^1.3.5", "marko-prettyprint": "^1.3.6",
"nginxbeautify": "^2.0.0", "nginxbeautify": "^2.0.1",
"node-cljfmt": "^0.5.3-1", "node-cljfmt": "0.5.3",
"node-dir": "^0.1.16", "node-dir": "0.1.17",
"node-uuid": "^1.4.3", "node-uuid": "1.4.8",
"open": "0.0.5", "open": "0.0.5",
"prettydiff": "^1.16.27", "prettydiff": "1.16.37",
"pug-beautify": "^0.1.1", "pug-beautify": "^0.1.1",
"remark": "^6.0.1", "remark": "6.0.1",
"season": "^5.3.0", "season": "6.0.0",
"space-pen": "^5.1.1", "semver": "^5.3.0",
"shell-env": "^0.3.0",
"space-pen": "5.1.2",
"strip-json-comments": "^2.0.1", "strip-json-comments": "^2.0.1",
"temp": "^0.8.3", "temp": "^0.8.3",
"tidy-markdown": "2.0.3", "tidy-markdown": "2.0.3",
"typescript": "^1.8.10", "typescript": "1.8.10",
"typescript-formatter": "^2.3.0", "typescript-formatter": "2.3.0",
"underscore-plus": "^1.6.6", "underscore-plus": "^1.6.6",
"universal-analytics": "^0.4.2", "universal-analytics": "0.4.13",
"which": "^1.2.11", "which": "1.2.14",
"winston": "^2.2.0", "winston": "2.3.1",
"yaml-front-matter": "^3.2.3" "yaml-front-matter": "3.4.0"
}, },
"activationCommands": { "activationCommands": {
"atom-workspace": [ "atom-workspace": [
@ -397,14 +399,38 @@
"align-yaml" "align-yaml"
], ],
"devDependencies": { "devDependencies": {
"coffeelint": "^1.10.1", "coffeelint": "1.16.0"
"handlebars": "^4.0.2"
}, },
"scripts": { "scripts": {
"build-options": "node script/build-options.js", "build-options": "node script/build-options.js",
"docs": "npm run build-options && coffee docs/", "docs": "npm run build-options && coffee docs/",
"prepublish": "npm run docs", "prepublish": "npm run docs",
"lint": "coffeelint src/ spec/", "lint": "coffeelint src/ spec/",
"code-docs": "codo && open docs/code/index.html" "code-docs": "codo && open docs/code/index.html",
"test": "atom --test spec"
},
"config": {
"next-update": {
"skip": [
"gherkin",
"expand-home-dir",
"typescript",
"typescript-formatter",
"tidy-markdown",
"underscore-plus",
"prettydiff"
]
}
},
"greenkeeper": {
"ignore": [
"gherkin",
"expand-home-dir",
"typescript",
"typescript-formatter",
"tidy-markdown",
"underscore-plus",
"prettydiff"
]
} }
} }

View File

@ -172,6 +172,53 @@ buildOptionsForBeautifiers = function(beautifiers, allLanguages) {
return flatOptions; return flatOptions;
}; };
buildOptionsForExecutables = function(beautifiers) {
executables = _.chain(beautifiers)
.map((beautifier) => {
const executables = beautifier.executables || [];
executables.forEach((executable) => executable.beautifiers = [beautifier.name]);
return executables;
})
.flatten()
.value();
const properties = {}
_.forEach(executables, (executable) => {
const { name, cmd, beautifiers } = executable;
const key = cmd;
const option = {
key: key,
title: name,
type: "object",
collapsed: true,
description: `Options for ${name} executable.`,
// beautifiers,
properties: {
path: {
key: "path",
title: "Binary/Script Path",
type: "string",
default: "",
description: `Absolute path to the "${cmd}" executable's binary/script.`,
}
}
}
properties[key] = option;
});
const options = {
executables: {
title: 'Executables',
type: 'object',
collapsed: true,
order: -1,
description: 'Configure executables used by beautifiers.',
properties
}
}
return options
};
buildOptionsForBeautifiers = function(beautifiers, allLanguages) { buildOptionsForBeautifiers = function(beautifiers, allLanguages) {
var beautifier, beautifierName, defaultBeautifier, f, fallback, field, fields, fn, g, group, i, j, k, l, laOp, lang, langName, langOptions, languageName, languages, len, len1, len2, len3, len4, len5, m, n, name, name1, namespace, namespaceDest, namespaceSrc, o, op, optionDef, optionName, options, optionsDest, optionsSrc, p, q, ref, ref1, ref10, ref11, ref12, ref13, ref14, ref15, ref16, ref17, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, unsupportedOptions; var beautifier, beautifierName, defaultBeautifier, f, fallback, field, fields, fn, g, group, i, j, k, l, laOp, lang, langName, langOptions, languageName, languages, len, len1, len2, len3, len4, len5, m, n, name, name1, namespace, namespaceDest, namespaceSrc, o, op, optionDef, optionName, options, optionsDest, optionsSrc, p, q, ref, ref1, ref10, ref11, ref12, ref13, ref14, ref15, ref16, ref17, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, unsupportedOptions;
langOptions = {}; langOptions = {};
@ -374,10 +421,11 @@ beautifier = new Beautifiers();
console.log('Building options for beautifiers'); console.log('Building options for beautifiers');
beautifierOptions = buildOptionsForBeautifiers(beautifier.beautifiers, beautifier.languages.languages); beautifierOptions = buildOptionsForBeautifiers(beautifier.beautifiers, beautifier.languages.languages);
executableOptions = buildOptionsForExecutables(beautifier.beautifiers)
console.log('Done building options for beautifiers'); console.log('Done building options for beautifiers');
combinedOptions = Object.assign({}, beautifierOptions, executableOptions)
optionsStr = JSON.stringify(beautifierOptions, null, 2); optionsStr = JSON.stringify(combinedOptions, null, 2);
outputFilename = path.resolve(__dirname, '../src/options.json'); outputFilename = path.resolve(__dirname, '../src/options.json');

View File

@ -1,4 +1,5 @@
Beautifiers = require "../src/beautifiers" Beautifiers = require "../src/beautifiers"
Executable = require "../src/beautifiers/executable"
beautifiers = new Beautifiers() beautifiers = new Beautifiers()
Beautifier = require "../src/beautifiers/beautifier" Beautifier = require "../src/beautifiers/beautifier"
Languages = require('../src/languages/') Languages = require('../src/languages/')
@ -30,7 +31,7 @@ describe "Atom-Beautify", ->
pack = atom.packages.getLoadedPackage("atom-beautify") pack = atom.packages.getLoadedPackage("atom-beautify")
pack.activateNow() pack.activateNow()
# Change logger level # Change logger level
# atom.config.set('atom-beautify._loggerLevel', 'verbose') atom.config.set('atom-beautify.general.loggerLevel', 'info')
# Return promise # Return promise
return activationPromise return activationPromise
@ -124,7 +125,7 @@ describe "Atom-Beautify", ->
pathOption: "Lang - Test Program Path" pathOption: "Lang - Test Program Path"
} }
# Force to be Windows # Force to be Windows
beautifier.isWindows = true Executable.isWindows = () ->true
terminal = 'CMD prompt' terminal = 'CMD prompt'
whichCmd = "where.exe" whichCmd = "where.exe"
# Process # Process
@ -132,7 +133,7 @@ describe "Atom-Beautify", ->
expect(p).not.toBe(null) expect(p).not.toBe(null)
expect(p instanceof beautifier.Promise).toBe(true) expect(p instanceof beautifier.Promise).toBe(true)
cb = (v) -> cb = (v) ->
# console.log(v) console.log("error", v, v.description)
expect(v).not.toBe(null) expect(v).not.toBe(null)
expect(v instanceof Error).toBe(true) expect(v instanceof Error).toBe(true)
expect(v.code).toBe("CommandNotFound") expect(v.code).toBe("CommandNotFound")
@ -167,7 +168,7 @@ describe "Atom-Beautify", ->
pathOption: "Lang - Test Program Path" pathOption: "Lang - Test Program Path"
} }
# Force to be Mac/Linux (not Windows) # Force to be Mac/Linux (not Windows)
beautifier.isWindows = false Executable.isWindows = () ->false
terminal = "Terminal" terminal = "Terminal"
whichCmd = "which" whichCmd = "which"
# Process # Process

View File

@ -1,5 +1,6 @@
PHPCSFixer = require "../src/beautifiers/php-cs-fixer" PHPCSFixer = require "../src/beautifiers/php-cs-fixer"
Beautifier = require "../src/beautifiers/beautifier" Beautifier = require "../src/beautifiers/beautifier"
Executable = require "../src/beautifiers/executable"
path = require 'path' path = require 'path'
# Use the command `window:run-package-specs` (cmd-alt-ctrl-p) to run specs. # Use the command `window:run-package-specs` (cmd-alt-ctrl-p) to run specs.
@ -23,17 +24,22 @@ describe "PHP-CS-Fixer Beautifier", ->
pack = atom.packages.getLoadedPackage("atom-beautify") pack = atom.packages.getLoadedPackage("atom-beautify")
pack.activateNow() pack.activateNow()
# Change logger level # Change logger level
# atom.config.set('atom-beautify._loggerLevel', 'verbose') atom.config.set('atom-beautify.general.loggerLevel', 'info')
# Return promise # Return promise
return activationPromise return activationPromise
describe "Beautifier::beautify", -> describe "Beautifier::beautify", ->
beautifier = null beautifier = null
execSpawn = null
beforeEach -> beforeEach ->
beautifier = new PHPCSFixer() beautifier = new PHPCSFixer()
# console.log('new beautifier') # console.log('new beautifier')
execSpawn = Executable.prototype.spawn
afterEach ->
Executable.prototype.spawn = execSpawn
OSSpecificSpecs = -> OSSpecificSpecs = ->
text = "<?php echo \"test\"; ?>" text = "<?php echo \"test\"; ?>"
@ -49,13 +55,14 @@ describe "PHP-CS-Fixer Beautifier", ->
levels: "" levels: ""
} }
# Mock spawn # Mock spawn
beautifier.spawn = (exe, args, options) -> # beautifier.spawn
Executable.prototype.spawn = (exe, args, options) ->
# console.log('spawn', exe, args, options) # console.log('spawn', exe, args, options)
er = new Error('ENOENT') er = new Error('ENOENT')
er.code = 'ENOENT' er.code = 'ENOENT'
return beautifier.Promise.reject(er) return beautifier.Promise.reject(er)
# Beautify # Beautify
p = beautifier.beautify(text, language, options) p = beautifier.loadExecutables().then(() -> beautifier.beautify(text, language, options))
expect(p).not.toBe(null) expect(p).not.toBe(null)
expect(p instanceof beautifier.Promise).toBe(true) expect(p instanceof beautifier.Promise).toBe(true)
cb = (v) -> cb = (v) ->
@ -74,7 +81,7 @@ describe "PHP-CS-Fixer Beautifier", ->
expect(beautifier).not.toBe(null) expect(beautifier).not.toBe(null)
expect(beautifier instanceof Beautifier).toBe(true) expect(beautifier instanceof Beautifier).toBe(true)
if not beautifier.isWindows and failingProgram is "php" if not Executable.isWindows and failingProgram is "php"
# Only applicable on Windows # Only applicable on Windows
return return
@ -104,8 +111,9 @@ describe "PHP-CS-Fixer Beautifier", ->
# console.log('fake exe path', exe) # console.log('fake exe path', exe)
beautifier.Promise.resolve("/#{exe}") beautifier.Promise.resolve("/#{exe}")
oldSpawn = beautifier.spawn.bind(beautifier) # oldSpawn = beautifier.spawn.bind(beautifier)
beautifier.spawn = (exe, args, options) -> # beautifier.spawn
Executable.prototype.spawn = (exe, args, options) ->
# console.log('spawn', exe, args, options) # console.log('spawn', exe, args, options)
if exe is failingProgram if exe is failingProgram
er = new Error('ENOENT') er = new Error('ENOENT')
@ -117,21 +125,21 @@ describe "PHP-CS-Fixer Beautifier", ->
stdout: 'stdout', stdout: 'stdout',
stderr: '' stderr: ''
}) })
p = beautifier.beautify(text, language, options) p = beautifier.loadExecutables().then(() -> beautifier.beautify(text, language, options))
expect(p).not.toBe(null) expect(p).not.toBe(null)
expect(p instanceof beautifier.Promise).toBe(true) expect(p instanceof beautifier.Promise).toBe(true)
p.then(cb, cb) p.then(cb, cb)
return p return p
# failWhichProgram('php') failWhichProgram('PHP')
failWhichProgram('php-cs-fixer') # failWhichProgram('php-cs-fixer')
unless isWindows unless isWindows
describe "Mac/Linux", -> describe "Mac/Linux", ->
beforeEach -> beforeEach ->
# console.log('mac/linx') # console.log('mac/linx')
beautifier.isWindows = false Executable.isWindows = () -> false
do OSSpecificSpecs do OSSpecificSpecs
@ -139,6 +147,6 @@ describe "PHP-CS-Fixer Beautifier", ->
beforeEach -> beforeEach ->
# console.log('windows') # console.log('windows')
beautifier.isWindows = true Executable.isWindows = () -> true
do OSSpecificSpecs do OSSpecificSpecs

View File

@ -15,6 +15,25 @@ isWindows = process.platform is 'win32' or
process.env.OSTYPE is 'cygwin' or process.env.OSTYPE is 'cygwin' or
process.env.OSTYPE is 'msys' process.env.OSTYPE is 'msys'
unsupportedLangs = {
all: [
]
windows: [
"ocaml"
"r"
"clojure"
# Broken
"apex"
"bash"
"csharp"
"d"
"elm"
"java"
"objectivec"
"opencl"
]
}
describe "BeautifyLanguages", -> describe "BeautifyLanguages", ->
optionsDir = path.resolve(__dirname, "../examples") optionsDir = path.resolve(__dirname, "../examples")
@ -53,9 +72,8 @@ describe "BeautifyLanguages", ->
pack = atom.packages.getLoadedPackage("atom-beautify") pack = atom.packages.getLoadedPackage("atom-beautify")
pack.activateNow() pack.activateNow()
# Need more debugging on Windows # Need more debugging on Windows
if isWindows
# Change logger level # Change logger level
atom.config.set('atom-beautify._loggerLevel', 'verbose') atom.config.set('atom-beautify.general.loggerLevel', 'info')
# Return promise # Return promise
return activationPromise return activationPromise
@ -95,9 +113,12 @@ describe "BeautifyLanguages", ->
langNames = fs.readdirSync(langsDir) langNames = fs.readdirSync(langsDir)
for lang in langNames for lang in langNames
# FIXME: Skip testing ocaml in Windows shouldSkipLang = false
if isWindows && lang == 'ocaml' if unsupportedLangs.all.indexOf(lang) isnt -1
continue shouldSkipLang = true
if isWindows and unsupportedLangs.windows.indexOf(lang) isnt -1
console.warn("Tests for Windows do not support #{lang}")
shouldSkipLang = true
do (lang) -> do (lang) ->
# Generate the path to where al of the tests are # Generate the path to where al of the tests are
@ -119,7 +140,7 @@ describe "BeautifyLanguages", ->
fs.mkdirSync(expectedDir) fs.mkdirSync(expectedDir)
# Language group tests # Language group tests
describe "when beautifying language '#{lang}'", -> describe "#{if shouldSkipLang then '#' else ''}when beautifying language '#{lang}'", ->
# All tests for language # All tests for language
testNames = fs.readdirSync(originalDir) testNames = fs.readdirSync(originalDir)
@ -128,11 +149,12 @@ describe "BeautifyLanguages", ->
ext = path.extname(testFileName) ext = path.extname(testFileName)
testName = path.basename(testFileName, ext) testName = path.basename(testFileName, ext)
# If prefixed with underscore (_) then this is a hidden test # If prefixed with underscore (_) then this is a hidden test
shouldSkip = false
if testFileName[0] is '_' if testFileName[0] is '_'
# Do not show this test # Do not show this test
return shouldSkip = true
# Confirm this is a test # Confirm this is a test
it "#{testName} #{testFileName}", -> it "#{if shouldSkip then '# ' else ''}#{testName} #{testFileName}", ->
# Generate paths to test files # Generate paths to test files
originalTestPath = path.resolve(originalDir, testFileName) originalTestPath = path.resolve(originalDir, testFileName)
@ -162,7 +184,7 @@ describe "BeautifyLanguages", ->
beautifyCompleted = false beautifyCompleted = false
completionFun = (text) -> completionFun = (text) ->
try try
expect(text instanceof Error).not.toEqual(true, text) expect(text instanceof Error).not.toEqual(true, text.message or text.toString())
return beautifyCompleted = true if text instanceof Error return beautifyCompleted = true if text instanceof Error
# logger.verbose(expectedTestPath, text) if ext is ".less" # logger.verbose(expectedTestPath, text) if ext is ".less"
# if text instanceof Error # if text instanceof Error

View File

@ -9,33 +9,56 @@ module.exports = class Autopep8 extends Beautifier
name: "autopep8" name: "autopep8"
link: "https://github.com/hhatto/autopep8" link: "https://github.com/hhatto/autopep8"
isPreInstalled: false executables: [
{
name: "autopep8"
cmd: "autopep8"
homepage: "https://github.com/hhatto/autopep8"
installation: "https://github.com/hhatto/autopep8#installation"
version: {
parse: (text) -> text.match(/autopep8 (\d+\.\d+\.\d+)/)[1]
runOptions: {
returnStderr: true
}
}
docker: {
image: "unibeautify/autopep8"
}
}
{
name: "isort"
cmd: "isort"
optional: true
homepage: "https://github.com/timothycrosley/isort"
installation: "https://github.com/timothycrosley/isort#installing-isort"
version: {
parse: (text) -> text.match(/VERSION (\d+\.\d+\.\d+)/)[1]
}
}
]
options: { options: {
Python: true Python: true
} }
beautify: (text, language, options) -> beautify: (text, language, options) ->
@run("autopep8", [ @exe("autopep8").run([
tempFile = @tempFile("input", text) tempFile = @tempFile("input", text)
"-i" "-i"
["--max-line-length", "#{options.max_line_length}"] if options.max_line_length? ["--max-line-length", "#{options.max_line_length}"] if options.max_line_length?
["--indent-size","#{options.indent_size}"] if options.indent_size? ["--indent-size","#{options.indent_size}"] if options.indent_size?
["--ignore","#{options.ignore.join(',')}"] if options.ignore? ["--ignore","#{options.ignore.join(',')}"] if options.ignore?
], help: { ])
link: "https://github.com/hhatto/autopep8"
})
.then(=> .then(=>
if options.sort_imports if options.sort_imports
editor = atom.workspace.getActiveTextEditor() editor = atom.workspace.getActiveTextEditor()
filePath = editor.getPath() filePath = editor.getPath()
projectPath = atom.project.relativizePath(filePath)[0] projectPath = atom.project.relativizePath(filePath)[0]
@run("isort", @exe("isort")
.run(
["-sp", projectPath, tempFile], ["-sp", projectPath, tempFile],
help: { )
link: "https://github.com/timothycrosley/isort"
})
.then(=> .then(=>
@readFile(tempFile) @readFile(tempFile)
) )

View File

@ -4,8 +4,9 @@ fs = require('fs')
temp = require('temp').track() temp = require('temp').track()
readFile = Promise.promisify(fs.readFile) readFile = Promise.promisify(fs.readFile)
which = require('which') which = require('which')
spawn = require('child_process').spawn
path = require('path') path = require('path')
shellEnv = require('shell-env')
Executable = require('./executable')
module.exports = class Beautifier module.exports = class Beautifier
@ -31,10 +32,49 @@ module.exports = class Beautifier
### ###
options: {} options: {}
executables: []
### ###
Is the beautifier a command-line interface beautifier? Is the beautifier a command-line interface beautifier?
### ###
isPreInstalled: true isPreInstalled: () ->
@executables.length is 0
_exe: {}
loadExecutables: () ->
@debug("Load executables")
if Object.keys(@_exe).length is @executables.length
Promise.resolve(@_exe)
else
Promise.resolve(executables = @executables.map((e) -> new Executable(e)))
.then((executables) -> Promise.all(executables.map((exe) -> exe.init())))
.then((es) =>
@debug("Executables loaded", es)
exe = {}
missingInstalls = []
es.forEach((e) ->
exe[e.cmd] = e
if not e.isInstalled and e.required
missingInstalls.push(e)
)
@_exe = exe
@debug("exe", exe)
if missingInstalls.length is 0
return @_exe
else
@debug("Missing required executables: #{missingInstalls.map((e) -> e.cmd).join(' and ')}.")
throw Executable.commandNotFoundError(missingInstalls[0].cmd)
)
.catch((error) =>
@debug("Error loading executables", error)
Promise.reject(error)
)
exe: (cmd) ->
console.log('exe', cmd, @_exe)
e = @_exe[cmd]
if !e?
throw Executable.commandNotFoundError(cmd)
e
### ###
Supported languages by this Beautifier Supported languages by this Beautifier
@ -124,64 +164,6 @@ module.exports = class Beautifier
else else
return lf return lf
###
If platform is Windows
###
isWindows: do ->
return new RegExp('^win').test(process.platform)
###
Get Shell Environment variables
Special thank you to @ioquatix
See https://github.com/ioquatix/script-runner/blob/v1.5.0/lib/script-runner.coffee#L45-L63
###
_envCache: null
_envCacheDate: null
_envCacheExpiry: 10000 # 10 seconds
getShellEnvironment: ->
return new Promise((resolve, reject) =>
# Check Cache
if @_envCache? and @_envCacheDate?
# Check if Cache is old
if (new Date() - @_envCacheDate) < @_envCacheExpiry
# Still fresh
return resolve(@_envCache)
# Check if Windows
if @isWindows
# Windows
# Use default
resolve(process.env)
else
# Mac & Linux
# I tried using ChildProcess.execFile but there is no way to set detached and
# this causes the child shell to lock up.
# This command runs an interactive login shell and
# executes the export command to get a list of environment variables.
# We then use these to run the script:
child = spawn process.env.SHELL, ['-ilc', 'env'],
# This is essential for interactive shells, otherwise it never finishes:
detached: true,
# We don't care about stdin, stderr can go out the usual way:
stdio: ['ignore', 'pipe', process.stderr]
# We buffer stdout:
buffer = ''
child.stdout.on 'data', (data) -> buffer += data
# When the process finishes, extract the environment variables and pass them to the callback:
child.on 'close', (code, signal) =>
if code isnt 0
return reject(new Error("Could not get Shell Environment. Exit code: "+code+", Signal: "+signal))
environment = {}
for definition in buffer.split('\n')
[key, value] = definition.split('=', 2)
environment[key] = value if key != ''
# Cache Environment
@_envCache = environment
@_envCacheDate = new Date()
resolve(environment)
)
### ###
Like the unix which utility. Like the unix which utility.
@ -191,182 +173,21 @@ module.exports = class Beautifier
See https://github.com/isaacs/node-which See https://github.com/isaacs/node-which
### ###
which: (exe, options = {}) -> which: (exe, options = {}) ->
# Get PATH and other environment variables # @deprecate("Beautifier.which function has been deprecated. Please use Executables.")
@getShellEnvironment() Executable.which(exe, options)
.then((env) =>
new Promise((resolve, reject) =>
options.path ?= env.PATH
if @isWindows
# Environment variables are case-insensitive in windows
# Check env for a case-insensitive 'path' variable
if !options.path
for i of env
if i.toLowerCase() is "path"
options.path = env[i]
break
# Trick node-which into including files
# with no extension as executables.
# Put empty extension last to allow for other real extensions first
options.pathExt ?= "#{process.env.PATHEXT ? '.EXE'};"
which(exe, options, (err, path) ->
resolve(exe) if err
resolve(path)
)
)
)
###
Add help to error.description
Note: error.description is not officially used in JavaScript,
however it is used internally for Atom Beautify when displaying errors.
###
commandNotFoundError: (exe, help) ->
# Create new improved error
# notify user that it may not be
# installed or in path
message = "Could not find '#{exe}'. \
The program may not be installed."
er = new Error(message)
er.code = 'CommandNotFound'
er.errno = er.code
er.syscall = 'beautifier::run'
er.file = exe
if help?
if typeof help is "object"
# Basic notice
helpStr = "See #{help.link} for program \
installation instructions.\n"
# Help to configure Atom Beautify for program's path
helpStr += "You can configure Atom Beautify \
with the absolute path \
to '#{help.program or exe}' by setting \
'#{help.pathOption}' in \
the Atom Beautify package settings.\n" if help.pathOption
# Optional, additional help
helpStr += help.additional if help.additional
# Common Help
issueSearchLink =
"https://github.com/Glavin001/atom-beautify/\
search?q=#{exe}&type=Issues"
docsLink = "https://github.com/Glavin001/\
atom-beautify/tree/master/docs"
helpStr += "Your program is properly installed if running \
'#{if @isWindows then 'where.exe' \
else 'which'} #{exe}' \
in your #{if @isWindows then 'CMD prompt' \
else 'Terminal'} \
returns an absolute path to the executable. \
If this does not work then you have not \
installed the program correctly and so \
Atom Beautify will not find the program. \
Atom Beautify requires that the program be \
found in your PATH environment variable. \n\
Note that this is not an Atom Beautify issue \
if beautification does not work and the above \
command also does not work: this is expected \
behaviour, since you have not properly installed \
your program. Please properly setup the program \
and search through existing Atom Beautify issues \
before creating a new issue. \
See #{issueSearchLink} for related Issues and \
#{docsLink} for documentation. \
If you are still unable to resolve this issue on \
your own then please create a new issue and \
ask for help.\n"
er.description = helpStr
else #if typeof help is "string"
er.description = help
return er
### ###
Run command-line interface command Run command-line interface command
### ###
run: (executable, args, {cwd, ignoreReturnCode, help, onStdin} = {}) -> run: (executable, args, {cwd, ignoreReturnCode, help, onStdin} = {}) ->
# Flatten args first # @deprecate("Beautifier.run function has been deprecated. Please use Executables.")
args = _.flatten(args) exe = new Executable({
name: @name
# Resolve executable and all args homepage: @link
Promise.all([executable, Promise.all(args)]) installation: @link
.then(([exeName, args]) => cmd: executable
@debug('exeName, args:', exeName, args) })
exe.run(args, {cwd, ignoreReturnCode, help, onStdin})
# Get PATH and other environment variables
Promise.all([exeName, args, @getShellEnvironment(), @which(exeName)])
)
.then(([exeName, args, env, exePath]) =>
@debug('exePath, env:', exePath, env)
@debug('args', args)
exe = exePath ? exeName
options = {
cwd: cwd
env: env
}
@spawn(exe, args, options, onStdin)
.then(({returnCode, stdout, stderr}) =>
@verbose('spawn result', returnCode, stdout, stderr)
# If return code is not 0 then error occured
if not ignoreReturnCode and returnCode isnt 0
# operable program or batch file
windowsProgramNotFoundMsg = "is not recognized as an internal or external command"
@verbose(stderr, windowsProgramNotFoundMsg)
if @isWindows and returnCode is 1 and stderr.indexOf(windowsProgramNotFoundMsg) isnt -1
throw @commandNotFoundError(exeName, help)
else
throw new Error(stderr)
else
stdout
)
.catch((err) =>
@debug('error', err)
# Check if error is ENOENT (command could not be found)
if err.code is 'ENOENT' or err.errno is 'ENOENT'
throw @commandNotFoundError(exeName, help)
else
# continue as normal error
throw err
)
)
###
Spawn
###
spawn: (exe, args, options, onStdin) ->
# Remove undefined/null values
args = _.without(args, undefined)
args = _.without(args, null)
return new Promise((resolve, reject) =>
@debug('spawn', exe, args)
cmd = spawn(exe, args, options)
stdout = ""
stderr = ""
cmd.stdout.on('data', (data) ->
stdout += data
)
cmd.stderr.on('data', (data) ->
stderr += data
)
cmd.on('close', (returnCode) =>
@debug('spawn done', returnCode, stderr, stdout)
resolve({returnCode, stdout, stderr})
)
cmd.on('error', (err) =>
@debug('error', err)
reject(err)
)
onStdin cmd.stdin if onStdin
)
### ###
Logger instance Logger instance

View File

@ -4,7 +4,22 @@ Beautifier = require('./beautifier')
module.exports = class BashBeautify extends Beautifier module.exports = class BashBeautify extends Beautifier
name: "beautysh" name: "beautysh"
link: "https://github.com/bemeurer/beautysh" link: "https://github.com/bemeurer/beautysh"
isPreInstalled: false executables: [
{
name: "beautysh"
cmd: "beautysh"
homepage: "https://github.com/bemeurer/beautysh"
installation: "https://github.com/bemeurer/beautysh#installation"
version: {
# Does not display version
args: ['--help'],
parse: (text) -> text.indexOf("usage: beautysh") isnt -1 and "0.0.0"
}
docker: {
image: "unibeautify/beautysh"
}
}
]
options: { options: {
Bash: Bash:
@ -12,6 +27,7 @@ module.exports = class BashBeautify extends Beautifier
} }
beautify: (text, language, options) -> beautify: (text, language, options) ->
beautysh = @exe("beautysh")
file = @tempFile("input", text) file = @tempFile("input", text)
@run('beautysh', [ '-i', options.indent_size, '-f', file ], help: { link: "https://github.com/bemeurer/beautysh" }) beautysh.run([ '-i', options.indent_size, '-f', file ])
.then(=> @readFile file) .then(=> @readFile file)

View File

@ -11,7 +11,20 @@ module.exports = class ClangFormat extends Beautifier
name: "clang-format" name: "clang-format"
link: "https://clang.llvm.org/docs/ClangFormat.html" link: "https://clang.llvm.org/docs/ClangFormat.html"
isPreInstalled: false executables: [
{
name: "ClangFormat"
cmd: "clang-format"
homepage: "https://clang.llvm.org/docs/ClangFormat.html"
installation: "https://clang.llvm.org/docs/ClangFormat.html"
version: {
parse: (text) -> text.match(/version (\d+\.\d+\.\d+)/)[1]
}
docker: {
image: "unibeautify/clang-format"
}
}
]
options: { options: {
"C++": false "C++": false
@ -64,12 +77,10 @@ module.exports = class ClangFormat extends Beautifier
) )
.then((dumpFile) => .then((dumpFile) =>
# console.log("clang-format", dumpFile) # console.log("clang-format", dumpFile)
return @run("clang-format", [ return @exe("clang-format").run([
@dumpToFile(dumpFile, text) @dumpToFile(dumpFile, text)
["--style=file"] ["--style=file"]
], help: { ]).finally( ->
link: "https://clang.llvm.org/docs/ClangFormat.html"
}).finally( ->
fs.unlink(dumpFile) fs.unlink(dumpFile)
) )
) )

View File

@ -8,24 +8,27 @@ Beautifier = require('./beautifier')
module.exports = class Crystal extends Beautifier module.exports = class Crystal extends Beautifier
name: "Crystal" name: "Crystal"
link: "http://crystal-lang.org" link: "http://crystal-lang.org"
isPreInstalled: false executables: [
{
name: "Crystal"
cmd: "crystal"
homepage: "http://crystal-lang.org"
installation: "https://crystal-lang.org/docs/installation/"
version: {
parse: (text) -> text.match(/Crystal (\d+\.\d+\.\d+)/)[1]
}
docker: {
image: "unibeautify/crystal"
}
}
]
options: { options: {
Crystal: false Crystal: false
} }
beautify: (text, language, options) -> beautify: (text, language, options) ->
# Seems that Crystal dosen't have Windows support yet. @exe("crystal").run([
if @isWindows
@Promise.reject(@commandNotFoundError(
'crystal'
{
link: "http://crystal-lang.org"
program: "crystal"
})
)
else
@run("crystal", [
'tool', 'tool',
'format', 'format',
tempFile = @tempFile("temp", text) tempFile = @tempFile("temp", text)

View File

@ -7,13 +7,20 @@ Beautifier = require('./beautifier')
module.exports = class Dfmt extends Beautifier module.exports = class Dfmt extends Beautifier
name: "dfmt" name: "dfmt"
link: "https://github.com/Hackerpilot/dfmt" link: "https://github.com/Hackerpilot/dfmt"
isPreInstalled: false executables: [
{
name: "Dfmt"
cmd: "dfmt"
homepage: "https://github.com/Hackerpilot/dfmt"
installation: "https://github.com/dlang-community/dfmt#building"
}
]
options: { options: {
D: false D: false
} }
beautify: (text, language, options) -> beautify: (text, language, options) ->
@run("dfmt", [ @exe("dfmt").run([
@tempFile("input", text) @tempFile("input", text)
]) ])

View File

@ -7,7 +7,25 @@ Beautifier = require('./beautifier')
module.exports = class ElmFormat extends Beautifier module.exports = class ElmFormat extends Beautifier
name: "elm-format" name: "elm-format"
link: "https://github.com/avh4/elm-format" link: "https://github.com/avh4/elm-format"
isPreInstalled: false executables: [
{
name: "elm-format"
cmd: "elm-format"
homepage: "https://github.com/avh4/elm-format"
installation: "https://github.com/avh4/elm-format#installation-"
version: {
args: ['--help']
parse: (text) ->
try
return text.match(/elm-format-\d+.\d+ (\d+\.\d+\.\d+)/)[1]
catch
return text.match(/elm-format (\d+\.\d+\.\d+)/)[1]
}
docker: {
image: "unibeautify/elm-format"
}
}
]
options: { options: {
Elm: true Elm: true
@ -16,11 +34,10 @@ module.exports = class ElmFormat extends Beautifier
beautify: (text, language, options) -> beautify: (text, language, options) ->
tempfile = @tempFile("input", text, ".elm") tempfile = @tempFile("input", text, ".elm")
.then (name) => .then (name) =>
@run("elm-format", [ @exe("elm-format")
.run([
'--yes', '--yes',
name name
], ])
{ help: { link: 'https://github.com/avh4/elm-format#installation-' } }
)
.then () => .then () =>
@readFile(name) @readFile(name)

View File

@ -0,0 +1,453 @@
Promise = require('bluebird')
_ = require('lodash')
which = require('which')
spawn = require('child_process').spawn
path = require('path')
semver = require('semver')
shellEnv = require('shell-env')
os = require('os')
fs = require('fs')
parentConfigKey = "atom-beautify.executables"
class Executable
name: null
cmd: null
key: null
homepage: null
installation: null
versionArgs: ['--version']
versionParse: (text) -> semver.clean(text)
versionRunOptions: {}
versionsSupported: '>= 0.0.0'
required: true
constructor: (options) ->
# Validation
if !options.cmd?
throw new Error("The command (i.e. cmd property) is required for an Executable.")
@name = options.name
@cmd = options.cmd
@key = @cmd
@homepage = options.homepage
@installation = options.installation
@required = not options.optional
if options.version?
versionOptions = options.version
@versionArgs = versionOptions.args if versionOptions.args
@versionParse = versionOptions.parse if versionOptions.parse
@versionRunOptions = versionOptions.runOptions if versionOptions.runOptions
@versionsSupported = versionOptions.supported if versionOptions.supported
@setupLogger()
init: () ->
Promise.all([
@loadVersion()
])
.then(() => @verbose("Done init of #{@name}"))
.then(() => @)
.catch((error) =>
if not @.required
@
else
Promise.reject(error)
)
###
Logger instance
###
logger: null
###
Initialize and configure Logger
###
setupLogger: ->
@logger = require('../logger')("#{@name} Executable")
for key, method of @logger
@[key] = method
@verbose("#{@name} executable logger has been initialized.")
isInstalled = null
version = null
loadVersion: (force = false) ->
@verbose("loadVersion", @version, force)
if force or !@version?
@verbose("Loading version without cache")
@runVersion()
.then((text) => @saveVersion(text))
else
@verbose("Loading cached version")
Promise.resolve(@version)
runVersion: () ->
@run(@versionArgs, @versionRunOptions)
.then((version) =>
@info("Version text: " + version)
version
)
saveVersion: (text) ->
Promise.resolve()
.then( => @versionParse(text))
.then((version) ->
valid = Boolean(semver.valid(version))
if not valid
throw new Error("Version is not valid: "+version)
version
)
.then((version) =>
@isInstalled = true
@version = version
)
.then((version) =>
@info("#{@cmd} version: #{version}")
version
)
.catch((error) =>
@isInstalled = false
@error(error)
help = {
program: @cmd
link: @installation or @homepage
pathOption: "Executable - #{@name or @cmd} - Path"
}
Promise.reject(@commandNotFoundError(@name or @cmd, help))
)
isSupported: () ->
@isVersion(@versionsSupported)
isVersion: (range) ->
semver.satisfies(@version, range)
getConfig: () ->
atom?.config.get("#{parentConfigKey}.#{@key}") or {}
###
Run command-line interface command
###
run: (args, options = {}) ->
@debug("Run: ", @cmd, args, options)
{ cwd, ignoreReturnCode, help, onStdin, returnStderr } = options
exeName = @cmd
config = @getConfig()
cwd ?= os.tmpDir()
# Resolve executable and all args
Promise.all([@shellEnv(), this.resolveArgs(args)])
.then(([env, args]) =>
@debug('exeName, args:', exeName, args)
# Get PATH and other environment variables
if config and config.path
exePath = config.path
else
exePath = @which(exeName)
Promise.all([exeName, args, env, exePath])
)
.then(([exeName, args, env, exePath]) =>
@debug('exePath:', exePath)
@debug('env:', env)
@debug('PATH:', env.PATH)
@debug('args', args)
args = this.relativizePaths(args)
@debug('relativized args', args)
exe = exePath ? exeName
spawnOptions = {
cwd: cwd
env: env
}
@debug('spawnOptions', spawnOptions)
@spawn(exe, args, spawnOptions, onStdin)
.then(({returnCode, stdout, stderr}) =>
@verbose('spawn result, returnCode', returnCode)
@verbose('spawn result, stdout', stdout)
@verbose('spawn result, stderr', stderr)
# If return code is not 0 then error occured
if not ignoreReturnCode and returnCode isnt 0
# operable program or batch file
windowsProgramNotFoundMsg = "is not recognized as an internal or external command"
@verbose(stderr, windowsProgramNotFoundMsg)
if @isWindows() and returnCode is 1 and stderr.indexOf(windowsProgramNotFoundMsg) isnt -1
throw @commandNotFoundError(exeName, help)
else
throw new Error(stderr or stdout)
else
if returnStderr
stderr
else
stdout
)
.catch((err) =>
@debug('error', err)
# Check if error is ENOENT (command could not be found)
if err.code is 'ENOENT' or err.errno is 'ENOENT'
throw @commandNotFoundError(exeName, help)
else
# continue as normal error
throw err
)
)
resolveArgs: (args) ->
args = _.flatten(args)
Promise.all(args)
relativizePaths: (args) ->
tmpDir = os.tmpDir()
newArgs = args.map((arg) ->
isTmpFile = (typeof arg is 'string' and not arg.includes(':') and \
path.isAbsolute(arg) and path.dirname(arg).startsWith(tmpDir))
if isTmpFile
return path.relative(tmpDir, arg)
return arg
)
newArgs
###
Spawn
###
spawn: (exe, args, options, onStdin) ->
# Remove undefined/null values
args = _.without(args, undefined)
args = _.without(args, null)
return new Promise((resolve, reject) =>
@debug('spawn', exe, args)
cmd = spawn(exe, args, options)
stdout = ""
stderr = ""
cmd.stdout.on('data', (data) ->
stdout += data
)
cmd.stderr.on('data', (data) ->
stderr += data
)
cmd.on('close', (returnCode) =>
@debug('spawn done', returnCode, stderr, stdout)
resolve({returnCode, stdout, stderr})
)
cmd.on('error', (err) =>
@debug('error', err)
reject(err)
)
onStdin cmd.stdin if onStdin
)
###
Add help to error.description
Note: error.description is not officially used in JavaScript,
however it is used internally for Atom Beautify when displaying errors.
###
commandNotFoundError: (exe, help) ->
exe ?= @name or @cmd
@constructor.commandNotFoundError(exe, help)
@commandNotFoundError: (exe, help) ->
# Create new improved error
# notify user that it may not be
# installed or in path
message = "Could not find '#{exe}'. \
The program may not be installed."
er = new Error(message)
er.code = 'CommandNotFound'
er.errno = er.code
er.syscall = 'beautifier::run'
er.file = exe
if help?
if typeof help is "object"
# Basic notice
helpStr = "See #{help.link} for program \
installation instructions.\n"
# Help to configure Atom Beautify for program's path
helpStr += "You can configure Atom Beautify \
with the absolute path \
to '#{help.program or exe}' by setting \
'#{help.pathOption}' in \
the Atom Beautify package settings.\n" if help.pathOption
# Optional, additional help
helpStr += help.additional if help.additional
# Common Help
issueSearchLink =
"https://github.com/Glavin001/atom-beautify/\
search?q=#{exe}&type=Issues"
docsLink = "https://github.com/Glavin001/\
atom-beautify/tree/master/docs"
helpStr += "Your program is properly installed if running \
'#{if @isWindows() then 'where.exe' \
else 'which'} #{exe}' \
in your #{if @isWindows() then 'CMD prompt' \
else 'Terminal'} \
returns an absolute path to the executable. \
If this does not work then you have not \
installed the program correctly and so \
Atom Beautify will not find the program. \
Atom Beautify requires that the program be \
found in your PATH environment variable. \n\
Note that this is not an Atom Beautify issue \
if beautification does not work and the above \
command also does not work: this is expected \
behaviour, since you have not properly installed \
your program. Please properly setup the program \
and search through existing Atom Beautify issues \
before creating a new issue. \
See #{issueSearchLink} for related Issues and \
#{docsLink} for documentation. \
If you are still unable to resolve this issue on \
your own then please create a new issue and \
ask for help.\n"
er.description = helpStr
else #if typeof help is "string"
er.description = help
return er
@_envCache = null
shellEnv: () ->
@constructor.shellEnv()
@shellEnv: () ->
if @_envCache
return Promise.resolve(@_envCache)
else
shellEnv()
.then((env) =>
@_envCache = env
)
###
Like the unix which utility.
Finds the first instance of a specified executable in the PATH environment variable.
Does not cache the results,
so hash -r is not needed when the PATH changes.
See https://github.com/isaacs/node-which
###
which: (exe, options) ->
@.constructor.which(exe, options)
@_whichCache = {}
@which: (exe, options = {}) ->
if @_whichCache[exe]
return Promise.resolve(@_whichCache[exe])
# Get PATH and other environment variables
@shellEnv()
.then((env) =>
new Promise((resolve, reject) =>
options.path ?= env.PATH
if @isWindows()
# Environment variables are case-insensitive in windows
# Check env for a case-insensitive 'path' variable
if !options.path
for i of env
if i.toLowerCase() is "path"
options.path = env[i]
break
# Trick node-which into including files
# with no extension as executables.
# Put empty extension last to allow for other real extensions first
options.pathExt ?= "#{process.env.PATHEXT ? '.EXE'};"
which(exe, options, (err, path) =>
return resolve(exe) if err
@_whichCache[exe] = path
resolve(path)
)
)
)
###
If platform is Windows
###
isWindows: () -> @constructor.isWindows()
@isWindows: () -> new RegExp('^win').test(process.platform)
class HybridExecutable extends Executable
dockerOptions: {
image: undefined
workingDir: "/workdir"
}
constructor: (options) ->
super(options)
if options.docker?
@dockerOptions = Object.assign({}, @dockerOptions, options.docker)
@docker = @constructor.dockerExecutable()
@docker: undefined
@dockerExecutable: () ->
if not @docker?
@docker = new Executable({
name: "Docker"
cmd: "docker"
homepage: "https://www.docker.com/"
installation: "https://www.docker.com/get-docker"
version: {
parse: (text) -> text.match(/version [0]*([1-9]\d*).[0]*([1-9]\d*).[0]*([1-9]\d*)/).slice(1).join('.')
}
})
return @docker
installedWithDocker: false
init: () ->
super()
.catch((error) =>
return Promise.reject(error) if not @docker?
@docker.init()
.then(=> @runImage(@versionArgs, @versionRunOptions))
.then((text) => @saveVersion(text))
.then(() => @installedWithDocker = true)
.then(=> @)
.catch((dockerError) =>
@debug(dockerError)
Promise.reject(error)
)
)
run: (args, options = {}) ->
if @installedWithDocker and @docker and @docker.isInstalled
return @runImage(args, options)
super(args, options)
runImage: (args, options) ->
@debug("Run Docker executable: ", args, options)
this.resolveArgs(args)
.then((args) =>
{ cwd } = options
tmpDir = os.tmpDir()
pwd = fs.realpathSync(cwd or tmpDir)
image = @dockerOptions.image
workingDir = @dockerOptions.workingDir
rootPath = '/mountedRoot'
newArgs = args.map((arg) ->
if (typeof arg is 'string' and not arg.includes(':') \
and path.isAbsolute(arg) and not path.dirname(arg).startsWith(tmpDir))
then path.join(rootPath, arg) else arg
)
@docker.run([
"run",
"--volume", "#{pwd}:#{workingDir}",
"--volume", "#{path.resolve('/')}:#{rootPath}",
"--workdir", workingDir,
image,
newArgs
],
options
)
)
module.exports = HybridExecutable

View File

@ -9,18 +9,33 @@ Beautifier = require('../beautifier')
module.exports = class R extends Beautifier module.exports = class R extends Beautifier
name: "formatR" name: "formatR"
link: "https://github.com/yihui/formatR" link: "https://github.com/yihui/formatR"
isPreInstalled: false executables: [
{
name: "Rscript"
cmd: "rscript"
homepage: "https://github.com/yihui/formatR"
installation: "https://github.com/yihui/formatR"
version: {
parse: (text) -> text.match(/version (\d+\.\d+\.\d+) /)[1]
runOptions: {
returnStderr: true
}
}
docker: {
image: "unibeautify/rscript"
}
}
]
options: { options: {
R: true R: true
} }
beautify: (text, language, options) -> beautify: (text, language, options) ->
rscript = @exe("rscript")
r_beautifier = path.resolve(__dirname, "formatR.r") r_beautifier = path.resolve(__dirname, "formatR.r")
@run("Rscript", [ rscript.run([
r_beautifier, r_beautifier,
options.indent_size, options.indent_size,
@tempFile("input", text), @tempFile("input", text),
'>',
@tempFile("input", text)
]) ])

View File

@ -9,7 +9,17 @@ path = require("path")
module.exports = class FortranBeautifier extends Beautifier module.exports = class FortranBeautifier extends Beautifier
name: "Fortran Beautifier" name: "Fortran Beautifier"
link: "https://www.gnu.org/software/emacs/" link: "https://www.gnu.org/software/emacs/"
isPreInstalled: false executables: [
{
name: "Emacs"
cmd: "emacs"
homepage: "https://www.gnu.org/software/emacs/"
installation: "https://www.gnu.org/software/emacs/"
version: {
parse: (text) -> text.match(/Emacs (\d+\.\d+\.\d+)/)[1]
}
}
]
options: { options: {
Fortran: true Fortran: true
@ -17,6 +27,7 @@ module.exports = class FortranBeautifier extends Beautifier
beautify: (text, language, options) -> beautify: (text, language, options) ->
@debug('fortran-beautifier', options) @debug('fortran-beautifier', options)
emacs = @exe("emacs")
emacs_path = options.emacs_path emacs_path = options.emacs_path
emacs_script_path = options.emacs_script_path emacs_script_path = options.emacs_script_path
@ -36,12 +47,13 @@ module.exports = class FortranBeautifier extends Beautifier
] ]
if emacs_path if emacs_path
@deprecate("The \"emacs_path\" has been deprecated. Please switch to using the config with path \"Executables - Emacs - Path\" in Atom-Beautify package settings now.")
@run(emacs_path, args, {ignoreReturnCode: false}) @run(emacs_path, args, {ignoreReturnCode: false})
.then(=> .then(=>
@readFile(tempFile) @readFile(tempFile)
) )
else else
@run("emacs", args, {ignoreReturnCode: false}) emacs.run(args, {ignoreReturnCode: false})
.then(=> .then(=>
@readFile(tempFile) @readFile(tempFile)
) )

View File

@ -3,8 +3,6 @@
"use strict" "use strict"
Beautifier = require('./beautifier') Beautifier = require('./beautifier')
Lexer = require('gherkin').Lexer('en')
logger = require('../logger')(__filename)
module.exports = class Gherkin extends Beautifier module.exports = class Gherkin extends Beautifier
name: "Gherkin formatter" name: "Gherkin formatter"
@ -15,6 +13,8 @@ module.exports = class Gherkin extends Beautifier
} }
beautify: (text, language, options) -> beautify: (text, language, options) ->
Lexer = require('gherkin').Lexer('en')
logger = @logger
return new @Promise((resolve, reject) -> return new @Promise((resolve, reject) ->
recorder = { recorder = {
lines: [] lines: []

View File

@ -278,10 +278,11 @@ module.exports = class Beautifiers extends EventEmitter
return Promise.all(allOptions) return Promise.all(allOptions)
.then((allOptions) => .then((allOptions) =>
return new Promise((resolve, reject) => return new Promise((resolve, reject) =>
logger.info('beautify', text, allOptions, grammar, filePath, onSave, language) logger.debug('beautify', text, allOptions, grammar, filePath, onSave, language)
logger.verbose(allOptions) logger.verbose(allOptions)
language ?= @getLanguage(grammar, filePath) language ?= @getLanguage(grammar, filePath)
fileExtension = @getExtension(filePath)
# Check if unsupported language # Check if unsupported language
if !language if !language
@ -343,9 +344,14 @@ module.exports = class Beautifiers extends EventEmitter
context = context =
filePath: filePath filePath: filePath
fileExtension: fileExtension
startTime = new Date() startTime = new Date()
beautifier.loadExecutables()
.then((executables) ->
logger.verbose('executables', executables)
beautifier.beautify(text, language.name, options, context) beautifier.beautify(text, language.name, options, context)
)
.then((result) => .then((result) =>
resolve(result) resolve(result)
# Track Timing # Track Timing
@ -364,6 +370,7 @@ module.exports = class Beautifiers extends EventEmitter
}) })
) )
.catch((error) => .catch((error) =>
logger.error(error)
reject(error) reject(error)
# Track Errors # Track Errors
@trackEvent({ @trackEvent({
@ -400,7 +407,6 @@ module.exports = class Beautifiers extends EventEmitter
if atom.config.get("atom-beautify.general.muteUnsupportedLanguageErrors") if atom.config.get("atom-beautify.general.muteUnsupportedLanguageErrors")
return resolve( null ) return resolve( null )
else else
fileExtension = @getExtension(filePath)
repoBugsUrl = pkg.bugs.url repoBugsUrl = pkg.bugs.url
title = "Atom Beautify could not find a supported beautifier for this file" title = "Atom Beautify could not find a supported beautifier for this file"
detail = """ detail = """

View File

@ -8,8 +8,7 @@ format = require './beautifier'
module.exports = class Lua extends Beautifier module.exports = class Lua extends Beautifier
name: "Lua beautifier" name: "Lua beautifier"
link: "https://www.perl.org/" link: "https://github.com/Glavin001/atom-beautify/blob/master/src/beautifiers/lua-beautifier/beautifier.coffee"
isPreInstalled: false
options: { options: {
Lua: true Lua: true

View File

@ -10,7 +10,30 @@ module.exports = class PHPCSFixer extends Beautifier
name: 'PHP-CS-Fixer' name: 'PHP-CS-Fixer'
link: "https://github.com/FriendsOfPHP/PHP-CS-Fixer" link: "https://github.com/FriendsOfPHP/PHP-CS-Fixer"
isPreInstalled: false executables: [
{
name: "PHP"
cmd: "php"
homepage: "http://php.net/"
installation: "http://php.net/manual/en/install.php"
version: {
parse: (text) -> text.match(/PHP (.*) \(cli\)/)[1]
}
}
{
name: "PHP-CS-Fixer"
cmd: "php-cs-fixer"
homepage: "https://github.com/FriendsOfPHP/PHP-CS-Fixer"
installation: "https://github.com/FriendsOfPHP/PHP-CS-Fixer#installation"
version: {
parse: (text) -> text.match(/version (.*) by/)[1] + ".0"
}
docker: {
image: "unibeautify/php-cs-fixer"
workingDir: "/project"
}
}
]
options: options:
PHP: PHP:
@ -24,7 +47,8 @@ module.exports = class PHPCSFixer extends Beautifier
beautify: (text, language, options, context) -> beautify: (text, language, options, context) ->
@debug('php-cs-fixer', options) @debug('php-cs-fixer', options)
version = options.cs_fixer_version php = @exe('php')
phpCsFixer = @exe('php-cs-fixer')
configFiles = ['.php_cs', '.php_cs.dist'] configFiles = ['.php_cs', '.php_cs.dist']
# Find a config file in the working directory if a custom one was not provided # Find a config file in the working directory if a custom one was not provided
@ -42,7 +66,7 @@ module.exports = class PHPCSFixer extends Beautifier
"--allow-risky=#{options.allow_risky}" if options.allow_risky "--allow-risky=#{options.allow_risky}" if options.allow_risky
"--using-cache=no" "--using-cache=no"
] ]
if version is 1 if phpCsFixer.isVersion('1.x')
phpCsFixerOptions = [ phpCsFixerOptions = [
"fix" "fix"
"--level=#{options.level}" if options.level "--level=#{options.level}" if options.level
@ -57,10 +81,15 @@ module.exports = class PHPCSFixer extends Beautifier
} }
# Find php-cs-fixer.phar script # Find php-cs-fixer.phar script
if options.cs_fixer_path
@deprecate("The \"cs_fixer_path\" has been deprecated. Please switch to using the config with path \"Executables - PHP-CS-Fixer - Path\" in Atom-Beautify package settings now.")
@Promise.all([ @Promise.all([
@which(options.cs_fixer_path) if options.cs_fixer_path @which(options.cs_fixer_path) if options.cs_fixer_path
@which('php-cs-fixer') @which('php-cs-fixer')
]).then((paths) => tempFile = @tempFile("temp", text, '.php')
]).then(([customPath, phpCsFixerPath]) =>
paths = [customPath, phpCsFixerPath]
@debug('php-cs-fixer paths', paths) @debug('php-cs-fixer paths', paths)
_ = require 'lodash' _ = require 'lodash'
# Get first valid, absolute path # Get first valid, absolute path
@ -71,10 +100,8 @@ module.exports = class PHPCSFixer extends Beautifier
# Check if PHP-CS-Fixer path was found # Check if PHP-CS-Fixer path was found
if phpCSFixerPath? if phpCSFixerPath?
# Found PHP-CS-Fixer path # Found PHP-CS-Fixer path
tempFile = @tempFile("temp", text)
if @isWindows if @isWindows
@run("php", [phpCSFixerPath, phpCsFixerOptions, tempFile], runOptions) php.run([phpCSFixerPath, phpCsFixerOptions, tempFile], runOptions)
.then(=> .then(=>
@readFile(tempFile) @readFile(tempFile)
) )

View File

@ -8,6 +8,20 @@ Beautifier = require('./beautifier')
module.exports = class PHPCBF extends Beautifier module.exports = class PHPCBF extends Beautifier
name: "PHPCBF" name: "PHPCBF"
link: "http://php.net/manual/en/install.php" link: "http://php.net/manual/en/install.php"
executables: [
{
name: "PHPCBF"
cmd: "phpcbf"
homepage: "https://github.com/squizlabs/PHP_CodeSniffer"
installation: "https://github.com/squizlabs/PHP_CodeSniffer#installation"
version: {
args: ['--version']
}
docker: {
image: "unibeautify/phpcbf"
}
}
]
isPreInstalled: false isPreInstalled: false
options: { options: {

View File

@ -4,7 +4,20 @@ Beautifier = require('./beautifier')
module.exports = class SassConvert extends Beautifier module.exports = class SassConvert extends Beautifier
name: "SassConvert" name: "SassConvert"
link: "http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax" link: "http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax"
isPreInstalled: false executables: [
{
name: "SassConvert"
cmd: "sass-convert"
homepage: "http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax"
installation: "http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax"
version: {
parse: (text) -> text.match(/Sass (\d+\.\d+\.\d+)/)[1]
}
docker: {
image: "unibeautify/sass-convert"
}
}
]
options: options:
# TODO: Add support for options # TODO: Add support for options
@ -14,8 +27,7 @@ module.exports = class SassConvert extends Beautifier
beautify: (text, language, options, context) -> beautify: (text, language, options, context) ->
lang = language.toLowerCase() lang = language.toLowerCase()
@exe("sass-convert").run([
@run("sass-convert", [
@tempFile("input", text), @tempFile("input", text),
"--from", lang, "--to", lang "--from", lang, "--to", lang
]) ])

View File

@ -11,7 +11,27 @@ _ = require('lodash')
module.exports = class Uncrustify extends Beautifier module.exports = class Uncrustify extends Beautifier
name: "Uncrustify" name: "Uncrustify"
link: "https://github.com/uncrustify/uncrustify" link: "https://github.com/uncrustify/uncrustify"
isPreInstalled: false executables: [
{
name: "Uncrustify"
cmd: "uncrustify"
homepage: "http://uncrustify.sourceforge.net/"
installation: "https://github.com/uncrustify/uncrustify"
version: {
parse: (text) ->
try
v = text.match(/uncrustify (\d+\.\d+)/)[1]
catch error
@error(error)
v = text.match(/Uncrustify-(\d+\.\d+)/)[1] if not v?
if v
return v + ".0"
}
docker: {
image: "unibeautify/uncrustify"
}
}
]
options: { options: {
Apex: true Apex: true
@ -26,7 +46,10 @@ module.exports = class Uncrustify extends Beautifier
Arduino: true Arduino: true
} }
beautify: (text, language, options) -> beautify: (text, language, options, context) ->
fileExtension = context.fileExtension
uncrustify = @exe("uncrustify")
# console.log('uncrustify.beautify', language, options) # console.log('uncrustify.beautify', language, options)
return new @Promise((resolve, reject) -> return new @Promise((resolve, reject) ->
configPath = options.configPath configPath = options.configPath
@ -50,8 +73,6 @@ module.exports = class Uncrustify extends Beautifier
reject(new Error("No Uncrustify Config Path set! Please configure Uncrustify with Atom Beautify.")) reject(new Error("No Uncrustify Config Path set! Please configure Uncrustify with Atom Beautify."))
) )
.then((configPath) => .then((configPath) =>
# Select Uncrustify language # Select Uncrustify language
lang = "C" # Default is C lang = "C" # Default is C
switch language switch language
@ -76,18 +97,16 @@ module.exports = class Uncrustify extends Beautifier
when "Arduino" when "Arduino"
lang = "CPP" lang = "CPP"
@run("uncrustify", [ uncrustify.run([
"-c" "-c"
configPath configPath
"-f" "-f"
@tempFile("input", text) @tempFile("input", text, fileExtension and ".#{fileExtension}")
"-o" "-o"
outputFile = @tempFile("output", text) outputFile = @tempFile("output", text, fileExtension and ".#{fileExtension}")
"-l" "-l"
lang lang
], help: { ])
link: "http://sourceforge.net/projects/uncrustify/"
})
.then(=> .then(=>
@readFile(outputFile) @readFile(outputFile)
) )

View File

@ -3,7 +3,7 @@ module.exports = {
title: 'General' title: 'General'
type: 'object' type: 'object'
collapsed: true collapsed: true
order: -1 order: -2
description: 'General options for Atom Beautify' description: 'General options for Atom Beautify'
properties: properties:
_analyticsUserId : _analyticsUserId :

View File

@ -78,13 +78,13 @@ module.exports = {
no_lead_zero: no_lead_zero:
type: 'boolean' type: 'boolean'
default: false default: false
description: "If in CSS values leading 0s immediately preceeding \ description: "If in CSS values leading 0s immediately preceding \
a decimal should be removed or prevented." a decimal should be removed or prevented."
configPath: configPath:
title: "comb custom config file" title: "comb custom config file"
type: 'string' type: 'string'
default: "" default: ""
description: "Path to custom CSScomb config file, used in absense of a \ description: "Path to custom CSScomb config file, used in absence of a \
`.csscomb.json` or `.csscomb.cson` at the root of your project." `.csscomb.json` or `.csscomb.cson` at the root of your project."
predefinedConfig: predefinedConfig:
title: "comb predefined config" title: "comb predefined config"

View File

@ -44,7 +44,7 @@ module.exports = {
indent_preamble: indent_preamble:
type: 'boolean' type: 'boolean'
default: false default: false
description: "Indent the preable" description: "Indent the preamble"
always_look_for_split_braces: always_look_for_split_braces:
type: 'boolean' type: 'boolean'
default: true default: true
@ -60,5 +60,5 @@ module.exports = {
align_columns_in_environments: align_columns_in_environments:
type: 'array' type: 'array'
default:["tabular", "matrix", "bmatrix", "pmatrix"] default:["tabular", "matrix", "bmatrix", "pmatrix"]
decription: "Aligns columns by the alignment tabs for environments specified" description: "Aligns columns by the alignment tabs for environments specified"
} }

View File

@ -38,5 +38,5 @@ module.exports = {
title: "Don't join curly brackets" title: "Don't join curly brackets"
type: "boolean" type: "boolean"
default: true default: true
descriotion: "" description: ""
} }

View File

@ -38,7 +38,7 @@ module.exports = {
type: 'string' type: 'string'
default: 'autopep8' default: 'autopep8'
enum: ['autopep8', 'yapf'] enum: ['autopep8', 'yapf']
description: "formater used by pybeautifier" description: "formatter used by pybeautifier"
style_config: style_config:
type: 'string' type: 'string'
default: 'pep8' default: 'pep8'

View File

@ -1072,7 +1072,7 @@
"no_lead_zero": { "no_lead_zero": {
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"description": "If in CSS values leading 0s immediately preceeding a decimal should be removed or prevented. (Supported by Pretty Diff)", "description": "If in CSS values leading 0s immediately preceding a decimal should be removed or prevented. (Supported by Pretty Diff)",
"title": "No lead zero", "title": "No lead zero",
"beautifiers": [ "beautifiers": [
"Pretty Diff" "Pretty Diff"
@ -1087,7 +1087,7 @@
"title": "comb custom config file", "title": "comb custom config file",
"type": "string", "type": "string",
"default": "", "default": "",
"description": "Path to custom CSScomb config file, used in absense of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb)", "description": "Path to custom CSScomb config file, used in absence of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb)",
"beautifiers": [ "beautifiers": [
"CSScomb" "CSScomb"
], ],
@ -4239,7 +4239,7 @@
"indent_preamble": { "indent_preamble": {
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"description": "Indent the preable (Supported by Latex Beautify)", "description": "Indent the preamble (Supported by Latex Beautify)",
"title": "Indent preamble", "title": "Indent preamble",
"beautifiers": [ "beautifiers": [
"Latex Beautify" "Latex Beautify"
@ -4300,7 +4300,7 @@
"bmatrix", "bmatrix",
"pmatrix" "pmatrix"
], ],
"decription": "Aligns columns by the alignment tabs for environments specified", "description": "Aligns columns by the alignment tabs for environments specified (Supported by Latex Beautify)",
"title": "Align columns in environments", "title": "Align columns in environments",
"beautifiers": [ "beautifiers": [
"Latex Beautify" "Latex Beautify"
@ -4309,8 +4309,7 @@
"language": { "language": {
"name": "LaTeX", "name": "LaTeX",
"namespace": "latex" "namespace": "latex"
}, }
"description": " (Supported by Latex Beautify)"
}, },
"disabled": { "disabled": {
"title": "Disable Beautifying Language", "title": "Disable Beautifying Language",
@ -4490,7 +4489,7 @@
"no_lead_zero": { "no_lead_zero": {
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"description": "If in CSS values leading 0s immediately preceeding a decimal should be removed or prevented. (Supported by Pretty Diff)", "description": "If in CSS values leading 0s immediately preceding a decimal should be removed or prevented. (Supported by Pretty Diff)",
"title": "No lead zero", "title": "No lead zero",
"beautifiers": [ "beautifiers": [
"Pretty Diff" "Pretty Diff"
@ -4505,7 +4504,7 @@
"title": "comb custom config file", "title": "comb custom config file",
"type": "string", "type": "string",
"default": "", "default": "",
"description": "Path to custom CSScomb config file, used in absense of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb)", "description": "Path to custom CSScomb config file, used in absence of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb)",
"beautifiers": [ "beautifiers": [
"CSScomb" "CSScomb"
], ],
@ -5439,7 +5438,7 @@
"title": "Don't join curly brackets", "title": "Don't join curly brackets",
"type": "boolean", "type": "boolean",
"default": true, "default": true,
"descriotion": "", "description": " (Supported by Nginx Beautify)",
"beautifiers": [ "beautifiers": [
"Nginx Beautify" "Nginx Beautify"
], ],
@ -5447,8 +5446,7 @@
"language": { "language": {
"name": "Nginx", "name": "Nginx",
"namespace": "nginx" "namespace": "nginx"
}, }
"description": " (Supported by Nginx Beautify)"
}, },
"disabled": { "disabled": {
"title": "Disable Beautifying Language", "title": "Disable Beautifying Language",
@ -6110,7 +6108,7 @@
"autopep8", "autopep8",
"yapf" "yapf"
], ],
"description": "formater used by pybeautifier (Supported by autopep8, pybeautifier)", "description": "formatter used by pybeautifier (Supported by autopep8, pybeautifier)",
"title": "Formater", "title": "Formater",
"beautifiers": [ "beautifiers": [
"autopep8", "autopep8",
@ -6707,7 +6705,7 @@
"no_lead_zero": { "no_lead_zero": {
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"description": "If in CSS values leading 0s immediately preceeding a decimal should be removed or prevented. (Supported by Pretty Diff)", "description": "If in CSS values leading 0s immediately preceding a decimal should be removed or prevented. (Supported by Pretty Diff)",
"title": "No lead zero", "title": "No lead zero",
"beautifiers": [ "beautifiers": [
"Pretty Diff" "Pretty Diff"
@ -6722,7 +6720,7 @@
"title": "comb custom config file", "title": "comb custom config file",
"type": "string", "type": "string",
"default": "", "default": "",
"description": "Path to custom CSScomb config file, used in absense of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb)", "description": "Path to custom CSScomb config file, used in absence of a `.csscomb.json` or `.csscomb.cson` at the root of your project. (Supported by CSScomb)",
"beautifiers": [ "beautifiers": [
"CSScomb" "CSScomb"
], ],
@ -7323,7 +7321,7 @@
"no_lead_zero": { "no_lead_zero": {
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"description": "If in CSS values leading 0s immediately preceeding a decimal should be removed or prevented. (Supported by Pretty Diff)", "description": "If in CSS values leading 0s immediately preceding a decimal should be removed or prevented. (Supported by Pretty Diff)",
"title": "No lead zero", "title": "No lead zero",
"beautifiers": [ "beautifiers": [
"Pretty Diff" "Pretty Diff"
@ -9122,5 +9120,238 @@
"description": "Automatically beautify YAML files on save" "description": "Automatically beautify YAML files on save"
} }
} }
},
"executables": {
"title": "Executables",
"type": "object",
"collapsed": true,
"order": -1,
"description": "Configure executables used by beautifiers.",
"properties": {
"uncrustify": {
"key": "uncrustify",
"title": "Uncrustify",
"type": "object",
"collapsed": true,
"description": "Options for Uncrustify executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"uncrustify\" executable's binary/script."
}
}
},
"autopep8": {
"key": "autopep8",
"title": "autopep8",
"type": "object",
"collapsed": true,
"description": "Options for autopep8 executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"autopep8\" executable's binary/script."
}
}
},
"isort": {
"key": "isort",
"title": "isort",
"type": "object",
"collapsed": true,
"description": "Options for isort executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"isort\" executable's binary/script."
}
}
},
"clang-format": {
"key": "clang-format",
"title": "ClangFormat",
"type": "object",
"collapsed": true,
"description": "Options for ClangFormat executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"clang-format\" executable's binary/script."
}
}
},
"crystal": {
"key": "crystal",
"title": "Crystal",
"type": "object",
"collapsed": true,
"description": "Options for Crystal executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"crystal\" executable's binary/script."
}
}
},
"dfmt": {
"key": "dfmt",
"title": "Dfmt",
"type": "object",
"collapsed": true,
"description": "Options for Dfmt executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"dfmt\" executable's binary/script."
}
}
},
"elm-format": {
"key": "elm-format",
"title": "elm-format",
"type": "object",
"collapsed": true,
"description": "Options for elm-format executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"elm-format\" executable's binary/script."
}
}
},
"emacs": {
"key": "emacs",
"title": "Emacs",
"type": "object",
"collapsed": true,
"description": "Options for Emacs executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"emacs\" executable's binary/script."
}
}
},
"php": {
"key": "php",
"title": "PHP",
"type": "object",
"collapsed": true,
"description": "Options for PHP executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"php\" executable's binary/script."
}
}
},
"php-cs-fixer": {
"key": "php-cs-fixer",
"title": "PHP-CS-Fixer",
"type": "object",
"collapsed": true,
"description": "Options for PHP-CS-Fixer executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"php-cs-fixer\" executable's binary/script."
}
}
},
"phpcbf": {
"key": "phpcbf",
"title": "PHPCBF",
"type": "object",
"collapsed": true,
"description": "Options for PHPCBF executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"phpcbf\" executable's binary/script."
}
}
},
"sass-convert": {
"key": "sass-convert",
"title": "SassConvert",
"type": "object",
"collapsed": true,
"description": "Options for SassConvert executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"sass-convert\" executable's binary/script."
}
}
},
"rscript": {
"key": "rscript",
"title": "Rscript",
"type": "object",
"collapsed": true,
"description": "Options for Rscript executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"rscript\" executable's binary/script."
}
}
},
"beautysh": {
"key": "beautysh",
"title": "beautysh",
"type": "object",
"collapsed": true,
"description": "Options for beautysh executable.",
"properties": {
"path": {
"key": "path",
"title": "Binary/Script Path",
"type": "string",
"default": "",
"description": "Absolute path to the \"beautysh\" executable's binary/script."
}
}
}
}
} }
} }