Merge branch 'hxsf-master'

This commit is contained in:
Glavin Wiechert 2017-04-10 03:47:31 -03:00
commit ac7349754e
5 changed files with 170 additions and 66 deletions

View File

@ -1,5 +1,34 @@
-- Ensure that that the element at i is in the right position,
-- and return a closure which can be used for continuing the sort.
local a = 'a b c'
local b = '12345678'
local c = 'a b c' + 'a b c'
local t = {
a = 1,
b = 2,
c = 3,
}
if a ~= 'a' then
local b = a
end
local e = {a = 1, b = 2}
function aaa(a, b, c)
-- comment 1
-- comment 2 1231
-- comment 1 123 123 123123 12
-- [[ comment 1 ]]
--[[
muli comments
ssss
@asdasd sad
]]
local a = -1
return a + b - c
end
local b = {a = 1, b = [[this is two space ;
]], c = 2}
function quicksorter(i, vec, low, high)
if low >= high then
return quicksorter

View File

@ -1,5 +1,34 @@
-- Ensure that that the element at i is in the right position,
-- and return a closure which can be used for continuing the sort.
local a= 'a b c'
local b ='12345678'
local c = 'a b c' +'a b c'
local t = {
a = 1,
b =2 ,
c= 3,
}
if a~='a' then
local b=a
end
local e={a=1,b=2}
function aaa(a,b,c)
-- comment 1
-- comment 2 1231
-- comment 1 123 123 123123 12
-- [[ comment 1 ]]
--[[
muli comments
ssss
@asdasd sad
]]
local a = -1
return a+b-c
end
local b = {a=1,b=[[this is two space ;
]],c=2}
function quicksorter(i, vec, low, high)
if low >= high then
return quicksorter

View File

@ -0,0 +1,103 @@
DEFAULT_INDENT = ' '
adjust_space = (line) ->
string_list = line.match /(['"])[^\1]*?\1/g
muli_string = line.match /\[(=*)\[([^\]\1\]]*)/
comment = line.match /\-{2}[^\[].*$/
line = line.replace /\s+/g, ' '
# replace all whitespaces inside the string with one space, WARNING: the whitespaces in string will be replace too!
line = line.replace /\s?(==|>=|<=|~=|[=><\+\*\/])\s?/g, ' $1 '
# add whitespace around the operator
line = line.replace /([^=|\-|(|\s])\s?\-\s?([^\-|\[])/g, '$1 - $2'
# just format minus, not for -- or negative number or commentary.
line = line.replace /,([^\s])/g, ', $1'
# adjust ','
line = line.replace /\s+,/g, ','
# recover the whitespaces in string.
line = line.replace /(['"])[^\1]*?\1/g, ->
string_list.shift()
if muli_string and muli_string[0]
line = line.replace /\[(=*)\[([^\]\1\]]*)/, muli_string[0]
if comment and comment[0]
line = line.replace /\-{2}[^\[].*$/, comment[0]
line
DEFAULT_WARN_FN = (msg) ->
console.log('WARNING:', msg)
module.exports = (str, indent, warn_fn) ->
indent = indent or DEFAULT_INDENT
warn_fn = if typeof warn_fn == 'function' then warn_fn else DEFAULT_WARN_FN
indent = ' '.repeat(indent) if Number.isInteger(indent)
$currIndent = 0
$nextIndent = 0
$prevLength = 0
$extIndent = 0
$lastIndent = 0
$template = 0
new_code = str.split(/\r?\n/g).map (line, line_number) ->
$template_flag = false
if $template
res2 = line.match(/\](=*)\]/)
if res2 and $template == res2[1].length + 1
$template_flag = true
if $template and !/]=*]$/.test(line)
arr = line.split(/\]=*\]/, 2)
comment = arr[0]
code = arr[1]
line = comment + ']' + '='.repeat($template - 1) + ']' + adjust_space(code)
$template = 0
$template = 0
else
return line
res1 = line.match(/\[(=*)\[/)
if res1
$template = res1[1].length + 1
if !$template_flag
line = line.trim()
# remote all spaces on both ends
line = adjust_space(line)
if !line.length
return ''
raw_line = line
line = line.replace(/(['"])[^\1]*?\1/, '')
# remove all quoted fragments for proper bracket processing
line = line.replace(/\s*--.+/, '')
# remove all comments; this ignores long bracket style comments
if /^((local )?function|repeat|while)\b/.test(line) and !/\bend\s*[\),;]*$/.test(line) or /\b(then|do)$/.test(line) and !/^elseif\b/.test(line) or /^if\b/.test(line) and /\bthen\b/.test(line) and !/\bend$/.test(line) or /\bfunction ?(?:\w+ )?\([^\)]*\)$/.test(line) and !/\bend$/.test(line)
$nextIndent = $currIndent + 1
else if /^until\b/.test(line) or /^end\s*[\),;]*$/.test(line) or /^end\s*\)\s*\.\./.test(line) or /^else(if)?\b/.test(line) and /\bend$/.test(line)
$nextIndent = --$currIndent
else if /^else\b/.test(line) or /^elseif\b/.test(line)
$nextIndent = $currIndent
$currIndent = $currIndent - 1
$brackets = (line.match(/\(/g) or []).length - ((line.match(/\)/g) or []).length)
# capture unbalanced brackets
$curly = (line.match(/\{/g) or []).length - ((line.match(/\}/g) or []).length)
# capture unbalanced curly brackets
# close (curly) brackets if needed
if $curly < 0
$currIndent += $curly
if $brackets < 0
$currIndent += $brackets
$nextIndent += $brackets + $curly
# console.log({last: $lastIndent, curr: $currIndent, next: $nextIndent, ext: $extIndent})
if $currIndent - $lastIndent > 1
$extIndent += $nextIndent - $lastIndent - 1
$nextIndent = $currIndent = 1 + $lastIndent
if $currIndent - $lastIndent < -1 and $extIndent > 0
$extIndent += $currIndent - $lastIndent + 1
$currIndent = -1 + $lastIndent
if $nextIndent < $currIndent
$nextIndent = $currIndent
# console.log({last: $lastIndent, curr: $currIndent, next: $nextIndent, ext: $extIndent})
warn_fn """negative indentation at line #{line_number}: #{raw_line}""" if $currIndent < 0
new_line = (if raw_line.length and $currIndent > 0 and !$template_flag then indent.repeat($currIndent) else '') + raw_line
$useful = $prevLength > 0 or raw_line.length > 0
$lastIndent = $currIndent
$currIndent = $nextIndent
$prevLength = raw_line.length
new_line or undefined
warn_fn 'positive indentation at the end' if $currIndent > 0
new_code.join '\n'

View File

@ -1,57 +0,0 @@
# Copyright 2011 Paul Kulchenko
# Credits: http://notebook.kulchenko.com/programming/lua-beautifier-in-55-lines-of-perl
use strict;
use warnings;
use constant INDENT => ' ';
my($currIndent, $nextIndent, $prevLength) = (0, 0, 0);
while (<>) {
chomp;
s/^\s+|\s+$//g; # remote all spaces on both ends
s/\s+/ /g; # replace all whitespaces inside the string with one space
my $orig = $_;
s/(['"])[^\1]*?\1//g; # remove all quoted fragments for proper bracket processing
s/\s*--.+//; # remove all comments; this ignores long bracket style comments
# open a level; increase next indentation; don't change current one
if (/^((local )?function|repeat|while)\b/ && !/\bend\s*[\),;]*$/
|| /\b(then|do)$/ && !/^elseif\b/ # only open on 'then' if there is no 'elseif'
|| /^if\b/ && /\bthen\b/ && !/\bend$/ # only open on 'if' if there is no 'end' at the end
|| /\bfunction\s*\([^\)]*\)$/) {
$nextIndent = $currIndent + 1;
}
# close the level; change both current and next indentation
elsif (/^until\b/
|| /^end\s*[\),;]*$/
|| /^end\s*\)\s*\.\./ # this is a special case of 'end).."some string"'
|| /^else(if)?\b/ && /\bend$/) {
$nextIndent = $currIndent = $currIndent - 1;
}
# keep the level; decrease the current indentation; keep the next one
elsif (/^else\b/
|| /^elseif\b/) {
($nextIndent, $currIndent) = ($currIndent, $currIndent-1);
}
my $brackets = y/(// - y/)//; # capture unbalanced brackets
my $curly = y/{// - y/}//; # capture unbalanced curly brackets
# close (curly) brackets if needed
$currIndent += $curly if $curly < 0 && /^\}/;
$currIndent += $brackets if $brackets < 0 && /^\)/;
warn "WARNING: negative indentation at line $.: $orig\n" if $currIndent < 0;
print((length($orig) ? (INDENT x $currIndent) : ''), $orig, "\n")
if $prevLength > 0 || length($orig) > 0; # this is to collapse empty lines
$nextIndent += $brackets + $curly;
$currIndent = $nextIndent;
$prevLength = length($orig);
}
warn "WARNING: positive indentation at the end\n" if $nextIndent > 0;

View File

@ -4,6 +4,7 @@ path = require("path")
"use strict"
Beautifier = require('../beautifier')
format = require './beautifier'
module.exports = class Lua extends Beautifier
name: "Lua beautifier"
@ -15,9 +16,8 @@ module.exports = class Lua extends Beautifier
}
beautify: (text, language, options) ->
lua_beautifier = path.resolve(__dirname, "beautifier.pl")
@run("perl", [
lua_beautifier,
'<',
@tempFile("input", text)
])
new @Promise (resolve, reject) ->
try
resolve format text, options.indent_char.repeat options.indent_size
catch error
reject error