Line-breaking minified JS source
Back to javascript
Minified source is great for being compact. But it’s pretty awful to work with, being in super long lines. Text editors hate it.
You can’t just run minified JS source through fmt
. You can’t just break on any
space anywhere. There’s quoted strings and wacky JS stuff like not allowing a
line break after a throw
statement. Also, breaking after a return
does a
secret insertion of a semicolon, so your actual return value on the next line
will be ignored!
I’m sure somebody else has done this, but it was faster to write my own in Ruby than find one on the MoDeRN wEB.
I’m sure this has at least one bug, but it works with the minified source I threw at it:
# USAGE: jscols.rb 80 foo.js cols = Integer(ARGV[0]) js = File.read(ARGV[1]) breakable = [' ',':',';',',','!','?',']',')''{','}'] last_break = 0 in_quote_char = nil in_esc = false for i in 0...js.length c = js[i] if in_esc ; in_esc = false ; next ; end if c == '\\' ; in_esc = true ; end if c == '"' || c == "'" if !in_quote_char in_quote_char = c elsif c == in_quote_char in_quote_char = nil end end if in_quote_char ; next ; end breaktime = (i - last_break) >= cols if breakable.include?(c) && breaktime # can't break after a 'throw' or 'return'! if c == ' ' && (js[i-5...i] == 'throw' || js[i-6...i] == 'return') next end puts js[last_break...i] #puts "print #{last_break} to #{i}" last_break = i end end if last_break < js.length puts js[last_break..-1] end
Please let me know if you spot a bug or have any improvements.
Oh, and I don’t scan ahead, so your input column number is the minimum size, not the maximum, which is probably not what you’re expecting. However, I just kept giving it different column sizes until I got the nicest output at about the rough line width average I was looking for. I don’t expect to use this tool a lot, so this is a perfectly fine compromise for me.