Reply -
Raw
#!/usr/bin/env python
# -*- coding: utf8 -*-
#
# Filename: prettylua.py
# Version: 0.1
# Status: unstable
#
# Copyright (c) 2015 Odd Stråbø <oddstr13@openshell.no>
# License: MIT - http://opensource.org/licenses/MIT
#
import sys
write = sys.stdout.write
input = "input.lua"
output = "output.lua"
with open(input) as fh:
buf = fh.read()
class Colors:
DEFAULT = '\033[0m'
STRING = '\033[0;33m'
COMMENT = '\033[0;35m'
WORDCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_."
QUOTATION = "'\""
INDENT_AFTER = ['function', 'do', 'then', '{']
INDENT_BEFORE = []
UNINDENT_AFTER = ['}']
UNINDENT_BEFORE = ['end', 'elseif', 'else']
OPERATORS = ['+', '-', '*', '/', '=']
INDENTATION = " "
level = 0
prelevel = 0
postlevel = 0
line = ''
word = ''
stringchar = ''
MAX = len(buf)
i = 0
while i < MAX:
j = i
lastword = word
word = ''
if buf[j] == '\n':
while j < MAX and buf[j] in ' \t\n':
word += buf[j]
j += 1
word = '\n'
elif buf[j] in ' \t':
while buf[j] in ' \t':
word += buf[j]
j += 1
word = ' '
elif buf[j] == '-' and buf[j+1] == '-':
while buf[j] != '\n':
word += buf[j]
j += 1
elif buf[j] in QUOTATION:
while True:
word += buf[j]
j += 1
if len(word) > 1 and buf[j-1] == word[0]:
break
elif buf[j] == ',':
word += buf[j]
j += 1
while buf[j] in ' \t':
j += 1
word += ' '
elif buf[j] in OPERATORS:
word += buf[j]
j += 1
if buf[j] == '=':
word += buf[j]
j += 1
while buf[j] in ' \t':
j += 1
if lastword != ' ':
word = ' ' + word
word += ' '
else:
while buf[j] in WORDCHARS:
word += buf[j]
j += 1
if word:
pass
#print(i, j - i, word)
else:
word = buf[j]
#print(i, 1, word)
if word in INDENT_BEFORE:
#print("+before '{}'".format(word))
prelevel += 1
if word in UNINDENT_BEFORE:
#print("-before '{}'".format(word))
prelevel -= 1
if word in INDENT_AFTER:
#print("+after '{}'".format(word))
postlevel += 1
if word in UNINDENT_AFTER:
#print("-after '{}'".format(word))
postlevel -= 1
if i != j:
i = j
else:
i += 1
line += word
if word == '\n':
level = level + prelevel
#print(level, prelevel, postlevel, line, level + prelevel + postlevel)
write((level)*INDENTATION + line)
#print(level, postlevel)
level = level + postlevel
postlevel = 0
prelevel = 0
line = ''