-
-
Save mpryvkin/0c46e2493b450f92492e8e9a46ad5d97 to your computer and use it in GitHub Desktop.
JS Beautify hack to work with Blade directives (Laravel)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Beautifier(html_source, options, js_beautify, css_beautify) { | |
//Wrapper function to invoke all the necessary constructors and deal with the output. | |
html_source = html_source || ''; | |
// BEGIN | |
html_source = html_source.replace(/\{\{((?:(?!\}\}).)+)\}\}/g, function (m, c) { | |
if (c) { | |
c = c.replace(/(^[ \t]*|[ \t]*$)/g, ''); | |
c = c.replace(/'/g, '''); | |
c = c.replace(/"/g, '"'); | |
c = encodeURIComponent(c); | |
} | |
return "{{" + c + "}}"; | |
}); | |
html_source = html_source.replace(/^[ \t]*@([a-z]+)([^\r\n]*)$/gim, function (m, d, c) { | |
var ce = c; | |
if (ce) { | |
ce = ce.replace(/'/g, '''); | |
ce = ce.replace(/"/g, '"'); | |
ce = "|" + encodeURIComponent(ce); | |
} | |
switch (d) { | |
case 'break': | |
case 'case': | |
case 'continue': | |
case 'csrf': | |
case 'else': | |
case 'elseif': | |
case 'empty': | |
case 'extends': | |
case 'include': | |
case 'includeFirst': | |
case 'includeIf': | |
case 'includeWhen': | |
case 'inject': | |
case 'json': | |
case 'method': | |
case 'parent': | |
case 'stack': | |
case 'yield': | |
return "<blade " + d + ce + "/>"; | |
case 'section': | |
if(c.match(/[ \t]*\([ \t]*['"][^'"]*['"][ \t]*\)/i)){ | |
return "<blade " + d + ce + ">"; | |
} else { | |
return "<blade " + d + ce + "/>"; | |
} | |
case 'show': | |
case 'stop': | |
return "</blade " + d + ce + ">"; | |
default: | |
if (d.startsWith('end')) { | |
return "</blade " + d + ce + ">"; | |
} else { | |
return "<blade " + d + ce + ">"; | |
} | |
} | |
}); | |
// END | |
... | |
var sweet_code = multi_parser.output.join('').replace(/[\r\n\t ]+$/, ''); | |
// BEGIN | |
sweet_code = sweet_code.replace(/^([ \t]*)<\/?blade ([a-z]+)\|?([^>\/]+)?\/?>$/gim, function (m, s, d, c) { | |
if (c) { | |
c = decodeURIComponent(c); | |
c = c.replace(/'/g, "'"); | |
c = c.replace(/"/g, '"'); | |
c = c.replace(/^[ \t]*/g, ''); | |
} else { | |
c = ""; | |
} | |
if (!s) { | |
s = ""; | |
} | |
return s + "@" + d + c; | |
}); | |
sweet_code = sweet_code.replace(/\{\{((?:(?!\}\}).)+)\}\}/g, function (m, c) { | |
if (c) { | |
c = decodeURIComponent(c); | |
c = c.replace(/'/g, "'"); | |
c = c.replace(/"/g, '"'); | |
c = c.replace(/(^[ \t]*|[ \t]*$)/g, ' '); | |
} | |
return "{{" + c + "}}"; | |
}); | |
// END | |
... | |
return sweet_code; | |
} |
I don't see how it's out of scope for js-beautify since VSCode uses js-beautify internally. The most elegant solution is for the native reindent of VSC to function with templating DSL in popular web frameworks, and this makes sense, since people are using VSCode for popular web frameworks, not for C, C++ and Go. That being said, a 3rd party reindent is fine too.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@ammarsdc, @Malin88 I have done a little hackery to get this to work for more of the blade syntax. https://gist.github.com/valeryan/40a5fcc97edb21e310c412e48d62a792
It still has a few issues that I know of:
Extra indents are added to the formatting of else and elseif statement.
The empty tag can be used in two different ways and I have only programmed for one of them for now.
I will try and work out a few more kinks. @mpryvkin If you wanted to collab on this at some point I would be open. The author of js-beautify has said he is open to the idea of merging this if it can be tested. beautifier/js-beautify#845. My feeling though is that having js-beautify do this is really out of scope. I think I may go fork the laravel blade highlighter extension and see if it can be fixed. Like many of the popular vscode extensions, it appears to mostly be abandoned...