• Stars
    star
    326
  • Rank 129,027 (Top 3 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created almost 3 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Format your blade template using Prettier
Prettier PHP

Prettier Blade Plugin

GitHub Workflow Status npm version

Format your blade template using Prettier

Features

  • Automatically indent markup inside directives
  • Automatically add spacing to blade template markers
  • PHP 8 syntax support (null safe operator, named arguments)
  • Compliant to PSR-2 coding standard (PHP code inside directives)
  • Automatically sort Tailwind CSS classes with respect of tailwind.config.js

Installation

$ npm install --save-dev @shufo/prettier-plugin-blade prettier

# yarn
$ yarn add -D @shufo/prettier-plugin-blade prettier

# pnpm
$ pnpm add -D @shufo/prettier-plugin-blade prettier

then, add in your Prettier configuration:

{
    "plugins": [
        "@shufo/prettier-plugin-blade"
    ],
    "overrides": [
        {
            "files": ["*.blade.php"],
            "options": {
                "parser": "blade",
                "tabWidth": 4
            }
        }
    ]
}

Prettier version Compatibilitiy

Prettier Package
3.x 1.9.x
2.x 1.8.x

Usage (CLI)

$ ./node_modules/.bin/prettier --write resources/**/*.blade.php
Screen.record.from.2022-01-27.20.53.05@2x_0.5.mp4

Example

Input

@extends('frontend.layouts.app')
@section('head')
@endsection
@section('title') foo
@endsection
@section('content')
<section id="content">
    <div class="container mod-users-pd-h">
        <div class="pf-user-header">
            <div></div>
            <p>@lang('users.index')</p>
        </div>
        <div class="pf-users-branch">
            <ul class="pf-users-branch__list">
                @foreach($tree as $users)
                <li>
                    <img src="{{ asset("img/frontend/icon/branch-arrow.svg") }}" alt="branch_arrow">
                    {{ link_to_route('frontend.users.user.show',$users["name"],$users['_id']) }}
                </li>
                @endforeach
            </ul>
            <div class="pf-users-branch__btn">
                @can('create', App\Models\User::class)
                {!! link_to_route('frontend.users.user.create', __('users.create'), [], ['class' => 'btn']) !!}
                @endcan
            </div>
        </div>
    </div>
</section>
@endsection
@section('footer')
@stop

Output

@extends('frontend.layouts.app')
@section('title') foo
@endsection
@section('content')
    <section id="content">
        <div class="container mod-users-pd-h">
            <div class="pf-user-header">
                <div></div>
                <p>@lang('users.index')</p>
            </div>
            <div class="pf-users-branch">
                <ul class="pf-users-branch__list">
                    @foreach ($users as $user)
                        <li>
                            <img src="{{ asset('img/frontend/icon/branch-arrow.svg') }}" alt="branch_arrow">
                            {{ link_to_route('frontend.users.user.show', $users['name'], $users['_id']) }}
                        </li>
                    @endforeach
                </ul>
                <div class="pf-users-branch__btn">
                    @can('create', App\Models\User::class)
                        {!! link_to_route('frontend.users.user.create', __('users.create'), [1, 2, 3], ['class' => 'btn']) !!}
                    @endcan
                </div>
            </div>
        </div>
    </section>
@endsection
@section('footer')
@stop

Options

You can use these options for prettier blade plugin in prettier CLI.

key description
--tab-width Number of spaces per indentation level. default: 4
--print-width The line length where Prettier will try wrap. default: 120
--wrap-attributes The way to wrap attributes. [auto|force|force-aligned|force-expand-multiline|aligned-multiple|preserve|preserve-aligned]. default: auto
--end-with-new-line End output with newline. default: true
--sort-tailwindcss-classes Sort Tailwind CSS classes. It will automatically look for and respect tailwind.config.js if it exists. default: false
--tailwindcss-config-path Path to your custom Tailwind configuration file. This option is only available if --sort-tailwindcss-classes is present. default: ''
--sort-html-attributes Sort HTML Attributes in the specified order. [none | alphabetical | code-guide | idiomatic | vuejs] default: none
--no-php-syntax-check Disable PHP syntax checking. default: false

.prettierrc example

{
    "printWidth": 120,
    "tabWidth": 4,
    "wrapAttributes": "auto",
    "sortTailwindcssClasses": true,
    "sortHtmlAttributes": "none",
    "noPhpSyntaxCheck": false
}

Disabling format in file

To disable formatting in your file, you can use blade/html comments in the following format:

{{-- prettier-ignore-start --}}
    {{ $foo }}
    {{ $bar }}
{{-- prettier-ignore-end --}}

or

<!-- prettier-ignore-start -->
    {{ $foo }}
    {{ $bar }}
<!-- prettier-ignore-end -->

To disable formatting on a specific line, you can use comment in the following format:

{{-- prettier-ignore --}}
    {{ $foo }}

or

<!-- prettier-ignore -->
    {{ $foo }}

Editor Integration

The editors below are confirmed to work with this plugin.

VSCode

You can use Prettier extension for VSCode to format blade in VSCode. You need to install this plugin as a local dependency. see https://github.com/prettier/prettier-vscode#prettier-resolution

If you want to use a formatter without Prettier, please consider to use the vscode-blade-formatter instead.

Vim

You can use coc-prettier plugin on coc.nvim

If you want to use formater without Prettier, please consider to using coc-blade

JetBrains WebStorm, PHPStorm, PyCharm...

You can use the Prettier Plugin for JetBrains IDE.

Add extension setting blade.php to File | Settings | Languages & Frameworks | JavaScript | Prettier | Run for files:

e.g.

{**/*,*}.{js,ts,jsx,tsx,blade.php}

and turn on checkbox On 'Reformat Code' action

Restart your IDE if you get the error: 'Prettier: File *.php has unsupported type'

Limitation

This plugin is based on blade-formatter which does not generate ASTs with lexer, so it might break indentation on complex blade.

Like:

  • The mix of open/closed HTML tag and directives

Example of unexpected code

@if ($user)
    <div>
    @else
    </div>
@endif

Example of expected code

@if ($user)
    <div>foo</div>
@else
    <div>bar</div>
@endif

Please keep the blade template as simple as possible for better formatting.

API

You can format the blade file programmatically using Prettier's API

// CommonJS
const prettier = require('prettier');

const input = `
<div>
  @if ($user)
  {{ $foo }}
  @else
  {{ $bar }}
  @endif
</div>
`;

const res = await prettier.format(input, { parser: 'blade' });
console.log(res);
// =>
//<div>
//    @if ($user)
//        {{ $foo }}
//    @else
//        {{ $bar }}
//    @endif
//</div>

// ES Module
import * as prettier from 'prettier';

const input = `
<div>
  @if ($user)
  {{ $foo }}
  @else
  {{ $bar }}
  @endif
</div>
`;
const res = await prettier.format(input, { parser: 'blade' });
console.log(res);

Development

$ yarn install
$ yarn run watch # watch changes

Testing

$ yarn install
$ yarn run test

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

Contributors

shufo
Shuhei Hayashibara
howdu
Beej
ianjamieson
Ian Jamieson
mortenscheel
Morten Scheel
nessimabadi
Nessim Abadi
vuolter
Walter Purcaro

LICENSE

MIT

More Repositories

1

vscode-blade-formatter

An opinionated Blade file formatter for VSCode
TypeScript
4,209
star
2

blade-formatter

An opinionated blade template formatter for Laravel that respects readability
TypeScript
442
star
3

nginx-consul-template

A dynamic configurable Nginx with Consul.
Shell
76
star
4

fcmex

A Firebase Cloud Message client for Elixir
Elixir
75
star
5

log_viewer

An Web based Log Viewer for Elixir and Phoenix
Elixir
59
star
6

ansible-haproxy-keepalived

A playbook building high availability Load Balancer with HAProxy and keepalived.
Shell
40
star
7

ex_doc_refined

A refined document viewer for Elixir and Phoenix
Elixir
34
star
8

terraform-boilerplate-ecs-alb

Terraform boilerplate for ECS with ALB.
HCL
26
star
9

auto-assign-reviewer-by-files

A Github Action automatically assigns reviewers to PR based on changed files
JavaScript
22
star
10

python-lambda-image

A thumbnail generator with AWS lambda and python.
Python
18
star
11

cdn

CDN Assets Manager for Elixir
Elixir
15
star
12

go-graphql-boilerplate

A boilerplate for creating GraphQL server with Go
Go
14
star
13

joplin-plugin-markdown-prettier

Format your joplin notes by prettier
TypeScript
14
star
14

docker-phoenix

A script for creating elixir image for phoenix framework.
Dockerfile
10
star
15

ecs-fargate-oneshot

Executes oneshot task on ECS (Fargate)
Go
9
star
16

amazon-3rd-party-seller-filter

Chrome Extension that filtering out 3rd party seller's product on amazon search results
JavaScript
9
star
17

plug_rate_limit_redis

An Elixir plug rate limiting with redis
Elixir
8
star
18

shufo.dev

My homepage
TypeScript
8
star
19

online-blade-formatter

An opinionated blade formatter on online
Vue
8
star
20

tailwindcss-class-sorter

A tailwindcss class sorter that respects tailwind config file
TypeScript
5
star
21

ansible-sudo-ldap

A playbook for sudo administration with ldap server.
5
star
22

elixir_101

Getting Started Elixir with TDD
Elixir
4
star
23

html-attribute-sorter

An html attribute sorter
TypeScript
4
star
24

docker-teleport

A docker image of teleport.
Makefile
4
star
25

per-directory-history

A port of zsh's per directory history for fish shell
Shell
4
star
26

lambda-pdf-generator

A lambda function that generates PDF with headless chrome
HCL
4
star
27

plug_cache

An Elixir plug to cache the response
Elixir
4
star
28

payjp-elixir

An Elixir library for working with PAY.JP.
Elixir
4
star
29

laravel-opensearch

An easy way to use the official OpenSearch client in your Laravel applications.
PHP
4
star
30

ansible-skype-hubot

A playbook for skype and hubot integration on CentOS.
CoffeeScript
3
star
31

plug_robots

An Elixir plug serving robots.txt.
Elixir
3
star
32

phoenix_api_101

Elixir
3
star
33

docker-v8js-php7

A v8js image with php 7.
3
star
34

docker-microservice-template

A template for create your own microservice with docker
Shell
3
star
35

phoenix_101

Elixir
3
star
36

branchlint

A git branch linter to enforce branch naming convention
JavaScript
3
star
37

ansible-openssh-openldap

A playbook for SSH key authentication via OpenLDAP
Shell
3
star
38

bom

An elixir library for working with BOM (byte order mark).
Elixir
2
star
39

auto-assign-reviewer-by-issuer

A GitHub Action to automatically assigns reviewer by issuer
JavaScript
2
star
40

learning-elixir-with-tdd

Learn Elixir with TDD
Elixir
2
star
41

activity_log

A logger with Activitiy Streams like format for Elixir
Elixir
2
star
42

paidy-elixir

An Elixir library for working with Paidy
Elixir
2
star
43

auto-assign-reviewer-by-assignee

A GitHub Action automatically assigns reviewers by assignee
JavaScript
2
star
44

docker-phantomjs

A Dockerized phantomjs image.
1
star
45

timed-url-opener

Automatically open a specific URL at a scheduled time in your browser
TypeScript
1
star
46

docker-v8

A v8 engine image.
1
star
47

lambda-query

A serverless DB querying client with Lambda
Go
1
star
48

ex_redis_101

Elixir
1
star
49

ansible-redhat-lamp

A playbook to setup LAMP stack on a CentOS Vagrant virtual machine.
1
star
50

docker-go-graphql-base

Dockerfile
1
star
51

docker-laravel-alpine

Laravel 5.*, 6.*, 7.*, 8.* ready image with composer
Dockerfile
1
star
52

plug_maintenance

An Elixir plug returns a service unavailable response during maintenance
Elixir
1
star
53

aspida

A social media detox app built with Electron and Vue.js in TypeScript
JavaScript
1
star
54

ex_line_pay

A LINE Pay client for Elixir
Elixir
1
star
55

ex_aws_101

Elixir
1
star