Remove trailing spaces and replace tabs with spaces

This commit is contained in:
Simonas Kazlauskas 2012-08-19 22:55:50 +03:00
parent e3ec361552
commit b3e3f041fe

View file

@ -18,17 +18,17 @@ def run_fish_cmd(text):
from subprocess import PIPE from subprocess import PIPE
p = subprocess.Popen(["fish"], stdin=PIPE, stdout=PIPE, stderr=PIPE) p = subprocess.Popen(["fish"], stdin=PIPE, stdout=PIPE, stderr=PIPE)
if IS_PY2: if IS_PY2:
out, err = p.communicate(text) out, err = p.communicate(text)
else: else:
out, err = p.communicate(bytes(text, 'utf-8')) out, err = p.communicate(bytes(text, 'utf-8'))
out = str(out, 'utf-8') out = str(out, 'utf-8')
err = str(err, 'utf-8') err = str(err, 'utf-8')
return(out, err) return(out, err)
def escape_fish_cmd(text): def escape_fish_cmd(text):
# Replace one backslash with two, and single quotes with backslash-quote # Replace one backslash with two, and single quotes with backslash-quote
escaped = text.replace('\\', '\\\\').replace("'", "\\'") escaped = text.replace('\\', '\\\\').replace("'", "\\'")
return "'" + escaped + "'" return "'" + escaped + "'"
named_colors = { named_colors = {
'black' : '000000', 'black' : '000000',
@ -56,15 +56,15 @@ def parse_one_color(comp):
return '' return ''
def better_color(c1, c2): def better_color(c1, c2):
""" Indicate which color is "better", i.e. prefer term256 colors """ """ Indicate which color is "better", i.e. prefer term256 colors """
if not c2: return c1 if not c2: return c1
if not c1: return c2 if not c1: return c2
if c1 == 'normal': return c2 if c1 == 'normal': return c2
if c2 == 'normal': return c1 if c2 == 'normal': return c1
if c2 in named_colors: return c1 if c2 in named_colors: return c1
if c1 in named_colors: return c2 if c1 in named_colors: return c2
return c1 return c1
def parse_color(color_str): def parse_color(color_str):
""" A basic function to parse a color string, for example, 'red' '--bold' """ """ A basic function to parse a color string, for example, 'red' '--bold' """
@ -85,10 +85,10 @@ def parse_color(color_str):
else: else:
# Regular color # Regular color
color = better_color(color, parse_one_color(comp)) color = better_color(color, parse_one_color(comp))
return [color, background_color, bold, underline] return [color, background_color, bold, underline]
def parse_bool(val): def parse_bool(val):
val = val.lower() val = val.lower()
if val.startswith('f') or val.startswith('0'): return False if val.startswith('f') or val.startswith('0'): return False
@ -102,7 +102,7 @@ class FishVar:
self.value = value self.value = value
self.universal = False self.universal = False
self.exported = False self.exported = False
def get_json_obj(self): def get_json_obj(self):
# Return an array(3): name, value, flags # Return an array(3): name, value, flags
flags = [] flags = []
@ -111,19 +111,19 @@ class FishVar:
return [self.name, self.value, ', '.join(flags)] return [self.name, self.value, ', '.join(flags)]
class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def write_to_wfile(self, txt): def write_to_wfile(self, txt):
if IS_PY2: if IS_PY2:
self.wfile.write(txt) self.wfile.write(txt)
else: # Python 3 else: # Python 3
self.wfile.write(bytes(txt, 'utf-8')) self.wfile.write(bytes(txt, 'utf-8'))
def do_get_colors(self): def do_get_colors(self):
# Looks for fish_color_*. # Looks for fish_color_*.
# Returns an array of lists [color_name, color_description, color_value] # Returns an array of lists [color_name, color_description, color_value]
result = [] result = []
# Make sure we return at least these # Make sure we return at least these
remaining = set(['normal', remaining = set(['normal',
'error', 'error',
@ -140,7 +140,7 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
'valid_path', 'valid_path',
'autosuggestion' 'autosuggestion'
]) ])
# Here are our color descriptions # Here are our color descriptions
descriptions = { descriptions = {
'normal': 'Default text', 'normal': 'Default text',
@ -157,11 +157,11 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
'operator': 'Like * and ~', 'operator': 'Like * and ~',
'escape': 'Escapes like \\n', 'escape': 'Escapes like \\n',
'cwd': 'Current directory', 'cwd': 'Current directory',
'cwd_root': 'cwd for root user', 'cwd_root': 'cwd for root user',
'valid_path': 'Valid paths', 'valid_path': 'Valid paths',
'autosuggestion': 'Suggested completion' 'autosuggestion': 'Suggested completion'
} }
out, err = run_fish_cmd('set -L') out, err = run_fish_cmd('set -L')
for line in out.split('\n'): for line in out.split('\n'):
@ -170,36 +170,36 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
color_desc = descriptions.get(color_name, '') color_desc = descriptions.get(color_name, '')
result.append([color_name, color_desc, parse_color(color_value)]) result.append([color_name, color_desc, parse_color(color_value)])
remaining.discard(color_name) remaining.discard(color_name)
# Ensure that we have all the color names we know about, so that if the # Ensure that we have all the color names we know about, so that if the
# user deletes one he can still set it again via the web interface # user deletes one he can still set it again via the web interface
for color_name in remaining: for color_name in remaining:
color_desc = descriptions.get(color_name, '') color_desc = descriptions.get(color_name, '')
result.append([color_name, color_desc, parse_color('')]) result.append([color_name, color_desc, parse_color('')])
# Sort our result (by their keys) # Sort our result (by their keys)
result.sort() result.sort()
return result return result
def do_get_functions(self): def do_get_functions(self):
out, err = run_fish_cmd('functions') out, err = run_fish_cmd('functions')
out = out.strip() out = out.strip()
# Not sure why fish sometimes returns this with newlines # Not sure why fish sometimes returns this with newlines
if "\n" in out: if "\n" in out:
return out.split('\n') return out.split('\n')
else: else:
return out.strip().split(', ') return out.strip().split(', ')
def do_get_variable_names(self, cmd): def do_get_variable_names(self, cmd):
" Given a command like 'set -U' return all the variable names " " Given a command like 'set -U' return all the variable names "
out, err = run_fish_cmd(cmd) out, err = run_fish_cmd(cmd)
return out.split('\n') return out.split('\n')
def do_get_variables(self): def do_get_variables(self):
out, err = run_fish_cmd('set -L') out, err = run_fish_cmd('set -L')
# Put all the variables into a dictionary # Put all the variables into a dictionary
vars = {} vars = {}
for line in out.split('\n'): for line in out.split('\n'):
@ -207,16 +207,16 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
if len(comps) < 2: continue if len(comps) < 2: continue
fish_var = FishVar(comps[0], comps[1]) fish_var = FishVar(comps[0], comps[1])
vars[fish_var.name] = fish_var vars[fish_var.name] = fish_var
# Mark universal variables. L means don't abbreviate. # Mark universal variables. L means don't abbreviate.
for name in self.do_get_variable_names('set -nUL'): for name in self.do_get_variable_names('set -nUL'):
if name in vars: vars[name].universal = True if name in vars: vars[name].universal = True
# Mark exported variables. L means don't abbreviate. # Mark exported variables. L means don't abbreviate.
for name in self.do_get_variable_names('set -nxL'): for name in self.do_get_variable_names('set -nxL'):
if name in vars: vars[name].exported = True if name in vars: vars[name].exported = True
return [vars[key].get_json_obj() for key in sorted(vars.keys(), key=str.lower)] return [vars[key].get_json_obj() for key in sorted(vars.keys(), key=str.lower)]
def do_get_history(self): def do_get_history(self):
# Use \x1e ("record separator") to distinguish between history items. The first # Use \x1e ("record separator") to distinguish between history items. The first
# backslash is so Python passes one backslash to fish # backslash is so Python passes one backslash to fish
@ -224,13 +224,13 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
result = out.split(' \x1e') result = out.split(' \x1e')
if result: result.pop() # Trim off the trailing element if result: result.pop() # Trim off the trailing element
return result return result
def do_get_color_for_variable(self, name): def do_get_color_for_variable(self, name):
"Return the color with the given name, or the empty string if there is none" "Return the color with the given name, or the empty string if there is none"
out, err = run_fish_cmd("echo -n $" + name) out, err = run_fish_cmd("echo -n $" + name)
return out return out
def do_set_color_for_variable(self, name, color, background_color, bold, underline): def do_set_color_for_variable(self, name, color, background_color, bold, underline):
if not color: color = 'normal' if not color: color = 'normal'
"Sets a color for a fish color name, like 'autosuggestion'" "Sets a color for a fish color name, like 'autosuggestion'"
@ -239,19 +239,19 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
if background_color: command += ' --background=' + background_color if background_color: command += ' --background=' + background_color
if bold: command += ' --bold' if bold: command += ' --bold'
if underline: command += ' --underline' if underline: command += ' --underline'
out, err = run_fish_cmd(command) out, err = run_fish_cmd(command)
return out return out
def do_get_function(self, func_name): def do_get_function(self, func_name):
out, err = run_fish_cmd('functions ' + func_name) out, err = run_fish_cmd('functions ' + func_name)
return out return out
def do_delete_history_item(self, history_item_text): def do_delete_history_item(self, history_item_text):
# It's really lame that we always return success here # It's really lame that we always return success here
out, err = run_fish_cmd('builtin history --save --delete -- ' + escape_fish_cmd(history_item_text)) out, err = run_fish_cmd('builtin history --save --delete -- ' + escape_fish_cmd(history_item_text))
return True return True
def do_GET(self): def do_GET(self):
p = self.path p = self.path
if p == '/colors/': if p == '/colors/':
@ -270,15 +270,15 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
output = self.do_get_color_for_variable(name) output = self.do_get_color_for_variable(name)
else: else:
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
# Return valid output # Return valid output
self.send_response(200) self.send_response(200)
self.send_header('Content-type','text/html') self.send_header('Content-type','text/html')
self.write_to_wfile('\n') self.write_to_wfile('\n')
# Output JSON # Output JSON
self.write_to_wfile(json.dumps(output)) self.write_to_wfile(json.dumps(output))
def do_POST(self): def do_POST(self):
p = self.path p = self.path
if IS_PY2: if IS_PY2:
@ -332,17 +332,17 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
what = postvars.get(b'what') what = postvars.get(b'what')
what[0] = str(what[0]).lstrip("b'").rstrip("'") what[0] = str(what[0]).lstrip("b'").rstrip("'")
if self.do_delete_history_item(what[0]): if self.do_delete_history_item(what[0]):
output = ["OK"] output = ["OK"]
else: else:
output = ["Unable to delete history item"] output = ["Unable to delete history item"]
else: else:
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_POST(self) return SimpleHTTPServer.SimpleHTTPRequestHandler.do_POST(self)
# Return valid output # Return valid output
self.send_response(200) self.send_response(200)
self.send_header('Content-type','text/html') self.send_header('Content-type','text/html')
self.write_to_wfile('\n') self.write_to_wfile('\n')
# Output JSON # Output JSON
self.write_to_wfile(json.dumps(output)) self.write_to_wfile(json.dumps(output))
@ -379,10 +379,10 @@ if PORT > 9000:
# Just look at the first letter # Just look at the first letter
initial_tab = '' initial_tab = ''
if len(sys.argv) > 1: if len(sys.argv) > 1:
for tab in ['functions', 'colors', 'variables', 'history']: for tab in ['functions', 'colors', 'variables', 'history']:
if tab.startswith(sys.argv[1]): if tab.startswith(sys.argv[1]):
initial_tab = '#' + tab initial_tab = '#' + tab
break break
url = 'http://localhost:{0}/{1}'.format(PORT, initial_tab) url = 'http://localhost:{0}/{1}'.format(PORT, initial_tab)
print("Web config started at '{0}'. Hit enter to stop.".format(url)) print("Web config started at '{0}'. Hit enter to stop.".format(url))