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 = ''