• Stars
    star
    442
  • Rank 98,677 (Top 2 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created about 5 years ago
  • Updated about 2 months ago

Reviews

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

Repository Details

An opinionated blade template formatter for Laravel that respects readability

npm version GitHub Workflow Status npm NPM codecov

blade-formatter

An opinionated blade template formatter for Laravel that respects readability

blade-formatter

This project aims to provide a formatter for blade templates, as there is no official blade template formatter.

Try the online demo

Features

  • Automatically Indents markup inside directives

    blade-formatter-indent

  • Automatically add spacing to blade templating markers

    blade-formatter-spacing

  • PHP 8 support (null safe operator, named arguments) 🐘

    blade-formatter-php8

  • PSR-2 support (format inside directives)

    blade-formatter-format-in-directive

  • Automatic Tailwind CSS Class Sorting. see Options

  • Custom Directive support

Example

Input

@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

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

Installation

$ npm install --save-dev blade-formatter
$ node_modules/.bin/blade-formatter -h

yarn

$ yarn add --dev blade-formatter

global

$ npm install -g blade-formatter
$ yarn global add blade-formatter

docker

$ docker run -it -v $(pwd):/app -w /app shufo/blade-formatter resources/**/*.blade.php

Usage

  • Basic
# This outputs formatted result to stdout
$ blade-formatter resources/**/*.blade.php
$ blade-formatter resources/layouts/app.blade.php
  • Check if template is formatted or not (makes no change)
$ blade-formatter app/** -d -c
Check formatting...
app/index.blade.php

Above file(s) are formattable. Forgot to run formatter? Use --write option to overwrite.
$ echo $?
1
  • Format files and overwrite
$ blade-formatter --write resources/**/*.blade.php
  • Show diffs
$ blade-formatter -c -d resources/**/*.blade.php

Options

  Options:
      --version                       Show version number  [boolean]
  -c, --check-formatted               Only checks files are formatted or not  [boolean] [default: false]
  -w, --write                         Write to file  [boolean] [default: false]
  -d, --diff                          Show diffs  [boolean] [default: false]
  -e, --end-with-newline              End output with newline  [boolean] [default: true]
      --end-of-line                   End of line character(s). [string] [choices: "LF", "CRLF"]
  -i, --indent-size                   Indentation size  [default: 4]
      --wrap-line-length, --wrap      The length of line wrap size  [default: 120]
      --wrap-attributes, --wrap-atts  The way to wrap attributes.
                                      [auto|force|force-aligned|force-expand-multiline|aligned-multiple|preserve|preserve-aligned]  [string] [default: "auto"]
      --sort-tailwindcss-classes      Sort tailwindcss classes  [boolean] [default: false]
      --tailwindcss-config-path       Specify path of tailwind config  [string] [default: null]
      --sort-html-attributes          Sort HTML attributes.  [string] [choices: "none", "alphabetical", "code-guide", "idiomatic", "vuejs", "custom"] [default: none]
      --custom-html-attributes-order  Comma separated custom HTML attributes order. To enable this you must specify sort html attributes option as `custom`. You can use regex for attribute names. [string] [default: null]
      --no-multiple-empty-lines       Merge multiple blank lines into a single blank line  [boolean] [default: false]
      --no-php-syntax-check           Disable PHP sytnax checking  [boolean] [default: false]
  -p, --progress                      Print progress  [boolean] [default: false]
      --stdin                         format code provided on <STDIN>  [boolean] [default: false]
      --config                        Use this configuration, overriding .bladeformatterrc config options if present  [string] [default: null]
      --ignore-path                   Specify path of ignore file  [string] [default: null]
  -h, --help                          Show help  [boolean]

Examples:
  blade-formatter "resources/views/**/*.blade.php" --write  Format all files in views directory

Configuring blade-formatter

To configure project wide settings, put .bladeformatterrc.json or .bladeformatterrc in your repository root, blade-formatter will treat them as settings files.

e.g.

{
  "indentSize": 4,
  "wrapAttributes": "auto",
  "wrapLineLength": 120,
  "endWithNewLine": true,
  "endOfLine": "LF",
  "useTabs": false,
  "sortTailwindcssClasses": true,
  "sortHtmlAttributes": "none",
  "noMultipleEmptyLines": false,
  "noPhpSyntaxCheck": false
}

blade-formatter will search up the directory structure until it reaches the root directory.

Ignore Files

To ignore a specific file, put a `.bladeignore' in the root of your repository and the blade formatter will treat it as an ignored file.

e.g.

resources/views/users/index.blade.php
resources/views/products/*
resources/views/books/**/*

Disabling format in file

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

{{-- blade-formatter-disable --}}
    {{ $foo }}
    {{ $bar }}
{{-- blade-formatter-enable --}}

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

{{-- blade-formatter-disable-next-line --}}
    {{ $foo }}

To disable formatting for an entire file, put a {{-- blade-formatter-disable --}} comment at the beginning of the file:

{{-- blade-formatter-disable --}}

{{ $foo }}

API

You can also use the blade formatter via API.

const { BladeFormatter } = require('blade-formatter');

const input = `
<html>
  <body>
    <p>foo</p>
  </body>
</html>
`;

const options = {
  indentSize: 4,
  wrapAttributes: "auto",
  wrapLineLength: 120,
  endWithNewLine: true,
  useTabs: false,
  sortTailwindcssClasses: true,
};

new BladeFormatter(options).format(input).then((formatted) => {
  console.log(formatted);
});

ESModule

import BladeFormatter from "blade-formatter";
const { Formatter } = BladeFormatter;

const input = `
<html>
  <body>
    <p>foo</p>
  </body>
</html>
`;

const options = {
    indentSize: 2,
};

new Formatter(options).formatContent(input).then((formatted) => {
    console.log(formatted);
});

Extensions

Troubleshoot

  • If you encounter the following error during installation
$ npm install -g blade-formatter
~~
current user ("nobody") does not have permission to access the dev dir
~~

Try setting the global user as root

$ npm -g config set user root

TODO

  • custom directives
  • @for directive support
  • ignore formatting in blade comment
  • automatically add new line after directive

Development

$ yarn install
$ yarn run watch # watch changes

You can use local docker image for development. It might help if the host OS is not an amd64 architecture.

$ make build
$ make run example.php

Testing

$ yarn install
$ yarn run test

You can use local docker image for testing. It might help if the host OS is not an amd64 architecture.

$ make build
$ make test
$ make debug # attach

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
wheesnoza
Null
slovenianGooner
SlovenianGooner
yaegassy
Yaegassy
schelmo
Schelmo
Dave-iFour
Dave
dianfishekqi
Dian Fishekqi
gagansday
Gagandeep Singh
hjanos1
Janos Horvath
joshuachp
Joshua Chapman
jtanaka
Jumpei Tanaka

LICENSE

MIT

More Repositories

1

vscode-blade-formatter

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

prettier-plugin-blade

Format your blade template using Prettier
TypeScript
326
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